Merge pull request #29097 from taosdata/fix/TS-5760/minusOperatorResType
fix: minus operator resType
This commit is contained in:
commit
44eaab3807
|
@ -236,6 +236,7 @@ typedef struct SFltBuildGroupCtx {
|
|||
SFilterInfo *info;
|
||||
SArray *group;
|
||||
int32_t code;
|
||||
bool ignore;
|
||||
} SFltBuildGroupCtx;
|
||||
|
||||
typedef struct {
|
||||
|
@ -266,6 +267,7 @@ struct SFilterInfo {
|
|||
int8_t *blkUnitRes;
|
||||
void *pTable;
|
||||
SArray *blkList;
|
||||
bool isStrict;
|
||||
|
||||
SFilterPCtx pctx;
|
||||
};
|
||||
|
|
|
@ -21,6 +21,8 @@ extern "C" {
|
|||
#include "query.h"
|
||||
#include "tcommon.h"
|
||||
#include "thash.h"
|
||||
#include "querynodes.h"
|
||||
#include "function.h"
|
||||
|
||||
typedef struct SOperatorValueType {
|
||||
int32_t opResType;
|
||||
|
@ -147,6 +149,8 @@ int32_t vectorCompareImpl(SScalarParam* pLeft, SScalarParam* pRight, SScalarPara
|
|||
int32_t _ord, int32_t optr);
|
||||
int32_t vectorCompare(SScalarParam* pLeft, SScalarParam* pRight, SScalarParam *pOut, int32_t _ord, int32_t optr);
|
||||
|
||||
bool checkOperatorRestypeIsTimestamp(EOperatorType opType, int32_t ldt, int32_t rdt);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include <tlog.h>
|
||||
#include "nodes.h"
|
||||
#include "os.h"
|
||||
#include "tglobal.h"
|
||||
#include "thash.h"
|
||||
|
@ -1284,7 +1285,8 @@ static void filterFreeGroup(void *pItem) {
|
|||
taosMemoryFreeClear(p->unitFlags);
|
||||
}
|
||||
|
||||
int32_t fltAddGroupUnitFromNode(SFilterInfo *info, SNode *tree, SArray *group) {
|
||||
int32_t fltAddGroupUnitFromNode(void *pContext, SFilterInfo *info, SNode *tree, SArray *group) {
|
||||
SFltBuildGroupCtx *ctx = (SFltBuildGroupCtx *)pContext;
|
||||
SOperatorNode *node = (SOperatorNode *)tree;
|
||||
int32_t ret = TSDB_CODE_SUCCESS;
|
||||
SFilterFieldId left = {0}, right = {0};
|
||||
|
@ -1305,6 +1307,7 @@ int32_t fltAddGroupUnitFromNode(SFilterInfo *info, SNode *tree, SArray *group) {
|
|||
out.columnData->info.type = type;
|
||||
out.columnData->info.bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes; // reserved space for simple_copy
|
||||
|
||||
int32_t overflowCount = 0;
|
||||
for (int32_t i = 0; i < listNode->pNodeList->length; ++i) {
|
||||
SValueNode *valueNode = (SValueNode *)cell->pNode;
|
||||
if (valueNode->node.resType.type != type) {
|
||||
|
@ -1317,6 +1320,7 @@ int32_t fltAddGroupUnitFromNode(SFilterInfo *info, SNode *tree, SArray *group) {
|
|||
|
||||
if (overflow) {
|
||||
cell = cell->pNext;
|
||||
++overflowCount;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -1357,6 +1361,9 @@ int32_t fltAddGroupUnitFromNode(SFilterInfo *info, SNode *tree, SArray *group) {
|
|||
|
||||
cell = cell->pNext;
|
||||
}
|
||||
if(overflowCount == listNode->pNodeList->length) {
|
||||
ctx->ignore = true;
|
||||
}
|
||||
colDataDestroy(out.columnData);
|
||||
taosMemoryFree(out.columnData);
|
||||
FLT_ERR_RET(code);
|
||||
|
@ -1692,10 +1699,17 @@ EDealRes fltTreeToGroup(SNode *pNode, void *pContext) {
|
|||
FLT_ERR_RET(terrno);
|
||||
}
|
||||
|
||||
SFltBuildGroupCtx tctx = {.info = ctx->info, .group = newGroup};
|
||||
SFltBuildGroupCtx tctx = {.info = ctx->info, .group = newGroup, .ignore = false};
|
||||
nodesWalkExpr(cell->pNode, fltTreeToGroup, (void *)&tctx);
|
||||
FLT_ERR_JRET(tctx.code);
|
||||
|
||||
if(tctx.ignore) {
|
||||
ctx->ignore = true;
|
||||
taosArrayDestroyEx(newGroup, filterFreeGroup);
|
||||
newGroup = NULL;
|
||||
taosArrayDestroyEx(resGroup, filterFreeGroup);
|
||||
resGroup = NULL;
|
||||
break;
|
||||
}
|
||||
FLT_ERR_JRET(filterDetachCnfGroups(resGroup, preGroup, newGroup));
|
||||
|
||||
taosArrayDestroyEx(newGroup, filterFreeGroup);
|
||||
|
@ -1707,9 +1721,10 @@ EDealRes fltTreeToGroup(SNode *pNode, void *pContext) {
|
|||
|
||||
cell = cell->pNext;
|
||||
}
|
||||
|
||||
if (NULL == taosArrayAddAll(ctx->group, preGroup)) {
|
||||
FLT_ERR_JRET(terrno);
|
||||
if (!ctx->ignore) {
|
||||
if (NULL == taosArrayAddAll(ctx->group, preGroup)) {
|
||||
FLT_ERR_JRET(terrno);
|
||||
}
|
||||
}
|
||||
|
||||
taosArrayDestroy(preGroup);
|
||||
|
@ -1721,6 +1736,9 @@ EDealRes fltTreeToGroup(SNode *pNode, void *pContext) {
|
|||
SListCell *cell = node->pParameterList->pHead;
|
||||
for (int32_t i = 0; i < node->pParameterList->length; ++i) {
|
||||
nodesWalkExpr(cell->pNode, fltTreeToGroup, (void *)pContext);
|
||||
if(ctx->ignore) {
|
||||
ctx->ignore = false;
|
||||
}
|
||||
FLT_ERR_JRET(ctx->code);
|
||||
|
||||
cell = cell->pNext;
|
||||
|
@ -1735,7 +1753,7 @@ EDealRes fltTreeToGroup(SNode *pNode, void *pContext) {
|
|||
}
|
||||
|
||||
if (QUERY_NODE_OPERATOR == nType) {
|
||||
FLT_ERR_JRET(fltAddGroupUnitFromNode(ctx->info, pNode, ctx->group));
|
||||
FLT_ERR_JRET(fltAddGroupUnitFromNode(ctx, ctx->info, pNode, ctx->group));
|
||||
|
||||
return DEAL_RES_IGNORE_CHILD;
|
||||
}
|
||||
|
@ -3831,13 +3849,21 @@ int32_t fltInitFromNode(SNode *tree, SFilterInfo *info, uint32_t options) {
|
|||
goto _return;
|
||||
}
|
||||
|
||||
SFltBuildGroupCtx tctx = {.info = info, .group = group};
|
||||
SFltBuildGroupCtx tctx = {.info = info, .group = group, .ignore = false};
|
||||
nodesWalkExpr(tree, fltTreeToGroup, (void *)&tctx);
|
||||
if (TSDB_CODE_SUCCESS != tctx.code) {
|
||||
taosArrayDestroyEx(group, filterFreeGroup);
|
||||
code = tctx.code;
|
||||
goto _return;
|
||||
}
|
||||
if (tctx.ignore) {
|
||||
FILTER_SET_FLAG(info->status, FI_STATUS_EMPTY);
|
||||
}
|
||||
if (FILTER_EMPTY_RES(info)) {
|
||||
info->func = filterExecuteImplEmpty;
|
||||
taosArrayDestroyEx(group, filterFreeGroup);
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
code = filterConvertGroupFromArray(info, group);
|
||||
if (TSDB_CODE_SUCCESS != code) {
|
||||
taosArrayDestroyEx(group, filterFreeGroup);
|
||||
|
@ -3871,7 +3897,7 @@ int32_t fltInitFromNode(SNode *tree, SFilterInfo *info, uint32_t options) {
|
|||
|
||||
_return:
|
||||
if (code) {
|
||||
qInfo("init from node failed, code:%d", code);
|
||||
qInfo("init from node failed, code:%d, %s", code, tstrerror(code));
|
||||
}
|
||||
return code;
|
||||
}
|
||||
|
@ -4561,8 +4587,7 @@ int32_t filterGetTimeRange(SNode *pNode, STimeWindow *win, bool *isStrict) {
|
|||
FLT_ERR_JRET(fltSclGetTimeStampDatum(endPt, &end));
|
||||
win->skey = start.i;
|
||||
win->ekey = end.i;
|
||||
if(optNode->opType == OP_TYPE_IN) *isStrict = false;
|
||||
else *isStrict = true;
|
||||
*isStrict = info->isStrict;
|
||||
goto _return;
|
||||
} else if (taosArrayGetSize(points) == 0) {
|
||||
*win = TSWINDOW_DESC_INITIALIZER;
|
||||
|
@ -5026,7 +5051,8 @@ int32_t fltSclBuildRangePoints(SFltSclOperator *oper, SArray *points) {
|
|||
}
|
||||
|
||||
// TODO: process DNF composed of CNF
|
||||
int32_t fltSclProcessCNF(SArray *sclOpListCNF, SArray *colRangeList) {
|
||||
static int32_t fltSclProcessCNF(SFilterInfo *pInfo, SArray *sclOpListCNF, SArray *colRangeList) {
|
||||
pInfo->isStrict = true;
|
||||
size_t sz = taosArrayGetSize(sclOpListCNF);
|
||||
for (int32_t i = 0; i < sz; ++i) {
|
||||
SFltSclOperator *sclOper = taosArrayGet(sclOpListCNF, i);
|
||||
|
@ -5049,10 +5075,16 @@ int32_t fltSclProcessCNF(SArray *sclOpListCNF, SArray *colRangeList) {
|
|||
taosArrayDestroy(colRange->points);
|
||||
taosArrayDestroy(points);
|
||||
colRange->points = merged;
|
||||
if(merged->size == 0) {
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
} else {
|
||||
taosArrayDestroy(colRange->points);
|
||||
colRange->points = points;
|
||||
}
|
||||
if (sclOper->type == OP_TYPE_IN) {
|
||||
pInfo->isStrict = false;
|
||||
}
|
||||
}
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
@ -5154,7 +5186,7 @@ int32_t fltOptimizeNodes(SFilterInfo *pInfo, SNode **pNode, SFltTreeStat *pStat)
|
|||
if (NULL == colRangeList) {
|
||||
FLT_ERR_JRET(terrno);
|
||||
}
|
||||
FLT_ERR_JRET(fltSclProcessCNF(sclOpList, colRangeList));
|
||||
FLT_ERR_JRET(fltSclProcessCNF(pInfo, sclOpList, colRangeList));
|
||||
pInfo->sclCtx.fltSclRange = colRangeList;
|
||||
|
||||
for (int32_t i = 0; i < taosArrayGetSize(sclOpList); ++i) {
|
||||
|
|
|
@ -1695,15 +1695,12 @@ static int32_t sclGetMathOperatorResType(SOperatorNode *pOp) {
|
|||
|
||||
if ((TSDB_DATA_TYPE_TIMESTAMP == ldt.type && TSDB_DATA_TYPE_TIMESTAMP == rdt.type) ||
|
||||
TSDB_DATA_TYPE_VARBINARY == ldt.type || TSDB_DATA_TYPE_VARBINARY == rdt.type ||
|
||||
(TSDB_DATA_TYPE_TIMESTAMP == ldt.type && (IS_VAR_DATA_TYPE(rdt.type) || IS_FLOAT_TYPE(rdt.type))) ||
|
||||
(TSDB_DATA_TYPE_TIMESTAMP == rdt.type && (IS_VAR_DATA_TYPE(ldt.type) || IS_FLOAT_TYPE(ldt.type)))) {
|
||||
(TSDB_DATA_TYPE_TIMESTAMP == ldt.type && (IS_VAR_DATA_TYPE(rdt.type))) ||
|
||||
(TSDB_DATA_TYPE_TIMESTAMP == rdt.type && (IS_VAR_DATA_TYPE(ldt.type)))) {
|
||||
return TSDB_CODE_TSC_INVALID_OPERATION;
|
||||
}
|
||||
|
||||
if ((TSDB_DATA_TYPE_TIMESTAMP == ldt.type && IS_INTEGER_TYPE(rdt.type)) ||
|
||||
(TSDB_DATA_TYPE_TIMESTAMP == rdt.type && IS_INTEGER_TYPE(ldt.type)) ||
|
||||
(TSDB_DATA_TYPE_TIMESTAMP == ldt.type && TSDB_DATA_TYPE_BOOL == rdt.type) ||
|
||||
(TSDB_DATA_TYPE_TIMESTAMP == rdt.type && TSDB_DATA_TYPE_BOOL == ldt.type)) {
|
||||
if (checkOperatorRestypeIsTimestamp(pOp->opType, ldt.type, rdt.type)) {
|
||||
pOp->node.resType.type = TSDB_DATA_TYPE_TIMESTAMP;
|
||||
pOp->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_TIMESTAMP].bytes;
|
||||
} else {
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include "tcompare.h"
|
||||
#include "tdatablock.h"
|
||||
#include "tdataformat.h"
|
||||
#include "tdef.h"
|
||||
#include "ttime.h"
|
||||
#include "ttypes.h"
|
||||
#include "geosWrapper.h"
|
||||
|
@ -1262,12 +1263,7 @@ int32_t vectorMathAdd(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *p
|
|||
SColumnInfoData *pRightCol = NULL;
|
||||
SCL_ERR_JRET(vectorConvertVarToDouble(pLeft, &leftConvert, &pLeftCol));
|
||||
SCL_ERR_JRET(vectorConvertVarToDouble(pRight, &rightConvert, &pRightCol));
|
||||
|
||||
if ((GET_PARAM_TYPE(pLeft) == TSDB_DATA_TYPE_TIMESTAMP && IS_INTEGER_TYPE(GET_PARAM_TYPE(pRight))) ||
|
||||
(GET_PARAM_TYPE(pRight) == TSDB_DATA_TYPE_TIMESTAMP && IS_INTEGER_TYPE(GET_PARAM_TYPE(pLeft))) ||
|
||||
(GET_PARAM_TYPE(pLeft) == TSDB_DATA_TYPE_TIMESTAMP && GET_PARAM_TYPE(pRight) == TSDB_DATA_TYPE_BOOL) ||
|
||||
(GET_PARAM_TYPE(pRight) == TSDB_DATA_TYPE_TIMESTAMP &&
|
||||
GET_PARAM_TYPE(pLeft) == TSDB_DATA_TYPE_BOOL)) { // timestamp plus duration
|
||||
if(checkOperatorRestypeIsTimestamp(OP_TYPE_ADD, GET_PARAM_TYPE(pLeft), GET_PARAM_TYPE(pRight))) { // timestamp plus duration
|
||||
int64_t *output = (int64_t *)pOutputCol->pData;
|
||||
_getBigintValue_fn_t getVectorBigintValueFnLeft;
|
||||
_getBigintValue_fn_t getVectorBigintValueFnRight;
|
||||
|
@ -1399,9 +1395,7 @@ int32_t vectorMathSub(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *p
|
|||
SCL_ERR_JRET(vectorConvertVarToDouble(pLeft, &leftConvert, &pLeftCol));
|
||||
SCL_ERR_JRET(vectorConvertVarToDouble(pRight, &rightConvert, &pRightCol));
|
||||
|
||||
if ((GET_PARAM_TYPE(pLeft) == TSDB_DATA_TYPE_TIMESTAMP && GET_PARAM_TYPE(pRight) == TSDB_DATA_TYPE_BIGINT) ||
|
||||
(GET_PARAM_TYPE(pRight) == TSDB_DATA_TYPE_TIMESTAMP &&
|
||||
GET_PARAM_TYPE(pLeft) == TSDB_DATA_TYPE_BIGINT)) { // timestamp minus duration
|
||||
if (checkOperatorRestypeIsTimestamp(OP_TYPE_SUB, GET_PARAM_TYPE(pLeft), GET_PARAM_TYPE(pRight))) { // timestamp minus duration
|
||||
int64_t *output = (int64_t *)pOutputCol->pData;
|
||||
_getBigintValue_fn_t getVectorBigintValueFnLeft;
|
||||
_getBigintValue_fn_t getVectorBigintValueFnRight;
|
||||
|
@ -2306,3 +2300,16 @@ _bin_scalar_fn_t getBinScalarOperatorFn(int32_t binFunctionId) {
|
|||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
bool checkOperatorRestypeIsTimestamp(EOperatorType opType, int32_t lType, int32_t rType) {
|
||||
if (opType != OP_TYPE_ADD && opType != OP_TYPE_SUB && opType != OP_TYPE_MINUS) {
|
||||
return false;
|
||||
}
|
||||
if ((TSDB_DATA_TYPE_TIMESTAMP == lType && IS_INTEGER_TYPE(rType) && rType != TSDB_DATA_TYPE_UBIGINT) ||
|
||||
(TSDB_DATA_TYPE_TIMESTAMP == rType && IS_INTEGER_TYPE(lType) && lType != TSDB_DATA_TYPE_UBIGINT) ||
|
||||
(TSDB_DATA_TYPE_TIMESTAMP == lType && TSDB_DATA_TYPE_BOOL == rType) ||
|
||||
(TSDB_DATA_TYPE_TIMESTAMP == rType && TSDB_DATA_TYPE_BOOL == lType)) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -1089,6 +1089,10 @@
|
|||
,,n,system-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/insertMix.py -N 3
|
||||
,,n,system-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/stt.py -N 3
|
||||
,,n,system-test,python3 ./test.py -f eco-system/meta/database/keep_time_offset.py
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/operator.py
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/operator.py -Q 2
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/operator.py -Q 3
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/operator.py -Q 4
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f eco-system/manager/schema_change.py -N 3 -M 3
|
||||
|
||||
#tsim test
|
||||
|
|
|
@ -41,8 +41,9 @@ class TDTestCase:
|
|||
]
|
||||
self.time_unit = ['b','u','a','s','m','h','d','w']
|
||||
self.symbol = ['+','-','*','/']
|
||||
self.error_values = [1.5,'abc','"abc"','!@','today()']
|
||||
self.error_values = ['abc','"abc"','!@','today()']
|
||||
self.db_percision = ['ms','us','ns']
|
||||
self.test_values = [1.5, 10]
|
||||
def tbtype_check(self,tb_type):
|
||||
if tb_type == 'normal table' or tb_type == 'child table':
|
||||
tdSql.checkRows(len(self.values_list))
|
||||
|
@ -71,6 +72,9 @@ class TDTestCase:
|
|||
self.tbtype_check(tb_type)
|
||||
for i in range(len(self.values_list)):
|
||||
tdSql.checkData(i,0,None)
|
||||
for param in self.test_values:
|
||||
tdSql.query(f'select now() {symbol}{param} from {tbname}')
|
||||
tdSql.query(f'select 1 {symbol}{param} from {tbname}')
|
||||
|
||||
def now_check_ntb(self):
|
||||
for time_unit in self.db_percision:
|
||||
|
|
|
@ -18,7 +18,7 @@ class TDTestCase:
|
|||
self.today_ts = datetime.datetime.strptime(datetime.datetime.now().strftime("%Y-%m-%d"), "%Y-%m-%d").timestamp()
|
||||
self.today_ts_ns = 0
|
||||
self.time_unit = ['b','u','a','s','m','h','d','w']
|
||||
self.error_param = ['1.5','abc','!@#','"abc"','today()']
|
||||
self.error_param = ['abc','!@#','"abc"','today()']
|
||||
self.arithmetic_operators = ['+','-','*','/']
|
||||
self.relational_operator = ['<','<=','=','>=','>']
|
||||
# prepare data
|
||||
|
|
|
@ -0,0 +1,347 @@
|
|||
from wsgiref.headers import tspecials
|
||||
from util.log import *
|
||||
from util.cases import *
|
||||
from util.sql import *
|
||||
from util.common import tdCom
|
||||
import numpy as np
|
||||
|
||||
|
||||
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.dbname = "db"
|
||||
self.rowNum = 10
|
||||
self.ts = 1537146000000
|
||||
|
||||
# test in/not in contidion with invalid value
|
||||
def ts5757(self):
|
||||
|
||||
tdSql.execute(f"create database if not exists {self.dbname}")
|
||||
|
||||
tdSql.execute(f"DROP STABLE IF EXISTS {self.dbname}.super_t1;")
|
||||
tdSql.execute(f"DROP TABLE IF EXISTS {self.dbname}.t1;")
|
||||
tdSql.execute(f"CREATE STABLE IF NOT EXISTS {self.dbname}.super_t1(time TIMESTAMP, c0 BIGINT UNSIGNED) TAGS (location BINARY(64))")
|
||||
tdSql.execute(f"CREATE TABLE {self.dbname}.t1 USING {self.dbname}.super_t1 TAGS ('ek')")
|
||||
tdSql.execute(f"INSERT INTO {self.dbname}.t1(time, c0) VALUES (1641024000000, 1);")
|
||||
tdSql.execute(f"INSERT INTO {self.dbname}.t1(time, c0) VALUES (1641024005000, 2);")
|
||||
tdSql.execute(f"INSERT INTO {self.dbname}.t1(time, c0) VALUES (1641024010000, NULL);")
|
||||
|
||||
tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NOT NULL AND c0 IN (-1);")
|
||||
tdSql.checkRows(0)
|
||||
tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NULL AND c0 IN (-1);")
|
||||
tdSql.checkRows(0)
|
||||
tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NOT NULL AND c0 IN (-1, 1);")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NULL AND c0 IN (2, -1, 1);")
|
||||
tdSql.checkRows(0)
|
||||
tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NOT NULL AND c0 NOT IN (-1);")
|
||||
tdSql.checkRows(2)
|
||||
tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NULL AND c0 NOT IN (-1);")
|
||||
tdSql.checkRows(0)
|
||||
tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NULL AND c0 NOT IN (3);")
|
||||
tdSql.checkRows(0)
|
||||
tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NOT NULL AND c0 NOT IN (-1, 1);")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NULL AND c0 NOT IN (2, -1, 1);")
|
||||
tdSql.checkRows(0)
|
||||
tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE (c0 IS NULL AND c0 IN (-1)) or c0 in(1)")
|
||||
tdSql.checkRows(1)
|
||||
|
||||
tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NOT NULL OR c0 IN (-1);")
|
||||
tdSql.checkRows(2)
|
||||
tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NULL OR c0 IN (-1);")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NOT NULL OR c0 IN (-1, 1);")
|
||||
tdSql.checkRows(2)
|
||||
tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NULL OR c0 IN (2, -1, 1);")
|
||||
tdSql.checkRows(3)
|
||||
tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NOT NULL OR c0 NOT IN (-1);")
|
||||
tdSql.checkRows(2)
|
||||
tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NULL OR c0 NOT IN (-1);")
|
||||
tdSql.checkRows(3)
|
||||
tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NULL OR c0 NOT IN (3);")
|
||||
tdSql.checkRows(3)
|
||||
tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NOT NULL OR c0 NOT IN (-1, 1);")
|
||||
tdSql.checkRows(2)
|
||||
tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NOT NULL OR c0 NOT IN (-1);")
|
||||
tdSql.checkRows(2)
|
||||
tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NULL OR c0 NOT IN (2, -1, 1);")
|
||||
tdSql.checkRows(1)
|
||||
|
||||
tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE ((c0 is NULL) AND (c0 in (-1)) )")
|
||||
tdSql.checkRows(0)
|
||||
tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE ((c0 in (-1)) AND (c0 is NULL) )")
|
||||
tdSql.checkRows(0)
|
||||
tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE ((c0 in (-1)) AND (c0 is NULL) ) OR c0 in(1)")
|
||||
tdSql.checkRows(1)
|
||||
|
||||
tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IN (-1);")
|
||||
tdSql.checkRows(0)
|
||||
tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IS NOT NULL;")
|
||||
tdSql.checkRows(2)
|
||||
tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IN (-1) or c0 in(1);")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IN (1) or c0 in(-1);")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IN (-1) or c0 in(-1);")
|
||||
tdSql.checkRows(0)
|
||||
tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IN (-1) and c0 in(1);")
|
||||
tdSql.checkRows(0)
|
||||
tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IN (1) and c0 in(-1);")
|
||||
tdSql.checkRows(0)
|
||||
tdSql.query(f"SELECT * FROM {self.dbname}.t1 WHERE c0 IN (-1) and c0 in(-1);")
|
||||
tdSql.checkRows(0)
|
||||
|
||||
def ts5760(self):
|
||||
tdSql.execute(f"create database if not exists {self.dbname}")
|
||||
|
||||
tdSql.execute(f"DROP TABLE IF EXISTS {self.dbname}.t1;")
|
||||
tdSql.execute(f"CREATE TABLE {self.dbname}.t1( time TIMESTAMP, c0 INT);")
|
||||
tdSql.execute(f"INSERT INTO {self.dbname}.t1(time, c0) VALUES (1641024000000, 1);")
|
||||
|
||||
tdSql.query(f"SELECT time, c0 FROM {self.dbname}.t1 WHERE (time - c0) > 0;")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.query(f"SELECT time, c0 FROM {self.dbname}.t1 WHERE (time + c0) > 0;")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.query(f"SELECT time, c0 FROM {self.dbname}.t1 WHERE (-(- c0)) > 0;")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.query(f"SELECT time, c0 FROM {self.dbname}.t1 WHERE -(- c0) > 0;")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.query(f"SELECT time, c0 FROM {self.dbname}.t1 WHERE -(- c0) < 0;")
|
||||
tdSql.checkRows(0)
|
||||
|
||||
tdSql.query(f"SELECT time, c0 FROM {self.dbname}.t1 WHERE -(- c0) = 0;")
|
||||
tdSql.checkRows(0)
|
||||
|
||||
tdSql.query(f"SELECT time, c0 FROM {self.dbname}.t1 WHERE (- c0) > 0;")
|
||||
tdSql.checkRows(0)
|
||||
tdSql.query(f"SELECT time, c0 FROM {self.dbname}.t1 WHERE (- c0) < 0;")
|
||||
tdSql.checkRows(1)
|
||||
|
||||
tdSql.query(f"SELECT time, c0 FROM {self.dbname}.t1 WHERE (time + (- c0)) > 0;")
|
||||
tdSql.checkRows(1)
|
||||
|
||||
tdSql.query(f"SELECT time, c0 FROM {self.dbname}.t1 WHERE (time + (- c0)) > 0;")
|
||||
tdSql.checkRows(1)
|
||||
|
||||
tdSql.query(f"SELECT time, c0 FROM {self.dbname}.t1 WHERE (time - (- (- c0)) ) > 0;")
|
||||
tdSql.checkRows(1)
|
||||
|
||||
tdSql.query(f"SELECT time, c0 FROM {self.dbname}.t1 WHERE (time + (-(- c0))) > 0;")
|
||||
tdSql.checkRows(1)
|
||||
|
||||
def ts5758(self):
|
||||
tdSql.execute(f"create database if not exists {self.dbname}")
|
||||
|
||||
tdSql.execute(f"DROP TABLE IF EXISTS {self.dbname}.t1;")
|
||||
tdSql.execute(f"CREATE TABLE {self.dbname}.t1( time TIMESTAMP, c1 BIGINT);")
|
||||
tdSql.execute(f"INSERT INTO {self.dbname}.t1(time, c1) VALUES (1641024000000, 0);")
|
||||
tdSql.execute(f"INSERT INTO {self.dbname}.t1(time, c1) VALUES (1641024000001, 1);")
|
||||
tdSql.execute(f"INSERT INTO {self.dbname}.t1(time, c1) VALUES (1641024000002, 2);")
|
||||
tdSql.execute(f"INSERT INTO {self.dbname}.t1(time, c1) VALUES (1641024000003, 3);")
|
||||
tdSql.execute(f"INSERT INTO {self.dbname}.t1(time, c1) VALUES (1641024000004, 4);")
|
||||
tdSql.execute(f"INSERT INTO {self.dbname}.t1(time, c1) VALUES (1641024000005, 5);")
|
||||
|
||||
tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE time IN (1) AND time BETWEEN (1741024000000) AND (1741024000000);")
|
||||
tdSql.checkRows(0)
|
||||
tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE time BETWEEN (1741024000000) AND (1741024000000) AND time IN (1);")
|
||||
tdSql.checkRows(0)
|
||||
tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE time IN (1) and time BETWEEN (1741024000000) AND (1741024000000) AND time IN (1);")
|
||||
tdSql.checkRows(0)
|
||||
tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE time IN (1641024000000) and time BETWEEN (1741024000000) AND (1741024000000) AND time IN (1);")
|
||||
tdSql.checkRows(0)
|
||||
tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE time IN (1) AND time BETWEEN (1641024000000) AND (1741024000000);")
|
||||
tdSql.checkRows(0)
|
||||
tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE time IN (1641024000001) AND time BETWEEN (1641024000000) AND (1741024000000);")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE time IN (1641024000001, 1641024000002, 1641024000003) AND time BETWEEN (1641024000000) AND (1741024000000);")
|
||||
tdSql.checkRows(3)
|
||||
tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE time IN (1641024000001, 1641024000002, 1641024000005) AND time BETWEEN (1641024000000) AND (1641024000004);")
|
||||
tdSql.checkRows(2)
|
||||
|
||||
tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE time IN (1) OR time = 1741024000000;")
|
||||
tdSql.checkRows(0)
|
||||
tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE time = 1741024000000 OR time IN (1);")
|
||||
tdSql.checkRows(0)
|
||||
tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE time IN (1, 2, 3) OR time BETWEEN (1641024000000) and (1741024000000);")
|
||||
tdSql.checkRows(6)
|
||||
tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE time IN (1, 2, 3) OR time = 1641024000000;")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE time = 1641024000001 OR time BETWEEN (1641024000000) and (1641024000002);")
|
||||
tdSql.checkRows(3)
|
||||
tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE time = 1641024000004 OR time BETWEEN (1641024000000) and (1641024000002);")
|
||||
tdSql.checkRows(4)
|
||||
tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE time = 1641024000001 OR time = 1741024000000;")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE time IN (1641024000001, 1641024000002) OR time = 1741024000000;")
|
||||
tdSql.checkRows(2)
|
||||
tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE time IN (1641024000001, 1641024000002) OR time BETWEEN (1641024000000) and (1741024000000);")
|
||||
tdSql.checkRows(6)
|
||||
tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE (time = 1641024000004 OR time BETWEEN (1641024000000) and (1641024000002)) and time in(1);")
|
||||
tdSql.checkRows(0)
|
||||
tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE (time = 1641024000004 OR time BETWEEN (1641024000000) and (1641024000002)) and time in(1641024000004, 1641024000002);")
|
||||
tdSql.checkRows(2)
|
||||
tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE (time = 1641024000004 OR time BETWEEN (1641024000000) and (1641024000002)) or time in(1);")
|
||||
tdSql.checkRows(4)
|
||||
|
||||
|
||||
def ts5759(self):
|
||||
tdSql.execute(f"create database if not exists {self.dbname}")
|
||||
|
||||
tdSql.execute(f"DROP TABLE IF EXISTS {self.dbname}.t1;")
|
||||
tdSql.execute(f"CREATE TABLE {self.dbname}.t1( time TIMESTAMP, c1 BIGINT);")
|
||||
tdSql.execute(f"INSERT INTO {self.dbname}.t1(time, c1) VALUES (1641024000000, 0);")
|
||||
|
||||
tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE (time BETWEEN 1641024000000 AND 1641024000001)")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE (time BETWEEN 1641024000000 AND 1641024000001) OR (1 < 2)")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE (time BETWEEN 1641024000000 AND 1641024000001) OR (3 < 2)")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE (time BETWEEN 1641024000000 AND 1641024000001) and (1 < 2)")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE (time BETWEEN 1641024000000 AND 1641024000001) OR (1 > 2)")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE (time BETWEEN 1641024000000 AND 1641024000001) and (1 > 2)")
|
||||
tdSql.checkRows(0)
|
||||
|
||||
tdSql.execute(f"INSERT INTO {self.dbname}.t1(time, c1) VALUES (1641024000001, 1);")
|
||||
tdSql.execute(f"INSERT INTO {self.dbname}.t1(time, c1) VALUES (1641024000002, 2);")
|
||||
|
||||
tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE (time BETWEEN 1641024000000 AND 1641024000001) OR (1 < 2)")
|
||||
tdSql.checkRows(3)
|
||||
tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE (time BETWEEN 1641024000000 AND 1641024000001) OR (1 > 2)")
|
||||
tdSql.checkRows(2)
|
||||
tdSql.query(f"SELECT c1 FROM {self.dbname}.t1 WHERE (time BETWEEN 1641024000000 AND 1641024000001) and (1 < 2)")
|
||||
tdSql.checkRows(2)
|
||||
|
||||
def operOnTime(self):
|
||||
tdSql.execute(f"create database if not exists {self.dbname}")
|
||||
|
||||
tdSql.execute(f"DROP TABLE IF EXISTS {self.dbname}.t1;")
|
||||
tdSql.execute(f"CREATE TABLE {self.dbname}.t1( ts TIMESTAMP, c0 INT, c1 INT UNSIGNED, \
|
||||
c2 BIGINT, c3 BIGINT UNSIGNED, c4 SMALLINT, c5 SMALLINT UNSIGNED, c6 TINYINT, c7 TINYINT UNSIGNED);")
|
||||
tdSql.execute(f"INSERT INTO {self.dbname}.t1 VALUES (1641024000001, 1, 1, 1, 1, 1, 1, 1, 1);")
|
||||
|
||||
columns = ["c0", "c1", "c2", "c3", "c4", "c5", "c6", "c7"]
|
||||
for col in columns:
|
||||
tdLog.debug(f"oper on time test, {col} start ...")
|
||||
tdSql.query(f"SELECT ts, ts+1, ts+{col}, ts+(-{col}) FROM {self.dbname}.t1")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 0, 1641024000001)
|
||||
tdSql.checkData(0, 1, 1641024000002)
|
||||
tdSql.checkData(0, 2, 1641024000002)
|
||||
tdSql.checkData(0, 3, 1641024000000)
|
||||
|
||||
tdSql.query(f"SELECT ts, ts+1, ts+{col}, ts+(-{col}) FROM {self.dbname}.t1 where (ts-(-{col})) > 0")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 0, 1641024000001)
|
||||
tdSql.checkData(0, 1, 1641024000002)
|
||||
tdSql.checkData(0, 2, 1641024000002)
|
||||
tdSql.checkData(0, 3, 1641024000000)
|
||||
|
||||
tdSql.query(f"SELECT ts, ts-1, ts-{col}, ts-(-{col}) FROM {self.dbname}.t1")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 0, 1641024000001)
|
||||
tdSql.checkData(0, 1, 1641024000000)
|
||||
tdSql.checkData(0, 2, 1641024000000)
|
||||
tdSql.checkData(0, 3, 1641024000002)
|
||||
|
||||
tdSql.query(f"SELECT ts, ts+true, ts-true, ts-false, ts+false FROM {self.dbname}.t1")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 0, 1641024000001)
|
||||
tdSql.checkData(0, 1, 1641024000002)
|
||||
tdSql.checkData(0, 2, 1641024000000)
|
||||
tdSql.checkData(0, 3, 1641024000001)
|
||||
tdSql.checkData(0, 4, 1641024000001)
|
||||
|
||||
tdSql.execute(f"DROP TABLE IF EXISTS {self.dbname}.t2;")
|
||||
tdSql.execute(f"CREATE TABLE {self.dbname}.t2( ts TIMESTAMP, c1 float, c2 double);")
|
||||
tdSql.execute(f"INSERT INTO {self.dbname}.t2(ts, c1, c2) VALUES (1641024000001, 1.0, 1.0);")
|
||||
|
||||
columns = ["c1", "c2"]
|
||||
for col in columns:
|
||||
tdSql.query(f"SELECT ts, ts+{col}, ts+(-{col}), ts-{col}, ts-(-{col}) FROM {self.dbname}.t2")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 0, 1641024000001)
|
||||
tdSql.checkData(0, 1, 1641024000002)
|
||||
tdSql.checkData(0, 2, 1641024000000)
|
||||
tdSql.checkData(0, 3, 1641024000000)
|
||||
tdSql.checkData(0, 4, 1641024000002)
|
||||
|
||||
tdSql.query(f"SELECT ts, ts+{col}, ts+(-{col}), ts-{col}, ts-(-{col}) FROM {self.dbname}.t2 where (ts-(-{col})) > 0")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 0, 1641024000001)
|
||||
tdSql.checkData(0, 1, 1641024000002)
|
||||
tdSql.checkData(0, 2, 1641024000000)
|
||||
tdSql.checkData(0, 3, 1641024000000)
|
||||
tdSql.checkData(0, 4, 1641024000002)
|
||||
|
||||
tdSql.query(f"SELECT ts, cast(ts+{col} as bigint), cast(ts+(-{col}) as bigint), cast(ts-{col} as bigint),\
|
||||
cast(ts-(-{col}) as bigint) FROM {self.dbname}.t2")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 0, 1641024000001)
|
||||
tdSql.checkData(0, 1, 1641024000002)
|
||||
tdSql.checkData(0, 2, 1641024000000)
|
||||
tdSql.checkData(0, 3, 1641024000000)
|
||||
tdSql.checkData(0, 4, 1641024000002)
|
||||
|
||||
tdSql.query(f"SELECT sum(ts + c1), sum(ts+c2) from {self.dbname}.t2")
|
||||
tdSql.checkData(0, 0, 1641024000002)
|
||||
tdSql.checkData(0, 1, 1641024000002)
|
||||
tdSql.query(f"SELECT sum(ts * c1), sum(ts*c2) from {self.dbname}.t2")
|
||||
tdSql.checkData(0, 0, 1641024000001)
|
||||
tdSql.checkData(0, 1, 1641024000001)
|
||||
tdSql.query(f"SELECT sum(ts / c1), sum(ts/c2) from {self.dbname}.t2")
|
||||
tdSql.checkData(0, 0, 1641024000001)
|
||||
tdSql.checkData(0, 1, 1641024000001)
|
||||
tdSql.execute(f"INSERT INTO {self.dbname}.t2(ts, c1, c2) VALUES (1641024000002, 2.0, 2.0);")
|
||||
tdSql.query(f"SELECT sum(ts + c1), sum(ts+c2) from {self.dbname}.t2")
|
||||
tdSql.checkData(0, 0, 3282048000006)
|
||||
tdSql.checkData(0, 1, 3282048000006)
|
||||
tdSql.query(f"SELECT sum(ts - c1), sum(ts-c2) from {self.dbname}.t2")
|
||||
tdSql.checkData(0, 0, 3282048000000)
|
||||
tdSql.checkData(0, 1, 3282048000000)
|
||||
tdSql.query(f"SELECT sum(ts * c1), sum(ts*c2) from {self.dbname}.t2")
|
||||
tdSql.checkData(0, 0, 4923072000005)
|
||||
tdSql.checkData(0, 1, 4923072000005)
|
||||
tdSql.query(f"SELECT ts / c1, ts/c2 from {self.dbname}.t2 order by ts")
|
||||
tdSql.checkData(0, 0, 1641024000001)
|
||||
tdSql.checkData(0, 1, 1641024000001)
|
||||
tdSql.checkData(1, 0, 820512000001)
|
||||
tdSql.checkData(1, 1, 820512000001)
|
||||
tdSql.query(f"SELECT sum(ts / c1), sum(ts/c2) from {self.dbname}.t2")
|
||||
tdSql.checkData(0, 0, 2461536000002)
|
||||
tdSql.checkData(0, 1, 2461536000002)
|
||||
|
||||
# data overflow
|
||||
tdSql.query(f"SELECT ts + 9223372036854775807 from {self.dbname}.t2 order by ts")
|
||||
tdSql.query(f"SELECT ts - 9223372036854775808 from {self.dbname}.t2 order by ts")
|
||||
|
||||
tdSql.query(f"SELECT ts + 8223372036854775807 from {self.dbname}.t2 order by ts")
|
||||
tdSql.query(f"SELECT ts - 8223372036854775808 from {self.dbname}.t2 order by ts")
|
||||
|
||||
def run(self):
|
||||
dbname = "db"
|
||||
tdSql.prepare()
|
||||
tdSql.execute(f"create database if not exists {self.dbname}")
|
||||
|
||||
self.ts5757()
|
||||
self.ts5760()
|
||||
self.ts5758()
|
||||
self.ts5759()
|
||||
self.operOnTime()
|
||||
|
||||
|
||||
|
||||
|
||||
def stop(self):
|
||||
tdSql.close()
|
||||
tdLog.success("%s successfully executed" % __file__)
|
||||
|
||||
tdCases.addWindows(__file__, TDTestCase())
|
||||
|
||||
tdCases.addLinux(__file__, TDTestCase())
|
|
@ -78,7 +78,7 @@ class TDTestCase:
|
|||
)
|
||||
# sqls.extend( f"select sum( {un_num_col} + {un_num_col_2} ) from {tbanme} " for un_num_col_2 in UN_NUM_COL )
|
||||
|
||||
sqls.extend( f"select sum( {num_col} + {ts_col} ) from {DBNAME}.{tbanme} " for num_col in NUM_COL for ts_col in TS_TYPE_COL)
|
||||
#sqls.extend( f"select sum( {num_col} + {ts_col} ) from {DBNAME}.{tbanme} " for num_col in NUM_COL for ts_col in TS_TYPE_COL)
|
||||
sqls.extend(
|
||||
(
|
||||
f"select sum() from {DBNAME}.{tbanme} ",
|
||||
|
|
Loading…
Reference in New Issue