From aa8d25f6e548eb2e67d424c82aac38a9ef6b8d2a Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Wed, 19 Apr 2023 10:03:06 +0800 Subject: [PATCH 01/46] feat: support fetching table tag value --- include/libs/catalog/catalog.h | 1 + source/libs/catalog/inc/catalogInt.h | 8 ++ source/libs/catalog/src/ctgAsync.c | 127 ++++++++++++++++++++++++++- 3 files changed, 135 insertions(+), 1 deletion(-) diff --git a/include/libs/catalog/catalog.h b/include/libs/catalog/catalog.h index 2c684f8f76..2f8e7846f3 100644 --- a/include/libs/catalog/catalog.h +++ b/include/libs/catalog/catalog.h @@ -82,6 +82,7 @@ typedef struct SCatalogReq { SArray* pUser; // element is SUserAuthInfo SArray* pTableIndex; // element is SNAME SArray* pTableCfg; // element is SNAME + SArray* pTableTag; // element is SNAME bool qNodeRequired; // valid qnode bool dNodeRequired; // valid dnode bool svrVerRequired; diff --git a/source/libs/catalog/inc/catalogInt.h b/source/libs/catalog/inc/catalogInt.h index 85a130d293..f0e5024c59 100644 --- a/source/libs/catalog/inc/catalogInt.h +++ b/source/libs/catalog/inc/catalogInt.h @@ -58,6 +58,7 @@ typedef enum { CTG_CI_OTHERTABLE_META, CTG_CI_TBL_SMA, CTG_CI_TBL_CFG, + CTG_CI_TBL_TAG, CTG_CI_INDEX_INFO, CTG_CI_USER, CTG_CI_UDF, @@ -110,6 +111,7 @@ typedef enum { CTG_TASK_GET_SVR_VER, CTG_TASK_GET_TB_META_BATCH, CTG_TASK_GET_TB_HASH_BATCH, + CTG_TASK_GET_TB_TAG, } CTG_TASK_TYPE; typedef enum { @@ -186,6 +188,11 @@ typedef struct SCtgTbCfgCtx { SVgroupInfo* pVgInfo; } SCtgTbCfgCtx; +typedef struct SCtgTbTagCtx { + SName* pName; + SVgroupInfo* pVgInfo; +} SCtgTbTagCtx; + typedef struct SCtgDbVgCtx { char dbFName[TSDB_DB_FNAME_LEN]; } SCtgDbVgCtx; @@ -304,6 +311,7 @@ typedef struct SCtgJob { catalogCallback userFp; int32_t tbMetaNum; int32_t tbHashNum; + int32_t tbTagNum; int32_t dbVgNum; int32_t udfNum; int32_t qnodeNum; diff --git a/source/libs/catalog/src/ctgAsync.c b/source/libs/catalog/src/ctgAsync.c index f2a354997d..b10da5cc73 100644 --- a/source/libs/catalog/src/ctgAsync.c +++ b/source/libs/catalog/src/ctgAsync.c @@ -386,6 +386,37 @@ int32_t ctgInitGetTbCfgTask(SCtgJob* pJob, int32_t taskIdx, void* param) { return TSDB_CODE_SUCCESS; } +int32_t ctgInitGetTbTagTask(SCtgJob* pJob, int32_t taskIdx, void* param) { + SName* name = (SName*)param; + SCtgTask task = {0}; + + task.type = CTG_TASK_GET_TB_TAG; + task.taskId = taskIdx; + task.pJob = pJob; + + task.taskCtx = taosMemoryCalloc(1, sizeof(SCtgTbTagCtx)); + if (NULL == task.taskCtx) { + CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY); + } + + SCtgTbTagCtx* ctx = task.taskCtx; + ctx->pName = taosMemoryMalloc(sizeof(*name)); + if (NULL == ctx->pName) { + taosMemoryFree(task.taskCtx); + CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY); + } + + memcpy(ctx->pName, name, sizeof(*name)); + + taosArrayPush(pJob->pTasks, &task); + + qDebug("QID:0x%" PRIx64 " the %dth task type %s initialized, tbName:%s", pJob->queryId, taskIdx, + ctgTaskTypeStr(task.type), name->tname); + + return TSDB_CODE_SUCCESS; +} + + int32_t ctgHandleForceUpdate(SCatalog* pCtg, int32_t taskNum, SCtgJob* pJob, const SCatalogReq* pReq) { SHashObj* pDb = taosHashInit(taskNum, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_NO_LOCK); SHashObj* pTb = taosHashInit(taskNum, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_NO_LOCK); @@ -437,6 +468,15 @@ int32_t ctgHandleForceUpdate(SCatalog* pCtg, int32_t taskNum, SCtgJob* pJob, con char dbFName[TSDB_DB_FNAME_LEN]; tNameGetFullDbName(name, dbFName); taosHashPut(pDb, dbFName, strlen(dbFName), dbFName, TSDB_DB_FNAME_LEN); + taosHashPut(pTb, name, sizeof(SName), name, sizeof(SName)); + } + + for (int32_t i = 0; i < pJob->tbTagNum; ++i) { + SName* name = taosArrayGet(pReq->pTableTag, i); + char dbFName[TSDB_DB_FNAME_LEN]; + tNameGetFullDbName(name, dbFName); + taosHashPut(pDb, dbFName, strlen(dbFName), dbFName, TSDB_DB_FNAME_LEN); + taosHashPut(pTb, name, sizeof(SName), name, sizeof(SName)); } char* dbFName = taosHashIterate(pDb, NULL); @@ -505,9 +545,10 @@ int32_t ctgInitJob(SCatalog* pCtg, SRequestConnInfo* pConn, SCtgJob** job, const int32_t dbInfoNum = (int32_t)taosArrayGetSize(pReq->pDbInfo); int32_t tbIndexNum = (int32_t)taosArrayGetSize(pReq->pTableIndex); int32_t tbCfgNum = (int32_t)taosArrayGetSize(pReq->pTableCfg); + int32_t tbTagNum = (int32_t)ctgGetTablesReqNum(pReq->pTableTag); int32_t taskNum = tbMetaNum + dbVgNum + udfNum + tbHashNum + qnodeNum + dnodeNum + svrVerNum + dbCfgNum + indexNum + - userNum + dbInfoNum + tbIndexNum + tbCfgNum; + userNum + dbInfoNum + tbIndexNum + tbCfgNum + tbTagNum; *job = taosMemoryCalloc(1, sizeof(SCtgJob)); if (NULL == *job) { @@ -537,6 +578,7 @@ int32_t ctgInitJob(SCatalog* pCtg, SRequestConnInfo* pConn, SCtgJob** job, const pJob->tbIndexNum = tbIndexNum; pJob->tbCfgNum = tbCfgNum; pJob->svrVerNum = svrVerNum; + pJob->tbTagNum = tbTagNum; #if CTG_BATCH_FETCH pJob->pBatchs = @@ -604,6 +646,12 @@ int32_t ctgInitJob(SCatalog* pCtg, SRequestConnInfo* pConn, SCtgJob** job, const CTG_ERR_JRET(ctgInitTask(pJob, CTG_TASK_GET_TB_CFG, name, NULL)); } + for (int32_t i = 0; i < tbCfgNum; ++i) { + SName* name = taosArrayGet(pReq->pTableTag, i); + CTG_ERR_JRET(ctgInitTask(pJob, CTG_TASK_GET_TB_TAG, name, NULL)); + } + + for (int32_t i = 0; i < indexNum; ++i) { char* indexName = taosArrayGet(pReq->pIndex, i); CTG_ERR_JRET(ctgInitTask(pJob, CTG_TASK_GET_INDEX_INFO, indexName, NULL)); @@ -1473,6 +1521,24 @@ _return: CTG_RET(code); } + +int32_t ctgHandleGetTbTagRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBuf* pMsg, int32_t rspCode) { + int32_t code = 0; + SCtgTask* pTask = tReq->pTask; + CTG_ERR_JRET(ctgProcessRspMsg(&pTask->msgCtx.out, reqType, pMsg->pData, pMsg->len, rspCode, pTask->msgCtx.target)); + + STableCfgRsp* pRsp = (STableCfgRsp*)pTask->msgCtx.out; + + TSWAP(pTask->res, pTask->msgCtx.out); + +_return: + + ctgHandleTaskEnd(pTask, code); + + CTG_RET(code); +} + + int32_t ctgHandleGetDbCfgRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBuf* pMsg, int32_t rspCode) { int32_t code = 0; SCtgTask* pTask = tReq->pTask; @@ -1935,6 +2001,45 @@ _return: CTG_RET(code); } + +int32_t ctgLaunchGetTbTagTask(SCtgTask* pTask) { + int32_t code = 0; + SCatalog* pCtg = pTask->pJob->pCtg; + SRequestConnInfo* pConn = &pTask->pJob->conn; + SCtgTbTagCtx* pCtx = (SCtgTbTagCtx*)pTask->taskCtx; + SArray* pRes = NULL; + char dbFName[TSDB_DB_FNAME_LEN]; + tNameGetFullDbName(pCtx->pName, dbFName); + SCtgJob* pJob = pTask->pJob; + SCtgMsgCtx* pMsgCtx = CTG_GET_TASK_MSGCTX(pTask, -1); + if (NULL == pMsgCtx->pBatchs) { + pMsgCtx->pBatchs = pJob->pBatchs; + } + + if (NULL == pCtx->pVgInfo) { + CTG_ERR_JRET(ctgGetTbHashVgroupFromCache(pCtg, pCtx->pName, &pCtx->pVgInfo)); + if (NULL == pCtx->pVgInfo) { + CTG_ERR_JRET(ctgLaunchSubTask(pTask, CTG_TASK_GET_DB_VGROUP, ctgGetTbCfgCb, dbFName)); + return TSDB_CODE_SUCCESS; + } + } + + CTG_CACHE_NHIT_INC(CTG_CI_TBL_TAG, 1); + + CTG_ERR_JRET(ctgGetTableCfgFromVnode(pCtg, pConn, pCtx->pName, pCtx->pVgInfo, NULL, pTask)); + + return TSDB_CODE_SUCCESS; + +_return: + + if (CTG_TASK_LAUNCHED == pTask->status) { + ctgHandleTaskEnd(pTask, code); + } + + CTG_RET(code); +} + + int32_t ctgLaunchGetQnodeTask(SCtgTask* pTask) { SCatalog* pCtg = pTask->pJob->pCtg; SRequestConnInfo* pConn = &pTask->pJob->conn; @@ -2138,6 +2243,25 @@ _return: CTG_RET(ctgHandleTaskEnd(pTask, pTask->subRes.code)); } +int32_t ctgGetTbTagCb(SCtgTask* pTask) { + int32_t code = 0; + + CTG_ERR_JRET(pTask->subRes.code); + + SCtgTbTagCtx* pCtx = (SCtgTbTagCtx*)pTask->taskCtx; + SDBVgInfo* pDb = (SDBVgInfo*)pTask->subRes.res; + + pCtx->pVgInfo = taosMemoryCalloc(1, sizeof(SVgroupInfo)); + CTG_ERR_JRET(ctgGetVgInfoFromHashValue(pTask->pJob->pCtg, pDb, pCtx->pName, pCtx->pVgInfo)); + + CTG_RET(ctgLaunchGetTbTagTask(pTask)); + +_return: + + CTG_RET(ctgHandleTaskEnd(pTask, pTask->subRes.code)); +} + + int32_t ctgGetUserCb(SCtgTask* pTask) { int32_t code = 0; @@ -2197,6 +2321,7 @@ SCtgAsyncFps gCtgAsyncFps[] = { {ctgInitGetSvrVerTask, ctgLaunchGetSvrVerTask, ctgHandleGetSvrVerRsp, ctgDumpSvrVer, NULL, NULL}, {ctgInitGetTbMetasTask, ctgLaunchGetTbMetasTask, ctgHandleGetTbMetasRsp, ctgDumpTbMetasRes, NULL, NULL}, {ctgInitGetTbHashsTask, ctgLaunchGetTbHashsTask, ctgHandleGetTbHashsRsp, ctgDumpTbHashsRes, NULL, NULL}, + {ctgInitGetTbTagTask, ctgLaunchGetTbTagTask, ctgHandleGetTbTagRsp, ctgDumpTbTagRes, NULL, NULL}, }; int32_t ctgMakeAsyncRes(SCtgJob* pJob) { From 562e76524832fe1bce455d405f8b616b315f1570 Mon Sep 17 00:00:00 2001 From: jiacy-jcy <714897623@qq.com> Date: Thu, 20 Apr 2023 17:10:21 +0800 Subject: [PATCH 02/46] =?UTF-8?q?test=EF=BC=9Aadd=20test=20case=20for=20mu?= =?UTF-8?q?ltistage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/parallel_test/cases.task | 1 + tests/system-test/0-others/multilevel.py | 223 +++++++++++++++++++++++ 2 files changed, 224 insertions(+) create mode 100644 tests/system-test/0-others/multilevel.py diff --git a/tests/parallel_test/cases.task b/tests/parallel_test/cases.task index dda4ec3e84..b12d1b2da7 100644 --- a/tests/parallel_test/cases.task +++ b/tests/parallel_test/cases.task @@ -127,6 +127,7 @@ ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/user_control.py ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/user_manage.py ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/fsync.py +,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/multilevel.py ,,n,system-test,python3 ./test.py -f 0-others/compatibility.py ,,n,system-test,python3 ./test.py -f 0-others/tag_index_basic.py ,,n,system-test,python3 ./test.py -f 0-others/udfpy_main.py diff --git a/tests/system-test/0-others/multilevel.py b/tests/system-test/0-others/multilevel.py new file mode 100644 index 0000000000..6780ea9fef --- /dev/null +++ b/tests/system-test/0-others/multilevel.py @@ -0,0 +1,223 @@ +################################################################### +# Copyright (c) 2016 by TAOS Technologies, Inc. +# All rights reserved. +# +# This file is proprietary and confidential to TAOS Technologies. +# No part of this file may be reproduced, stored, transmitted, +# disclosed or used in any form or by any means other than as +# expressly provided by the written permission from Jianhui Tao +# +################################################################### + +# -*- coding: utf-8 -*- + + +from util.log import * +from util.cases import * +from util.sql import * +from util.common import * +from util.sqlset import * + +class TDTestCase: + def init(self, conn, logSql, replicaVar=1): + + self.replicaVar = int(replicaVar) + tdLog.debug("start to execute %s" % __file__) + tdSql.init(conn.cursor()) + self.setsql = TDSetSql() + + def basic(self): + tdLog.info("============== basic test ===============") + cfg={ + '/mnt/data1' : 'dataDir', + '/mnt/data2 0 0' : 'dataDir' + } + tdSql.createDir('/mnt/data1') + tdSql.createDir('/mnt/data2') + + tdLog.info("================= step1") + tdDnodes.stop(1) + tdDnodes.deploy(1,cfg) + tdDnodes.start(1) + + tdLog.info("================= step2") + tdSql.haveFile('/mnt/data1/',1) + tdSql.haveFile('/mnt/data2/',0) + tdDnodes.stop(1) + def dir_not_exist(self): + tdLog.info("============== dir_not_exist test ===============") + cfg={ + '/mnt/data1 0 0' : 'dataDir', + '/mnt/data2 0 0' : 'dataDir' + } + tdSql.createDir('/mnt/data1') + os.system('rm -rf /mnt/data2') + + + tdLog.info("================= step1") + tdDnodes.deploy(1,cfg) + tdDnodes.startWithoutSleep(1) + + tdLog.info("================= step2") + tdSql.taosdStatus(0) + + def dir_permission_denied(self): + tdDnodes.stop(1) + tdLog.info("============== dir_permission_denied test ===============") + cfg={ + '/mnt/data1 0 0' : 'dataDir', + '/mnt/data2 0 0' : 'dataDir' + } + tdSql.createDir('/mnt/data1') + tdSql.createDir('/mnt/data2') + os.system('chmod 111 /mnt/data2') + + tdLog.info("================= step1") + tdDnodes.deploy(1,cfg) + tdDnodes.startWithoutSleep(1) + + tdLog.info("================= step2") + tdSql.taosdStatus(0) + + def file_distribution_same_level(self): + tdLog.info("============== file_distribution_same_level test ===============") + dataDir = ['data00','data01','data02','data03','data04'] + dataDict = {'data00':0,'data01':0,'data02':0,'data03':0,'data04':0} + tdDnodes.stop(1) + self.ntables = 1000 + self.ts = 1520000010000 + tdLog.info("================= step1") + cfg={ + '/mnt/data00 0 1' : 'dataDir', + '/mnt/data01 0 0' : 'dataDir', + '/mnt/data02 0 0' : 'dataDir', + '/mnt/data03 0 0' : 'dataDir', + '/mnt/data04 0 0' : 'dataDir' + } + dir_list = ['/mnt/data00','/mnt/data01','/mnt/data02','/mnt/data03','/mnt/data04'] + for i in dir_list: + tdSql.createDir(i) + tdDnodes.deploy(1,cfg) + tdDnodes.start(1) + + tdSql.execute("create database test duration 1") + tdSql.execute("use test") + + tdSql.execute("create table stb(ts timestamp, c int) tags(t int)") + + for i in range(self.ntables): + tdSql.execute("create table tb%d using stb tags(%d)" %(i, i)) + tdSql.execute("insert into tb%d values(%d, 1)" % (i,self.ts + int (i / 100) * 86400000)) + + tdLog.info("================= step2") + tdDnodes.stop(1) + tdDnodes.start(1) + tdSql.query("select * from test.stb") + tdSql.checkRows(1000) + tdLog.info("================= step3") + tdSql.execute('drop database test') + for i in range(50): + tdSql.execute("create database test%d duration 1" %(i)) + tdSql.execute("use test%d" %(i)) + tdSql.execute("create table tb (ts timestamp,i int)") + for j in range(10): + tdSql.execute("insert into tb values(%d, 1)" % (self.ts + int (i / 100) * 86400000)) + tdDnodes.stop(1) + tdDnodes.start(1) + flag = True + for i in range(4): + if dataDict[dataDir[i]] == dataDict[dataDir[i+1]]: + flag = flag & True + else: + flag = flag & False + break + if not flag : tdLog.exit("%s failed, expect not occured" % (sys.argv[0])) + + def three_level_basic(self): + tdLog.info("============== three_level_basic test ===============") + tdDnodes.stop(1) + # Test1 1 dataDir + cfg={ + '/mnt/data000 0 1' : 'dataDir', + '/mnt/data001 0 0' : 'dataDir', + '/mnt/data002 0 0' : 'dataDir', + '/mnt/data010 1 0' : 'dataDir', + '/mnt/data011 1 0' : 'dataDir', + '/mnt/data012 1 0' : 'dataDir', + '/mnt/data020 2 0' : 'dataDir', + '/mnt/data021 2 0' : 'dataDir', + '/mnt/data022 2 0' : 'dataDir' + } + dir_list = ['/mnt/data000','/mnt/data001','/mnt/data002','/mnt/data010','/mnt/data011','/mnt/data012','/mnt/data020','/mnt/data021''/mnt/data022'] + for i in dir_list: + tdSql.createDir(i) + + tdDnodes.deploy(1,cfg) + tdDnodes.start(1) + for i in dir_list: + if i == '/mnt/data000': + tdSql.haveFile(i,1) + else: + tdSql.haveFile(i,0) + + def more_than_16_disks(self): + tdLog.info("============== more_than_16_disks test ===============") + cfg={} + for i in range(17): + if i == 0 : + datadir = '/mnt/data%d 0 1' % (i+1) + else: + datadir = '/mnt/data%d 0 0' % (i+1) + cfg.update({ datadir : 'dataDir' }) + tdSql.createDir('/mnt/data%d' % (i+1)) + + tdLog.info("================= step1") + tdDnodes.stop(1) + tdDnodes.deploy(1,cfg) + tdDnodes.startWithoutSleep(1) + + tdLog.info("================= step2") + tdSql.taosdStatus(0) + + def missing_middle_level(self): + tdLog.info("============== missing_middle_level test ===============") + tdDnodes.stop(1) + # Test1 1 dataDir + cfg={ + '/mnt/data1 1 0' : 'dataDir' + } + tdSql.createDir('/mnt/data1') + + tdDnodes.deploy(1,cfg) + tdDnodes.startWithoutSleep(1) + + tdSql.taosdStatus(0) + tdDnodes.stop(1) + # Test2 2 dataDir + cfg={ + '/mnt/data1 0 1' : 'dataDir', + '/mnt/data1 2 0' : 'dataDir' + } + tdSql.createDir('/mnt/data1') + + tdDnodes.deploy(1,cfg) + tdDnodes.startWithoutSleep(1) + + tdSql.taosdStatus(0) + def run(self): + self.basic() + self.dir_not_exist() + self.dir_permission_denied() + self.file_distribution_same_level() + self.three_level_basic() + self.more_than_16_disks() + self.missing_middle_level() + + + + def stop(self): + tdSql.close() + tdLog.success("%s successfully executed" % __file__) + +tdCases.addWindows(__file__, TDTestCase()) +tdCases.addLinux(__file__, TDTestCase()) From e36bf05f98b7b973f742df9ab7238a4cad518f3f Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Thu, 20 Apr 2023 17:30:09 +0800 Subject: [PATCH 03/46] enh: support get subtable tag and auth --- include/libs/catalog/catalog.h | 1 + source/libs/catalog/inc/catalogInt.h | 10 ++ source/libs/catalog/src/catalog.c | 2 +- source/libs/catalog/src/ctgAsync.c | 96 +++++++++++++++++--- source/libs/catalog/src/ctgCache.c | 23 +++++ source/libs/catalog/src/ctgUtil.c | 131 ++++++++++++++++++--------- 6 files changed, 202 insertions(+), 61 deletions(-) diff --git a/include/libs/catalog/catalog.h b/include/libs/catalog/catalog.h index 2f8e7846f3..6f2fb4eb6b 100644 --- a/include/libs/catalog/catalog.h +++ b/include/libs/catalog/catalog.h @@ -106,6 +106,7 @@ typedef struct SMetaData { SArray* pUser; // pRes = SUserAuthRes* SArray* pQnodeList; // pRes = SArray* SArray* pTableCfg; // pRes = STableCfg* + SArray* pTableTag; // pRes = SArray* SArray* pDnodeList; // pRes = SArray* SMetaRes* pSvrVer; // pRes = char* } SMetaData; diff --git a/source/libs/catalog/inc/catalogInt.h b/source/libs/catalog/inc/catalogInt.h index f0e5024c59..1eaf45dafe 100644 --- a/source/libs/catalog/inc/catalogInt.h +++ b/source/libs/catalog/inc/catalogInt.h @@ -154,6 +154,11 @@ typedef struct SCtgTbCacheInfo { int32_t tbType; } SCtgTbCacheInfo; +typedef struct SCtgTbMetaParam { + SName* pName; + int32_t flag; +} SCtgTbMetaParam; + typedef struct SCtgTbMetaCtx { SCtgTbCacheInfo tbInfo; int32_t vgId; @@ -631,6 +636,7 @@ typedef struct SCtgCacheItemInfo { #define CTG_FLAG_SYS_DB 0x8 #define CTG_FLAG_FORCE_UPDATE 0x10 #define CTG_FLAG_ONLY_CACHE 0x20 +#define CTG_FLAG_SYNC_OP 0x40 #define CTG_FLAG_SET(_flag, _v) ((_flag) |= (_v)) @@ -933,6 +939,10 @@ void ctgReleaseVgMetaToCache(SCatalog* pCtg, SCtgDBCache* dbCache, SCtgTbCach void ctgReleaseTbMetaToCache(SCatalog* pCtg, SCtgDBCache* dbCache, SCtgTbCache* pCache); void ctgGetGlobalCacheStat(SCtgCacheStat* pStat); int32_t ctgChkSetAuthRes(SCatalog* pCtg, SCtgAuthReq* req, SCtgAuthRsp* res); +int32_t ctgGetTbMeta(SCatalog* pCtg, SRequestConnInfo* pConn, SCtgTbMetaCtx* ctx, STableMeta** pTableMeta); +int32_t ctgGetCachedStbNameFromSuid(SCatalog* pCtg, char* dbFName, uint64_t suid, char **stbName); +int32_t ctgGetTbTagCb(SCtgTask* pTask); +int32_t ctgGetUserCb(SCtgTask* pTask); extern SCatalogMgmt gCtgMgmt; extern SCtgDebug gCTGDebug; diff --git a/source/libs/catalog/src/catalog.c b/source/libs/catalog/src/catalog.c index bddc6c01a7..b263654e70 100644 --- a/source/libs/catalog/src/catalog.c +++ b/source/libs/catalog/src/catalog.c @@ -208,7 +208,7 @@ int32_t ctgGetTbMeta(SCatalog* pCtg, SRequestConnInfo* pConn, SCtgTbMetaCtx* ctx } while (true) { - CTG_ERR_JRET(ctgRefreshTbMeta(pCtg, pConn, ctx, &output, false)); + CTG_ERR_JRET(ctgRefreshTbMeta(pCtg, pConn, ctx, &output, ctx->flag & CTG_FLAG_SYNC_OP)); if (CTG_IS_META_TABLE(output->metaType)) { *pTableMeta = output->tbMeta; diff --git a/source/libs/catalog/src/ctgAsync.c b/source/libs/catalog/src/ctgAsync.c index b10da5cc73..affcfeb8ac 100644 --- a/source/libs/catalog/src/ctgAsync.c +++ b/source/libs/catalog/src/ctgAsync.c @@ -21,7 +21,8 @@ #include "trpc.h" int32_t ctgInitGetTbMetaTask(SCtgJob* pJob, int32_t taskIdx, void* param) { - SName* name = (SName*)param; + SCtgTbMetaParam* pParam = (SCtgTbMetaParam*)param; + SName* name = pParam->pName; SCtgTask task = {0}; task.type = CTG_TASK_GET_TB_META; @@ -41,7 +42,7 @@ int32_t ctgInitGetTbMetaTask(SCtgJob* pJob, int32_t taskIdx, void* param) { } memcpy(ctx->pName, name, sizeof(*name)); - ctx->flag = CTG_FLAG_UNKNOWN_STB; + ctx->flag = pParam->flag | CTG_FLAG_UNKNOWN_STB; taosArrayPush(pJob->pTasks, &task); @@ -545,7 +546,7 @@ int32_t ctgInitJob(SCatalog* pCtg, SRequestConnInfo* pConn, SCtgJob** job, const int32_t dbInfoNum = (int32_t)taosArrayGetSize(pReq->pDbInfo); int32_t tbIndexNum = (int32_t)taosArrayGetSize(pReq->pTableIndex); int32_t tbCfgNum = (int32_t)taosArrayGetSize(pReq->pTableCfg); - int32_t tbTagNum = (int32_t)ctgGetTablesReqNum(pReq->pTableTag); + int32_t tbTagNum = (int32_t)taosArrayGetSize(pReq->pTableTag); int32_t taskNum = tbMetaNum + dbVgNum + udfNum + tbHashNum + qnodeNum + dnodeNum + svrVerNum + dbCfgNum + indexNum + userNum + dbInfoNum + tbIndexNum + tbCfgNum + tbTagNum; @@ -646,7 +647,7 @@ int32_t ctgInitJob(SCatalog* pCtg, SRequestConnInfo* pConn, SCtgJob** job, const CTG_ERR_JRET(ctgInitTask(pJob, CTG_TASK_GET_TB_CFG, name, NULL)); } - for (int32_t i = 0; i < tbCfgNum; ++i) { + for (int32_t i = 0; i < tbTagNum; ++i) { SName* name = taosArrayGet(pReq->pTableTag, i); CTG_ERR_JRET(ctgInitTask(pJob, CTG_TASK_GET_TB_TAG, name, NULL)); } @@ -761,7 +762,11 @@ int32_t ctgDumpTbHashsRes(SCtgTask* pTask) { int32_t ctgDumpTbIndexRes(SCtgTask* pTask) { SCtgJob* pJob = pTask->pJob; if (NULL == pJob->jobRes.pTableIndex) { - pJob->jobRes.pTableIndex = taosArrayInit(pJob->tbIndexNum, sizeof(SMetaRes)); + SArray* pRes = taosArrayInit(pJob->tbIndexNum, sizeof(SMetaRes)); + if (atomic_val_compare_exchange_ptr(&pJob->jobRes.pTableIndex, NULL, pRes)) { + taosArrayDestroy(pRes); + } + if (NULL == pJob->jobRes.pTableIndex) { CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY); } @@ -776,7 +781,11 @@ int32_t ctgDumpTbIndexRes(SCtgTask* pTask) { int32_t ctgDumpTbCfgRes(SCtgTask* pTask) { SCtgJob* pJob = pTask->pJob; if (NULL == pJob->jobRes.pTableCfg) { - pJob->jobRes.pTableCfg = taosArrayInit(pJob->tbCfgNum, sizeof(SMetaRes)); + SArray* pRes = taosArrayInit(pJob->tbCfgNum, sizeof(SMetaRes)); + if (atomic_val_compare_exchange_ptr(&pJob->jobRes.pTableCfg, NULL, pRes)) { + taosArrayDestroy(pRes); + } + if (NULL == pJob->jobRes.pTableCfg) { CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY); } @@ -788,6 +797,26 @@ int32_t ctgDumpTbCfgRes(SCtgTask* pTask) { return TSDB_CODE_SUCCESS; } +int32_t ctgDumpTbTagRes(SCtgTask* pTask) { + SCtgJob* pJob = pTask->pJob; + if (NULL == pJob->jobRes.pTableTag) { + SArray* pRes = taosArrayInit(pJob->tbTagNum, sizeof(SMetaRes)); + if (atomic_val_compare_exchange_ptr(&pJob->jobRes.pTableTag, NULL, pRes)) { + taosArrayDestroy(pRes); + } + + if (NULL == pJob->jobRes.pTableTag) { + CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY); + } + } + + SMetaRes res = {.code = pTask->code, .pRes = pTask->res}; + taosArrayPush(pJob->jobRes.pTableTag, &res); + + return TSDB_CODE_SUCCESS; +} + + int32_t ctgDumpIndexRes(SCtgTask* pTask) { SCtgJob* pJob = pTask->pJob; if (NULL == pJob->jobRes.pIndex) { @@ -1123,7 +1152,7 @@ int32_t ctgHandleGetTbMetaRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBuf STableMetaOutput* pOut = (STableMetaOutput*)pMsgCtx->out; - ctgUpdateTbMetaToCache(pCtg, pOut, false); + ctgUpdateTbMetaToCache(pCtg, pOut, flag & CTG_FLAG_SYNC_OP); if (CTG_IS_META_BOTH(pOut->metaType)) { memcpy(pOut->tbMeta, &pOut->ctbMeta, sizeof(pOut->ctbMeta)); @@ -1525,11 +1554,36 @@ _return: int32_t ctgHandleGetTbTagRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBuf* pMsg, int32_t rspCode) { int32_t code = 0; SCtgTask* pTask = tReq->pTask; + SCatalog* pCtg = pTask->pJob->pCtg; CTG_ERR_JRET(ctgProcessRspMsg(&pTask->msgCtx.out, reqType, pMsg->pData, pMsg->len, rspCode, pTask->msgCtx.target)); STableCfgRsp* pRsp = (STableCfgRsp*)pTask->msgCtx.out; + if (NULL == pRsp->pTags || pRsp->tagsLen <= 0) { + ctgError("invalid tag in tbCfg rsp, pTags:%p, len:%d", pRsp->pTags, pRsp->tagsLen); + CTG_ERR_JRET(TSDB_CODE_INVALID_MSG); + } + + SArray* pTagVals = NULL; + STag* pTag = (STag*)pRsp->pTags; + + if (tTagIsJson(pTag)) { + pTagVals = taosArrayInit(1, sizeof(STagVal)); + if (NULL == pTagVals) { + CTG_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY); + } + + char* pJson = parseTagDatatoJson(pTag); + STagVal tagVal; + tagVal.cid = 0; + tagVal.type = TSDB_DATA_TYPE_JSON; + tagVal.pData = pJson; + tagVal.nData = strlen(pJson); + taosArrayPush(pTagVals, &tagVal); + } else { + CTG_ERR_JRET(tTagToValArray((const STag*)pRsp->pTags, &pTagVals)); + } - TSWAP(pTask->res, pTask->msgCtx.out); + pTask->res = pTagVals; _return: @@ -1971,7 +2025,10 @@ int32_t ctgLaunchGetTbCfgTask(SCtgTask* pTask) { if (pCtx->tbType <= 0) { CTG_ERR_JRET(ctgReadTbTypeFromCache(pCtg, dbFName, pCtx->pName->tname, &pCtx->tbType)); if (pCtx->tbType <= 0) { - CTG_ERR_JRET(ctgLaunchSubTask(pTask, CTG_TASK_GET_TB_META, ctgGetTbCfgCb, pCtx->pName)); + SCtgTbMetaParam param; + param.pName = pCtx->pName; + param.flag = 0; + CTG_ERR_JRET(ctgLaunchSubTask(pTask, CTG_TASK_GET_TB_META, ctgGetTbCfgCb, ¶m)); return TSDB_CODE_SUCCESS; } } @@ -2019,7 +2076,7 @@ int32_t ctgLaunchGetTbTagTask(SCtgTask* pTask) { if (NULL == pCtx->pVgInfo) { CTG_ERR_JRET(ctgGetTbHashVgroupFromCache(pCtg, pCtx->pName, &pCtx->pVgInfo)); if (NULL == pCtx->pVgInfo) { - CTG_ERR_JRET(ctgLaunchSubTask(pTask, CTG_TASK_GET_DB_VGROUP, ctgGetTbCfgCb, dbFName)); + CTG_ERR_JRET(ctgLaunchSubTask(pTask, CTG_TASK_GET_DB_VGROUP, ctgGetTbTagCb, dbFName)); return TSDB_CODE_SUCCESS; } } @@ -2189,7 +2246,10 @@ int32_t ctgLaunchGetUserTask(SCtgTask* pTask) { taosMemoryFreeClear(rsp.pRawRes); if (rsp.metaNotExists) { - CTG_ERR_RET(ctgLaunchSubTask(pTask, CTG_TASK_GET_TB_META, ctgGetTbCfgCb, &pCtx->user.tbName)); + SCtgTbMetaParam param; + param.pName = &pCtx->user.tbName; + param.flag = CTG_FLAG_SYNC_OP; + CTG_ERR_RET(ctgLaunchSubTask(pTask, CTG_TASK_GET_TB_META, ctgGetUserCb, ¶m)); } else { CTG_ERR_RET(ctgGetUserDbAuthFromMnode(pCtg, pConn, pCtx->user.user, NULL, pTask)); } @@ -2251,9 +2311,11 @@ int32_t ctgGetTbTagCb(SCtgTask* pTask) { SCtgTbTagCtx* pCtx = (SCtgTbTagCtx*)pTask->taskCtx; SDBVgInfo* pDb = (SDBVgInfo*)pTask->subRes.res; - pCtx->pVgInfo = taosMemoryCalloc(1, sizeof(SVgroupInfo)); - CTG_ERR_JRET(ctgGetVgInfoFromHashValue(pTask->pJob->pCtg, pDb, pCtx->pName, pCtx->pVgInfo)); - + if (NULL == pCtx->pVgInfo) { + pCtx->pVgInfo = taosMemoryCalloc(1, sizeof(SVgroupInfo)); + CTG_ERR_JRET(ctgGetVgInfoFromHashValue(pTask->pJob->pCtg, pDb, pCtx->pName, pCtx->pVgInfo)); + } + CTG_RET(ctgLaunchGetTbTagTask(pTask)); _return: @@ -2286,8 +2348,12 @@ int32_t ctgCompDbVgTasks(SCtgTask* pTask, void* param, bool* equal) { int32_t ctgCompTbMetaTasks(SCtgTask* pTask, void* param, bool* equal) { SCtgTbMetaCtx* ctx = pTask->taskCtx; + SCtgTbMetaParam* pParam = (SCtgTbMetaParam*)param; - *equal = tNameTbNameEqual(ctx->pName, (SName*)param); + *equal = tNameTbNameEqual(ctx->pName, (SName*)pParam->pName); + if (*equal) { + ctx->flag |= pParam->flag; + } return TSDB_CODE_SUCCESS; } diff --git a/source/libs/catalog/src/ctgCache.c b/source/libs/catalog/src/ctgCache.c index 592b6e9c72..ee864d985e 100644 --- a/source/libs/catalog/src/ctgCache.c +++ b/source/libs/catalog/src/ctgCache.c @@ -703,6 +703,29 @@ _return: CTG_RET(code); } +int32_t ctgGetCachedStbNameFromSuid(SCatalog* pCtg, char* dbFName, uint64_t suid, char **stbName) { + *stbName = NULL; + + SCtgDBCache *dbCache = NULL; + ctgAcquireDBCache(pCtg, dbFName, &dbCache); + if (NULL == dbCache) { + ctgDebug("db %s not in cache", dbFName); + return TSDB_CODE_SUCCESS; + } + + char *stb = taosHashAcquire(dbCache->stbCache, &suid, sizeof(suid)); + if (NULL == stb) { + ctgDebug("stb 0x%" PRIx64 " not in cache, dbFName:%s", suid, dbFName); + return TSDB_CODE_SUCCESS; + } + + *stbName = taosStrdup(stb); + + taosHashRelease(dbCache->stbCache, stb); + + return TSDB_CODE_SUCCESS; +} + int32_t ctgChkAuthFromCache(SCatalog *pCtg, SUserAuthInfo *pReq, bool *inCache, SCtgAuthRsp *pRes) { if (IS_SYS_DBNAME(pReq->tbName.dbname)) { *inCache = true; diff --git a/source/libs/catalog/src/ctgUtil.c b/source/libs/catalog/src/ctgUtil.c index b2b2b5a87e..7ef2e34d1e 100644 --- a/source/libs/catalog/src/ctgUtil.c +++ b/source/libs/catalog/src/ctgUtil.c @@ -486,6 +486,18 @@ void ctgFreeBatchHash(void* hash) { taosMemoryFreeClear(pRes->pRes); } +void ctgFreeJsonTagVal(void *val) { + if (NULL == val) { + return; + } + + STagVal *pVal = (STagVal *)val; + + if (TSDB_DATA_TYPE_JSON == pVal->type) { + taosMemoryFree(pVal->pData); + } +} + void ctgFreeTaskRes(CTG_TASK_TYPE type, void** pRes) { switch (type) { case CTG_TASK_GET_QNODE: @@ -526,6 +538,14 @@ void ctgFreeTaskRes(CTG_TASK_TYPE type, void** pRes) { taosMemoryFreeClear(*pRes); break; } + case CTG_TASK_GET_TB_TAG: { + if (1 == taosArrayGetSize(*pRes)) { + taosArrayDestroyEx(*pRes, ctgFreeJsonTagVal); + } else { + taosArrayDestroy(*pRes); + } + *pRes = NULL; + } case CTG_TASK_GET_TB_META_BATCH: { SArray* pArray = (SArray*)*pRes; int32_t num = taosArrayGetSize(pArray); @@ -679,6 +699,12 @@ void ctgFreeTaskCtx(SCtgTask* pTask) { taosMemoryFreeClear(pTask->taskCtx); break; } + case CTG_TASK_GET_TB_TAG: { + SCtgTbTagCtx* taskCtx = (SCtgTbTagCtx*)pTask->taskCtx; + taosMemoryFreeClear(taskCtx->pName); + taosMemoryFreeClear(taskCtx->pVgInfo); + break; + } case CTG_TASK_GET_DB_VGROUP: case CTG_TASK_GET_DB_CFG: case CTG_TASK_GET_DB_INFO: @@ -1336,54 +1362,69 @@ int32_t ctgChkSetTbAuthRes(SCatalog* pCtg, SCtgAuthReq* req, SCtgAuthRsp* res) { STableMeta* pMeta = NULL; SGetUserAuthRsp* pInfo = &req->authInfo; SHashObj* pTbs = (AUTH_TYPE_READ == req->singleType) ? pInfo->readTbs : pInfo->writeTbs; + char* stbName = NULL; + + char tbFName[TSDB_TABLE_FNAME_LEN]; + char dbFName[TSDB_DB_FNAME_LEN]; + tNameExtractFullName(&req->pRawReq->tbName, tbFName); + tNameGetFullDbName(&req->pRawReq->tbName, dbFName); - char tbFullName[TSDB_TABLE_FNAME_LEN]; - tNameExtractFullName(&req->pRawReq->tbName, tbFullName); - char* pCond = taosHashGet(pTbs, tbFullName, strlen(tbFullName)); - if (pCond) { - if (strlen(pCond) > 1) { - CTG_ERR_RET(nodesStringToNode(pCond, &res->pRawRes->pCond)); + while (true) { + char* pCond = taosHashGet(pTbs, tbFName, strlen(tbFName)); + if (pCond) { + if (strlen(pCond) > 1) { + CTG_ERR_RET(nodesStringToNode(pCond, &res->pRawRes->pCond)); + } + + res->pRawRes->pass = true; + return TSDB_CODE_SUCCESS; } - res->pRawRes->pass = true; - return TSDB_CODE_SUCCESS; + if (stbName) { + res->pRawRes->pass = false; + goto _return; + } + + CTG_ERR_RET(catalogGetCachedTableMeta(pCtg, &req->pRawReq->tbName, &pMeta)); + if (NULL == pMeta) { + if (req->onlyCache) { + res->metaNotExists = true; + ctgDebug("db %s tb %s meta not in cache for auth", req->pRawReq->tbName.dbname, req->pRawReq->tbName.tname); + return TSDB_CODE_SUCCESS; + } + + SCtgTbMetaCtx ctx = {0}; + ctx.pName = (SName*)&req->pRawReq->tbName; + ctx.flag = CTG_FLAG_UNKNOWN_STB | CTG_FLAG_SYNC_OP; + + CTG_ERR_RET(ctgGetTbMeta(pCtg, req->pConn, &ctx, &pMeta)); + } + + if (TSDB_SUPER_TABLE == pMeta->tableType || TSDB_NORMAL_TABLE == pMeta->tableType) { + res->pRawRes->pass = false; + goto _return; + } + + if (TSDB_CHILD_TABLE == pMeta->tableType) { + CTG_ERR_JRET(ctgGetCachedStbNameFromSuid(pCtg, dbFName, pMeta->suid, &stbName)); + if (NULL == stbName) { + if (req->onlyCache) { + res->metaNotExists = true; + ctgDebug("suid %" PRIu64 " name not in cache for auth", pMeta->suid); + return TSDB_CODE_SUCCESS; + } + + continue; + } + + sprintf(tbFName, "%s.%s", dbFName, stbName); + continue; + } + + ctgError("Invalid table type %d for %s", pMeta->tableType, tbFName); + CTG_ERR_JRET(TSDB_CODE_INVALID_PARA); } - res->pRawRes->pass = false; - - // CTG_ERR_RET(catalogGetCachedTableMeta(pCtg, &req->pRawReq->tbName, &pMeta)); - // if (NULL == pMeta) { - // if (req->onlyCache) { - // res->metaNotExists = true; - // ctgDebug("db %s tb %s meta not in cache for auth", req->pRawReq->tbName.dbname, req->pRawReq->tbName.tname); - // return TSDB_CODE_SUCCESS; - // } - - // CTG_ERR_RET(catalogGetTableMeta(pCtg, req->pConn, &req->pRawReq->tbName, &pMeta)); - // } - - // if (TSDB_SUPER_TABLE == pMeta->tableType || TSDB_NORMAL_TABLE == pMeta->tableType) { - // res->pRawRes->pass = false; - // goto _return; - // } - - // if (TSDB_CHILD_TABLE == pMeta->tableType) { - // res->pRawRes->pass = true; - - // /* - // char stbName[TSDB_TABLE_NAME_LEN] = {0}; - // CTG_ERR_JRET(ctgGetCachedStbNameFromSuid(pCtg, pMeta->suid, stbName)); - // if (0 == stbName[0]) { - // if (req->onlyCache) { - // res->notExists = true; - // return TSDB_CODE_SUCCESS; - // } - - // CTG_ERR_RET(catalogRefreshTableMeta(pCtg, req->pConn, &req->pRawReq->tbName, 0)); - // } - // */ - // } - _return: taosMemoryFree(pMeta); @@ -1423,7 +1464,7 @@ int32_t ctgChkSetAuthRes(SCatalog* pCtg, SCtgAuthReq* req, SCtgAuthRsp* res) { if (pInfo->readTbs && taosHashGetSize(pInfo->readTbs) > 0) { req->singleType = AUTH_TYPE_READ; CTG_ERR_RET(ctgChkSetTbAuthRes(pCtg, req, res)); - if (pRes->pass) { + if (pRes->pass || res->metaNotExists) { return TSDB_CODE_SUCCESS; } } @@ -1439,7 +1480,7 @@ int32_t ctgChkSetAuthRes(SCatalog* pCtg, SCtgAuthReq* req, SCtgAuthRsp* res) { if (pInfo->writeTbs && taosHashGetSize(pInfo->writeTbs) > 0) { req->singleType = AUTH_TYPE_WRITE; CTG_ERR_RET(ctgChkSetTbAuthRes(pCtg, req, res)); - if (pRes->pass) { + if (pRes->pass || res->metaNotExists) { return TSDB_CODE_SUCCESS; } } From 96abcfe8768fa3be6d99cb0b7da1ebf8e851d15d Mon Sep 17 00:00:00 2001 From: plum-lihui Date: Thu, 20 Apr 2023 17:42:34 +0800 Subject: [PATCH 04/46] test: modify tmq case --- tests/system-test/7-tmq/subscribeDb3.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tests/system-test/7-tmq/subscribeDb3.py b/tests/system-test/7-tmq/subscribeDb3.py index bddb196f4a..1de9b62bcd 100644 --- a/tests/system-test/7-tmq/subscribeDb3.py +++ b/tests/system-test/7-tmq/subscribeDb3.py @@ -82,7 +82,7 @@ class TDTestCase: tdSql.query("select * from %s.notifyinfo"%cdbName) #tdLog.info("row: %d, %l64d, %l64d"%(tdSql.getData(0, 1),tdSql.getData(0, 2),tdSql.getData(0, 3)) if tdSql.getRows() == 2 : - print(tdSql.getData(0, 1), tdSql.getData(1, 1)) + tdLog.info("row[0][1]: %d, row[1][1]: %d"%(tdSql.getData(0, 1), tdSql.getData(1, 1))) if tdSql.getData(1, 1) == 1: break time.sleep(0.1) @@ -122,6 +122,7 @@ class TDTestCase: os.system(shellCmd) def create_tables(self,tsql, dbName,vgroups,stbName,ctbNum,rowsPerTbl): + tdLog.info("start create tables......") tsql.execute("create database if not exists %s vgroups %d wal_retention_period 3600"%(dbName, vgroups)) tsql.execute("use %s" %dbName) tsql.execute("create table if not exists %s (ts timestamp, c1 bigint, c2 binary(16)) tags(t1 int)"%stbName) @@ -137,11 +138,11 @@ class TDTestCase: tsql.execute(sql) event.set() - tdLog.debug("complete to create database[%s], stable[%s] and %d child tables" %(dbName, stbName, ctbNum)) + tdLog.info("complete to create database[%s], stable[%s] and %d child tables" %(dbName, stbName, ctbNum)) return def insert_data(self,tsql,dbName,stbName,ctbNum,rowsPerTbl,batchNum,startTs): - tdLog.debug("start to insert data ............") + tdLog.info("start to insert data ............") tsql.execute("use %s" %dbName) pre_insert = "insert into " sql = pre_insert @@ -163,7 +164,7 @@ class TDTestCase: if sql != pre_insert: #print("insert sql:%s"%sql) tsql.execute(sql) - tdLog.debug("insert data ............ [OK]") + tdLog.info("insert data ............ [OK]") return def prepareEnv(self, **parameterDict): @@ -286,7 +287,7 @@ class TDTestCase: prepareEnvThread.start() tdLog.info("create topics from db") - topicName1 = 'topic_db1' + topicName1 = 'topic_db11' tdSql.execute("create topic %s as database %s" %(topicName1, parameterDict['dbName'])) consumerId = 0 From a952c008af937cd3f5a43614887e3a98835ac1ab Mon Sep 17 00:00:00 2001 From: jiacy-jcy <714897623@qq.com> Date: Fri, 21 Apr 2023 15:45:25 +0800 Subject: [PATCH 05/46] update test case for bug TS-3216 --- tests/system-test/0-others/multilevel.py | 43 ++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/tests/system-test/0-others/multilevel.py b/tests/system-test/0-others/multilevel.py index 6780ea9fef..350337942b 100644 --- a/tests/system-test/0-others/multilevel.py +++ b/tests/system-test/0-others/multilevel.py @@ -194,7 +194,7 @@ class TDTestCase: tdSql.taosdStatus(0) tdDnodes.stop(1) # Test2 2 dataDir - cfg={ + cfg = { '/mnt/data1 0 1' : 'dataDir', '/mnt/data1 2 0' : 'dataDir' } @@ -204,6 +204,45 @@ class TDTestCase: tdDnodes.startWithoutSleep(1) tdSql.taosdStatus(0) + + def trim_database(self): + tdLog.info("============== trim_database test ===============") + tdDnodes.stop(1) + cfg = { + '/mnt/data1 0 1' : 'dataDir' + + } + tdSql.createDir('/mnt/data1') + tdDnodes.deploy(1,cfg) + tdDnodes.start(1) + + tdSql.execute('create database dbtest') + tdSql.execute('use dbtest') + tdSql.execute('create table stb (ts timestamp,c0 int) tags(t0 int)') + tdSql.execute('create table tb1 using stb tags(1)') + for i in range(10,30): + tdSql.execute(f'insert into tb1 values(now-{i}d,10)') + tdSql.execute('flush database dbtest') + tdSql.haveFile('/mnt/data1/',1) + tdDnodes.stop(1) + cfg={ + '/mnt/data1 0 1' : 'dataDir', + '/mnt/data2 1 0' : 'dataDir', + '/mnt/data3 2 0' : 'dataDir', + } + tdSql.createDir('/mnt/data2') + tdSql.createDir('/mnt/data3') + tdDnodes.deploy(1,cfg) + tdDnodes.start(1) + tdSql.haveFile('/mnt/data1/',1) + tdSql.haveFile('/mnt/data2/',0) + tdSql.haveFile('/mnt/data3/',0) + tdSql.execute('alter database dbtest keep 10d,365d,3650d') + tdSql.execute('trim database dbtest') + time.sleep(3) + tdSql.haveFile('/mnt/data1/',1) + tdSql.haveFile('/mnt/data2/',1) + def run(self): self.basic() self.dir_not_exist() @@ -212,7 +251,7 @@ class TDTestCase: self.three_level_basic() self.more_than_16_disks() self.missing_middle_level() - + self.trim_database() def stop(self): From c5b37377026167e2abac828617d4182296fc715f Mon Sep 17 00:00:00 2001 From: Ganlin Zhao Date: Sun, 23 Apr 2023 11:21:01 +0800 Subject: [PATCH 06/46] fix: forbid delete from system table --- include/common/systable.h | 1 + source/common/src/systable.c | 4 ++++ source/libs/planner/src/planLogicCreater.c | 6 +++++- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/include/common/systable.h b/include/common/systable.h index 558a1ca297..6e0c67bb3f 100644 --- a/include/common/systable.h +++ b/include/common/systable.h @@ -77,6 +77,7 @@ void getInfosDbMeta(const SSysTableMeta** pInfosTableMeta, size_t* size); void getPerfDbMeta(const SSysTableMeta** pPerfsTableMeta, size_t* size); void getVisibleInfosTablesNum(bool sysInfo, size_t* size); bool invisibleColumn(bool sysInfo, int8_t tableType, int8_t flags); +bool isSystemDb(const char *dbName); #ifdef __cplusplus } diff --git a/source/common/src/systable.c b/source/common/src/systable.c index cd3dd63ef0..de95a4a5be 100644 --- a/source/common/src/systable.c +++ b/source/common/src/systable.c @@ -448,3 +448,7 @@ bool invisibleColumn(bool sysInfo, int8_t tableType, int8_t flags) { } return 0 != (flags & COL_IS_SYSINFO); } + +bool isSystemDb(const char *dbName) { + return ((strcasecmp(dbName, TSDB_INFORMATION_SCHEMA_DB) == 0) || (strcasecmp(dbName, TSDB_PERFORMANCE_SCHEMA_DB) == 0)); +} diff --git a/source/libs/planner/src/planLogicCreater.c b/source/libs/planner/src/planLogicCreater.c index c9ee83a647..9e03095d2e 100644 --- a/source/libs/planner/src/planLogicCreater.c +++ b/source/libs/planner/src/planLogicCreater.c @@ -1442,8 +1442,12 @@ static int32_t createDeleteRootLogicNode(SLogicPlanContext* pCxt, SDeleteStmt* p } static int32_t createDeleteScanLogicNode(SLogicPlanContext* pCxt, SDeleteStmt* pDelete, SLogicNode** pLogicNode) { + if (isSystemDb(((SRealTableNode*)pDelete->pFromTable)->table.dbName)) { + return TSDB_CODE_TSC_INVALID_OPERATION; + } + SScanLogicNode* pScan = NULL; - int32_t code = makeScanLogicNode(pCxt, (SRealTableNode*)pDelete->pFromTable, false, (SLogicNode**)&pScan); + int32_t code = makeScanLogicNode(pCxt, (SRealTableNode*)pDelete->pFromTable, false, (SLogicNode**)&pScan); // set columns to scan if (TSDB_CODE_SUCCESS == code) { From cd85485c07e0ce9b37911da9e1b05df2f52ba5e8 Mon Sep 17 00:00:00 2001 From: Ganlin Zhao Date: Sun, 23 Apr 2023 11:21:35 +0800 Subject: [PATCH 07/46] add test cases --- tests/system-test/1-insert/delete_systable.py | 111 ++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 tests/system-test/1-insert/delete_systable.py diff --git a/tests/system-test/1-insert/delete_systable.py b/tests/system-test/1-insert/delete_systable.py new file mode 100644 index 0000000000..40422a7515 --- /dev/null +++ b/tests/system-test/1-insert/delete_systable.py @@ -0,0 +1,111 @@ + +################################################################### +# Copyright (c) 2016 by TAOS Technologies, Inc. +# All rights reserved. +# +# This file is proprietary and confidential to TAOS Technologies. +# No part of this file may be reproduced, stored, transmitted, +# disclosed or used in any form or by any means other than as +# expressly provided by the written permission from Jianhui Tao +# +################################################################### + +# -*- coding: utf-8 -*- + +import random +import string + +from numpy import logspace +from util import constant +from util.log import * +from util.cases import * +from util.sql import * +from util.common import * +from util.sqlset import TDSetSql + +info_schema_db = "information_schema" +perf_schema_db = "performance_schema" + +info_schema_tables = [ + "ins_dnodes", + "ins_mnodes", + "ins_modules", + "ins_qnodes", + "ins_snodes", + "ins_cluster", + "ins_databases", + "ins_functions", + "ins_indexes", + "ins_stables", + "ins_tables", + "ins_tags", + "ins_columns", + "ins_users", + "ins_grants", + "ins_vgroups", + "ins_configs", + "ins_dnode_variables", + "ins_topics", + "ins_subscriptions", + "ins_streams", + "ins_streams_tasks", + "ins_vnodes", + "ins_user_privileges" +] + +perf_schema_tables = [ + "perf_connections", + "perf_queries", + "perf_consumers", + "perf_trans", + "perf_apps" +] + +class TDTestCase: + def init(self, conn, logSql, replicaVar=1): + self.replicaVar = int(replicaVar) + tdLog.debug("start to execute %s" % __file__) + tdSql.init(conn.cursor()) + + def delete_systb(self): + tdSql.execute(f'use {info_schema_db}') + for i in info_schema_tables: + tdSql.error(f'delete from {i}') + tdSql.error(f'delete from {info_schema_db}.{i}') + tdSql.error(f'delete from {i} where ts >= 0') + tdSql.error(f'delete from {info_schema_db}.{i} where ts >= 0') + + tdSql.execute(f'use {perf_schema_db}') + for i in perf_schema_tables: + tdSql.error(f'delete from {i}') + tdSql.error(f'delete from {perf_schema_db}.{i}') + tdSql.error(f'delete from {i} where ts >= 0') + tdSql.error(f'delete from {perf_schema_db}.{i} where ts >= 0') + + def drop_systb(self): + tdSql.execute(f'use {info_schema_db}') + for i in info_schema_tables: + tdSql.error(f'drop table {i}') + tdSql.error(f'drop {info_schema_db}.{i}') + tdSql.error(f'drop database {info_schema_db}') + + tdSql.execute(f'use {perf_schema_db}') + for i in perf_schema_tables: + tdSql.error(f'drop table {i}') + tdSql.error(f'drop table {perf_schema_db}.{i}') + tdSql.error(f'drop database {perf_schema_db}') + + def delete_from_systb(self): + self.delete_systb() + self.drop_systb() + def run(self): + self.delete_from_systb() + tdDnodes.stoptaosd(1) + tdDnodes.starttaosd(1) + self.delete_from_systb() + def stop(self): + tdSql.close() + tdLog.success("%s successfully executed" % __file__) + +tdCases.addWindows(__file__, TDTestCase()) +tdCases.addLinux(__file__, TDTestCase()) From bdd2c8b81f6f2b754c15b519c65204d727538bdb Mon Sep 17 00:00:00 2001 From: Ganlin Zhao Date: Sun, 23 Apr 2023 11:22:42 +0800 Subject: [PATCH 08/46] add cases --- tests/parallel_test/cases.task | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/parallel_test/cases.task b/tests/parallel_test/cases.task index dda4ec3e84..f1a1a11185 100644 --- a/tests/parallel_test/cases.task +++ b/tests/parallel_test/cases.task @@ -337,6 +337,7 @@ ,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/tb_100w_data_order.py ,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/delete_childtable.py ,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/delete_normaltable.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/delete_systable.py ,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/keep_expired.py ,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/drop.py ,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/drop.py -N 3 -M 3 -i False -n 3 From da42cf47992de24ae822dedcb641b69908aec32d Mon Sep 17 00:00:00 2001 From: jiacy-jcy <714897623@qq.com> Date: Sun, 23 Apr 2023 11:36:32 +0800 Subject: [PATCH 09/46] update --- tests/system-test/0-others/multilevel.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/system-test/0-others/multilevel.py b/tests/system-test/0-others/multilevel.py index 350337942b..7ad4eba645 100644 --- a/tests/system-test/0-others/multilevel.py +++ b/tests/system-test/0-others/multilevel.py @@ -250,8 +250,9 @@ class TDTestCase: self.file_distribution_same_level() self.three_level_basic() self.more_than_16_disks() - self.missing_middle_level() self.trim_database() + self.missing_middle_level() + def stop(self): From 4c0cfc18e013cf109f9bfe3caf06a8f34549a48b Mon Sep 17 00:00:00 2001 From: jiacy-jcy <714897623@qq.com> Date: Sun, 23 Apr 2023 11:36:59 +0800 Subject: [PATCH 10/46] update --- tests/system-test/0-others/multilevel.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/system-test/0-others/multilevel.py b/tests/system-test/0-others/multilevel.py index 7ad4eba645..8460249d04 100644 --- a/tests/system-test/0-others/multilevel.py +++ b/tests/system-test/0-others/multilevel.py @@ -251,7 +251,7 @@ class TDTestCase: self.three_level_basic() self.more_than_16_disks() self.trim_database() - self.missing_middle_level() + # self.missing_middle_level() From 4bb7a25fc7491f5f1722b8994c646f94fa3c6ec0 Mon Sep 17 00:00:00 2001 From: Xiaoyu Wang Date: Sun, 23 Apr 2023 16:30:28 +0800 Subject: [PATCH 11/46] feat: subtable level privilege --- include/common/tmsg.h | 1 + source/common/src/tmsg.c | 9 +- source/dnode/mnode/impl/src/mndUser.c | 2 + source/libs/catalog/src/ctgUtil.c | 9 +- source/libs/nodes/src/nodesUtilFuncs.c | 8 +- source/libs/parser/src/parAuthenticator.c | 15 +- source/libs/parser/src/parTranslater.c | 4 +- tests/script/tsim/user/privilege_table.sim | 280 +++++++++++++++++++++ 8 files changed, 307 insertions(+), 21 deletions(-) create mode 100644 tests/script/tsim/user/privilege_table.sim diff --git a/include/common/tmsg.h b/include/common/tmsg.h index 02c097b8d0..df76edffc9 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -689,6 +689,7 @@ typedef struct { int32_t tSerializeSAlterUserReq(void* buf, int32_t bufLen, SAlterUserReq* pReq); int32_t tDeserializeSAlterUserReq(void* buf, int32_t bufLen, SAlterUserReq* pReq); +void tFreeSAlterUserReq(SAlterUserReq* pReq); typedef struct { char user[TSDB_USER_LEN]; diff --git a/source/common/src/tmsg.c b/source/common/src/tmsg.c index d9802244b7..189fa1326f 100644 --- a/source/common/src/tmsg.c +++ b/source/common/src/tmsg.c @@ -1409,6 +1409,8 @@ int32_t tDeserializeSAlterUserReq(void *buf, int32_t bufLen, SAlterUserReq *pReq return 0; } +void tFreeSAlterUserReq(SAlterUserReq *pReq) { taosMemoryFreeClear(pReq->tagCond); } + int32_t tSerializeSGetUserAuthReq(void *buf, int32_t bufLen, SGetUserAuthReq *pReq) { SEncoder encoder = {0}; tEncoderInit(&encoder, buf, bufLen); @@ -1635,6 +1637,7 @@ int32_t tDeserializeSGetUserAuthRspImpl(SDecoder *pDecoder, SGetUserAuthRsp *pRs int32_t ref = 0; if (tDecodeI32(pDecoder, &ref) < 0) return -1; taosHashPut(pRsp->useDbs, key, strlen(key), &ref, sizeof(ref)); + taosMemoryFree(key); } } @@ -1831,7 +1834,6 @@ int32_t tSerializeSCreateFuncReq(void *buf, int32_t bufLen, SCreateFuncReq *pReq if (tEncodeCStr(&encoder, pReq->pComment) < 0) return -1; } - if (tEncodeI8(&encoder, pReq->orReplace) < 0) return -1; tEndEncode(&encoder); @@ -1876,7 +1878,6 @@ int32_t tDeserializeSCreateFuncReq(void *buf, int32_t bufLen, SCreateFuncReq *pR if (tDecodeCStrTo(&decoder, pReq->pComment) < 0) return -1; } - if (!tDecodeIsEnd(&decoder)) { if (tDecodeI8(&decoder, &pReq->orReplace) < 0) return -1; } else { @@ -2053,12 +2054,12 @@ int32_t tDeserializeSRetrieveFuncRsp(void *buf, int32_t bufLen, SRetrieveFuncRsp if (pRsp->pFuncExtraInfos == NULL) return -1; if (tDecodeIsEnd(&decoder)) { for (int32_t i = 0; i < pRsp->numOfFuncs; ++i) { - SFuncExtraInfo extraInfo = { 0 }; + SFuncExtraInfo extraInfo = {0}; taosArrayPush(pRsp->pFuncExtraInfos, &extraInfo); } } else { for (int32_t i = 0; i < pRsp->numOfFuncs; ++i) { - SFuncExtraInfo extraInfo = { 0 }; + SFuncExtraInfo extraInfo = {0}; if (tDecodeI32(&decoder, &extraInfo.funcVersion) < 0) return -1; if (tDecodeI64(&decoder, &extraInfo.funcCreatedTime) < 0) return -1; taosArrayPush(pRsp->pFuncExtraInfos, &extraInfo); diff --git a/source/dnode/mnode/impl/src/mndUser.c b/source/dnode/mnode/impl/src/mndUser.c index d08227927a..523753d7c6 100644 --- a/source/dnode/mnode/impl/src/mndUser.c +++ b/source/dnode/mnode/impl/src/mndUser.c @@ -390,6 +390,7 @@ static SSdbRow *mndUserActionDecode(SSdbRaw *pRaw) { SDB_GET_INT32(pRaw, dataPos, &ref, _OVER); taosHashPut(pUser->useDbs, key, keyLen, &ref, sizeof(ref)); + taosMemoryFree(key); } } @@ -956,6 +957,7 @@ _OVER: mError("user:%s, failed to alter since %s", alterReq.user, terrstr()); } + tFreeSAlterUserReq(&alterReq); mndReleaseUser(pMnode, pOperUser); mndReleaseUser(pMnode, pUser); mndUserFreeObj(&newUser); diff --git a/source/libs/catalog/src/ctgUtil.c b/source/libs/catalog/src/ctgUtil.c index 7ef2e34d1e..62896e4307 100644 --- a/source/libs/catalog/src/ctgUtil.c +++ b/source/libs/catalog/src/ctgUtil.c @@ -486,12 +486,12 @@ void ctgFreeBatchHash(void* hash) { taosMemoryFreeClear(pRes->pRes); } -void ctgFreeJsonTagVal(void *val) { +void ctgFreeJsonTagVal(void* val) { if (NULL == val) { return; } - STagVal *pVal = (STagVal *)val; + STagVal* pVal = (STagVal*)val; if (TSDB_DATA_TYPE_JSON == pVal->type) { taosMemoryFree(pVal->pData); @@ -545,6 +545,7 @@ void ctgFreeTaskRes(CTG_TASK_TYPE type, void** pRes) { taosArrayDestroy(*pRes); } *pRes = NULL; + break; } case CTG_TASK_GET_TB_META_BATCH: { SArray* pArray = (SArray*)*pRes; @@ -1363,7 +1364,7 @@ int32_t ctgChkSetTbAuthRes(SCatalog* pCtg, SCtgAuthReq* req, SCtgAuthRsp* res) { SGetUserAuthRsp* pInfo = &req->authInfo; SHashObj* pTbs = (AUTH_TYPE_READ == req->singleType) ? pInfo->readTbs : pInfo->writeTbs; char* stbName = NULL; - + char tbFName[TSDB_TABLE_FNAME_LEN]; char dbFName[TSDB_DB_FNAME_LEN]; tNameExtractFullName(&req->pRawReq->tbName, tbFName); @@ -1396,7 +1397,7 @@ int32_t ctgChkSetTbAuthRes(SCatalog* pCtg, SCtgAuthReq* req, SCtgAuthRsp* res) { SCtgTbMetaCtx ctx = {0}; ctx.pName = (SName*)&req->pRawReq->tbName; ctx.flag = CTG_FLAG_UNKNOWN_STB | CTG_FLAG_SYNC_OP; - + CTG_ERR_RET(ctgGetTbMeta(pCtg, req->pConn, &ctx, &pMeta)); } diff --git a/source/libs/nodes/src/nodesUtilFuncs.c b/source/libs/nodes/src/nodesUtilFuncs.c index 3f571e22ae..422a196c50 100644 --- a/source/libs/nodes/src/nodesUtilFuncs.c +++ b/source/libs/nodes/src/nodesUtilFuncs.c @@ -953,8 +953,12 @@ void nodesDestroyNode(SNode* pNode) { break; case QUERY_NODE_SPLIT_VGROUP_STMT: // no pointer field case QUERY_NODE_SYNCDB_STMT: // no pointer field - case QUERY_NODE_GRANT_STMT: // no pointer field - case QUERY_NODE_REVOKE_STMT: // no pointer field + break; + case QUERY_NODE_GRANT_STMT: + nodesDestroyNode(((SGrantStmt*)pNode)->pTagCond); + break; + case QUERY_NODE_REVOKE_STMT: + nodesDestroyNode(((SRevokeStmt*)pNode)->pTagCond); break; case QUERY_NODE_SHOW_DNODES_STMT: case QUERY_NODE_SHOW_MNODES_STMT: diff --git a/source/libs/parser/src/parAuthenticator.c b/source/libs/parser/src/parAuthenticator.c index b06d48a690..d182f5bd73 100644 --- a/source/libs/parser/src/parAuthenticator.c +++ b/source/libs/parser/src/parAuthenticator.c @@ -70,7 +70,7 @@ static EDealRes authSubquery(SAuthCxt* pCxt, SNode* pStmt) { return TSDB_CODE_SUCCESS == authQuery(pCxt, pStmt) ? DEAL_RES_CONTINUE : DEAL_RES_ERROR; } -static int32_t mergeStableTagCond(SNode** pWhere, SNode** pTagCond) { +static int32_t mergeStableTagCond(SNode** pWhere, SNode* pTagCond) { SLogicConditionNode* pLogicCond = (SLogicConditionNode*)nodesMakeNode(QUERY_NODE_LOGIC_CONDITION); if (NULL == pLogicCond) { return TSDB_CODE_OUT_OF_MEMORY; @@ -78,7 +78,7 @@ static int32_t mergeStableTagCond(SNode** pWhere, SNode** pTagCond) { pLogicCond->node.resType.type = TSDB_DATA_TYPE_BOOL; pLogicCond->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_BOOL].bytes; pLogicCond->condType = LOGIC_COND_TYPE_AND; - int32_t code = nodesListMakeStrictAppend(&pLogicCond->pParameterList, *pTagCond); + int32_t code = nodesListMakeStrictAppend(&pLogicCond->pParameterList, pTagCond); if (TSDB_CODE_SUCCESS == code) { code = nodesListMakeAppend(&pLogicCond->pParameterList, *pWhere); } @@ -91,22 +91,17 @@ static int32_t mergeStableTagCond(SNode** pWhere, SNode** pTagCond) { } static int32_t appendStableTagCond(SNode** pWhere, SNode* pTagCond) { - SNode* pTagCondCopy = nodesCloneNode(pTagCond); - if (NULL == pTagCondCopy) { - return TSDB_CODE_OUT_OF_MEMORY; - } - if (NULL == *pWhere) { - *pWhere = pTagCondCopy; + *pWhere = pTagCond; return TSDB_CODE_SUCCESS; } if (QUERY_NODE_LOGIC_CONDITION == nodeType(*pWhere) && LOGIC_COND_TYPE_AND == ((SLogicConditionNode*)*pWhere)->condType) { - return nodesListStrictAppend(((SLogicConditionNode*)*pWhere)->pParameterList, pTagCondCopy); + return nodesListStrictAppend(((SLogicConditionNode*)*pWhere)->pParameterList, pTagCond); } - return mergeStableTagCond(pWhere, &pTagCondCopy); + return mergeStableTagCond(pWhere, pTagCond); } static EDealRes authSelectImpl(SNode* pNode, void* pContext) { diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index b44c36dde1..200206755b 100644 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -1310,7 +1310,8 @@ static EDealRes translateOperator(STranslateContext* pCxt, SOperatorNode* pOp) { } static EDealRes haveVectorFunction(SNode* pNode, void* pContext) { - if (isAggFunc(pNode) || isIndefiniteRowsFunc(pNode) || isWindowPseudoColumnFunc(pNode) || isInterpPseudoColumnFunc(pNode)) { + if (isAggFunc(pNode) || isIndefiniteRowsFunc(pNode) || isWindowPseudoColumnFunc(pNode) || + isInterpPseudoColumnFunc(pNode)) { *((bool*)pContext) = true; return DEAL_RES_END; } @@ -6617,6 +6618,7 @@ static int32_t translateGrant(STranslateContext* pCxt, SGrantStmt* pStmt) { if (TSDB_CODE_SUCCESS == code) { code = buildCmdMsg(pCxt, TDMT_MND_ALTER_USER, (FSerializeFunc)tSerializeSAlterUserReq, &req); } + tFreeSAlterUserReq(&req); return code; } diff --git a/tests/script/tsim/user/privilege_table.sim b/tests/script/tsim/user/privilege_table.sim new file mode 100644 index 0000000000..5256cdd21d --- /dev/null +++ b/tests/script/tsim/user/privilege_table.sim @@ -0,0 +1,280 @@ +system sh/stop_dnodes.sh +system sh/deploy.sh -n dnode1 -i 1 +system sh/exec.sh -n dnode1 -s start +sql connect + +print =============== init env +sql drop database if exists test; +sql create database test vgroups 1; +sql use test; +sql create stable st1(ts timestamp, i int) tags(id int, loc varchar(20)); +sql create table st1s1 using st1 tags(1, 'beijing'); +sql create table st1s2 using st1 tags(2, 'shanghai'); +sql insert into st1s1 values(now, 1) st1s2 values(now, 2); +sql create stable st2(ts timestamp, i int) tags(id int, loc varchar(20)); +sql create table st2s1 using st2 tags(1, 'beijing'); +sql create table st2s2 using st2 tags(2, 'shanghai'); +sql insert into st2s1 values(now, 1) st2s2 values(now, 2); +sql create user wxy pass 'taosdata'; + +print =============== case 1: database unauthorized and table unauthorized +sql close +sql connect wxy + +sql reset query cache; +sql_error select * from test.st1; +sql_error insert into test.st1s1 values(now, 10) test.st1s2 values(now, 20); +sql_error select * from test.st2; +sql_error insert into test.st2s1 values(now, 10) test.st2s2 values(now, 20); + + +print =============== case 2: database unauthorized and table read privilege +sql close +sql connect + +sql grant read on test.st1 to wxy; + +sql close +sql connect wxy + +sql reset query cache; +sql select * from test.st1; +if $rows != 2 then + return -1 +endi +sql_error insert into test.st1s1 values(now, 10) test.st1s2 values(now, 20); +sql_error select * from test.st2; +sql_error insert into test.st2s1 values(now, 10) test.st2s2 values(now, 20); + +print =============== case 3: database unauthorized and table read privilege with condition +sql close +sql connect + +sql revoke read on test.st1 from wxy; +sql grant read on test.st1 with id = 1 to wxy; + +sql close +sql connect wxy + +sql reset query cache; +sql select * from test.st1; +if $rows != 1 then + return -1 +endi +sql_error insert into test.st1s1 values(now, 10); +sql_error insert into test.st1s2 values(now, 20); +sql_error select * from test.st2; +sql_error insert into test.st2s1 values(now, 10) test.st2s2 values(now, 20); + +print =============== case 4: database unauthorized and table write privilege +sql close +sql connect + +sql revoke read on test.st1 with id = 1 from wxy; +sql grant write on test.st1 to wxy; + +sql close +sql connect wxy + +sql reset query cache; +sql_error select tbname, * from test.st1; +sql insert into test.st1s1 values(now, 10); +sql insert into test.st1s2 values(now, 20); +sql_error select * from test.st2; +sql_error insert into test.st2s1 values(now, 10) test.st2s2 values(now, 20); + +print =============== case 5: database unauthorized and table write privilege with condition +sql close +sql connect + +sql revoke write on test.st1 from wxy; +sql grant write on test.st1 with id = 1 to wxy; + +sql close +sql connect wxy + +sql reset query cache; +sql_error select tbname, * from test.st1; +sql insert into test.st1s1 values(now, 10); +sql_error insert into test.st1s2 values(now, 20); +sql_error select * from test.st2; +sql_error insert into test.st2s1 values(now, 10) test.st2s2 values(now, 20); + +print =============== case 6: database read privilege and table unauthorized +sql close +sql connect + +sql revoke write on test.st1 with id = 1 from wxy; +sql grant read on test.* to wxy; + +sql close +sql connect wxy + +sql reset query cache; +sql select * from test.st1; +if $rows != 5 then + return -1 +endi +sql_error insert into test.st1s1 values(now, 10) test.st1s2 values(now, 20); +sql select * from test.st2; +if $rows != 2 then + return -1 +endi +sql_error insert into test.st2s1 values(now, 10) test.st2s2 values(now, 20); + +print =============== case 7: database read privilege and table read privilege +sql close +sql connect + +sql grant read on test.st1 to wxy; + +sql close +sql connect wxy + +sql reset query cache; +sql select * from test.st1; +if $rows != 2 then + return -1 +endi +sql_error insert into test.st1s1 values(now, 10) test.st1s2 values(now, 20); +sql select * from test.st2; +if $rows != 2 then + return -1 +endi +sql_error insert into test.st2s1 values(now, 10) test.st2s2 values(now, 20); + +print =============== case 8: database read privilege and table read privilege with condition +sql close +sql connect + +sql revoke read on test.st1 from wxy; +sql grant read on test.st1 with id = 1 to wxy; + +sql close +sql connect wxy + +sql select * from test.st1; +if $rows != 1 then + return -1 +endi +sql_error insert into test.st1s1 values(now, 10) test.st1s2 values(now, 20); +sql select * from test.st2; +if $rows != 2 then + return -1 +endi +sql_error insert into test.st2s1 values(now, 10) test.st2s2 values(now, 20); + +print =============== case 9: database read privilege and table write privilege +sql close +sql connect + +sql revoke read on test.st1 with id = 1 from wxy; +sql grant write on test.st1 to wxy; + +sql close +sql connect wxy + +sql select * from test.st1; +if $rows != 2 then + return -1 +endi +sql insert into test.st1s1 values(now, 10) test.st1s2 values(now, 20); +sql select * from test.st2; +if $rows != 2 then + return -1 +endi +sql_error insert into test.st2s1 values(now, 10) test.st2s2 values(now, 20); + +print =============== case 10: database read privilege and table write privilege with condition +sql close +sql connect + +sql revoke write on test.st1 from wxy; +sql grant write on test.st1 with id = 1 to wxy; + +sql close +sql connect wxy + +sql select * from test.st1; +sql insert into test.st1s1 values(now, 10); +sql_error insert into test.st1s2 values(now, 20); +sql select * from test.st2; +sql_error insert into test.st2s1 values(now, 10) test.st2s2 values(now, 20); + +print =============== case 11: database write privilege and table unauthorized +sql close +sql connect + +sql revoke read on test.* from wxy; +sql revoke write on test.st1 with id = 1 from wxy; +sql grant write on test.* to wxy; + +sql close +sql connect wxy + +sql_error select * from test.st1; +sql insert into test.st1s1 values(now, 10) test.st1s2 values(now, 20); +sql_error select * from test.st2; +sql insert into test.st2s1 values(now, 10) test.st2s2 values(now, 20); + +print =============== case 12: database write privilege and table read privilege +sql close +sql connect + +sql grant read on test.st1 to wxy; + +sql close +sql connect wxy + +sql select * from test.st1; +sql insert into test.st1s1 values(now, 10) test.st1s2 values(now, 20); +sql_error select * from test.st2; +sql insert into test.st2s1 values(now, 10) test.st2s2 values(now, 20); + +print =============== case 13: database write privilege and table read privilege with condition +sql close +sql connect + +sql revoke read on test.st1 from wxy; +sql grant read on test.st1 with id = 1 to wxy; + +sql close +sql connect wxy + +sql select * from test.st1; +sql insert into test.st1s1 values(now, 10) test.st1s2 values(now, 20); +sql_error select * from test.st2; +sql insert into test.st2s1 values(now, 10) test.st2s2 values(now, 20); + +print =============== case 14: database write privilege and table write privilege +sql close +sql connect + +sql revoke read on test.st1 with id = 1 from wxy; +sql grant write on test.st1 to wxy; + +sql close +sql connect wxy + +sql_error select * from test.st1; +sql insert into test.st1s1 values(now, 10) test.st1s2 values(now, 20); +sql_error select * from test.st2; +sql insert into test.st2s1 values(now, 10) test.st2s2 values(now, 20); + +print =============== case 15: database write privilege and table write privilege with condition +sql close +sql connect + +sql revoke write on test.st1 from wxy; +sql grant write on test.st1 with id = 1 to wxy; + +sql close +sql connect wxy + +sql_error select * from test.st1; +sql insert into test.st1s1 values(now, 10); +sql_error insert into test.st1s2 values(now, 20); +sql_error select * from test.st2; +sql insert into test.st2s1 values(now, 10) test.st2s2 values(now, 20); + +system sh/exec.sh -n dnode1 -s stop -x SIGINT From 3eca2ff8189b280819ba1c26dd1be3efc31bbb37 Mon Sep 17 00:00:00 2001 From: jiacy-jcy <714897623@qq.com> Date: Sun, 23 Apr 2023 16:54:50 +0800 Subject: [PATCH 12/46] update --- tests/system-test/0-others/multilevel.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/system-test/0-others/multilevel.py b/tests/system-test/0-others/multilevel.py index 8460249d04..7ad4eba645 100644 --- a/tests/system-test/0-others/multilevel.py +++ b/tests/system-test/0-others/multilevel.py @@ -251,7 +251,7 @@ class TDTestCase: self.three_level_basic() self.more_than_16_disks() self.trim_database() - # self.missing_middle_level() + self.missing_middle_level() From d23ae400b849f931ccae3db2ff3cd1bdaca00200 Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Mon, 24 Apr 2023 09:22:59 +0800 Subject: [PATCH 13/46] fix: table meta double free issue --- source/libs/catalog/inc/catalogInt.h | 1 + source/libs/catalog/src/ctgAsync.c | 69 ++++++++++++++++++++++++++++ source/libs/catalog/src/ctgCache.c | 3 +- 3 files changed, 72 insertions(+), 1 deletion(-) diff --git a/source/libs/catalog/inc/catalogInt.h b/source/libs/catalog/inc/catalogInt.h index 1eaf45dafe..c548a6c696 100644 --- a/source/libs/catalog/inc/catalogInt.h +++ b/source/libs/catalog/inc/catalogInt.h @@ -359,6 +359,7 @@ typedef struct SCtgSubRes { struct SCtgTask { CTG_TASK_TYPE type; + bool subTask; int32_t taskId; SCtgJob* pJob; void* taskCtx; diff --git a/source/libs/catalog/src/ctgAsync.c b/source/libs/catalog/src/ctgAsync.c index affcfeb8ac..56c79eac1f 100644 --- a/source/libs/catalog/src/ctgAsync.c +++ b/source/libs/catalog/src/ctgAsync.c @@ -699,6 +699,10 @@ _return: } int32_t ctgDumpTbMetaRes(SCtgTask* pTask) { + if (pTask->subTask) { + return TSDB_CODE_SUCCESS; + } + SCtgJob* pJob = pTask->pJob; if (NULL == pJob->jobRes.pTableMeta) { pJob->jobRes.pTableMeta = taosArrayInit(pJob->tbMetaNum, sizeof(SMetaRes)); @@ -714,6 +718,10 @@ int32_t ctgDumpTbMetaRes(SCtgTask* pTask) { } int32_t ctgDumpTbMetasRes(SCtgTask* pTask) { + if (pTask->subTask) { + return TSDB_CODE_SUCCESS; + } + SCtgJob* pJob = pTask->pJob; pJob->jobRes.pTableMeta = pTask->res; @@ -722,6 +730,10 @@ int32_t ctgDumpTbMetasRes(SCtgTask* pTask) { } int32_t ctgDumpDbVgRes(SCtgTask* pTask) { + if (pTask->subTask) { + return TSDB_CODE_SUCCESS; + } + SCtgJob* pJob = pTask->pJob; if (NULL == pJob->jobRes.pDbVgroup) { pJob->jobRes.pDbVgroup = taosArrayInit(pJob->dbVgNum, sizeof(SMetaRes)); @@ -737,6 +749,10 @@ int32_t ctgDumpDbVgRes(SCtgTask* pTask) { } int32_t ctgDumpTbHashRes(SCtgTask* pTask) { + if (pTask->subTask) { + return TSDB_CODE_SUCCESS; + } + SCtgJob* pJob = pTask->pJob; if (NULL == pJob->jobRes.pTableHash) { pJob->jobRes.pTableHash = taosArrayInit(pJob->tbHashNum, sizeof(SMetaRes)); @@ -752,6 +768,10 @@ int32_t ctgDumpTbHashRes(SCtgTask* pTask) { } int32_t ctgDumpTbHashsRes(SCtgTask* pTask) { + if (pTask->subTask) { + return TSDB_CODE_SUCCESS; + } + SCtgJob* pJob = pTask->pJob; pJob->jobRes.pTableHash = pTask->res; @@ -760,6 +780,10 @@ int32_t ctgDumpTbHashsRes(SCtgTask* pTask) { } int32_t ctgDumpTbIndexRes(SCtgTask* pTask) { + if (pTask->subTask) { + return TSDB_CODE_SUCCESS; + } + SCtgJob* pJob = pTask->pJob; if (NULL == pJob->jobRes.pTableIndex) { SArray* pRes = taosArrayInit(pJob->tbIndexNum, sizeof(SMetaRes)); @@ -779,6 +803,10 @@ int32_t ctgDumpTbIndexRes(SCtgTask* pTask) { } int32_t ctgDumpTbCfgRes(SCtgTask* pTask) { + if (pTask->subTask) { + return TSDB_CODE_SUCCESS; + } + SCtgJob* pJob = pTask->pJob; if (NULL == pJob->jobRes.pTableCfg) { SArray* pRes = taosArrayInit(pJob->tbCfgNum, sizeof(SMetaRes)); @@ -798,6 +826,10 @@ int32_t ctgDumpTbCfgRes(SCtgTask* pTask) { } int32_t ctgDumpTbTagRes(SCtgTask* pTask) { + if (pTask->subTask) { + return TSDB_CODE_SUCCESS; + } + SCtgJob* pJob = pTask->pJob; if (NULL == pJob->jobRes.pTableTag) { SArray* pRes = taosArrayInit(pJob->tbTagNum, sizeof(SMetaRes)); @@ -818,6 +850,10 @@ int32_t ctgDumpTbTagRes(SCtgTask* pTask) { int32_t ctgDumpIndexRes(SCtgTask* pTask) { + if (pTask->subTask) { + return TSDB_CODE_SUCCESS; + } + SCtgJob* pJob = pTask->pJob; if (NULL == pJob->jobRes.pIndex) { pJob->jobRes.pIndex = taosArrayInit(pJob->indexNum, sizeof(SMetaRes)); @@ -833,6 +869,10 @@ int32_t ctgDumpIndexRes(SCtgTask* pTask) { } int32_t ctgDumpQnodeRes(SCtgTask* pTask) { + if (pTask->subTask) { + return TSDB_CODE_SUCCESS; + } + SCtgJob* pJob = pTask->pJob; if (NULL == pJob->jobRes.pQnodeList) { pJob->jobRes.pQnodeList = taosArrayInit(1, sizeof(SMetaRes)); @@ -848,6 +888,10 @@ int32_t ctgDumpQnodeRes(SCtgTask* pTask) { } int32_t ctgDumpDnodeRes(SCtgTask* pTask) { + if (pTask->subTask) { + return TSDB_CODE_SUCCESS; + } + SCtgJob* pJob = pTask->pJob; if (NULL == pJob->jobRes.pDnodeList) { pJob->jobRes.pDnodeList = taosArrayInit(1, sizeof(SMetaRes)); @@ -863,6 +907,10 @@ int32_t ctgDumpDnodeRes(SCtgTask* pTask) { } int32_t ctgDumpDbCfgRes(SCtgTask* pTask) { + if (pTask->subTask) { + return TSDB_CODE_SUCCESS; + } + SCtgJob* pJob = pTask->pJob; if (NULL == pJob->jobRes.pDbCfg) { pJob->jobRes.pDbCfg = taosArrayInit(pJob->dbCfgNum, sizeof(SMetaRes)); @@ -878,6 +926,10 @@ int32_t ctgDumpDbCfgRes(SCtgTask* pTask) { } int32_t ctgDumpDbInfoRes(SCtgTask* pTask) { + if (pTask->subTask) { + return TSDB_CODE_SUCCESS; + } + SCtgJob* pJob = pTask->pJob; if (NULL == pJob->jobRes.pDbInfo) { pJob->jobRes.pDbInfo = taosArrayInit(pJob->dbInfoNum, sizeof(SMetaRes)); @@ -893,6 +945,10 @@ int32_t ctgDumpDbInfoRes(SCtgTask* pTask) { } int32_t ctgDumpUdfRes(SCtgTask* pTask) { + if (pTask->subTask) { + return TSDB_CODE_SUCCESS; + } + SCtgJob* pJob = pTask->pJob; if (NULL == pJob->jobRes.pUdfList) { pJob->jobRes.pUdfList = taosArrayInit(pJob->udfNum, sizeof(SMetaRes)); @@ -908,6 +964,10 @@ int32_t ctgDumpUdfRes(SCtgTask* pTask) { } int32_t ctgDumpUserRes(SCtgTask* pTask) { + if (pTask->subTask) { + return TSDB_CODE_SUCCESS; + } + SCtgJob* pJob = pTask->pJob; if (NULL == pJob->jobRes.pUser) { pJob->jobRes.pUser = taosArrayInit(pJob->userNum, sizeof(SMetaRes)); @@ -923,6 +983,10 @@ int32_t ctgDumpUserRes(SCtgTask* pTask) { } int32_t ctgDumpSvrVer(SCtgTask* pTask) { + if (pTask->subTask) { + return TSDB_CODE_SUCCESS; + } + SCtgJob* pJob = pTask->pJob; if (NULL == pJob->jobRes.pSvrVer) { pJob->jobRes.pSvrVer = taosMemoryCalloc(1, sizeof(SMetaRes)); @@ -2239,6 +2303,8 @@ int32_t ctgLaunchGetUserTask(SCtgTask* pTask) { if (inCache) { pTask->res = rsp.pRawRes; + ctgTaskDebug("Final res got, pass:%d, pCond:%p", rsp.pRawRes->pass, rsp.pRawRes->pCond); + CTG_ERR_RET(ctgHandleTaskEnd(pTask, 0)); return TSDB_CODE_SUCCESS; } @@ -2475,6 +2541,9 @@ int32_t ctgLaunchSubTask(SCtgTask* pTask, CTG_TASK_TYPE type, ctgSubTaskCbFp fp, } SCtgTask* pSub = taosArrayGet(pJob->pTasks, subTaskId); + if (newTask) { + pSub->subTask = true; + } CTG_ERR_RET(ctgSetSubTaskCb(pSub, pTask)); diff --git a/source/libs/catalog/src/ctgCache.c b/source/libs/catalog/src/ctgCache.c index ee864d985e..0be2a78d48 100644 --- a/source/libs/catalog/src/ctgCache.c +++ b/source/libs/catalog/src/ctgCache.c @@ -765,8 +765,9 @@ _return: *inCache = false; CTG_CACHE_NHIT_INC(CTG_CI_USER, 1); + ctgDebug("Get user from cache failed, user:%s, metaNotExists:%d, code:%d", pReq->user, pRes->metaNotExists, code); - return TSDB_CODE_SUCCESS; + return code; } void ctgDequeue(SCtgCacheOperation **op) { From 8f17c2f2d7225ac8c4a3d52d16bb44c306ace99e Mon Sep 17 00:00:00 2001 From: chenhaoran Date: Mon, 24 Apr 2023 09:37:51 +0800 Subject: [PATCH 14/46] test:modify base version in compatibility.py --- tests/system-test/0-others/compatibility.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/system-test/0-others/compatibility.py b/tests/system-test/0-others/compatibility.py index 33d1dac4b5..22e319fdaf 100644 --- a/tests/system-test/0-others/compatibility.py +++ b/tests/system-test/0-others/compatibility.py @@ -17,12 +17,12 @@ from util.dnodes import TDDnode from util.cluster import * import subprocess -BASEVERSION = "3.0.1.8" +BASEVERSION = "3.0.2.3" class TDTestCase: def caseDescription(self): - ''' + f''' 3.0 data compatibility test - case1: basedata version is 3.0.1.8 + case1: basedata version is {BASEVERSION} ''' return From 1251245c2a2c42388dddfd152bb3cec910cc5245 Mon Sep 17 00:00:00 2001 From: Ganlin Zhao Date: Mon, 24 Apr 2023 09:49:03 +0800 Subject: [PATCH 15/46] move code to parser --- source/libs/parser/src/parTranslater.c | 5 +++++ source/libs/planner/src/planLogicCreater.c | 6 +----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index b44c36dde1..52451d35a8 100644 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -3792,6 +3792,11 @@ static int32_t translateDeleteWhere(STranslateContext* pCxt, SDeleteStmt* pDelet } static int32_t translateDelete(STranslateContext* pCxt, SDeleteStmt* pDelete) { + // check delete from system tables + if (isSystemDb(((SRealTableNode*)pDelete->pFromTable)->table.dbName)) { + return TSDB_CODE_TSC_INVALID_OPERATION; + } + pCxt->pCurrStmt = (SNode*)pDelete; int32_t code = translateFrom(pCxt, pDelete->pFromTable); if (TSDB_CODE_SUCCESS == code) { diff --git a/source/libs/planner/src/planLogicCreater.c b/source/libs/planner/src/planLogicCreater.c index 9e03095d2e..39783868b3 100644 --- a/source/libs/planner/src/planLogicCreater.c +++ b/source/libs/planner/src/planLogicCreater.c @@ -1442,12 +1442,8 @@ static int32_t createDeleteRootLogicNode(SLogicPlanContext* pCxt, SDeleteStmt* p } static int32_t createDeleteScanLogicNode(SLogicPlanContext* pCxt, SDeleteStmt* pDelete, SLogicNode** pLogicNode) { - if (isSystemDb(((SRealTableNode*)pDelete->pFromTable)->table.dbName)) { - return TSDB_CODE_TSC_INVALID_OPERATION; - } - SScanLogicNode* pScan = NULL; - int32_t code = makeScanLogicNode(pCxt, (SRealTableNode*)pDelete->pFromTable, false, (SLogicNode**)&pScan); + int32_t code = makeScanLogicNode(pCxt, (SRealTableNode*)pDelete->pFromTable, false, (SLogicNode**)&pScan); // set columns to scan if (TSDB_CODE_SUCCESS == code) { From 4b166e567e1ee6eb77c1bdeffa494b59e32db563 Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Mon, 24 Apr 2023 10:14:02 +0800 Subject: [PATCH 16/46] fix: fix client retry issue --- source/client/src/clientMain.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/source/client/src/clientMain.c b/source/client/src/clientMain.c index 60c7b44b3d..54ae1ab4b3 100644 --- a/source/client/src/clientMain.c +++ b/source/client/src/clientMain.c @@ -975,8 +975,10 @@ void doAsyncQuery(SRequestObj *pRequest, bool updateMetaForce) { if (TSDB_CODE_SUCCESS == code) { pRequest->stmtType = pRequest->pQuery->pRoot->type; - phaseAsyncQuery(pWrapper); - } else { + code = phaseAsyncQuery(pWrapper); + } + + if (TSDB_CODE_SUCCESS != code) { tscError("0x%" PRIx64 " error happens, code:%d - %s, reqId:0x%" PRIx64, pRequest->self, code, tstrerror(code), pRequest->requestId); destorySqlCallbackWrapper(pWrapper); From af5bcb80bffddce7687a2b41efc220851ff9cb1c Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Mon, 24 Apr 2023 10:26:40 +0800 Subject: [PATCH 17/46] opti:test cases for tmq --- .../6-cluster/clusterCommonCreate.py | 40 ++++++++--------- tests/system-test/7-tmq/subscribeDb3.py | 45 ++++++++++--------- tests/system-test/7-tmq/tmqCommon.py | 22 +++++---- tests/system-test/7-tmq/tmqConsumerGroup.py | 2 +- tests/system-test/7-tmq/tmqDnodeRestart1.py | 4 +- 5 files changed, 56 insertions(+), 57 deletions(-) diff --git a/tests/system-test/6-cluster/clusterCommonCreate.py b/tests/system-test/6-cluster/clusterCommonCreate.py index 6e699e2396..a06c1233d8 100644 --- a/tests/system-test/6-cluster/clusterCommonCreate.py +++ b/tests/system-test/6-cluster/clusterCommonCreate.py @@ -94,26 +94,26 @@ class ClusterComCreate: tdLog.info(shellCmd) os.system(shellCmd) - def getStartConsumeNotifyFromTmqsim(self,cdbName='cdb'): - while 1: - tdSql.query("select * from %s.notifyinfo"%cdbName) - #tdLog.info("row: %d, %l64d, %l64d"%(tdSql.getData(0, 1),tdSql.getData(0, 2),tdSql.getData(0, 3)) - if (tdSql.getRows() == 1) and (tdSql.getData(0, 1) == 0): - break - else: - time.sleep(0.1) - return - - def getStartCommitNotifyFromTmqsim(self,cdbName='cdb'): - while 1: - tdSql.query("select * from %s.notifyinfo"%cdbName) - #tdLog.info("row: %d, %l64d, %l64d"%(tdSql.getData(0, 1),tdSql.getData(0, 2),tdSql.getData(0, 3)) - if tdSql.getRows() == 2 : - print(tdSql.getData(0, 1), tdSql.getData(1, 1)) - if tdSql.getData(1, 1) == 1: - break - time.sleep(0.1) - return + # def getStartConsumeNotifyFromTmqsim(self,cdbName='cdb'): + # while 1: + # tdSql.query("select * from %s.notifyinfo"%cdbName) + # #tdLog.info("row: %d, %l64d, %l64d"%(tdSql.getData(0, 1),tdSql.getData(0, 2),tdSql.getData(0, 3)) + # if (tdSql.getRows() == 1) and (tdSql.getData(0, 1) == 0): + # break + # else: + # time.sleep(0.1) + # return + # + # def getStartCommitNotifyFromTmqsim(self,cdbName='cdb'): + # while 1: + # tdSql.query("select * from %s.notifyinfo"%cdbName) + # #tdLog.info("row: %d, %l64d, %l64d"%(tdSql.getData(0, 1),tdSql.getData(0, 2),tdSql.getData(0, 3)) + # if tdSql.getRows() == 2 : + # print(tdSql.getData(0, 1), tdSql.getData(1, 1)) + # if tdSql.getData(1, 1) == 1: + # break + # time.sleep(0.1) + # return def create_database(self,tsql, dbName,dropFlag=1,vgroups=4,replica=1): if dropFlag == 1: diff --git a/tests/system-test/7-tmq/subscribeDb3.py b/tests/system-test/7-tmq/subscribeDb3.py index 1de9b62bcd..22004a95f1 100644 --- a/tests/system-test/7-tmq/subscribeDb3.py +++ b/tests/system-test/7-tmq/subscribeDb3.py @@ -10,6 +10,7 @@ from util.log import * from util.sql import * from util.cases import * from util.dnodes import * +from tmqCommon import * class TDTestCase: hostname = socket.gethostname() @@ -67,26 +68,26 @@ class TDTestCase: tdLog.info("consume info sql: %s"%sql) tdSql.query(sql) - def getStartConsumeNotifyFromTmqsim(self,cdbName='cdb'): - while 1: - tdSql.query("select * from %s.notifyinfo"%cdbName) - #tdLog.info("row: %d, %l64d, %l64d"%(tdSql.getData(0, 1),tdSql.getData(0, 2),tdSql.getData(0, 3)) - if (tdSql.getRows() == 1) and (tdSql.getData(0, 1) == 0): - break - else: - time.sleep(0.1) - return - - def getStartCommitNotifyFromTmqsim(self,cdbName='cdb'): - while 1: - tdSql.query("select * from %s.notifyinfo"%cdbName) - #tdLog.info("row: %d, %l64d, %l64d"%(tdSql.getData(0, 1),tdSql.getData(0, 2),tdSql.getData(0, 3)) - if tdSql.getRows() == 2 : - tdLog.info("row[0][1]: %d, row[1][1]: %d"%(tdSql.getData(0, 1), tdSql.getData(1, 1))) - if tdSql.getData(1, 1) == 1: - break - time.sleep(0.1) - return + # def getStartConsumeNotifyFromTmqsim(self,cdbName='cdb'): + # while 1: + # tdSql.query("select * from %s.notifyinfo"%cdbName) + # #tdLog.info("row: %d, %l64d, %l64d"%(tdSql.getData(0, 1),tdSql.getData(0, 2),tdSql.getData(0, 3)) + # if (tdSql.getRows() == 1) and (tdSql.getData(0, 1) == 0): + # break + # else: + # time.sleep(0.1) + # return + # + # def getStartCommitNotifyFromTmqsim(self,cdbName='cdb'): + # while 1: + # tdSql.query("select * from %s.notifyinfo"%cdbName) + # #tdLog.info("row: %d, %l64d, %l64d"%(tdSql.getData(0, 1),tdSql.getData(0, 2),tdSql.getData(0, 3)) + # if tdSql.getRows() == 2 : + # tdLog.info("row[0][1]: %d, row[1][1]: %d"%(tdSql.getData(0, 1), tdSql.getData(1, 1))) + # if tdSql.getData(1, 1) == 1: + # break + # time.sleep(0.1) + # return def selectConsumeResult(self,expectRows,cdbName='cdb'): resultList=[] @@ -233,7 +234,7 @@ class TDTestCase: self.startTmqSimProcess(buildPath,cfgPath,pollDelay,parameterDict["dbName"],showMsg, showRow) tdLog.info("wait the notify info of start consume") - self.getStartConsumeNotifyFromTmqsim() + tmqCom.getStartConsumeNotifyFromTmqsim() tdLog.info("pkill consume processor") if (platform.system().lower() == 'windows'): @@ -311,7 +312,7 @@ class TDTestCase: # time.sleep(6) tdLog.info("start to wait commit notify") - self.getStartCommitNotifyFromTmqsim() + tmqCom.getStartCommitNotifyFromTmqsim() tdLog.info("pkill consume processor") if (platform.system().lower() == 'windows'): diff --git a/tests/system-test/7-tmq/tmqCommon.py b/tests/system-test/7-tmq/tmqCommon.py index f63c70a4c6..44eef8bf24 100644 --- a/tests/system-test/7-tmq/tmqCommon.py +++ b/tests/system-test/7-tmq/tmqCommon.py @@ -145,31 +145,29 @@ class TMQCom: processID = subprocess.check_output(psCmd, shell=True).decode("utf-8") tdLog.debug("%s is stopped by kill -INT" % (processorName)) - def getStartConsumeNotifyFromTmqsim(self,cdbName='cdb',rows=1): + def getStartConsumeNotifyFromTmqsim(self,cdbName='cdb'): loopFlag = 1 while loopFlag: tdSql.query("select * from %s.notifyinfo"%cdbName) #tdLog.info("row: %d, %l64d, %l64d"%(tdSql.getData(0, 1),tdSql.getData(0, 2),tdSql.getData(0, 3)) actRows = tdSql.getRows() - if (actRows >= rows): - for i in range(actRows): - if tdSql.getData(i, 1) == 0: - loopFlag = 0 - break + for i in range(actRows): + if tdSql.getData(i, 1) == 0: + loopFlag = 0 + break time.sleep(0.02) return - def getStartCommitNotifyFromTmqsim(self,cdbName='cdb',rows=2): + def getStartCommitNotifyFromTmqsim(self,cdbName='cdb'): loopFlag = 1 while loopFlag: tdSql.query("select * from %s.notifyinfo"%cdbName) #tdLog.info("row: %d, %l64d, %l64d"%(tdSql.getData(0, 1),tdSql.getData(0, 2),tdSql.getData(0, 3)) actRows = tdSql.getRows() - if (actRows >= rows): - for i in range(actRows): - if tdSql.getData(i, 1) == 1: - loopFlag = 0 - break + for i in range(actRows): + if tdSql.getData(i, 1) == 1: + loopFlag = 0 + break time.sleep(0.02) return diff --git a/tests/system-test/7-tmq/tmqConsumerGroup.py b/tests/system-test/7-tmq/tmqConsumerGroup.py index f05f600f27..ae9671bcf4 100644 --- a/tests/system-test/7-tmq/tmqConsumerGroup.py +++ b/tests/system-test/7-tmq/tmqConsumerGroup.py @@ -100,7 +100,7 @@ class TDTestCase: tdLog.info("wait consumer commit notify") # tmqCom.getStartCommitNotifyFromTmqsim(rows=4) - tmqCom.getStartConsumeNotifyFromTmqsim(rows=2) + tmqCom.getStartConsumeNotifyFromTmqsim() tdLog.info("pkill one consume processor") tmqCom.stopTmqSimProcess('tmq_sim_new') diff --git a/tests/system-test/7-tmq/tmqDnodeRestart1.py b/tests/system-test/7-tmq/tmqDnodeRestart1.py index cff55a1239..2bde32800b 100644 --- a/tests/system-test/7-tmq/tmqDnodeRestart1.py +++ b/tests/system-test/7-tmq/tmqDnodeRestart1.py @@ -121,7 +121,7 @@ class TDTestCase: tmqCom.startTmqSimProcess(pollDelay=paraDict['pollDelay'],dbName=paraDict["dbName"],showMsg=paraDict['showMsg'], showRow=paraDict['showRow'],snapshot=paraDict['snapshot']) # time.sleep(3) - tmqCom.getStartCommitNotifyFromTmqsim('cdb',1) + tmqCom.getStartCommitNotifyFromTmqsim() tdLog.info("create some new child table and insert data for latest mode") paraDict["batchNum"] = 100 @@ -205,7 +205,7 @@ class TDTestCase: tdLog.info("start consume processor") tmqCom.startTmqSimProcess(pollDelay=paraDict['pollDelay'],dbName=paraDict["dbName"],showMsg=paraDict['showMsg'], showRow=paraDict['showRow'],snapshot=paraDict['snapshot']) - tmqCom.getStartCommitNotifyFromTmqsim('cdb',1) + tmqCom.getStartCommitNotifyFromTmqsim() tdLog.info("create some new child table and insert data for latest mode") paraDict["batchNum"] = 10 From 76810b81660803112a4e6b20e42cb65fe3910e39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Chappyguoxy=E2=80=9D?= <“happy_guoxy@163.com”> Date: Mon, 24 Apr 2023 10:29:35 +0800 Subject: [PATCH 18/46] test: refine query cases --- .../system-test/1-insert/database_pre_suf.py | 264 +++++++++++++++--- 1 file changed, 229 insertions(+), 35 deletions(-) diff --git a/tests/system-test/1-insert/database_pre_suf.py b/tests/system-test/1-insert/database_pre_suf.py index a6ff95ab3f..2e993b9a40 100755 --- a/tests/system-test/1-insert/database_pre_suf.py +++ b/tests/system-test/1-insert/database_pre_suf.py @@ -24,9 +24,7 @@ from util.dnodes import tdDnodes from util.dnodes import * class TDTestCase: - updatecfgDict = {'maxSQLLength':1048576,'debugFlag': 143 ,"cDebugFlag":143,"uDebugFlag":143 ,"rpcDebugFlag":143 , "tmrDebugFlag":143 , - "jniDebugFlag":143 ,"simDebugFlag":143,"dDebugFlag":143, "dDebugFlag":143,"vDebugFlag":143,"mDebugFlag":143,"qDebugFlag":143, - "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"fnDebugFlag":143} + updatecfgDict = {'maxSQLLength':1048576,'debugFlag': 135} def init(self, conn, logSql, replicaVar=1): self.replicaVar = int(replicaVar) @@ -39,7 +37,9 @@ class TDTestCase: self.db = "pre_suf" - def dropandcreateDB_random(self,database,n,vgroups,table_prefix,table_suffix,check_result): + def dropandcreateDB_random(self,database,n,vgroups,table_prefix,table_suffix,check_result_positive,check_result_negative): + #check_result_positive 检查前缀后缀是正数的,check_result_negative 检查前缀后缀是负数的(TS-3249) + tdLog.info(f"create start:n:{n},vgroups:{vgroups},table_prefix:{table_prefix},table_suffix:{table_suffix},check_result_positive:{check_result_positive},check_result_negative:{check_result_negative}") ts = 1630000000000 num_random = 100 fake = Faker('zh_CN') @@ -56,6 +56,7 @@ class TDTestCase: q_int_null int , q_bigint_null bigint , q_smallint_null smallint , q_tinyint_null tinyint, q_float_null float , q_double_null double , q_bool_null bool , q_binary_null binary(20) , q_nchar_null nchar(20) , q_ts_null timestamp) \ tags(loc nchar(100) , t_int int , t_bigint bigint , t_smallint smallint , t_tinyint tinyint, t_bool bool , t_binary binary(100) , t_nchar nchar(100) ,t_float float , t_double double , t_ts timestamp);''') + #positive for i in range(10*n): tdSql.execute('''create table bj_%d (ts timestamp , q_int int , q_bigint bigint , q_smallint smallint , q_tinyint tinyint , q_float float , q_double double , q_bool bool , q_binary binary(100) , q_nchar nchar(100) , q_ts timestamp ) ;'''%i) tdSql.execute('''create table sh_%d (ts timestamp , q_int int , q_bigint bigint , q_smallint smallint , q_tinyint tinyint , q_float float , q_double double , q_bool bool , q_binary binary(100) , q_nchar nchar(100) , q_ts timestamp ) ;'''%i) @@ -106,11 +107,60 @@ class TDTestCase: fake.random_int(min=-32767, max=32767, step=1) , fake.random_int(min=-127, max=127, step=1) , fake.pystr() ,fake.pystr() ,fake.pyfloat(),fake.pyfloat(),fake.random_int(min=-2147483647, max=2147483647, step=1))) - + #negative + for i in range(10*n): + tdSql.execute('''create table bj_table_%d_r_negative (ts timestamp , q_int int , q_bigint bigint , q_smallint smallint , q_tinyint tinyint , q_float float , q_double double , q_bool bool , q_binary binary(100) , q_nchar nchar(100) , q_ts timestamp ) ;'''%i) + tdSql.execute('''create table sh_table_%d_r_negative (ts timestamp , q_int int , q_bigint bigint , q_smallint smallint , q_tinyint tinyint , q_float float , q_double double , q_bool bool , q_binary binary(100) , q_nchar nchar(100) , q_ts timestamp ) ;'''%i) + tdSql.execute('''create table hn_table_%d_r_negative \ + (ts timestamp , q_int int , q_bigint bigint , q_smallint smallint , q_tinyint tinyint , q_float float , q_double double , q_bool bool , q_binary binary(100) , q_nchar nchar(100) , q_ts timestamp , \ + q_binary1 binary(100) , q_nchar1 nchar(100) ,q_binary2 binary(100) , q_nchar2 nchar(100) ,q_binary3 binary(100) , q_nchar3 nchar(100) ,q_binary4 binary(100) , q_nchar4 nchar(100) ,\ + q_binary5 binary(100) , q_nchar5 nchar(100) ,q_binary6 binary(100) , q_nchar6 nchar(100) ,q_binary7 binary(100) , q_nchar7 nchar(100) ,q_binary8 binary(100) , q_nchar8 nchar(100) ,\ + q_int_null int , q_bigint_null bigint , q_smallint_null smallint , q_tinyint_null tinyint, q_float_null float , q_double_null double , q_bool_null bool , q_binary_null binary(20) , q_nchar_null nchar(20) , q_ts_null timestamp) ;'''%i) + + tdSql.execute('''create table bj_stable_1_%d_negative using stable_1 tags('bj_stable_1_%d', '%d' , '%d', '%d' , '%d' , 1 , 'binary1.%s' , 'nchar1.%s' , '%f', '%f' ,'%d') ;''' + %(i,i,fake.random_int(min=-2147483647, max=2147483647, step=1), fake.random_int(min=-9223372036854775807, max=9223372036854775807, step=1), + fake.random_int(min=-32767, max=32767, step=1) , fake.random_int(min=-127, max=127, step=1) , + fake.pystr() ,fake.pystr() ,fake.pyfloat(),fake.pyfloat(),fake.random_int(min=-2147483647, max=2147483647, step=1))) + tdSql.execute('''create table sh_table_%d_a_negative using stable_1 tags('sh_a_table_1_%d', '%d' , '%d', '%d' , '%d' , 1 , 'binary1.%s' , 'nchar1.%s' , '%f', '%f' ,'%d') ;''' + %(i,i,fake.random_int(min=-2147483647, max=2147483647, step=1), fake.random_int(min=-9223372036854775807, max=9223372036854775807, step=1), + fake.random_int(min=-32767, max=32767, step=1) , fake.random_int(min=-127, max=127, step=1) , + fake.pystr() ,fake.pystr() ,fake.pyfloat(),fake.pyfloat(),fake.random_int(min=-2147483647, max=2147483647, step=1))) + tdSql.execute('''create table sh_table_%d_b_negative using stable_1 tags('sh_b_table_1_%d', '%d' , '%d', '%d' , '%d' , 1 , 'binary1.%s' , 'nchar1.%s' , '%f', '%f' ,'%d') ;''' + %(i,i,fake.random_int(min=-2147483647, max=2147483647, step=1), fake.random_int(min=-9223372036854775807, max=9223372036854775807, step=1), + fake.random_int(min=-32767, max=32767, step=1) , fake.random_int(min=-127, max=127, step=1) , + fake.pystr() ,fake.pystr() ,fake.pyfloat(),fake.pyfloat(),fake.random_int(min=-2147483647, max=2147483647, step=1))) + tdSql.execute('''create table sh_table_%d_c_negative using stable_1 tags('sh_c_table_1_%d', '%d' , '%d', '%d' , '%d' , 1 , 'binary1.%s' , 'nchar1.%s' , '%f', '%f' ,'%d') ;''' + %(i,i,fake.random_int(min=-2147483647, max=2147483647, step=1), fake.random_int(min=-9223372036854775807, max=9223372036854775807, step=1), + fake.random_int(min=-32767, max=32767, step=1) , fake.random_int(min=-127, max=127, step=1) , + fake.pystr() ,fake.pystr() ,fake.pyfloat(),fake.pyfloat(),fake.random_int(min=-2147483647, max=2147483647, step=1))) + + tdSql.execute('''create table bj_table_%d_a_negative using stable_1 tags('bj_a_table_1_%d', '%d' , '%d', '%d' , '%d' , 1 , 'binary1.%s' , 'nchar1.%s' , '%f', '%f' ,'%d') ;''' + %(i,i,fake.random_int(min=-2147483647, max=2147483647, step=1), fake.random_int(min=-9223372036854775807, max=9223372036854775807, step=1), + fake.random_int(min=-32767, max=32767, step=1) , fake.random_int(min=-127, max=127, step=1) , + fake.pystr() ,fake.pystr() ,fake.pyfloat(),fake.pyfloat(),fake.random_int(min=-2147483647, max=2147483647, step=1))) + tdSql.execute('''create table bj_table_%d_b_negative using stable_1 tags('bj_b_table_1_%d', '%d' , '%d', '%d' , '%d' , 1 , 'binary1.%s' , 'nchar1.%s' , '%f', '%f' ,'%d') ;''' + %(i,i,fake.random_int(min=-2147483647, max=2147483647, step=1), fake.random_int(min=-9223372036854775807, max=9223372036854775807, step=1), + fake.random_int(min=-32767, max=32767, step=1) , fake.random_int(min=-127, max=127, step=1) , + fake.pystr() ,fake.pystr() ,fake.pyfloat(),fake.pyfloat(),fake.random_int(min=-2147483647, max=2147483647, step=1))) + tdSql.execute('''create table bj_table_%d_c_negative using stable_1 tags('bj_c_table_1_%d', '%d' , '%d', '%d' , '%d' , 1 , 'binary1.%s' , 'nchar1.%s' , '%f', '%f' ,'%d') ;''' + %(i,i,fake.random_int(min=-2147483647, max=2147483647, step=1), fake.random_int(min=-9223372036854775807, max=9223372036854775807, step=1), + fake.random_int(min=-32767, max=32767, step=1) , fake.random_int(min=-127, max=127, step=1) , + fake.pystr() ,fake.pystr() ,fake.pyfloat(),fake.pyfloat(),fake.random_int(min=-2147483647, max=2147483647, step=1))) + + + tdSql.execute('''create table tj_table_%d_a_negative using stable_2 tags('tj_a_table_2_%d', '%d' , '%d', '%d' , '%d' , 1 , 'binary1.%s' , 'nchar1.%s' , '%f', '%f' ,'%d') ;''' + %(i,i,fake.random_int(min=-2147483647, max=2147483647, step=1), fake.random_int(min=-9223372036854775807, max=9223372036854775807, step=1), + fake.random_int(min=-32767, max=32767, step=1) , fake.random_int(min=-127, max=127, step=1) , + fake.pystr() ,fake.pystr() ,fake.pyfloat(),fake.pyfloat(),fake.random_int(min=-2147483647, max=2147483647, step=1))) + tdSql.execute('''create table tj_table_%d_b_negative using stable_2 tags('tj_b_table_2_%d', '%d' , '%d', '%d' , '%d' , 1 , 'binary1.%s' , 'nchar1.%s' , '%f', '%f' ,'%d') ;''' + %(i,i,fake.random_int(min=-2147483647, max=2147483647, step=1), fake.random_int(min=-9223372036854775807, max=9223372036854775807, step=1), + fake.random_int(min=-32767, max=32767, step=1) , fake.random_int(min=-127, max=127, step=1) , + fake.pystr() ,fake.pystr() ,fake.pyfloat(),fake.pyfloat(),fake.random_int(min=-2147483647, max=2147483647, step=1))) + # create stream tdSql.execute('''create stream current_stream trigger at_once IGNORE EXPIRED 0 into stream_max_stable_1 as select _wstart as startts, _wend as wend, max(q_int) as max_int, min(q_bigint) as min_int from stable_1 where ts is not null interval (5s);''') - # insert data + # insert data positive for i in range(num_random*n): tdSql.execute('''insert into bj_stable_1_1 (ts , q_int , q_bigint , q_smallint , q_tinyint , q_float , q_double , q_bool , q_binary , q_nchar, q_ts,\ q_binary1 , q_nchar1 , q_binary2 , q_nchar2 , q_binary3 , q_nchar3 , q_binary4 , q_nchar4 , q_binary5 , q_nchar5 , q_binary6 , q_nchar6 , q_binary7 , q_nchar7, q_binary8 , q_nchar8) \ @@ -180,8 +230,60 @@ class TDTestCase: fake.pyfloat() , fake.pyfloat() , fake.pystr() , fake.pystr() , ts + i, fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr())) + # insert data negative + for i in range(num_random*n): + tdSql.execute('''insert into bj_stable_1_1_negative (ts , q_int , q_bigint , q_smallint , q_tinyint , q_float , q_double , q_bool , q_binary , q_nchar, q_ts,\ + q_binary1 , q_nchar1 , q_binary2 , q_nchar2 , q_binary3 , q_nchar3 , q_binary4 , q_nchar4 , q_binary5 , q_nchar5 , q_binary6 , q_nchar6 , q_binary7 , q_nchar7, q_binary8 , q_nchar8) \ + values(%d, %d, %d, %d, %d, %f, %f, 0, 'binary.%s', 'nchar.%s', %d, 'binary1.%s', 'nchar1.%s', 'binary2.%s', 'nchar2.%s', 'binary3.%s', 'nchar3.%s', \ + 'binary4.%s', 'nchar4.%s', 'binary5.%s', 'nchar5.%s', 'binary6.%s', 'nchar6.%s', 'binary7.%s', 'nchar7.%s', 'binary8.%s', 'nchar8.%s') ;''' + % (ts + i*1000, fake.random_int(min=-2147483647, max=2147483647, step=1), + fake.random_int(min=-9223372036854775807, max=9223372036854775807, step=1), + fake.random_int(min=-32767, max=32767, step=1) , fake.random_int(min=-127, max=127, step=1) , + fake.pyfloat() , fake.pyfloat() , fake.pystr() , fake.pystr() , ts + i , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , + fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr())) + + tdSql.execute('''insert into bj_stable_1_2_negative (ts , q_int , q_bigint , q_smallint , q_tinyint , q_float , q_double, q_bool , q_binary , q_nchar, q_ts,\ + q_binary1 , q_nchar1 , q_binary2 , q_nchar2 , q_binary3 , q_nchar3 , q_binary4 , q_nchar4 , q_binary5 , q_nchar5 , q_binary6 , q_nchar6 , q_binary7 , q_nchar7, q_binary8 , q_nchar8)\ + values(%d, %d, %d, %d, %d, %f, %f, 1, 'binary.%s', 'nchar.%s', %d, 'binary1.%s', 'nchar1.%s', 'binary2.%s', 'nchar2.%s', 'binary3.%s', 'nchar3.%s', \ + 'binary4.%s', 'nchar4.%s', 'binary5.%s', 'nchar5.%s', 'binary6.%s', 'nchar6.%s', 'binary7.%s', 'nchar7.%s', 'binary8.%s', 'nchar8.%s') ;''' + % (ts + i*1000, fake.random_int(min=0, max=2147483647, step=1), + fake.random_int(min=0, max=9223372036854775807, step=1), + fake.random_int(min=0, max=32767, step=1) , fake.random_int(min=0, max=127, step=1) , + fake.pyfloat() , fake.pyfloat() , fake.pystr() , fake.pystr() , ts + i, fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , + fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr())) + + tdSql.execute('''insert into bj_stable_1_3_negative (ts , q_int , q_bigint , q_smallint , q_tinyint , q_float , q_double, q_bool , q_binary , q_nchar, q_ts,\ + q_binary1 , q_nchar1 , q_binary2 , q_nchar2 , q_binary3 , q_nchar3 , q_binary4 , q_nchar4 , q_binary5 , q_nchar5 , q_binary6 , q_nchar6 , q_binary7 , q_nchar7, q_binary8 , q_nchar8) \ + values(%d, %d, %d, %d, %d, %f, %f, 0, 'binary.%s', 'nchar.%s', %d, 'binary1.%s', 'nchar1.%s', 'binary2.%s', 'nchar2.%s', 'binary3.%s', 'nchar3.%s', \ + 'binary4.%s', 'nchar4.%s', 'binary5.%s', 'nchar5.%s', 'binary6.%s', 'nchar6.%s', 'binary7.%s', 'nchar7.%s', 'binary8.%s', 'nchar8.%s') ;''' + % (ts + i*1000, fake.random_int(min=-0, max=2147483647, step=1), + fake.random_int(min=-0, max=9223372036854775807, step=1), + fake.random_int(min=-0, max=32767, step=1) , fake.random_int(min=-0, max=127, step=1) , + fake.pyfloat() , fake.pyfloat() , fake.pystr() , fake.pystr() , ts + i, fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , + fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr())) + + tdSql.execute('''insert into bj_stable_1_4_negative (ts , q_int , q_bigint , q_smallint , q_tinyint , q_float , q_double, q_bool , q_binary , q_nchar, q_ts,\ + q_binary1 , q_nchar1 , q_binary2 , q_nchar2 , q_binary3 , q_nchar3 , q_binary4 , q_nchar4 , q_binary5 , q_nchar5 , q_binary6 , q_nchar6 , q_binary7 , q_nchar7, q_binary8 , q_nchar8) \ + values(%d, %d, %d, %d, %d, %f, %f, 0, 'binary.%s', 'nchar.%s', %d, 'binary1.%s', 'nchar1.%s', 'binary2.%s', 'nchar2.%s', 'binary3.%s', 'nchar3.%s', \ + 'binary4.%s', 'nchar4.%s', 'binary5.%s', 'nchar5.%s', 'binary6.%s', 'nchar6.%s', 'binary7.%s', 'nchar7.%s', 'binary8.%s', 'nchar8.%s') ;''' + % (ts + i*1000 +1, fake.random_int(min=-0, max=2147483647, step=1), + fake.random_int(min=-0, max=9223372036854775807, step=1), + fake.random_int(min=-0, max=32767, step=1) , fake.random_int(min=-0, max=127, step=1) , + fake.pyfloat() , fake.pyfloat() , fake.pystr() , fake.pystr() , ts + i, fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , + fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr())) + + tdSql.execute('''insert into bj_stable_1_5_negative (ts , q_int , q_bigint , q_smallint , q_tinyint , q_float , q_double, q_bool , q_binary , q_nchar, q_ts,\ + q_binary1 , q_nchar1 , q_binary2 , q_nchar2 , q_binary3 , q_nchar3 , q_binary4 , q_nchar4 , q_binary5 , q_nchar5 , q_binary6 , q_nchar6 , q_binary7 , q_nchar7, q_binary8 , q_nchar8) \ + values(%d, %d, %d, %d, %d, %f, %f, 0, 'binary.%s', 'nchar.%s', %d, 'binary1.%s', 'nchar1.%s', 'binary2.%s', 'nchar2.%s', 'binary3.%s', 'nchar3.%s', \ + 'binary4.%s', 'nchar4.%s', 'binary5.%s', 'nchar5.%s', 'binary6.%s', 'nchar6.%s', 'binary7.%s', 'nchar7.%s', 'binary8.%s', 'nchar8.%s') ;''' + % (ts + i*1000 +10, fake.random_int(min=-0, max=2147483647, step=1), + fake.random_int(min=-0, max=9223372036854775807, step=1), + fake.random_int(min=-0, max=32767, step=1) , fake.random_int(min=-0, max=127, step=1) , + fake.pyfloat() , fake.pyfloat() , fake.pystr() , fake.pystr() , ts + i, fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , + fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr() , fake.pystr())) + tdSql.query("select count(*) from stable_1;") - tdSql.checkData(0,0,5*num_random*n) + tdSql.checkData(0,0,10*num_random*n) tdSql.query("select count(*) from hn_table_1_r;") tdSql.checkData(0,0,num_random*n) @@ -220,39 +322,28 @@ class TDTestCase: tdSql.query(" select * from information_schema.ins_databases where name = '%s';" %database) - print(tdSql.queryResult) + tdLog.info(tdSql.queryResult) - # tdSql.query(" select table_prefix,table_suffix from information_schema.ins_databases where name = '%s';" %database) - # print(tdSql.queryResult) - #TD-19082 - - #tdSql.query(" select * from information_schema.ins_tables where db_name = '%s';" %database) - #print(tdSql.queryResult) - - tdSql.query(" select table_name,vgroup_id from information_schema.ins_tables where db_name = '%s';" %database) + tdSql.query(" select table_name,vgroup_id from information_schema.ins_tables where db_name = '%s' limit 3;" %database) queryRows = len(tdSql.queryResult) for i in range(queryRows): - print("row=%d, vgroup_id=%s, tbname=%s " %(i,tdSql.queryResult[i][1],tdSql.queryResult[i][0])) + tdLog.info("row=%d, vgroup_id=%s, tbname=%s " %(i,tdSql.queryResult[i][1],tdSql.queryResult[i][0])) tdLog.info("\n=============flush database ====================\n") tdSql.execute(" flush database %s;" %database) tdSql.query(" select * from information_schema.ins_databases where name = '%s';" %database) - print(tdSql.queryResult) - - # tdSql.query(" select table_prefix,table_suffix from information_schema.ins_databases where name = '%s';" %database) - # print(tdSql.queryResult) - #TD-19082 - - tdSql.query(" select table_name,vgroup_id from information_schema.ins_tables where db_name = '%s';" %database) + tdLog.info(tdSql.queryResult) + + tdSql.query(" select table_name,vgroup_id from information_schema.ins_tables where db_name = '%s' limit 3;" %database) queryRows = len(tdSql.queryResult) for i in range(queryRows): - print("row=%d, vgroup_id=%s, tbname=%s " %(i,tdSql.queryResult[i][1],tdSql.queryResult[i][0])) + tdLog.info("row=%d, vgroup_id=%s, tbname=%s " %(i,tdSql.queryResult[i][1],tdSql.queryResult[i][0])) # check in one vgroup - if check_result == 'Y': + if check_result_positive == 'Y': #base table : sh_table_0_a tdSql.query(" select table_name,vgroup_id from information_schema.ins_tables where db_name = '%s' and table_name='sh_table_0_a';" %(database)) base_value_table_name = tdSql.queryResult[0][0] @@ -324,8 +415,100 @@ class TDTestCase: tdSql.query(" select table_name,vgroup_id from information_schema.ins_tables where db_name = '%s' and table_name='tj_table_%d_b';" %(database,i)) self.value_check(base_value_table_name,base_value_table_vgroup) + elif check_result_negative == 'Y': + #base table : sh_table_0_a + tdSql.query(" select table_name,vgroup_id from information_schema.ins_tables where db_name = '%s' and table_name='sh_table_0_a_negative';" %(database)) + base_value_table_name = tdSql.queryResult[0][0] + base_value_table_vgroup = tdSql.queryResult[0][1] + + #check table :sh_table_i_a + check_rows = tdSql.query(" select table_name,vgroup_id from information_schema.ins_tables where db_name = '%s' and table_name like 'sh_table_%%_a_negative';" %(database)) + for i in range(check_rows): + tdSql.query(" select table_name,vgroup_id from information_schema.ins_tables where db_name = '%s' and table_name='sh_table_%d_a_negative';" %(database,i)) + self.value_check(base_value_table_name,base_value_table_vgroup) + + #check table :sh_table_i_b + check_rows = tdSql.query(" select table_name,vgroup_id from information_schema.ins_tables where db_name = '%s' and table_name like 'sh_table_%%_b_negative';" %(database)) + for i in range(check_rows): + tdSql.query(" select table_name,vgroup_id from information_schema.ins_tables where db_name = '%s' and table_name='sh_table_%d_b_negative';" %(database,i)) + self.value_check(base_value_table_name,base_value_table_vgroup) + + #check table :sh_table_i_c + check_rows = tdSql.query(" select table_name,vgroup_id from information_schema.ins_tables where db_name = '%s' and table_name like 'sh_table_%%_c_negative';" %(database)) + for i in range(check_rows): + tdSql.query(" select table_name,vgroup_id from information_schema.ins_tables where db_name = '%s' and table_name='sh_table_%d_c_negative';" %(database,i)) + self.value_check(base_value_table_name,base_value_table_vgroup) + + #check table :sh_table_i_r + check_rows = tdSql.query(" select table_name,vgroup_id from information_schema.ins_tables where db_name = '%s' and table_name like 'sh_table_%%_r_negative';" %(database)) + for i in range(check_rows): + tdSql.query(" select table_name,vgroup_id from information_schema.ins_tables where db_name = '%s' and table_name='sh_table_%d_r_negative';" %(database,i)) + self.value_check(base_value_table_name,base_value_table_vgroup) + + #base table : bj_table_0_a + tdSql.query(" select table_name,vgroup_id from information_schema.ins_tables where db_name = '%s' and table_name='bj_table_0_a_negative';" %(database)) + base_value_table_name = tdSql.queryResult[0][0] + base_value_table_vgroup = tdSql.queryResult[0][1] + + #check table :bj_table_i_a + check_rows = tdSql.query(" select table_name,vgroup_id from information_schema.ins_tables where db_name = '%s' and table_name like 'bj_table_%%_a_negative';" %(database)) + for i in range(check_rows): + tdSql.query(" select table_name,vgroup_id from information_schema.ins_tables where db_name = '%s' and table_name='bj_table_%d_a_negative';" %(database,i)) + self.value_check(base_value_table_name,base_value_table_vgroup) + + #check table :bj_table_i_b + check_rows = tdSql.query(" select table_name,vgroup_id from information_schema.ins_tables where db_name = '%s' and table_name like 'bj_table_%%_b_negative';" %(database)) + for i in range(check_rows): + tdSql.query(" select table_name,vgroup_id from information_schema.ins_tables where db_name = '%s' and table_name='bj_table_%d_b_negative';" %(database,i)) + self.value_check(base_value_table_name,base_value_table_vgroup) + + #check table :bj_table_i_c + check_rows = tdSql.query(" select table_name,vgroup_id from information_schema.ins_tables where db_name = '%s' and table_name like 'bj_table_%%_c_negative';" %(database)) + for i in range(check_rows): + tdSql.query(" select table_name,vgroup_id from information_schema.ins_tables where db_name = '%s' and table_name='bj_table_%d_c_negative';" %(database,i)) + self.value_check(base_value_table_name,base_value_table_vgroup) + + #check table :bj_table_i_r + check_rows = tdSql.query(" select table_name,vgroup_id from information_schema.ins_tables where db_name = '%s' and table_name like 'bj_table_%%_r_negative';" %(database)) + for i in range(check_rows): + tdSql.query(" select table_name,vgroup_id from information_schema.ins_tables where db_name = '%s' and table_name='bj_table_%d_r_negative';" %(database,i)) + self.value_check(base_value_table_name,base_value_table_vgroup) + + #base table : hn_table_0_r + tdSql.query(" select table_name,vgroup_id from information_schema.ins_tables where db_name = '%s' and table_name='hn_table_0_r_negative';" %(database)) + base_value_table_name = tdSql.queryResult[0][0] + base_value_table_vgroup = tdSql.queryResult[0][1] + + #check table :hn_table_i_r + check_rows = tdSql.query(" select table_name,vgroup_id from information_schema.ins_tables where db_name = '%s' and table_name like 'hn_table_%%_r_negative';" %(database)) + for i in range(check_rows): + tdSql.query(" select table_name,vgroup_id from information_schema.ins_tables where db_name = '%s' and table_name='hn_table_%d_r_negative';" %(database,i)) + self.value_check(base_value_table_name,base_value_table_vgroup) + + + #base table : tj_table_0_r + tdSql.query(" select table_name,vgroup_id from information_schema.ins_tables where db_name = '%s' and table_name='tj_table_0_a_negative';" %(database)) + base_value_table_name = tdSql.queryResult[0][0] + base_value_table_vgroup = tdSql.queryResult[0][1] + + #check table :tj_table_i_a + check_rows = tdSql.query(" select table_name,vgroup_id from information_schema.ins_tables where db_name = '%s' and table_name like 'tj_table_%%_a_negative';" %(database)) + for i in range(check_rows): + tdSql.query(" select table_name,vgroup_id from information_schema.ins_tables where db_name = '%s' and table_name='tj_table_%d_a_negative';" %(database,i)) + self.value_check(base_value_table_name,base_value_table_vgroup) + + #check table :tj_table_i_b + check_rows = tdSql.query(" select table_name,vgroup_id from information_schema.ins_tables where db_name = '%s' and table_name like 'tj_table_%%_b_negative';" %(database)) + for i in range(check_rows): + tdSql.query(" select table_name,vgroup_id from information_schema.ins_tables where db_name = '%s' and table_name='tj_table_%d_b_negative';" %(database,i)) + self.value_check(base_value_table_name,base_value_table_vgroup) + + else: pass + + tdLog.info(f"create end:n:{n},vgroups:{vgroups},table_prefix:{table_prefix},table_suffix:{table_suffix},check_result_positive:{check_result_positive},check_result_negative:{check_result_negative}") + def value_check(self,base_value_table_name,base_value_table_vgroup): check_value_table_name = tdSql.queryResult[0][0] @@ -348,17 +531,28 @@ class TDTestCase: os.system("rm -rf %s/%s.sql" % (self.testcasePath,self.testcaseFilename)) - #(self,database,n,vgroups,table_prefix,table_suffix) - self.dropandcreateDB_random("%s" %self.db, 1,2,0,0,'N') - self.dropandcreateDB_random("%s" %self.db, 1,2,0,2,'N') - self.dropandcreateDB_random("%s" %self.db, 1,2,2,0,'N') - self.dropandcreateDB_random("%s" %self.db, 1,2,3,3,'Y') - self.dropandcreateDB_random("%s" %self.db, 1,3,3,3,'Y') - self.dropandcreateDB_random("%s" %self.db, 1,4,4,4,'Y') - self.dropandcreateDB_random("%s" %self.db, 1,5,5,5,'Y') + #(self,database,n,vgroups,table_prefix,table_suffix,check_result_positive,check_result_negative): + #check_result_positive 检查前缀后缀是正数的,check_result_negative 检查前缀后缀是负数的(TS-3249) + # self.dropandcreateDB_random("%s" %self.db, 1,2,0,0,'N','N') + # self.dropandcreateDB_random("%s" %self.db, 1,2,0,2,'N','N') + # self.dropandcreateDB_random("%s" %self.db, 1,2,2,0,'N','N') + + self.dropandcreateDB_random("%s" %self.db, 1,random.randint(1,5),random.randint(0,3),random.randint(0,3),'N','N') + self.dropandcreateDB_random("%s" %self.db, 1,random.randint(1,5),random.randint(-10,0),random.randint(-10,0),'N','N') + self.dropandcreateDB_random("%s" %self.db, 1,random.randint(1,5),random.randint(-191,0),random.randint(-191,0),'N','N') + self.dropandcreateDB_random("%s" %self.db, 1,random.randint(1,5),random.randint(0,100),random.randint(0,91),'N','N') + + # self.dropandcreateDB_random("%s" %self.db, 1,2,3,3,'Y','N') + # self.dropandcreateDB_random("%s" %self.db, 1,3,3,3,'Y','N') + # self.dropandcreateDB_random("%s" %self.db, 1,4,4,4,'Y','N') + # self.dropandcreateDB_random("%s" %self.db, 1,5,5,5,'Y','N') + self.dropandcreateDB_random("%s" %self.db, 1,random.randint(1,5),random.randint(3,5),random.randint(3,5),'Y','N') + + self.dropandcreateDB_random("%s" %self.db, 1,random.randint(1,5),random.randint(-5,-1),0,'N','Y') + self.dropandcreateDB_random("%s" %self.db, 1,random.randint(1,5),random.randint(-5,-1),random.randint(-9,-0),'N','Y') - #taos -f sql + # #taos -f sql print("taos -f sql start!") taos_cmd1 = "taos -f %s/%s.sql" % (self.testcasePath,self.testcaseFilename) _ = subprocess.check_output(taos_cmd1, shell=True) From 79605289932b6062f8ae8004b41331b38642e93e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Chappyguoxy=E2=80=9D?= <“happy_guoxy@163.com”> Date: Mon, 24 Apr 2023 10:29:47 +0800 Subject: [PATCH 19/46] test: refine query cases --- tests/system-test/2-query/slimit.py | 1821 +++++++++++++++++++++++++++ 1 file changed, 1821 insertions(+) create mode 100644 tests/system-test/2-query/slimit.py diff --git a/tests/system-test/2-query/slimit.py b/tests/system-test/2-query/slimit.py new file mode 100644 index 0000000000..48209da59a --- /dev/null +++ b/tests/system-test/2-query/slimit.py @@ -0,0 +1,1821 @@ +################################################################### +# Copyright (c) 2016 by TAOS Technologies, Inc. +# All rights reserved. +# +# This file is proprietary and confidential to TAOS Technologies. +# No part of this file may be reproduced, stored, transmitted, +# disclosed or used in any form or by any means other than as +# expressly provided by the written permission from Jianhui Tao +# +################################################################### + +# -*- coding: utf-8 -*- + +import sys +import os +import random +import re + +from util.log import * +from util.cases import * +from util.sql import * +from util.dnodes import * + + +class TDTestCase: + def init(self, conn, logSql, replicaVar): + tdLog.debug("start to execute %s" % __file__) + tdSql.init(conn.cursor(), logSql) + + self.testcasePath = os.path.split(__file__)[0] + self.testcaseFilename = os.path.split(__file__)[-1] + os.system("rm -rf %s/%s.sql" % (self.testcasePath,self.testcaseFilename)) + + def getBuildPath(self): + selfPath = os.path.dirname(os.path.realpath(__file__)) + + if ("community" in selfPath): + projPath = selfPath[:selfPath.find("community")] + else: + projPath = selfPath[:selfPath.find("tests")] + + for root, dirs, files in os.walk(projPath): + if ("taosd" in files): + rootRealPath = os.path.dirname(os.path.realpath(root)) + if ("packaging" not in rootRealPath): + buildPath = root[:len(root)-len("/build/bin")] + break + return buildPath + + def run_benchmark(self,dbname,tables,per_table_num,vgroups,replica): + buildPath = self.getBuildPath() + if (buildPath == ""): + tdLog.exit("taosd not found!") + else: + tdLog.info("taosd found in %s" % buildPath) + binPath = buildPath+ "/build/bin/" + + print("%staosBenchmark -d %s -t %d -n %d -v %d -a %d -y " % (binPath,dbname,tables,per_table_num,vgroups,replica)) + os.system("%staosBenchmark -d %s -t %d -n %d -v %d -a %d -y " % (binPath,dbname,tables,per_table_num,vgroups,replica)) + + def sql_query_time_cost(self,sql): + startTime = time.time() + tdSql.query(sql) + endTime = time.time() + tdLog.info("sql:%s query time cost (%d)s" % (sql,endTime - startTime)) + + def sql_limit_retun_n_slimit_return_error(self,sql,num,tables,per_table_num,base_fun,replace_fun): + #sql limit n = n;sql limit 0 = 0 ;sql slmit n = error;sql slimit 0 = error + sql = sql.replace('%s'%base_fun,'%s'%replace_fun) + + nest_sql =" select * from (%s) " %sql + self.sql_query_time_cost(sql) + tdSql.checkRows(num) + self.sql_query_time_cost(nest_sql) + tdSql.checkRows(num) + + sql_0 = re.sub(r'\d\d',"0",sql) # \d是匹配数字字符[0-9],+匹配一个或多个 + self.sql_query_time_cost(sql_0) + tdSql.checkRows(0) + + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) # \d是匹配数字字符[0-9],+匹配一个或多个 + self.sql_query_time_cost(nest_sql_0) + tdSql.checkRows(0) + + sql = sql.replace('limit','slimit') + tdSql.error(sql) + nest_sql = nest_sql.replace('limit','slimit') + tdSql.error(nest_sql) + + sql_0 = re.sub(r'\d\d',"0",sql) + tdSql.error(sql_0) + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) + tdSql.error(nest_sql_0) + + def sql_data_limit_retun_n_slimit_return_error(self,sql,num,tables,per_table_num,base_fun,replace_fun): + #sql limit n = n;sql limit 0 = 0 ;sql slmit n = error;sql slimit 0 = error + sql = sql.replace('%s'%base_fun,'%s'%replace_fun) + + nest_sql =" select * from (%s) " %sql + self.sql_query_time_cost(sql) + tdSql.checkData(0,0,num) + self.sql_query_time_cost(nest_sql) + tdSql.checkData(0,0,num) + + sql_0 = re.sub(r'\d\d',"0",sql) # \d是匹配数字字符[0-9],+匹配一个或多个 + self.sql_query_time_cost(sql_0) + tdSql.checkData(0,0,0) + + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) # \d是匹配数字字符[0-9],+匹配一个或多个 + self.sql_query_time_cost(nest_sql_0) + tdSql.checkData(0,0,0) + + sql = sql.replace('limit','slimit') + tdSql.error(sql) + nest_sql = nest_sql.replace('limit','slimit') + tdSql.error(nest_sql) + + sql_0 = re.sub(r'\d\d',"0",sql) + tdSql.error(sql_0) + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) + tdSql.error(nest_sql_0) + + + def sql_limit_retun_1_slimit_return_error(self,sql,tables,per_table_num,base_fun,replace_fun): + #sql limit n =1;sql limit 0 = 0 ;sql slmit n = error;sql slimit 0 = error + sql = sql.replace('%s'%base_fun,'%s'%replace_fun) + + nest_sql =" select * from (%s) " %sql + self.sql_query_time_cost(sql) + tdSql.checkRows(1) + self.sql_query_time_cost(nest_sql) + tdSql.checkRows(1) + + sql_0 = re.sub(r'\d+',"0",sql) + self.sql_query_time_cost(sql_0) + tdSql.checkRows(0) + + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) # \d是匹配数字字符[0-9],+匹配一个或多个 + self.sql_query_time_cost(nest_sql_0) + tdSql.checkRows(0) + + sql = sql.replace('limit','slimit') + tdSql.error(sql) + nest_sql = nest_sql.replace('limit','slimit') + tdSql.error(nest_sql) + + sql_0 = re.sub(r'\d+',"0",sql) + tdSql.error(sql_0) + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) + tdSql.error(nest_sql_0) + + def sql_data_limit_retun_1_slimit_return_error(self,sql,tables,per_table_num,base_fun,replace_fun): + #sql limit n =1;sql limit 0 = 0 ;sql slmit n = error;sql slimit 0 = error + sql = sql.replace('%s'%base_fun,'%s'%replace_fun) + + nest_sql =" select * from (%s) " %sql + self.sql_query_time_cost(sql) + tdSql.checkData(0,0,1) + self.sql_query_time_cost(nest_sql) + tdSql.checkData(0,0,1) + + sql_0 = re.sub(r'\d+',"0",sql) + self.sql_query_time_cost(sql_0) + tdSql.checkData(0,0,0) + + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) # \d是匹配数字字符[0-9],+匹配一个或多个 + self.sql_query_time_cost(nest_sql_0) + tdSql.checkData(0,0,0) + + sql = sql.replace('limit','slimit') + tdSql.error(sql) + nest_sql = nest_sql.replace('limit','slimit') + tdSql.error(nest_sql) + + sql_0 = re.sub(r'\d+',"0",sql) + tdSql.error(sql_0) + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) + tdSql.error(nest_sql_0) + + def sql_last_limit_retun_1_slimit_return_error(self,sql,tables,per_table_num,base_fun,replace_fun): + #sql limit n =1;sql limit 0 = 0 ;sql slmit n = error;sql slimit 0 = error + sql = sql.replace('%s'%base_fun,'%s'%replace_fun) + + nest_sql =" select * from (%s) " %sql + self.sql_query_time_cost(sql) + rows = tdSql.queryRows + if (rows >= 1 or rows <= 4): + tdLog.info("sql checkrows success") + else: + tdLog.exit(f"checkEqual error, sql_rows=={rows}") + + + self.sql_query_time_cost(nest_sql) + rows = tdSql.queryRows + if (rows >= 1 or rows <= 4): + tdLog.info("sql checkrows success") + else: + tdLog.exit(f"checkEqual error, sql_rows=={rows}") + + sql_0 = re.sub(r'\d+',"0",sql) + self.sql_query_time_cost(sql_0) + tdSql.checkRows(0) + + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) # \d是匹配数字字符[0-9],+匹配一个或多个 + self.sql_query_time_cost(nest_sql_0) + tdSql.checkRows(0) + + sql = sql.replace('limit','slimit') + tdSql.error(sql) + nest_sql = nest_sql.replace('limit','slimit') + tdSql.error(nest_sql) + + sql_0 = re.sub(r'\d+',"0",sql) + tdSql.error(sql_0) + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) + tdSql.error(nest_sql_0) + + def sql_limit_retun_tables_slimit_return_error(self,sql,num,tables,per_table_num,base_fun,replace_fun): + #sql limit n =n;sql limit 0 = 0 ;sql slmit n = error;sql slimit 0 = error + sql = sql.replace('%s'%base_fun,'%s'%replace_fun) + + nest_sql =" select * from (%s) " %sql + self.sql_query_time_cost(sql) + tdSql.checkRows(tables) + self.sql_query_time_cost(nest_sql) + tdSql.checkRows(tables) + + sql_0 = re.sub(r'\d\d',"0",sql) + self.sql_query_time_cost(sql_0) + tdSql.checkRows(0) + + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) # \d是匹配数字字符[0-9],+匹配一个或多个 + self.sql_query_time_cost(nest_sql_0) + tdSql.checkRows(0) + + sql = sql.replace('limit','slimit') + tdSql.error(sql) + nest_sql = nest_sql.replace('limit','slimit') + tdSql.error(nest_sql) + + sql_0 = re.sub(r'\d+',"0",sql) + tdSql.error(sql_0) + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) + tdSql.error(nest_sql_0) + + def sql_limit_retun_tables_slimit_return_n(self,sql,num,tables,per_table_num,base_fun,replace_fun): + #sql limit n =tables;sql limit 0 = 0 ;sql slmit n = n;sql slimit 0 = 0 + sql = sql.replace('%s'%base_fun,'%s'%replace_fun) + + nest_sql =" select * from (%s) " %sql + self.sql_query_time_cost(sql) + tdSql.checkRows(tables) + self.sql_query_time_cost(nest_sql) + tdSql.checkRows(tables) + + sql_0 = re.sub(r'\d\d',"0",sql) + self.sql_query_time_cost(sql_0) + tdSql.checkRows(0) + + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) # \d是匹配数字字符[0-9],+匹配一个或多个 + self.sql_query_time_cost(nest_sql_0) + tdSql.checkRows(0) + + sql = sql.replace('limit','slimit') + self.sql_query_time_cost(sql) + tdSql.checkRows(num) + nest_sql = nest_sql.replace('limit','slimit') + self.sql_query_time_cost(nest_sql) + tdSql.checkRows(num) + + sql_0 = re.sub(r'\d\d',"0",sql) + self.sql_query_time_cost(sql_0) + tdSql.checkRows(0) + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) + self.sql_query_time_cost(nest_sql_0) + tdSql.checkRows(0) + + def sql_data_limit_retun_tables_slimit_return_n(self,sql,num,tables,per_table_num,base_fun,replace_fun): + #sql limit n =tables;sql limit 0 = 0 ;sql slmit n = n;sql slimit 0 = 0 + sql = sql.replace('%s'%base_fun,'%s'%replace_fun) + + nest_sql =" select * from (%s) " %sql + self.sql_query_time_cost(sql) + tdSql.checkData(0,0,tables) + self.sql_query_time_cost(nest_sql) + tdSql.checkData(0,0,tables) + + sql_0 = re.sub(r'\d\d',"0",sql) + self.sql_query_time_cost(sql_0) + tdSql.checkData(0,0,0) + + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) # \d是匹配数字字符[0-9],+匹配一个或多个 + self.sql_query_time_cost(nest_sql_0) + tdSql.checkData(0,0,0) + + sql = sql.replace('limit','slimit') + self.sql_query_time_cost(sql) + tdSql.checkData(0,0,num) + nest_sql = nest_sql.replace('limit','slimit') + self.sql_query_time_cost(nest_sql) + tdSql.checkData(0,0,num) + + sql_0 = re.sub(r'\d\d',"0",sql) + self.sql_query_time_cost(sql_0) + tdSql.checkData(0,0,0) + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) + self.sql_query_time_cost(nest_sql_0) + tdSql.checkData(0,0,0) + + def sql_limit_retun_n_slimit_return_tables(self,sql,num,tables,per_table_num,base_fun,replace_fun): + #sql limit n =n;sql limit 0 = 0 ;sql slmit n = 100;sql slimit 0 = 0 + sql = sql.replace('%s'%base_fun,'%s'%replace_fun) + + nest_sql =" select * from (%s) " %sql + self.sql_query_time_cost(sql) + tdSql.checkRows(num) + self.sql_query_time_cost(nest_sql) + tdSql.checkRows(num) + + sql_0 = re.sub(r'\d\d',"0",sql) + self.sql_query_time_cost(sql_0) + tdSql.checkRows(0) + + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) # \d是匹配数字字符[0-9],+匹配一个或多个 + self.sql_query_time_cost(nest_sql_0) + tdSql.checkRows(0) + + sql = sql.replace('limit','slimit') + self.sql_query_time_cost(sql) + tdSql.checkRows(tables) + nest_sql = nest_sql.replace('limit','slimit') + self.sql_query_time_cost(nest_sql) + tdSql.checkRows(tables) + + sql_0 = re.sub(r'\d\d',"0",sql) + self.sql_query_time_cost(sql_0) + tdSql.checkRows(0) + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) + self.sql_query_time_cost(nest_sql_0) + tdSql.checkRows(0) + + def sql_data_limit_retun_n_slimit_return_tables(self,sql,num,tables,per_table_num,base_fun,replace_fun): + #sql limit n =n;sql limit 0 = 0 ;sql slmit n = 100;sql slimit 0 = 0 + sql = sql.replace('%s'%base_fun,'%s'%replace_fun) + + nest_sql =" select * from (%s) " %sql + self.sql_query_time_cost(sql) + tdSql.checkData(0,0,num) + self.sql_query_time_cost(nest_sql) + tdSql.checkData(0,0,num) + + sql_0 = re.sub(r'\d\d',"0",sql) + self.sql_query_time_cost(sql_0) + tdSql.checkData(0,0,0) + + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) # \d是匹配数字字符[0-9],+匹配一个或多个 + self.sql_query_time_cost(nest_sql_0) + tdSql.checkData(0,0,0) + + sql = sql.replace('limit','slimit') + self.sql_query_time_cost(sql) + tdSql.checkData(0,0,tables) + nest_sql = nest_sql.replace('limit','slimit') + self.sql_query_time_cost(nest_sql) + tdSql.checkData(0,0,tables) + + sql_0 = re.sub(r'\d\d',"0",sql) + self.sql_query_time_cost(sql_0) + tdSql.checkData(0,0,0) + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) + self.sql_query_time_cost(nest_sql_0) + tdSql.checkData(0,0,0) + + def sql_limit_retun_tables_times_n_slimit_return_error(self,sql,num,tables,per_table_num,base_fun,replace_fun): + #sql limit n =n*tables;sql limit 0 = 0 ;sql slmit n = tables*n;sql slimit 0 = 0 + #interval + sql = sql.replace('%s'%base_fun,'%s'%replace_fun) + + nest_sql =" select * from (%s) " %sql + self.sql_query_time_cost(sql) + tdSql.checkRows(num*tables) + self.sql_query_time_cost(nest_sql) + tdSql.checkRows(num*tables) + + sql_0 = re.sub(r'\d\d',"0",sql) + self.sql_query_time_cost(sql_0) + tdSql.checkRows(0) + + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) # \d是匹配数字字符[0-9],+匹配一个或多个 + self.sql_query_time_cost(nest_sql_0) + tdSql.checkRows(0) + + sql = sql.replace('limit','slimit') + tdSql.error(sql) + nest_sql = nest_sql.replace('limit','slimit') + tdSql.error(nest_sql) + + sql_0 = re.sub(r'\d\d',"0",sql) + tdSql.error(sql_0) + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) + tdSql.error(nest_sql_0) + + def sql_limit_retun_tables_times_n_slimit_return_per_table_num_times_n(self,sql,num,tables,per_table_num,base_fun,replace_fun): + #sql limit n =n*tables;sql limit 0 = 0 ;sql slmit n = per_table_num*n;sql slimit 0 = 0 + #interval + sql = sql.replace('%s'%base_fun,'%s'%replace_fun) + + nest_sql =" select * from (%s) " %sql + self.sql_query_time_cost(sql) + tdSql.checkRows(num*tables) + self.sql_query_time_cost(nest_sql) + tdSql.checkRows(num*tables) + + sql_0 = re.sub(r'\d\d',"0",sql) + self.sql_query_time_cost(sql_0) + tdSql.checkRows(0) + + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) # \d是匹配数字字符[0-9],+匹配一个或多个 + self.sql_query_time_cost(nest_sql_0) + tdSql.checkRows(0) + + sql = sql.replace('limit','slimit') + self.sql_query_time_cost(sql) + tdSql.checkRows(num*per_table_num) + nest_sql = nest_sql.replace('limit','slimit') + self.sql_query_time_cost(nest_sql) + tdSql.checkRows(num*per_table_num) + + sql_0 = re.sub(r'\d\d',"0",sql) + self.sql_query_time_cost(sql_0) + tdSql.checkRows(0) + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) + self.sql_query_time_cost(nest_sql_0) + tdSql.checkRows(0) + + def sql_data_limit_retun_tables_times_n_slimit_return_per_table_num_times_n(self,sql,num,tables,per_table_num,base_fun,replace_fun): + #sql limit n =n*tables;sql limit 0 = 0 ;sql slmit n = per_table_num*n;sql slimit 0 = 0 + #interval + sql = sql.replace('%s'%base_fun,'%s'%replace_fun) + + nest_sql =" select * from (%s) " %sql + self.sql_query_time_cost(sql) + tdSql.checkData(0,0,num*tables) + self.sql_query_time_cost(nest_sql) + tdSql.checkData(0,0,num*tables) + + sql_0 = re.sub(r'\d\d',"0",sql) + self.sql_query_time_cost(sql_0) + tdSql.checkData(0,0,0) + + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) # \d是匹配数字字符[0-9],+匹配一个或多个 + self.sql_query_time_cost(nest_sql_0) + tdSql.checkData(0,0,0) + + sql = sql.replace('limit','slimit') + self.sql_query_time_cost(sql) + tdSql.checkData(0,0,num*per_table_num) + nest_sql = nest_sql.replace('limit','slimit') + self.sql_query_time_cost(nest_sql) + tdSql.checkData(0,0,num*per_table_num) + + sql_0 = re.sub(r'\d\d',"0",sql) + self.sql_query_time_cost(sql_0) + tdSql.checkData(0,0,0) + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) + self.sql_query_time_cost(nest_sql_0) + tdSql.checkData(0,0,0) + + def sql_limit_retun_n_slimit_return_per_table_num_times_tables(self,sql,num,tables,per_table_num,base_fun,replace_fun): + #sql limit n =n*tables;sql limit 0 = 0 ;sql slmit n = per_table_num*n;sql slimit 0 = 0 + #interval + sql = sql.replace('%s'%base_fun,'%s'%replace_fun) + + nest_sql =" select * from (%s) " %sql + self.sql_query_time_cost(sql) + tdSql.checkRows(num) + self.sql_query_time_cost(nest_sql) + tdSql.checkRows(num) + + sql_0 = re.sub(r'\d\d',"0",sql) + self.sql_query_time_cost(sql_0) + tdSql.checkRows(0) + + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) # \d是匹配数字字符[0-9],+匹配一个或多个 + self.sql_query_time_cost(nest_sql_0) + tdSql.checkRows(0) + + sql = sql.replace('limit','slimit') + self.sql_query_time_cost(sql) + tdSql.checkRows(tables*per_table_num) + nest_sql = nest_sql.replace('limit','slimit') + self.sql_query_time_cost(nest_sql) + tdSql.checkRows(tables*per_table_num) + + sql_0 = re.sub(r'\d\d',"0",sql) + self.sql_query_time_cost(sql_0) + tdSql.checkRows(0) + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) + self.sql_query_time_cost(nest_sql_0) + tdSql.checkRows(0) + + def sql_data_limit_retun_n_slimit_return_per_table_num_times_tables(self,sql,num,tables,per_table_num,base_fun,replace_fun): + #sql limit n =n*tables;sql limit 0 = 0 ;sql slmit n = per_table_num*n;sql slimit 0 = 0 + #interval + sql = sql.replace('%s'%base_fun,'%s'%replace_fun) + + nest_sql =" select * from (%s) " %sql + self.sql_query_time_cost(sql) + tdSql.checkData(0,0,num) + self.sql_query_time_cost(nest_sql) + tdSql.checkData(0,0,num) + + sql_0 = re.sub(r'\d\d',"0",sql) + self.sql_query_time_cost(sql_0) + tdSql.checkData(0,0,0) + + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) # \d是匹配数字字符[0-9],+匹配一个或多个 + self.sql_query_time_cost(nest_sql_0) + tdSql.checkData(0,0,0) + + sql = sql.replace('limit','slimit') + self.sql_query_time_cost(sql) + tdSql.checkData(0,0,tables*per_table_num) + nest_sql = nest_sql.replace('limit','slimit') + self.sql_query_time_cost(nest_sql) + tdSql.checkData(0,0,tables*per_table_num) + + sql_0 = re.sub(r'\d\d',"0",sql) + self.sql_query_time_cost(sql_0) + tdSql.checkData(0,0,0) + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) + self.sql_query_time_cost(nest_sql_0) + tdSql.checkData(0,0,0) + + def sql_limit_not_test_slimitkeep_return_per_table_num_times_n(self,sql,num,tables,per_table_num,base_fun,replace_fun): + #sql sql slmit n = per_table_num*n;sql slimit 0 = 0 + sql = sql.replace('%s'%base_fun,'%s'%replace_fun) + + nest_sql =" select * from (%s) " %sql + sql = sql.replace('limit','limit') + self.sql_query_time_cost(sql) + tdSql.checkRows(num*per_table_num) + + self.sql_query_time_cost(nest_sql) + tdSql.checkRows(num*per_table_num) + + sql_0 = re.sub(r'\d\d',"0",sql) + self.sql_query_time_cost(sql_0) + tdSql.checkRows(0) + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) + self.sql_query_time_cost(nest_sql_0) + tdSql.checkRows(0) + + def sql_data_limit_not_test_slimitkeep_return_per_table_num_times_n(self,sql,num,tables,per_table_num,base_fun,replace_fun): + #sql sql slmit n = per_table_num*n;sql slimit 0 = 0 + sql = sql.replace('%s'%base_fun,'%s'%replace_fun) + + nest_sql =" select * from (%s) " %sql + sql = sql.replace('limit','limit') + self.sql_query_time_cost(sql) + tdSql.checkData(0,0,num*per_table_num) + + self.sql_query_time_cost(nest_sql) + tdSql.checkData(0,0,num*per_table_num) + + sql_0 = re.sub(r'\d\d',"0",sql) + self.sql_query_time_cost(sql_0) + tdSql.checkData(0,0,0) + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) + self.sql_query_time_cost(nest_sql_0) + tdSql.checkData(0,0,0) + + def sql_limit_not_test_slimitkeep_return_per_table_num_times_tables(self,sql,num,tables,per_table_num,base_fun,replace_fun): + #sql sql slmit n = per_table_num*tables;sql slimit 0 = 0 + sql = sql.replace('%s'%base_fun,'%s'%replace_fun) + + nest_sql =" select * from (%s) " %sql + self.sql_query_time_cost(sql) + tdSql.checkRows(tables*per_table_num) + + self.sql_query_time_cost(nest_sql) + tdSql.checkRows(tables*per_table_num) + + sql_0 = re.sub(r'\d\d',"0",sql) + self.sql_query_time_cost(sql_0) + tdSql.checkRows(0) + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) + self.sql_query_time_cost(nest_sql_0) + tdSql.checkRows(0) + + def sql_data_limit_not_test_slimitkeep_return_per_table_num_times_tables(self,sql,num,tables,per_table_num,base_fun,replace_fun): + #sql sql slmit n = per_table_num*tables;sql slimit 0 = 0 + sql = sql.replace('%s'%base_fun,'%s'%replace_fun) + + nest_sql =" select * from (%s) " %sql + self.sql_query_time_cost(sql) + tdSql.checkData(0,0,tables*per_table_num) + + self.sql_query_time_cost(nest_sql) + tdSql.checkData(0,0,tables*per_table_num) + + sql_0 = re.sub(r'\d\d',"0",sql) + self.sql_query_time_cost(sql_0) + tdSql.checkData(0,0,0) + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) + self.sql_query_time_cost(nest_sql_0) + tdSql.checkData(0,0,0) + + def sql_limit_retun_n_times_n2_slimitkeep_return_n_times_n2(self,sql,num,num2,tables,per_table_num,base_fun,replace_fun): + #sql limit n =n*num2;sql limit 0 = 0 ;sql slmit n = num2*n;sql slimit 0 = 0 + sql = sql.replace('%s'%base_fun,'%s'%replace_fun) + + nest_sql =" select * from (%s) " %sql + self.sql_query_time_cost(sql) + tdSql.checkRows(num*num2) + self.sql_query_time_cost(nest_sql) + tdSql.checkRows(num*num2) + + sql_0 = re.sub(r'\d\d',"0",sql) + self.sql_query_time_cost(sql_0) + tdSql.checkRows(0) + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) + self.sql_query_time_cost(nest_sql_0) + tdSql.checkRows(0) + + sql = sql.replace('limit','limit') + self.sql_query_time_cost(sql) + tdSql.checkRows(num*num2) + nest_sql = nest_sql.replace('limit','limit') + self.sql_query_time_cost(nest_sql) + tdSql.checkRows(num*num2) + + sql_0 = re.sub(r'\d\d',"0",sql) + self.sql_query_time_cost(sql_0) + tdSql.checkRows(0) + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) + self.sql_query_time_cost(nest_sql_0) + tdSql.checkRows(0) + + def sql_data_limit_retun_n_times_n2_slimitkeep_return_n_times_n2(self,sql,num,num2,tables,per_table_num,base_fun,replace_fun): + #sql limit n =n*num2;sql limit 0 = 0 ;sql slmit n = num2*n;sql slimit 0 = 0 + sql = sql.replace('%s'%base_fun,'%s'%replace_fun) + + nest_sql =" select * from (%s) " %sql + self.sql_query_time_cost(sql) + tdSql.checkData(0,0,num*num2) + self.sql_query_time_cost(nest_sql) + tdSql.checkData(0,0,num*num2) + + sql_0 = re.sub(r'\d\d',"0",sql) + self.sql_query_time_cost(sql_0) + tdSql.checkData(0,0,0) + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) + self.sql_query_time_cost(nest_sql_0) + tdSql.checkData(0,0,0) + + sql = sql.replace('limit','limit') + self.sql_query_time_cost(sql) + tdSql.checkData(0,0,num*num2) + nest_sql = nest_sql.replace('limit','limit') + self.sql_query_time_cost(nest_sql) + tdSql.checkData(0,0,num*num2) + + sql_0 = re.sub(r'\d\d',"0",sql) + self.sql_query_time_cost(sql_0) + tdSql.checkData(0,0,0) + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) + self.sql_query_time_cost(nest_sql_0) + tdSql.checkData(0,0,0) + + def sql_limit_times_slimitkeep_return_n2(self,sql,num,num2,tables,per_table_num,base_fun,replace_fun): + #sql limit n =n*num2;sql limit 0 = 0 ;sql slmit n = num2*n;sql slimit 0 = 0 + sql = sql.replace('%s'%base_fun,'%s'%replace_fun) + + nest_sql =" select * from (%s) " %sql + self.sql_query_time_cost(sql) + tdSql.checkRows(num2) + self.sql_query_time_cost(nest_sql) + tdSql.checkRows(num2) + + sql_0 = re.sub(r'\d\d',"0",sql) + self.sql_query_time_cost(sql_0) + tdSql.checkRows(0) + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) + self.sql_query_time_cost(nest_sql_0) + tdSql.checkRows(0) + + def sql_data_limit_times_slimitkeep_return_n2(self,sql,num,num2,tables,per_table_num,base_fun,replace_fun): + #sql limit n =n*num2;sql limit 0 = 0 ;sql slmit n = num2*n;sql slimit 0 = 0 + sql = sql.replace('%s'%base_fun,'%s'%replace_fun) + + nest_sql =" select * from (%s) " %sql + self.sql_query_time_cost(sql) + tdSql.checkData(0,0,num2) + self.sql_query_time_cost(nest_sql) + tdSql.checkData(0,0,num2) + + sql_0 = re.sub(r'\d\d',"0",sql) + self.sql_query_time_cost(sql_0) + tdSql.checkData(0,0,0) + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) + self.sql_query_time_cost(nest_sql_0) + tdSql.checkData(0,0,0) + + def sql_retun_error(self,sql,base_fun,replace_fun): + #sql limit n = error;sql limit 0 = error ;sql slmit n = error ;sql slimit 0 = error + sql = sql.replace('%s'%base_fun,'%s'%replace_fun) + + nest_sql =" select * from (%s) " %sql + tdSql.error(sql) + tdSql.error(nest_sql) + + sql_0 = re.sub(r'\d+',"0",sql) + tdSql.error(sql) + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) + tdSql.error(nest_sql_0) + + sql = sql.replace('limit','slimit') + tdSql.error(sql) + nest_sql = nest_sql.replace('limit','slimit') + tdSql.error(nest_sql) + + sql_0 = re.sub(r'\d+',"0",sql) + tdSql.error(sql_0) + nest_sql_0 = re.sub(r'\d\d',"0",nest_sql) + tdSql.error(nest_sql_0) + + def fun_base(self,dbname,num,num2,tables,per_table_num,dbnamejoin,base_fun,replace_fun): + + tdLog.info("base query ---------1----------") + sql = "select * from %s.meters limit %d" %(dbname,num) + self.sql_limit_retun_n_slimit_return_error(sql,num,tables,per_table_num,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_data_limit_retun_n_slimit_return_error(sql,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_data_limit_retun_n_slimit_return_error(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_data_limit_retun_n_slimit_return_error(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select a.* from %s.meters a,%s.meters b where a.ts = b.ts limit %d" %(dbname,dbnamejoin,num) + self.sql_limit_retun_n_slimit_return_error(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_data_limit_retun_n_slimit_return_error(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_data_limit_retun_n_slimit_return_error(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_data_limit_retun_n_slimit_return_error(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + + + tdLog.info("base query ---------2----------") + sql = "select * from %s.meters where ts is not null limit %d" %(dbname,num) + self.sql_limit_retun_n_slimit_return_error(sql,num,tables,per_table_num,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_data_limit_retun_n_slimit_return_error(sql,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_data_limit_retun_n_slimit_return_error(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_data_limit_retun_n_slimit_return_error(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select a.* from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts limit %d" %(dbname,dbnamejoin,num) + self.sql_limit_retun_n_slimit_return_error(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_data_limit_retun_n_slimit_return_error(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_data_limit_retun_n_slimit_return_error(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_data_limit_retun_n_slimit_return_error(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + + + tdLog.info("base query ---------3----------") + sql = "select * from %s.meters where ts is not null order by ts limit %d" %(dbname,num) + self.sql_limit_retun_n_slimit_return_error(sql,num,tables,per_table_num,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_data_limit_retun_n_slimit_return_error(sql,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_data_limit_retun_n_slimit_return_error(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_data_limit_retun_n_slimit_return_error(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select a.* from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts order by b.ts limit %d" %(dbname,dbnamejoin,num) + self.sql_limit_retun_n_slimit_return_error(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_data_limit_retun_n_slimit_return_error(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_data_limit_retun_n_slimit_return_error(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_data_limit_retun_n_slimit_return_error(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + + tdLog.info("base query ---------4----------") + sql = "select * from %s.meters where ts is not null order by ts desc limit %d" %(dbname,num) + self.sql_limit_retun_n_slimit_return_error(sql,num,tables,per_table_num,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_data_limit_retun_n_slimit_return_error(sql,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_data_limit_retun_n_slimit_return_error(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_data_limit_retun_n_slimit_return_error(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select a.* from %s.meters a,%s.meters b where b.ts is not null and a.ts = b.ts order by a.ts desc limit %d" %(dbname,dbnamejoin,num) + self.sql_limit_retun_n_slimit_return_error(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_data_limit_retun_n_slimit_return_error(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_data_limit_retun_n_slimit_return_error(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_data_limit_retun_n_slimit_return_error(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + def fun_count(self,dbname,num,num2,tables,per_table_num,dbnamejoin,base_fun,replace_fun): + + tdLog.info("count query ---------1----------") + sql = "select count(*) from %s.meters limit %d" %(dbname,num) + self.sql_limit_retun_1_slimit_return_error(sql,tables,per_table_num,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_data_limit_retun_1_slimit_return_error(sql,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_data_limit_retun_1_slimit_return_error(sql_union,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_data_limit_retun_1_slimit_return_error(sql_union_all,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select count(a.*) from %s.meters a,%s.meters b where a.ts = b.ts limit %d" %(dbname,dbnamejoin,num) + self.sql_limit_retun_1_slimit_return_error(sql_join,tables,per_table_num,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_data_limit_retun_1_slimit_return_error(sql_join,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_data_limit_retun_1_slimit_return_error(sql_union,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_data_limit_retun_1_slimit_return_error(sql_union_all,tables,per_table_num,base_fun,replace_fun) + + + + + tdLog.info("count query ---------2----------") + sql = "select count(*) from %s.meters where ts is not null limit %d" %(dbname,num) + self.sql_limit_retun_1_slimit_return_error(sql,tables,per_table_num,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_data_limit_retun_1_slimit_return_error(sql,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_data_limit_retun_1_slimit_return_error(sql_union,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_data_limit_retun_1_slimit_return_error(sql_union_all,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select count(a.*) from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts limit %d" %(dbname,dbnamejoin,num) + self.sql_limit_retun_1_slimit_return_error(sql_join,tables,per_table_num,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_data_limit_retun_1_slimit_return_error(sql_join,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_data_limit_retun_1_slimit_return_error(sql_union,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_data_limit_retun_1_slimit_return_error(sql_union_all,tables,per_table_num,base_fun,replace_fun) + + + + tdLog.info("count query ---------3----------") + sql = "select count(*) from %s.meters where ts is not null order by ts limit %d" %(dbname,num) + self.sql_retun_error(sql,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_retun_error(sql,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_retun_error(sql_union,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_retun_error(sql_union_all,base_fun,replace_fun) + + sql_join = "select count(a.*) from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts order by b.ts limit %d" %(dbname,dbnamejoin,num) + self.sql_retun_error(sql_join,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_retun_error(sql_join,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_retun_error(sql_union,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_retun_error(sql_union_all,base_fun,replace_fun) + + + + tdLog.info("count query ---------4----------") + sql = "select count(*) from %s.meters where ts is not null order by ts desc limit %d" %(dbname,num) + self.sql_retun_error(sql,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_retun_error(sql,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_retun_error(sql_union,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_retun_error(sql_union_all,base_fun,replace_fun) + + sql_join = "select count(a.*) from %s.meters a,%s.meters b where b.ts is not null and a.ts = b.ts order by a.ts desc limit %d" %(dbname,dbnamejoin,num) + self.sql_retun_error(sql_join,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_retun_error(sql_join,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_retun_error(sql_union,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_retun_error(sql_union_all,base_fun,replace_fun) + + + + tdLog.info("count query ---------5----------") + sql = "select count(*) from %s.meters where ts is not null group by tbname limit %d" %(dbname,num) + self.sql_limit_retun_tables_slimit_return_n(sql,num,tables,per_table_num,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_data_limit_retun_tables_slimit_return_n(sql,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_data_limit_retun_tables_slimit_return_n(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_data_limit_retun_tables_slimit_return_n(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select count(*) from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts group by b.tbname limit %d" %(dbname,dbnamejoin,num) + self.sql_limit_retun_tables_slimit_return_n(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_data_limit_retun_tables_slimit_return_n(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_data_limit_retun_tables_slimit_return_n(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_data_limit_retun_tables_slimit_return_n(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + + + + tdLog.info("count query ---------6----------") + sql = "select count(*) from %s.meters where ts is not null partition by tbname limit %d" %(dbname,num) + self.sql_limit_retun_tables_slimit_return_n(sql,num,tables,per_table_num,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_data_limit_retun_tables_slimit_return_n(sql,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_data_limit_retun_tables_slimit_return_n(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_data_limit_retun_tables_slimit_return_n(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select count(*) from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts partition by b.tbname limit %d" %(dbname,dbnamejoin,num) + self.sql_limit_retun_tables_slimit_return_n(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_data_limit_retun_tables_slimit_return_n(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_data_limit_retun_tables_slimit_return_n(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_data_limit_retun_tables_slimit_return_n(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + + + tdLog.info("count query ---------7----------") + sql = "select count(*) cc from %s.meters where ts is not null group by tbname order by cc limit %d" %(dbname,num) + self.sql_limit_retun_n_slimit_return_tables(sql,num,tables,per_table_num,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_data_limit_retun_n_slimit_return_tables(sql,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_data_limit_retun_n_slimit_return_tables(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_data_limit_retun_n_slimit_return_tables(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select count(*) cc from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts group by b.tbname order by cc limit %d" %(dbname,dbnamejoin,num) + self.sql_limit_retun_n_slimit_return_tables(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_data_limit_retun_n_slimit_return_tables(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_data_limit_retun_n_slimit_return_tables(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_data_limit_retun_n_slimit_return_tables(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + + + tdLog.info("count query ---------8----------") + sql = "select count(*) cc from %s.meters where ts is not null partition by tbname order by cc limit %d" %(dbname,num) + self.sql_limit_retun_n_slimit_return_tables(sql,num,tables,per_table_num,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_data_limit_retun_n_slimit_return_tables(sql,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_data_limit_retun_n_slimit_return_tables(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_data_limit_retun_n_slimit_return_tables(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select count(*) cc from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts partition by b.tbname order by cc limit %d" %(dbname,dbnamejoin,num) + self.sql_limit_retun_n_slimit_return_tables(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_data_limit_retun_n_slimit_return_tables(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_data_limit_retun_n_slimit_return_tables(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_data_limit_retun_n_slimit_return_tables(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + + + tdLog.info("count query ---------9----------") + sql = "select count(*) cc from %s.meters where ts is not null interval(1a) limit %d" %(dbname,num) + self.sql_limit_retun_n_slimit_return_error(sql,num,tables,per_table_num,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_data_limit_retun_n_slimit_return_error(sql,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_data_limit_retun_n_slimit_return_error(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_data_limit_retun_n_slimit_return_error(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select count(*) cc from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts interval(1a) limit %d" %(dbname,dbnamejoin,num) + self.sql_limit_retun_n_slimit_return_error(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_data_limit_retun_n_slimit_return_error(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_data_limit_retun_n_slimit_return_error(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_data_limit_retun_n_slimit_return_error(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + + + tdLog.info("count query ---------10----------") + sql = "select count(*) cc from %s.meters where ts is not null interval(1a) order by cc asc limit %d" %(dbname,num) + self.sql_limit_retun_n_slimit_return_error(sql,num,tables,per_table_num,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_data_limit_retun_n_slimit_return_error(sql,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_data_limit_retun_n_slimit_return_error(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_data_limit_retun_n_slimit_return_error(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select count(*) cc from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts interval(1a) order by cc asc limit %d" %(dbname,dbnamejoin,num) + self.sql_limit_retun_n_slimit_return_error(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_data_limit_retun_n_slimit_return_error(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_data_limit_retun_n_slimit_return_error(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_data_limit_retun_n_slimit_return_error(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + + + tdLog.info("count query ---------11----------") + sql = "select count(*) cc from %s.meters where ts is not null interval(1a) order by cc desc limit %d" %(dbname,num) + self.sql_limit_retun_n_slimit_return_error(sql,num,tables,per_table_num,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_data_limit_retun_n_slimit_return_error(sql,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_data_limit_retun_n_slimit_return_error(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_data_limit_retun_n_slimit_return_error(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select count(*) cc from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts interval(1a) order by cc desc limit %d" %(dbname,dbnamejoin,num) + self.sql_limit_retun_n_slimit_return_error(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_data_limit_retun_n_slimit_return_error(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_data_limit_retun_n_slimit_return_error(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_data_limit_retun_n_slimit_return_error(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + + + tdLog.info("count query ---------12----------") + sql = "select tbname,count(*) cc from %s.meters where ts is not null interval(1a) group by tbname limit %d" %(dbname,num) + self.sql_retun_error(sql,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_retun_error(sql,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_retun_error(sql_union,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_retun_error(sql_union_all,base_fun,replace_fun) + + sql_join = "select a.tbname,count(*) cc from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts interval(1a) group by b.tbname limit %d" %(dbname,dbnamejoin,num) + self.sql_retun_error(sql_join,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_retun_error(sql_join,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_retun_error(sql_union,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_retun_error(sql_union_all,base_fun,replace_fun) + + + + tdLog.info("count query ---------13----------") + sql = "select tbname,count(*) cc from %s.meters where ts is not null interval(1a) partition by tbname limit %d" %(dbname,num) + self.sql_retun_error(sql,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_retun_error(sql,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_retun_error(sql_union,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_retun_error(sql_union_all,base_fun,replace_fun) + + sql_join = "select a.tbname,count(*) cc from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts interval(1a) partition by b.tbname limit %d" %(dbname,dbnamejoin,num) + self.sql_retun_error(sql_join,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_retun_error(sql_join,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_retun_error(sql_union,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_retun_error(sql_union_all,base_fun,replace_fun) + + + + tdLog.info("count query ---------14----------") + sql = "select tbname,count(*) cc from %s.meters where ts is not null partition by tbname interval(1a) limit %d" %(dbname,num) + self.sql_limit_retun_tables_times_n_slimit_return_per_table_num_times_n(sql,num,tables,per_table_num,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_data_limit_retun_tables_times_n_slimit_return_per_table_num_times_n(sql,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_data_limit_retun_tables_times_n_slimit_return_per_table_num_times_n(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_data_limit_retun_tables_times_n_slimit_return_per_table_num_times_n(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select a.tbname,count(*) cc from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts partition by a.tbname interval(1a) limit %d" %(dbname,dbnamejoin,num) + self.sql_limit_retun_tables_times_n_slimit_return_per_table_num_times_n(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_data_limit_retun_tables_times_n_slimit_return_per_table_num_times_n(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_data_limit_retun_tables_times_n_slimit_return_per_table_num_times_n(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_data_limit_retun_tables_times_n_slimit_return_per_table_num_times_n(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + + + tdLog.info("count query ---------15----------") + sql = "select tbname,count(*) cc from %s.meters where ts is not null partition by tbname interval(1a) order by cc asc limit %d" %(dbname,num) + self.sql_limit_retun_n_slimit_return_per_table_num_times_tables(sql,num,tables,per_table_num,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_data_limit_retun_n_slimit_return_per_table_num_times_tables(sql,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_data_limit_retun_n_slimit_return_per_table_num_times_tables(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_data_limit_retun_n_slimit_return_per_table_num_times_tables(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select a.tbname,count(*) cc from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts partition by a.tbname interval(1a) order by cc asc limit %d" %(dbname,dbnamejoin,num) + self.sql_limit_retun_n_slimit_return_per_table_num_times_tables(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_data_limit_retun_n_slimit_return_per_table_num_times_tables(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_data_limit_retun_n_slimit_return_per_table_num_times_tables(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_data_limit_retun_n_slimit_return_per_table_num_times_tables(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + + + tdLog.info("count query ---------16----------") + sql = "select tbname,count(*) cc from %s.meters where ts is not null partition by tbname interval(1a) order by cc desc limit %d" %(dbname,num) + self.sql_limit_retun_n_slimit_return_per_table_num_times_tables(sql,num,tables,per_table_num,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_data_limit_retun_n_slimit_return_per_table_num_times_tables(sql,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_data_limit_retun_n_slimit_return_per_table_num_times_tables(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_data_limit_retun_n_slimit_return_per_table_num_times_tables(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select a.tbname,count(*) cc from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts partition by a.tbname interval(1a) order by cc desc limit %d" %(dbname,dbnamejoin,num) + self.sql_limit_retun_n_slimit_return_per_table_num_times_tables(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_data_limit_retun_n_slimit_return_per_table_num_times_tables(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_data_limit_retun_n_slimit_return_per_table_num_times_tables(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_data_limit_retun_n_slimit_return_per_table_num_times_tables(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + + + tdLog.info("count query ---------17----------") + sql = "select tbname,count(*) cc from %s.meters where ts is not null partition by tbname interval(1a) slimit %d" %(dbname,num) + self.sql_limit_not_test_slimitkeep_return_per_table_num_times_n(sql,num,tables,per_table_num,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_data_limit_not_test_slimitkeep_return_per_table_num_times_n(sql,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_data_limit_not_test_slimitkeep_return_per_table_num_times_n(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_data_limit_not_test_slimitkeep_return_per_table_num_times_n(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select a.tbname,count(*) cc from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts partition by a.tbname interval(1a) slimit %d" %(dbname,dbnamejoin,num) + self.sql_limit_not_test_slimitkeep_return_per_table_num_times_n(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_data_limit_not_test_slimitkeep_return_per_table_num_times_n(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_data_limit_not_test_slimitkeep_return_per_table_num_times_n(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_data_limit_not_test_slimitkeep_return_per_table_num_times_n(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + + + tdLog.info("count query ---------18----------") + sql = "select tbname,count(*) cc from %s.meters where ts is not null partition by tbname interval(1a) order by cc asc slimit %d" %(dbname,num) + self.sql_limit_not_test_slimitkeep_return_per_table_num_times_tables(sql,num,tables,per_table_num,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_data_limit_not_test_slimitkeep_return_per_table_num_times_tables(sql,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_data_limit_not_test_slimitkeep_return_per_table_num_times_tables(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_data_limit_not_test_slimitkeep_return_per_table_num_times_tables(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select a.tbname,count(*) cc from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts partition by a.tbname interval(1a) order by cc asc slimit %d" %(dbname,dbnamejoin,num) + self.sql_limit_not_test_slimitkeep_return_per_table_num_times_tables(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_data_limit_not_test_slimitkeep_return_per_table_num_times_tables(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_data_limit_not_test_slimitkeep_return_per_table_num_times_tables(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_data_limit_not_test_slimitkeep_return_per_table_num_times_tables(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + + tdLog.info("count query ---------19----------") + sql = "select tbname,count(*) cc from %s.meters where ts is not null partition by tbname interval(1a) order by cc desc slimit %d" %(dbname,num) + self.sql_limit_not_test_slimitkeep_return_per_table_num_times_tables(sql,num,tables,per_table_num,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_data_limit_not_test_slimitkeep_return_per_table_num_times_tables(sql,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_data_limit_not_test_slimitkeep_return_per_table_num_times_tables(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_data_limit_not_test_slimitkeep_return_per_table_num_times_tables(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select a.tbname,count(*) cc from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts partition by a.tbname interval(1a) order by cc desc slimit %d" %(dbname,dbnamejoin,num) + self.sql_limit_not_test_slimitkeep_return_per_table_num_times_tables(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_data_limit_not_test_slimitkeep_return_per_table_num_times_tables(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_data_limit_not_test_slimitkeep_return_per_table_num_times_tables(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_data_limit_not_test_slimitkeep_return_per_table_num_times_tables(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + + + tdLog.info("count query ---------20----------") + sql = "select tbname,count(*) cc from %s.meters where ts is not null partition by tbname interval(1a) slimit %d limit %d" %(dbname,num,num2) + self.sql_limit_retun_n_times_n2_slimitkeep_return_n_times_n2(sql,num,num2,tables,per_table_num,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_data_limit_retun_n_times_n2_slimitkeep_return_n_times_n2(sql,num,num2,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_data_limit_retun_n_times_n2_slimitkeep_return_n_times_n2(sql_union,num,num2,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_data_limit_retun_n_times_n2_slimitkeep_return_n_times_n2(sql_union_all,num,num2,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select a.tbname,count(*) cc from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts partition by a.tbname interval(1a) slimit %d limit %d" %(dbname,dbnamejoin,num,num2) + self.sql_limit_retun_n_times_n2_slimitkeep_return_n_times_n2(sql_join,num,num2,tables,per_table_num,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_data_limit_retun_n_times_n2_slimitkeep_return_n_times_n2(sql_join,num,num2,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_data_limit_retun_n_times_n2_slimitkeep_return_n_times_n2(sql_union,num,num2,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_data_limit_retun_n_times_n2_slimitkeep_return_n_times_n2(sql_union_all,num,num2,tables,per_table_num,base_fun,replace_fun) + + + tdLog.info("count query ---------21----------") + sql = "select tbname,count(*) cc from %s.meters where ts is not null partition by tbname interval(1a) order by cc asc slimit %d limit %d" %(dbname,num,num2) + self.sql_limit_times_slimitkeep_return_n2(sql,num,num2,tables,per_table_num,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_data_limit_times_slimitkeep_return_n2(sql,num,num2,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_data_limit_times_slimitkeep_return_n2(sql_union,num,num2,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_data_limit_times_slimitkeep_return_n2(sql_union_all,num,num2,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select a.tbname,count(*) cc from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts partition by a.tbname interval(1a) order by cc asc slimit %d limit %d" %(dbname,dbnamejoin,num,num2) + self.sql_limit_times_slimitkeep_return_n2(sql_join,num,num2,tables,per_table_num,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_data_limit_times_slimitkeep_return_n2(sql_join,num,num2,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_data_limit_times_slimitkeep_return_n2(sql_union,num,num2,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_data_limit_times_slimitkeep_return_n2(sql_union_all,num,num2,tables,per_table_num,base_fun,replace_fun) + + + tdLog.info("count query ---------22----------") + sql = "select tbname,count(*) cc from %s.meters where ts is not null partition by tbname interval(1a) order by cc desc slimit %d limit %d" %(dbname,num,num2) + self.sql_limit_times_slimitkeep_return_n2(sql,num,num2,tables,per_table_num,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_data_limit_times_slimitkeep_return_n2(sql,num,num2,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_data_limit_times_slimitkeep_return_n2(sql_union,num,num2,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_data_limit_times_slimitkeep_return_n2(sql_union_all,num,num2,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select a.tbname,count(*) cc from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts partition by a.tbname interval(1a) order by cc desc slimit %d limit %d" %(dbname,dbnamejoin,num,num2) + self.sql_limit_times_slimitkeep_return_n2(sql_join,num,num2,tables,per_table_num,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_data_limit_times_slimitkeep_return_n2(sql_join,num,num2,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_data_limit_times_slimitkeep_return_n2(sql_union,num,num2,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_data_limit_times_slimitkeep_return_n2(sql_union_all,num,num2,tables,per_table_num,base_fun,replace_fun) + + + def fun_last(self,dbname,num,num2,tables,per_table_num,dbnamejoin,base_fun,replace_fun): + + tdLog.info("last query ---------1----------") + sql = "select last(*) from %s.meters limit %d" %(dbname,num) + self.sql_limit_retun_1_slimit_return_error(sql,tables,per_table_num,base_fun,replace_fun) + sql = "select last(*) from (%s)" %sql + self.sql_limit_retun_1_slimit_return_error(sql,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_last_limit_retun_1_slimit_return_error(sql_union,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_last_limit_retun_1_slimit_return_error(sql_union_all,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select last(a.*) from %s.meters a,%s.meters b where a.ts = b.ts limit %d" %(dbname,dbnamejoin,num) + self.sql_limit_retun_1_slimit_return_error(sql_join,tables,per_table_num,base_fun,replace_fun) + sql_join = "select last(*) from (%s)" %sql_join + self.sql_limit_retun_1_slimit_return_error(sql_join,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_last_limit_retun_1_slimit_return_error(sql_union,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_last_limit_retun_1_slimit_return_error(sql_union_all,tables,per_table_num,base_fun,replace_fun) + + + + + tdLog.info("last query ---------2----------") + sql = "select last(*) from %s.meters where ts is not null limit %d" %(dbname,num) + self.sql_limit_retun_1_slimit_return_error(sql,tables,per_table_num,base_fun,replace_fun) + sql = "select last(*) from (%s)" %sql + self.sql_limit_retun_1_slimit_return_error(sql,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_last_limit_retun_1_slimit_return_error(sql_union,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_last_limit_retun_1_slimit_return_error(sql_union_all,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select last(a.*) from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts limit %d" %(dbname,dbnamejoin,num) + self.sql_limit_retun_1_slimit_return_error(sql_join,tables,per_table_num,base_fun,replace_fun) + sql_join = "select last(*) from (%s)" %sql_join + self.sql_limit_retun_1_slimit_return_error(sql_join,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_last_limit_retun_1_slimit_return_error(sql_union,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_last_limit_retun_1_slimit_return_error(sql_union_all,tables,per_table_num,base_fun,replace_fun) + + + + tdLog.info("last query ---------3----------") + sql = "select last(*) from %s.meters where ts is not null order by ts limit %d" %(dbname,num) + self.sql_retun_error(sql,base_fun,replace_fun) + sql = "select last(*) from (%s)" %sql + self.sql_retun_error(sql,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_retun_error(sql_union,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_retun_error(sql_union_all,base_fun,replace_fun) + + sql_join = "select last(a.*) from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts order by b.ts limit %d" %(dbname,dbnamejoin,num) + self.sql_retun_error(sql_join,base_fun,replace_fun) + sql_join = "select last(*) from (%s)" %sql_join + self.sql_retun_error(sql_join,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_retun_error(sql_union,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_retun_error(sql_union_all,base_fun,replace_fun) + + + + tdLog.info("last query ---------4----------") + sql = "select last(*) from %s.meters where ts is not null order by ts desc limit %d" %(dbname,num) + self.sql_retun_error(sql,base_fun,replace_fun) + sql = "select last(*) from (%s)" %sql + self.sql_retun_error(sql,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_retun_error(sql_union,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_retun_error(sql_union_all,base_fun,replace_fun) + + sql_join = "select last(a.*) from %s.meters a,%s.meters b where b.ts is not null and a.ts = b.ts order by a.ts desc limit %d" %(dbname,dbnamejoin,num) + self.sql_retun_error(sql_join,base_fun,replace_fun) + sql_join = "select last(*) from (%s)" %sql_join + self.sql_retun_error(sql_join,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_retun_error(sql_union,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_retun_error(sql_union_all,base_fun,replace_fun) + + + + tdLog.info("last query ---------5----------") + sql = "select last(*) from %s.meters where ts is not null group by tbname limit %d" %(dbname,num) + self.sql_limit_retun_tables_slimit_return_n(sql,num,tables,per_table_num,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_data_limit_retun_tables_slimit_return_n(sql,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_data_limit_retun_tables_slimit_return_n(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_data_limit_retun_tables_slimit_return_n(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select last(a.*) from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts group by b.tbname limit %d" %(dbname,dbnamejoin,num) + self.sql_limit_retun_tables_slimit_return_n(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_data_limit_retun_tables_slimit_return_n(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_data_limit_retun_tables_slimit_return_n(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_data_limit_retun_tables_slimit_return_n(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + + + + tdLog.info("last query ---------6----------") + sql = "select last(*) from %s.meters where ts is not null partition by tbname limit %d" %(dbname,num) + self.sql_limit_retun_tables_slimit_return_n(sql,num,tables,per_table_num,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_data_limit_retun_tables_slimit_return_n(sql,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_data_limit_retun_tables_slimit_return_n(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_data_limit_retun_tables_slimit_return_n(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select last(a.*) from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts partition by b.tbname limit %d" %(dbname,dbnamejoin,num) + self.sql_limit_retun_tables_slimit_return_n(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_data_limit_retun_tables_slimit_return_n(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_data_limit_retun_tables_slimit_return_n(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_data_limit_retun_tables_slimit_return_n(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + + + tdLog.info("last query ---------7----------") + sql = "select last(ts) cc from %s.meters where ts is not null group by tbname order by cc limit %d" %(dbname,num) + self.sql_limit_retun_n_slimit_return_tables(sql,num,tables,per_table_num,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_data_limit_retun_n_slimit_return_tables(sql,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_data_limit_retun_n_slimit_return_tables(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_data_limit_retun_n_slimit_return_tables(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select last(a.ts) cc from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts group by b.tbname order by cc limit %d" %(dbname,dbnamejoin,num) + self.sql_limit_retun_n_slimit_return_tables(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_data_limit_retun_n_slimit_return_tables(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_data_limit_retun_n_slimit_return_tables(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_data_limit_retun_n_slimit_return_tables(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + + + tdLog.info("last query ---------8----------") + sql = "select last(ts) cc from %s.meters where ts is not null partition by tbname order by cc limit %d" %(dbname,num) + self.sql_limit_retun_n_slimit_return_tables(sql,num,tables,per_table_num,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_data_limit_retun_n_slimit_return_tables(sql,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_data_limit_retun_n_slimit_return_tables(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_data_limit_retun_n_slimit_return_tables(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select last(a.ts) cc from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts partition by b.tbname order by cc limit %d" %(dbname,dbnamejoin,num) + self.sql_limit_retun_n_slimit_return_tables(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_data_limit_retun_n_slimit_return_tables(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_data_limit_retun_n_slimit_return_tables(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_data_limit_retun_n_slimit_return_tables(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + + + tdLog.info("last query ---------9----------") + sql = "select last(*) from %s.meters where ts is not null interval(1a) limit %d" %(dbname,num) + self.sql_limit_retun_n_slimit_return_error(sql,num,tables,per_table_num,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_data_limit_retun_n_slimit_return_error(sql,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_data_limit_retun_n_slimit_return_error(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_data_limit_retun_n_slimit_return_error(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select last(a.ts) cc from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts interval(1a) limit %d" %(dbname,dbnamejoin,num) + self.sql_limit_retun_n_slimit_return_error(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_data_limit_retun_n_slimit_return_error(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_data_limit_retun_n_slimit_return_error(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_data_limit_retun_n_slimit_return_error(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + + + tdLog.info("last query ---------10----------") + sql = "select last(ts) cc from %s.meters where ts is not null interval(1a) order by cc asc limit %d" %(dbname,num) + self.sql_limit_retun_n_slimit_return_error(sql,num,tables,per_table_num,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_data_limit_retun_n_slimit_return_error(sql,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_data_limit_retun_n_slimit_return_error(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_data_limit_retun_n_slimit_return_error(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select last(a.ts) cc from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts interval(1a) order by cc asc limit %d" %(dbname,dbnamejoin,num) + self.sql_limit_retun_n_slimit_return_error(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_data_limit_retun_n_slimit_return_error(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_data_limit_retun_n_slimit_return_error(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_data_limit_retun_n_slimit_return_error(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + + + tdLog.info("last query ---------11----------") + sql = "select last(ts) cc from %s.meters where ts is not null interval(1a) order by cc desc limit %d" %(dbname,num) + self.sql_limit_retun_n_slimit_return_error(sql,num,tables,per_table_num,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_data_limit_retun_n_slimit_return_error(sql,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_data_limit_retun_n_slimit_return_error(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_data_limit_retun_n_slimit_return_error(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select last(a.ts) cc from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts interval(1a) order by cc desc limit %d" %(dbname,dbnamejoin,num) + self.sql_limit_retun_n_slimit_return_error(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_data_limit_retun_n_slimit_return_error(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_data_limit_retun_n_slimit_return_error(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_data_limit_retun_n_slimit_return_error(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + + + tdLog.info("last query ---------12----------") + sql = "select tbname,last(ts) cc from %s.meters where ts is not null interval(1a) group by tbname limit %d" %(dbname,num) + self.sql_retun_error(sql,base_fun,replace_fun) + sql = "select last(*) from (%s)" %sql + self.sql_retun_error(sql,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_retun_error(sql_union,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_retun_error(sql_union_all,base_fun,replace_fun) + + sql_join = "select a.tbname,last(a.ts) cc from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts interval(1a) group by b.tbname limit %d" %(dbname,dbnamejoin,num) + self.sql_retun_error(sql_join,base_fun,replace_fun) + sql_join = "select last(*) from (%s)" %sql_join + self.sql_retun_error(sql_join,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_retun_error(sql_union,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_retun_error(sql_union_all,base_fun,replace_fun) + + + + tdLog.info("last query ---------13----------") + sql = "select tbname,last(ts) cc from %s.meters where ts is not null interval(1a) partition by tbname limit %d" %(dbname,num) + self.sql_retun_error(sql,base_fun,replace_fun) + sql = "select last(*) from (%s)" %sql + self.sql_retun_error(sql,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_retun_error(sql_union,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_retun_error(sql_union_all,base_fun,replace_fun) + + sql_join = "select a.tbname,last(a.ts) cc from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts interval(1a) partition by b.tbname limit %d" %(dbname,dbnamejoin,num) + self.sql_retun_error(sql_join,base_fun,replace_fun) + sql_join = "select last(*) from (%s)" %sql_join + self.sql_retun_error(sql_join,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_retun_error(sql_union,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_retun_error(sql_union_all,base_fun,replace_fun) + + + + tdLog.info("last query ---------14----------") + sql = "select tbname,last(*) cc from %s.meters where ts is not null partition by tbname interval(1a) limit %d" %(dbname,num) + self.sql_limit_retun_tables_times_n_slimit_return_per_table_num_times_n(sql,num,tables,per_table_num,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_data_limit_retun_tables_times_n_slimit_return_per_table_num_times_n(sql,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_data_limit_retun_tables_times_n_slimit_return_per_table_num_times_n(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_data_limit_retun_tables_times_n_slimit_return_per_table_num_times_n(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select a.tbname,last(a.ts) cc from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts partition by a.tbname interval(1a) limit %d" %(dbname,dbnamejoin,num) + self.sql_limit_retun_tables_times_n_slimit_return_per_table_num_times_n(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_data_limit_retun_tables_times_n_slimit_return_per_table_num_times_n(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_data_limit_retun_tables_times_n_slimit_return_per_table_num_times_n(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_data_limit_retun_tables_times_n_slimit_return_per_table_num_times_n(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + + + tdLog.info("last query ---------15----------") + sql = "select tbname,last(ts) cc from %s.meters where ts is not null partition by tbname interval(1a) order by cc asc limit %d" %(dbname,num) + self.sql_limit_retun_n_slimit_return_per_table_num_times_tables(sql,num,tables,per_table_num,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_data_limit_retun_n_slimit_return_per_table_num_times_tables(sql,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_data_limit_retun_n_slimit_return_per_table_num_times_tables(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_data_limit_retun_n_slimit_return_per_table_num_times_tables(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select a.tbname,last(a.ts) cc from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts partition by a.tbname interval(1a) order by cc asc limit %d" %(dbname,dbnamejoin,num) + self.sql_limit_retun_n_slimit_return_per_table_num_times_tables(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_data_limit_retun_n_slimit_return_per_table_num_times_tables(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_data_limit_retun_n_slimit_return_per_table_num_times_tables(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_data_limit_retun_n_slimit_return_per_table_num_times_tables(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + + + tdLog.info("last query ---------16----------") + sql = "select tbname,last(ts) cc from %s.meters where ts is not null partition by tbname interval(1a) order by cc desc limit %d" %(dbname,num) + self.sql_limit_retun_n_slimit_return_per_table_num_times_tables(sql,num,tables,per_table_num,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_data_limit_retun_n_slimit_return_per_table_num_times_tables(sql,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_data_limit_retun_n_slimit_return_per_table_num_times_tables(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_data_limit_retun_n_slimit_return_per_table_num_times_tables(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select a.tbname,last(a.ts) cc from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts partition by a.tbname interval(1a) order by cc desc limit %d" %(dbname,dbnamejoin,num) + self.sql_limit_retun_n_slimit_return_per_table_num_times_tables(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_data_limit_retun_n_slimit_return_per_table_num_times_tables(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_data_limit_retun_n_slimit_return_per_table_num_times_tables(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_data_limit_retun_n_slimit_return_per_table_num_times_tables(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + + + tdLog.info("last query ---------17----------") + sql = "select tbname,last(*) cc from %s.meters where ts is not null partition by tbname interval(1a) slimit %d" %(dbname,num) + self.sql_limit_not_test_slimitkeep_return_per_table_num_times_n(sql,num,tables,per_table_num,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_data_limit_not_test_slimitkeep_return_per_table_num_times_n(sql,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_data_limit_not_test_slimitkeep_return_per_table_num_times_n(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_data_limit_not_test_slimitkeep_return_per_table_num_times_n(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select a.tbname,last(a.ts) cc from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts partition by a.tbname interval(1a) slimit %d" %(dbname,dbnamejoin,num) + self.sql_limit_not_test_slimitkeep_return_per_table_num_times_n(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_data_limit_not_test_slimitkeep_return_per_table_num_times_n(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_data_limit_not_test_slimitkeep_return_per_table_num_times_n(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_data_limit_not_test_slimitkeep_return_per_table_num_times_n(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + + + tdLog.info("last query ---------18----------") + sql = "select tbname,last(ts) cc from %s.meters where ts is not null partition by tbname interval(1a) order by cc asc slimit %d" %(dbname,num) + self.sql_limit_not_test_slimitkeep_return_per_table_num_times_tables(sql,num,tables,per_table_num,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_data_limit_not_test_slimitkeep_return_per_table_num_times_tables(sql,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_data_limit_not_test_slimitkeep_return_per_table_num_times_tables(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_data_limit_not_test_slimitkeep_return_per_table_num_times_tables(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select a.tbname,last(a.ts) cc from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts partition by a.tbname interval(1a) order by cc asc slimit %d" %(dbname,dbnamejoin,num) + self.sql_limit_not_test_slimitkeep_return_per_table_num_times_tables(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_data_limit_not_test_slimitkeep_return_per_table_num_times_tables(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_data_limit_not_test_slimitkeep_return_per_table_num_times_tables(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_data_limit_not_test_slimitkeep_return_per_table_num_times_tables(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + + tdLog.info("last query ---------19----------") + sql = "select tbname,last(ts) cc from %s.meters where ts is not null partition by tbname interval(1a) order by cc desc slimit %d" %(dbname,num) + self.sql_limit_not_test_slimitkeep_return_per_table_num_times_tables(sql,num,tables,per_table_num,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_data_limit_not_test_slimitkeep_return_per_table_num_times_tables(sql,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_data_limit_not_test_slimitkeep_return_per_table_num_times_tables(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_data_limit_not_test_slimitkeep_return_per_table_num_times_tables(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select a.tbname,last(a.ts) cc from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts partition by a.tbname interval(1a) order by cc desc slimit %d" %(dbname,dbnamejoin,num) + self.sql_limit_not_test_slimitkeep_return_per_table_num_times_tables(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_data_limit_not_test_slimitkeep_return_per_table_num_times_tables(sql_join,num,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_data_limit_not_test_slimitkeep_return_per_table_num_times_tables(sql_union,num,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_data_limit_not_test_slimitkeep_return_per_table_num_times_tables(sql_union_all,num,tables,per_table_num,base_fun,replace_fun) + + + + tdLog.info("last query ---------20----------") + sql = "select tbname,last(*) cc from %s.meters where ts is not null partition by tbname interval(1a) slimit %d limit %d" %(dbname,num,num2) + self.sql_limit_retun_n_times_n2_slimitkeep_return_n_times_n2(sql,num,num2,tables,per_table_num,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_data_limit_retun_n_times_n2_slimitkeep_return_n_times_n2(sql,num,num2,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_data_limit_retun_n_times_n2_slimitkeep_return_n_times_n2(sql_union,num,num2,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_data_limit_retun_n_times_n2_slimitkeep_return_n_times_n2(sql_union_all,num,num2,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select a.tbname,last(a.*) cc from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts partition by a.tbname interval(1a) slimit %d limit %d" %(dbname,dbnamejoin,num,num2) + self.sql_limit_retun_n_times_n2_slimitkeep_return_n_times_n2(sql_join,num,num2,tables,per_table_num,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_data_limit_retun_n_times_n2_slimitkeep_return_n_times_n2(sql_join,num,num2,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_data_limit_retun_n_times_n2_slimitkeep_return_n_times_n2(sql_union,num,num2,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_data_limit_retun_n_times_n2_slimitkeep_return_n_times_n2(sql_union_all,num,num2,tables,per_table_num,base_fun,replace_fun) + + + tdLog.info("last query ---------21----------") + sql = "select tbname,last(ts) cc from %s.meters where ts is not null partition by tbname interval(1a) order by cc asc slimit %d limit %d" %(dbname,num,num2) + self.sql_limit_times_slimitkeep_return_n2(sql,num,num2,tables,per_table_num,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_data_limit_times_slimitkeep_return_n2(sql,num,num2,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_data_limit_times_slimitkeep_return_n2(sql_union,num,num2,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_data_limit_times_slimitkeep_return_n2(sql_union_all,num,num2,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select a.tbname,last(a.ts) cc from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts partition by a.tbname interval(1a) order by cc asc slimit %d limit %d" %(dbname,dbnamejoin,num,num2) + self.sql_limit_times_slimitkeep_return_n2(sql_join,num,num2,tables,per_table_num,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_data_limit_times_slimitkeep_return_n2(sql_join,num,num2,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_data_limit_times_slimitkeep_return_n2(sql_union,num,num2,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_data_limit_times_slimitkeep_return_n2(sql_union_all,num,num2,tables,per_table_num,base_fun,replace_fun) + + + tdLog.info("last query ---------22----------") + sql = "select tbname,last(ts) cc from %s.meters where ts is not null partition by tbname interval(1a) order by cc desc slimit %d limit %d" %(dbname,num,num2) + self.sql_limit_times_slimitkeep_return_n2(sql,num,num2,tables,per_table_num,base_fun,replace_fun) + sql = "select count(*) from (%s)" %sql + self.sql_data_limit_times_slimitkeep_return_n2(sql,num,num2,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql,sql) + self.sql_data_limit_times_slimitkeep_return_n2(sql_union,num,num2,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql,sql_union) + self.sql_data_limit_times_slimitkeep_return_n2(sql_union_all,num,num2,tables,per_table_num,base_fun,replace_fun) + + sql_join = "select a.tbname,last(a.ts) cc from %s.meters a,%s.meters b where a.ts is not null and a.ts = b.ts partition by a.tbname interval(1a) order by cc desc slimit %d limit %d" %(dbname,dbnamejoin,num,num2) + self.sql_limit_times_slimitkeep_return_n2(sql_join,num,num2,tables,per_table_num,base_fun,replace_fun) + sql_join = "select count(*) from (%s)" %sql_join + self.sql_data_limit_times_slimitkeep_return_n2(sql_join,num,num2,tables,per_table_num,base_fun,replace_fun) + sql_union = "(%s) union (%s)" %(sql_join,sql_join) + self.sql_data_limit_times_slimitkeep_return_n2(sql_union,num,num2,tables,per_table_num,base_fun,replace_fun) + sql_union_all = "(%s) union all (%s)" %(sql_join,sql_union) + self.sql_data_limit_times_slimitkeep_return_n2(sql_union_all,num,num2,tables,per_table_num,base_fun,replace_fun) + + + + + + def sql_base_check(self,sql1,sql2): + tdSql.query(sql1) + sql1_result = tdSql.getData(0,0) + tdLog.info("sql:%s , result: %s" %(sql1,sql1_result)) + + tdSql.query(sql2) + sql2_result = tdSql.getData(0,0) + tdLog.info("sql:%s , result: %s" %(sql2,sql2_result)) + + if sql1_result==sql2_result: + tdLog.info(f"checkEqual success, sql1_result={sql1_result},sql2_result={sql2_result}") + else : + tdLog.exit(f"checkEqual error, sql1_result=={sql1_result},sql2_result={sql2_result}") + + def run_limit_slimit_sql(self,dbname,tables,per_table_num,dbnamejoin): + + num,num2 = random.randint(10,100),random.randint(10,100) + self.sql_base(dbname,num,num2,tables,per_table_num,dbnamejoin) + + tdSql.execute(" flush database %s;" %dbname) + + self.sql_base(dbname,num,num2,tables,per_table_num,dbnamejoin) + + def check_sub(self,dbname): + + sql = "select count(*) from (select distinct(tbname) from %s.meters)" %dbname + self.sql_query_time_cost(sql) + num = tdSql.getData(0,0) + + for i in range(0,num): + sql1 = "select count(*) from %s.d%d" %(dbname,i) + self.sql_query_time_cost(sql1) + sql1_result = tdSql.getData(0,0) + tdLog.info("sql:%s , result: %s" %(sql1,sql1_result)) + + + def sql_base(self,dbname,num,num2,tables,per_table_num,dbnamejoin): + + sql = "select count(*) from %s.meters" %dbname + self.sql_query_time_cost(sql) + tdSql.checkData(0,0,tables*per_table_num) + sql = "select count(*) from %s.meters" %dbnamejoin + self.sql_query_time_cost(sql) + + self.fun_base(dbname,num,num2,tables,per_table_num,dbnamejoin,'*','*') + # self.fun_count(dbname,num,num2,tables,per_table_num,dbnamejoin,'count','count') + # self.fun_last(dbname,num,num2,tables,per_table_num,dbnamejoin,'last','last') + # #self.fun_last(dbname,num,num2,tables,per_table_num,dbnamejoin,'last','last_row') + # self.fun_last(dbname,num,num2,tables,per_table_num,dbnamejoin,'last','first') + + def test(self,dbname,tables,per_table_num,vgroups,replica,dbnamejoin): + self.run_benchmark(dbname,tables,per_table_num,vgroups,replica) + self.run_benchmark(dbnamejoin,tables,per_table_num,vgroups,replica) + self.run_limit_slimit_sql(dbname,tables,per_table_num,dbnamejoin) + + def run(self): + startTime = time.time() + + dbname = 'test' + dbnamejoin = 'testjoin' + vgroups = random.randint(1,8) + tables = random.randint(100,300) + per_table_num = random.randint(100,500) + replica = 1 + #self.test('test',tables,per_table_num,vgroup,1) + #self.test('test',10000,150,vgroup,1) + + self.test('test',100,150,vgroups,1,'testjoin') #方便调试,调试时不执行下面3个 + + # self.run_benchmark(dbname,tables,per_table_num,vgroups,replica) + # self.run_benchmark(dbnamejoin,tables*vgroups,per_table_num*vgroups,vgroups*2,replica) #方便测试不同数据量 + # self.run_limit_slimit_sql(dbname,tables,per_table_num,dbnamejoin) + + endTime = time.time() + print("total time %ds" % (endTime - startTime)) + + + def stop(self): + tdSql.close() + tdLog.success("%s successfully executed" % __file__) + + +tdCases.addWindows(__file__, TDTestCase()) +tdCases.addLinux(__file__, TDTestCase()) From 60a6f733fd60ec546f00422df4d716b719ceeb74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Chappyguoxy=E2=80=9D?= <“happy_guoxy@163.com”> Date: Mon, 24 Apr 2023 10:30:10 +0800 Subject: [PATCH 20/46] test: refine query cases --- tests/system-test/2-query/select_null.py | 446 +++++++++++++++++++++++ 1 file changed, 446 insertions(+) create mode 100755 tests/system-test/2-query/select_null.py diff --git a/tests/system-test/2-query/select_null.py b/tests/system-test/2-query/select_null.py new file mode 100755 index 0000000000..68eea8bc67 --- /dev/null +++ b/tests/system-test/2-query/select_null.py @@ -0,0 +1,446 @@ +################################################################### +# Copyright (c) 2016 by TAOS Technologies, Inc. +# All rights reserved. +# +# This file is proprietary and confidential to TAOS Technologies. +# No part of this file may be reproduced, stored, transmitted, +# disclosed or used in any form or by any means other than as +# expressly provided by the written permission from Jianhui Tao +# +################################################################### + +# -*- coding: utf-8 -*- + +import random +import os +import time +import taos +import subprocess +from faker import Faker +from util.log import tdLog +from util.cases import tdCases +from util.sql import tdSql +from util.dnodes import tdDnodes +from util.dnodes import * + +class TDTestCase: + + def init(self, conn, logSql, replicaVar): + tdLog.debug("start to execute %s" % __file__) + tdSql.init(conn.cursor(), logSql) + + self.testcasePath = os.path.split(__file__)[0] + self.testcaseFilename = os.path.split(__file__)[-1] + os.system("rm -rf %s/%s.sql" % (self.testcasePath,self.testcaseFilename)) + + self.db = "sel_null" + + def insert_data(self,database,vgroups): + num_random = 10 + tdSql.execute('''drop database if exists %s ;''' %database) + tdSql.execute('''create database %s keep 36500 vgroups %d PRECISION 'us';'''%(database,vgroups)) + tdSql.execute('''use %s;'''%database) + + tdSql.execute('''create stable %s.stb0 (ts timestamp , c0 int , c1 double , c0null int , c1null double ) tags( t0 tinyint , t1 varchar(16) , t_int int , t_bigint bigint , t_smallint smallint , t_tinyint tinyint , t_bool bool , t_binary binary(100) , t_nchar nchar(100) ,t_float float , t_double double , t_ts timestamp);'''%database) + + for i in range(5): + tdSql.execute('''create table %s.stb0_%d using %s.stb0 tags(%d,'varchar%d',%d,%d, %d, %d,%d,'binary%d','nchar%d',%d,%d,%d ) ;'''%(database,i,database,i,i,i,i,i,i,i,i,i,i,i,i)) + + # insert data + for i in range(num_random): + for j in range(50): + tdSql.execute('''insert into %s.stb0_0 (ts , c1 , c0) values(now, %d, %d) ;''' % (database,j,j)) + tdSql.execute('''insert into %s.stb0_1 (ts , c1 , c0) values(now, %d, %d) ;''' % (database,j,j)) + tdSql.execute('''insert into %s.stb0_2 (ts , c1 , c0) values(now, %d, %d) ;''' % (database,j,j)) + tdSql.execute('''insert into %s.stb0_3 (ts , c1 , c0) values(now, %d, %d) ;''' % (database,j,j)) + tdSql.execute('''insert into %s.stb0_4 (ts , c1 , c0) values(now, %d, %d) ;''' % (database,j,j)) + + tdSql.query("select count(*) from %s.stb0;" %database) + tdSql.checkData(0,0,5*num_random*50) + tdSql.query("select count(*) from %s.stb0_0;"%database) + tdSql.checkData(0,0,num_random*50) + + def ts_3085(self,database): + sql = "select count(c0null) from(select * from %s.stb0 limit 20,4) "%(database) + tdSql.query(sql) + tdSql.checkData(0,0,0) + + offset = random.randint(10,100) + for i in range(offset): + sql = "select count(c0null) from(select * from %s.stb0 limit %d,%d) "%(database,offset,i) + tdSql.query(sql) + tdSql.checkData(0,0,0) + sql = "select count(c1null) from(select * from %s.stb0 limit %d,%d) "%(database,offset,i) + tdSql.query(sql) + tdSql.checkData(0,0,0) + sql = "select count(c0) from(select * from %s.stb0 limit %d,%d) "%(database,offset,i) + tdSql.query(sql) + tdSql.checkData(0,0,i) + sql = "select count(c1) from(select * from %s.stb0 limit %d,%d) "%(database,offset,i) + tdSql.query(sql) + tdSql.checkData(0,0,i) + sql = "select count(t0) from(select * from %s.stb0 limit %d,%d) "%(database,offset,i) + tdSql.query(sql) + tdSql.checkData(0,0,i) + sql = "select count(t1) from(select * from %s.stb0 limit %d,%d) "%(database,offset,i) + tdSql.query(sql) + tdSql.checkData(0,0,i) + + + def ts_2974_max(self,database): + sql = "select max(c0) from %s.stb0 where ts Date: Mon, 24 Apr 2023 10:31:27 +0800 Subject: [PATCH 21/46] test: refine query cases --- tests/parallel_test/cases.task | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/parallel_test/cases.task b/tests/parallel_test/cases.task index 6e662a9a15..7bb8f08363 100644 --- a/tests/parallel_test/cases.task +++ b/tests/parallel_test/cases.task @@ -51,6 +51,16 @@ ,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_math.py -Q 3 ,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_time.py -Q 3 ,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_26.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/select_null.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/select_null.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/select_null.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/select_null.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/select_null.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/slimit.py.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/slimit.py.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/slimit.py.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/slimit.py.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/slimit.py.py -Q 4 ,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/create_wrong_topic.py ,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/dropDbR3ConflictTransaction.py -N 3 From 3b8e8018b2991107b542c7c5830cbaae078d696b Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Mon, 24 Apr 2023 10:34:07 +0800 Subject: [PATCH 22/46] fix: get user errcode issue --- source/libs/catalog/src/ctgCache.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/libs/catalog/src/ctgCache.c b/source/libs/catalog/src/ctgCache.c index 0be2a78d48..ec087c1168 100644 --- a/source/libs/catalog/src/ctgCache.c +++ b/source/libs/catalog/src/ctgCache.c @@ -727,6 +727,7 @@ int32_t ctgGetCachedStbNameFromSuid(SCatalog* pCtg, char* dbFName, uint64_t suid } int32_t ctgChkAuthFromCache(SCatalog *pCtg, SUserAuthInfo *pReq, bool *inCache, SCtgAuthRsp *pRes) { + int32_t code = 0; if (IS_SYS_DBNAME(pReq->tbName.dbname)) { *inCache = true; pRes->pRawRes->pass = true; @@ -751,7 +752,7 @@ int32_t ctgChkAuthFromCache(SCatalog *pCtg, SUserAuthInfo *pReq, bool *inCache, CTG_LOCK(CTG_READ, &pUser->lock); memcpy(&req.authInfo, &pUser->userAuth, sizeof(pUser->userAuth)); - int32_t code = ctgChkSetAuthRes(pCtg, &req, pRes); + code = ctgChkSetAuthRes(pCtg, &req, pRes); CTG_UNLOCK(CTG_READ, &pUser->lock); CTG_ERR_JRET(code); From 905df6f7ac9b233b973d343b3e7990d79eef9b2a Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Mon, 24 Apr 2023 10:37:58 +0800 Subject: [PATCH 23/46] fix: memory leak issue --- source/libs/catalog/src/ctgUtil.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/libs/catalog/src/ctgUtil.c b/source/libs/catalog/src/ctgUtil.c index 62896e4307..4a5ddbac34 100644 --- a/source/libs/catalog/src/ctgUtil.c +++ b/source/libs/catalog/src/ctgUtil.c @@ -1371,6 +1371,8 @@ int32_t ctgChkSetTbAuthRes(SCatalog* pCtg, SCtgAuthReq* req, SCtgAuthRsp* res) { tNameGetFullDbName(&req->pRawReq->tbName, dbFName); while (true) { + taosMemoryFreeClear(pMeta); + char* pCond = taosHashGet(pTbs, tbFName, strlen(tbFName)); if (pCond) { if (strlen(pCond) > 1) { @@ -1412,7 +1414,7 @@ int32_t ctgChkSetTbAuthRes(SCatalog* pCtg, SCtgAuthReq* req, SCtgAuthRsp* res) { if (req->onlyCache) { res->metaNotExists = true; ctgDebug("suid %" PRIu64 " name not in cache for auth", pMeta->suid); - return TSDB_CODE_SUCCESS; + goto _return; } continue; From 8480c42234a2a948f296b5d318dd2125eeaafa5c Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Mon, 24 Apr 2023 10:41:28 +0800 Subject: [PATCH 24/46] fix: memory leak issue --- source/libs/catalog/src/ctgUtil.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/source/libs/catalog/src/ctgUtil.c b/source/libs/catalog/src/ctgUtil.c index 4a5ddbac34..0ec7a92b84 100644 --- a/source/libs/catalog/src/ctgUtil.c +++ b/source/libs/catalog/src/ctgUtil.c @@ -1376,11 +1376,11 @@ int32_t ctgChkSetTbAuthRes(SCatalog* pCtg, SCtgAuthReq* req, SCtgAuthRsp* res) { char* pCond = taosHashGet(pTbs, tbFName, strlen(tbFName)); if (pCond) { if (strlen(pCond) > 1) { - CTG_ERR_RET(nodesStringToNode(pCond, &res->pRawRes->pCond)); + CTG_ERR_JRET(nodesStringToNode(pCond, &res->pRawRes->pCond)); } res->pRawRes->pass = true; - return TSDB_CODE_SUCCESS; + goto _return; } if (stbName) { @@ -1388,19 +1388,19 @@ int32_t ctgChkSetTbAuthRes(SCatalog* pCtg, SCtgAuthReq* req, SCtgAuthRsp* res) { goto _return; } - CTG_ERR_RET(catalogGetCachedTableMeta(pCtg, &req->pRawReq->tbName, &pMeta)); + CTG_ERR_JRET(catalogGetCachedTableMeta(pCtg, &req->pRawReq->tbName, &pMeta)); if (NULL == pMeta) { if (req->onlyCache) { res->metaNotExists = true; ctgDebug("db %s tb %s meta not in cache for auth", req->pRawReq->tbName.dbname, req->pRawReq->tbName.tname); - return TSDB_CODE_SUCCESS; + goto _return; } SCtgTbMetaCtx ctx = {0}; ctx.pName = (SName*)&req->pRawReq->tbName; ctx.flag = CTG_FLAG_UNKNOWN_STB | CTG_FLAG_SYNC_OP; - CTG_ERR_RET(ctgGetTbMeta(pCtg, req->pConn, &ctx, &pMeta)); + CTG_ERR_JRET(ctgGetTbMeta(pCtg, req->pConn, &ctx, &pMeta)); } if (TSDB_SUPER_TABLE == pMeta->tableType || TSDB_NORMAL_TABLE == pMeta->tableType) { @@ -1431,6 +1431,7 @@ int32_t ctgChkSetTbAuthRes(SCatalog* pCtg, SCtgAuthReq* req, SCtgAuthRsp* res) { _return: taosMemoryFree(pMeta); + taosMemoryFree(stbName); CTG_RET(code); } From 24aff3d680d3cb2abd9d1fae2145bfcd2a935b7c Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Mon, 24 Apr 2023 10:46:32 +0800 Subject: [PATCH 25/46] fix: memory leak issue --- source/libs/catalog/src/ctgUtil.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/source/libs/catalog/src/ctgUtil.c b/source/libs/catalog/src/ctgUtil.c index 0ec7a92b84..a42a189e75 100644 --- a/source/libs/catalog/src/ctgUtil.c +++ b/source/libs/catalog/src/ctgUtil.c @@ -528,11 +528,18 @@ void ctgFreeTaskRes(CTG_TASK_TYPE type, void** pRes) { } break; } + case CTG_TASK_GET_USER: { + if (*pRes) { + SUserAuthRes* pAuth = (SUserAuthRes *)*pRes; + nodesDestroyNode(pAuth->pCond); + taosMemoryFreeClear(*pRes); + } + break; + } case CTG_TASK_GET_TB_HASH: case CTG_TASK_GET_DB_INFO: case CTG_TASK_GET_INDEX_INFO: case CTG_TASK_GET_UDF: - case CTG_TASK_GET_USER: case CTG_TASK_GET_SVR_VER: case CTG_TASK_GET_TB_META: { taosMemoryFreeClear(*pRes); From 76949a4ba05e12d2040ce8f2d4975e369c97b832 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Chappyguoxy=E2=80=9D?= <“happy_guoxy@163.com”> Date: Mon, 24 Apr 2023 12:14:18 +0800 Subject: [PATCH 26/46] test: refine query cases --- tests/parallel_test/cases.task | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/parallel_test/cases.task b/tests/parallel_test/cases.task index 7bb8f08363..c3841d3132 100644 --- a/tests/parallel_test/cases.task +++ b/tests/parallel_test/cases.task @@ -56,11 +56,11 @@ ,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/select_null.py -Q 2 ,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/select_null.py -Q 3 ,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/select_null.py -Q 4 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/slimit.py.py -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/slimit.py.py -R -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/slimit.py.py -Q 2 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/slimit.py.py -Q 3 -,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/slimit.py.py -Q 4 +#,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/slimit.py.py +#,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/slimit.py.py -R +#,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/slimit.py.py -Q 2 +#,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/slimit.py.py -Q 3 +#,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/slimit.py.py -Q 4 ,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/create_wrong_topic.py ,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/dropDbR3ConflictTransaction.py -N 3 From 1f6fc336c1678da694af9fd1ae698811ebdf77c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Chappyguoxy=E2=80=9D?= <“happy_guoxy@163.com”> Date: Mon, 24 Apr 2023 14:02:26 +0800 Subject: [PATCH 27/46] test: refine query cases --- tests/parallel_test/cases.task | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/parallel_test/cases.task b/tests/parallel_test/cases.task index c3841d3132..97858e5d71 100644 --- a/tests/parallel_test/cases.task +++ b/tests/parallel_test/cases.task @@ -56,11 +56,11 @@ ,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/select_null.py -Q 2 ,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/select_null.py -Q 3 ,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/select_null.py -Q 4 -#,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/slimit.py.py -#,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/slimit.py.py -R -#,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/slimit.py.py -Q 2 -#,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/slimit.py.py -Q 3 -#,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/slimit.py.py -Q 4 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/slimit.py +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/slimit.py -R +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/slimit.py -Q 2 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/slimit.py -Q 3 +,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/slimit.py -Q 4 ,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/create_wrong_topic.py ,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/dropDbR3ConflictTransaction.py -N 3 From 782566ad081d7ecb35b2dd3720cc0214cea5b0eb Mon Sep 17 00:00:00 2001 From: Ganlin Zhao Date: Mon, 24 Apr 2023 17:15:46 +0800 Subject: [PATCH 28/46] refactor --- include/common/systable.h | 3 +-- source/common/src/systable.c | 4 ---- source/libs/parser/src/parTranslater.c | 9 ++++----- 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/include/common/systable.h b/include/common/systable.h index 6e0c67bb3f..ea18338e9e 100644 --- a/include/common/systable.h +++ b/include/common/systable.h @@ -12,7 +12,7 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ - + #ifndef TDENGINE_SYSTABLE_H #define TDENGINE_SYSTABLE_H @@ -77,7 +77,6 @@ void getInfosDbMeta(const SSysTableMeta** pInfosTableMeta, size_t* size); void getPerfDbMeta(const SSysTableMeta** pPerfsTableMeta, size_t* size); void getVisibleInfosTablesNum(bool sysInfo, size_t* size); bool invisibleColumn(bool sysInfo, int8_t tableType, int8_t flags); -bool isSystemDb(const char *dbName); #ifdef __cplusplus } diff --git a/source/common/src/systable.c b/source/common/src/systable.c index de95a4a5be..cd3dd63ef0 100644 --- a/source/common/src/systable.c +++ b/source/common/src/systable.c @@ -448,7 +448,3 @@ bool invisibleColumn(bool sysInfo, int8_t tableType, int8_t flags) { } return 0 != (flags & COL_IS_SYSINFO); } - -bool isSystemDb(const char *dbName) { - return ((strcasecmp(dbName, TSDB_INFORMATION_SCHEMA_DB) == 0) || (strcasecmp(dbName, TSDB_PERFORMANCE_SCHEMA_DB) == 0)); -} diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index 52451d35a8..97fee72bf8 100644 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -2580,6 +2580,10 @@ static int32_t translateTable(STranslateContext* pCxt, SNode* pTable) { if (TSDB_SYSTEM_TABLE == pRealTable->pMeta->tableType && isSelectStmt(pCxt->pCurrStmt)) { ((SSelectStmt*)pCxt->pCurrStmt)->isTimeLineResult = false; } + if (TSDB_SYSTEM_TABLE == pRealTable->pMeta->tableType && isDeleteStmt(pCxt->pCurrStmt)) { + code = TSDB_CODE_TSC_INVALID_OPERATION; + break; + } code = addNamespace(pCxt, pRealTable); } break; @@ -3792,11 +3796,6 @@ static int32_t translateDeleteWhere(STranslateContext* pCxt, SDeleteStmt* pDelet } static int32_t translateDelete(STranslateContext* pCxt, SDeleteStmt* pDelete) { - // check delete from system tables - if (isSystemDb(((SRealTableNode*)pDelete->pFromTable)->table.dbName)) { - return TSDB_CODE_TSC_INVALID_OPERATION; - } - pCxt->pCurrStmt = (SNode*)pDelete; int32_t code = translateFrom(pCxt, pDelete->pFromTable); if (TSDB_CODE_SUCCESS == code) { From 80621e14eba7e8d6e70793f730c95494524a644d Mon Sep 17 00:00:00 2001 From: Ganlin Zhao Date: Mon, 24 Apr 2023 17:15:46 +0800 Subject: [PATCH 29/46] refactor --- source/libs/parser/src/parTranslater.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index 97fee72bf8..c7552445e3 100644 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -2577,12 +2577,13 @@ static int32_t translateTable(STranslateContext* pCxt, SNode* pTable) { if (TSDB_SUPER_TABLE == pRealTable->pMeta->tableType) { pCxt->stableQuery = true; } - if (TSDB_SYSTEM_TABLE == pRealTable->pMeta->tableType && isSelectStmt(pCxt->pCurrStmt)) { - ((SSelectStmt*)pCxt->pCurrStmt)->isTimeLineResult = false; - } - if (TSDB_SYSTEM_TABLE == pRealTable->pMeta->tableType && isDeleteStmt(pCxt->pCurrStmt)) { - code = TSDB_CODE_TSC_INVALID_OPERATION; - break; + if (TSDB_SYSTEM_TABLE == pRealTable->pMeta->tableType) { + if (isSelectStmt(pCxt->pCurrStmt)) { + ((SSelectStmt*)pCxt->pCurrStmt)->isTimeLineResult = false; + } else if (isDeleteStmt(pCxt->pCurrStmt)) { + code = TSDB_CODE_TSC_INVALID_OPERATION; + break; + } } code = addNamespace(pCxt, pRealTable); } From 8c4b73a351b3f5e8c05b9babe9fd42298abc865a Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Mon, 24 Apr 2023 19:19:12 +0800 Subject: [PATCH 30/46] feat: add get table tag sync API --- include/libs/catalog/catalog.h | 2 ++ source/libs/catalog/src/catalog.c | 57 +++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/include/libs/catalog/catalog.h b/include/libs/catalog/catalog.h index 6f2fb4eb6b..429e7ffa73 100644 --- a/include/libs/catalog/catalog.h +++ b/include/libs/catalog/catalog.h @@ -314,6 +314,8 @@ int32_t catalogGetIndexMeta(SCatalog* pCtg, SRequestConnInfo* pConn, const char* int32_t catalogGetTableIndex(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName, SArray** pRes); +int32_t catalogGetTableTag(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName, SArray** pRes); + int32_t catalogRefreshGetTableCfg(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName, STableCfg** pCfg); int32_t catalogUpdateTableIndex(SCatalog* pCtg, STableIndexRsp* pRsp); diff --git a/source/libs/catalog/src/catalog.c b/source/libs/catalog/src/catalog.c index b263654e70..976a38c03d 100644 --- a/source/libs/catalog/src/catalog.c +++ b/source/libs/catalog/src/catalog.c @@ -429,6 +429,48 @@ int32_t ctgGetTbCfg(SCatalog* pCtg, SRequestConnInfo* pConn, SName* pTableName, CTG_RET(TSDB_CODE_SUCCESS); } +int32_t ctgGetTbTag(SCatalog* pCtg, SRequestConnInfo* pConn, SName* pTableName, SArray** pRes) { + SVgroupInfo vgroupInfo = {0}; + STableCfg* pCfg = NULL; + int32_t code = 0; + + CTG_ERR_RET(ctgGetTbHashVgroup(pCtg, pConn, pTableName, &vgroupInfo, NULL)); + CTG_ERR_RET(ctgGetTableCfgFromVnode(pCtg, pConn, pTableName, &vgroupInfo, &pCfg, NULL)); + + if (NULL == pCfg->pTags || pCfg->tagsLen <= 0) { + ctgError("invalid tag in tbCfg rsp, pTags:%p, len:%d", pCfg->pTags, pCfg->tagsLen); + CTG_ERR_JRET(TSDB_CODE_INVALID_MSG); + } + + SArray* pTagVals = NULL; + STag* pTag = (STag*)pCfg->pTags; + + if (tTagIsJson(pTag)) { + pTagVals = taosArrayInit(1, sizeof(STagVal)); + if (NULL == pTagVals) { + CTG_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY); + } + + char* pJson = parseTagDatatoJson(pTag); + STagVal tagVal; + tagVal.cid = 0; + tagVal.type = TSDB_DATA_TYPE_JSON; + tagVal.pData = pJson; + tagVal.nData = strlen(pJson); + taosArrayPush(pTagVals, &tagVal); + } else { + CTG_ERR_JRET(tTagToValArray((const STag*)pCfg->pTags, &pTagVals)); + } + + *pRes = pTagVals; + +_return: + + tFreeSTableCfgRsp((STableCfgRsp*)pCfg); + + CTG_RET(code); +} + int32_t ctgGetTbDistVgInfo(SCatalog* pCtg, SRequestConnInfo* pConn, SName* pTableName, SArray** pVgList) { STableMeta* tbMeta = NULL; int32_t code = 0; @@ -1414,6 +1456,21 @@ _return: CTG_API_LEAVE(code); } +int32_t catalogGetTableTag(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName, SArray** pRes) { + CTG_API_ENTER(); + + if (NULL == pCtg || NULL == pConn || NULL == pTableName || NULL == pRes) { + CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT); + } + + int32_t code = 0; + CTG_ERR_JRET(ctgGetTbTag(pCtg, pConn, (SName*)pTableName, pRes)); + +_return: + + CTG_API_LEAVE(code); +} + int32_t catalogRefreshGetTableCfg(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName, STableCfg** pCfg) { CTG_API_ENTER(); From 59ae3ecc2c17130049beace271c5950875bb9800 Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Mon, 24 Apr 2023 20:10:39 +0800 Subject: [PATCH 31/46] opti:test cases for tmq --- tests/system-test/7-tmq/subscribeDb3.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/system-test/7-tmq/subscribeDb3.py b/tests/system-test/7-tmq/subscribeDb3.py index 22004a95f1..5b5326cfba 100644 --- a/tests/system-test/7-tmq/subscribeDb3.py +++ b/tests/system-test/7-tmq/subscribeDb3.py @@ -10,6 +10,7 @@ from util.log import * from util.sql import * from util.cases import * from util.dnodes import * +sys.path.append("./7-tmq") from tmqCommon import * class TDTestCase: From d57676c924870faf5dcc5be9a42d699b2d0cbf46 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Tue, 25 Apr 2023 09:52:16 +0800 Subject: [PATCH 32/46] fix: delete table error --- source/dnode/vnode/src/meta/metaTable.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/source/dnode/vnode/src/meta/metaTable.c b/source/dnode/vnode/src/meta/metaTable.c index 2b5bc36acb..96eec89127 100644 --- a/source/dnode/vnode/src/meta/metaTable.c +++ b/source/dnode/vnode/src/meta/metaTable.c @@ -936,8 +936,7 @@ static int metaDropTableByUid(SMeta *pMeta, tb_uid_t uid, int *type) { int tLen = 0; if (tdbTbGet(pMeta->pUidIdx, &e.ctbEntry.suid, sizeof(tb_uid_t), &tData, &tLen) == 0) { - version = ((SUidIdxVal *)tData)[0].version; - STbDbKey tbDbKey = {.uid = e.ctbEntry.suid, .version = version}; + STbDbKey tbDbKey = {.uid = e.ctbEntry.suid, .version = ((SUidIdxVal *)tData)[0].version}; if (tdbTbGet(pMeta->pTbDb, &tbDbKey, sizeof(tbDbKey), &tData, &tLen) == 0) { SDecoder tdc = {0}; SMetaEntry stbEntry = {0}; From f264f29bbda2f238d782259178f5f611794942f1 Mon Sep 17 00:00:00 2001 From: haoranchen Date: Tue, 25 Apr 2023 11:17:49 +0800 Subject: [PATCH 33/46] fix: restore ci buildPath --- tests/parallel_test/run.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/parallel_test/run.sh b/tests/parallel_test/run.sh index de343752c6..f05e0dfc83 100755 --- a/tests/parallel_test/run.sh +++ b/tests/parallel_test/run.sh @@ -303,7 +303,7 @@ function run_thread() { if [ ! -z "$corefile" ]; then echo -e "\e[34m corefiles: $corefile \e[0m" local build_dir=$log_dir/build_${hosts[index]} - local remote_build_dir="${workdirs[index]}/{DEBUGPATH}/build" + local remote_build_dir="${workdirs[index]}/${DEBUGPATH}/build" # if [ $ent -ne 0 ]; then # remote_build_dir="${workdirs[index]}/{DEBUGPATH}/build" # fi From aede1090ff2c6f7144de1d88f647bcda18174178 Mon Sep 17 00:00:00 2001 From: slzhou Date: Tue, 25 Apr 2023 16:23:30 +0800 Subject: [PATCH 34/46] fix: the latest schema may delete columns --- source/dnode/vnode/src/tsdb/tsdbUtil.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbUtil.c b/source/dnode/vnode/src/tsdb/tsdbUtil.c index 8e778da877..8cbbcb751c 100644 --- a/source/dnode/vnode/src/tsdb/tsdbUtil.c +++ b/source/dnode/vnode/src/tsdb/tsdbUtil.c @@ -1218,9 +1218,10 @@ int32_t tBlockDataInit(SBlockData *pBlockData, TABLEID *pId, STSchema *pTSchema, int32_t iColumn = 1; STColumn *pTColumn = &pTSchema->columns[iColumn]; for (int32_t iCid = 0; iCid < nCid; iCid++) { - if (ASSERTS(pTColumn != NULL, "invalid input param")) { - code = TSDB_CODE_INVALID_PARA; - goto _exit; + + // aCid array (from taos client catalog) contains columns that does not exist in the pTSchema. the pTSchema is newer + if (pTColumn == NULL) { + continue; } while (pTColumn->colId < aCid[iCid]) { @@ -1229,9 +1230,8 @@ int32_t tBlockDataInit(SBlockData *pBlockData, TABLEID *pId, STSchema *pTSchema, pTColumn = &pTSchema->columns[iColumn]; } - if (ASSERTS(pTColumn->colId == aCid[iCid], "invalid input param")) { - code = TSDB_CODE_INVALID_PARA; - goto _exit; + if (pTColumn->colId != aCid[iCid]) { + continue; } tColDataInit(&pBlockData->aColData[iCid], pTColumn->colId, pTColumn->type, From ee93500619e91ff6e7851171c2b38ec9d13859f8 Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Tue, 25 Apr 2023 17:03:58 +0800 Subject: [PATCH 35/46] fix: log file size over 4G report error on windows --- source/os/src/osFile.c | 3 ++- source/util/src/tlog.c | 4 +--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/source/os/src/osFile.c b/source/os/src/osFile.c index aab547223f..9833e3ba45 100644 --- a/source/os/src/osFile.c +++ b/source/os/src/osFile.c @@ -538,10 +538,11 @@ int32_t taosFStatFile(TdFilePtr pFile, int64_t *size, int32_t *mtime) { return -1; } - struct stat fileStat; #ifdef WINDOWS + struct __stat64 fileStat; int32_t code = _fstat(pFile->fd, &fileStat); #else + struct stat fileStat; int32_t code = fstat(pFile->fd, &fileStat); #endif if (code < 0) { diff --git a/source/util/src/tlog.c b/source/util/src/tlog.c index 2a18f420cd..d415379f92 100644 --- a/source/util/src/tlog.c +++ b/source/util/src/tlog.c @@ -347,7 +347,6 @@ static int32_t taosOpenLogFile(char *fn, int32_t maxLines, int32_t maxFileNum) { char name[LOG_FILE_NAME_LEN + 50] = "\0"; int32_t logstat0_mtime, logstat1_mtime; - int32_t size; tsLogObj.maxLines = maxLines; tsLogObj.fileNum = maxFileNum; @@ -395,8 +394,7 @@ static int32_t taosOpenLogFile(char *fn, int32_t maxLines, int32_t maxFileNum) { printf("\nfailed to fstat log file:%s, reason:%s\n", fileName, strerror(errno)); return -1; } - size = (int32_t)filesize; - tsLogObj.lines = size / 60; + tsLogObj.lines = (int32_t)(filesize / 60); taosLSeekFile(tsLogObj.logHandle->pFile, 0, SEEK_END); From 97a5ebac1c5154458bf13a5e7b63a41cd555713d Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Tue, 25 Apr 2023 17:10:12 +0800 Subject: [PATCH 36/46] fix: miss out _fstat64 --- source/os/src/osFile.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/os/src/osFile.c b/source/os/src/osFile.c index 9833e3ba45..dd670595f0 100644 --- a/source/os/src/osFile.c +++ b/source/os/src/osFile.c @@ -540,7 +540,7 @@ int32_t taosFStatFile(TdFilePtr pFile, int64_t *size, int32_t *mtime) { #ifdef WINDOWS struct __stat64 fileStat; - int32_t code = _fstat(pFile->fd, &fileStat); + int32_t code = _fstat64(pFile->fd, &fileStat); #else struct stat fileStat; int32_t code = fstat(pFile->fd, &fileStat); From 49728a235e83f58df0a995e6a4c88779d9980d9b Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Tue, 25 Apr 2023 17:32:45 +0800 Subject: [PATCH 37/46] fix: more fix --- source/dnode/vnode/src/inc/tsdb.h | 5 +- source/dnode/vnode/src/tsdb/tsdbDataIter.c | 61 ++++++++++++++-------- source/dnode/vnode/src/tsdb/tsdbSnapshot.c | 26 +++++---- 3 files changed, 57 insertions(+), 35 deletions(-) diff --git a/source/dnode/vnode/src/inc/tsdb.h b/source/dnode/vnode/src/inc/tsdb.h index 2a85b191a4..4d3111a9b7 100644 --- a/source/dnode/vnode/src/inc/tsdb.h +++ b/source/dnode/vnode/src/inc/tsdb.h @@ -322,8 +322,9 @@ int32_t tGnrtDiskData(SDiskDataBuilder *pBuilder, const SDiskData **ppDiskData, #define TSDB_STT_FILE_DATA_ITER 2 #define TSDB_TOMB_FILE_DATA_ITER 3 -#define TSDB_FILTER_FLAG_BY_VERSION 0x1 -#define TSDB_FILTER_FLAG_BY_TABLEID 0x2 +#define TSDB_FILTER_FLAG_BY_VERSION 0x1 +#define TSDB_FILTER_FLAG_BY_TABLEID 0x2 +#define TSDB_FILTER_FLAG_IGNORE_DROPPED_TABLE 0x4 #define TSDB_RBTN_TO_DATA_ITER(pNode) ((STsdbDataIter2 *)(((char *)pNode) - offsetof(STsdbDataIter2, rbtn))) /* open */ diff --git a/source/dnode/vnode/src/tsdb/tsdbDataIter.c b/source/dnode/vnode/src/tsdb/tsdbDataIter.c index 3299a2f497..e27aec5b1b 100644 --- a/source/dnode/vnode/src/tsdb/tsdbDataIter.c +++ b/source/dnode/vnode/src/tsdb/tsdbDataIter.c @@ -14,6 +14,7 @@ */ #include "tsdb.h" +#include "vnodeInt.h" // STsdbDataIter2 /* open */ @@ -202,13 +203,6 @@ static int32_t tsdbDataFileDataIterNext(STsdbDataIter2* pIter, STsdbFilterInfo* for (;;) { while (pIter->dIter.iRow < pIter->dIter.bData.nRow) { if (pFilterInfo) { - if (pFilterInfo->flag & TSDB_FILTER_FLAG_BY_TABLEID) { - if (pFilterInfo->tbid.uid == pIter->dIter.bData.uid) { - pIter->dIter.iRow = pIter->dIter.bData.nRow; - continue; - } - } - if (pFilterInfo->flag & TSDB_FILTER_FLAG_BY_VERSION) { if (pIter->dIter.bData.aVersion[pIter->dIter.iRow] < pFilterInfo->sver || pIter->dIter.bData.aVersion[pIter->dIter.iRow] > pFilterInfo->ever) { @@ -232,13 +226,6 @@ static int32_t tsdbDataFileDataIterNext(STsdbDataIter2* pIter, STsdbFilterInfo* // filter if (pFilterInfo) { - if (pFilterInfo->flag & TSDB_FILTER_FLAG_BY_TABLEID) { - if (tTABLEIDCmprFn(&pFilterInfo->tbid, &pIter->rowInfo) == 0) { - pIter->dIter.iDataBlk = pIter->dIter.mDataBlk.nItem; - continue; - } - } - if (pFilterInfo->flag & TSDB_FILTER_FLAG_BY_VERSION) { if (pFilterInfo->sver > dataBlk.maxVer || pFilterInfo->ever < dataBlk.minVer) { pIter->dIter.iDataBlk++; @@ -262,13 +249,23 @@ static int32_t tsdbDataFileDataIterNext(STsdbDataIter2* pIter, STsdbFilterInfo* if (pIter->dIter.iBlockIdx < taosArrayGetSize(pIter->dIter.aBlockIdx)) { SBlockIdx* pBlockIdx = taosArrayGet(pIter->dIter.aBlockIdx, pIter->dIter.iBlockIdx); - if (pFilterInfo && (pFilterInfo->flag & TSDB_FILTER_FLAG_BY_TABLEID)) { - int32_t c = tTABLEIDCmprFn(pBlockIdx, &pFilterInfo->tbid); - if (c == 0) { - pIter->dIter.iBlockIdx++; - continue; - } else if (c < 0) { - ASSERT(0); + if (pFilterInfo) { + if (pFilterInfo->flag & TSDB_FILTER_FLAG_BY_TABLEID) { + int32_t c = tTABLEIDCmprFn(pBlockIdx, &pFilterInfo->tbid); + if (c == 0) { + pIter->dIter.iBlockIdx++; + continue; + } else if (c < 0) { + ASSERT(0); + } + } + + if (pFilterInfo->flag & TSDB_FILTER_FLAG_IGNORE_DROPPED_TABLE) { + SMetaInfo info; + if (metaGetInfo(pIter->dIter.pReader->pTsdb->pVnode->pMeta, pBlockIdx->uid, &info, NULL)) { + pIter->dIter.iBlockIdx++; + continue; + } } } @@ -304,14 +301,24 @@ static int32_t tsdbSttFileDataIterNext(STsdbDataIter2* pIter, STsdbFilterInfo* p for (;;) { while (pIter->sIter.iRow < pIter->sIter.bData.nRow) { if (pFilterInfo) { + int64_t uid = pIter->sIter.bData.uid ? pIter->sIter.bData.uid : pIter->sIter.bData.aUid[pIter->sIter.iRow]; if (pFilterInfo->flag & TSDB_FILTER_FLAG_BY_TABLEID) { - int64_t uid = pIter->sIter.bData.uid ? pIter->sIter.bData.uid : pIter->sIter.bData.aUid[pIter->sIter.iRow]; if (pFilterInfo->tbid.uid == uid) { pIter->sIter.iRow++; continue; } } + if (pFilterInfo->flag & TSDB_FILTER_FLAG_IGNORE_DROPPED_TABLE) { + if (pIter->rowInfo.uid != uid) { + SMetaInfo info; + if (metaGetInfo(pIter->sIter.pReader->pTsdb->pVnode->pMeta, uid, &info, NULL)) { + pIter->sIter.iRow++; + continue; + } + } + } + if (pFilterInfo->flag & TSDB_FILTER_FLAG_BY_VERSION) { if (pFilterInfo->sver > pIter->sIter.bData.aVersion[pIter->sIter.iRow] || pFilterInfo->ever < pIter->sIter.bData.aVersion[pIter->sIter.iRow]) { @@ -395,6 +402,16 @@ static int32_t tsdbTombFileDataIterNext(STsdbDataIter2* pIter, STsdbFilterInfo* if (pIter->tIter.iDelIdx < taosArrayGetSize(pIter->tIter.aDelIdx)) { SDelIdx* pDelIdx = taosArrayGet(pIter->tIter.aDelIdx, pIter->tIter.iDelIdx); + if (pFilterInfo) { + if (pFilterInfo->flag & TSDB_FILTER_FLAG_IGNORE_DROPPED_TABLE) { + SMetaInfo info; + if (metaGetInfo(pIter->dIter.pReader->pTsdb->pVnode->pMeta, pDelIdx->uid, &info, NULL)) { + pIter->tIter.iDelIdx++; + continue; + } + } + } + code = tsdbReadDelData(pIter->tIter.pReader, pDelIdx, pIter->tIter.aDelData); TSDB_CHECK_CODE(code, lino, _exit); diff --git a/source/dnode/vnode/src/tsdb/tsdbSnapshot.c b/source/dnode/vnode/src/tsdb/tsdbSnapshot.c index aed863d194..dfea125cc1 100644 --- a/source/dnode/vnode/src/tsdb/tsdbSnapshot.c +++ b/source/dnode/vnode/src/tsdb/tsdbSnapshot.c @@ -70,10 +70,11 @@ static int32_t tsdbSnapReadFileDataStart(STsdbSnapReader* pReader) { if (pReader->pIter) { // iter to next with filter info (sver, ever) - code = tsdbDataIterNext2(pReader->pIter, - &(STsdbFilterInfo){.flag = TSDB_FILTER_FLAG_BY_VERSION, // flag - .sver = pReader->sver, - .ever = pReader->ever}); + code = tsdbDataIterNext2( + pReader->pIter, + &(STsdbFilterInfo){.flag = TSDB_FILTER_FLAG_BY_VERSION | TSDB_FILTER_FLAG_IGNORE_DROPPED_TABLE, // flag + .sver = pReader->sver, + .ever = pReader->ever}); TSDB_CHECK_CODE(code, lino, _exit); if (pReader->pIter->rowInfo.suid || pReader->pIter->rowInfo.uid) { @@ -94,10 +95,11 @@ static int32_t tsdbSnapReadFileDataStart(STsdbSnapReader* pReader) { if (pReader->pIter) { // iter to valid row - code = tsdbDataIterNext2(pReader->pIter, - &(STsdbFilterInfo){.flag = TSDB_FILTER_FLAG_BY_VERSION, // flag - .sver = pReader->sver, - .ever = pReader->ever}); + code = tsdbDataIterNext2( + pReader->pIter, + &(STsdbFilterInfo){.flag = TSDB_FILTER_FLAG_BY_VERSION | TSDB_FILTER_FLAG_IGNORE_DROPPED_TABLE, // flag + .sver = pReader->sver, + .ever = pReader->ever}); TSDB_CHECK_CODE(code, lino, _exit); if (pReader->pIter->rowInfo.suid || pReader->pIter->rowInfo.uid) { @@ -139,7 +141,8 @@ static int32_t tsdbSnapReadNextRow(STsdbSnapReader* pReader, SRowInfo** ppRowInf int32_t lino = 0; if (pReader->pIter) { - code = tsdbDataIterNext2(pReader->pIter, &(STsdbFilterInfo){.flag = TSDB_FILTER_FLAG_BY_VERSION, // flag + code = tsdbDataIterNext2(pReader->pIter, &(STsdbFilterInfo){.flag = TSDB_FILTER_FLAG_BY_VERSION | + TSDB_FILTER_FLAG_IGNORE_DROPPED_TABLE, // flag .sver = pReader->sver, .ever = pReader->ever}); TSDB_CHECK_CODE(code, lino, _exit); @@ -346,8 +349,9 @@ static int32_t tsdbSnapReadNextTombData(STsdbSnapReader* pReader, SDelInfo** ppD int32_t lino = 0; code = tsdbDataIterNext2( - pReader->pTIter, - &(STsdbFilterInfo){.flag = TSDB_FILTER_FLAG_BY_VERSION, .sver = pReader->sver, .ever = pReader->ever}); + pReader->pTIter, &(STsdbFilterInfo){.flag = TSDB_FILTER_FLAG_BY_VERSION | TSDB_FILTER_FLAG_IGNORE_DROPPED_TABLE, + .sver = pReader->sver, + .ever = pReader->ever}); TSDB_CHECK_CODE(code, lino, _exit); if (ppDelInfo) { From e584bb3ea17e272135a5cbfdb8b13b94749d991c Mon Sep 17 00:00:00 2001 From: Xiaoyu Wang Date: Tue, 25 Apr 2023 17:39:28 +0800 Subject: [PATCH 38/46] feat: subtable level privilege --- include/libs/nodes/querynodes.h | 2 + source/client/src/clientMain.c | 32 +++--- source/libs/catalog/src/ctgUtil.c | 6 +- source/libs/nodes/src/nodesUtilFuncs.c | 2 + source/libs/parser/src/parAuthenticator.c | 11 +- source/libs/parser/src/parInsertSql.c | 114 ++++++++++++++++++--- source/libs/scalar/src/scalar.c | 26 ++--- tests/parallel_test/cases.task | 1 + tests/script/tsim/user/privilege_table.sim | 34 ++++-- tests/script/win-test-file | 1 + 10 files changed, 177 insertions(+), 52 deletions(-) diff --git a/include/libs/nodes/querynodes.h b/include/libs/nodes/querynodes.h index 480912a8cf..9569cfe055 100644 --- a/include/libs/nodes/querynodes.h +++ b/include/libs/nodes/querynodes.h @@ -379,6 +379,8 @@ typedef struct SVnodeModifyOpStmt { SName usingTableName; const char* pBoundCols; struct STableMeta* pTableMeta; + SNode* pTagCond; + SArray* pTableTag; SHashObj* pVgroupsHashObj; SHashObj* pTableBlockHashObj; // SHashObj SHashObj* pSubTableHashObj; diff --git a/source/client/src/clientMain.c b/source/client/src/clientMain.c index 54ae1ab4b3..2ebc8e7379 100644 --- a/source/client/src/clientMain.c +++ b/source/client/src/clientMain.c @@ -108,7 +108,7 @@ TAOS *taos_connect(const char *ip, const char *user, const char *pass, const cha if (pass == NULL) { pass = TSDB_DEFAULT_PASS; } - + STscObj *pObj = taos_connect_internal(ip, user, pass, NULL, db, port, CONN_TYPE__QUERY); if (pObj) { int64_t *rid = taosMemoryCalloc(1, sizeof(int64_t)); @@ -359,11 +359,11 @@ int taos_print_row(char *str, TAOS_ROW row, TAOS_FIELD *fields, int num_fields) case TSDB_DATA_TYPE_NCHAR: { int32_t charLen = varDataLen((char *)row[i] - VARSTR_HEADER_SIZE); if (fields[i].type == TSDB_DATA_TYPE_BINARY) { - if(ASSERT(charLen <= fields[i].bytes && charLen >= 0)){ + if (ASSERT(charLen <= fields[i].bytes && charLen >= 0)) { tscError("taos_print_row error binary. charLen:%d, fields[i].bytes:%d", charLen, fields[i].bytes); } } else { - if(ASSERT(charLen <= fields[i].bytes * TSDB_NCHAR_SIZE && charLen >= 0)){ + if (ASSERT(charLen <= fields[i].bytes * TSDB_NCHAR_SIZE && charLen >= 0)) { tscError("taos_print_row error. charLen:%d, fields[i].bytes:%d", charLen, fields[i].bytes); } } @@ -705,16 +705,16 @@ int taos_get_current_db(TAOS *taos, char *database, int len, int *required) { int code = TSDB_CODE_SUCCESS; taosThreadMutexLock(&pTscObj->mutex); - if(database == NULL || len <= 0){ - if(required != NULL) *required = strlen(pTscObj->db) + 1; + if (database == NULL || len <= 0) { + if (required != NULL) *required = strlen(pTscObj->db) + 1; terrno = TSDB_CODE_INVALID_PARA; code = -1; - }else if(len < strlen(pTscObj->db) + 1){ + } else if (len < strlen(pTscObj->db) + 1) { tstrncpy(database, pTscObj->db, len); - if(required) *required = strlen(pTscObj->db) + 1; + if (required) *required = strlen(pTscObj->db) + 1; terrno = TSDB_CODE_INVALID_PARA; code = -1; - }else{ + } else { strcpy(database, pTscObj->db); code = 0; } @@ -741,6 +741,7 @@ static void destoryCatalogReq(SCatalogReq *pCatalogReq) { taosArrayDestroy(pCatalogReq->pUser); taosArrayDestroy(pCatalogReq->pTableIndex); taosArrayDestroy(pCatalogReq->pTableCfg); + taosArrayDestroy(pCatalogReq->pTableTag); taosMemoryFree(pCatalogReq); } @@ -976,7 +977,7 @@ void doAsyncQuery(SRequestObj *pRequest, bool updateMetaForce) { if (TSDB_CODE_SUCCESS == code) { pRequest->stmtType = pRequest->pQuery->pRoot->type; code = phaseAsyncQuery(pWrapper); - } + } if (TSDB_CODE_SUCCESS != code) { tscError("0x%" PRIx64 " error happens, code:%d - %s, reqId:0x%" PRIx64, pRequest->self, code, tstrerror(code), @@ -1044,11 +1045,11 @@ static void fetchCallback(void *pResult, void *param, int32_t code) { } void taos_fetch_rows_a(TAOS_RES *res, __taos_async_fn_t fp, void *param) { - if(ASSERT(res != NULL && fp != NULL)){ + if (ASSERT(res != NULL && fp != NULL)) { tscError("taos_fetch_rows_a invalid paras"); return; } - if(ASSERT(TD_RES_QUERY(res))){ + if (ASSERT(TD_RES_QUERY(res))) { tscError("taos_fetch_rows_a res is NULL"); return; } @@ -1094,11 +1095,11 @@ void taos_fetch_rows_a(TAOS_RES *res, __taos_async_fn_t fp, void *param) { } void taos_fetch_raw_block_a(TAOS_RES *res, __taos_async_fn_t fp, void *param) { - if(ASSERT(res != NULL && fp != NULL)){ + if (ASSERT(res != NULL && fp != NULL)) { tscError("taos_fetch_rows_a invalid paras"); return; } - if(ASSERT(TD_RES_QUERY(res))){ + if (ASSERT(TD_RES_QUERY(res))) { tscError("taos_fetch_rows_a res is NULL"); return; } @@ -1113,11 +1114,11 @@ void taos_fetch_raw_block_a(TAOS_RES *res, __taos_async_fn_t fp, void *param) { } const void *taos_get_raw_block(TAOS_RES *res) { - if(ASSERT(res != NULL)){ + if (ASSERT(res != NULL)) { tscError("taos_fetch_rows_a invalid paras"); return NULL; } - if(ASSERT(TD_RES_QUERY(res))){ + if (ASSERT(TD_RES_QUERY(res))) { tscError("taos_fetch_rows_a res is NULL"); return NULL; } @@ -1275,7 +1276,6 @@ _return: return code; } - int taos_load_table_info(TAOS *taos, const char *tableNameList) { if (NULL == taos) { terrno = TSDB_CODE_TSC_DISCONNECTED; diff --git a/source/libs/catalog/src/ctgUtil.c b/source/libs/catalog/src/ctgUtil.c index a42a189e75..9274c1ef92 100644 --- a/source/libs/catalog/src/ctgUtil.c +++ b/source/libs/catalog/src/ctgUtil.c @@ -170,6 +170,9 @@ void ctgFreeSMetaData(SMetaData* pData) { taosArrayDestroy(pData->pTableCfg); pData->pTableCfg = NULL; + taosArrayDestroy(pData->pTableTag); + pData->pTableTag = NULL; + taosMemoryFreeClear(pData->pSvrVer); } @@ -530,7 +533,7 @@ void ctgFreeTaskRes(CTG_TASK_TYPE type, void** pRes) { } case CTG_TASK_GET_USER: { if (*pRes) { - SUserAuthRes* pAuth = (SUserAuthRes *)*pRes; + SUserAuthRes* pAuth = (SUserAuthRes*)*pRes; nodesDestroyNode(pAuth->pCond); taosMemoryFreeClear(*pRes); } @@ -711,6 +714,7 @@ void ctgFreeTaskCtx(SCtgTask* pTask) { SCtgTbTagCtx* taskCtx = (SCtgTbTagCtx*)pTask->taskCtx; taosMemoryFreeClear(taskCtx->pName); taosMemoryFreeClear(taskCtx->pVgInfo); + taosMemoryFreeClear(taskCtx); break; } case CTG_TASK_GET_DB_VGROUP: diff --git a/source/libs/nodes/src/nodesUtilFuncs.c b/source/libs/nodes/src/nodesUtilFuncs.c index 422a196c50..f71eef7969 100644 --- a/source/libs/nodes/src/nodesUtilFuncs.c +++ b/source/libs/nodes/src/nodesUtilFuncs.c @@ -827,6 +827,8 @@ void nodesDestroyNode(SNode* pNode) { SVnodeModifyOpStmt* pStmt = (SVnodeModifyOpStmt*)pNode; destroyVgDataBlockArray(pStmt->pDataBlocks); taosMemoryFreeClear(pStmt->pTableMeta); + nodesDestroyNode(pStmt->pTagCond); + taosArrayDestroy(pStmt->pTableTag); taosHashCleanup(pStmt->pVgroupsHashObj); taosHashCleanup(pStmt->pSubTableHashObj); taosHashCleanup(pStmt->pTableNameHashObj); diff --git a/source/libs/parser/src/parAuthenticator.c b/source/libs/parser/src/parAuthenticator.c index d182f5bd73..1586d8128b 100644 --- a/source/libs/parser/src/parAuthenticator.c +++ b/source/libs/parser/src/parAuthenticator.c @@ -91,17 +91,22 @@ static int32_t mergeStableTagCond(SNode** pWhere, SNode* pTagCond) { } static int32_t appendStableTagCond(SNode** pWhere, SNode* pTagCond) { + SNode* pTagCondCopy = nodesCloneNode(pTagCond); + if (NULL == pTagCondCopy) { + return TSDB_CODE_OUT_OF_MEMORY; + } + if (NULL == *pWhere) { - *pWhere = pTagCond; + *pWhere = pTagCondCopy; return TSDB_CODE_SUCCESS; } if (QUERY_NODE_LOGIC_CONDITION == nodeType(*pWhere) && LOGIC_COND_TYPE_AND == ((SLogicConditionNode*)*pWhere)->condType) { - return nodesListStrictAppend(((SLogicConditionNode*)*pWhere)->pParameterList, pTagCond); + return nodesListStrictAppend(((SLogicConditionNode*)*pWhere)->pParameterList, pTagCondCopy); } - return mergeStableTagCond(pWhere, pTagCond); + return mergeStableTagCond(pWhere, pTagCondCopy); } static EDealRes authSelectImpl(SNode* pNode, void* pContext) { diff --git a/source/libs/parser/src/parInsertSql.c b/source/libs/parser/src/parInsertSql.c index eb2efd573d..02de9f227d 100644 --- a/source/libs/parser/src/parInsertSql.c +++ b/source/libs/parser/src/parInsertSql.c @@ -53,6 +53,7 @@ typedef struct SInsertParseContext { bool missCache; bool usingDuplicateTable; bool forceUpdate; + bool needTableTagVal; } SInsertParseContext; typedef int32_t (*_row_append_fn_t)(SMsgBuf* pMsgBuf, const void* value, int32_t len, void* param); @@ -577,28 +578,39 @@ static int32_t rewriteTagCondColumnImpl(STagVal* pVal, SNode** pNode) { if (NULL == pValue) { return TSDB_CODE_OUT_OF_MEMORY; } - pValue->node.resType.type = pVal->type; + + pValue->node.resType = ((SColumnNode*)*pNode)->node.resType; + nodesDestroyNode(*pNode); + *pNode = (SNode*)pValue; + switch (pVal->type) { case TSDB_DATA_TYPE_BOOL: pValue->datum.b = *(int8_t*)(&pVal->i64); + *(bool*)&pValue->typeData = pValue->datum.b; break; case TSDB_DATA_TYPE_TINYINT: pValue->datum.i = *(int8_t*)(&pVal->i64); + *(int8_t*)&pValue->typeData = pValue->datum.i; break; case TSDB_DATA_TYPE_SMALLINT: pValue->datum.i = *(int16_t*)(&pVal->i64); + *(int16_t*)&pValue->typeData = pValue->datum.i; break; case TSDB_DATA_TYPE_INT: pValue->datum.i = *(int32_t*)(&pVal->i64); + *(int32_t*)&pValue->typeData = pValue->datum.i; break; case TSDB_DATA_TYPE_BIGINT: pValue->datum.i = pVal->i64; + pValue->typeData = pValue->datum.i; break; case TSDB_DATA_TYPE_FLOAT: pValue->datum.d = *(float*)(&pVal->i64); + *(float*)&pValue->typeData = pValue->datum.d; break; case TSDB_DATA_TYPE_DOUBLE: pValue->datum.d = *(double*)(&pVal->i64); + *(double*)&pValue->typeData = pValue->datum.d; break; case TSDB_DATA_TYPE_VARCHAR: case TSDB_DATA_TYPE_NCHAR: @@ -611,18 +623,23 @@ static int32_t rewriteTagCondColumnImpl(STagVal* pVal, SNode** pNode) { break; case TSDB_DATA_TYPE_TIMESTAMP: pValue->datum.i = pVal->i64; + pValue->typeData = pValue->datum.i; break; case TSDB_DATA_TYPE_UTINYINT: pValue->datum.i = *(uint8_t*)(&pVal->i64); + *(uint8_t*)&pValue->typeData = pValue->datum.i; break; case TSDB_DATA_TYPE_USMALLINT: pValue->datum.i = *(uint16_t*)(&pVal->i64); + *(uint16_t*)&pValue->typeData = pValue->datum.i; break; case TSDB_DATA_TYPE_UINT: pValue->datum.i = *(uint32_t*)(&pVal->i64); + *(uint32_t*)&pValue->typeData = pValue->datum.i; break; case TSDB_DATA_TYPE_UBIGINT: pValue->datum.i = *(uint64_t*)(&pVal->i64); + *(uint64_t*)&pValue->typeData = pValue->datum.i; break; case TSDB_DATA_TYPE_JSON: case TSDB_DATA_TYPE_VARBINARY: @@ -667,16 +684,15 @@ static int32_t checkTagCondResult(SNode* pResult) { : TSDB_CODE_PAR_PERMISSION_DENIED; } -int32_t checkSubtablePrivilege(SArray* pTagVals, SArray* pTagName, SNode* pCond) { - int32_t code = setTagVal(pTagVals, pTagName, pCond); - SNode* pNew = NULL; +static int32_t checkSubtablePrivilege(SArray* pTagVals, SArray* pTagName, SNode** pCond) { + int32_t code = setTagVal(pTagVals, pTagName, *pCond); if (TSDB_CODE_SUCCESS == code) { - code = scalarCalculateConstants(pCond, &pNew); + code = scalarCalculateConstants(*pCond, pCond); } if (TSDB_CODE_SUCCESS == code) { - code = checkTagCondResult(pNew); + code = checkTagCondResult(*pCond); } - nodesDestroyNode(pNew); + NODES_DESTORY_NODE(*pCond); return code; } @@ -716,6 +732,10 @@ static int32_t parseTagsClauseImpl(SInsertParseContext* pCxt, SVnodeModifyOpStmt } } + if (TSDB_CODE_SUCCESS == code && NULL != pStmt->pTagCond) { + code = checkSubtablePrivilege(pTagVals, pTagName, &pStmt->pTagCond); + } + if (TSDB_CODE_SUCCESS == code && !isParseBindParam && !isJson) { code = tTagNew(pTagVals, 1, false, &pTag); } @@ -843,7 +863,7 @@ static void setUserAuthInfo(SParseContext* pCxt, SName* pTbName, SUserAuthInfo* pInfo->type = AUTH_TYPE_WRITE; } -static int32_t checkAuth(SParseContext* pCxt, SName* pTbName, bool* pMissCache) { +static int32_t checkAuth(SParseContext* pCxt, SName* pTbName, bool* pMissCache, SNode** pTagCond) { int32_t code = TSDB_CODE_SUCCESS; SUserAuthInfo authInfo = {0}; setUserAuthInfo(pCxt, pTbName, &authInfo); @@ -863,11 +883,28 @@ static int32_t checkAuth(SParseContext* pCxt, SName* pTbName, bool* pMissCache) *pMissCache = true; } else if (!authRes.pass) { code = TSDB_CODE_PAR_PERMISSION_DENIED; + } else if (NULL != authRes.pCond) { + *pTagCond = authRes.pCond; } } return code; } +static int32_t checkAuthForTable(SParseContext* pCxt, SName* pTbName, bool* pMissCache, bool* pNeedTableTagVal) { + SNode* pTagCond = NULL; + int32_t code = checkAuth(pCxt, pTbName, pMissCache, &pTagCond); + if (TSDB_CODE_SUCCESS == code) { + *pNeedTableTagVal = ((*pMissCache) || (NULL != pTagCond)); + *pMissCache = (NULL != pTagCond); + } + nodesDestroyNode(pTagCond); + return code; +} + +static int32_t checkAuthForStable(SParseContext* pCxt, SName* pTbName, bool* pMissCache, SNode** pTagCond) { + return checkAuth(pCxt, pTbName, pMissCache, pTagCond); +} + static int32_t getTableMeta(SInsertParseContext* pCxt, SName* pTbName, bool isStb, STableMeta** pTableMeta, bool* pMissCache) { SParseContext* pComCxt = pCxt->pComCxt; @@ -970,7 +1007,7 @@ static int32_t getTargetTableSchema(SInsertParseContext* pCxt, SVnodeModifyOpStm return TSDB_CODE_SUCCESS; } - int32_t code = checkAuth(pCxt->pComCxt, &pStmt->targetTableName, &pCxt->missCache); + int32_t code = checkAuthForTable(pCxt->pComCxt, &pStmt->targetTableName, &pCxt->missCache, &pCxt->needTableTagVal); if (TSDB_CODE_SUCCESS == code && !pCxt->missCache) { code = getTableMetaAndVgroup(pCxt, pStmt, &pCxt->missCache); } @@ -993,7 +1030,7 @@ static int32_t getUsingTableSchema(SInsertParseContext* pCxt, SVnodeModifyOpStmt return TSDB_CODE_SUCCESS; } - int32_t code = checkAuth(pCxt->pComCxt, &pStmt->targetTableName, &pCxt->missCache); + int32_t code = checkAuthForStable(pCxt->pComCxt, &pStmt->usingTableName, &pCxt->missCache, &pStmt->pTagCond); if (TSDB_CODE_SUCCESS == code && !pCxt->missCache) { code = getTableMeta(pCxt, &pStmt->usingTableName, true, &pStmt->pTableMeta, &pCxt->missCache); } @@ -1606,6 +1643,8 @@ static int32_t parseInsertTableClauseBottom(SInsertParseContext* pCxt, SVnodeMod static void resetEnvPreTable(SInsertParseContext* pCxt, SVnodeModifyOpStmt* pStmt) { insDestroyBoundColInfo(&pCxt->tags); taosMemoryFreeClear(pStmt->pTableMeta); + nodesDestroyNode(pStmt->pTagCond); + taosArrayDestroy(pStmt->pTableTag); tdDestroySVCreateTbReq(pStmt->pCreateTblReq); taosMemoryFreeClear(pStmt->pCreateTblReq); pCxt->missCache = false; @@ -1780,14 +1819,18 @@ static int32_t createInsertQuery(SInsertParseContext* pCxt, SQuery** pOutput) { return code; } -static int32_t checkAuthFromMetaData(const SArray* pUsers) { +static int32_t checkAuthFromMetaData(const SArray* pUsers, SNode** pTagCond) { if (1 != taosArrayGetSize(pUsers)) { return TSDB_CODE_FAILED; } SMetaRes* pRes = taosArrayGet(pUsers, 0); if (TSDB_CODE_SUCCESS == pRes->code) { - return (*(bool*)pRes->pRes) ? TSDB_CODE_SUCCESS : TSDB_CODE_PAR_PERMISSION_DENIED; + SUserAuthRes* pAuth = pRes->pRes; + if (NULL != pAuth->pCond) { + *pTagCond = nodesCloneNode(pAuth->pCond); + } + return pAuth->pass ? TSDB_CODE_SUCCESS : TSDB_CODE_PAR_PERMISSION_DENIED; } return pRes->code; } @@ -1826,9 +1869,40 @@ static int32_t getTableVgroupFromMetaData(const SArray* pTables, SVnodeModifyOpS sizeof(SVgroupInfo)); } +static int32_t buildTagNameFromMeta(STableMeta* pMeta, SArray** pTagName) { + *pTagName = taosArrayInit(pMeta->tableInfo.numOfTags, TSDB_COL_NAME_LEN); + if (NULL == *pTagName) { + return TSDB_CODE_OUT_OF_MEMORY; + } + SSchema* pSchema = getTableTagSchema(pMeta); + for (int32_t i = 0; i < pMeta->tableInfo.numOfTags; ++i) { + taosArrayPush(*pTagName, pSchema[i].name); + } + return TSDB_CODE_SUCCESS; +} + +static int32_t checkSubtablePrivilegeForTable(const SArray* pTables, SVnodeModifyOpStmt* pStmt) { + if (1 != taosArrayGetSize(pTables)) { + return TSDB_CODE_FAILED; + } + + SMetaRes* pRes = taosArrayGet(pTables, 0); + if (TSDB_CODE_SUCCESS != pRes->code) { + return pRes->code; + } + + SArray* pTagName = NULL; + int32_t code = buildTagNameFromMeta(pStmt->pTableMeta, &pTagName); + if (TSDB_CODE_SUCCESS == code) { + code = checkSubtablePrivilege((SArray*)pRes->pRes, pTagName, &pStmt->pTagCond); + } + taosArrayDestroy(pTagName); + return code; +} + static int32_t getTableSchemaFromMetaData(SInsertParseContext* pCxt, const SMetaData* pMetaData, SVnodeModifyOpStmt* pStmt, bool isStb) { - int32_t code = checkAuthFromMetaData(pMetaData->pUser); + int32_t code = checkAuthFromMetaData(pMetaData->pUser, &pStmt->pTagCond); if (TSDB_CODE_SUCCESS == code) { code = getTableMetaFromMetaData(pMetaData->pTableMeta, &pStmt->pTableMeta); } @@ -1841,6 +1915,9 @@ static int32_t getTableSchemaFromMetaData(SInsertParseContext* pCxt, const SMeta if (TSDB_CODE_SUCCESS == code) { code = getTableVgroupFromMetaData(pMetaData->pTableHash, pStmt, isStb); } + if (TSDB_CODE_SUCCESS == code && !isStb && NULL != pStmt->pTagCond) { + code = checkSubtablePrivilegeForTable(pMetaData->pTableTag, pStmt); + } return code; } @@ -1860,6 +1937,8 @@ static void clearCatalogReq(SCatalogReq* pCatalogReq) { pCatalogReq->pTableHash = NULL; taosArrayDestroy(pCatalogReq->pUser); pCatalogReq->pUser = NULL; + taosArrayDestroy(pCatalogReq->pTableTag); + pCatalogReq->pTableTag = NULL; } static int32_t setVnodeModifOpStmt(SInsertParseContext* pCxt, SCatalogReq* pCatalogReq, const SMetaData* pMetaData, @@ -2033,8 +2112,15 @@ static int32_t buildInsertUserAuthReq(const char* pUser, SName* pName, SArray** return TSDB_CODE_SUCCESS; } +static int32_t buildInsertTableTagReq(SName* pName, SArray** pTables) { return buildInsertTableReq(pName, pTables); } + static int32_t buildInsertCatalogReq(SInsertParseContext* pCxt, SVnodeModifyOpStmt* pStmt, SCatalogReq* pCatalogReq) { - int32_t code = buildInsertUserAuthReq(pCxt->pComCxt->pUser, &pStmt->targetTableName, &pCatalogReq->pUser); + int32_t code = buildInsertUserAuthReq( + pCxt->pComCxt->pUser, (0 == pStmt->usingTableName.type ? &pStmt->targetTableName : &pStmt->usingTableName), + &pCatalogReq->pUser); + if (TSDB_CODE_SUCCESS == code && pCxt->needTableTagVal) { + code = buildInsertTableTagReq(&pStmt->targetTableName, &pCatalogReq->pTableTag); + } if (TSDB_CODE_SUCCESS == code) { if (0 == pStmt->usingTableName.type) { code = buildInsertDbReq(&pStmt->targetTableName, &pCatalogReq->pTableMeta); diff --git a/source/libs/scalar/src/scalar.c b/source/libs/scalar/src/scalar.c index 0521076d23..d9295656e8 100644 --- a/source/libs/scalar/src/scalar.c +++ b/source/libs/scalar/src/scalar.c @@ -53,6 +53,7 @@ int32_t sclCreateColumnInfoData(SDataType *pType, int32_t numOfRows, SScalarPara int32_t code = colInfoDataEnsureCapacity(pColumnData, numOfRows, true); if (code != TSDB_CODE_SUCCESS) { terrno = TSDB_CODE_OUT_OF_MEMORY; + colDataDestroy(pColumnData); taosMemoryFree(pColumnData); return terrno; } @@ -1061,17 +1062,20 @@ int32_t sclConvertOpValueNodeTs(SOperatorNode *node, SScalarCtx *ctx) { if (node->pLeft && SCL_IS_VAR_VALUE_NODE(node->pLeft)) { if (node->pRight && (TSDB_DATA_TYPE_TIMESTAMP == ((SExprNode *)node->pRight)->resType.type)) { - SCL_ERR_JRET(sclConvertToTsValueNode(sclGetOpValueNodeTsPrecision(node->pLeft, node->pRight), (SValueNode*)node->pLeft)); + SCL_ERR_JRET( + sclConvertToTsValueNode(sclGetOpValueNodeTsPrecision(node->pLeft, node->pRight), (SValueNode *)node->pLeft)); } } else if (node->pRight && SCL_IS_NOTNULL_CONST_NODE(node->pRight)) { if (node->pLeft && (TSDB_DATA_TYPE_TIMESTAMP == ((SExprNode *)node->pLeft)->resType.type)) { if (SCL_IS_VAR_VALUE_NODE(node->pRight)) { - SCL_ERR_JRET(sclConvertToTsValueNode(sclGetOpValueNodeTsPrecision(node->pLeft, node->pRight), (SValueNode*)node->pRight)); + SCL_ERR_JRET(sclConvertToTsValueNode(sclGetOpValueNodeTsPrecision(node->pLeft, node->pRight), + (SValueNode *)node->pRight)); } else if (QUERY_NODE_NODE_LIST == node->pRight->type) { - SNode* pNode; - FOREACH(pNode, ((SNodeListNode*)node->pRight)->pNodeList) { + SNode *pNode; + FOREACH(pNode, ((SNodeListNode *)node->pRight)->pNodeList) { if (SCL_IS_VAR_VALUE_NODE(pNode)) { - SCL_ERR_JRET(sclConvertToTsValueNode(sclGetOpValueNodeTsPrecision(node->pLeft, pNode), (SValueNode*)pNode)); + SCL_ERR_JRET( + sclConvertToTsValueNode(sclGetOpValueNodeTsPrecision(node->pLeft, pNode), (SValueNode *)pNode)); } } } @@ -1086,8 +1090,6 @@ _return: return DEAL_RES_ERROR; } - - int32_t sclConvertCaseWhenValueNodeTs(SCaseWhenNode *node, SScalarCtx *ctx) { int32_t code = 0; @@ -1096,19 +1098,20 @@ int32_t sclConvertCaseWhenValueNodeTs(SCaseWhenNode *node, SScalarCtx *ctx) { } if (SCL_IS_VAR_VALUE_NODE(node->pCase)) { - SNode* pNode; + SNode *pNode; FOREACH(pNode, node->pWhenThenList) { SExprNode *pExpr = (SExprNode *)((SWhenThenNode *)pNode)->pWhen; if (TSDB_DATA_TYPE_TIMESTAMP == pExpr->resType.type) { - SCL_ERR_JRET(sclConvertToTsValueNode(pExpr->resType.precision, (SValueNode*)node->pCase)); + SCL_ERR_JRET(sclConvertToTsValueNode(pExpr->resType.precision, (SValueNode *)node->pCase)); break; } } } else if (TSDB_DATA_TYPE_TIMESTAMP == ((SExprNode *)node->pCase)->resType.type) { - SNode* pNode; + SNode *pNode; FOREACH(pNode, node->pWhenThenList) { if (SCL_IS_VAR_VALUE_NODE(((SWhenThenNode *)pNode)->pWhen)) { - SCL_ERR_JRET(sclConvertToTsValueNode(((SExprNode *)node->pCase)->resType.precision, (SValueNode*)((SWhenThenNode *)pNode)->pWhen)); + SCL_ERR_JRET(sclConvertToTsValueNode(((SExprNode *)node->pCase)->resType.precision, + (SValueNode *)((SWhenThenNode *)pNode)->pWhen)); } } } @@ -1271,7 +1274,6 @@ EDealRes sclRewriteLogic(SNode **pNode, SScalarCtx *ctx) { return DEAL_RES_CONTINUE; } - EDealRes sclRewriteOperator(SNode **pNode, SScalarCtx *ctx) { SOperatorNode *node = (SOperatorNode *)*pNode; diff --git a/tests/parallel_test/cases.task b/tests/parallel_test/cases.task index dda4ec3e84..8ea13e741c 100644 --- a/tests/parallel_test/cases.task +++ b/tests/parallel_test/cases.task @@ -722,6 +722,7 @@ ,,y,script,./test.sh -f tsim/user/privilege_db.sim ,,y,script,./test.sh -f tsim/user/privilege_sysinfo.sim ,,y,script,./test.sh -f tsim/user/privilege_topic.sim +,,y,script,./test.sh -f tsim/user/privilege_table.sim ,,y,script,./test.sh -f tsim/db/alter_option.sim ,,y,script,./test.sh -f tsim/db/alter_replica_31.sim ,,y,script,./test.sh -f tsim/db/basic1.sim diff --git a/tests/script/tsim/user/privilege_table.sim b/tests/script/tsim/user/privilege_table.sim index 5256cdd21d..05f91ff5b0 100644 --- a/tests/script/tsim/user/privilege_table.sim +++ b/tests/script/tsim/user/privilege_table.sim @@ -96,7 +96,9 @@ sql connect wxy sql reset query cache; sql_error select tbname, * from test.st1; sql insert into test.st1s1 values(now, 10); +sql insert into test.st1s3 using test.st1 tags(1, 'dachang') values(now, 100); sql_error insert into test.st1s2 values(now, 20); +sql_error insert into test.st1s4 using test.st1 tags(3, 'dachang') values(now, 300); sql_error select * from test.st2; sql_error insert into test.st2s1 values(now, 10) test.st2s2 values(now, 20); @@ -112,7 +114,7 @@ sql connect wxy sql reset query cache; sql select * from test.st1; -if $rows != 5 then +if $rows != 6 then return -1 endi sql_error insert into test.st1s1 values(now, 10) test.st1s2 values(now, 20); @@ -133,7 +135,7 @@ sql connect wxy sql reset query cache; sql select * from test.st1; -if $rows != 2 then +if $rows != 6 then return -1 endi sql_error insert into test.st1s1 values(now, 10) test.st1s2 values(now, 20); @@ -153,8 +155,9 @@ sql grant read on test.st1 with id = 1 to wxy; sql close sql connect wxy +sql reset query cache; sql select * from test.st1; -if $rows != 1 then +if $rows != 4 then return -1 endi sql_error insert into test.st1s1 values(now, 10) test.st1s2 values(now, 20); @@ -174,8 +177,9 @@ sql grant write on test.st1 to wxy; sql close sql connect wxy +sql reset query cache; sql select * from test.st1; -if $rows != 2 then +if $rows != 6 then return -1 endi sql insert into test.st1s1 values(now, 10) test.st1s2 values(now, 20); @@ -195,10 +199,17 @@ sql grant write on test.st1 with id = 1 to wxy; sql close sql connect wxy -sql select * from test.st1; +sql reset query cache; +sql select * from test.st1; +if $rows != 8 then + return -1 +endi sql insert into test.st1s1 values(now, 10); sql_error insert into test.st1s2 values(now, 20); -sql select * from test.st2; +sql select * from test.st2; +if $rows != 2 then + return -1 +endi sql_error insert into test.st2s1 values(now, 10) test.st2s2 values(now, 20); print =============== case 11: database write privilege and table unauthorized @@ -212,6 +223,7 @@ sql grant write on test.* to wxy; sql close sql connect wxy +sql reset query cache; sql_error select * from test.st1; sql insert into test.st1s1 values(now, 10) test.st1s2 values(now, 20); sql_error select * from test.st2; @@ -226,7 +238,11 @@ sql grant read on test.st1 to wxy; sql close sql connect wxy +sql reset query cache; sql select * from test.st1; +if $rows != 11 then + return -1 +endi sql insert into test.st1s1 values(now, 10) test.st1s2 values(now, 20); sql_error select * from test.st2; sql insert into test.st2s1 values(now, 10) test.st2s2 values(now, 20); @@ -241,7 +257,11 @@ sql grant read on test.st1 with id = 1 to wxy; sql close sql connect wxy +sql reset query cache; sql select * from test.st1; +if $rows != 8 then + return -1 +endi sql insert into test.st1s1 values(now, 10) test.st1s2 values(now, 20); sql_error select * from test.st2; sql insert into test.st2s1 values(now, 10) test.st2s2 values(now, 20); @@ -256,6 +276,7 @@ sql grant write on test.st1 to wxy; sql close sql connect wxy +sql reset query cache; sql_error select * from test.st1; sql insert into test.st1s1 values(now, 10) test.st1s2 values(now, 20); sql_error select * from test.st2; @@ -271,6 +292,7 @@ sql grant write on test.st1 with id = 1 to wxy; sql close sql connect wxy +sql reset query cache; sql_error select * from test.st1; sql insert into test.st1s1 values(now, 10); sql_error insert into test.st1s2 values(now, 20); diff --git a/tests/script/win-test-file b/tests/script/win-test-file index 2d5a1b3108..3b358993fa 100644 --- a/tests/script/win-test-file +++ b/tests/script/win-test-file @@ -3,6 +3,7 @@ ./test.sh -f tsim/user/privilege_db.sim ./test.sh -f tsim/user/privilege_sysinfo.sim ./test.sh -f tsim/user/privilege_topic.sim +./test.sh -f tsim/user/privilege_table.sim ./test.sh -f tsim/db/alter_option.sim rem ./test.sh -f tsim/db/alter_replica_13.sim ./test.sh -f tsim/db/alter_replica_31.sim From e9f4c769d8d753c18f79f7d3c9d077683fc57e12 Mon Sep 17 00:00:00 2001 From: xiaolei li <85657333+xleili@users.noreply.github.com> Date: Tue, 25 Apr 2023 19:20:42 +0800 Subject: [PATCH 39/46] enhance: packaging keeper in deb rpm main (#21071) * enhance: community package include taoskeeper * enhance: community rpm package add taoskeeper --- packaging/deb/DEBIAN/preinst | 37 ++++++++++++++++++++++++++++++++++ packaging/deb/DEBIAN/prerm | 1 + packaging/deb/makedeb.sh | 26 ++++++++++++++++++++++++ packaging/rpm/makerpm.sh | 24 +++++++++++++++++++++- packaging/rpm/tdengine.spec | 21 +++++++++++++++++-- packaging/tools/post.sh | 39 ++++++++++++++++++++++++++---------- packaging/tools/preun.sh | 17 +++++++++++++++- 7 files changed, 150 insertions(+), 15 deletions(-) diff --git a/packaging/deb/DEBIAN/preinst b/packaging/deb/DEBIAN/preinst index 8a1a7d4d81..904a946e20 100644 --- a/packaging/deb/DEBIAN/preinst +++ b/packaging/deb/DEBIAN/preinst @@ -26,6 +26,38 @@ if pidof taosd &> /dev/null; then sleep 1 fi +# Stop adapter service if running +if pidof taosadapter &> /dev/null; then + if pidof systemd &> /dev/null; then + ${csudo}systemctl stop taosadapter || : + elif $(which service &> /dev/null); then + ${csudo}service taosadapter stop || : + else + pid=$(ps -ef | grep "taosadapter" | grep -v "grep" | awk '{print $2}') + if [ -n "$pid" ]; then + ${csudo}kill -9 $pid || : + fi + fi + echo "Stop taosadapter service success!" + sleep 1 +fi + +# Stop keeper service if running +if pidof taoskeeper &> /dev/null; then + if pidof systemd &> /dev/null; then + ${csudo}systemctl stop taoskeeper || : + elif $(which service &> /dev/null); then + ${csudo}service taoskeeper stop || : + else + pid=$(ps -ef | grep "taoskeeper" | grep -v "grep" | awk '{print $2}') + if [ -n "$pid" ]; then + ${csudo}kill -9 $pid || : + fi + fi + echo "Stop taoskeeper service success!" + sleep 1 +fi + # if taos.cfg already softlink, remove it cfg_install_dir="/etc/taos" install_main_dir="/usr/local/taos" @@ -41,6 +73,11 @@ if [ -f "${install_main_dir}/taosadapter.service" ]; then ${csudo}rm -f ${install_main_dir}/cfg/taosadapter.service || : fi +if [ -f "${install_main_dir}/taoskeeper.toml" ]; then + ${csudo}rm -f ${install_main_dir}/cfg/taoskeeper.toml || : +fi + + # there can not libtaos.so*, otherwise ln -s error ${csudo}rm -f ${install_main_dir}/driver/libtaos.* || : [ -f ${install_main_dir}/driver/libtaosws.so ] && ${csudo}rm -f ${install_main_dir}/driver/libtaosws.so || : diff --git a/packaging/deb/DEBIAN/prerm b/packaging/deb/DEBIAN/prerm index 65f261db2c..0d63115a04 100644 --- a/packaging/deb/DEBIAN/prerm +++ b/packaging/deb/DEBIAN/prerm @@ -32,6 +32,7 @@ else ${csudo}rm -f ${bin_link_dir}/udfd || : ${csudo}rm -f ${bin_link_dir}/taosadapter || : ${csudo}rm -f ${bin_link_dir}/taosdemo || : + ${csudo}rm -f ${bin_link_dir}/taoskeeper || : ${csudo}rm -f ${cfg_link_dir}/* || : ${csudo}rm -f ${inc_link_dir}/taos.h || : ${csudo}rm -f ${inc_link_dir}/taosdef.h || : diff --git a/packaging/deb/makedeb.sh b/packaging/deb/makedeb.sh index 94a24a4148..9f49cf345a 100755 --- a/packaging/deb/makedeb.sh +++ b/packaging/deb/makedeb.sh @@ -44,8 +44,31 @@ mkdir -p ${pkg_dir}${install_home_path}/include #mkdir -p ${pkg_dir}${install_home_path}/init.d mkdir -p ${pkg_dir}${install_home_path}/script +# download taoskeeper and build +if [ "$cpuType" = "x64" ] || [ "$cpuType" = "x86_64" ] || [ "$cpuType" = "amd64" ]; then + arch=amd64 +elif [ "$cpuType" = "x32" ] || [ "$cpuType" = "i386" ] || [ "$cpuType" = "i686" ]; then + arch=386 +elif [ "$cpuType" = "arm" ] || [ "$cpuType" = "aarch32" ]; then + arch=arm +elif [ "$cpuType" = "arm64" ] || [ "$cpuType" = "aarch64" ]; then + arch=arm64 +else + arch=$cpuType +fi + +echo "${top_dir}/../enterprise/packaging/build_taoskeeper.sh -r ${arch} -e taoskeeper" +echo "$top_dir=${top_dir}" +taoskeeper_binary=`${top_dir}/../enterprise/packaging/build_taoskeeper.sh -r $arch -e taoskeeper` +echo "taoskeeper_binary: ${taoskeeper_binary}" + +# copy config files +cp $(dirname ${taoskeeper_binary})/config/taoskeeper.toml ${pkg_dir}${install_home_path}/cfg +cp $(dirname ${taoskeeper_binary})/taoskeeper.service ${pkg_dir}${install_home_path}/cfg + cp ${compile_dir}/../packaging/cfg/taos.cfg ${pkg_dir}${install_home_path}/cfg cp ${compile_dir}/../packaging/cfg/taosd.service ${pkg_dir}${install_home_path}/cfg + if [ -f "${compile_dir}/test/cfg/taosadapter.toml" ]; then cp ${compile_dir}/test/cfg/taosadapter.toml ${pkg_dir}${install_home_path}/cfg || : fi @@ -53,6 +76,7 @@ if [ -f "${compile_dir}/test/cfg/taosadapter.service" ]; then cp ${compile_dir}/test/cfg/taosadapter.service ${pkg_dir}${install_home_path}/cfg || : fi +cp ${taoskeeper_binary} ${pkg_dir}${install_home_path}/bin #cp ${compile_dir}/../packaging/deb/taosd ${pkg_dir}${install_home_path}/init.d cp ${compile_dir}/../packaging/tools/post.sh ${pkg_dir}${install_home_path}/script cp ${compile_dir}/../packaging/tools/preun.sh ${pkg_dir}${install_home_path}/script @@ -143,6 +167,7 @@ else exit 1 fi +rm -rf ${pkg_dir}/build-taoskeeper # make deb package dpkg -b ${pkg_dir} $debname echo "make deb package success!" @@ -150,4 +175,5 @@ echo "make deb package success!" cp ${pkg_dir}/*.deb ${output_dir} # clean temp dir + rm -rf ${pkg_dir} diff --git a/packaging/rpm/makerpm.sh b/packaging/rpm/makerpm.sh index 4ac67ec754..9cf00364aa 100755 --- a/packaging/rpm/makerpm.sh +++ b/packaging/rpm/makerpm.sh @@ -35,14 +35,16 @@ function cp_rpm_package() { local cur_dir cd $1 cur_dir=$(pwd) - + echo "cp_rpm_package cd: ${cur_dir}" for dirlist in "$(ls ${cur_dir})"; do if test -d ${dirlist}; then cd ${dirlist} + echo 'cp_rpm_package ${cur_dir}/${dirlist}' cp_rpm_package ${cur_dir}/${dirlist} cd .. fi if test -e ${dirlist}; then + echo "${cur_dir}/${dirlist} ${output_dir}/TDengine-${tdengine_ver}.rpm" cp ${cur_dir}/${dirlist} ${output_dir}/TDengine-${tdengine_ver}.rpm fi done @@ -54,6 +56,25 @@ fi ${csudo}mkdir -p ${pkg_dir} cd ${pkg_dir} +# download taoskeeper and build +if [ "$cpuType" = "x64" ] || [ "$cpuType" = "x86_64" ] || [ "$cpuType" = "amd64" ]; then + arch=amd64 +elif [ "$cpuType" = "x32" ] || [ "$cpuType" = "i386" ] || [ "$cpuType" = "i686" ]; then + arch=386 +elif [ "$cpuType" = "arm" ] || [ "$cpuType" = "aarch32" ]; then + arch=arm +elif [ "$cpuType" = "arm64" ] || [ "$cpuType" = "aarch64" ]; then + arch=arm64 +else + arch=$cpuType +fi + +cd ${top_dir} +echo "${top_dir}/../enterprise/packaging/build_taoskeeper.sh -r ${arch} -e taoskeeper" +taoskeeper_binary=`${top_dir}/../enterprise/packaging/build_taoskeeper.sh -r $arch -e taoskeeper` +echo "taoskeeper_binary: ${taoskeeper_binary}" +cd ${package_dir} + ${csudo}mkdir -p BUILD BUILDROOT RPMS SOURCES SPECS SRPMS ${csudo}rpmbuild --define="_version ${tdengine_ver}" --define="_topdir ${pkg_dir}" --define="_compiledir ${compile_dir}" -bb ${spec_file} @@ -85,3 +106,4 @@ mv ${output_dir}/TDengine-${tdengine_ver}.rpm ${output_dir}/${rpmname} cd .. ${csudo}rm -rf ${pkg_dir} +rm -rf ${top_dir}/build-taoskeeper \ No newline at end of file diff --git a/packaging/rpm/tdengine.spec b/packaging/rpm/tdengine.spec index c21063e6a4..52d5335003 100644 --- a/packaging/rpm/tdengine.spec +++ b/packaging/rpm/tdengine.spec @@ -3,6 +3,7 @@ %define cfg_install_dir /etc/taos %define __strip /bin/true %global __python /usr/bin/python3 +%global _build_id_links none Name: tdengine Version: %{_version} @@ -62,6 +63,15 @@ fi if [ -f %{_compiledir}/test/cfg/taosadapter.service ]; then cp %{_compiledir}/test/cfg/taosadapter.service %{buildroot}%{homepath}/cfg fi + +if [ -f %{_compiledir}/../build-taoskeeper/config/taoskeeper.toml ]; then + cp %{_compiledir}/../build-taoskeeper/config/taoskeeper.toml %{buildroot}%{homepath}/cfg ||: +fi + +if [ -f %{_compiledir}/../build-taoskeeper/taoskeeper.service ]; then + cp %{_compiledir}/../build-taoskeeper/taoskeeper.service %{buildroot}%{homepath}/cfg ||: +fi + #cp %{_compiledir}/../packaging/rpm/taosd %{buildroot}%{homepath}/init.d cp %{_compiledir}/../packaging/tools/post.sh %{buildroot}%{homepath}/script cp %{_compiledir}/../packaging/tools/preun.sh %{buildroot}%{homepath}/script @@ -73,8 +83,12 @@ cp %{_compiledir}/build/bin/taosd %{buildroot}%{homepath}/bin cp %{_compiledir}/build/bin/udfd %{buildroot}%{homepath}/bin cp %{_compiledir}/build/bin/taosBenchmark %{buildroot}%{homepath}/bin +if [ -f %{_compiledir}/../build-taoskeeper/taoskeeper ]; then + cp %{_compiledir}/../build-taoskeeper/taoskeeper %{buildroot}%{homepath}/bin +fi + if [ -f %{_compiledir}/build/bin/taosadapter ]; then - cp %{_compiledir}/build/bin/taosadapter %{buildroot}%{homepath}/bin ||: + cp %{_compiledir}/build/bin/taosadapter %{buildroot}%{homepath}/bin fi cp %{_compiledir}/build/lib/${libfile} %{buildroot}%{homepath}/driver [ -f %{_compiledir}/build/lib/${wslibfile} ] && cp %{_compiledir}/build/lib/${wslibfile} %{buildroot}%{homepath}/driver ||: @@ -119,7 +133,9 @@ if [ -f %{_compiledir}/build/bin/jemalloc-config ]; then cp %{_compiledir}/build/lib/pkgconfig/jemalloc.pc %{buildroot}%{homepath}/jemalloc/lib/pkgconfig fi fi - +ls -al %{buildroot}%{homepath}/bin +tree -L 5 +echo "==============================copying files done" #Scripts executed before installation %pre if [ -f /var/lib/taos/dnode/dnodeCfg.json ]; then @@ -196,6 +212,7 @@ if [ $1 -eq 0 ];then ${csudo}rm -f ${bin_link_dir}/taosd || : ${csudo}rm -f ${bin_link_dir}/udfd || : ${csudo}rm -f ${bin_link_dir}/taosadapter || : + ${csudo}rm -f ${bin_link_dir}/taoskeeper || : ${csudo}rm -f ${cfg_link_dir}/* || : ${csudo}rm -f ${inc_link_dir}/taos.h || : ${csudo}rm -f ${inc_link_dir}/taosdef.h || : diff --git a/packaging/tools/post.sh b/packaging/tools/post.sh index 3a013ade2c..fc392c9684 100755 --- a/packaging/tools/post.sh +++ b/packaging/tools/post.sh @@ -436,7 +436,7 @@ function local_fqdn_check() { function install_taosadapter_config() { if [ ! -f "${cfg_install_dir}/taosadapter.toml" ]; then - [ ! -d %{cfg_install_dir} ] && + [ ! -d ${cfg_install_dir} ] && ${csudo}${csudo}mkdir -p ${cfg_install_dir} [ -f ${cfg_dir}/taosadapter.toml ] && ${csudo}cp ${cfg_dir}/taosadapter.toml ${cfg_install_dir} [ -f ${cfg_install_dir}/taosadapter.toml ] && @@ -451,19 +451,26 @@ function install_taosadapter_config() { } function install_taoskeeper_config() { - if [ ! -f "${cfg_install_dir}/keeper.toml" ]; then - [ ! -d %{cfg_install_dir} ] && - ${csudo}${csudo}mkdir -p ${cfg_install_dir} - [ -f ${cfg_dir}/keeper.toml ] && ${csudo}cp ${cfg_dir}/keeper.toml ${cfg_install_dir} - [ -f ${cfg_install_dir}/keeper.toml ] && - ${csudo}chmod 644 ${cfg_install_dir}/keeper.toml + # if new environment without taoskeeper + if [[ ! -f "${cfg_install_dir}/keeper.toml" ]] && [[ ! -f "${cfg_install_dir}/taoskeeper.toml" ]]; then + [ ! -d ${cfg_install_dir} ] && ${csudo}${csudo}mkdir -p ${cfg_install_dir} + [ -f ${cfg_dir}/taoskeeper.toml ] && ${csudo}cp ${cfg_dir}/taoskeeper.toml ${cfg_install_dir} + [ -f ${cfg_install_dir}/taoskeeper.toml ] && + ${csudo}chmod 644 ${cfg_install_dir}/taoskeeper.toml + fi + # if old machine with taoskeeper.toml file + if [ -f ${cfg_install_dir}/taoskeeper.toml ]; then + ${csudo}mv ${cfg_dir}/taoskeeper.toml ${cfg_dir}/taoskeeper.toml.new fi - [ -f ${cfg_dir}/keeper.toml ] && - ${csudo}mv ${cfg_dir}/keeper.toml ${cfg_dir}/keeper.toml.new + if [ -f ${cfg_install_dir}/keeper.toml ]; then + echo "The file keeper.toml will be renamed to taoskeeper.toml" + ${csudo}mv ${cfg_install_dir}/keeper.toml ${cfg_install_dir}/taoskeeper.toml + ${csudo}mv ${cfg_dir}/taoskeeper.toml ${cfg_dir}/taoskeeper.toml.new + fi - [ -f ${cfg_install_dir}/keeper.toml ] && - ${csudo}ln -s ${cfg_install_dir}/keeper.toml ${cfg_dir} + [ -f ${cfg_install_dir}/taoskeeper.toml ] && + ${csudo}ln -s ${cfg_install_dir}/taoskeeper.toml ${cfg_dir} } function install_config() { @@ -655,6 +662,15 @@ function install_taosadapter_service() { fi } +function install_taoskeeper_service() { + if ((${service_mod}==0)); then + [ -f ${script_dir}/../cfg/taoskeeper.service ] &&\ + ${csudo}cp ${script_dir}/../cfg/taoskeeper.service \ + ${service_config_dir}/ || : + ${csudo}systemctl daemon-reload + fi +} + function install_service() { log_print "start install service" if [ "$osType" != "Darwin" ]; then @@ -732,6 +748,7 @@ function install_TDengine() { install_taosadapter_config install_taoskeeper_config install_taosadapter_service + install_taoskeeper_service install_service install_app diff --git a/packaging/tools/preun.sh b/packaging/tools/preun.sh index 0e96c71d5d..68f6b53c45 100755 --- a/packaging/tools/preun.sh +++ b/packaging/tools/preun.sh @@ -17,7 +17,7 @@ cfg_link_dir="/usr/local/taos/cfg" service_config_dir="/etc/systemd/system" taos_service_name="taosd" - +taoskeeper_service_name="taoskeeper" csudo="" if command -v sudo > /dev/null; then csudo="sudo " @@ -57,6 +57,13 @@ function kill_taosd() { fi } +function kill_taoskeeper() { + pid=$(ps -ef | grep "taoskeeper" | grep -v "grep" | awk '{print $2}') + if [ -n "$pid" ]; then + ${csudo}kill -9 $pid || : + fi +} + function clean_service_on_systemd() { taosadapter_service_config="${service_config_dir}/taosadapter.service" if systemctl is-active --quiet taosadapter; then @@ -76,6 +83,12 @@ function clean_service_on_systemd() { [ -f ${taosadapter_service_config} ] && ${csudo}rm -f ${taosadapter_service_config} + taoskeeper_service_config="${service_config_dir}/${taoskeeper_service_name}.service" + if systemctl is-active --quiet ${taoskeeper_service_name}; then + echo "TDengine taoskeeper is running, stopping it..." + ${csudo}systemctl stop ${taoskeeper_service_name} &> /dev/null || echo &> /dev/null + fi + [ -f ${taoskeeper_service_config} ] && ${csudo}rm -f ${taoskeeper_service_config} } function clean_service_on_sysvinit() { @@ -111,6 +124,7 @@ function clean_service() { # must manual stop taosd kill_taosadapter kill_taosd + kill_taoskeeper fi } @@ -124,6 +138,7 @@ ${csudo}rm -f ${bin_link_dir}/taosadapter || : ${csudo}rm -f ${bin_link_dir}/taosBenchmark || : ${csudo}rm -f ${bin_link_dir}/taosdemo || : ${csudo}rm -f ${bin_link_dir}/set_core || : +${csudo}rm -f ${bin_link_dir}/taoskeeper || : ${csudo}rm -f ${cfg_link_dir}/*.new || : ${csudo}rm -f ${inc_link_dir}/taos.h || : ${csudo}rm -f ${inc_link_dir}/taosdef.h || : From 5db5205e31733ca2a991144575f4bcb885279054 Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Wed, 26 Apr 2023 13:41:16 +0800 Subject: [PATCH 40/46] fix: schema/tag version update to int32 --- include/libs/catalog/catalog.h | 4 ++-- include/libs/qcom/query.h | 4 ++-- source/libs/executor/src/tsort.c | 4 ++-- source/libs/qcom/src/querymsg.c | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/include/libs/catalog/catalog.h b/include/libs/catalog/catalog.h index 429e7ffa73..d7084cfac4 100644 --- a/include/libs/catalog/catalog.h +++ b/include/libs/catalog/catalog.h @@ -124,8 +124,8 @@ typedef struct SSTableVersion { char stbName[TSDB_TABLE_NAME_LEN]; uint64_t dbId; uint64_t suid; - int16_t sversion; - int16_t tversion; + int32_t sversion; + int32_t tversion; int32_t smaVer; } SSTableVersion; diff --git a/include/libs/qcom/query.h b/include/libs/qcom/query.h index cfc6ef2025..3841210076 100644 --- a/include/libs/qcom/query.h +++ b/include/libs/qcom/query.h @@ -116,8 +116,8 @@ typedef struct STableMeta { // if the table is TSDB_CHILD_TABLE, the following information is acquired from the corresponding super table meta // info - int16_t sversion; - int16_t tversion; + int32_t sversion; + int32_t tversion; STableComInfo tableInfo; SSchema schema[]; } STableMeta; diff --git a/source/libs/executor/src/tsort.c b/source/libs/executor/src/tsort.c index 6c8e581b3f..d973b5bbf3 100644 --- a/source/libs/executor/src/tsort.c +++ b/source/libs/executor/src/tsort.c @@ -155,7 +155,7 @@ void tsortDestroySortHandle(SSortHandle* pSortHandle) { int64_t fetchUs = 0, fetchNum = 0; tsortClearOrderdSource(pSortHandle->pOrderedSource, &fetchUs, &fetchNum); - qError("all source fetch time: %" PRId64 "us num:%" PRId64 " %s", fetchUs, fetchNum, pSortHandle->idStr); + qDebug("all source fetch time: %" PRId64 "us num:%" PRId64 " %s", fetchUs, fetchNum, pSortHandle->idStr); taosArrayDestroy(pSortHandle->pOrderedSource); taosMemoryFreeClear(pSortHandle); @@ -316,7 +316,7 @@ static int32_t sortComparInit(SMsortComparParam* pParam, SArray* pSources, int32 } int64_t et = taosGetTimestampUs(); - qError("init for merge sort completed, elapsed time:%.2f ms, %s", (et - st) / 1000.0, pHandle->idStr); + qDebug("init for merge sort completed, elapsed time:%.2f ms, %s", (et - st) / 1000.0, pHandle->idStr); } return code; diff --git a/source/libs/qcom/src/querymsg.c b/source/libs/qcom/src/querymsg.c index b62a3e4932..01b136d5e0 100644 --- a/source/libs/qcom/src/querymsg.c +++ b/source/libs/qcom/src/querymsg.c @@ -407,7 +407,7 @@ int32_t queryCreateTableMetaFromMsg(STableMetaRsp *msg, bool isStb, STableMeta * pTableMeta->tableInfo.rowSize += pTableMeta->schema[i].bytes; } - qDebug("table %s uid %" PRIx64 " meta returned, type %d vgId:%d db %s stb %s suid %" PRIx64 " sver %d tver %d" PRIx64 + qDebug("table %s uid %" PRIx64 " meta returned, type %d vgId:%d db %s stb %s suid %" PRIx64 " sver %d tver %d" " tagNum %d colNum %d precision %d rowSize %d", msg->tbName, pTableMeta->uid, pTableMeta->tableType, pTableMeta->vgId, msg->dbFName, msg->stbName, pTableMeta->suid, pTableMeta->sversion, pTableMeta->tversion, pTableMeta->tableInfo.numOfTags, From 8be78ddee2c15faf979f1dd4d4980f743ea483ad Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Wed, 26 Apr 2023 14:23:25 +0800 Subject: [PATCH 41/46] fix:[TD-23881] check the max row's length in schemaless --- source/client/src/clientSml.c | 45 ++++++++++++++++++++++++++++++- source/client/src/clientSmlJson.c | 2 +- utils/test/c/sml_test.c | 27 +++++++++++++++++++ 3 files changed, 72 insertions(+), 2 deletions(-) diff --git a/source/client/src/clientSml.c b/source/client/src/clientSml.c index cac559b0c1..57458ff8f7 100644 --- a/source/client/src/clientSml.c +++ b/source/client/src/clientSml.c @@ -649,6 +649,17 @@ static int32_t smlBuildFieldsList(SSmlHandle *info, SSchema *schemaField, SHashO field->bytes = getBytes(kv->type, kv->length); } } + + int32_t maxLen = isTag ? TSDB_MAX_TAGS_LEN : TSDB_MAX_BYTES_PER_ROW; + int32_t len = 0; + for (int j = 0; j < taosArrayGetSize(results); ++j) { + SField *field = taosArrayGet(results, j); + len += field->bytes; + } + if(len > maxLen){ + return TSDB_CODE_TSC_INVALID_VALUE; + } + return TSDB_CODE_SUCCESS; } @@ -781,11 +792,15 @@ static int32_t smlModifyDBSchemas(SSmlHandle *info) { code = smlBuildFieldsList(info, NULL, NULL, sTableData->tags, pTags, 0, true); if (code != TSDB_CODE_SUCCESS) { uError("SML:0x%" PRIx64 " smlBuildFieldsList tag1 failed. %s", info->id, pName.tname); + taosArrayDestroy(pColumns); + taosArrayDestroy(pTags); goto end; } code = smlBuildFieldsList(info, NULL, NULL, sTableData->cols, pColumns, 0, false); if (code != TSDB_CODE_SUCCESS) { uError("SML:0x%" PRIx64 " smlBuildFieldsList col1 failed. %s", info->id, pName.tname); + taosArrayDestroy(pColumns); + taosArrayDestroy(pTags); goto end; } code = smlSendMetaMsg(info, &pName, pColumns, pTags, NULL, SCHEMA_ACTION_CREATE_STABLE); @@ -837,6 +852,23 @@ static int32_t smlModifyDBSchemas(SSmlHandle *info) { pTableMeta->tableInfo.numOfColumns, true); if (code != TSDB_CODE_SUCCESS) { uError("SML:0x%" PRIx64 " smlBuildFieldsList tag2 failed. %s", info->id, pName.tname); + taosArrayDestroy(pColumns); + taosArrayDestroy(pTags); + goto end; + } + + if (taosArrayGetSize(pTags) + pTableMeta->tableInfo.numOfColumns > TSDB_MAX_COLUMNS) { + uError("SML:0x%" PRIx64 " too many columns than 4096", info->id); + code = TSDB_CODE_PAR_TOO_MANY_COLUMNS; + taosArrayDestroy(pColumns); + taosArrayDestroy(pTags); + goto end; + } + if (taosArrayGetSize(pTags) > TSDB_MAX_TAGS) { + uError("SML:0x%" PRIx64 " too many tags than 128", info->id); + code = TSDB_CODE_PAR_INVALID_TAGS_NUM; + taosArrayDestroy(pColumns); + taosArrayDestroy(pTags); goto end; } @@ -891,6 +923,16 @@ static int32_t smlModifyDBSchemas(SSmlHandle *info) { pTableMeta->tableInfo.numOfColumns, false); if (code != TSDB_CODE_SUCCESS) { uError("SML:0x%" PRIx64 " smlBuildFieldsList col2 failed. %s", info->id, pName.tname); + taosArrayDestroy(pColumns); + taosArrayDestroy(pTags); + goto end; + } + + if (taosArrayGetSize(pColumns) + pTableMeta->tableInfo.numOfTags > TSDB_MAX_COLUMNS) { + uError("SML:0x%" PRIx64 " too many columns than 4096", info->id); + code = TSDB_CODE_PAR_TOO_MANY_COLUMNS; + taosArrayDestroy(pColumns); + taosArrayDestroy(pTags); goto end; } @@ -1514,7 +1556,8 @@ static int smlProcess(SSmlHandle *info, char *lines[], char *rawLine, char *rawL do { code = smlModifyDBSchemas(info); - if (code == 0 || code == TSDB_CODE_SML_INVALID_DATA) break; + if (code == 0 || code == TSDB_CODE_SML_INVALID_DATA || code == TSDB_CODE_PAR_TOO_MANY_COLUMNS + || code == TSDB_CODE_PAR_INVALID_TAGS_NUM) break; taosMsleep(100); uInfo("SML:0x%" PRIx64 " smlModifyDBSchemas retry code:%s, times:%d", info->id, tstrerror(code), retryNum); } while (retryNum++ < taosHashGetSize(info->superTables) * MAX_RETRY_TIMES); diff --git a/source/client/src/clientSmlJson.c b/source/client/src/clientSmlJson.c index 9fd98e33b7..b0ae316031 100644 --- a/source/client/src/clientSmlJson.c +++ b/source/client/src/clientSmlJson.c @@ -575,7 +575,7 @@ static int32_t smlConvertJSONString(SSmlKv *pVal, char *typeStr, cJSON *value) { uError("OTD:invalid type(%s) for JSON String", typeStr); return TSDB_CODE_TSC_INVALID_JSON_TYPE; } - pVal->length = (int16_t)strlen(value->valuestring); + pVal->length = strlen(value->valuestring); if (pVal->type == TSDB_DATA_TYPE_BINARY && pVal->length > TSDB_MAX_BINARY_LEN - VARSTR_HEADER_SIZE) { return TSDB_CODE_PAR_INVALID_VAR_COLUMN_LEN; diff --git a/utils/test/c/sml_test.c b/utils/test/c/sml_test.c index 21964403ea..76dc66169b 100644 --- a/utils/test/c/sml_test.c +++ b/utils/test/c/sml_test.c @@ -1132,6 +1132,31 @@ int sml_td22900_Test() { return code; } +int sml_td23881_Test() { + TAOS *taos = taos_connect("localhost", "root", "taosdata", NULL, 0); + + TAOS_RES *pRes = + taos_query(taos, "CREATE DATABASE IF NOT EXISTS line_23881 PRECISION 'ns'"); + taos_free_result(pRes); + + const char *sql[] = { + "lujixfvqor,t0=t c0=f,c1=\"tybxdylsdctesxshtzygycwgicbegupwlocvpijzdybrklsjwtuzclrsqwfoglqzvwywspekqvybdcuzcvsehisgjycmknffusjnptxmwlfbqsusxvgawcrhivmkscabawtjjyszyriojydlxxostnyisxnrtbtwrnficxxmcvgjgxoxccoqtiwowielknelifchfgecighcczyoqszpwvvqyvuzjuyuddcqtuzaifihymwttlzzlcxaobwgfyqtocekdcuolqwylsxgznorxzieznrxrrvmvtvkcfksahsnklyavsytmmmgjzarqkkzbdiocrupuycahrwdhaqzsgbfqxdwyisispodrzkhwgdodimxjihyrhprinfppknqezmgkphxmfunqshcudxrmyyrntkkkmwkdomcgvavdjekcwjkqcoimcdlzonoxwnfyeduqbombbzwexgbgkurbcbmeyxvrmmedsxyrhnqvbgimhamcrxsqkelnvrogarhvjfisinzkiurxycsaxgouaelgwjpuunftbhblrtnzkwmqfkbfnbawiqpjpacdadatotqshxpbvaoioxasbivpevgphgnurxsstxivpgcdxbkaipbnsejqpahsoeodxxazjozchjygksssebnwsjacdbkdpvcblagewuviwfnyblcrililpwnartqcqsdhwtmmgrbxswlsaskpaafosiptvhlgcgmvwsqtkdphqscwwxilvdsiwptzhnzgyfoejsahswmndszkrlatitxskfywgpxafsspoqfzzwogarceudyokprfcoaphqfkfslwmlgpyjuivietnhkofoibjwhvdbwbcckutqbejoovwlsyuflcsjznwnovjjchhgczwjesczcpfwimhnabyqlzihocraosqiaenutvvdynartocvxhjszdtvyqdnejbufpbzyyrskhdupjojkoheccpfbaoldyvgeayrjvkudbiqkieazsmpkfqunlzxasjnnqczkithgcolctdxoefuwgwdbusiqunwcuttzbnwzypwaahawexjpysznwnjyrkyigirmqeszzlgkwzxkrjkgdrprxzzwtzylwsxycgkqwsuxdvllkvxdpobccuxnnmdzqjmvlcyxoljgsztgmytrvgqeewmcpchmpexnobhakpykkftrzxqllgvhpdfyyucpshmosbocudxbttciqzzechzvtjigxjlzbfblfeztamfxmdbxvrhunmpfiavoryoitzsfeemzxpadgodsoydhalzhnghicpniorhcptwzfryucpefokezviorspzkfenyrbdbfkdnixkfijytqrxtvaivfqyxqikladjhxnjndammqvizckinppmwslyyhwkfyyjrjjnpefhesbdkpgjehochlvhskgacmbunndjijonfndvpcyxpuuvwjyfmaejnmakvrfpvmjusomnfzooplswmlbhrjoardxxbaemwgtyufyqpgzsfrxkstoohkshspnbgqgsvmlwbsivfpfwzwijthmvothigzrvhkqlmkwzwvpgedveqiedgoshddorrndjykqowfrohdulxvktatylnuqfqdidodrfxfslemggzmwfqapmgnndqvagtxffetpgpxijzhdpletiwurdqowjmntuvikvkzphvaqdaqznlhtmvunfmlpetysqcpzyjpmjjgnbxollkmwiuhpyxuyejctqdelupexjqpvnowudzpftjpggdtdrxkqgxpzxugqzbgsfkywfvbqzzpcokkdzslsmiwvwbfaijrfldicyhmxdxsuycnbqzejzkvlztysdohdcxiekckmkmfwlnpxlyiamcqrkqrdomoryqekzvvymppjtwubqdatfplwzhvlfhyqiinzqxhyhnymccbogggxyrezckjfqjkhnlopdkmqilfpjshuszdyudyhlgqlngaageodtpyzhdgmasrvgzogiuyhgsjrfzfvkwfpdbadqmugigiepzrqgzibmoumfmrxuuvbaaihunaypgdeaswzdbaqoubehpmfqbklyodcvbgpppputmldxnjgcbpcjjknvtmxfstrgxbylgkucbuqjtfswlgjgtdgrzcgjjonziolmceutclufnesxchwoecperlpwdwpicmspwavxsjunoipxxdfbyipsiojmpdvqygmqsysrsqvhjdunsimkvkvvconhtnnnqhhbpwndjrtapxqbchkrinehqtorytxlhbjtjqkitbfkdjhnthevuxnlokkqnnaztaarvfmsfqcepxgacwomwvckhsbejbioxwmojnooyukswstlwqkasiohatkdmfozncjdawzgaroybvvlcsjiiojxuedjzgwouookoxwfnksvoislpzllcitwwpiafeqcayktzurnoztdgjuwhjljszreoljjowttsteitrwmujqdaidhlcxfzdefkvbkmsmuyhozphcyuxwmpyipxfxdpdfojaksqhefqwhpqcplgmomuhezvcwcrdaksurrbqirlvgjjezmmooflmdepohrijqfwbiqxpepnexbpbdwvvzqgwzquvocsalethkqetdgnexughqqnbnytkmiwrainnqlyuwuljkffsjaommyftidtyamffyqedxfvacnvrrckqaxlwyvjvvaztjqxmtuiiltrrlntefluclbrkytjstoeznorpomhwtluojbnzqrzksaedosuslwdfftvcilagbrrxweldblmeclqaskclradfldhyufwqbiitwlmtccaxmswhjpzmfccqcxzyoneiudmxndivuteqkapjpnqsnxksgkorxwkjwkrrbkplrmgqfcazkjiprhfmxuxshdkldkfmefctapwpynozskxpxrnsluwuzdvhprgfpjfddnzncdtawkjbnktjxogaxhpcymxugrdvlkrfilgsvcglklihoiziarzuawuggrqpuhhnpjuijllckkruslupluzhggccebqqxktgfxjrnwamwopzqqsuvjlzyqnmudfqfxvacuoiwwhmawooaognltuowfmbslbtiyxoddglgszlpdlkwabfbiwdvxkmyvnktpiscceiniuvohafyudpxpqfowbwcuglyzbrceljxdszzozpyrmuoewmanlbfzibnmoyrtowsgqdglikzvvqrzjjoulopqnfvhvhdqynamxlcnbscjvkogjwqigpsxkkpwzejwnwkxtqjpibfrropketlkxolxhpdsjkvcduxcfregcogjimqshjhqamtcwefdzgkelhojnfmpcnafvhdpkgsmzmatuzivrsaowkaohdeeybbkzljnxcazvbobginldgseyquzwqyxjccvagnvofatcfhpfwmrdvjfqdovsxhryrpksxcnbypntvucrhovaupbibvqozvjfmhyrayvqizncbusqfhuhxaffshymjfubrohpetnretdvshlxmurqvdtymawuqyxbhqtfkebypnutldzelwyhbexsvznlyzeswxdymisetpybygvsegmxiribznlypjrnrlheofgavvlfxdaeyepwelpkhascutjaskrgkzddwhyhexegguqwpyxtuusystfsthwhaabheqxrvqxoshuairbfxhxyzoxslwydstlebiansxnjlkcdondfnillshxtagbvufpnlzhlfpnlxbrtuuesiouktwfjpnkzwypnperyakqrmbuvjdzfmayjsnekpiozozkhqwusqucqeqduhnnezagclocdfcisfdobjafrtdusmcdwtzhrdylbdvaudyolxjhnnxbqzyzlvesifftcczwyvxvpxjgnrddwozhazbhgnabssztudplvhhjxshnhpryiekxurnegvklesafkvuifzubljkhsrfufabtrykfdwexjiqpwkcvxbfhcvozvxzjubvqzgaxjfrtgnbkectdbbozqqkfymwcrbxfelargrnqggseceslnmeoyskruxivvpslxyzccvbxejayvtrhpykjyleoevwpzdetyjncwntfjyqddyqgbrvdtgoyngpsdvtiqwcyugvvjvltuhuwrxthcnrmjemvfluccerjylureacftsfsmbexudajyyehohdqteffywxstkwtkodyvbpxddjbmrwiccaxisidmvmgiligukllqokyhateqcqkwsvvzyeejaqwsmyxcsaavcvhshdoidcpuioqeqwjxzpceqjypmlnosupcbglvddxwsvmnzjnwvktpdujotjftekcnxiwyvmucqskubkgcmcpfsixynqdgxgjrjdxdhrrgluqjqunbbepizkchmqmrlioonlhxgluldiijonwryoffyfxbwrdiretxeedlaeznyfcplfxucxwaygjgjzpvtbdpljsuqdqlcoohgqfqtxrbkqkdjezuczuvuwjdhabuvpzlctjwzlqkbrmglffkdxxhhfpruhsbnxtfwnlulhenjbzddnipxkvewdakueehpkllugcmkoyzvgryvbddlbmudmhaznghbpzthkzvowqtubhkvihdsqayytztpqytdcjarkgnflapjqcpeoffakggnupyebaqxvpwmqwwincpmnjtyprjhyjhwxcyulgsmcxuihpjfltultigzifvsqdtgagwkyniqycftqzebioccfragqulcqlpzwdcmygehpqzbxvlbunohlfnjfpbwxwrqglyldhzsxmndaqqctxrzugomxkyivwlrrhkkfhmkijndrqdqppdtnvsudkfnbetzdelkvezaedxelrqekktarjrwxdxvpjwksavwbkflmrwdsanigmgdillfrxhkfmbivlvetiqcfmkqqqrdhsyvtvsiijkjbadizacjwsifcbutsikrqhhyctanumwdxflvcpwrdccufmufmlzomxtsvhvawoypxijkdgefwdutiipyoudnevhqiwvtmmjchuvrjtmbdbscbulfijmhpeilyfmardjiprckybweyccrenqkvvrniimwtsdleorfrcrgfbczqsxckciprbobdclcnpeibzqcluvyutijtwzqlrwjxspzqleeatzmqtsdqnuqjtqhacbbvkwtbteudvtmqgjagiqkjmdhuvfxwkucgpwkqxpsewgpvfqgubkiqgfcpvwlhpmwtjahqdhjhmevgdoikopiqtrfbpdmbeyzxdzubnwdgwqdtxcvdqijmpuidwplifmemhzfnegwkjcoszyewvwwqzjldgsdlkecasrthnmpfmrzcvgqgiyvgbnjqrvcwpdfrtkozwncxbnfgnjjuzgbqpugsefpbdxltadeuyrwcejklyjggsifvnetzwvdqbhlakbtemunafezlkgzzeziuxziwyjxciicokcsxxzefiosdfxmvcyvvsjtnqedncbpngkqwyhygdwcmjdnrrtpazdydudewobwyzfvejbutmktcnrlirjjmzegnraradtinrrbusbzisrfrostexwoeusqrxbuhhdycneorvrwxdixhjktnhssqicujibyfpdnluulpqmxranemqtmhclmcaznagekocqttjalztonnvqdxxajzblpizdlphcafbubavzqlhuryumvxsjjnubsffwduxddypvgvtdmqozgrhwvrwmdpjvdbexqugrrpxpvayqbccxgbvhqejmzuuobtkwopledyuqxlmhhawvppkjbyrrtjxitoytspwqomweunqplvagndtgvahwxkfxbeusydbbfurgtwtgjnryljupomgksprjqravlvprcnhoaagpcwapsfoucokrlpmcjtazxqspgyzbcaearbkptcyhkbecpmmjkzyxwdixbebqkgurdqgybvsmzsenxgljpxcfjmvrrrxbnvlsgdwvjmsjvhttdnrgowrcgggzldxirxluxrjlbueqlqrnmvajosdwyjiwwbmqteiwmifrsrlfpvxuoxykpukqfsgxdxunnbbiuoivyczqaylyrltkbsucrwxoosghizxztiqlbkywasxkyqhoesuwdvwzwjfnznfrkbjmlntuirfboqcpkhqfcfjdkoroydcnpwtlymvbwvdwlqqazprpjpwruvtmaoazyeddxqobxvqimqapjswmviuotvkvalmgjdtrnupiloxihdgcbujrqqvcljsksbxanffwhcxtvzxpwvhoctthkidvolnvfrpmolngrsxbbqoqizmjcvzveuarlbrcgxwwqrdefefjhjqmmgwdkipvsriiiubfhiffcpkdlbondnzmelvlhwlqlpbhrmugkeaonhfrvcimninyzauigftcesiihtumuxwuktbbulqqjnkxgkdwbslfdafwdentobwafxyhyhbasmiibaxjoyavplbnqciuvwpzgckfrwuvhbgwfcwzxzqcmtytrfelbvgfdnxjsuzeeiuqfkmrfmudxktyvupucnlfvnmkxscslxhzbpecbaiqjnbydrfwrgptegptfzkayhltrisahwqtudwhwjotnhxsvkgviuciagqvlllumknjtjcarlfccaslbrqpsoihlupkphgpgwgzodtksgrgexcaybrltrlqkzadpoinhkmzoapdxflyexwnsgknmxuupnhijxltmwdzjwpsspotmkfothqebgmfiafxdytvwuwptyrjepyjihxxnfdnuyxrcdzppoxvjjiujlbjtjuusdtejkpuiompzkhrqvskcjnhehskjybmqaryryzzddjgvwbwvozxaxurfoxnpsfcmyemeisgtfrhrbvxdqdmkklluemluklxhfmsxspzznlurzcuswdfsdmgssadjlemornqupbwbukizzvlufwxogmgluwdksnevsvpqzutevsyidudtphvphqtdaqsemnpcpicopkxmgazmdqfnxjxbuunohrvmknumchplkvvlbqgzpquwlmlcxiuevgnepdfvklwplahzgsscbghfjagcrqjlpjobiqdzhqswtiojsrhbdjmwljowfzebncvdxnsvqgkzrygetamrwbupghasymtiwkmlndvhkckazssyjlymkjotwtbdfbwecfrsilltrpkaeiszklwqcbkxepmenazonihsqdtvxzeojlbtlprmsfzxnxzdguhygtyiyqnhfkussqxbkrvstdkxnovtmdvcjmaugeizqknamjnpuwhalxqclygvdnecomtlzzymlbctwfufdvkqzedoeeuabdqnumkmfqgvdqtexmpeyiikqycqxtanlnqvbeunaowyqgjmdafxsopblxmimafeyvzmxmeqhhngoxygmhakwisvlnhcqzurxlitwplasuqzllrplahahvwwkqfxktigjanzhmfdtwsdydwbvbwwimmxszzwlroucukuzannqtrrgqztkgepipxilxxjcrwfdrixjdmadhqyhukeexiwjmqswhgegjvawsnntgtjncspitspgvipxvxsqvofjfgkzkbhxvnqthikgdsqyzswprfyxsxiozwjfgnziurlclpoucwpxoqgaqipygykyeltpkfvotvnustvzlalcgbqsoojzjfyomfwmepdwnfdtpyhyjfzqgjokyujudzkfrzsnzpuerxlffzdzadgcslpivtaunevdzbynyixhhzanumhopvlsvutnuytqbsyaqwfaovpqluvcqowmjlrmollasvmorzqptldwpavcdmvkmpnmkgljoiukaaqndhalataljocaowlwreswkcjsiujeoewojbigpsozmfenvzxmissyerxiglumbkgnnzwzoxkbzwgsxvhzlkqsfkeqfwnajkkymyunsoyukwuxfwicmzoadtvhesvqmzxwkuceshbkrljhqipjlsejdjycejkbobkkwggbfvmatdkqllkzkzbeeqpxctdvqjfejpnflyyqgbkveistvtpsyosexusayaawcblcwlfcuqjhjxvtmhzbccdjtorivyxvbzlrpzpoljnzowtvyevkbwvdwljynbjxahqxzhxhmaklckqoemeudjidvkclsaqxhavadwdkitdbuqjneaqvyzcyqilixeglczhobrlknjyyquxxnlxxiohmtrqkcgenwxxgglumjzyygrozfvvxsuautmunkraggxhihaafxghyyexwfwbqmqzynzvmygeakzmqnegvwcwrkjplpqfawkazkykmapleonxqukjqjkvpopfrujizaoawdxlcqhyzkyjwucbgsflvvnvfroybnabigpipyghsiyotdfeqrusgghzswuwvntlzqlgzsmqllevdcysuelxbyiyfofxyclmafrupqszsshakoskgtcsoecvaoduezmqczqxwjyaildgxuomhrzfbqqxfnkztjrvaajkcgxmwqvmrfrzojazdkjtsmulrzgrspwdtgvqkhxddkkxhkcasxlbejnsbdesakmrvhyaziigrfunuwjcrtwllvxqosgubtheowoukcejnkeywktloeilohtposjbocsvntqlkwislefrszsxnzjvtvlabigcifkpgsinbzofkapdzjgobytxlxpxnqtkzlqywetksrjfzsnxhshudmwxztaksskeqxqzakqebpdxhcjfrqjwmwlptgvvbhubkkrpvblzalfhvjaitreulgolcfbtiftwraluhhdceietxdhcicvedqcsbnpnsrpskfrrembdbhfxwumwrwiuvqelqfkypdihofvkgivahaaeyqljivvsykhcqzwyzpdtrwiimjiudnmqgbcgdvcqnyzmfyrktjeosjojhykwwqgvbawnobchrglwujfsddhztyhrxfxpaudksdhiagxebgsvzhkazcprmrdoxeryeudnufozhnlskvmbdwxqxlpmpzwujkinxhuyabvvrpdqafwpliohxydkqykejmqkihjmtykgptjwwmraiczztxtvatzarvlgpczgrbuahywkcmlcusrqyhcpssdkmsecemqfejiwoftvtchqllrdrztfjnmfitbbdoptpbjkrquqsusdfkhnywrymtlymlshqqwnnmyvmquoskahqopzrkioakiqsyhejutaqcrmqjcxgbqciajlqoeffuwvxmvhaxfuwoumxhgnccvzxbhrxembmohjsqlxzzhrynjnkobimzktxvxlqacglzoborokeazhvmkcgzdyqmaajdzhlfgobussodslwqfcpsmyhblkjszhyyhtdkxlsiloldpclulpbhiftyuxxhwbahusttnescewxsbtwjoclaudpunyenljxdguzygdwpnbfjfqoulfduyrtreinewgcsxfwrnohbfkqrmqloqyddprwedzqopudlzyurpzryaltuybttczggepmplazssuwshxasmleqivtgqhtioifmwqihnpcuxhdxaxwibybphxdfgbsawzwwawowtbeljudcyhrsdttgynrbcqvaojovpexxnevtdtsudukjbofusthzxjsnmjstenvnjxqektukpndxjfuojzmachfodeykybxbmdkuprqkkzuyvhhbwlvlwhbtunslevzaccdqxcibtwiuujwfvwowgiubudppeenmcdnhthnkmymzdbyianzgsilcidlefernnpdaottybwysyclmyrgfyjjbglifbfbzsrrqeyebtbdiwrqjjmmrcuzoxuafigderwgcinmivdfmgvrzwettesjpkaptfyogfhbntzwywycgvelrixpgaclbcwabghcldjflycvtaijslaharpcosojqyrkmzkrxtofigaolnhbsrwosntcngeuxbmrdodtnaouwnmcozrpjfbltqguikjzbzmjdwmginbmbpkbiglcxurpcdkmbhvwicxyonpznbvaxhfzqqkosdzdbkftywxxfwfcgzqibsqwrpzqdntrobcfsjxplgzceplxjugfvgfvyrasurwjyqzhzapydjtquusohlpsmwektnxyvmgzcnymwiuqzorxvlvjkuxwqwxqbhcujlzggzypymjqpsfxtruijklkaaviufnygwomnthsvgzjheqoloftemnoqhwxrhrheqdmgejbyszlieitydasqrsbknrtqhnnwpabflhvfluitruebsdgxipjimeqqegixngbiyepzgjokkaadamrpdtleoakijpccpsvpyhkwyubcpbjxratjstbwnzztbyenvudidekaefzftaefraotafbnujgcgihojrfwkbqkppzusxpqhzmbsjuyrmjxvcydwjiedddgeypqytrevbvwayymnqbjzyjvxxlojwkdmpgfwgrlqgkwbltuejvjpaqcowfumrqaxrrzlbharznnrbxdcyrtufmkoxkjkyqisdyxpxqcsaembumiaeofuxurtfqwhiomofwxlqbedlbmmcloqivmjthdnenggqipizewoqmjqyjcnellxdnlnwlaxsruifwpajjcqkwapktjyzlqxhymngnthawemhkrnjcnghbdaoynvdtxmjdvrbyhteqqjlxtupjbolrlfedyfkrzguompuuthhkmkjdfupmnuyrehaeylxhlgjwprexkybaflumitudfilawpmksysktnhxbdrvpdsdxklstgejkeibrjlzjfmaguoibjmrzwjkfbmpbzzpmgwiafrizxkyvqwtfodmkwcbryrubkwduiaavxzfibnjigllqudqvhoxjliiwveuwxfzbsqflxuncxxzezxxqkxbnzaudjckdixzwckkfdfwxzkwqjujwurodouzomdysynsbdwgzvuaqhpusqyqsbiriibtuoyakddpcswwbrascztkqwkxtvnpafmxdwzjqodebtxxayokgoshoxdyqxlxyrscseasvvtdhxfeztiriqapzhcvvvuzpqncippbwhlbxokpyxaixcuwbahemlpdnayzjafupsqzhdbekhqungusybissgzkhpjeaiocubqemhkngdukobnozozoaagbwdqrluhwsxbfkbxbxmyrqsgeqswhdaxiummendqttvvwpoflpuubgazqmxehbmmchwqnbdlskqzbbnfllqteukizmskrbfapgbdwfrktwhqxlrzmuklepritlyrfmoyuzcrsqoegbryexhhpqxlufehzafotnxhcemqyfqekuixozczikejsyeevgplfoopqlprnfpricfwdvaeojlhagvctecqirsiyppjqsaosmrwholuxpxezirvhddlrlgmlukyjvziwskxcypxuatmmaywjreemktplsijkzblagncodfwcymmkfohtteypcorifflnwqckcutohaljtdrthvzkfuwpoxjtlpsoxkmfwdiyzkkdbjuanbtdxpfefbjkqonpgrtfwhulkssbotqgvndxpjtvexwafnaiczgtwlrtxrlsntxjzcesplwafenddrouaezrbanevpdkewojsyxpwsnmtyfrnqxrnekeselocmrdyknvvsfilayqjryqkfuwgcvpjjuveunfmwqfnwdrbyyyrzrtovwjeimcvotwrlxpjnzcwsppkysormxdlrohypvgszexmvcslcmqkzoodlxuezndemosvxrktpvxzyuymbvqdekzzellkonvicekxeoffsqpwwggoktypqmrwdkrnxheoxpsfdhvczrhmihlekjdvkvdnikawfhxuconhfqyahpddryuimdyshipxemekvnozyrvieezytfecydfixiydrveaamcdqsofbicyrnfzrgqsjdcpgkejrvdqgttjqvkqmqiesemvuafyowkeqbgxtdqfhrirofaefbogdhnwacxxogaobeaoglrofiryzhxmndgywzpdrrgimhptsrpskznohtiiijdnitaczajewlrichkvkzijkjhzrurzaqbdedpdcftarwsqzodkizjzltojvsiqnuuzmwnircgpodazxnumryyeqzxrwobzpzeauxnpdmabkhkoxvqjspnqublgunntcpoqsvrncgkojnmzjrifcmncqxeuvkyxmevbgmmakxscrmhwrbxmsbksadqnzvasrikfvhgryofnxzqzzknenhwdrlmdykumnsufqreywpcsfoeuxdifyivguqrrzyjknqzlwzwcmfehfcfkkoqfyfholtnpglpwodmwfhtwyehkdguhygzkbqcnjaltsgqdsvlzfkytttyuuvduxbssglbhgxzqdgturhaxoeaeigbrmzcpdtrvoeivmvtkiqrjiskdkdpqlualqjgpjxwwgtuglikhhrxcoqwtkzrmwcarodawtszzjnlwykzulclkoqaexvyhlfhsxreqdzjvbvznhwdcncfjscamlqseieufjvfiwixivgshyrvjyqlslusujnjosbkqcyrkhwqgmgfvkzgeugrsvtiklkrvjqjwcyrjemomtgewdfbdmnundgsatqdbftjhvvcvndmtmnswajowwcxiuhmtojthqkrzuvfmvbxdbvrxjbwijfuxkepzhjpdajilscqjgfxoldotaronmpkhcczehntcushirzzbhygnhzaryvehviqczxkckjbwqxubimjfjkwmsuobpwhcgywqxbwlgsasvonjpxwmyyfgasvsomgjgiavenjcbwwhqhbhzplxzqpyguecjyicsjkpcwwfjylqnvtdqoikkjbppaljzsnoxxgfxzvdygutlxnavblxalobhsufoyusyeiggxplniqrzcbbmunyqbfudjmhsjuqfpucseihoixjrhokgnscoeuhrrecfwjrdojflmqnsosailywobgqxiatgdgehlqooxrospcmxscsnfoidijdzjfudprkgkdolzmyccpseewqznnmzuxxtuafuvgykzielxhfhoxmyoewfhqlwwhczwioankvdugnapxtxnohqpclcftahzbpmzfwmtpdzqwasyjjfmalihvbkptxthuqnivalmqnurkxsjepppepcprbeczbrasanjlohbyxbkmrjvwexqxwhpbmnkjathbaygihnzhgxuixdledopbsgzwjmeocwgunzrkcgavowuevsutbajoiiytozuxxzphnqkkbgmqjqdwrqaqxkiamujoiypzfhqgmflwjrwjlbnkvzuwzwbhltzcxhxkedcfallyiywiowvpwdvpgdauwiaqfefbgxyxcfhszdoohwzdoqfgdzhdjfwtcsejtmoqaxkhdeagyvccplrjqtjxahlixxwtgdpbkwovccrhpmtqejliklpldljipzzxuwjlokvzhbsaarsqlyazsxxrixugbnijxifccfmteizbfhdzqsabjebwpkxyfooockqthtodjjjxepgyicpdnrndopdzkoucytywunnjsweavxoxonyovnqneqqqpwyilsobiiuegvnmwhpgsmsjymcrgrnucsqsdgeuwjbaironzfbfjnboiqcuhoqyqkdtorctjdjfiqbsjbjdrhjwaynbhgoigoprxhcwdrrspcbjjykqeydvrtctdqcdgbklfmbjyhxtajpvmefrefmlcdzbnllscvoqjjhpfwgagbjyjxoznbajpcuzbuxaolbvtaqkefujjxbedgbyrgxnsybsgwkuyukjsdfyxdgvusklfitokuetjlsshvkpvvfzxtmstjiftlpglhdjinjfoluokejsmmegioundlngqhlehmxjvobmxpcqhgljmpnwmluutgaryhjyjzkcgodxympmftevxdusledjaczzsviwttygxaswfgqzkkdhdgsphteqcycvjvvukchshbgsumvfgzagjkqfckqmpzvykuhcbbxqhmkkznjmimmopjgitgsddmjaogwsoublwaqpyhxlanprmnufltgaaklurhbelomdpusskwahiaonzqnlkpftiiycbnsxhpajqxsbcesedzpcdeowotgjrxwzlqllhgnudbudxlpupvzajnqngwsbkkgnqjcfgdwnypawuyuqoatdaxveziizabyktndzkgojxqaunonhupgndhxpwayzrkvqwzxriaskzmidnukxeunpulkouhwulnsnauwmubddzyqhbqsbnlhfuvdihmacylzenwuwcrlqtummcjrkqbfgbezgejcvpgurdmdtdkzzvviffxzndmxmmvjnljbnzjrtybdlacgsyzcrhqovlovladilnntzawsyxhmwyzldklxwzninbxxjlkbhifwgzpjxlkfzqblhrgwmgronvbttikwicibcteexbwggsipkubtqbhxemtifqrnfdaewbrgywfcpqfdacwhcsshgyrvrkddvghbvwtuwacqwswyaqcrqzyvlnjnzkrilimqzcwmhllzlindulxmckdhtneslpnlodzqzfxlragjtbngazbgrkskclgjljxfbrlhtsrukiqtkxigmrkuikydmqlbcibnkqtgbenlivlflmbyectljucdmuvbozumpopmkflsplzkbwtwcsarhqixsbgsqkhangirikdilewqdumsxekthzjgalyrzqystkzzebvviqcxdfzfecupgrhcrpulqdvtwqzjinecsdwambidunlxisrhnhmqtlaojxuhrgspolfhggbspywcbyflaagtgiliowspwkcgycfpchukewdulmwsdwrwzetilsomqtckejnutxssjyporppnaexvarmnhgsvwiodtrnbgivzzbzfppjebldtxthwsutydfqirqouxmxocpgircdztvhauayykwbauwozxknpfbddyvxsjfutbkdsaovcjkdpkfeknfsspeuydaxdkkfbxohsnmeudggxcxolojxgcpjqmowkhxgwgnxwrhmqfguapakhlerfyoqhwwawawcpgbuilcmdobzmwgwbeqqquejetwvnsziarxdvouugmetjjmhfcvnaetyvjbzmwwpkddjsxeqbdczecrlnzazjjddlduhbrmfhpkelmkhyvmadrkgxcvwyveyyagfmvtrpwdfrmefxotdrduliitysextojhsirlsiagqjbbvcctkcdmkcbthcsnfuxyreeffixdlowerrgrxtovtrhugafbgruayddylerfxnqnjpijvcyxlrqkmhufhwqsqaagrziaoldkqcwdallejbkurbtwzwvzhfbtggfezjubvcjkfipsnoowfwvsnezakllfwwhwrgagpstsddaxkivbmzndgshouzgrzbpqwuaquqjyobdaqliyuufjwivdtdqzutofvwinukwcqhmrjlytvchgdahvdqvnauiykevdyilclhanlrlnfgbvqjifzqmftnxcitirzyvgjjsmyjbxtqwliqoprikkfexvuiaqmonzjcmpdhcnutfunsftbicgifdynnpmaaexxxixfrtszbneujarczqaglzhfaqfbjikhfcogfcduigyolvcrqusassrlsnebmyqlspqvkxbfkqftbwtrmosvafmahhxvdummjsbhcweotqgmdzkxsvczhiummtzyadnnmvpbzubazitewofuievjzpwkyqwxrhoevbyvuosbclquuxatofrwfqmadptmgjuovcrlhrhmyafwibmrermfqkscompeexmtlannjqazpsruhwbezgfxkbpxqghhhtoudcesesfujdcmjecjadzmxrnpbwywhbjrsvzkymybqrnxrokzyorkpsssemgjvalzdavgupfybiyqbftvwscwwqsynmvxmnoyinqihrtjqkihafybaszfztohtombfgaarblacoaelaopvhqyomgotovmbyixzpjdjocleizxkocdyivgfmerqahdjzsiousuxhnuojgqkbjdykcnpeosgpzvwwqkdtukpattwbwepxruqtcxrxuoojmtzwozldfabgbshkztljrrrrdkscgvqbtqpeewxrbplbsrowzlyezeuhgjqmcfozjyinygjifdfyjvorhltqrzvoemboybyimtwpddtloajtroimjpggoxhfszrkwihedutonowdgudhnzulrdsafdorgxcymdzztzwvvtyvfxsqyivnzhcamystgvmussyfkzwincofzfkpijmsekofeizotnqchvgllmvmsptqqrryodudxtns\",c2=\"gbktdxiyhtcyabdwusjotcpfcyjkhejmztqkqchngrygrhxhdqhqicpfgtjmforxsfnqhhiqicphpjyuqyeximildnqsledxeulvlgkizpmvyixjueiqkaeldfiovsycazzafrukyabxrcpdxwgglfazjwztrjwinwjnbcwzyxwidkxhjqudnbvemeoawptqwmljfraonjagujeindnxmluxspoudowoxmhiignoewukyokbjbraszjjensivupwzlcizqwstksjxaxadmxeowgyomgacadhvmageboakqvrgwkerzgeukpbnfzxsqezybseggdsxrnfnewfmfoxarffcjmqywcorhuroaqjydgdgrvfaewgmuxosbrufejhllqccmpxqwpmdkkcibttkbxjmkwjfblawheaeprhzcirqvhguxxqkhvqylapygexkgpwxhmteuzpkfnaughjirionsiwijfhpoucpoxhnkopqslwfgzlvirzhiuqkruwubckmnxumkbnrdnnukssafbcebbhcjdmbcmmlkeaitvjrvfksyapfoipytswfolzpmabsbeyuzoruthachwmsegydxhnmnkdidejmbkxbsvteleqjepaxqdyxuiqnkfrknuqgybmmvmkyrcakpxubgwyvrtzvsevidmabieqfymoynzjjyywfqghkcliyzasleomfjqrrlgcgqegawhphsafasdjwrkqneugafrefqhyadpfnqnojvfqpmcoxavjzmnffpcewqyfjlsfuvflemmrxoddfbqprpwvujdxjoebzgsymzvsbclynhasoyuaypsurlqtacoulhjfzbbarulvvrutuhrbmdjztqubooccojgunlwwdyprkluiepsfnhrsfvfozyljimkjcewubwhjomnurvolstadcllfnascxzocwaxnmknqifysapbvnxquahdywzzowpfxzrpgccawmctajzwhtaqrwkwijyiussyinntujacpaswozwqjdrskcelljbwcdrmnqxbxrpvnbikwjhyesounmzsxnhwnrgnvplcdijxoojfzstospkdisijkueaozwrgxyvbbaakycrnjzytmtalinmhnzgpcjxwauicyyxbiorkaarduvmoomvosnhekswdkzeqdxaiogucqgnumbceuedzcjruemmfbtprsuwovvrtukslmrvuzqmuzwwvyshegnjonabvjqgxccjyvxpuzzivdstpxbrjelfomtbfxlshfchhkaauwdivewrbpcebjfnnjattfzirfwkjhotjjmyretffruhevpdpvptbhinbemqucewwrpdgcecwyphkyclteijeejuetoqkevzotovydvjdlzazouwwsdbmbfemvwmczepdybryaaegxctwroegrslmazoyqwirgrtrukpdfvaccnntktwnbifuvyvqmkzxvpizgupihuxhuuzticuettmtwbyxplrrikzwhdrhrdsxqoithfjcsvattazdxbsfzalshaugxdblpphgihebsnjgxsgwjwzokvebrffcqaxujvodtrhvjgfchpdjliyilxzoxyykvcnzteopkgbaqfjblicmpnooinkkctnvyvtvhjdrvyzdlczfrhbkxkprvlvmysltaehphbddcdrsiirkbsaokuvuvupbkrbzmtowsirkkiqbtpftrnggkzztfcbvuufwktplnyisdhorxtbhfzoonansxktktejqulorjqvtuizehhnnptcrnqbrzrtwiqkfvsarsnjwsbaofxggmstebenchnhyhwysgbvljpsfmofrmfqyxzluodrxapxtzyrwjjvxgxwqbkgontxnvpnatlraevbyzegdoybnxaxowweehyszoetpalfztwfpngyqiyfybulllicmzdtekpgyekhqfgontemyfhlkkqugjgeznydroqwfdxkimsakuicxoxyzuksqaqmajivttvrpgarsxqmjntvkozuyfcftjeysrjvbpzhtyazeflayjbgogpajzmptodqlkxubwdlpjsnkrwazvcdtifahvnglztfewnkgzrruhyjgbbqtdelpaxdpjjfmywegkzramunnngcdbyrzgruwffuxmtdwffcdymawvmdisttmdkhknnsfceqpzfyuaxltnggajcklephspnhxakwcsyzzzvwftuwkcqrijbbqvzcyefettcrlqfqacicoprvuvxeqecbgprfuqyincldclygvjfzbwsqdrqncyfzzfnunevnksiqeplmqbsibhmmgbrkpzfdimuofytoscprgokemdczkascacsyygxuxgqnpiwvrzzqreidzlvxvhotzdywfrrldxlumvzgvvnjbmadzflvdnbzsgmrkppyduzvlkvnefybimiadjdumfokwvvnmqyjvdejuhnpngsaggoqdwsrlmwpppvemuxxpdcfrriuwjxmfzryemksacnnbmuyacmnwxyjswqlnyixqldrbshavvrripyfxlrdjkqcnbbojrtkbgvesgujlooksacqhfdbamgetdplovnhljjqmjahegsagdfkpmjxravsmoyhchwejjeztnkixyrgxxswuthwsnqgumuvslqfhlxtuzawchvvshwxziyepyqtwvwevgljorevgczohpaeyaeckepxyvuwgaxppcyaqnrjlwqzlngpydoqvbyrgrwnpnwwnnyutsfioumwdnmhyajcndbhxmieioqnebweycevjvaqbnenxhxbvforbjokucjlyhecrhgosfkpwhowjuqnacirzyjsnjtghtcddupwdhlyadgmtoxlcxxsvlbfljmbwgjiallhqnmajwqueasywvhdtwhcrqeqmzsdnxpzjzjsrbnmlssmxeaaalbghrfamooumrlhjgiabpcanzlsxcxkzdgvujpttteynfumwnmpyeesoqtfyicvmrjvzkuusdlkevmepbivpxhjwnmsumnatvsdfjgiktkjyhwmsexhrxxspedhblfffkhrwbqwxxrzkwpkvdqevpqxlnobztmhlecywidjthkutjxnjvgdxfdaqyvqzkcxbrfyapkvmirijqejqeplqutogohvhuezkqnykusrkjmrfcqgvbnjhiifygztnxqwytdccgivbwqmcpcznxamdvycgjvujkndtqyvtmtluvohbaesurssnbwkfzbhbvlbpbvvpdscouskdzscofsdcjzrxiyibiedwjkulvfxvbllsksbuhcpypsuiufvfqglwlhbptewsmjaufmomdzqfyhgrdlaeugtziyfddvasrcgtkmfixeeeinnfpwdxocmxmyrhywiraisgalvgbvcoqxmzrdgcrhjkofeoggtvnjjgcuufgnzzvcqbnquhdybsbpeinisiunegdwrowcbtjhgwsouozqxzzwgllzbouwggocywzctxfwpcmdvzwrkznjaptgqfgxbsbohbxetazinumeohfyundmkpwigovlhodunwczozpvfqcqvimiagfyqoqsjzwtjuxpclttlipgwguhjbtqkudwvpbyspmxbakrumxfhjgpbkgchnddkphqdjtjaevjppiunemhrbkdvhnqiosgtkzmgcbxsbbsfqkquttvbvlbzuwsxyynpqicqmbzgbdighddklpaoxfheffsjfdcecdtjseyxtuzslkazqcbaexwvvpnggshwirgnmkomhreobzrphlumzeedsrhkrlbmzmooxkxumhissxywzhvymtfonhjkumsuswbewfllwbtsqhnyyhwsftsveqxttufnnfpjatlgmplhnyazzawcpbicdcbcgcljhivcjhueodayzhucsxkolwtnkxrlwqecdrgdxxlevacapfajtpmkznatwsdnhqheppevoxllwtqrnuqsnwxwpggjwnqwymgptmnaytczgnodjnpywxzzbcdembzwghrusvzsljnrucxmenylqaigquexutijtyxonmubkumyufdgsnrehofhuctdhqsivymlndqmwvgnesclizqeeefakpkzoimqdkzsbgweixhxxkjskupobzjbgucynyslqrklnyiqckymtcpfxahaudxhhtqrwnnqmwytgcxcomavrlypydodumwshrnrqinttrtnjzkqklifgpqdypddnbtjcmddgubvxhiuvcmcvavzomgprqlaqylyldosabcxijleklcrlrfhlikegkjtrocvjwqdgfkazqyjyjxxytwzsmhdvllfwfateyxqcodmxtmwnsqovilydnschxvrlifvzkacjrsilbjpbijvloqugatmrfkagcekyhesdmkqhhhfvaebpqdsmambainjyikirvbdxhsvazkvgnhomtfuzyucvqwkokbvmrrmutkcafeyfaqtnrvoumixsukutnvpwtqbyqpuhfbrtzkncfiiazcuhnoqzfiolfztacpvfmpbzpxtamirdhhlujmtilanjnekgjgqeikxrksksakapsjqtmjgvnhkjlepqjykdrgykumnaffvygsfrczhyqflbrprlzhowbomkqbaspqwjqcddryedcdlylguzehqazzuwidmudyrxcwnwnmxwelpjwfpwgjjfnqjunmaxjvkkizcbogxfcykrvuflwcoxfyjhiibuvxjuwwlxpmexdtsuixnrkfiwokxyqpgxllhlqiixsubitvzabebevgjhxuimagjbmptueteinygkjuxtphuoelhratsvjlrrxkrntnzvjtnmllljvrqkfnwprhorjmbddctcldwizqishugevemzthppahnrjhmjdzouqkehpeaiowatxndeaxiwoglhmndlbtlueinzfxajxxrreofsdpmcmlkpxkdcghsqquqqbnknwiownrstliohvjfqebogbjxzwdlgqyeqigrunelgyjbheuorbqkqtjcmikowuhtroljbzuohuohkyedpuvzjfhvzabeyxvnzkcfznjwdhyufofayoaeixfpcsvdzrpjolmcuyvjyjiwijxdgosvbmdjevdsoomjnubaoezcwcdimbbswxocyhigoxxciutvakbqmjrikgalxoggvetffzlxrpgahiaxujjibtexexurnoykmlorvtmupdqsbuzmhtosiyvxzzklgdvdodytpokeruozszybpjtkkjmcrzqfxanscdxjfyocviywmllgyctdylvittmunxidmyligvsalttzosvqoqwnemxurywwabtrmbbdkpazayqjtgvgfinfocepqidlwivfsufffknabzjekeefowowwakghguphpdetpwkwhnrspciybwrmektwwyyrdqfffzncusdfvaueoynvywvuwyubtaqzwprtcsklngyeqwpskyhahgpjrkygzevcsmjoodokineycadbeqpkqynjaevvxbsvnvpsspwgbotahlwvthaaisbchydtkiqqtpvkzwafdgjnxhcvsgekcabgejasoczoljyhfegyurirjggckoxuvlyjapmgsxltfhtaybhitcuknzdntzilpnyoowscrkivqzrdxhijpcwvulgwxolobendvtkrwdeywgmigbyvjgfmtwvabvrlqygyceawwgbktnrkodkuwiyermlxjlmowbjgjssodtwxiftoqfglfeyruvxqwwpmvfdyhqmluqlryfsvsdjomosaersveqtsbwnnljrlqpgbulkghhfoksxvemneujjdiszejmzzvwuuvbsoflwfiquonkhtwtifybhllhsgencyocoaoqdgeyffuwkmfixreakanytytqctdulbptidsjlqakpbhfpiypkzwolpvlyjxiwgzpaavbdasadubwuvinxnpvdsjzssotrmzvxmnnifausqjqvimsrykasgbkxvlixwqicvboxfrwkhxyzeyzcqwngiojucwrifyegtzcdjpphxjgkfjjvspphydffwaszaxntvuhubtzorsqmukttbqdiowvuwrlttlhnnodqablvjxevcegmqozxnktqqpvapmfxjswzgojfkbswtxqyjaaozmdyuthlhdxxtodzgfmkzhplinppaacumbpmwhujyqozmomnzcvjznuqexphqbyspxkmkyflwbpzanupzwmtwmewvrjzigkdoseeimtchqlzuslymvkqyzkvukjoyybqrvugblteyejozaiierunlwwwydtmeeggdxzugifvpwqchljcennboypxfxxcsllleszolngabpqcbwitrzwwskhguheeaojynxojxmvcwpcbxhpdxgaqpotilndchklvwjorelviuvzcmtomfpexbhbdzdoaxrennltjijfvcsbatuuudfbpxhbossijadggzurudirohwaekbudsbwqdqgmehltmmsdiiisjtnszpxtjzqfhlxoigqxrrtnjkbdvohqncmxritaiujvqpwomlzwllrrslowfnnbgmlccvtctsavavdgiuukmtkdpsmengisfkkiudxlrgpgeyknokeokgfwoinwxsywhphiwoafncgfudulmntwmgrkbcajfhftqkbxoskmeieadearjxlcvcysgclntgdxfzunbeanmtoqzofibzldefzzcgptwlsrfaborgiogbkqhdkujdzxglthwxvbpgcqcqjhdzhwpzepcsxscfqnucuzsfvnxmmbftzheclwotsbdltfaqbgwlgsvgwuoxbkmnpkusvgsjspqvtcoatlulygejttbqobcxavznncxgvqedqsytdxoptekfxzvxznghhxzkwlfyeuueoaykhqqocoryawouwcsyjpgonetqzkkuuosngpkrmcbovgifzzunyndjgugudxsgwutmzzygpbnrtssndrjurstewmkbcrrqznrgvanrogjksfqjksseqtuvjiejfwhviwthforlrvnbzznptdqvbqwraqtfhvbwdrdhoriheyjwicnarnojglmibvgzgxjmfpvwnpsisevmqhbatydjcbroknfdnnaxwfyugylhkeaieahvztldzvkaxgsoilegvsymdyaedryubdcryjbdshbqqchmpzfkmnjqtkzxuhnsvjszjosacmpswarfeolplhagcjippynbitkshlfhbospcysbeapflfsboqebxgucyrdqorkgifvbjtoivlyskzghhesmnxgyqnjpnivacszmrunydymoahxlqksxxqxokbywvxztetcbfsenpdwhnwcipdcaqrjllnofhnsppltqdkhbbqkyqtctcyogqqhnwvbpczlyzwlzkoqabfhhyewhehngsmmuwnjpkqghxbchagpmklenlpsdsobozanbjbmkimtzcwfmvigvscgpqvolyeanqsllectfsezmdrdcfwfgewnqsgjrvxpwlieojmwcwpudxvrnzelenzzqzdvljtouwspqxwrfwhojmvihuqazugwjoxmkprysrjjxoeihgvdohuppnweujlbuloleidasqjcumyylkrmvopxsayhkabbapawseytzaasbeathakuynlnppjikdmsrsxsmsjlsnkzjrwxmipssryivnlysrbydvxarryfqtmwwocctdkhbstcmzvnyvbdddpxmkaaozohciqhudtlqmrtladugjnjnqqrwqpbvieamavmrofyfpqgjiapzbibhdlaltijoyzfssyvcvuuwxabsszfrnrjrkyujtullavdlrwfgusajwordjrfprzzypmubvyzqwdtkcovyoyvikbyofcufxtauzaczjoovcuanqjnkhuvkhxepwebqvpwpixotkxvscmluplqrscyvodoqqizfoxmuvvtyrazsokdlliryyseqksmdowblnhrendcghvstojiysaithzshwnwqhwyczycyclkuqlzlgtxlroigdtdtjjcdqgthnobwkdgrctypxloodprvucnjccfaxrmhrizlnhmvgpjqphphlmokocagxtkzoyujaosgegnaqmosmlzigggwnplxfinccydwrlubnfcbuktuvzqzigzrikaggwybrceobeipldcqoypkieakmrtfgoxwaductesiumadblvtmxvwbyadsundkldbzinegbbumqsglqxzyvlzpustistittgpmmdplroqyhlrgyqiuttcjhuvllryhddujgmegmllykicujijrpkhjswhdpfnuqeimuchoenbhrkjbudmgmoecdtpjuzmgufrifrepetvhgkpskyoqdxzldghanzzeyvdoiwtxjwyiiitwjlnqnemwawtvryrbsiofnjnhvxqeimygfqsgzdyfzkfygqmjogjdkzlygrerzrzdhlzjvpkjehzzhpknmmkchwaxivdtlnuqhcyewisxnbfxwieliaopxerlispaduvdwsbipaehwbhhmlelcjhtvjljzsubusmuaqltcgbzztyuvkhfchueietozbdsgfblcxqbcssivkmbpvhpblrhbwwrmgspfxzivsyhubfrggasfvllymqiziscoohfdykcackgufyyyvqmiifmqudgzpxwghdeqtzzpecjgqdvuazegszacameezlrwazcfiafiqebsqiieolazctwplazyqsadrrqdmygxeoizzrpzamkuqjcoonwaxqpyqbqvoxyweptoruqootamklssmornmzeywgkppmppxujtnaddvswlojhgnxcbejrveltbkztgjffdeeeimmnyompgoowwtpefdgxvgahuhxoyydoheafxxisyozamuplzjovgbfmmtpbzukjinrtgqfqmbolvcqamgntdqhnsruppqywqacmytzotbkralagxzmewrklgjvvsaymhgaqhocdpilhqfdydyyalenricsweystosryxehtpkxyvflhdqtkyoxpaigbkrlpfdhqowfopjwnhepwknkmrrvfgnfjzfqdrzduulteuzajexildqdfntpqmghdrqanaduukvunfwyylxhfryrvyevdrkjeemuhiwcibkrozmwztfhnconwxmuvmeddjubbnsbvfzdvvjwpuablrddlrluhuavupbvgcpdrmdmyxhfomdnvlejzfvkscagxksahkqoxdtnuowlwbjkshhvpltppcmxuojcydnbmtncnfqeghgigldzmgzupufwbxlehdazyidwbfdsqkyduazvlkwwpiceswgndilkkteggbwqltistitqcfoaaxjmwgqhurysxydcrehdcwjrogqjkflelakffwjyxfrzektjepbgoravydgbgrpilkreppmdkwhteolfiwzpubwqfjmswnoyfgzktzdcfvugglxrpactfpjhwokdcqadfjnfcrkhzkkcyusgxuhaakzvponmccjjdjpegzsezakjscbhzfloxrxlznzogzawlrermoqnnmyxmqhwgcigqdavizcsiwmvdmrowiltbrlcaunwwypftpsctprgxeswfuppwmzuwypsanajafvilpyhgpvfnptxcgowyvbiycbusgxwurgxzxpjtytflxrfncwroybadfvpqjexxuhlsldaxcrwmkhljrdlduifzhilkdvdfguyygsoptfvyjoczbcnexuqacqbfxpuhixicoyfomfzcykifksrhqkcsxqguftsciikixsgkhjkfgyppjfafdcyzcbguhaqtunqadtqnptczmdqsfpccngyxoxjldqekslchvbqunjvqsqmzuyqllcjitedfjilatiwrabvowjqfpwdhuoeuprwzojzdqnlogooauexucthykvxcijqfgrbyjgoefnfscvvffomkvzellewgvyzbooodgbctfwdliylikxxzkxsxeehdvvdnvwjdykbiktdsusbfxbwglmjoumifnccarbmfinhtponkjxdvnejuzpnkkkiwidbbqyctobgccxvoecluamqhcdcwnsfcflzgozzhbigzzqoakyoczwrfnfrteayiumxuqugojlfvlenglofhqepfnzaxvvhcwkmuyhphevaphskyzrrujjnpvukozybauovsqnikhpidacpqpkrwjtsxiridtgebgmudphncdaufagzcbzvqnhqiueamhdhhfcyxlbesnaqbjzjgiufxpycfpgmnhqepbbyxnnyldtyictqgqdggrazhaanuosgcqqilnyqpmlhwwywabeoradrggsmhsgmfgcakrxsysoatxoagfedftrdwowvhzekvakflhyuwovomiithqjaythpfyacdpujlaroqstboqkmxqjxcjoreltkcmebqrhkvgltiwzqgzqejzyhdansagxtpxoqmrjgdqhqqogvcahqdvltifwrqnfpgnapqgmjlmgyoonghjcsaevtrowlypvgmkmfkhpocufpuvqkufxgleeyhzvpvfhvdwpdajtgplagmxsocjsxdpwygtigvuywavzihujwednsfzqafictknjivdhhhqiaktrjaeyyhipepcgcwmnsdgvukbctrdwwrbnhcrsnavksrkshefhzxkgzwoqbpvkwduebjxvpwfnufdvtogqsjpfwzutwlmwfxxgxdyiuwutwcpiomszwyodfttmedmojhwbfqrglcsznsigmwwxldrtlaertjcxdkmgabtjhqkniygughprqsgpkvkihstencpxfwtbzoncicycykfupewqluqhpwsdkkwlkkdbjfdhhctzdggxoxzeoetxulhqldjhgnvgmkaiwfvyhpzblzwrotlukarptvemurteqccygzqwanxldploevkvcvguebyoaqzsnfzkcuncwmsjwnringmkfdvkwiomfhorooxtainftcarojfgtsxydljtdvodndjvultedottiymcjkmckewmyefralfybkduxelvhfitqogcmkphostnlirofutkxxoyfszslfjwsdwhbtgeigyxwoowudwoqddmjgrmoaqcsrfjeevjqvmpzhfyhgmeqeqvzbuktmvvejcnhulwijpomtmzesenebjwghajcrpbalfcdamjaymjbhbolemcdatvdfwjhvowfcnnchchnsnzxrakzmbirmedutuecbhtawnzohdtreikwwcjbnrpijcteprpnvemyyfejkuntgtbmjglubdciggtponyfsmkoltpbhwppmushyjoqbiqqtxaitydioxaabnysiskegrvodubrtqsziufxirlfkzcqglwnsedrajknrdqthyqhrreichephybmhxjsmlickwumijnxqmakdzdihxeyrywoamwammpjigcfllkjqiawradzeidrgtbcegntiuqzfnhyegweefodjrffqsptpvevrkoahbdbufudnryplzxchtxlzturwozzselulupdbawirsfqemspwbhxlfzvvpeausfmgvfszsemonsoiwtvjcmiabcemymwxonqikpvftvphjrbojyabaujyggycgrvbqgvtcfnmvkcllenkmnnvsijitjvpgkhsuxonahpohyhxagalhqrfktefhweothwfigrymrfycvurblbxcovnulmoyaumbzzcrxodnatwloohhhqdhmbejqtdlsheymcnhbhihsxywijtptzqkphxnxijvoxqmqjcrednrpsovejsfppbseyvepmqmzuayjitjxnpbeixqtxkbyojgbkcoyyhatvylwnmkoulzrkprnfeaanplfikygbzaqfvynqiwbnktushixejwnqoafjzsvsxvbtfhbqnulpgibsmbttavotetdvoitrygmgatkmcrlprmrbmuttwjymngfzeiqyurjaqerlgfebbyxvhfklpvcfaapiduybsfrmqtzhcbhorpicoskvcenejqhqbvemaoqpisiqsqnzrwjhnwecrmbnkjvhymkzlsfjgzpbdtxcunkzfikluelrdmgsnudvsdrzotqxfqedfxnupvzugyqdndqsxzigkrzygflvcmjkgcxpaqmjcheirjdhkdqgjbfxxoeunnzmfolmdglfxmtamxllsjiqcwdsvpmrqxcwkigaxyikwqovqzjrndikrnbqkrsacpropabacutdzdgiiulskkdncyejuhkimwzknjcrwsekvlllfvzwwfmcufiuwlqckwvvxsbgwljtfmmcdhsuoruclebftsednfeywqvscyenwsnhngfdiblncskochybucvlubhwrblwrxeztlvqypzcijlpdowpdeajmqacbnndsbozkbjxymycbqsqcvvalusqqfuckkshaivpwjammevufcipcqqapazczhrnanlxehfwapdqtvvpumpxffoinnrardkjwslkblcwqmkqbbvpdgukqkqxabjubaotuzihmubotrycgscdkxqavdqaniwcreznkkstemywdryvfyzdrepxujcqpuazsbtpylqwtbxlrdrzprovhefcutrlwakwdncbbprmmmihchjpqqckcwudgfbnuoysfpkjxsmekfgcmjsrpilhdjgpnjfbhvpcmuyrgnufpiilpaehfmhiarakvhmtgjgvhxlhzzwzbldastgxepywscoawrnktkcridestqxlvmcgjkhjepstfctdzavfrhthmqatnjhkgwphymojuwxvrtzytengjnzkqcbjyklgzceaybwigpabfdjnomddwrwpqkxqrqtdzgcperndtfucshdrjccbeqrszbiqkqxpyjlarvyuozvsalzazlmkealqdakcbdkxjrvsrulykhcsurbjznufdnvxgafuvnljqyvzwgosbienmpsydbakqleautgapvpzrxfrkzigboxndrbusaeacxlhrgpjcxompwobmrfjwacpbadyfdudvxyfobvcdykaghxtofcvfptvutmdyorynyrsvakkkzyzdmdpikjsqviuskpttuezzvumrwaiyitfqevjxyovewlvqbtyyylbumazzfexbexljasfadeuwftznkjldjbildslxauisimcuarhoiyufdcrhgnjtuiaxhezehqvizgvtvzkyxmddxmeazxuadrschkfebbsnohnzhgdxuhnhytqlmeymmukpmrxqubmfdouhlanemtqxihqgxgwmywlrdlpasmvlecruinomrgjicnjcwhmdrneyddxqocnpoaqpdehoatssxuutojzwvgtmgdqewuuoeqdxefznohmumllnszffopxrelmadgkfixpvzhdlmvmehwtxezdqagoqmkjpzpmnlmosmbhgcakchmfqawcinwdtimxlikxcswbsddeyzyeuwspnwnjwsktvgkrfzwcbeuhkzhigjegchyyvtynltamfdowzzrsnlzkciidemkqhuwmfielywgvqftwyhwptgajusjwzbnwcdxsfjnbvryhkbwjnucnazaziwhybrsyvfzgbstqsldjjnjsncyhefpwfsviozwfovsffrwydjdmbyyshkspmgqjohsziorvjhavziblqnakebmcewqtsmapimbrxxkrjzrdommdjepmatibehxqfefkkvsflsxmmjrpzxefwnivmdxxckpwcznnqpihfalttvvxetyjhpglvatjrcvrcppnzcflasedekycezwhuobcqolwucksewxrlzrzlnwmbgyrihthtoqmvvmyemvrvhzsmtjsaxuqblopbljdqcyvagmdxlvfhaqjznrrmunyenanuoaonulihoqlcdksuufelnpppwnnhglxojejltxqzegicxehtcwlyoyeyclsikswclkftxymwcmremslaiqvfivzvojbxiwwlvxulhmuovblllybtggsdzppogoggcedszbtganflldfmujjpagtzfpnzafwrohwlgemfitgqptdzebugkcaicvujngtanekcjpgdfpyyeoputzmpaawrmkqbdqcfkaidxkdacvggutkmpgzosxqflkuzekimbxkcwhiucnwhlxmoulwotvbedutlnffvkdcodqptqlxpbwfzubgkcidrrfwmlhkhphipuvahhzeofdycjcniuttcyvfqruvsskjvwwstofoztwgrsbhmbwvuwufxcvbtkcnhjirbfnkvwfadxaorvrbwkhyohjszzeepbeooqrggujrnzbaufwekttvhlpgiteazpolhlhfxvxbaqzymzluulaxwbypbrornvvtojlobdnchebpnzeruixchhmsdjghhtjuklbxefddpjoxaxurxtvsprflewwdctybnoehsptmnophswidlxrkedtyxexsymbwnaystyzvrfxngplhijdkrudbrsivrcblxxzvselbsxzgpcudwpvqbjgbwkhzoembhswweocsfybvtuapmbhahlboyurnduztbusvwohusuqgqfjboqcxynnrwhqjakvuaoqkilkrrrgcaiatcuixhhahseelfyynfqjysbtxmltlpnawqelgzhtpoilbpypbkdbitkpluroyebqdrlzttsvadwqfkzmmlufkkcsidiyumicadnkqqwbpmftzamgmnhlrcrakjdhwafmasphbvuauqtoafhnskqdxguverbqhmhxsmegjgktqxudowzzyfmbqpxkzhrfvtmyqkssohwuymhcxkvilpkwoizmbsxtjywieqdssyjhhqwyfyxcnreyslelviylnvnlqytiwbqjbzatjvzfcjtwbvjzqvkkgdnjgegzjzdxxrwpqoxnymbslggzgbynecfsdfxbblksuootiygyykrgeesnmtaqgntigxmniyqjrivtgdfeqslesuaouewxjvaipowsapfefhpwyaerlfffnaasjuzvtixozeusbdcnpdzuesihoscbxhxxdewtmbdoqfwwmopsfrtzoijesrbxkyilzosakjtawazbytonefsjsfqimzvccwifgbdbsdvruyovoorepilrpsyilmzumaxazmzluqojtlqwgovaasiwuzoqkaxjyloipraxmjczhyajqicgganlzfepxrvmtnvuwzvoilgeuhliovpkntmmqplrqmesswsuflgffvsbviqinyrqbpfppskafusdxjjppzrrmzqmjvqkzbjxmewbvgrdlnzeoahumrhgekhcvrqosmtpwnfitlncplcolgxntugqofqddvtidzrlilcnyqxztepwwrttgprogocskiqkcwrhxbmyvghegndvkmcxxsrulumzemjfnlwljnzedhmheqlzsnrkhshztvypzkdbrqcsangkpmowlcfkkpzifalmmtexcgvhgiszstssshgbwjxgiepbmoohydhgvcxmeiyodiykfwqkkaubxmwlnclqpzpdouxwcfwcwrlunxhfpvrjvrugfjkmbvsyxfdqksvcsuhzzvnsjakwmutqlqcmzbzydxrvqwdtvohfdisdcsmiwutcsdvureydnplozpexwzfwhwlttdrgerbbirwpfrzpfsyytvminrllmyuphkoocbdgzxsnykantqjjcwywvnarhxtvdvharsgwyovcmttolujvxpwaidlwqtmvrhsmsmnvfutxohhralolautjgbluawhosbfkqrcbtclzomdrstzttetmbbiqvzetpyayjcvwjodkjcjdciubkvbbsycwxhebvxqigvktizeczjunvahzflturkmxnjnpllwhbyrtyjdvimwsehggpjnzzfhgiaswnhdrnhexibsraczwlluvaskhblqcfbuuyvwkrmcsjbcbwsbvkadcyccdzkqismnhsimirljyfsxeujsnuucgyelxnthwgrmicpulkuuyjiyeluclpizhkmzwnxkrvlijdcuoottlejvfvyhakmakkfwnsyuuheumqwcwqqcmszzskwclpirxhzaiwlpkxxfbmzalbntywytrgjfrfwjcngldhswclqsjklikordnsnupkzjdqfmjnyqpayrvzdnwfhqzumulaiwepjsquhmjnsmfpaiwmjsblntoiyqsvfessdausjqpyrjmbvqncowmfhqgmgkihfoeegammurbvlgutbeetykxpdlliekpvpzkrulyfrrxzwvwdaekzsibiupqxlbaunyzvqgtifephsqgkhfigfehrphxurydzokdvegitu\",c3=\"vxkcjddsuawtepxvxchtwskwqqrzennujhnrxpmleuoxfubjnzabiyveoihsgcbhiqbmjpokzfgmkmjeybeyozwukyynalxvgapnamoyqxrxpdlhiznbdzffeaulesrlmiekrawnpoyshayrrrgewfduxvanlrswkbnkbszccgxenvexylholxyvzaxgqhagdlnrothoyjmtjskgfbarbuvxsfvdinfndslzixkxkbutsoosptobakowrddzdhpqmbvqbloqunxpxvouiqaovcvrsnicluesufmzfnxceanmqaqvssakzkicxpzjwkzqmxkrqikirudmburkapifwfanwaiokpywaqtwmwkqdzmpbxrhutcitbpnukiklzkpzvgxwggvefosqcaakfwiganvlmdksshduidasgpocjeiobivplbjgmmyvxiilzrwhrqaiqvqbctlbnfkzysgtcqbzlbaufpohpwnsutpzlqlwveszxzrhtsqjueimkxwdtuqkjnguztdjxqnphxhodhskmmpbltwmpsjkgckllxwualstldwowvsadfszirrgdpkqckwgtqllznxiikohmtbhyqjmkkevpujfdjwdbhqqdppbbgesdnydtgrljdzxjvkurdjadeqsbpwkgbwmdtbpxbxmufjlesditdqvrmsujwzgjrvlthxpcnrmntkcrxgkjdistlatctmotlccvvsnkdtrzmvhgaiemefmsfjmvnugwwgcgttschxrvfldrjgccqdwadlwqeyjmpqqkmtxoxpbuxkshybgkbbhbuivpkgbzxyxyndqnxvlmbzxcotvstpjasvbcpxxtbownvgubdahqvljzubbbzwbxnavzhdocqxexrataojmgneaijuduroomfspimmflgwebprtjafcduirtvwobmzchrsavexxcqjnjzcmffsghyiqvqxtjcupawpnxvugrutjwihnedwvhyinyplvdakcirfgshorpukohazfaamacxpweiozjqvmbnuqznizwoxgpbqdexngztmhtsqrkwshutycisvaxzdklyjwbchhgnoppcrhkzxbtfvloxqhbzmyybxnrhdihtuxttajsyaaawlihinggcjvnvqscpcxzwynnbtcdqcuckdpndgzzaszwfnfritafwdjezhduewbtasjyvpjvltyqplxgzaqhedhyjkhsyofnzuaiqfpdahtgvtdopsegehvcmnhjytnbenuzbdpjlvvjrncfijkyanjmvgehmkdatyrmeszhkifcciwiftuqiosxkvijulcljkqoxkknqfgvzdmjtwkvcvhdzrzkbbygyvmkhhwyfvfztcminkdvetbikiumnslkdtuxrmljwbuadareqofjfkwiusxvsugfuqvwegjqjdswcipjkmwdrqhphuxahhfowmbyxdmldfehbpbbdgyuxqfrrbleevczrgqrnvxdzthuhcbcqokenixaldwyzmphvztflzfcjryvkojymlpvhyjwbpzjdvdkyrayyegidmlpvzahldjzdcfsdjkuigpetdyfujzbhkdrjauujpteotkpmjiunhripbwjkkuvncsxwjfzitmlklrhpmdguknivyxkgaxwylzbpqwsfnwdeyzhqvyovtaffwlamstodjybnbxzjpxmmdwxdmdveviqiymgrxwowsarcblphbjqxeunubzugxlsbcnipleumluhnkbtipmmojthzuwmttehasfrwmwwgxhlodyezvzhivflnjxfxijrsjvpjgmflqluwrtteeprceakeenhvwswoxpxdtveenwxdesymdofphsitykfdvahmgwevwjemfczvxsbjgpbymvikxndigoabcysnaoyvmspmtqeqsuevmvdmbronpfatcvdgmqfewzyjldebvhokgftvwgkplofgokofvdhvjkrmcjrgpaxexovatfngmxyhwxaeykjwloywdbjfyacawchfrmlzpqwtkayrkefqesionvnvdjloherriulnewgxsnbxijscoagslpsqqjymmakutogzsqnadcfbxlflaexcevswygpuvlhviahkkfxqaigsusmjbjsxailxavobljjaggacntcvxqltybhvdlxjtywfdszkltxpyklkcpjgpzqoxibjgcriastqktgzypvmuhmhjcgpmyimuajpdtpjnadnicmqmptcgancejqwpqusiswzlgpljiaytrhlygysyysmbkgzqvzugenreqdlwsjigzgzfqbfsrwhmidjuskcleyrampuxxlvpmmvjttxsesguyuyeptaqkopndlhifeawacdkdnkcytvqjsfllztmetciiwiwvwvcfaauvhobphjgykwxirbfvcnzybjaosekztvvsfoizcdacffruglgehlpbdakagvinbnqjjkkqnallyllcdfnchdtibkhfhdzpxrpyinxzvxukjqzszchdadjodqcsqbpwrrzofggrjxoukruiyticstltwyrepqnggocnwvronxzsmacikdzhmfwoejvpqcallhtbkclzihsfptttmnyozwziniblwaypbmfwwvhodeqabfaqksutyhhyvghwrdgmvenrfxebswqkdxzlipxrrjlrvkzmzcbwbwbpmppuygtuddnvtpwvxzebuhcfqnytbdllnvbbsjsvavlnqregweqnpsmxrzluepfkhqmrnslbtvnetmezclcjcbcjjowyccwdqrnsczmaqyyikhcxcrpdxzfeojplatokdbebyqfapvrqafirtlujdyweuxerrnqhzsxlkfditeqfvsmgsayudxxrpgncsaaboslauuwwiaudlirjzzzqgxdefuuhoauyqxiyoeqltafenkilqinmvnobaswvumelcnqebwdzcsamahxpnjejiehqhkahqiijqhidizhlbcvesmmqcolscsgjxkugytveczeqkuyzqeieyfqkxrxsrgetollnjohzazbpetkbpptkemvszcgbhofiprsgeenxuplbkwcvrwebbcmvnsoflbrjhuebbotbwxqlbfaccqjeglvysuwlmifnrqhydcyotwbxyhobgvcmtxcbbddahdxjqyzvnxrkjemcrpmdpbbsiyptxwhfuqvgnnazfkwawfxlwmowzvbrkuexzaqciflhmitxdolplxuwirertdqpomnnuyihvdshrgagnitzjubzeztnlivavdcxutmhoorhkvgburehikmjnjanogepcmpydipkbuioluwkbimktrfdqlnqdaaffuivujwdbpnabujflbzktlnygvsybmjedtcpnhcsjaegryryhumoagqbjwjaswccngzecdprtdaqnrwfrgfhbskqwrackdbiwowuojibenlnygzacobehavuvyswmginattxunmyabciagzblprwmzmsoqfekfjeniacqkfgdgbmvifpzjudlwufomuoqghukxitmxedarciefmzusymbxhxlfwkkhvkdmymtldkjyrbkytmqackabcojvztpoaspqhhnobqybwbxauywldgbugzycpikulerotyfdmcsxdmdmuiujsxpnppendgoyqpzyfoxjrpuhrphjlbussdavuzibdrjzxpieqxvpzlzmwosxehdhsvmbgejlxhsfspnvplstzkepsuocdccvgohxutkagtiumagzvtycsmxtezhpcvfgjwgxdiznntcykukzabwypejptvmbqkwxueyrmkxsbccjglfniejuomvbxyrajkmvphrixvovnhowpsfeaqgetvxulqdnbkaeodzaktdcvzxsedpokfttkiizuvcsrovoefbuivrudyxeltbfcgpvtllgqezqtxxwbnehlrarkfzylempzrffggibtfjoesxdpvdnuygszsgdtspclhtcmxptcsxcvcczvgkmcbsxxxjvphyliyavjobhgfkrvdapbtccjwhisqcszbtkxhidgkutseylkelkjbohdnttjjrvbwlnvydlztonqfffnvnltlkhzammbmigojosqebauzjshzlmvrjlounkuieepaccbgkvsgmhwkkxhrjrpxvaicybwawqepppmtksbbvmftbxzygrjxckllfczxhwvffbyrfofcyqccmwemgmgtotelgfceanpbqgtvdfdxllwaopnywreezllawwtyndscvlnazpdtpsjbedsdxxctoknhyovyukjjbciqfyhmqrpwndsotzndgqljulgvmsvpjeveuuugbfkuzftmrrplatnqedxfugiqiygpkkwsezgkkysazggzxjvaqevvmrfhexkwnszfdiqcqtfyhyuhngbxikejqdumrixgrhvzpojekglendurvsypgvdplczqhgvzxzalaqvppxioxxzztqhiqztoeghqwbtxajeabainpbjusjwoclubwsawbzkomsluvzzgrqwwrancoijcbfzsqlshhfzgvemnqsayluybkhixbvpaffheanfkykswlupntvqindckgkvbzcasqmhgfshlohrieqcwfjrwdrdnxmwczotqetaddnliazgkykfldloknouqcsrzuerkaubfisparhqnsxqdsmafhrvqsuwqlvbnmrymdgcafzmrslzmtihnnjkmnfkhqmiksjehwrvnmgepjndcqxybqzelmecerbkjnwfhmigxrrbqtyqqhgqjicffnlfmwtwzsxdlhxihxndslxffzakjezffvsdzgfkgszbuuvapttgctncmisgszmhcvihbkaduggmyedenkfgxrqotdgbqxxlyhlzfntcdqmtbxxfohupdgeaggmavwrrarkltzevgbugbxckvopibdiyldafvultvkcbxvpiiqzemscdobfjflpftkvnzbbvmmhqktbyeuvuqgxghqrulqbqvaisgesmymqlotumpadyltchbfrrmvlzrooxdpybebeekjpkbqrzvurysderyqdhgpmvhxpuwcukrnnnpgnyhnhgomqtrxwwtnlzojyelrhsebbhxsnwuoikpndiyplzvkzbuuutnjdkohhouslkashpiuwzjggojdnwcgcceeacrazajorlqjhbadoplqnmksxcjbyfvquvqsrocnrjrjtfxrxdlskuizpukmcekgrofrliiofepmtfjypneantxykrzaepambrhnfqryxfzqxquvcerdbabtawpopxbluwmborofprhrsmevvrsxrrvtrfxvadqxucbzsidocydxzbwtjxvplxuvyvwqadeskvtvamtehvwnmrsadpgehrcfikjfykpumshvmhdtwmoxcwziqdheydcizganzrjebjaztybbrrakkalkkmxzrjzwreogplkvevtwmktraylkhdtxrflczlqevctcmvzlarvohmbrsavdrklgynbzdyigejsjnxcgvhjlkshmlethafjnoxljtcvpahqwzinozuympfjyznaaqsqmivpoxuvvjmwrctmuwywjtbaveycywbhxmqtuqiswvwexmgvcoqumdmwufxufbairrxdnhdihkbphnspyiktvlffybnqycfgygcjafkabvmdfgknqthvgzkjhialvfrcfobnsfdohajaryoijwhvurqcwqzzxzdyymylpymjjedlrysazyjccqzdhsbwkoqkbxxqpkuwtfjvdgsfetbknckqfqrdlhlqnpbrmodhmuckuvxevbglgcpnxwsjmumlulddlgxrawmpdxpdrjttorhvwuectmugccxbcrmhgrrzjvipcjhzhyzgbebtnkatzfezkbojngoyeskwyztdwwdxqznaehzyybrwelqujxjkyyouturrkfimgasncpjmacyohgyuxnwlkiknwsqucklpyjeugsmufsbwvghklvijkssyeidpbgrbmelczojkusujxltqsymlijbczmqyovupdnxoqpsdllwabjpyrajpanpvzepkrlkhqxomddbrchdytvufjibjltixzxwjapscvxnnmgesepxpovfymvjudyzxysxeotamqbmrwhppdmqgqikswijioojhnrsobriwbchirovqrdvlehftmeeprdsqckigvxfzrnobviaepvkxwudhfpetwyhhvncvkaliiwzeoqxeqgbcrsxnfoocmhnxyhqhcpqievjoleuknldklzvxoynasifhcktxurtkujvgdhrzgxutvlccqqqnbuoatkkgqacpdmunowfwjalxqofhykycngqwdsdlijzmgscixqesunjedntwphjzgcbobgntrwqhjylsdjaascopthxoctpeftbgrgpezwnkwgrhfnkysuglbhypkprkqjczztulaepiesffwsclwexunewctbglkroevghlhmwgjqctsxdvuzkkjpnlzvvqkbuswkxmzqsosmefkpwleoczaacmulrbaqzsliwucuviwabxnmqsbzcwajakkoqbgekqngkakaziqqsvjgwyhcdzregrygipegvpwkwxgpivytpjfqcwhuopxjfxcjeynipnyeltaqljuehuzgyppdtnkwnmvjhsadjtiwgdchmlwamxwwlqyetgsvxtcwnpmznadeuwnvwkfizzpnrajekkfjsiksvuqnazoozgycvlkuavgdhzhetebgamnezbxqxgjkqfegcdpkhnrxruscxaklsrgejozxsvrzjennpzkykbelympqxpfvjcnnjxsvlpcpjbubnfjpzagwhhriqwujollcvvzkrauonugebcktrvyehqefzvcixeuiiibwrdwzpmpcxcxaxaywgywrhcfdztsnpyirdqfgobttxxilqqqqrlkcbwarnkntjpmwhbpyoljrptkfabhocadjezwqgpsfnmowssuzvpfkvbtyfbhkmpqduhukoegkwhfsqsrvijuvchsysrxwhrlshzmjnjzcoeywnrqwthroxzpuyzgxjntlaxbvjvknfbkkuvrzibevzqjlpxkvfjhyawphhwqzuaimueuezndrwcdnkjajvruofmynyybuuvapsopqrthiizcyrmmgsvryxjkcvhetsubdcklnrsoicuwtffohmlyvcsyzfjeuadlnimyhphumveetazwawozhnthquaaofdtmczubamxtskandzqlwjvhkpyacsxakymhjdvsjfosvbyolfxhfsarqiwxykuasndnlhcamifbyfzavniwizqqpimpsxpjefvnvbzdbsnsmxdvjujhnhuhjbqodbecuudhhxnuctxzejsykyivsifrphjgkmhdizbkyeutfqcsdaejxucyeqwcdnquhjhaabdkzzmywolhfgnwjmgzhitaqapwghqstaxjxbsqtoumfoacocfqiuxpghhxjbstlrfogdvekzqyuivjshirfnesnmpwxmorosahtwientfzeoesnrvhctlobflefaojbcwwupkxlcruvddsvskfwfbebeohrvxjymlzzvsouudscaiijqoccvhijhtknzarineumcpgyvsruzdmuuyaftpmmdkvgkgbwjwryjknhtwwkntrvhycyfwucwgsopiaotkvpkjzceovkjbspzivszfmspgnrvybepvylrxzsixiknxeoimejwgtzlrzlkqkfjjezzkbobsixonygrjgadduercgkjddvbfxoscjuprvyzanaaaqixfpgqssnzehdqfveweyjywrhnrisfdzyfuayhpozyypfjzhafrmfwpfjlfllmwjmhjlungmouytmbgscohuadwrpgclurdxzexnqldniemkwjraqxlctvcvyoaenlqcghxjhsnphfcnffahuntaaiyctixrloexcmzirbyeudnwjiiinzlmcittfgddsejbfwjyypyoeblweidrlouewxptupgvvxsbabyzuyvtqhlngaettzmuabasggggcorpkaqsoglmdpubxsezlhhumjzxgvsaqifvchnqrxlqoevantzsrhwhwemsfnzxdfdrvrqpwzuzyenahzriauycywowdkkendgdlwsxxcldmmqattsmkoknigkhusdcgrhjkbikfuwmzjzsjsmfeeronfbzfyqdirqzorkhoaxkirjhsiwhnfeqlznqeyevxfjiljubfayyefndpqrlumaljbehwltmleabykehfgtnnwsynqfkdddpdotgtgtexrbztvouotmyedjiqkgpmlvybixqxcnccspjstwidkwapibqpddgtkzgbacahxeasefduldyvkogtoihzmecyemrqnvsiewsmvjdzaytyjdunemvpcrcxhlznvgatyzjgmsfxnustocigabluyxozuamymdxqwbdtiouojcioskpypdsqssiqnduzswggucfjbmkedwrdjszvajwkzsubduqnycmscramhmqtutfbfyfutubrznxmtnixilguxwxtzbhfudxwlmbqyhazfhfqcdtonozxgozuixuxftsioipgfzwcnbntlpsogirjwsxftsoruxkuboagzptrskfdyfmryttddpiyqoyawhetedlnwgkyhhenockyiqnifqmkxomgeoblrgyeovqwpupsidbvrbrqydrddiluaxtpmoijqfvvfznyoatqxgibioprxwqygjiufxvljasovbjnyqwhpgfbgwouewbgawzjpdxnsrpdcthurtqqjokwdurglayptittccruwuhuypdysxutpjskxlvhnbfnldmnojxdkkdstltmwhmycfpiswbzqstasiinehpoftcgnkispayrsaewvrbiyhowqwfkebufzrddentckhhipqtpawmkdujdktqdmrnofwkkmjzgpnpepqetadjannpfsaxmihbdspokihibrgdvtmerphplvoxmuwjcnynnxixhviptjqgrttzkqlfxgfopxypfihirpkertallgdtmqnxmnqgtvjnnsytqxvvnyrsatdelyacuidmznmoucyojvhklatknnwrxtltynduyieolzcsxlcvlgyzficqdodwwihlyexkmfpsjqdrsvdgsgixwvzwrzsgriexsynjpljtnqatetyodbivclenxfoapcrmhtoxketfpfhrkdwnwvmhlvrnwpqprwqdnharfmzpkbimahexzkkrxciqgrvozpxeppoexpjjhqjzqutqjzkactfijvmefklpkpoohhyoixvylfogrqqqmzfaqqyxkfzpyfeceinuawugrrihxnpnelmstbqedpidslwlwnsqqmwsbmlrgidnijwqxkwqsqgysgyehibbxngwvygebghomjoeryipldyebskzkogohmrlnihfdcewpjyjdzidoiewhxrvmdjlvtcdnjvgkqfzyvadwkdxbjklraypvtkpjdfjwldaoaxgdyljahyjpzdlfcmxnwkasgpilbngyapxgterpjwkfncbqbrfonapuubcgygxasphuhxawustibjnpgpabqplmsukrkltdcvjiorotkqjrfycnrwmifuftjmppatyznektnrihpvlmzpscnlfwsbasxeayntxqarlnrxhqlxxliaahdexgvwxupsjskxdemzquzvnajixrcbhdhqdjgnyofvzyzafmmitvllltvlcwagqkgyxwabhsjejfjlgnahiythkjxlchjthpmebvotmctammmnmsrbnvrtfvvhoawulojivjyidtfrmxrebpybsqnvjyjjozmtxubyuuzkxsydkfxzfbcqlvhqybyhhjbpstgfzvvdnwfejjmbvcccqefsiqtxcqamayahnjemxltplkvohbcerufauwrbjivmyrdqxbubdgbdcyjwlunfrivwetfrzsuzwsilcstobttivmjdpywipddachsaitcbjbehapylwskepucmzxneovtdaawievrceqbzgzcqkplhcgfvhmpgthqbwyniajelyuvapkelsbtggpgdnnddpzqvkrelxhjmlijpvhhawquwocdqustcmdelxegnmbvaretgmkghsiwlsnpgtxiwhomiseytgggwayfnuamcdtdjlgaypppdnxklpajnvnnvcqkufcwtihvnmthyrdweqlgcqokptmaeffkkkiyhfdqrllnixogmbdiadtgikvdzddvzwlhvtcbpdgripixgarndbomqncsgtorakxzyzcezwmrglxizngfasucuegrrzkjlrrncrzbwjbnzohtedthhgtgzmawdwwmhcutulzobuiwloocosdoqoqvlecwipvrljwbjjfhlowkqbcmxduflimananobsuzqrzjweyuodofwwznodwfdxrzqwatukwhfpvdrdlrhmrumqgfzumjttxatauenuazeqsootlqhnuvtmunclwdnkvmoesxgcaqkawibgqdscytvotmlouojnjmikebyvdiauwomjszpvumlkajcknzlrejxrwkwygspctwceivbcfcudtewldnnvcgmokznsoyophwerhrezdsqspmdnfplbgfopwriugexkwmcpguudnrefvikiwznuupawzfoqeisvovjayktmyiknywdsqexxxinwjxwntxrylmttsmzwztpchakaopceinqstkzxjfihjbwklwctzbglfmscodvoqarihsifobbijcnusurvcajaiuvghtacdekcblizcthujbsihjzkxflpfirzkfwaunrijatvcoeonplrobhhwncrpwmesedjmalpbdegxxujzrpkwpawoiwxotbjsllivnxwuedddixtfloeumzlkzzndoodthdswqbzncdsodibsrcreyfmmltnudqqopfgdseyywdrqboihycpllwrrkhypvomkvtlmbkamaxsrokidrnwtqmxmojyckcekcbujnoowwogdzfutronjdmfokgzohszqcweqinbeujhoutyvstqrtwukmlfuusmsgysomfpiwpbwfkepwlpzdanqvrszolkgqaiodqkmaxccrelqsiqnhpihgsqhffcaaldbdtqaznodjhwyewymtxnqidgqyaaccshguaiuxhodmtqdguweiragfczbjswasonptbngohsorlovsxuewtwikmdxvoqcvgbnnprydrvtfkfxyapxicbwsiikbplsjwddgujdvzcygffiminzqpqqdvokxhttcoubfjvmqziuepzlszbtcwymekwvpfxoncapvbrjuynswhqqcruydzqgclyggurlimluzwtffffreonryxurejgwhfcwlhjikxgrrheuzczkxglcgadcdvhukkkjbtbdwzwkwuzrepfkkhhgdmrtaxvlvylqppwixxypletibvfhurdeswgtwomdiypyxxpxegdkqtttxpxelufuqunapvabvzybuyveazccmoigyappspgerloqttriuockrhjpmytfpbtuvujjlqfdthlrdhigwzrvespsriaquvlnkuuaqsuitruengctkfmlgpttpmiwacqwjinjrydjewchxkytriecwgygorxxxqmeishjvwuqveelvbycrmghxynalihysmxqzgltcnzuzalkbabmcjforulfhztxjzkproqqtbjoezpxtpvhfufvezpjbcnfodyutexhpbevnlxailzrmblqlpngrtejdccjwysxnrsxpkfvabbklftsjsdkatkyvndljvyonzgtglibuqffvtanvfmzudrvkpqwckwqwbmtbonchmwdxawrethirgtxgryxoxihxyuarcnfykwtjkjrhmxroosdtfboynrbclezkcmdyeovoxrddlyqirlohvpsiwkwhsmreeaotyqkxxsydwzckkenlaejtcjbkkqldtrslvkoookwrlmvfvccbzubfeehfwssdjxapumrccbotlknnzgybjwxbtqsslnvybbiuvunygtlpfpmjfopcdkbsgohndomghdwrdbeevfcknntvjexbzxwzcifahanpnkgxrarwvcqmlswwcqvvhypuvagbogdqditmguwpgvknaouvotkmknuhsnvomzsqirmulmcwgmacmxgtaewfqczedxpzvopzjrhmxrbjfidssfitndrhirwgyjxiqrieqlmcrfkxwlpfjjcwiwhkdiohcljqewbmdgcpwsvremieeecptdgykfryigujituoidyifejwzychfxmxxgbklcatzcxqyqwnlsucwvhxlkhhwtjsdtrsmrxvdzzuqujhstfbziudbxewzfmsunxflquujiocwmxzyafnprgbagpvcphhsukvhybqyvfsjbmutoyopcgbguftlpxnshepmtcekexodvjqvzutvafsftmpnnhthzqzrftupicpkzbvzdknjmoekrultshxxgsygsqfauadbtziulidufksksynbolhhdkqubfbhvpuvxnnmkfqgdfzngwieyqrkctnkztdaxibazlabnbbcjzckjdgvbsdwramvkhtsddtvjdcdvjaitcejbhtqbqdtjlubhvlbgdiznrqxmrsvylobandhcmvqkdixwdkswjglhwpxhwffwgjsbiadkwclivtgyrpoxuotsmzsqubijanjsrygkviplaehwudoiaixxwotasnfnramnlthrzhgvggoocruuitcrwuzmfawhfmqpoxhydaxtfomzxsjlxsriclxtaaakgbbtidqkrpuyelmpfvekukzvbldcnspeihjchsqdaiacciojjxdeuftmstcnqpekqhxutkpwdmytlxrhucnnxubfkazjdttxcssceakcuppgqnbycizytpjrykevqihytphtluiuatnmpbfwcqdlmlwamsefmmtjqvymmjvoaiinkkncsoeqpuhusdqyccjjnuabylfngypqcshgowdcjtgqhhfglwdehtrzilezxqtambjwsjbwbbsdocjmhbfihaosrdulmkzzadeourfenadyuzorjufajozlmlsxxjhyznussivhnnyndybssztaqgaycdmthwemqijepazfjfeebyhwhgzmbxuvrizlxhibspyixtenafnpihkabjmzjxbqcgsqpgzbdlmmirrfexbdmdvdtoqdccriopoprdyhokyciyimxlxkvgezvfjlwjzurmftqhjdxdzkylehyywfgsahmoodypljfptinfkosovogopdeixflwpgmdlpvtzgazreteuqplbfdpzpnvcrvsheizcndblnljbcswcasgwqdhjrgubezkudqvfaufmaxpfrnqrzznvjnutrzmjwaykpvdxzmkodbaadofljpcakszaicpgobldcuvycjzxpktyacwmyqqqfbtddbhmehullqyheivvswpuvyogruvoxyfmixuibovthrsauuqsopnozuhcpyaedviiuevtiyhaofrrnpgetgswtesglmngphtmbeafbrkdpcdqwbqblfobbgwcwgzbsvmxkjzvqpzldowtyxcnnnlydobdxzfftmtrtdgumpxdavnptzfrvcdgtuietbbtbjeatahpuvtwyvwwfcmgvfvojepoqmnnrogrzkpxaryeggglclpysjifbgqwbjyykvovfzciujsnljdrezguzkcixdpsbvgxuknnovwxxyprphxzobmpfpnneginstayfjuqgdlwxuxpexubkbtqeldwktyhojphfukgkjzfdwqbrndpehyrjanbvkykllbwkurhhhnuxmzibdvffyaheyjwgfgcdavojclzwoqsklpysgygcigzanyyvmlgatnllggysjsphgjcepybttkucspbumgantabsoymurhjpagaphikzvobrfvnlczawrsyvelxwxbggsjugwokuflprynywuqvpptkxlkhtzltwbqwujnaqbbjkqfewnfcsrvzjsplxjbljzjrvdkrvspafnicbnnmaxsynkhxwbiscqxlqchcqsftbsgtsxlypyromkttwmnagiqlancbeicyemaosbucgrlxntgmdagfegzfhidcuhdxhhipersqfrwdwgqhsknlthadlhjsxlmtansofeafkntoootfdqbxxjqdyqyikogzozabfueojrcjxmilmmhouhffuzlsjidmtuutnsrligrwxjdgectjiunceghovwsnbfjisuyhthwqiwzpzsxqmlwamdtjtxcnnbjyljnywuaqhzcrvshkcmamjzmewjeumzmpwsfwknvyirrvgpgqlqmtoobvetnrpbdothtbhaqerdpgvulijfsfpcogiskrmjxgqttdemkyodzcercnnqhdfjuiisckvfvblabozgpxggwizhtlieaavtecshbksazoxzfeertratptlblfkiafiajtuyumsxqioajxofeqjqsdqfxgdtwzezzpjzheuxlpoeilzaxyhpfzrdnwmdzupwppnvxvopwbvnpujmaliurrrwmxgnhnuzzxpklxfhpuaivgroqtlinowkyvakftymmuqhrqojarxhrumwkugxcglvmtjygwiyqvvbljvwrfgqigmyxrpiwsumtyxkuuhpoxdafxaxsmybuweeomfkbbmcgmnanovpoxziunrwlbszphuvejzjjvmeuzaheerhulygzirpsxktvuqqvmarkpbbujkklsqhpljanmypfbhlrjzawhurzcsbszsxcoaatlsenubsxaugehacqvgajzfyhmpcsfmjspposvhcqracbpdxvqpvdtgcsylakgcjcwduahbpzwnpbhtqzbufwjomnhemiasilyymncbrejotwxntmelzrjmabdkeijopgdptsqxsufwhgljbgxmkbxfbffwenueofpqgofckjltpcluymuekuscczqmvlwpqgcyflxwveztjymfmobqsylgtutxhnfmttdlvnzuxxoglplbdgykithjpqiqwpjwpvvaisdqalwyawadavykcegtfhgohldyqamsuvjbulzevzavrbykquvogaurelwjnpbepwwobprijsfinkoqgcqnotzxqoqndrkvmyshfadmdadsuctlimgsdhrgqvlvqkofjbijjwwzamwokhgtlpwqihohkmagilpddtaifytmuiduuqlafhvnjgtsmygmyzddacwqtrdmbevuqzjagvzfpnjknirkculozjnaeujqprbkerajxfbpoomyelhvieafkfsvlakojpvayuivgtwqjfygwminiwksyhqgarvwpezsmovvrpysiipjccgnkuwntxwifvzkaukpfytcglpmteficfvgnpapjpjolvhrhrdcwipibsaolkzduueukmbhaxjozhilwygyiuldshtzltxzaznkbbxyavdzppkyhvubahpudkkesnzrlpfvluafoaazgncoilqoudjmuspsjsurzdxffuzgxidfblrjzoejyhnwolazyytuivjutxzphrqsaetgapdivmvponoyvlksmbccalwxrsahwymcnfpcyqpuybctfbvtexjqbrmrdzaajhbwvbdvwzvctovoagstuphhubajiorzibbcwmligzczxqpcketqtghyjcaqpgnoknfaktlqaeuwgbldlnikkzkiqmyjevmdsfiubdzkexuyamjnlgexzuypezjuezqnzwqwjlpmhfkxrgqeszxjedjwyivtbmmrnpjgsfvvtfpnkuqrrlaqyiiztbsssewqsdxzysismipbuawtdvorowzluoudtticwanzjlkaidbpmmginpdkqpiwlnwkykmuvixldkakowerxalovvskydeoyxokgqixzxyoepnnfbikfhncxkgjjlouwfzxtfarnxwcbhmtjebankpzdchzzgbmiipelsvpfobcduxhtvuesbwykmmxxuioaybmzpkgfyyerqliicnkqhthxnavowptvrelidrolhjxdibtikbhdmqrlkaekbvfcrwtnnhxwoxkukbphkdlxnwvhgqvogdrongtpinpwawamztvflwetuytcwtbffwjqqrjigcawmfzhmwyqoelojuqnrwupsnvajlfeipkozmoblfmwfvfwjxseeiebriypcuijauhduxddlniksevxuppjsvfwfrvniavebjbfwozeyhsldzttpxsqxjwxzhwrsemfmzejnyzshbeobdhrgtclsf\",c4=\"wthvqxcsrlps\" 1626006833639000000" + }; + + pRes = taos_query(taos, "use line_23881"); + taos_free_result(pRes); + + pRes = taos_schemaless_insert(taos, (char **)sql, sizeof(sql) / sizeof(sql[0]), TSDB_SML_LINE_PROTOCOL, + TSDB_SML_TIMESTAMP_NANO_SECONDS); + + printf("%s result:%s\n", __FUNCTION__, taos_errstr(pRes)); + int code = taos_errno(pRes); + taos_free_result(pRes); + taos_close(taos); + + return code; +} + int sml_ttl_Test() { TAOS *taos = taos_connect("localhost", "root", "taosdata", NULL, 0); @@ -1301,6 +1326,8 @@ int main(int argc, char *argv[]) { } int ret = 0; + ret = sml_td23881_Test(); + ASSERT(ret); ret = sml_escape_Test(); ASSERT(!ret); ret = sml_ts3116_Test(); From af775af69b97ca87e6b71f786394091aac38e53d Mon Sep 17 00:00:00 2001 From: plum-lihui Date: Wed, 26 Apr 2023 16:17:23 +0800 Subject: [PATCH 42/46] test: add test case for alter replica --- tests/parallel_test/cases.task | 1 + tests/system-test/1-insert/alter_replica.py | 114 ++++++++++++++++++++ 2 files changed, 115 insertions(+) create mode 100644 tests/system-test/1-insert/alter_replica.py diff --git a/tests/parallel_test/cases.task b/tests/parallel_test/cases.task index 590c6738b3..5b668f460b 100644 --- a/tests/parallel_test/cases.task +++ b/tests/parallel_test/cases.task @@ -142,6 +142,7 @@ ,,n,system-test,python3 ./test.py -f 0-others/udfpy_main.py ,,n,system-test,python3 ./test.py -N 3 -f 0-others/walRetention.py ,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/alter_database.py +,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/alter_replica.py -N 3 ,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/influxdb_line_taosc_insert.py ,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/opentsdb_telnet_line_taosc_insert.py ,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/opentsdb_json_taosc_insert.py diff --git a/tests/system-test/1-insert/alter_replica.py b/tests/system-test/1-insert/alter_replica.py new file mode 100644 index 0000000000..900b64d943 --- /dev/null +++ b/tests/system-test/1-insert/alter_replica.py @@ -0,0 +1,114 @@ +import taos +import sys +import time +import socket +import os +import threading +import datetime + +from util.log import * +from util.sql import * +from util.cases import * +from util.dnodes import * + + +class TDTestCase: + def init(self, conn, logSql, replicaVar=1): + self.replicaVar = int(replicaVar) + tdLog.debug("start to execute %s" % __file__) + tdSql.init(conn.cursor(), logSql) + + def checkVgroups(self, dbName, vgNum): + sleepNum = vgNum * 60 + flag = 0 + while (sleepNum > 0): + sql = f'show {dbName}.vgroups' + tdSql.query(sql) + flag = 0 + for vgid in range (vgNum) : + v1_status = tdSql.queryResult[vgid][4] + v2_status = tdSql.queryResult[vgid][6] + v3_status = tdSql.queryResult[vgid][8] + if ((v1_status == 'leader') and (v2_status == 'follower') and (v3_status == 'follower')) \ + or ((v2_status == 'leader') and (v1_status == 'follower') and (v3_status == 'follower')) \ + or ((v3_status == 'leader') and (v2_status == 'follower') and (v1_status == 'follower')): + continue + else: + sleepNum = sleepNum - 1 + time.sleep(1) + flag = 1 + break + if (0 == flag): + return 0 + tdLog.debug("vgroup[%d] status: %s, %s, %s" %(vgid,v1_status,v2_status,v3_status)) + return -1 + + def alter_replica(self): + # create db and alter replica + tdLog.debug("====alter db repica 1====") + vgNum = 3 + dbName = 'db1' + sql = f'create database {dbName} vgroups {vgNum}' + tdSql.execute(sql) + sql = f'alter database {dbName} replica 3' + tdSql.execute(sql) + tdLog.debug("start check time: %s"%(str(datetime.datetime.now()))) + res = self.checkVgroups(dbName, vgNum) + tdLog.debug("end check time: %s"%(str(datetime.datetime.now()))) + if (0 != res): + tdLog.exit(f'fail: alter database {dbName} replica 3') + + # create db, stable, child tables, and insert data, then alter replica + tdLog.debug("====alter db repica 2====") + dbName = 'db2' + sql = f'create database {dbName} vgroups {vgNum}' + tdSql.execute(sql) + sql = f'use {dbName}' + tdSql.execute(sql) + sql = f'create stable stb (ts timestamp, c int) tags (t int)' + tdSql.execute(sql) + sql = f'create table ctb using stb tags (1)' + tdSql.execute(sql) + sql = f'insert into ctb values (now, 1) (now+1s, 2) (now+2s, 3)' + tdSql.execute(sql) + sql = f'alter database {dbName} replica 3' + tdSql.execute(sql) + tdLog.debug("start check time: %s"%(str(datetime.datetime.now()))) + res = self.checkVgroups(dbName, vgNum) + tdLog.debug("end check time: %s"%(str(datetime.datetime.now()))) + if (0 != res): + tdLog.exit(f'fail: alter database {dbName} replica 3') + + # firstly create db, stable, child tables, and insert data, then drop stable, and then alter replica + tdLog.debug("====alter db repica 3====") + dbName = 'db3' + sql = f'create database {dbName} vgroups {vgNum}' + tdSql.execute(sql) + sql = f'use {dbName}' + tdSql.execute(sql) + sql = f'create stable stb (ts timestamp, c int) tags (t int)' + tdSql.execute(sql) + sql = f'create table ctb using stb tags (1)' + tdSql.execute(sql) + sql = f'insert into ctb values (now, 1) (now+1s, 2) (now+2s, 3)' + tdSql.execute(sql) + sql = f'drop table stb' + tdSql.execute(sql) + sql = f'alter database {dbName} replica 3' + tdSql.execute(sql) + tdLog.debug("start check time: %s"%(str(datetime.datetime.now()))) + res = self.checkVgroups(dbName, vgNum) + tdLog.debug("end check time: %s"%(str(datetime.datetime.now()))) + if (0 != res): + tdLog.exit(f'fail: alter database {dbName} replica 3') + + def run(self): + self.alter_replica() + + def stop(self): + tdSql.close() + tdLog.success(f"{__file__} successfully executed") + + +tdCases.addLinux(__file__, TDTestCase()) +tdCases.addWindows(__file__, TDTestCase()) From 6436351aa4ec3725f1e9feded7aa65b1ac6a05c8 Mon Sep 17 00:00:00 2001 From: Xuefeng Tan <1172915550@qq.com> Date: Thu, 27 Apr 2023 09:13:57 +0800 Subject: [PATCH 43/46] fix(taosAdapter): tmq lift blocking time limit (#21100) --- cmake/taosadapter_CMakeLists.txt.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/taosadapter_CMakeLists.txt.in b/cmake/taosadapter_CMakeLists.txt.in index ba937b40c1..4a8f4864b3 100644 --- a/cmake/taosadapter_CMakeLists.txt.in +++ b/cmake/taosadapter_CMakeLists.txt.in @@ -2,7 +2,7 @@ # taosadapter ExternalProject_Add(taosadapter GIT_REPOSITORY https://github.com/taosdata/taosadapter.git - GIT_TAG e02ddb2 + GIT_TAG ae8d51c SOURCE_DIR "${TD_SOURCE_DIR}/tools/taosadapter" BINARY_DIR "" #BUILD_IN_SOURCE TRUE From 206c62703a2f278b946548ed1e3696c850159d18 Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Thu, 27 Apr 2023 09:33:56 +0800 Subject: [PATCH 44/46] fix:modify the compile error in windows for long string --- utils/test/c/sml_test.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/utils/test/c/sml_test.c b/utils/test/c/sml_test.c index 76dc66169b..f1f4bbc1fd 100644 --- a/utils/test/c/sml_test.c +++ b/utils/test/c/sml_test.c @@ -1139,15 +1139,17 @@ int sml_td23881_Test() { taos_query(taos, "CREATE DATABASE IF NOT EXISTS line_23881 PRECISION 'ns'"); taos_free_result(pRes); - const char *sql[] = { - "lujixfvqor,t0=t c0=f,c1=\"tybxdylsdctesxshtzygycwgicbegupwlocvpijzdybrklsjwtuzclrsqwfoglqzvwywspekqvybdcuzcvsehisgjycmknffusjnptxmwlfbqsusxvgawcrhivmkscabawtjjyszyriojydlxxostnyisxnrtbtwrnficxxmcvgjgxoxccoqtiwowielknelifchfgecighcczyoqszpwvvqyvuzjuyuddcqtuzaifihymwttlzzlcxaobwgfyqtocekdcuolqwylsxgznorxzieznrxrrvmvtvkcfksahsnklyavsytmmmgjzarqkkzbdiocrupuycahrwdhaqzsgbfqxdwyisispodrzkhwgdodimxjihyrhprinfppknqezmgkphxmfunqshcudxrmyyrntkkkmwkdomcgvavdjekcwjkqcoimcdlzonoxwnfyeduqbombbzwexgbgkurbcbmeyxvrmmedsxyrhnqvbgimhamcrxsqkelnvrogarhvjfisinzkiurxycsaxgouaelgwjpuunftbhblrtnzkwmqfkbfnbawiqpjpacdadatotqshxpbvaoioxasbivpevgphgnurxsstxivpgcdxbkaipbnsejqpahsoeodxxazjozchjygksssebnwsjacdbkdpvcblagewuviwfnyblcrililpwnartqcqsdhwtmmgrbxswlsaskpaafosiptvhlgcgmvwsqtkdphqscwwxilvdsiwptzhnzgyfoejsahswmndszkrlatitxskfywgpxafsspoqfzzwogarceudyokprfcoaphqfkfslwmlgpyjuivietnhkofoibjwhvdbwbcckutqbejoovwlsyuflcsjznwnovjjchhgczwjesczcpfwimhnabyqlzihocraosqiaenutvvdynartocvxhjszdtvyqdnejbufpbzyyrskhdupjojkoheccpfbaoldyvgeayrjvkudbiqkieazsmpkfqunlzxasjnnqczkithgcolctdxoefuwgwdbusiqunwcuttzbnwzypwaahawexjpysznwnjyrkyigirmqeszzlgkwzxkrjkgdrprxzzwtzylwsxycgkqwsuxdvllkvxdpobccuxnnmdzqjmvlcyxoljgsztgmytrvgqeewmcpchmpexnobhakpykkftrzxqllgvhpdfyyucpshmosbocudxbttciqzzechzvtjigxjlzbfblfeztamfxmdbxvrhunmpfiavoryoitzsfeemzxpadgodsoydhalzhnghicpniorhcptwzfryucpefokezviorspzkfenyrbdbfkdnixkfijytqrxtvaivfqyxqikladjhxnjndammqvizckinppmwslyyhwkfyyjrjjnpefhesbdkpgjehochlvhskgacmbunndjijonfndvpcyxpuuvwjyfmaejnmakvrfpvmjusomnfzooplswmlbhrjoardxxbaemwgtyufyqpgzsfrxkstoohkshspnbgqgsvmlwbsivfpfwzwijthmvothigzrvhkqlmkwzwvpgedveqiedgoshddorrndjykqowfrohdulxvktatylnuqfqdidodrfxfslemggzmwfqapmgnndqvagtxffetpgpxijzhdpletiwurdqowjmntuvikvkzphvaqdaqznlhtmvunfmlpetysqcpzyjpmjjgnbxollkmwiuhpyxuyejctqdelupexjqpvnowudzpftjpggdtdrxkqgxpzxugqzbgsfkywfvbqzzpcokkdzslsmiwvwbfaijrfldicyhmxdxsuycnbqzejzkvlztysdohdcxiekckmkmfwlnpxlyiamcqrkqrdomoryqekzvvymppjtwubqdatfplwzhvlfhyqiinzqxhyhnymccbogggxyrezckjfqjkhnlopdkmqilfpjshuszdyudyhlgqlngaageodtpyzhdgmasrvgzogiuyhgsjrfzfvkwfpdbadqmugigiepzrqgzibmoumfmrxuuvbaaihunaypgdeaswzdbaqoubehpmfqbklyodcvbgpppputmldxnjgcbpcjjknvtmxfstrgxbylgkucbuqjtfswlgjgtdgrzcgjjonziolmceutclufnesxchwoecperlpwdwpicmspwavxsjunoipxxdfbyipsiojmpdvqygmqsysrsqvhjdunsimkvkvvconhtnnnqhhbpwndjrtapxqbchkrinehqtorytxlhbjtjqkitbfkdjhnthevuxnlokkqnnaztaarvfmsfqcepxgacwomwvckhsbejbioxwmojnooyukswstlwqkasiohatkdmfozncjdawzgaroybvvlcsjiiojxuedjzgwouookoxwfnksvoislpzllcitwwpiafeqcayktzurnoztdgjuwhjljszreoljjowttsteitrwmujqdaidhlcxfzdefkvbkmsmuyhozphcyuxwmpyipxfxdpdfojaksqhefqwhpqcplgmomuhezvcwcrdaksurrbqirlvgjjezmmooflmdepohrijqfwbiqxpepnexbpbdwvvzqgwzquvocsalethkqetdgnexughqqnbnytkmiwrainnqlyuwuljkffsjaommyftidtyamffyqedxfvacnvrrckqaxlwyvjvvaztjqxmtuiiltrrlntefluclbrkytjstoeznorpomhwtluojbnzqrzksaedosuslwdfftvcilagbrrxweldblmeclqaskclradfldhyufwqbiitwlmtccaxmswhjpzmfccqcxzyoneiudmxndivuteqkapjpnqsnxksgkorxwkjwkrrbkplrmgqfcazkjiprhfmxuxshdkldkfmefctapwpynozskxpxrnsluwuzdvhprgfpjfddnzncdtawkjbnktjxogaxhpcymxugrdvlkrfilgsvcglklihoiziarzuawuggrqpuhhnpjuijllckkruslupluzhggccebqqxktgfxjrnwamwopzqqsuvjlzyqnmudfqfxvacuoiwwhmawooaognltuowfmbslbtiyxoddglgszlpdlkwabfbiwdvxkmyvnktpiscceiniuvohafyudpxpqfowbwcuglyzbrceljxdszzozpyrmuoewmanlbfzibnmoyrtowsgqdglikzvvqrzjjoulopqnfvhvhdqynamxlcnbscjvkogjwqigpsxkkpwzejwnwkxtqjpibfrropketlkxolxhpdsjkvcduxcfregcogjimqshjhqamtcwefdzgkelhojnfmpcnafvhdpkgsmzmatuzivrsaowkaohdeeybbkzljnxcazvbobginldgseyquzwqyxjccvagnvofatcfhpfwmrdvjfqdovsxhryrpksxcnbypntvucrhovaupbibvqozvjfmhyrayvqizncbusqfhuhxaffshymjfubrohpetnretdvshlxmurqvdtymawuqyxbhqtfkebypnutldzelwyhbexsvznlyzeswxdymisetpybygvsegmxiribznlypjrnrlheofgavvlfxdaeyepwelpkhascutjaskrgkzddwhyhexegguqwpyxtuusystfsthwhaabheqxrvqxoshuairbfxhxyzoxslwydstlebiansxnjlkcdondfnillshxtagbvufpnlzhlfpnlxbrtuuesiouktwfjpnkzwypnperyakqrmbuvjdzfmayjsnekpiozozkhqwusqucqeqduhnnezagclocdfcisfdobjafrtdusmcdwtzhrdylbdvaudyolxjhnnxbqzyzlvesifftcczwyvxvpxjgnrddwozhazbhgnabssztudplvhhjxshnhpryiekxurnegvklesafkvuifzubljkhsrfufabtrykfdwexjiqpwkcvxbfhcvozvxzjubvqzgaxjfrtgnbkectdbbozqqkfymwcrbxfelargrnqggseceslnmeoyskruxivvpslxyzccvbxejayvtrhpykjyleoevwpzdetyjncwntfjyqddyqgbrvdtgoyngpsdvtiqwcyugvvjvltuhuwrxthcnrmjemvfluccerjylureacftsfsmbexudajyyehohdqteffywxstkwtkodyvbpxddjbmrwiccaxisidmvmgiligukllqokyhateqcqkwsvvzyeejaqwsmyxcsaavcvhshdoidcpuioqeqwjxzpceqjypmlnosupcbglvddxwsvmnzjnwvktpdujotjftekcnxiwyvmucqskubkgcmcpfsixynqdgxgjrjdxdhrrgluqjqunbbepizkchmqmrlioonlhxgluldiijonwryoffyfxbwrdiretxeedlaeznyfcplfxucxwaygjgjzpvtbdpljsuqdqlcoohgqfqtxrbkqkdjezuczuvuwjdhabuvpzlctjwzlqkbrmglffkdxxhhfpruhsbnxtfwnlulhenjbzddnipxkvewdakueehpkllugcmkoyzvgryvbddlbmudmhaznghbpzthkzvowqtubhkvihdsqayytztpqytdcjarkgnflapjqcpeoffakggnupyebaqxvpwmqwwincpmnjtyprjhyjhwxcyulgsmcxuihpjfltultigzifvsqdtgagwkyniqycftqzebioccfragqulcqlpzwdcmygehpqzbxvlbunohlfnjfpbwxwrqglyldhzsxmndaqqctxrzugomxkyivwlrrhkkfhmkijndrqdqppdtnvsudkfnbetzdelkvezaedxelrqekktarjrwxdxvpjwksavwbkflmrwdsanigmgdillfrxhkfmbivlvetiqcfmkqqqrdhsyvtvsiijkjbadizacjwsifcbutsikrqhhyctanumwdxflvcpwrdccufmufmlzomxtsvhvawoypxijkdgefwdutiipyoudnevhqiwvtmmjchuvrjtmbdbscbulfijmhpeilyfmardjiprckybweyccrenqkvvrniimwtsdleorfrcrgfbczqsxckciprbobdclcnpeibzqcluvyutijtwzqlrwjxspzqleeatzmqtsdqnuqjtqhacbbvkwtbteudvtmqgjagiqkjmdhuvfxwkucgpwkqxpsewgpvfqgubkiqgfcpvwlhpmwtjahqdhjhmevgdoikopiqtrfbpdmbeyzxdzubnwdgwqdtxcvdqijmpuidwplifmemhzfnegwkjcoszyewvwwqzjldgsdlkecasrthnmpfmrzcvgqgiyvgbnjqrvcwpdfrtkozwncxbnfgnjjuzgbqpugsefpbdxltadeuyrwcejklyjggsifvnetzwvdqbhlakbtemunafezlkgzzeziuxziwyjxciicokcsxxzefiosdfxmvcyvvsjtnqedncbpngkqwyhygdwcmjdnrrtpazdydudewobwyzfvejbutmktcnrlirjjmzegnraradtinrrbusbzisrfrostexwoeusqrxbuhhdycneorvrwxdixhjktnhssqicujibyfpdnluulpqmxranemqtmhclmcaznagekocqttjalztonnvqdxxajzblpizdlphcafbubavzqlhuryumvxsjjnubsffwduxddypvgvtdmqozgrhwvrwmdpjvdbexqugrrpxpvayqbccxgbvhqejmzuuobtkwopledyuqxlmhhawvppkjbyrrtjxitoytspwqomweunqplvagndtgvahwxkfxbeusydbbfurgtwtgjnryljupomgksprjqravlvprcnhoaagpcwapsfoucokrlpmcjtazxqspgyzbcaearbkptcyhkbecpmmjkzyxwdixbebqkgurdqgybvsmzsenxgljpxcfjmvrrrxbnvlsgdwvjmsjvhttdnrgowrcgggzldxirxluxrjlbueqlqrnmvajosdwyjiwwbmqteiwmifrsrlfpvxuoxykpukqfsgxdxunnbbiuoivyczqaylyrltkbsucrwxoosghizxztiqlbkywasxkyqhoesuwdvwzwjfnznfrkbjmlntuirfboqcpkhqfcfjdkoroydcnpwtlymvbwvdwlqqazprpjpwruvtmaoazyeddxqobxvqimqapjswmviuotvkvalmgjdtrnupiloxihdgcbujrqqvcljsksbxanffwhcxtvzxpwvhoctthkidvolnvfrpmolngrsxbbqoqizmjcvzveuarlbrcgxwwqrdefefjhjqmmgwdkipvsriiiubfhiffcpkdlbondnzmelvlhwlqlpbhrmugkeaonhfrvcimninyzauigftcesiihtumuxwuktbbulqqjnkxgkdwbslfdafwdentobwafxyhyhbasmiibaxjoyavplbnqciuvwpzgckfrwuvhbgwfcwzxzqcmtytrfelbvgfdnxjsuzeeiuqfkmrfmudxktyvupucnlfvnmkxscslxhzbpecbaiqjnbydrfwrgptegptfzkayhltrisahwqtudwhwjotnhxsvkgviuciagqvlllumknjtjcarlfccaslbrqpsoihlupkphgpgwgzodtksgrgexcaybrltrlqkzadpoinhkmzoapdxflyexwnsgknmxuupnhijxltmwdzjwpsspotmkfothqebgmfiafxdytvwuwptyrjepyjihxxnfdnuyxrcdzppoxvjjiujlbjtjuusdtejkpuiompzkhrqvskcjnhehskjybmqaryryzzddjgvwbwvozxaxurfoxnpsfcmyemeisgtfrhrbvxdqdmkklluemluklxhfmsxspzznlurzcuswdfsdmgssadjlemornqupbwbukizzvlufwxogmgluwdksnevsvpqzutevsyidudtphvphqtdaqsemnpcpicopkxmgazmdqfnxjxbuunohrvmknumchplkvvlbqgzpquwlmlcxiuevgnepdfvklwplahzgsscbghfjagcrqjlpjobiqdzhqswtiojsrhbdjmwljowfzebncvdxnsvqgkzrygetamrwbupghasymtiwkmlndvhkckazssyjlymkjotwtbdfbwecfrsilltrpkaeiszklwqcbkxepmenazonihsqdtvxzeojlbtlprmsfzxnxzdguhygtyiyqnhfkussqxbkrvstdkxnovtmdvcjmaugeizqknamjnpuwhalxqclygvdnecomtlzzymlbctwfufdvkqzedoeeuabdqnumkmfqgvdqtexmpeyiikqycqxtanlnqvbeunaowyqgjmdafxsopblxmimafeyvzmxmeqhhngoxygmhakwisvlnhcqzurxlitwplasuqzllrplahahvwwkqfxktigjanzhmfdtwsdydwbvbwwimmxszzwlroucukuzannqtrrgqztkgepipxilxxjcrwfdrixjdmadhqyhukeexiwjmqswhgegjvawsnntgtjncspitspgvipxvxsqvofjfgkzkbhxvnqthikgdsqyzswprfyxsxiozwjfgnziurlclpoucwpxoqgaqipygykyeltpkfvotvnustvzlalcgbqsoojzjfyomfwmepdwnfdtpyhyjfzqgjokyujudzkfrzsnzpuerxlffzdzadgcslpivtaunevdzbynyixhhzanumhopvlsvutnuytqbsyaqwfaovpqluvcqowmjlrmollasvmorzqptldwpavcdmvkmpnmkgljoiukaaqndhalataljocaowlwreswkcjsiujeoewojbigpsozmfenvzxmissyerxiglumbkgnnzwzoxkbzwgsxvhzlkqsfkeqfwnajkkymyunsoyukwuxfwicmzoadtvhesvqmzxwkuceshbkrljhqipjlsejdjycejkbobkkwggbfvmatdkqllkzkzbeeqpxctdvqjfejpnflyyqgbkveistvtpsyosexusayaawcblcwlfcuqjhjxvtmhzbccdjtorivyxvbzlrpzpoljnzowtvyevkbwvdwljynbjxahqxzhxhmaklckqoemeudjidvkclsaqxhavadwdkitdbuqjneaqvyzcyqilixeglczhobrlknjyyquxxnlxxiohmtrqkcgenwxxgglumjzyygrozfvvxsuautmunkraggxhihaafxghyyexwfwbqmqzynzvmygeakzmqnegvwcwrkjplpqfawkazkykmapleonxqukjqjkvpopfrujizaoawdxlcqhyzkyjwucbgsflvvnvfroybnabigpipyghsiyotdfeqrusgghzswuwvntlzqlgzsmqllevdcysuelxbyiyfofxyclmafrupqszsshakoskgtcsoecvaoduezmqczqxwjyaildgxuomhrzfbqqxfnkztjrvaajkcgxmwqvmrfrzojazdkjtsmulrzgrspwdtgvqkhxddkkxhkcasxlbejnsbdesakmrvhyaziigrfunuwjcrtwllvxqosgubtheowoukcejnkeywktloeilohtposjbocsvntqlkwislefrszsxnzjvtvlabigcifkpgsinbzofkapdzjgobytxlxpxnqtkzlqywetksrjfzsnxhshudmwxztaksskeqxqzakqebpdxhcjfrqjwmwlptgvvbhubkkrpvblzalfhvjaitreulgolcfbtiftwraluhhdceietxdhcicvedqcsbnpnsrpskfrrembdbhfxwumwrwiuvqelqfkypdihofvkgivahaaeyqljivvsykhcqzwyzpdtrwiimjiudnmqgbcgdvcqnyzmfyrktjeosjojhykwwqgvbawnobchrglwujfsddhztyhrxfxpaudksdhiagxebgsvzhkazcprmrdoxeryeudnufozhnlskvmbdwxqxlpmpzwujkinxhuyabvvrpdqafwpliohxydkqykejmqkihjmtykgptjwwmraiczztxtvatzarvlgpczgrbuahywkcmlcusrqyhcpssdkmsecemqfejiwoftvtchqllrdrztfjnmfitbbdoptpbjkrquqsusdfkhnywrymtlymlshqqwnnmyvmquoskahqopzrkioakiqsyhejutaqcrmqjcxgbqciajlqoeffuwvxmvhaxfuwoumxhgnccvzxbhrxembmohjsqlxzzhrynjnkobimzktxvxlqacglzoborokeazhvmkcgzdyqmaajdzhlfgobussodslwqfcpsmyhblkjszhyyhtdkxlsiloldpclulpbhiftyuxxhwbahusttnescewxsbtwjoclaudpunyenljxdguzygdwpnbfjfqoulfduyrtreinewgcsxfwrnohbfkqrmqloqyddprwedzqopudlzyurpzryaltuybttczggepmplazssuwshxasmleqivtgqhtioifmwqihnpcuxhdxaxwibybphxdfgbsawzwwawowtbeljudcyhrsdttgynrbcqvaojovpexxnevtdtsudukjbofusthzxjsnmjstenvnjxqektukpndxjfuojzmachfodeykybxbmdkuprqkkzuyvhhbwlvlwhbtunslevzaccdqxcibtwiuujwfvwowgiubudppeenmcdnhthnkmymzdbyianzgsilcidlefernnpdaottybwysyclmyrgfyjjbglifbfbzsrrqeyebtbdiwrqjjmmrcuzoxuafigderwgcinmivdfmgvrzwettesjpkaptfyogfhbntzwywycgvelrixpgaclbcwabghcldjflycvtaijslaharpcosojqyrkmzkrxtofigaolnhbsrwosntcngeuxbmrdodtnaouwnmcozrpjfbltqguikjzbzmjdwmginbmbpkbiglcxurpcdkmbhvwicxyonpznbvaxhfzqqkosdzdbkftywxxfwfcgzqibsqwrpzqdntrobcfsjxplgzceplxjugfvgfvyrasurwjyqzhzapydjtquusohlpsmwektnxyvmgzcnymwiuqzorxvlvjkuxwqwxqbhcujlzggzypymjqpsfxtruijklkaaviufnygwomnthsvgzjheqoloftemnoqhwxrhrheqdmgejbyszlieitydasqrsbknrtqhnnwpabflhvfluitruebsdgxipjimeqqegixngbiyepzgjokkaadamrpdtleoakijpccpsvpyhkwyubcpbjxratjstbwnzztbyenvudidekaefzftaefraotafbnujgcgihojrfwkbqkppzusxpqhzmbsjuyrmjxvcydwjiedddgeypqytrevbvwayymnqbjzyjvxxlojwkdmpgfwgrlqgkwbltuejvjpaqcowfumrqaxrrzlbharznnrbxdcyrtufmkoxkjkyqisdyxpxqcsaembumiaeofuxurtfqwhiomofwxlqbedlbmmcloqivmjthdnenggqipizewoqmjqyjcnellxdnlnwlaxsruifwpajjcqkwapktjyzlqxhymngnthawemhkrnjcnghbdaoynvdtxmjdvrbyhteqqjlxtupjbolrlfedyfkrzguompuuthhkmkjdfupmnuyrehaeylxhlgjwprexkybaflumitudfilawpmksysktnhxbdrvpdsdxklstgejkeibrjlzjfmaguoibjmrzwjkfbmpbzzpmgwiafrizxkyvqwtfodmkwcbryrubkwduiaavxzfibnjigllqudqvhoxjliiwveuwxfzbsqflxuncxxzezxxqkxbnzaudjckdixzwckkfdfwxzkwqjujwurodouzomdysynsbdwgzvuaqhpusqyqsbiriibtuoyakddpcswwbrascztkqwkxtvnpafmxdwzjqodebtxxayokgoshoxdyqxlxyrscseasvvtdhxfeztiriqapzhcvvvuzpqncippbwhlbxokpyxaixcuwbahemlpdnayzjafupsqzhdbekhqungusybissgzkhpjeaiocubqemhkngdukobnozozoaagbwdqrluhwsxbfkbxbxmyrqsgeqswhdaxiummendqttvvwpoflpuubgazqmxehbmmchwqnbdlskqzbbnfllqteukizmskrbfapgbdwfrktwhqxlrzmuklepritlyrfmoyuzcrsqoegbryexhhpqxlufehzafotnxhcemqyfqekuixozczikejsyeevgplfoopqlprnfpricfwdvaeojlhagvctecqirsiyppjqsaosmrwholuxpxezirvhddlrlgmlukyjvziwskxcypxuatmmaywjreemktplsijkzblagncodfwcymmkfohtteypcorifflnwqckcutohaljtdrthvzkfuwpoxjtlpsoxkmfwdiyzkkdbjuanbtdxpfefbjkqonpgrtfwhulkssbotqgvndxpjtvexwafnaiczgtwlrtxrlsntxjzcesplwafenddrouaezrbanevpdkewojsyxpwsnmtyfrnqxrnekeselocmrdyknvvsfilayqjryqkfuwgcvpjjuveunfmwqfnwdrbyyyrzrtovwjeimcvotwrlxpjnzcwsppkysormxdlrohypvgszexmvcslcmqkzoodlxuezndemosvxrktpvxzyuymbvqdekzzellkonvicekxeoffsqpwwggoktypqmrwdkrnxheoxpsfdhvczrhmihlekjdvkvdnikawfhxuconhfqyahpddryuimdyshipxemekvnozyrvieezytfecydfixiydrveaamcdqsofbicyrnfzrgqsjdcpgkejrvdqgttjqvkqmqiesemvuafyowkeqbgxtdqfhrirofaefbogdhnwacxxogaobeaoglrofiryzhxmndgywzpdrrgimhptsrpskznohtiiijdnitaczajewlrichkvkzijkjhzrurzaqbdedpdcftarwsqzodkizjzltojvsiqnuuzmwnircgpodazxnumryyeqzxrwobzpzeauxnpdmabkhkoxvqjspnqublgunntcpoqsvrncgkojnmzjrifcmncqxeuvkyxmevbgmmakxscrmhwrbxmsbksadqnzvasrikfvhgryofnxzqzzknenhwdrlmdykumnsufqreywpcsfoeuxdifyivguqrrzyjknqzlwzwcmfehfcfkkoqfyfholtnpglpwodmwfhtwyehkdguhygzkbqcnjaltsgqdsvlzfkytttyuuvduxbssglbhgxzqdgturhaxoeaeigbrmzcpdtrvoeivmvtkiqrjiskdkdpqlualqjgpjxwwgtuglikhhrxcoqwtkzrmwcarodawtszzjnlwykzulclkoqaexvyhlfhsxreqdzjvbvznhwdcncfjscamlqseieufjvfiwixivgshyrvjyqlslusujnjosbkqcyrkhwqgmgfvkzgeugrsvtiklkrvjqjwcyrjemomtgewdfbdmnundgsatqdbftjhvvcvndmtmnswajowwcxiuhmtojthqkrzuvfmvbxdbvrxjbwijfuxkepzhjpdajilscqjgfxoldotaronmpkhcczehntcushirzzbhygnhzaryvehviqczxkckjbwqxubimjfjkwmsuobpwhcgywqxbwlgsasvonjpxwmyyfgasvsomgjgiavenjcbwwhqhbhzplxzqpyguecjyicsjkpcwwfjylqnvtdqoikkjbppaljzsnoxxgfxzvdygutlxnavblxalobhsufoyusyeiggxplniqrzcbbmunyqbfudjmhsjuqfpucseihoixjrhokgnscoeuhrrecfwjrdojflmqnsosailywobgqxiatgdgehlqooxrospcmxscsnfoidijdzjfudprkgkdolzmyccpseewqznnmzuxxtuafuvgykzielxhfhoxmyoewfhqlwwhczwioankvdugnapxtxnohqpclcftahzbpmzfwmtpdzqwasyjjfmalihvbkptxthuqnivalmqnurkxsjepppepcprbeczbrasanjlohbyxbkmrjvwexqxwhpbmnkjathbaygihnzhgxuixdledopbsgzwjmeocwgunzrkcgavowuevsutbajoiiytozuxxzphnqkkbgmqjqdwrqaqxkiamujoiypzfhqgmflwjrwjlbnkvzuwzwbhltzcxhxkedcfallyiywiowvpwdvpgdauwiaqfefbgxyxcfhszdoohwzdoqfgdzhdjfwtcsejtmoqaxkhdeagyvccplrjqtjxahlixxwtgdpbkwovccrhpmtqejliklpldljipzzxuwjlokvzhbsaarsqlyazsxxrixugbnijxifccfmteizbfhdzqsabjebwpkxyfooockqthtodjjjxepgyicpdnrndopdzkoucytywunnjsweavxoxonyovnqneqqqpwyilsobiiuegvnmwhpgsmsjymcrgrnucsqsdgeuwjbaironzfbfjnboiqcuhoqyqkdtorctjdjfiqbsjbjdrhjwaynbhgoigoprxhcwdrrspcbjjykqeydvrtctdqcdgbklfmbjyhxtajpvmefrefmlcdzbnllscvoqjjhpfwgagbjyjxoznbajpcuzbuxaolbvtaqkefujjxbedgbyrgxnsybsgwkuyukjsdfyxdgvusklfitokuetjlsshvkpvvfzxtmstjiftlpglhdjinjfoluokejsmmegioundlngqhlehmxjvobmxpcqhgljmpnwmluutgaryhjyjzkcgodxympmftevxdusledjaczzsviwttygxaswfgqzkkdhdgsphteqcycvjvvukchshbgsumvfgzagjkqfckqmpzvykuhcbbxqhmkkznjmimmopjgitgsddmjaogwsoublwaqpyhxlanprmnufltgaaklurhbelomdpusskwahiaonzqnlkpftiiycbnsxhpajqxsbcesedzpcdeowotgjrxwzlqllhgnudbudxlpupvzajnqngwsbkkgnqjcfgdwnypawuyuqoatdaxveziizabyktndzkgojxqaunonhupgndhxpwayzrkvqwzxriaskzmidnukxeunpulkouhwulnsnauwmubddzyqhbqsbnlhfuvdihmacylzenwuwcrlqtummcjrkqbfgbezgejcvpgurdmdtdkzzvviffxzndmxmmvjnljbnzjrtybdlacgsyzcrhqovlovladilnntzawsyxhmwyzldklxwzninbxxjlkbhifwgzpjxlkfzqblhrgwmgronvbttikwicibcteexbwggsipkubtqbhxemtifqrnfdaewbrgywfcpqfdacwhcsshgyrvrkddvghbvwtuwacqwswyaqcrqzyvlnjnzkrilimqzcwmhllzlindulxmckdhtneslpnlodzqzfxlragjtbngazbgrkskclgjljxfbrlhtsrukiqtkxigmrkuikydmqlbcibnkqtgbenlivlflmbyectljucdmuvbozumpopmkflsplzkbwtwcsarhqixsbgsqkhangirikdilewqdumsxekthzjgalyrzqystkzzebvviqcxdfzfecupgrhcrpulqdvtwqzjinecsdwambidunlxisrhnhmqtlaojxuhrgspolfhggbspywcbyflaagtgiliowspwkcgycfpchukewdulmwsdwrwzetilsomqtckejnutxssjyporppnaexvarmnhgsvwiodtrnbgivzzbzfppjebldtxthwsutydfqirqouxmxocpgircdztvhauayykwbauwozxknpfbddyvxsjfutbkdsaovcjkdpkfeknfsspeuydaxdkkfbxohsnmeudggxcxolojxgcpjqmowkhxgwgnxwrhmqfguapakhlerfyoqhwwawawcpgbuilcmdobzmwgwbeqqquejetwvnsziarxdvouugmetjjmhfcvnaetyvjbzmwwpkddjsxeqbdczecrlnzazjjddlduhbrmfhpkelmkhyvmadrkgxcvwyveyyagfmvtrpwdfrmefxotdrduliitysextojhsirlsiagqjbbvcctkcdmkcbthcsnfuxyreeffixdlowerrgrxtovtrhugafbgruayddylerfxnqnjpijvcyxlrqkmhufhwqsqaagrziaoldkqcwdallejbkurbtwzwvzhfbtggfezjubvcjkfipsnoowfwvsnezakllfwwhwrgagpstsddaxkivbmzndgshouzgrzbpqwuaquqjyobdaqliyuufjwivdtdqzutofvwinukwcqhmrjlytvchgdahvdqvnauiykevdyilclhanlrlnfgbvqjifzqmftnxcitirzyvgjjsmyjbxtqwliqoprikkfexvuiaqmonzjcmpdhcnutfunsftbicgifdynnpmaaexxxixfrtszbneujarczqaglzhfaqfbjikhfcogfcduigyolvcrqusassrlsnebmyqlspqvkxbfkqftbwtrmosvafmahhxvdummjsbhcweotqgmdzkxsvczhiummtzyadnnmvpbzubazitewofuievjzpwkyqwxrhoevbyvuosbclquuxatofrwfqmadptmgjuovcrlhrhmyafwibmrermfqkscompeexmtlannjqazpsruhwbezgfxkbpxqghhhtoudcesesfujdcmjecjadzmxrnpbwywhbjrsvzkymybqrnxrokzyorkpsssemgjvalzdavgupfybiyqbftvwscwwqsynmvxmnoyinqihrtjqkihafybaszfztohtombfgaarblacoaelaopvhqyomgotovmbyixzpjdjocleizxkocdyivgfmerqahdjzsiousuxhnuojgqkbjdykcnpeosgpzvwwqkdtukpattwbwepxruqtcxrxuoojmtzwozldfabgbshkztljrrrrdkscgvqbtqpeewxrbplbsrowzlyezeuhgjqmcfozjyinygjifdfyjvorhltqrzvoemboybyimtwpddtloajtroimjpggoxhfszrkwihedutonowdgudhnzulrdsafdorgxcymdzztzwvvtyvfxsqyivnzhcamystgvmussyfkzwincofzfkpijmsekofeizotnqchvgllmvmsptqqrryodudxtns\",c2=\"gbktdxiyhtcyabdwusjotcpfcyjkhejmztqkqchngrygrhxhdqhqicpfgtjmforxsfnqhhiqicphpjyuqyeximildnqsledxeulvlgkizpmvyixjueiqkaeldfiovsycazzafrukyabxrcpdxwgglfazjwztrjwinwjnbcwzyxwidkxhjqudnbvemeoawptqwmljfraonjagujeindnxmluxspoudowoxmhiignoewukyokbjbraszjjensivupwzlcizqwstksjxaxadmxeowgyomgacadhvmageboakqvrgwkerzgeukpbnfzxsqezybseggdsxrnfnewfmfoxarffcjmqywcorhuroaqjydgdgrvfaewgmuxosbrufejhllqccmpxqwpmdkkcibttkbxjmkwjfblawheaeprhzcirqvhguxxqkhvqylapygexkgpwxhmteuzpkfnaughjirionsiwijfhpoucpoxhnkopqslwfgzlvirzhiuqkruwubckmnxumkbnrdnnukssafbcebbhcjdmbcmmlkeaitvjrvfksyapfoipytswfolzpmabsbeyuzoruthachwmsegydxhnmnkdidejmbkxbsvteleqjepaxqdyxuiqnkfrknuqgybmmvmkyrcakpxubgwyvrtzvsevidmabieqfymoynzjjyywfqghkcliyzasleomfjqrrlgcgqegawhphsafasdjwrkqneugafrefqhyadpfnqnojvfqpmcoxavjzmnffpcewqyfjlsfuvflemmrxoddfbqprpwvujdxjoebzgsymzvsbclynhasoyuaypsurlqtacoulhjfzbbarulvvrutuhrbmdjztqubooccojgunlwwdyprkluiepsfnhrsfvfozyljimkjcewubwhjomnurvolstadcllfnascxzocwaxnmknqifysapbvnxquahdywzzowpfxzrpgccawmctajzwhtaqrwkwijyiussyinntujacpaswozwqjdrskcelljbwcdrmnqxbxrpvnbikwjhyesounmzsxnhwnrgnvplcdijxoojfzstospkdisijkueaozwrgxyvbbaakycrnjzytmtalinmhnzgpcjxwauicyyxbiorkaarduvmoomvosnhekswdkzeqdxaiogucqgnumbceuedzcjruemmfbtprsuwovvrtukslmrvuzqmuzwwvyshegnjonabvjqgxccjyvxpuzzivdstpxbrjelfomtbfxlshfchhkaauwdivewrbpcebjfnnjattfzirfwkjhotjjmyretffruhevpdpvptbhinbemqucewwrpdgcecwyphkyclteijeejuetoqkevzotovydvjdlzazouwwsdbmbfemvwmczepdybryaaegxctwroegrslmazoyqwirgrtrukpdfvaccnntktwnbifuvyvqmkzxvpizgupihuxhuuzticuettmtwbyxplrrikzwhdrhrdsxqoithfjcsvattazdxbsfzalshaugxdblpphgihebsnjgxsgwjwzokvebrffcqaxujvodtrhvjgfchpdjliyilxzoxyykvcnzteopkgbaqfjblicmpnooinkkctnvyvtvhjdrvyzdlczfrhbkxkprvlvmysltaehphbddcdrsiirkbsaokuvuvupbkrbzmtowsirkkiqbtpftrnggkzztfcbvuufwktplnyisdhorxtbhfzoonansxktktejqulorjqvtuizehhnnptcrnqbrzrtwiqkfvsarsnjwsbaofxggmstebenchnhyhwysgbvljpsfmofrmfqyxzluodrxapxtzyrwjjvxgxwqbkgontxnvpnatlraevbyzegdoybnxaxowweehyszoetpalfztwfpngyqiyfybulllicmzdtekpgyekhqfgontemyfhlkkqugjgeznydroqwfdxkimsakuicxoxyzuksqaqmajivttvrpgarsxqmjntvkozuyfcftjeysrjvbpzhtyazeflayjbgogpajzmptodqlkxubwdlpjsnkrwazvcdtifahvnglztfewnkgzrruhyjgbbqtdelpaxdpjjfmywegkzramunnngcdbyrzgruwffuxmtdwffcdymawvmdisttmdkhknnsfceqpzfyuaxltnggajcklephspnhxakwcsyzzzvwftuwkcqrijbbqvzcyefettcrlqfqacicoprvuvxeqecbgprfuqyincldclygvjfzbwsqdrqncyfzzfnunevnksiqeplmqbsibhmmgbrkpzfdimuofytoscprgokemdczkascacsyygxuxgqnpiwvrzzqreidzlvxvhotzdywfrrldxlumvzgvvnjbmadzflvdnbzsgmrkppyduzvlkvnefybimiadjdumfokwvvnmqyjvdejuhnpngsaggoqdwsrlmwpppvemuxxpdcfrriuwjxmfzryemksacnnbmuyacmnwxyjswqlnyixqldrbshavvrripyfxlrdjkqcnbbojrtkbgvesgujlooksacqhfdbamgetdplovnhljjqmjahegsagdfkpmjxravsmoyhchwejjeztnkixyrgxxswuthwsnqgumuvslqfhlxtuzawchvvshwxziyepyqtwvwevgljorevgczohpaeyaeckepxyvuwgaxppcyaqnrjlwqzlngpydoqvbyrgrwnpnwwnnyutsfioumwdnmhyajcndbhxmieioqnebweycevjvaqbnenxhxbvforbjokucjlyhecrhgosfkpwhowjuqnacirzyjsnjtghtcddupwdhlyadgmtoxlcxxsvlbfljmbwgjiallhqnmajwqueasywvhdtwhcrqeqmzsdnxpzjzjsrbnmlssmxeaaalbghrfamooumrlhjgiabpcanzlsxcxkzdgvujpttteynfumwnmpyeesoqtfyicvmrjvzkuusdlkevmepbivpxhjwnmsumnatvsdfjgiktkjyhwmsexhrxxspedhblfffkhrwbqwxxrzkwpkvdqevpqxlnobztmhlecywidjthkutjxnjvgdxfdaqyvqzkcxbrfyapkvmirijqejqeplqutogohvhuezkqnykusrkjmrfcqgvbnjhiifygztnxqwytdccgivbwqmcpcznxamdvycgjvujkndtqyvtmtluvohbaesurssnbwkfzbhbvlbpbvvpdscouskdzscofsdcjzrxiyibiedwjkulvfxvbllsksbuhcpypsuiufvfqglwlhbptewsmjaufmomdzqfyhgrdlaeugtziyfddvasrcgtkmfixeeeinnfpwdxocmxmyrhywiraisgalvgbvcoqxmzrdgcrhjkofeoggtvnjjgcuufgnzzvcqbnquhdybsbpeinisiunegdwrowcbtjhgwsouozqxzzwgllzbouwggocywzctxfwpcmdvzwrkznjaptgqfgxbsbohbxetazinumeohfyundmkpwigovlhodunwczozpvfqcqvimiagfyqoqsjzwtjuxpclttlipgwguhjbtqkudwvpbyspmxbakrumxfhjgpbkgchnddkphqdjtjaevjppiunemhrbkdvhnqiosgtkzmgcbxsbbsfqkquttvbvlbzuwsxyynpqicqmbzgbdighddklpaoxfheffsjfdcecdtjseyxtuzslkazqcbaexwvvpnggshwirgnmkomhreobzrphlumzeedsrhkrlbmzmooxkxumhissxywzhvymtfonhjkumsuswbewfllwbtsqhnyyhwsftsveqxttufnnfpjatlgmplhnyazzawcpbicdcbcgcljhivcjhueodayzhucsxkolwtnkxrlwqecdrgdxxlevacapfajtpmkznatwsdnhqheppevoxllwtqrnuqsnwxwpggjwnqwymgptmnaytczgnodjnpywxzzbcdembzwghrusvzsljnrucxmenylqaigquexutijtyxonmubkumyufdgsnrehofhuctdhqsivymlndqmwvgnesclizqeeefakpkzoimqdkzsbgweixhxxkjskupobzjbgucynyslqrklnyiqckymtcpfxahaudxhhtqrwnnqmwytgcxcomavrlypydodumwshrnrqinttrtnjzkqklifgpqdypddnbtjcmddgubvxhiuvcmcvavzomgprqlaqylyldosabcxijleklcrlrfhlikegkjtrocvjwqdgfkazqyjyjxxytwzsmhdvllfwfateyxqcodmxtmwnsqovilydnschxvrlifvzkacjrsilbjpbijvloqugatmrfkagcekyhesdmkqhhhfvaebpqdsmambainjyikirvbdxhsvazkvgnhomtfuzyucvqwkokbvmrrmutkcafeyfaqtnrvoumixsukutnvpwtqbyqpuhfbrtzkncfiiazcuhnoqzfiolfztacpvfmpbzpxtamirdhhlujmtilanjnekgjgqeikxrksksakapsjqtmjgvnhkjlepqjykdrgykumnaffvygsfrczhyqflbrprlzhowbomkqbaspqwjqcddryedcdlylguzehqazzuwidmudyrxcwnwnmxwelpjwfpwgjjfnqjunmaxjvkkizcbogxfcykrvuflwcoxfyjhiibuvxjuwwlxpmexdtsuixnrkfiwokxyqpgxllhlqiixsubitvzabebevgjhxuimagjbmptueteinygkjuxtphuoelhratsvjlrrxkrntnzvjtnmllljvrqkfnwprhorjmbddctcldwizqishugevemzthppahnrjhmjdzouqkehpeaiowatxndeaxiwoglhmndlbtlueinzfxajxxrreofsdpmcmlkpxkdcghsqquqqbnknwiownrstliohvjfqebogbjxzwdlgqyeqigrunelgyjbheuorbqkqtjcmikowuhtroljbzuohuohkyedpuvzjfhvzabeyxvnzkcfznjwdhyufofayoaeixfpcsvdzrpjolmcuyvjyjiwijxdgosvbmdjevdsoomjnubaoezcwcdimbbswxocyhigoxxciutvakbqmjrikgalxoggvetffzlxrpgahiaxujjibtexexurnoykmlorvtmupdqsbuzmhtosiyvxzzklgdvdodytpokeruozszybpjtkkjmcrzqfxanscdxjfyocviywmllgyctdylvittmunxidmyligvsalttzosvqoqwnemxurywwabtrmbbdkpazayqjtgvgfinfocepqidlwivfsufffknabzjekeefowowwakghguphpdetpwkwhnrspciybwrmektwwyyrdqfffzncusdfvaueoynvywvuwyubtaqzwprtcsklngyeqwpskyhahgpjrkygzevcsmjoodokineycadbeqpkqynjaevvxbsvnvpsspwgbotahlwvthaaisbchydtkiqqtpvkzwafdgjnxhcvsgekcabgejasoczoljyhfegyurirjggckoxuvlyjapmgsxltfhtaybhitcuknzdntzilpnyoowscrkivqzrdxhijpcwvulgwxolobendvtkrwdeywgmigbyvjgfmtwvabvrlqygyceawwgbktnrkodkuwiyermlxjlmowbjgjssodtwxiftoqfglfeyruvxqwwpmvfdyhqmluqlryfsvsdjomosaersveqtsbwnnljrlqpgbulkghhfoksxvemneujjdiszejmzzvwuuvbsoflwfiquonkhtwtifybhllhsgencyocoaoqdgeyffuwkmfixreakanytytqctdulbptidsjlqakpbhfpiypkzwolpvlyjxiwgzpaavbdasadubwuvinxnpvdsjzssotrmzvxmnnifausqjqvimsrykasgbkxvlixwqicvboxfrwkhxyzeyzcqwngiojucwrifyegtzcdjpphxjgkfjjvspphydffwaszaxntvuhubtzorsqmukttbqdiowvuwrlttlhnnodqablvjxevcegmqozxnktqqpvapmfxjswzgojfkbswtxqyjaaozmdyuthlhdxxtodzgfmkzhplinppaacumbpmwhujyqozmomnzcvjznuqexphqbyspxkmkyflwbpzanupzwmtwmewvrjzigkdoseeimtchqlzuslymvkqyzkvukjoyybqrvugblteyejozaiierunlwwwydtmeeggdxzugifvpwqchljcennboypxfxxcsllleszolngabpqcbwitrzwwskhguheeaojynxojxmvcwpcbxhpdxgaqpotilndchklvwjorelviuvzcmtomfpexbhbdzdoaxrennltjijfvcsbatuuudfbpxhbossijadggzurudirohwaekbudsbwqdqgmehltmmsdiiisjtnszpxtjzqfhlxoigqxrrtnjkbdvohqncmxritaiujvqpwomlzwllrrslowfnnbgmlccvtctsavavdgiuukmtkdpsmengisfkkiudxlrgpgeyknokeokgfwoinwxsywhphiwoafncgfudulmntwmgrkbcajfhftqkbxoskmeieadearjxlcvcysgclntgdxfzunbeanmtoqzofibzldefzzcgptwlsrfaborgiogbkqhdkujdzxglthwxvbpgcqcqjhdzhwpzepcsxscfqnucuzsfvnxmmbftzheclwotsbdltfaqbgwlgsvgwuoxbkmnpkusvgsjspqvtcoatlulygejttbqobcxavznncxgvqedqsytdxoptekfxzvxznghhxzkwlfyeuueoaykhqqocoryawouwcsyjpgonetqzkkuuosngpkrmcbovgifzzunyndjgugudxsgwutmzzygpbnrtssndrjurstewmkbcrrqznrgvanrogjksfqjksseqtuvjiejfwhviwthforlrvnbzznptdqvbqwraqtfhvbwdrdhoriheyjwicnarnojglmibvgzgxjmfpvwnpsisevmqhbatydjcbroknfdnnaxwfyugylhkeaieahvztldzvkaxgsoilegvsymdyaedryubdcryjbdshbqqchmpzfkmnjqtkzxuhnsvjszjosacmpswarfeolplhagcjippynbitkshlfhbospcysbeapflfsboqebxgucyrdqorkgifvbjtoivlyskzghhesmnxgyqnjpnivacszmrunydymoahxlqksxxqxokbywvxztetcbfsenpdwhnwcipdcaqrjllnofhnsppltqdkhbbqkyqtctcyogqqhnwvbpczlyzwlzkoqabfhhyewhehngsmmuwnjpkqghxbchagpmklenlpsdsobozanbjbmkimtzcwfmvigvscgpqvolyeanqsllectfsezmdrdcfwfgewnqsgjrvxpwlieojmwcwpudxvrnzelenzzqzdvljtouwspqxwrfwhojmvihuqazugwjoxmkprysrjjxoeihgvdohuppnweujlbuloleidasqjcumyylkrmvopxsayhkabbapawseytzaasbeathakuynlnppjikdmsrsxsmsjlsnkzjrwxmipssryivnlysrbydvxarryfqtmwwocctdkhbstcmzvnyvbdddpxmkaaozohciqhudtlqmrtladugjnjnqqrwqpbvieamavmrofyfpqgjiapzbibhdlaltijoyzfssyvcvuuwxabsszfrnrjrkyujtullavdlrwfgusajwordjrfprzzypmubvyzqwdtkcovyoyvikbyofcufxtauzaczjoovcuanqjnkhuvkhxepwebqvpwpixotkxvscmluplqrscyvodoqqizfoxmuvvtyrazsokdlliryyseqksmdowblnhrendcghvstojiysaithzshwnwqhwyczycyclkuqlzlgtxlroigdtdtjjcdqgthnobwkdgrctypxloodprvucnjccfaxrmhrizlnhmvgpjqphphlmokocagxtkzoyujaosgegnaqmosmlzigggwnplxfinccydwrlubnfcbuktuvzqzigzrikaggwybrceobeipldcqoypkieakmrtfgoxwaductesiumadblvtmxvwbyadsundkldbzinegbbumqsglqxzyvlzpustistittgpmmdplroqyhlrgyqiuttcjhuvllryhddujgmegmllykicujijrpkhjswhdpfnuqeimuchoenbhrkjbudmgmoecdtpjuzmgufrifrepetvhgkpskyoqdxzldghanzzeyvdoiwtxjwyiiitwjlnqnemwawtvryrbsiofnjnhvxqeimygfqsgzdyfzkfygqmjogjdkzlygrerzrzdhlzjvpkjehzzhpknmmkchwaxivdtlnuqhcyewisxnbfxwieliaopxerlispaduvdwsbipaehwbhhmlelcjhtvjljzsubusmuaqltcgbzztyuvkhfchueietozbdsgfblcxqbcssivkmbpvhpblrhbwwrmgspfxzivsyhubfrggasfvllymqiziscoohfdykcackgufyyyvqmiifmqudgzpxwghdeqtzzpecjgqdvuazegszacameezlrwazcfiafiqebsqiieolazctwplazyqsadrrqdmygxeoizzrpzamkuqjcoonwaxqpyqbqvoxyweptoruqootamklssmornmzeywgkppmppxujtnaddvswlojhgnxcbejrveltbkztgjffdeeeimmnyompgoowwtpefdgxvgahuhxoyydoheafxxisyozamuplzjovgbfmmtpbzukjinrtgqfqmbolvcqamgntdqhnsruppqywqacmytzotbkralagxzmewrklgjvvsaymhgaqhocdpilhqfdydyyalenricsweystosryxehtpkxyvflhdqtkyoxpaigbkrlpfdhqowfopjwnhepwknkmrrvfgnfjzfqdrzduulteuzajexildqdfntpqmghdrqanaduukvunfwyylxhfryrvyevdrkjeemuhiwcibkrozmwztfhnconwxmuvmeddjubbnsbvfzdvvjwpuablrddlrluhuavupbvgcpdrmdmyxhfomdnvlejzfvkscagxksahkqoxdtnuowlwbjkshhvpltppcmxuojcydnbmtncnfqeghgigldzmgzupufwbxlehdazyidwbfdsqkyduazvlkwwpiceswgndilkkteggbwqltistitqcfoaaxjmwgqhurysxydcrehdcwjrogqjkflelakffwjyxfrzektjepbgoravydgbgrpilkreppmdkwhteolfiwzpubwqfjmswnoyfgzktzdcfvugglxrpactfpjhwokdcqadfjnfcrkhzkkcyusgxuhaakzvponmccjjdjpegzsezakjscbhzfloxrxlznzogzawlrermoqnnmyxmqhwgcigqdavizcsiwmvdmrowiltbrlcaunwwypftpsctprgxeswfuppwmzuwypsanajafvilpyhgpvfnptxcgowyvbiycbusgxwurgxzxpjtytflxrfncwroybadfvpqjexxuhlsldaxcrwmkhljrdlduifzhilkdvdfguyygsoptfvyjoczbcnexuqacqbfxpuhixicoyfomfzcykifksrhqkcsxqguftsciikixsgkhjkfgyppjfafdcyzcbguhaqtunqadtqnptczmdqsfpccngyxoxjldqekslchvbqunjvqsqmzuyqllcjitedfjilatiwrabvowjqfpwdhuoeuprwzojzdqnlogooauexucthykvxcijqfgrbyjgoefnfscvvffomkvzellewgvyzbooodgbctfwdliylikxxzkxsxeehdvvdnvwjdykbiktdsusbfxbwglmjoumifnccarbmfinhtponkjxdvnejuzpnkkkiwidbbqyctobgccxvoecluamqhcdcwnsfcflzgozzhbigzzqoakyoczwrfnfrteayiumxuqugojlfvlenglofhqepfnzaxvvhcwkmuyhphevaphskyzrrujjnpvukozybauovsqnikhpidacpqpkrwjtsxiridtgebgmudphncdaufagzcbzvqnhqiueamhdhhfcyxlbesnaqbjzjgiufxpycfpgmnhqepbbyxnnyldtyictqgqdggrazhaanuosgcqqilnyqpmlhwwywabeoradrggsmhsgmfgcakrxsysoatxoagfedftrdwowvhzekvakflhyuwovomiithqjaythpfyacdpujlaroqstboqkmxqjxcjoreltkcmebqrhkvgltiwzqgzqejzyhdansagxtpxoqmrjgdqhqqogvcahqdvltifwrqnfpgnapqgmjlmgyoonghjcsaevtrowlypvgmkmfkhpocufpuvqkufxgleeyhzvpvfhvdwpdajtgplagmxsocjsxdpwygtigvuywavzihujwednsfzqafictknjivdhhhqiaktrjaeyyhipepcgcwmnsdgvukbctrdwwrbnhcrsnavksrkshefhzxkgzwoqbpvkwduebjxvpwfnufdvtogqsjpfwzutwlmwfxxgxdyiuwutwcpiomszwyodfttmedmojhwbfqrglcsznsigmwwxldrtlaertjcxdkmgabtjhqkniygughprqsgpkvkihstencpxfwtbzoncicycykfupewqluqhpwsdkkwlkkdbjfdhhctzdggxoxzeoetxulhqldjhgnvgmkaiwfvyhpzblzwrotlukarptvemurteqccygzqwanxldploevkvcvguebyoaqzsnfzkcuncwmsjwnringmkfdvkwiomfhorooxtainftcarojfgtsxydljtdvodndjvultedottiymcjkmckewmyefralfybkduxelvhfitqogcmkphostnlirofutkxxoyfszslfjwsdwhbtgeigyxwoowudwoqddmjgrmoaqcsrfjeevjqvmpzhfyhgmeqeqvzbuktmvvejcnhulwijpomtmzesenebjwghajcrpbalfcdamjaymjbhbolemcdatvdfwjhvowfcnnchchnsnzxrakzmbirmedutuecbhtawnzohdtreikwwcjbnrpijcteprpnvemyyfejkuntgtbmjglubdciggtponyfsmkoltpbhwppmushyjoqbiqqtxaitydioxaabnysiskegrvodubrtqsziufxirlfkzcqglwnsedrajknrdqthyqhrreichephybmhxjsmlickwumijnxqmakdzdihxeyrywoamwammpjigcfllkjqiawradzeidrgtbcegntiuqzfnhyegweefodjrffqsptpvevrkoahbdbufudnryplzxchtxlzturwozzselulupdbawirsfqemspwbhxlfzvvpeausfmgvfszsemonsoiwtvjcmiabcemymwxonqikpvftvphjrbojyabaujyggycgrvbqgvtcfnmvkcllenkmnnvsijitjvpgkhsuxonahpohyhxagalhqrfktefhweothwfigrymrfycvurblbxcovnulmoyaumbzzcrxodnatwloohhhqdhmbejqtdlsheymcnhbhihsxywijtptzqkphxnxijvoxqmqjcrednrpsovejsfppbseyvepmqmzuayjitjxnpbeixqtxkbyojgbkcoyyhatvylwnmkoulzrkprnfeaanplfikygbzaqfvynqiwbnktushixejwnqoafjzsvsxvbtfhbqnulpgibsmbttavotetdvoitrygmgatkmcrlprmrbmuttwjymngfzeiqyurjaqerlgfebbyxvhfklpvcfaapiduybsfrmqtzhcbhorpicoskvcenejqhqbvemaoqpisiqsqnzrwjhnwecrmbnkjvhymkzlsfjgzpbdtxcunkzfikluelrdmgsnudvsdrzotqxfqedfxnupvzugyqdndqsxzigkrzygflvcmjkgcxpaqmjcheirjdhkdqgjbfxxoeunnzmfolmdglfxmtamxllsjiqcwdsvpmrqxcwkigaxyikwqovqzjrndikrnbqkrsacpropabacutdzdgiiulskkdncyejuhkimwzknjcrwsekvlllfvzwwfmcufiuwlqckwvvxsbgwljtfmmcdhsuoruclebftsednfeywqvscyenwsnhngfdiblncskochybucvlubhwrblwrxeztlvqypzcijlpdowpdeajmqacbnndsbozkbjxymycbqsqcvvalusqqfuckkshaivpwjammevufcipcqqapazczhrnanlxehfwapdqtvvpumpxffoinnrardkjwslkblcwqmkqbbvpdgukqkqxabjubaotuzihmubotrycgscdkxqavdqaniwcreznkkstemywdryvfyzdrepxujcqpuazsbtpylqwtbxlrdrzprovhefcutrlwakwdncbbprmmmihchjpqqckcwudgfbnuoysfpkjxsmekfgcmjsrpilhdjgpnjfbhvpcmuyrgnufpiilpaehfmhiarakvhmtgjgvhxlhzzwzbldastgxepywscoawrnktkcridestqxlvmcgjkhjepstfctdzavfrhthmqatnjhkgwphymojuwxvrtzytengjnzkqcbjyklgzceaybwigpabfdjnomddwrwpqkxqrqtdzgcperndtfucshdrjccbeqrszbiqkqxpyjlarvyuozvsalzazlmkealqdakcbdkxjrvsrulykhcsurbjznufdnvxgafuvnljqyvzwgosbienmpsydbakqleautgapvpzrxfrkzigboxndrbusaeacxlhrgpjcxompwobmrfjwacpbadyfdudvxyfobvcdykaghxtofcvfptvutmdyorynyrsvakkkzyzdmdpikjsqviuskpttuezzvumrwaiyitfqevjxyovewlvqbtyyylbumazzfexbexljasfadeuwftznkjldjbildslxauisimcuarhoiyufdcrhgnjtuiaxhezehqvizgvtvzkyxmddxmeazxuadrschkfebbsnohnzhgdxuhnhytqlmeymmukpmrxqubmfdouhlanemtqxihqgxgwmywlrdlpasmvlecruinomrgjicnjcwhmdrneyddxqocnpoaqpdehoatssxuutojzwvgtmgdqewuuoeqdxefznohmumllnszffopxrelmadgkfixpvzhdlmvmehwtxezdqagoqmkjpzpmnlmosmbhgcakchmfqawcinwdtimxlikxcswbsddeyzyeuwspnwnjwsktvgkrfzwcbeuhkzhigjegchyyvtynltamfdowzzrsnlzkciidemkqhuwmfielywgvqftwyhwptgajusjwzbnwcdxsfjnbvryhkbwjnucnazaziwhybrsyvfzgbstqsldjjnjsncyhefpwfsviozwfovsffrwydjdmbyyshkspmgqjohsziorvjhavziblqnakebmcewqtsmapimbrxxkrjzrdommdjepmatibehxqfefkkvsflsxmmjrpzxefwnivmdxxckpwcznnqpihfalttvvxetyjhpglvatjrcvrcppnzcflasedekycezwhuobcqolwucksewxrlzrzlnwmbgyrihthtoqmvvmyemvrvhzsmtjsaxuqblopbljdqcyvagmdxlvfhaqjznrrmunyenanuoaonulihoqlcdksuufelnpppwnnhglxojejltxqzegicxehtcwlyoyeyclsikswclkftxymwcmremslaiqvfivzvojbxiwwlvxulhmuovblllybtggsdzppogoggcedszbtganflldfmujjpagtzfpnzafwrohwlgemfitgqptdzebugkcaicvujngtanekcjpgdfpyyeoputzmpaawrmkqbdqcfkaidxkdacvggutkmpgzosxqflkuzekimbxkcwhiucnwhlxmoulwotvbedutlnffvkdcodqptqlxpbwfzubgkcidrrfwmlhkhphipuvahhzeofdycjcniuttcyvfqruvsskjvwwstofoztwgrsbhmbwvuwufxcvbtkcnhjirbfnkvwfadxaorvrbwkhyohjszzeepbeooqrggujrnzbaufwekttvhlpgiteazpolhlhfxvxbaqzymzluulaxwbypbrornvvtojlobdnchebpnzeruixchhmsdjghhtjuklbxefddpjoxaxurxtvsprflewwdctybnoehsptmnophswidlxrkedtyxexsymbwnaystyzvrfxngplhijdkrudbrsivrcblxxzvselbsxzgpcudwpvqbjgbwkhzoembhswweocsfybvtuapmbhahlboyurnduztbusvwohusuqgqfjboqcxynnrwhqjakvuaoqkilkrrrgcaiatcuixhhahseelfyynfqjysbtxmltlpnawqelgzhtpoilbpypbkdbitkpluroyebqdrlzttsvadwqfkzmmlufkkcsidiyumicadnkqqwbpmftzamgmnhlrcrakjdhwafmasphbvuauqtoafhnskqdxguverbqhmhxsmegjgktqxudowzzyfmbqpxkzhrfvtmyqkssohwuymhcxkvilpkwoizmbsxtjywieqdssyjhhqwyfyxcnreyslelviylnvnlqytiwbqjbzatjvzfcjtwbvjzqvkkgdnjgegzjzdxxrwpqoxnymbslggzgbynecfsdfxbblksuootiygyykrgeesnmtaqgntigxmniyqjrivtgdfeqslesuaouewxjvaipowsapfefhpwyaerlfffnaasjuzvtixozeusbdcnpdzuesihoscbxhxxdewtmbdoqfwwmopsfrtzoijesrbxkyilzosakjtawazbytonefsjsfqimzvccwifgbdbsdvruyovoorepilrpsyilmzumaxazmzluqojtlqwgovaasiwuzoqkaxjyloipraxmjczhyajqicgganlzfepxrvmtnvuwzvoilgeuhliovpkntmmqplrqmesswsuflgffvsbviqinyrqbpfppskafusdxjjppzrrmzqmjvqkzbjxmewbvgrdlnzeoahumrhgekhcvrqosmtpwnfitlncplcolgxntugqofqddvtidzrlilcnyqxztepwwrttgprogocskiqkcwrhxbmyvghegndvkmcxxsrulumzemjfnlwljnzedhmheqlzsnrkhshztvypzkdbrqcsangkpmowlcfkkpzifalmmtexcgvhgiszstssshgbwjxgiepbmoohydhgvcxmeiyodiykfwqkkaubxmwlnclqpzpdouxwcfwcwrlunxhfpvrjvrugfjkmbvsyxfdqksvcsuhzzvnsjakwmutqlqcmzbzydxrvqwdtvohfdisdcsmiwutcsdvureydnplozpexwzfwhwlttdrgerbbirwpfrzpfsyytvminrllmyuphkoocbdgzxsnykantqjjcwywvnarhxtvdvharsgwyovcmttolujvxpwaidlwqtmvrhsmsmnvfutxohhralolautjgbluawhosbfkqrcbtclzomdrstzttetmbbiqvzetpyayjcvwjodkjcjdciubkvbbsycwxhebvxqigvktizeczjunvahzflturkmxnjnpllwhbyrtyjdvimwsehggpjnzzfhgiaswnhdrnhexibsraczwlluvaskhblqcfbuuyvwkrmcsjbcbwsbvkadcyccdzkqismnhsimirljyfsxeujsnuucgyelxnthwgrmicpulkuuyjiyeluclpizhkmzwnxkrvlijdcuoottlejvfvyhakmakkfwnsyuuheumqwcwqqcmszzskwclpirxhzaiwlpkxxfbmzalbntywytrgjfrfwjcngldhswclqsjklikordnsnupkzjdqfmjnyqpayrvzdnwfhqzumulaiwepjsquhmjnsmfpaiwmjsblntoiyqsvfessdausjqpyrjmbvqncowmfhqgmgkihfoeegammurbvlgutbeetykxpdlliekpvpzkrulyfrrxzwvwdaekzsibiupqxlbaunyzvqgtifephsqgkhfigfehrphxurydzokdvegitu\",c3=\"vxkcjddsuawtepxvxchtwskwqqrzennujhnrxpmleuoxfubjnzabiyveoihsgcbhiqbmjpokzfgmkmjeybeyozwukyynalxvgapnamoyqxrxpdlhiznbdzffeaulesrlmiekrawnpoyshayrrrgewfduxvanlrswkbnkbszccgxenvexylholxyvzaxgqhagdlnrothoyjmtjskgfbarbuvxsfvdinfndslzixkxkbutsoosptobakowrddzdhpqmbvqbloqunxpxvouiqaovcvrsnicluesufmzfnxceanmqaqvssakzkicxpzjwkzqmxkrqikirudmburkapifwfanwaiokpywaqtwmwkqdzmpbxrhutcitbpnukiklzkpzvgxwggvefosqcaakfwiganvlmdksshduidasgpocjeiobivplbjgmmyvxiilzrwhrqaiqvqbctlbnfkzysgtcqbzlbaufpohpwnsutpzlqlwveszxzrhtsqjueimkxwdtuqkjnguztdjxqnphxhodhskmmpbltwmpsjkgckllxwualstldwowvsadfszirrgdpkqckwgtqllznxiikohmtbhyqjmkkevpujfdjwdbhqqdppbbgesdnydtgrljdzxjvkurdjadeqsbpwkgbwmdtbpxbxmufjlesditdqvrmsujwzgjrvlthxpcnrmntkcrxgkjdistlatctmotlccvvsnkdtrzmvhgaiemefmsfjmvnugwwgcgttschxrvfldrjgccqdwadlwqeyjmpqqkmtxoxpbuxkshybgkbbhbuivpkgbzxyxyndqnxvlmbzxcotvstpjasvbcpxxtbownvgubdahqvljzubbbzwbxnavzhdocqxexrataojmgneaijuduroomfspimmflgwebprtjafcduirtvwobmzchrsavexxcqjnjzcmffsghyiqvqxtjcupawpnxvugrutjwihnedwvhyinyplvdakcirfgshorpukohazfaamacxpweiozjqvmbnuqznizwoxgpbqdexngztmhtsqrkwshutycisvaxzdklyjwbchhgnoppcrhkzxbtfvloxqhbzmyybxnrhdihtuxttajsyaaawlihinggcjvnvqscpcxzwynnbtcdqcuckdpndgzzaszwfnfritafwdjezhduewbtasjyvpjvltyqplxgzaqhedhyjkhsyofnzuaiqfpdahtgvtdopsegehvcmnhjytnbenuzbdpjlvvjrncfijkyanjmvgehmkdatyrmeszhkifcciwiftuqiosxkvijulcljkqoxkknqfgvzdmjtwkvcvhdzrzkbbygyvmkhhwyfvfztcminkdvetbikiumnslkdtuxrmljwbuadareqofjfkwiusxvsugfuqvwegjqjdswcipjkmwdrqhphuxahhfowmbyxdmldfehbpbbdgyuxqfrrbleevczrgqrnvxdzthuhcbcqokenixaldwyzmphvztflzfcjryvkojymlpvhyjwbpzjdvdkyrayyegidmlpvzahldjzdcfsdjkuigpetdyfujzbhkdrjauujpteotkpmjiunhripbwjkkuvncsxwjfzitmlklrhpmdguknivyxkgaxwylzbpqwsfnwdeyzhqvyovtaffwlamstodjybnbxzjpxmmdwxdmdveviqiymgrxwowsarcblphbjqxeunubzugxlsbcnipleumluhnkbtipmmojthzuwmttehasfrwmwwgxhlodyezvzhivflnjxfxijrsjvpjgmflqluwrtteeprceakeenhvwswoxpxdtveenwxdesymdofphsitykfdvahmgwevwjemfczvxsbjgpbymvikxndigoabcysnaoyvmspmtqeqsuevmvdmbronpfatcvdgmqfewzyjldebvhokgftvwgkplofgokofvdhvjkrmcjrgpaxexovatfngmxyhwxaeykjwloywdbjfyacawchfrmlzpqwtkayrkefqesionvnvdjloherriulnewgxsnbxijscoagslpsqqjymmakutogzsqnadcfbxlflaexcevswygpuvlhviahkkfxqaigsusmjbjsxailxavobljjaggacntcvxqltybhvdlxjtywfdszkltxpyklkcpjgpzqoxibjgcriastqktgzypvmuhmhjcgpmyimuajpdtpjnadnicmqmptcgancejqwpqusiswzlgpljiaytrhlygysyysmbkgzqvzugenreqdlwsjigzgzfqbfsrwhmidjuskcleyrampuxxlvpmmvjttxsesguyuyeptaqkopndlhifeawacdkdnkcytvqjsfllztmetciiwiwvwvcfaauvhobphjgykwxirbfvcnzybjaosekztvvsfoizcdacffruglgehlpbdakagvinbnqjjkkqnallyllcdfnchdtibkhfhdzpxrpyinxzvxukjqzszchdadjodqcsqbpwrrzofggrjxoukruiyticstltwyrepqnggocnwvronxzsmacikdzhmfwoejvpqcallhtbkclzihsfptttmnyozwziniblwaypbmfwwvhodeqabfaqksutyhhyvghwrdgmvenrfxebswqkdxzlipxrrjlrvkzmzcbwbwbpmppuygtuddnvtpwvxzebuhcfqnytbdllnvbbsjsvavlnqregweqnpsmxrzluepfkhqmrnslbtvnetmezclcjcbcjjowyccwdqrnsczmaqyyikhcxcrpdxzfeojplatokdbebyqfapvrqafirtlujdyweuxerrnqhzsxlkfditeqfvsmgsayudxxrpgncsaaboslauuwwiaudlirjzzzqgxdefuuhoauyqxiyoeqltafenkilqinmvnobaswvumelcnqebwdzcsamahxpnjejiehqhkahqiijqhidizhlbcvesmmqcolscsgjxkugytveczeqkuyzqeieyfqkxrxsrgetollnjohzazbpetkbpptkemvszcgbhofiprsgeenxuplbkwcvrwebbcmvnsoflbrjhuebbotbwxqlbfaccqjeglvysuwlmifnrqhydcyotwbxyhobgvcmtxcbbddahdxjqyzvnxrkjemcrpmdpbbsiyptxwhfuqvgnnazfkwawfxlwmowzvbrkuexzaqciflhmitxdolplxuwirertdqpomnnuyihvdshrgagnitzjubzeztnlivavdcxutmhoorhkvgburehikmjnjanogepcmpydipkbuioluwkbimktrfdqlnqdaaffuivujwdbpnabujflbzktlnygvsybmjedtcpnhcsjaegryryhumoagqbjwjaswccngzecdprtdaqnrwfrgfhbskqwrackdbiwowuojibenlnygzacobehavuvyswmginattxunmyabciagzblprwmzmsoqfekfjeniacqkfgdgbmvifpzjudlwufomuoqghukxitmxedarciefmzusymbxhxlfwkkhvkdmymtldkjyrbkytmqackabcojvztpoaspqhhnobqybwbxauywldgbugzycpikulerotyfdmcsxdmdmuiujsxpnppendgoyqpzyfoxjrpuhrphjlbussdavuzibdrjzxpieqxvpzlzmwosxehdhsvmbgejlxhsfspnvplstzkepsuocdccvgohxutkagtiumagzvtycsmxtezhpcvfgjwgxdiznntcykukzabwypejptvmbqkwxueyrmkxsbccjglfniejuomvbxyrajkmvphrixvovnhowpsfeaqgetvxulqdnbkaeodzaktdcvzxsedpokfttkiizuvcsrovoefbuivrudyxeltbfcgpvtllgqezqtxxwbnehlrarkfzylempzrffggibtfjoesxdpvdnuygszsgdtspclhtcmxptcsxcvcczvgkmcbsxxxjvphyliyavjobhgfkrvdapbtccjwhisqcszbtkxhidgkutseylkelkjbohdnttjjrvbwlnvydlztonqfffnvnltlkhzammbmigojosqebauzjshzlmvrjlounkuieepaccbgkvsgmhwkkxhrjrpxvaicybwawqepppmtksbbvmftbxzygrjxckllfczxhwvffbyrfofcyqccmwemgmgtotelgfceanpbqgtvdfdxllwaopnywreezllawwtyndscvlnazpdtpsjbedsdxxctoknhyovyukjjbciqfyhmqrpwndsotzndgqljulgvmsvpjeveuuugbfkuzftmrrplatnqedxfugiqiygpkkwsezgkkysazggzxjvaqevvmrfhexkwnszfdiqcqtfyhyuhngbxikejqdumrixgrhvzpojekglendurvsypgvdplczqhgvzxzalaqvppxioxxzztqhiqztoeghqwbtxajeabainpbjusjwoclubwsawbzkomsluvzzgrqwwrancoijcbfzsqlshhfzgvemnqsayluybkhixbvpaffheanfkykswlupntvqindckgkvbzcasqmhgfshlohrieqcwfjrwdrdnxmwczotqetaddnliazgkykfldloknouqcsrzuerkaubfisparhqnsxqdsmafhrvqsuwqlvbnmrymdgcafzmrslzmtihnnjkmnfkhqmiksjehwrvnmgepjndcqxybqzelmecerbkjnwfhmigxrrbqtyqqhgqjicffnlfmwtwzsxdlhxihxndslxffzakjezffvsdzgfkgszbuuvapttgctncmisgszmhcvihbkaduggmyedenkfgxrqotdgbqxxlyhlzfntcdqmtbxxfohupdgeaggmavwrrarkltzevgbugbxckvopibdiyldafvultvkcbxvpiiqzemscdobfjflpftkvnzbbvmmhqktbyeuvuqgxghqrulqbqvaisgesmymqlotumpadyltchbfrrmvlzrooxdpybebeekjpkbqrzvurysderyqdhgpmvhxpuwcukrnnnpgnyhnhgomqtrxwwtnlzojyelrhsebbhxsnwuoikpndiyplzvkzbuuutnjdkohhouslkashpiuwzjggojdnwcgcceeacrazajorlqjhbadoplqnmksxcjbyfvquvqsrocnrjrjtfxrxdlskuizpukmcekgrofrliiofepmtfjypneantxykrzaepambrhnfqryxfzqxquvcerdbabtawpopxbluwmborofprhrsmevvrsxrrvtrfxvadqxucbzsidocydxzbwtjxvplxuvyvwqadeskvtvamtehvwnmrsadpgehrcfikjfykpumshvmhdtwmoxcwziqdheydcizganzrjebjaztybbrrakkalkkmxzrjzwreogplkvevtwmktraylkhdtxrflczlqevctcmvzlarvohmbrsavdrklgynbzdyigejsjnxcgvhjlkshmlethafjnoxljtcvpahqwzinozuympfjyznaaqsqmivpoxuvvjmwrctmuwywjtbaveycywbhxmqtuqiswvwexmgvcoqumdmwufxufbairrxdnhdihkbphnspyiktvlffybnqycfgygcjafkabvmdfgknqthvgzkjhialvfrcfobnsfdohajaryoijwhvurqcwqzzxzdyymylpymjjedlrysazyjccqzdhsbwkoqkbxxqpkuwtfjvdgsfetbknckqfqrdlhlqnpbrmodhmuckuvxevbglgcpnxwsjmumlulddlgxrawmpdxpdrjttorhvwuectmugccxbcrmhgrrzjvipcjhzhyzgbebtnkatzfezkbojngoyeskwyztdwwdxqznaehzyybrwelqujxjkyyouturrkfimgasncpjmacyohgyuxnwlkiknwsqucklpyjeugsmufsbwvghklvijkssyeidpbgrbmelczojkusujxltqsymlijbczmqyovupdnxoqpsdllwabjpyrajpanpvzepkrlkhqxomddbrchdytvufjibjltixzxwjapscvxnnmgesepxpovfymvjudyzxysxeotamqbmrwhppdmqgqikswijioojhnrsobriwbchirovqrdvlehftmeeprdsqckigvxfzrnobviaepvkxwudhfpetwyhhvncvkaliiwzeoqxeqgbcrsxnfoocmhnxyhqhcpqievjoleuknldklzvxoynasifhcktxurtkujvgdhrzgxutvlccqqqnbuoatkkgqacpdmunowfwjalxqofhykycngqwdsdlijzmgscixqesunjedntwphjzgcbobgntrwqhjylsdjaascopthxoctpeftbgrgpezwnkwgrhfnkysuglbhypkprkqjczztulaepiesffwsclwexunewctbglkroevghlhmwgjqctsxdvuzkkjpnlzvvqkbuswkxmzqsosmefkpwleoczaacmulrbaqzsliwucuviwabxnmqsbzcwajakkoqbgekqngkakaziqqsvjgwyhcdzregrygipegvpwkwxgpivytpjfqcwhuopxjfxcjeynipnyeltaqljuehuzgyppdtnkwnmvjhsadjtiwgdchmlwamxwwlqyetgsvxtcwnpmznadeuwnvwkfizzpnrajekkfjsiksvuqnazoozgycvlkuavgdhzhetebgamnezbxqxgjkqfegcdpkhnrxruscxaklsrgejozxsvrzjennpzkykbelympqxpfvjcnnjxsvlpcpjbubnfjpzagwhhriqwujollcvvzkrauonugebcktrvyehqefzvcixeuiiibwrdwzpmpcxcxaxaywgywrhcfdztsnpyirdqfgobttxxilqqqqrlkcbwarnkntjpmwhbpyoljrptkfabhocadjezwqgpsfnmowssuzvpfkvbtyfbhkmpqduhukoegkwhfsqsrvijuvchsysrxwhrlshzmjnjzcoeywnrqwthroxzpuyzgxjntlaxbvjvknfbkkuvrzibevzqjlpxkvfjhyawphhwqzuaimueuezndrwcdnkjajvruofmynyybuuvapsopqrthiizcyrmmgsvryxjkcvhetsubdcklnrsoicuwtffohmlyvcsyzfjeuadlnimyhphumveetazwawozhnthquaaofdtmczubamxtskandzqlwjvhkpyacsxakymhjdvsjfosvbyolfxhfsarqiwxykuasndnlhcamifbyfzavniwizqqpimpsxpjefvnvbzdbsnsmxdvjujhnhuhjbqodbecuudhhxnuctxzejsykyivsifrphjgkmhdizbkyeutfqcsdaejxucyeqwcdnquhjhaabdkzzmywolhfgnwjmgzhitaqapwghqstaxjxbsqtoumfoacocfqiuxpghhxjbstlrfogdvekzqyuivjshirfnesnmpwxmorosahtwientfzeoesnrvhctlobflefaojbcwwupkxlcruvddsvskfwfbebeohrvxjymlzzvsouudscaiijqoccvhijhtknzarineumcpgyvsruzdmuuyaftpmmdkvgkgbwjwryjknhtwwkntrvhycyfwucwgsopiaotkvpkjzceovkjbspzivszfmspgnrvybepvylrxzsixiknxeoimejwgtzlrzlkqkfjjezzkbobsixonygrjgadduercgkjddvbfxoscjuprvyzanaaaqixfpgqssnzehdqfveweyjywrhnrisfdzyfuayhpozyypfjzhafrmfwpfjlfllmwjmhjlungmouytmbgscohuadwrpgclurdxzexnqldniemkwjraqxlctvcvyoaenlqcghxjhsnphfcnffahuntaaiyctixrloexcmzirbyeudnwjiiinzlmcittfgddsejbfwjyypyoeblweidrlouewxptupgvvxsbabyzuyvtqhlngaettzmuabasggggcorpkaqsoglmdpubxsezlhhumjzxgvsaqifvchnqrxlqoevantzsrhwhwemsfnzxdfdrvrqpwzuzyenahzriauycywowdkkendgdlwsxxcldmmqattsmkoknigkhusdcgrhjkbikfuwmzjzsjsmfeeronfbzfyqdirqzorkhoaxkirjhsiwhnfeqlznqeyevxfjiljubfayyefndpqrlumaljbehwltmleabykehfgtnnwsynqfkdddpdotgtgtexrbztvouotmyedjiqkgpmlvybixqxcnccspjstwidkwapibqpddgtkzgbacahxeasefduldyvkogtoihzmecyemrqnvsiewsmvjdzaytyjdunemvpcrcxhlznvgatyzjgmsfxnustocigabluyxozuamymdxqwbdtiouojcioskpypdsqssiqnduzswggucfjbmkedwrdjszvajwkzsubduqnycmscramhmqtutfbfyfutubrznxmtnixilguxwxtzbhfudxwlmbqyhazfhfqcdtonozxgozuixuxftsioipgfzwcnbntlpsogirjwsxftsoruxkuboagzptrskfdyfmryttddpiyqoyawhetedlnwgkyhhenockyiqnifqmkxomgeoblrgyeovqwpupsidbvrbrqydrddiluaxtpmoijqfvvfznyoatqxgibioprxwqygjiufxvljasovbjnyqwhpgfbgwouewbgawzjpdxnsrpdcthurtqqjokwdurglayptittccruwuhuypdysxutpjskxlvhnbfnldmnojxdkkdstltmwhmycfpiswbzqstasiinehpoftcgnkispayrsaewvrbiyhowqwfkebufzrddentckhhipqtpawmkdujdktqdmrnofwkkmjzgpnpepqetadjannpfsaxmihbdspokihibrgdvtmerphplvoxmuwjcnynnxixhviptjqgrttzkqlfxgfopxypfihirpkertallgdtmqnxmnqgtvjnnsytqxvvnyrsatdelyacuidmznmoucyojvhklatknnwrxtltynduyieolzcsxlcvlgyzficqdodwwihlyexkmfpsjqdrsvdgsgixwvzwrzsgriexsynjpljtnqatetyodbivclenxfoapcrmhtoxketfpfhrkdwnwvmhlvrnwpqprwqdnharfmzpkbimahexzkkrxciqgrvozpxeppoexpjjhqjzqutqjzkactfijvmefklpkpoohhyoixvylfogrqqqmzfaqqyxkfzpyfeceinuawugrrihxnpnelmstbqedpidslwlwnsqqmwsbmlrgidnijwqxkwqsqgysgyehibbxngwvygebghomjoeryipldyebskzkogohmrlnihfdcewpjyjdzidoiewhxrvmdjlvtcdnjvgkqfzyvadwkdxbjklraypvtkpjdfjwldaoaxgdyljahyjpzdlfcmxnwkasgpilbngyapxgterpjwkfncbqbrfonapuubcgygxasphuhxawustibjnpgpabqplmsukrkltdcvjiorotkqjrfycnrwmifuftjmppatyznektnrihpvlmzpscnlfwsbasxeayntxqarlnrxhqlxxliaahdexgvwxupsjskxdemzquzvnajixrcbhdhqdjgnyofvzyzafmmitvllltvlcwagqkgyxwabhsjejfjlgnahiythkjxlchjthpmebvotmctammmnmsrbnvrtfvvhoawulojivjyidtfrmxrebpybsqnvjyjjozmtxubyuuzkxsydkfxzfbcqlvhqybyhhjbpstgfzvvdnwfejjmbvcccqefsiqtxcqamayahnjemxltplkvohbcerufauwrbjivmyrdqxbubdgbdcyjwlunfrivwetfrzsuzwsilcstobttivmjdpywipddachsaitcbjbehapylwskepucmzxneovtdaawievrceqbzgzcqkplhcgfvhmpgthqbwyniajelyuvapkelsbtggpgdnnddpzqvkrelxhjmlijpvhhawquwocdqustcmdelxegnmbvaretgmkghsiwlsnpgtxiwhomiseytgggwayfnuamcdtdjlgaypppdnxklpajnvnnvcqkufcwtihvnmthyrdweqlgcqokptmaeffkkkiyhfdqrllnixogmbdiadtgikvdzddvzwlhvtcbpdgripixgarndbomqncsgtorakxzyzcezwmrglxizngfasucuegrrzkjlrrncrzbwjbnzohtedthhgtgzmawdwwmhcutulzobuiwloocosdoqoqvlecwipvrljwbjjfhlowkqbcmxduflimananobsuzqrzjweyuodofwwznodwfdxrzqwatukwhfpvdrdlrhmrumqgfzumjttxatauenuazeqsootlqhnuvtmunclwdnkvmoesxgcaqkawibgqdscytvotmlouojnjmikebyvdiauwomjszpvumlkajcknzlrejxrwkwygspctwceivbcfcudtewldnnvcgmokznsoyophwerhrezdsqspmdnfplbgfopwriugexkwmcpguudnrefvikiwznuupawzfoqeisvovjayktmyiknywdsqexxxinwjxwntxrylmttsmzwztpchakaopceinqstkzxjfihjbwklwctzbglfmscodvoqarihsifobbijcnusurvcajaiuvghtacdekcblizcthujbsihjzkxflpfirzkfwaunrijatvcoeonplrobhhwncrpwmesedjmalpbdegxxujzrpkwpawoiwxotbjsllivnxwuedddixtfloeumzlkzzndoodthdswqbzncdsodibsrcreyfmmltnudqqopfgdseyywdrqboihycpllwrrkhypvomkvtlmbkamaxsrokidrnwtqmxmojyckcekcbujnoowwogdzfutronjdmfokgzohszqcweqinbeujhoutyvstqrtwukmlfuusmsgysomfpiwpbwfkepwlpzdanqvrszolkgqaiodqkmaxccrelqsiqnhpihgsqhffcaaldbdtqaznodjhwyewymtxnqidgqyaaccshguaiuxhodmtqdguweiragfczbjswasonptbngohsorlovsxuewtwikmdxvoqcvgbnnprydrvtfkfxyapxicbwsiikbplsjwddgujdvzcygffiminzqpqqdvokxhttcoubfjvmqziuepzlszbtcwymekwvpfxoncapvbrjuynswhqqcruydzqgclyggurlimluzwtffffreonryxurejgwhfcwlhjikxgrrheuzczkxglcgadcdvhukkkjbtbdwzwkwuzrepfkkhhgdmrtaxvlvylqppwixxypletibvfhurdeswgtwomdiypyxxpxegdkqtttxpxelufuqunapvabvzybuyveazccmoigyappspgerloqttriuockrhjpmytfpbtuvujjlqfdthlrdhigwzrvespsriaquvlnkuuaqsuitruengctkfmlgpttpmiwacqwjinjrydjewchxkytriecwgygorxxxqmeishjvwuqveelvbycrmghxynalihysmxqzgltcnzuzalkbabmcjforulfhztxjzkproqqtbjoezpxtpvhfufvezpjbcnfodyutexhpbevnlxailzrmblqlpngrtejdccjwysxnrsxpkfvabbklftsjsdkatkyvndljvyonzgtglibuqffvtanvfmzudrvkpqwckwqwbmtbonchmwdxawrethirgtxgryxoxihxyuarcnfykwtjkjrhmxroosdtfboynrbclezkcmdyeovoxrddlyqirlohvpsiwkwhsmreeaotyqkxxsydwzckkenlaejtcjbkkqldtrslvkoookwrlmvfvccbzubfeehfwssdjxapumrccbotlknnzgybjwxbtqsslnvybbiuvunygtlpfpmjfopcdkbsgohndomghdwrdbeevfcknntvjexbzxwzcifahanpnkgxrarwvcqmlswwcqvvhypuvagbogdqditmguwpgvknaouvotkmknuhsnvomzsqirmulmcwgmacmxgtaewfqczedxpzvopzjrhmxrbjfidssfitndrhirwgyjxiqrieqlmcrfkxwlpfjjcwiwhkdiohcljqewbmdgcpwsvremieeecptdgykfryigujituoidyifejwzychfxmxxgbklcatzcxqyqwnlsucwvhxlkhhwtjsdtrsmrxvdzzuqujhstfbziudbxewzfmsunxflquujiocwmxzyafnprgbagpvcphhsukvhybqyvfsjbmutoyopcgbguftlpxnshepmtcekexodvjqvzutvafsftmpnnhthzqzrftupicpkzbvzdknjmoekrultshxxgsygsqfauadbtziulidufksksynbolhhdkqubfbhvpuvxnnmkfqgdfzngwieyqrkctnkztdaxibazlabnbbcjzckjdgvbsdwramvkhtsddtvjdcdvjaitcejbhtqbqdtjlubhvlbgdiznrqxmrsvylobandhcmvqkdixwdkswjglhwpxhwffwgjsbiadkwclivtgyrpoxuotsmzsqubijanjsrygkviplaehwudoiaixxwotasnfnramnlthrzhgvggoocruuitcrwuzmfawhfmqpoxhydaxtfomzxsjlxsriclxtaaakgbbtidqkrpuyelmpfvekukzvbldcnspeihjchsqdaiacciojjxdeuftmstcnqpekqhxutkpwdmytlxrhucnnxubfkazjdttxcssceakcuppgqnbycizytpjrykevqihytphtluiuatnmpbfwcqdlmlwamsefmmtjqvymmjvoaiinkkncsoeqpuhusdqyccjjnuabylfngypqcshgowdcjtgqhhfglwdehtrzilezxqtambjwsjbwbbsdocjmhbfihaosrdulmkzzadeourfenadyuzorjufajozlmlsxxjhyznussivhnnyndybssztaqgaycdmthwemqijepazfjfeebyhwhgzmbxuvrizlxhibspyixtenafnpihkabjmzjxbqcgsqpgzbdlmmirrfexbdmdvdtoqdccriopoprdyhokyciyimxlxkvgezvfjlwjzurmftqhjdxdzkylehyywfgsahmoodypljfptinfkosovogopdeixflwpgmdlpvtzgazreteuqplbfdpzpnvcrvsheizcndblnljbcswcasgwqdhjrgubezkudqvfaufmaxpfrnqrzznvjnutrzmjwaykpvdxzmkodbaadofljpcakszaicpgobldcuvycjzxpktyacwmyqqqfbtddbhmehullqyheivvswpuvyogruvoxyfmixuibovthrsauuqsopnozuhcpyaedviiuevtiyhaofrrnpgetgswtesglmngphtmbeafbrkdpcdqwbqblfobbgwcwgzbsvmxkjzvqpzldowtyxcnnnlydobdxzfftmtrtdgumpxdavnptzfrvcdgtuietbbtbjeatahpuvtwyvwwfcmgvfvojepoqmnnrogrzkpxaryeggglclpysjifbgqwbjyykvovfzciujsnljdrezguzkcixdpsbvgxuknnovwxxyprphxzobmpfpnneginstayfjuqgdlwxuxpexubkbtqeldwktyhojphfukgkjzfdwqbrndpehyrjanbvkykllbwkurhhhnuxmzibdvffyaheyjwgfgcdavojclzwoqsklpysgygcigzanyyvmlgatnllggysjsphgjcepybttkucspbumgantabsoymurhjpagaphikzvobrfvnlczawrsyvelxwxbggsjugwokuflprynywuqvpptkxlkhtzltwbqwujnaqbbjkqfewnfcsrvzjsplxjbljzjrvdkrvspafnicbnnmaxsynkhxwbiscqxlqchcqsftbsgtsxlypyromkttwmnagiqlancbeicyemaosbucgrlxntgmdagfegzfhidcuhdxhhipersqfrwdwgqhsknlthadlhjsxlmtansofeafkntoootfdqbxxjqdyqyikogzozabfueojrcjxmilmmhouhffuzlsjidmtuutnsrligrwxjdgectjiunceghovwsnbfjisuyhthwqiwzpzsxqmlwamdtjtxcnnbjyljnywuaqhzcrvshkcmamjzmewjeumzmpwsfwknvyirrvgpgqlqmtoobvetnrpbdothtbhaqerdpgvulijfsfpcogiskrmjxgqttdemkyodzcercnnqhdfjuiisckvfvblabozgpxggwizhtlieaavtecshbksazoxzfeertratptlblfkiafiajtuyumsxqioajxofeqjqsdqfxgdtwzezzpjzheuxlpoeilzaxyhpfzrdnwmdzupwppnvxvopwbvnpujmaliurrrwmxgnhnuzzxpklxfhpuaivgroqtlinowkyvakftymmuqhrqojarxhrumwkugxcglvmtjygwiyqvvbljvwrfgqigmyxrpiwsumtyxkuuhpoxdafxaxsmybuweeomfkbbmcgmnanovpoxziunrwlbszphuvejzjjvmeuzaheerhulygzirpsxktvuqqvmarkpbbujkklsqhpljanmypfbhlrjzawhurzcsbszsxcoaatlsenubsxaugehacqvgajzfyhmpcsfmjspposvhcqracbpdxvqpvdtgcsylakgcjcwduahbpzwnpbhtqzbufwjomnhemiasilyymncbrejotwxntmelzrjmabdkeijopgdptsqxsufwhgljbgxmkbxfbffwenueofpqgofckjltpcluymuekuscczqmvlwpqgcyflxwveztjymfmobqsylgtutxhnfmttdlvnzuxxoglplbdgykithjpqiqwpjwpvvaisdqalwyawadavykcegtfhgohldyqamsuvjbulzevzavrbykquvogaurelwjnpbepwwobprijsfinkoqgcqnotzxqoqndrkvmyshfadmdadsuctlimgsdhrgqvlvqkofjbijjwwzamwokhgtlpwqihohkmagilpddtaifytmuiduuqlafhvnjgtsmygmyzddacwqtrdmbevuqzjagvzfpnjknirkculozjnaeujqprbkerajxfbpoomyelhvieafkfsvlakojpvayuivgtwqjfygwminiwksyhqgarvwpezsmovvrpysiipjccgnkuwntxwifvzkaukpfytcglpmteficfvgnpapjpjolvhrhrdcwipibsaolkzduueukmbhaxjozhilwygyiuldshtzltxzaznkbbxyavdzppkyhvubahpudkkesnzrlpfvluafoaazgncoilqoudjmuspsjsurzdxffuzgxidfblrjzoejyhnwolazyytuivjutxzphrqsaetgapdivmvponoyvlksmbccalwxrsahwymcnfpcyqpuybctfbvtexjqbrmrdzaajhbwvbdvwzvctovoagstuphhubajiorzibbcwmligzczxqpcketqtghyjcaqpgnoknfaktlqaeuwgbldlnikkzkiqmyjevmdsfiubdzkexuyamjnlgexzuypezjuezqnzwqwjlpmhfkxrgqeszxjedjwyivtbmmrnpjgsfvvtfpnkuqrrlaqyiiztbsssewqsdxzysismipbuawtdvorowzluoudtticwanzjlkaidbpmmginpdkqpiwlnwkykmuvixldkakowerxalovvskydeoyxokgqixzxyoepnnfbikfhncxkgjjlouwfzxtfarnxwcbhmtjebankpzdchzzgbmiipelsvpfobcduxhtvuesbwykmmxxuioaybmzpkgfyyerqliicnkqhthxnavowptvrelidrolhjxdibtikbhdmqrlkaekbvfcrwtnnhxwoxkukbphkdlxnwvhgqvogdrongtpinpwawamztvflwetuytcwtbffwjqqrjigcawmfzhmwyqoelojuqnrwupsnvajlfeipkozmoblfmwfvfwjxseeiebriypcuijauhduxddlniksevxuppjsvfwfrvniavebjbfwozeyhsldzttpxsqxjwxzhwrsemfmzejnyzshbeobdhrgtclsf\",c4=\"wthvqxcsrlps\" 1626006833639000000" - }; + char tmp[16375] = {0}; + memset(tmp, 'a', 16374); + char sql[102400] = {0}; + sprintf(sql,"lujixfvqor,t0=t c0=f,c1=\"%s\",c2=\"%s\",c3=\"%s\",c4=\"wthvqxcsrlps\" 1626006833639000000", tmp, tmp, tmp); pRes = taos_query(taos, "use line_23881"); taos_free_result(pRes); - pRes = taos_schemaless_insert(taos, (char **)sql, sizeof(sql) / sizeof(sql[0]), TSDB_SML_LINE_PROTOCOL, - TSDB_SML_TIMESTAMP_NANO_SECONDS); + int totalRows = 0; + pRes = taos_schemaless_insert_raw(taos, sql, strlen(sql), &totalRows, TSDB_SML_LINE_PROTOCOL, + TSDB_SML_TIMESTAMP_NANO_SECONDS); printf("%s result:%s\n", __FUNCTION__, taos_errstr(pRes)); int code = taos_errno(pRes); From 4e07f5460b731e1fdcf7f55bd35224f163118f4f Mon Sep 17 00:00:00 2001 From: xiaolei li <85657333+xleili@users.noreply.github.com> Date: Thu, 27 Apr 2023 09:51:16 +0800 Subject: [PATCH 45/46] enhance: relase enterpise pull jdbc from tag 3.1.0 (#21102) --- packaging/tools/makepkg.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/tools/makepkg.sh b/packaging/tools/makepkg.sh index a590835257..3da005c405 100755 --- a/packaging/tools/makepkg.sh +++ b/packaging/tools/makepkg.sh @@ -341,7 +341,7 @@ if [ "$verMode" == "cluster" ] || [ "$verMode" == "cloud" ]; then tmp_pwd=`pwd` cd ${install_dir}/connector if [ ! -d taos-connector-jdbc ];then - git clone -b main --depth=1 https://github.com/taosdata/taos-connector-jdbc.git ||: + git clone -b 3.1.0 --depth=1 https://github.com/taosdata/taos-connector-jdbc.git ||: fi cd taos-connector-jdbc mvn clean package -Dmaven.test.skip=true From 6052855ef55b754bd5e0401199edcbc3ca4582c0 Mon Sep 17 00:00:00 2001 From: xiaolei li <85657333+xleili@users.noreply.github.com> Date: Thu, 27 Apr 2023 17:19:32 +0800 Subject: [PATCH 46/46] release: upgrade default version to 3.0.4.1 (#21110) --- cmake/cmake.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/cmake.version b/cmake/cmake.version index 232e86d891..3166a0695c 100644 --- a/cmake/cmake.version +++ b/cmake/cmake.version @@ -2,7 +2,7 @@ IF (DEFINED VERNUMBER) SET(TD_VER_NUMBER ${VERNUMBER}) ELSE () - SET(TD_VER_NUMBER "3.0.4.0") + SET(TD_VER_NUMBER "3.0.4.1") ENDIF () IF (DEFINED VERCOMPATIBLE)