Merge pull request #14434 from taosdata/fix/TD-15257
fix(quer): fix time unit parameter check
This commit is contained in:
commit
86505d97a2
|
@ -39,6 +39,174 @@ static int32_t invaildFuncParaValueErrMsg(char* pErrBuf, int32_t len, const char
|
|||
return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_PARA_VALUE, "Invalid parameter value : %s", pFuncName);
|
||||
}
|
||||
|
||||
#define TIME_UNIT_INVALID 1
|
||||
#define TIME_UNIT_TOO_SMALL 2
|
||||
|
||||
static int32_t validateTimeUnitParam(uint8_t dbPrec, const SValueNode* pVal) {
|
||||
if (!pVal->isDuration) {
|
||||
return TIME_UNIT_INVALID;
|
||||
}
|
||||
|
||||
if (TSDB_TIME_PRECISION_MILLI == dbPrec && 0 == strcasecmp(pVal->literal, "1u")) {
|
||||
return TIME_UNIT_TOO_SMALL;
|
||||
}
|
||||
|
||||
if (pVal->literal[0] != '1' || (pVal->literal[1] != 'u' && pVal->literal[1] != 'a' &&
|
||||
pVal->literal[1] != 's' && pVal->literal[1] != 'm' &&
|
||||
pVal->literal[1] != 'h' && pVal->literal[1] != 'd' &&
|
||||
pVal->literal[1] != 'w')) {
|
||||
return TIME_UNIT_INVALID;
|
||||
}
|
||||
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
/* Following are valid ISO-8601 timezone format:
|
||||
* 1 z/Z
|
||||
* 2 ±hh:mm
|
||||
* 3 ±hhmm
|
||||
* 4 ±hh
|
||||
*
|
||||
*/
|
||||
|
||||
static bool validateHourRange(int8_t hour) {
|
||||
if (hour < 0 || hour > 12) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool validateMinuteRange(int8_t hour, int8_t minute, char sign) {
|
||||
if (minute == 0 || (minute == 30 && (hour == 3 || hour == 5) && sign == '+')) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool validateTimestampDigits(const SValueNode* pVal) {
|
||||
if (!IS_INTEGER_TYPE(pVal->node.resType.type)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
int64_t tsVal = pVal->datum.i;
|
||||
char fraction[20] = {0};
|
||||
NUM_TO_STRING(pVal->node.resType.type, &tsVal, sizeof(fraction), fraction);
|
||||
int32_t tsDigits = (int32_t)strlen(fraction);
|
||||
|
||||
if (tsDigits > TSDB_TIME_PRECISION_SEC_DIGITS) {
|
||||
if (tsDigits == TSDB_TIME_PRECISION_MILLI_DIGITS || tsDigits == TSDB_TIME_PRECISION_MICRO_DIGITS ||
|
||||
tsDigits == TSDB_TIME_PRECISION_NANO_DIGITS) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool validateTimezoneFormat(const SValueNode* pVal) {
|
||||
if (TSDB_DATA_TYPE_BINARY != pVal->node.resType.type) {
|
||||
return false;
|
||||
}
|
||||
|
||||
char* tz = varDataVal(pVal->datum.p);
|
||||
int32_t len = varDataLen(pVal->datum.p);
|
||||
|
||||
char buf[3] = {0};
|
||||
int8_t hour = -1, minute = -1;
|
||||
if (len == 0) {
|
||||
return false;
|
||||
} else if (len == 1 && (tz[0] == 'z' || tz[0] == 'Z')) {
|
||||
return true;
|
||||
} else if ((tz[0] == '+' || tz[0] == '-')) {
|
||||
switch (len) {
|
||||
case 3:
|
||||
case 5: {
|
||||
for (int32_t i = 1; i < len; ++i) {
|
||||
if (!isdigit(tz[i])) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (i == 2) {
|
||||
memcpy(buf, &tz[i - 1], 2);
|
||||
hour = taosStr2Int8(buf, NULL, 10);
|
||||
if (!validateHourRange(hour)) {
|
||||
return false;
|
||||
}
|
||||
} else if (i == 4) {
|
||||
memcpy(buf, &tz[i - 1], 2);
|
||||
minute = taosStr2Int8(buf, NULL, 10);
|
||||
if (!validateMinuteRange(hour, minute, tz[0])) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 6: {
|
||||
for (int32_t i = 1; i < len; ++i) {
|
||||
if (i == 3) {
|
||||
if (tz[i] != ':') {
|
||||
return false;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!isdigit(tz[i])) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (i == 2) {
|
||||
memcpy(buf, &tz[i - 1], 2);
|
||||
hour = taosStr2Int8(buf, NULL, 10);
|
||||
if (!validateHourRange(hour)) {
|
||||
return false;
|
||||
}
|
||||
} else if (i == 5) {
|
||||
memcpy(buf, &tz[i - 1], 2);
|
||||
minute = taosStr2Int8(buf, NULL, 10);
|
||||
if (!validateMinuteRange(hour, minute, tz[0])) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void static addTimezoneParam(SNodeList* pList) {
|
||||
char buf[6] = {0};
|
||||
time_t t = taosTime(NULL);
|
||||
struct tm* tmInfo = taosLocalTime(&t, NULL);
|
||||
strftime(buf, sizeof(buf), "%z", tmInfo);
|
||||
int32_t len = (int32_t)strlen(buf);
|
||||
|
||||
SValueNode* pVal = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE);
|
||||
pVal->literal = strndup(buf, len);
|
||||
pVal->isDuration = false;
|
||||
pVal->translate = true;
|
||||
pVal->node.resType.type = TSDB_DATA_TYPE_BINARY;
|
||||
pVal->node.resType.bytes = len + VARSTR_HEADER_SIZE;
|
||||
pVal->node.resType.precision = TSDB_TIME_PRECISION_MILLI;
|
||||
pVal->datum.p = taosMemoryCalloc(1, len + VARSTR_HEADER_SIZE + 1);
|
||||
varDataSetLen(pVal->datum.p, len);
|
||||
strncpy(varDataVal(pVal->datum.p), pVal->literal, len);
|
||||
|
||||
nodesListAppend(pList, (SNode*)pVal);
|
||||
}
|
||||
|
||||
void static addDbPrecisonParam(SNodeList** pList, uint8_t precision) {
|
||||
SValueNode* pVal = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE);
|
||||
pVal->literal = NULL;
|
||||
|
@ -525,9 +693,15 @@ static int32_t translateElapsed(SFunctionNode* pFunc, char* pErrBuf, int32_t len
|
|||
return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
|
||||
}
|
||||
|
||||
if (pValue->datum.i == 0) {
|
||||
uint8_t dbPrec = pFunc->node.resType.precision;
|
||||
|
||||
int32_t ret = validateTimeUnitParam(dbPrec, (SValueNode *)nodesListGetNode(pFunc->pParameterList, 1));
|
||||
if (ret == TIME_UNIT_TOO_SMALL) {
|
||||
return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
|
||||
"ELAPSED function time unit parameter should be greater than db precision");
|
||||
} else if (ret == TIME_UNIT_INVALID) {
|
||||
return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
|
||||
"ELAPSED function time unit parameter should be one of the following: [1u, 1a, 1s, 1m, 1h, 1d, 1w]");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -843,6 +1017,19 @@ static int32_t translateStateDuration(SFunctionNode* pFunc, char* pErrBuf, int32
|
|||
return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
|
||||
}
|
||||
|
||||
if (numOfParams == 4) {
|
||||
uint8_t dbPrec = pFunc->node.resType.precision;
|
||||
|
||||
int32_t ret = validateTimeUnitParam(dbPrec, (SValueNode *)nodesListGetNode(pFunc->pParameterList, 3));
|
||||
if (ret == TIME_UNIT_TOO_SMALL) {
|
||||
return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
|
||||
"STATEDURATION function time unit parameter should be greater than db precision");
|
||||
} else if (ret == TIME_UNIT_INVALID) {
|
||||
return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
|
||||
"STATEDURATION function time unit parameter should be one of the following: [1u, 1a, 1s, 1m, 1h, 1d, 1w]");
|
||||
}
|
||||
}
|
||||
|
||||
// set result type
|
||||
pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes, .type = TSDB_DATA_TYPE_BIGINT};
|
||||
return TSDB_CODE_SUCCESS;
|
||||
|
@ -1284,152 +1471,6 @@ static int32_t translateCast(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
|
|||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
/* Following are valid ISO-8601 timezone format:
|
||||
* 1 z/Z
|
||||
* 2 ±hh:mm
|
||||
* 3 ±hhmm
|
||||
* 4 ±hh
|
||||
*
|
||||
*/
|
||||
|
||||
static bool validateHourRange(int8_t hour) {
|
||||
if (hour < 0 || hour > 12) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool validateMinuteRange(int8_t hour, int8_t minute, char sign) {
|
||||
if (minute == 0 || (minute == 30 && (hour == 3 || hour == 5) && sign == '+')) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool validateTimestampDigits(const SValueNode* pVal) {
|
||||
if (!IS_INTEGER_TYPE(pVal->node.resType.type)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
int64_t tsVal = pVal->datum.i;
|
||||
char fraction[20] = {0};
|
||||
NUM_TO_STRING(pVal->node.resType.type, &tsVal, sizeof(fraction), fraction);
|
||||
int32_t tsDigits = (int32_t)strlen(fraction);
|
||||
|
||||
if (tsDigits > TSDB_TIME_PRECISION_SEC_DIGITS) {
|
||||
if (tsDigits == TSDB_TIME_PRECISION_MILLI_DIGITS || tsDigits == TSDB_TIME_PRECISION_MICRO_DIGITS ||
|
||||
tsDigits == TSDB_TIME_PRECISION_NANO_DIGITS) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool validateTimezoneFormat(const SValueNode* pVal) {
|
||||
if (TSDB_DATA_TYPE_BINARY != pVal->node.resType.type) {
|
||||
return false;
|
||||
}
|
||||
|
||||
char* tz = varDataVal(pVal->datum.p);
|
||||
int32_t len = varDataLen(pVal->datum.p);
|
||||
|
||||
char buf[3] = {0};
|
||||
int8_t hour = -1, minute = -1;
|
||||
if (len == 0) {
|
||||
return false;
|
||||
} else if (len == 1 && (tz[0] == 'z' || tz[0] == 'Z')) {
|
||||
return true;
|
||||
} else if ((tz[0] == '+' || tz[0] == '-')) {
|
||||
switch (len) {
|
||||
case 3:
|
||||
case 5: {
|
||||
for (int32_t i = 1; i < len; ++i) {
|
||||
if (!isdigit(tz[i])) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (i == 2) {
|
||||
memcpy(buf, &tz[i - 1], 2);
|
||||
hour = taosStr2Int8(buf, NULL, 10);
|
||||
if (!validateHourRange(hour)) {
|
||||
return false;
|
||||
}
|
||||
} else if (i == 4) {
|
||||
memcpy(buf, &tz[i - 1], 2);
|
||||
minute = taosStr2Int8(buf, NULL, 10);
|
||||
if (!validateMinuteRange(hour, minute, tz[0])) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 6: {
|
||||
for (int32_t i = 1; i < len; ++i) {
|
||||
if (i == 3) {
|
||||
if (tz[i] != ':') {
|
||||
return false;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!isdigit(tz[i])) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (i == 2) {
|
||||
memcpy(buf, &tz[i - 1], 2);
|
||||
hour = taosStr2Int8(buf, NULL, 10);
|
||||
if (!validateHourRange(hour)) {
|
||||
return false;
|
||||
}
|
||||
} else if (i == 5) {
|
||||
memcpy(buf, &tz[i - 1], 2);
|
||||
minute = taosStr2Int8(buf, NULL, 10);
|
||||
if (!validateMinuteRange(hour, minute, tz[0])) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void static addTimezoneParam(SNodeList* pList) {
|
||||
char buf[6] = {0};
|
||||
time_t t = taosTime(NULL);
|
||||
struct tm* tmInfo = taosLocalTime(&t, NULL);
|
||||
strftime(buf, sizeof(buf), "%z", tmInfo);
|
||||
int32_t len = (int32_t)strlen(buf);
|
||||
|
||||
SValueNode* pVal = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE);
|
||||
pVal->literal = strndup(buf, len);
|
||||
pVal->isDuration = false;
|
||||
pVal->translate = true;
|
||||
pVal->node.resType.type = TSDB_DATA_TYPE_BINARY;
|
||||
pVal->node.resType.bytes = len + VARSTR_HEADER_SIZE;
|
||||
pVal->node.resType.precision = TSDB_TIME_PRECISION_MILLI;
|
||||
pVal->datum.p = taosMemoryCalloc(1, len + VARSTR_HEADER_SIZE + 1);
|
||||
varDataSetLen(pVal->datum.p, len);
|
||||
strncpy(varDataVal(pVal->datum.p), pVal->literal, len);
|
||||
|
||||
nodesListAppend(pList, (SNode*)pVal);
|
||||
}
|
||||
|
||||
static int32_t translateToIso8601(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
|
||||
int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
|
||||
if (1 != numOfParams && 2 != numOfParams) {
|
||||
|
@ -1498,6 +1539,16 @@ static int32_t translateTimeTruncate(SFunctionNode* pFunc, char* pErrBuf, int32_
|
|||
|
||||
// add database precision as param
|
||||
uint8_t dbPrec = pFunc->node.resType.precision;
|
||||
|
||||
int32_t ret = validateTimeUnitParam(dbPrec, (SValueNode *)nodesListGetNode(pFunc->pParameterList, 1));
|
||||
if (ret == TIME_UNIT_TOO_SMALL) {
|
||||
return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
|
||||
"TIMETRUNCATE function time unit parameter should be greater than db precision");
|
||||
} else if (ret == TIME_UNIT_INVALID) {
|
||||
return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
|
||||
"TIMETRUNCATE function time unit parameter should be one of the following: [1u, 1a, 1s, 1m, 1h, 1d, 1w]");
|
||||
}
|
||||
|
||||
addDbPrecisonParam(&pFunc->pParameterList, dbPrec);
|
||||
|
||||
pFunc->node.resType =
|
||||
|
@ -1526,6 +1577,18 @@ static int32_t translateTimeDiff(SFunctionNode* pFunc, char* pErrBuf, int32_t le
|
|||
|
||||
// add database precision as param
|
||||
uint8_t dbPrec = pFunc->node.resType.precision;
|
||||
|
||||
if (3 == numOfParams) {
|
||||
int32_t ret = validateTimeUnitParam(dbPrec, (SValueNode *)nodesListGetNode(pFunc->pParameterList, 2));
|
||||
if (ret == TIME_UNIT_TOO_SMALL) {
|
||||
return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
|
||||
"TIMEDIFF function time unit parameter should be greater than db precision");
|
||||
} else if (ret == TIME_UNIT_INVALID) {
|
||||
return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
|
||||
"TIMEDIFF function time unit parameter should be one of the following: [1u, 1a, 1s, 1m, 1h, 1d, 1w]");
|
||||
}
|
||||
}
|
||||
|
||||
addDbPrecisonParam(&pFunc->pParameterList, dbPrec);
|
||||
|
||||
pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes, .type = TSDB_DATA_TYPE_BIGINT};
|
||||
|
|
|
@ -3,7 +3,7 @@ from util.sql import *
|
|||
from util.cases import *
|
||||
|
||||
class TDTestCase:
|
||||
|
||||
|
||||
def init(self, conn, logSql):
|
||||
tdLog.debug(f"start to excute {__file__}")
|
||||
tdSql.init(conn.cursor())
|
||||
|
@ -33,7 +33,7 @@ class TDTestCase:
|
|||
'insert into ntb values(now,1,1.55,100.555555,today())("2020-1-1 00:00:00",10,11.11,99.999999,now())(today(),3,3.333,333.333333,now())')
|
||||
tdSql.execute(
|
||||
'insert into stb_1 values(now,1,1.55,100.555555,today())("2020-1-1 00:00:00",10,11.11,99.999999,now())(today(),3,3.333,333.333333,now())')
|
||||
|
||||
|
||||
tdSql.query("select timediff('2020-1-1 00:00:00','2020-1-2 00:00:00') from ntb")
|
||||
tdSql.checkRows(3)
|
||||
tdSql.query("select timediff(1,0,1d) from ntb")
|
||||
|
@ -72,12 +72,12 @@ class TDTestCase:
|
|||
tdSql.query("select timediff(1,0,1a) from db.ntb")
|
||||
tdSql.checkRows(3)
|
||||
tdSql.checkData(0,0,1000)
|
||||
tdSql.query("select timediff(1,0,1u) from ntb")
|
||||
tdSql.checkRows(3)
|
||||
tdSql.checkData(0,0,1000000)
|
||||
tdSql.query("select timediff(1,0,1u) from db.ntb")
|
||||
tdSql.checkRows(3)
|
||||
tdSql.checkData(0,0,1000000)
|
||||
tdSql.error("select timediff(1,0,1u) from ntb")
|
||||
#tdSql.checkRows(3)
|
||||
#tdSql.checkData(0,0,1000000)
|
||||
tdSql.error("select timediff(1,0,1u) from db.ntb")
|
||||
#tdSql.checkRows(3)
|
||||
#tdSql.checkData(0,0,1000000)
|
||||
|
||||
tdSql.query("select timediff('2020-1-1 00:00:00','2020-1-2 00:00:00') from stb")
|
||||
tdSql.checkRows(3)
|
||||
|
@ -116,12 +116,12 @@ class TDTestCase:
|
|||
tdSql.query("select timediff('2020-1-1 00:00:00','2020-1-2 00:00:00',1a) from db.stb")
|
||||
tdSql.checkRows(3)
|
||||
tdSql.checkData(0,0,86400000)
|
||||
tdSql.query("select timediff('2020-1-1 00:00:00','2020-1-2 00:00:00',1u) from stb")
|
||||
tdSql.checkRows(3)
|
||||
tdSql.checkData(0,0,86400000000)
|
||||
tdSql.query("select timediff('2020-1-1 00:00:00','2020-1-2 00:00:00',1u) from db.stb")
|
||||
tdSql.checkRows(3)
|
||||
tdSql.checkData(0,0,86400000000)
|
||||
tdSql.error("select timediff('2020-1-1 00:00:00','2020-1-2 00:00:00',1u) from stb")
|
||||
#tdSql.checkRows(3)
|
||||
#tdSql.checkData(0,0,86400000000)
|
||||
tdSql.error("select timediff('2020-1-1 00:00:00','2020-1-2 00:00:00',1u) from db.stb")
|
||||
#tdSql.checkRows(3)
|
||||
#tdSql.checkData(0,0,86400000000)
|
||||
|
||||
|
||||
tdSql.query("select timediff('2020-1-1 00:00:00','2020-1-1 12:00:00') from stb_1")
|
||||
|
@ -164,12 +164,12 @@ class TDTestCase:
|
|||
tdSql.query("select timediff('2020-1-1 00:00:00','2020-1-1 12:00:00',1a) from db.stb_1")
|
||||
tdSql.checkRows(3)
|
||||
tdSql.checkData(0,0,43200000)
|
||||
tdSql.query("select timediff('2020-1-1 00:00:00','2020-1-1 12:00:00',1u) from stb_1")
|
||||
tdSql.checkRows(3)
|
||||
tdSql.checkData(0,0,43200000000)
|
||||
tdSql.query("select timediff('2020-1-1 00:00:00','2020-1-1 12:00:00',1u) from db.stb_1")
|
||||
tdSql.checkRows(3)
|
||||
tdSql.checkData(0,0,43200000000)
|
||||
tdSql.error("select timediff('2020-1-1 00:00:00','2020-1-1 12:00:00',1u) from stb_1")
|
||||
#tdSql.checkRows(3)
|
||||
#tdSql.checkData(0,0,43200000000)
|
||||
tdSql.error("select timediff('2020-1-1 00:00:00','2020-1-1 12:00:00',1u) from db.stb_1")
|
||||
#tdSql.checkRows(3)
|
||||
#tdSql.checkData(0,0,43200000000)
|
||||
|
||||
tdSql.query("select timediff('a','b') from stb")
|
||||
tdSql.checkRows(3)
|
||||
|
@ -202,4 +202,4 @@ class TDTestCase:
|
|||
tdLog.success(f"{__file__} successfully executed")
|
||||
|
||||
tdCases.addLinux(__file__, TDTestCase())
|
||||
tdCases.addWindows(__file__, TDTestCase())
|
||||
tdCases.addWindows(__file__, TDTestCase())
|
||||
|
|
|
@ -23,18 +23,18 @@ class TDTestCase:
|
|||
def init(self, conn, logSql):
|
||||
tdLog.debug("start to execute %s" % __file__)
|
||||
tdSql.init(conn.cursor(), logSql)
|
||||
|
||||
|
||||
self.ts = 1420041600000 # 2015-01-01 00:00:00 this is begin time for first record
|
||||
self.num = 10
|
||||
|
||||
def caseDescription(self):
|
||||
|
||||
'''
|
||||
case1 <wenzhouwww>: [TD-11804] test case for elapsed function :
|
||||
|
||||
this test case is for aggregate function elapsed , elapsed function can only used for the timestamp primary key column (ts) ,
|
||||
case1 <wenzhouwww>: [TD-11804] test case for elapsed function :
|
||||
|
||||
this test case is for aggregate function elapsed , elapsed function can only used for the timestamp primary key column (ts) ,
|
||||
it has two input parameters, the first parameter is necessary, basic SQL as follow:
|
||||
|
||||
|
||||
===================================================================================================================================
|
||||
SELECT ELAPSED(field_name[, time_unit]) FROM { tb_name | stb_name } [WHERE clause] [INTERVAL(interval [, offset]) [SLIDING sliding]];
|
||||
===================================================================================================================================
|
||||
|
@ -49,18 +49,18 @@ class TDTestCase:
|
|||
case: select * from table|stable[group by tbname]|regular_table
|
||||
|
||||
case:select elapsed(ts) from table|stable where clause interval (units) [fill(LINEAR,NEXT,PREV,VALUE,NULL)] [group by tbname] order [by ts desc asc|desc];
|
||||
|
||||
|
||||
case:select elapsed(ts) , elapsed(ts,unit_time1)*regular_num1 , elapsed(ts,unit_time1)+regular_num2 from table|stable where clause interval (units) [fill(LINEAR,NEXT,PREV,VALUE,NULL)] [group by tbname] order [by ts desc asc|desc];
|
||||
|
||||
|
||||
//mixup with all functions only once query (it's different with nest query)
|
||||
case:select elapsed(ts), count(*), avg(col), twa(col), irate(col), sum(col), stddev(col), leastsquares(col, 1, 1),min(col), max(col), first(col), last(col), percentile(col, 20), apercentile(col, 30), last_row(col), spread(col)from table|stable where clause interval (units) [fill(LINEAR,NEXT,PREV,VALUE,NULL)] [group by tbname] order [by ts desc asc|desc];
|
||||
|
||||
//mixup with ordinary col
|
||||
|
||||
//mixup with ordinary col
|
||||
case:select ts ,elapsed(ts)*10 ,col+5 from table|stable where clause interval (units) [fill(LINEAR,NEXT,PREV,VALUE,NULL)] [group by tbname] order [by ts desc asc|desc];
|
||||
|
||||
|
||||
//nest query
|
||||
case:select elapsed(ts) from (select elapsed(ts), count(*), avg(col), twa(col), irate(col), sum(col), stddev(col), leastsquares(col, 1, 1),min(col), max(col), first(col), last(col), percentile(col, 20), apercentile(col, 30), last_row(col), spread(col)from table|stable where clause interval (units) [fill(LINEAR,NEXT,PREV,VALUE,NULL)] [group by tbname] order [by ts desc asc|desc]) where clause interval (units) [fill(LINEAR,NEXT,PREV,VALUE,NULL)] [group by tbname] order [by ts desc asc|desc];
|
||||
|
||||
|
||||
//clause about filter condition
|
||||
case:select elapsed(ts) from table|stable[group by tbname] where [ts|col|tag >|<|=|>=|<=|=|<>|!= value] | [between ... and ...] |[in] |[is null|not null] interval (unit_time) ;
|
||||
case:select elapsed(ts) from table|stable[group by tbname] where clause1 and clause 2 and clause3 interval (unit_time) ;
|
||||
|
@ -74,7 +74,7 @@ class TDTestCase:
|
|||
// Window aggregation
|
||||
|
||||
case:select elapsed(ts) from t1 where clause session(ts, time_units) ;
|
||||
case:select elapsed(ts) from t1 where clause state_window(regular_nums);
|
||||
case:select elapsed(ts) from t1 where clause state_window(regular_nums);
|
||||
|
||||
// Continuous query
|
||||
case:create table select elapsed(ts) ,avg(col) from (select elapsed(ts) ts_inter ,avg(col) col from stable|table interval (unit_time) [fill(LINEAR,NEXT,PREV,VALUE,NULL)][group by tbname]) interval (unit_time) [fill(LINEAR,NEXT,PREV,VALUE,NULL) sliding(unit_time_windows);
|
||||
|
@ -83,13 +83,13 @@ class TDTestCase:
|
|||
|
||||
this test case notice successful execution and correctness of results.
|
||||
|
||||
'''
|
||||
return
|
||||
'''
|
||||
return
|
||||
|
||||
def prepare_data(self):
|
||||
|
||||
tdLog.info (" ====================================== prepare data ==================================================")
|
||||
|
||||
|
||||
tdSql.execute('drop database if exists testdb ;')
|
||||
tdSql.execute('create database testdb keep 36500;')
|
||||
tdSql.execute('use testdb;')
|
||||
|
@ -120,14 +120,14 @@ class TDTestCase:
|
|||
tdSql.execute('create table regular_table_1 (ts timestamp , tscol timestamp ,q_int int , q_bigint bigint , q_smallint smallint , q_tinyint tinyint , q_float float , q_double double, bin_chars binary(20)) ;')
|
||||
tdSql.execute('create table regular_table_2 (ts timestamp , tscol timestamp ,q_int int , q_bigint bigint , q_smallint smallint , q_tinyint tinyint , q_float float , q_double double , bin_chars binary(20)) ;')
|
||||
tdSql.execute('create table regular_table_3 (ts timestamp , tscol timestamp ,q_int int , q_bigint bigint , q_smallint smallint , q_tinyint tinyint , q_float float , q_double double , bin_chars binary(20)) ;')
|
||||
|
||||
|
||||
tablenames = ["sub_table1_1","sub_table1_2","sub_table1_3","sub_table2_1","sub_table2_2","sub_table2_3","regular_table_1","regular_table_2","regular_table_3"]
|
||||
|
||||
tdLog.info("insert into records ")
|
||||
|
||||
for tablename in tablenames:
|
||||
|
||||
for i in range(self.num):
|
||||
for i in range(self.num):
|
||||
sql= 'insert into %s values(%d, %d,%d, %d, %d, %d, %f, %f, "%s")' % (tablename,self.ts + i*10000, self.ts + i*10,2147483647-i, 9223372036854775807-i, 32767-i, 127-i, i, i,("bintest"+str(i)))
|
||||
print(sql)
|
||||
tdSql.execute(sql)
|
||||
|
@ -144,7 +144,7 @@ class TDTestCase:
|
|||
"(ts,2d+3m-2s,NULL)","(ts+10d,NULL)" ,"(ts,now -1m%1d)","(ts+10d,_c0)","(ts+10d,)","(ts,%)","(ts, , m)","(ts,abc)","(ts,/)","(ts,*)","(ts,1s,100)",
|
||||
"(ts,1s,abc)","(ts,1s,_c0)","(ts,1s,*)","(ts,1s,NULL)","(ts,,_c0)","(ts,tbname,ts)","(ts,0,tbname)","('2021-11-18 00:00:10')","('2021-11-18 00:00:10', 1s)",
|
||||
"('2021-11-18T00:00:10+0800', '1s')","('2021-11-18T00:00:10Z', '1s')","('2021-11-18T00:00:10+0800', 10000000d,)","('ts', ,2021-11-18T00:00:10+0800, )"]
|
||||
|
||||
|
||||
for tablename in tablenames:
|
||||
for abnormal_param in abnormal_list:
|
||||
|
||||
|
@ -191,7 +191,7 @@ class TDTestCase:
|
|||
def query_filter(self):
|
||||
|
||||
tdLog.info (" ====================================== elapsed query filter ==================================================")
|
||||
|
||||
|
||||
for i in range(self.num):
|
||||
ts_start_time = self.ts + i*10000
|
||||
ts_col_start_time = self.ts + i*10
|
||||
|
@ -210,7 +210,7 @@ class TDTestCase:
|
|||
tdSql.query(filter_sql)
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0,0,float(self.num -i-1))
|
||||
|
||||
|
||||
|
||||
filter_sql = "select elapsed(ts,10s) from stable_1 where ts >= %d and tscol >= %d and tstag='2015-01-01 00:01:00'group by tbname " %(ts_start_time,ts_col_start_time)
|
||||
tdSql.query(filter_sql)
|
||||
|
@ -224,7 +224,7 @@ class TDTestCase:
|
|||
|
||||
filter_sql = "select elapsed(ts,10s) from stable_1 where ts >= %d and tscol > %d and tstag='2015-01-01 00:01:00' group by tbname" %(ts_start_time,ts_col_start_time)
|
||||
tdSql.query(filter_sql)
|
||||
|
||||
|
||||
if i == self.num-1:
|
||||
tdSql.checkRows(0)
|
||||
else:
|
||||
|
@ -233,7 +233,7 @@ class TDTestCase:
|
|||
|
||||
filter_sql = "select elapsed(ts,10s) from sub_table1_1 where ts >= %d and tscol > %d " %(ts_start_time,ts_col_start_time)
|
||||
tdSql.query(filter_sql)
|
||||
|
||||
|
||||
if i == self.num-1:
|
||||
tdSql.checkRows(0)
|
||||
else:
|
||||
|
@ -268,7 +268,7 @@ class TDTestCase:
|
|||
|
||||
filter_sql = "select elapsed(ts,10s) from stable_1 where ts < %d and tscol <= %d and tstag < '2015-01-01 00:01:00' group by tbname" %(ts_end_time,ts_col_end_time)
|
||||
tdSql.query(filter_sql)
|
||||
|
||||
|
||||
if i == self.num-1:
|
||||
tdSql.checkRows(0)
|
||||
else:
|
||||
|
@ -277,7 +277,7 @@ class TDTestCase:
|
|||
|
||||
filter_sql = "select elapsed(ts,10s) from sub_table1_1 where ts < %d and tscol <= %d " %(ts_end_time,ts_col_end_time)
|
||||
tdSql.query(filter_sql)
|
||||
|
||||
|
||||
if i == self.num-1:
|
||||
tdSql.checkRows(0)
|
||||
else:
|
||||
|
@ -303,7 +303,7 @@ class TDTestCase:
|
|||
else:
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0,0,float(self.num - i - 2))
|
||||
|
||||
|
||||
filter_sql = "select elapsed(ts,10s) from stable_1 where ts = %d and tscol < %d group by tbname " %(ts_end_time,ts_col_end_time)
|
||||
tdSql.query(filter_sql)
|
||||
tdSql.checkRows(0)
|
||||
|
@ -331,10 +331,10 @@ class TDTestCase:
|
|||
else:
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0,0,float(self.num -i-2))
|
||||
|
||||
|
||||
filter_sql = "select elapsed(ts,10s) from stable_1 where q_tinyint != %d and tscol <= %d group by tbname " %(i,ts_col_end_time)
|
||||
tdSql.query(filter_sql)
|
||||
|
||||
|
||||
if i == self.num:
|
||||
tdSql.checkRows(0)
|
||||
else:
|
||||
|
@ -345,7 +345,7 @@ class TDTestCase:
|
|||
|
||||
filter_sql = "select elapsed(ts,10s) from sub_table1_1 where q_tinyint != %d and tscol <= %d " %(i,ts_col_end_time)
|
||||
tdSql.query(filter_sql)
|
||||
|
||||
|
||||
if i == self.num:
|
||||
tdSql.checkRows(0)
|
||||
else:
|
||||
|
@ -374,7 +374,7 @@ class TDTestCase:
|
|||
|
||||
filter_sql = "select elapsed(ts,10s) from stable_1 where q_tinyint <> %d and tscol <= %d group by tbname " %(i,ts_col_end_time)
|
||||
tdSql.query(filter_sql)
|
||||
|
||||
|
||||
if i == self.num:
|
||||
tdSql.checkRows(0)
|
||||
else:
|
||||
|
@ -385,14 +385,14 @@ class TDTestCase:
|
|||
|
||||
filter_sql = "select elapsed(ts,10s) from sub_table1_1 where q_tinyint <> %d and tscol <= %d " %(i,ts_col_end_time)
|
||||
tdSql.query(filter_sql)
|
||||
|
||||
|
||||
if i == self.num:
|
||||
tdSql.checkRows(0)
|
||||
else:
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0,0,float(self.num - i - 1))
|
||||
|
||||
# filter between and
|
||||
# filter between and
|
||||
tdSql.query("select elapsed(ts,10s) from sub_table1_1 where ts between '2015-01-01 00:00:00.000' and '2015-01-01 00:01:00.000' and q_tinyint between 125 and 127 and tscol <= '2015-01-01 00:01:00.000' ")
|
||||
tdSql.checkData(0,0,2)
|
||||
tdSql.query("select elapsed(ts,10s) from stable_1 where ts between '2015-01-01 00:00:00.000' and '2015-01-01 00:01:00.000' and \
|
||||
|
@ -401,7 +401,7 @@ class TDTestCase:
|
|||
tdSql.checkData(1,0,2)
|
||||
tdSql.checkData(2,0,2)
|
||||
|
||||
# filter in and or
|
||||
# filter in and or
|
||||
tdSql.query("select elapsed(ts,10s) from sub_table1_1 where ts between '2015-01-01 00:00:00.000' and '2015-01-01 00:01:00.000' and q_tinyint between 125 and 127 and tscol <= '2015-01-01 00:01:00.000' ")
|
||||
tdSql.checkData(0,0,2)
|
||||
|
||||
|
@ -424,7 +424,7 @@ class TDTestCase:
|
|||
tdSql.checkData(0,0,1)
|
||||
tdSql.checkData(1,0,1)
|
||||
tdSql.checkData(2,0,1)
|
||||
|
||||
|
||||
tdSql.query("select elapsed(ts,10s) from stable_1 where ts between '2015-01-01 00:00:00.000' and '2015-01-01 00:01:00.000' and bin_chars like 'bintest_' and tscol <= '2015-01-01 00:01:00.000' group by tbname ")
|
||||
tdSql.checkData(0,0,6)
|
||||
tdSql.checkData(1,0,6)
|
||||
|
@ -477,16 +477,16 @@ class TDTestCase:
|
|||
tdSql.checkRows(0)
|
||||
tdSql.query("select elapsed(ts,10s)*10 from sub_empty_2 where ts >= '2015-01-01 00:00:00.000' and ts <'2015-01-01 00:10:00.000' interval(10s) fill(prev);")
|
||||
tdSql.checkRows(0)
|
||||
|
||||
|
||||
for i in range(self.num):
|
||||
ts_start_time = self.ts + i*10000
|
||||
ts_col_start_time = self.ts + i*10
|
||||
ts_tag_time = "2015-01-01 00:01:00"
|
||||
ts_end_time = self.ts + (self.num-1-i)*10000
|
||||
ts_col_end_time = self.ts + (self.num-1-i)*10
|
||||
|
||||
|
||||
# only interval
|
||||
|
||||
# only interval
|
||||
interval_sql = "select elapsed(ts,10s) from stable_1 where ts <=%d interval(10s) group by tbname " %(ts_start_time)
|
||||
tdSql.query(interval_sql)
|
||||
tdSql.checkRows(3*(i+1))
|
||||
|
@ -499,10 +499,10 @@ class TDTestCase:
|
|||
tdSql.checkData(x,1,0)
|
||||
else :
|
||||
tdSql.checkData(x,1,1)
|
||||
|
||||
|
||||
# interval and fill , fill_type = ["NULL","value,100","prev","next","linear"]
|
||||
|
||||
# interval (10s) and time range is outer records
|
||||
# interval (10s) and time range is outer records
|
||||
|
||||
tdSql.query("select elapsed(ts,10s)*10 from stable_empty where ts >= '2015-01-01 00:00:00.000' and ts <'2015-01-01 00:10:00.000' interval(10s) fill(prev) group by tbname;")
|
||||
tdSql.checkRows(0)
|
||||
|
@ -552,8 +552,8 @@ class TDTestCase:
|
|||
tdSql.checkData(59,1,2)
|
||||
tdSql.checkData(60,1,10)
|
||||
tdSql.checkData(61,1,10)
|
||||
|
||||
# interval (20s) and time range is outer records
|
||||
|
||||
# interval (20s) and time range is outer records
|
||||
tdSql.query("select elapsed(ts,10s)*10 from stable_1 where ts >= '2015-01-01 00:00:00.000' and ts <'2015-01-01 00:10:00.000' interval(20s) fill(prev) group by tbname,ind ;")
|
||||
tdSql.checkRows(90)
|
||||
tdSql.checkData(0,1,20)
|
||||
|
@ -562,7 +562,7 @@ class TDTestCase:
|
|||
tdSql.checkData(29,1,10)
|
||||
tdSql.checkData(30,1,20)
|
||||
tdSql.checkData(31,1,20)
|
||||
|
||||
|
||||
tdSql.query("select elapsed(ts,10s)*10 from stable_1 where ts >= '2015-01-01 00:00:00.000' and ts <'2015-01-01 00:10:00.000' interval(20s) fill(next) group by tbname,ind ;")
|
||||
tdSql.checkRows(90)
|
||||
tdSql.checkData(0,1,20)
|
||||
|
@ -589,7 +589,7 @@ class TDTestCase:
|
|||
tdSql.checkData(29,1,None)
|
||||
tdSql.checkData(30,1,20)
|
||||
tdSql.checkData(31,1,20)
|
||||
|
||||
|
||||
tdSql.query("select elapsed(ts,10s)*10 from stable_1 where ts >= '2015-01-01 00:00:00.000' and ts <'2015-01-01 00:10:00.000' interval(20s) fill(value ,2) group by tbname,ind ;")
|
||||
tdSql.checkRows(90)
|
||||
tdSql.checkData(0,1,20)
|
||||
|
@ -599,7 +599,7 @@ class TDTestCase:
|
|||
tdSql.checkData(30,1,20)
|
||||
tdSql.checkData(31,1,20)
|
||||
|
||||
# interval (20s) and time range is in records
|
||||
# interval (20s) and time range is in records
|
||||
|
||||
tdSql.query("select elapsed(ts,10s)*10 from stable_1 where ts >= '2015-01-01 00:00:00.000' and ts <'2015-01-01 00:01:00.000' interval(20s) fill(prev) group by tbname,ind ;")
|
||||
tdSql.checkRows(9)
|
||||
|
@ -689,7 +689,7 @@ class TDTestCase:
|
|||
tdSql.checkData(19,1,10)
|
||||
tdSql.checkData(20,1,20)
|
||||
tdSql.checkData(25,1,0)
|
||||
|
||||
|
||||
def query_mix_common(self):
|
||||
|
||||
tdLog.info (" ======================================elapsed mixup with common col, it will not support =======================================")
|
||||
|
@ -730,7 +730,7 @@ class TDTestCase:
|
|||
tdSql.checkData(0,0,data[0][index])
|
||||
|
||||
tdSql.query("select count(*),avg(q_int) , sum(q_double),stddev(q_float),LEASTSQUARES(q_int,0,1), elapsed(ts,10s) from stable_1 group by tbname; ")
|
||||
|
||||
|
||||
# Arithmetic with elapsed for common table
|
||||
|
||||
operators = ["+" ,"-" , "*" ,"/" ,"%"]
|
||||
|
@ -743,9 +743,9 @@ class TDTestCase:
|
|||
sql_common= "select "
|
||||
|
||||
for index , query in enumerate(querys_oper):
|
||||
|
||||
|
||||
query_data = tdSql.getResult("select %s from sub_table1_1;"%query)
|
||||
|
||||
|
||||
query_datas.append(query_data[0][0])
|
||||
sql_common += " %s %s " %(query,operator)
|
||||
sql_common=sql_common[:-2] + " from sub_table1_1;"
|
||||
|
@ -753,7 +753,7 @@ class TDTestCase:
|
|||
tdSql.query(sql_common)
|
||||
results= query_datas[0]
|
||||
if operator == "+":
|
||||
for data in query_datas[1:]:
|
||||
for data in query_datas[1:]:
|
||||
results += data
|
||||
tdSql.checkData(0,0,results)
|
||||
|
||||
|
@ -794,9 +794,9 @@ class TDTestCase:
|
|||
sql_common= "select "
|
||||
|
||||
for index , query in enumerate(querys_oper):
|
||||
|
||||
|
||||
query_data = tdSql.getResult("select %s from stable_1 group by tbname;"%query)
|
||||
|
||||
|
||||
query_datas.append(query_data[0][0])
|
||||
sql_common += " %s %s " %(query,operator)
|
||||
sql_common=sql_common[:-2] + " from stable_1 group by tbname;"
|
||||
|
@ -804,7 +804,7 @@ class TDTestCase:
|
|||
tdSql.query(sql_common)
|
||||
results= query_datas[0]
|
||||
if operator == "+":
|
||||
for data in query_datas[1:]:
|
||||
for data in query_datas[1:]:
|
||||
results += data
|
||||
tdSql.checkData(0,0,results)
|
||||
tdSql.checkData(1,0,results)
|
||||
|
@ -849,9 +849,9 @@ class TDTestCase:
|
|||
|
||||
querys = ["max(q_int)","min(q_int)" , "first(q_tinyint)", "first(*)","last(q_int)","last(*)","PERCENTILE(q_int,10)","APERCENTILE(q_int,10)","elapsed(ts,10s)"]
|
||||
|
||||
|
||||
|
||||
querys_mix = ["max(q_int)","min(q_int)" , "first(q_tinyint)", "first(q_int)","last(q_int)","PERCENTILE(q_int,10)","APERCENTILE(q_int,10)","elapsed(ts,10s)"]
|
||||
|
||||
|
||||
tdSql.query("select max(q_int),min(q_int) , first(q_tinyint), first(q_int),last(q_int),PERCENTILE(q_int,10),APERCENTILE(q_int,10) ,elapsed(ts,10s) from sub_table1_1 ; ")
|
||||
|
||||
data = tdSql.getResult("select max(q_int),min(q_int) , first(q_tinyint), first(q_int),last(q_int),PERCENTILE(q_int,10),APERCENTILE(q_int,10) ,elapsed(ts,10s) from sub_table1_1 ; ")
|
||||
|
@ -873,7 +873,7 @@ class TDTestCase:
|
|||
tdSql.checkData(0,0,data[0][index])
|
||||
tdSql.checkData(1,0,data[0][index])
|
||||
tdSql.checkData(2,0,data[0][index])
|
||||
|
||||
|
||||
operators = ["+" ,"-" , "*" ,"/" ,"%"]
|
||||
querys_oper = querys_mix
|
||||
|
||||
|
@ -884,9 +884,9 @@ class TDTestCase:
|
|||
sql_common= "select "
|
||||
|
||||
for index , query in enumerate(querys_oper):
|
||||
|
||||
|
||||
query_data = tdSql.getResult("select %s from sub_table1_1;"%query)
|
||||
|
||||
|
||||
query_datas.append(query_data[0][0])
|
||||
sql_common += " %s %s " %(query,operator)
|
||||
sql_common=sql_common[:-2] + " from sub_table1_1;"
|
||||
|
@ -935,9 +935,9 @@ class TDTestCase:
|
|||
sql_common= "select "
|
||||
|
||||
for index , query in enumerate(querys_oper):
|
||||
|
||||
|
||||
query_data = tdSql.getResult("select %s from stable_1 group by tbname;"%query)
|
||||
|
||||
|
||||
query_datas.append(query_data[0][0])
|
||||
sql_common += " %s %s " %(query,operator)
|
||||
sql_common=sql_common[:-2] + " from stable_1 group by tbname;"
|
||||
|
@ -945,7 +945,7 @@ class TDTestCase:
|
|||
tdSql.query(sql_common)
|
||||
results= query_datas[0]
|
||||
if operator == "+":
|
||||
for data in query_datas[1:]:
|
||||
for data in query_datas[1:]:
|
||||
results += data
|
||||
tdSql.checkData(0,0,results)
|
||||
tdSql.checkData(1,0,results)
|
||||
|
@ -983,7 +983,7 @@ class TDTestCase:
|
|||
tdSql.checkData(0,0,results)
|
||||
tdSql.checkData(1,0,results)
|
||||
tdSql.checkData(2,0,results)
|
||||
|
||||
|
||||
def query_mix_compute(self):
|
||||
|
||||
tdLog.info (" ====================================== elapsed mixup with compute function =================================================")
|
||||
|
@ -1000,8 +1000,8 @@ class TDTestCase:
|
|||
continue
|
||||
tdSql.query(sql1)
|
||||
tdSql.query(sql2)
|
||||
|
||||
# only support mixup with spread
|
||||
|
||||
# only support mixup with spread
|
||||
|
||||
sql = "select spread(ts)*10,spread(q_tinyint)-10,elapsed(ts,10s) from sub_table1_1 where ts>=\"2015-01-01 00:00:00.000\" and ts < \"2015-01-01 00:10:00.000\" ;"
|
||||
tdSql.execute(sql)
|
||||
|
@ -1016,7 +1016,7 @@ class TDTestCase:
|
|||
for index , query in enumerate(querys_mix):
|
||||
sql = "select %s from sub_table1_1 where ts>=\"2015-01-01 00:00:00.000\" and ts < \"2015-01-01 00:10:00.000\" ; " %(query)
|
||||
tdSql.query(sql)
|
||||
|
||||
|
||||
operators = ["+" ,"-" , "*" ,"/" ,"%"]
|
||||
querys_oper = querys_mix
|
||||
|
||||
|
@ -1025,7 +1025,7 @@ class TDTestCase:
|
|||
sql_common= "select "
|
||||
|
||||
for index , query in enumerate(querys_oper):
|
||||
|
||||
|
||||
sql_common += " %s %s " %(query,operator)
|
||||
sql_common=sql_common[:-2] + " from stable_1 where ts>=\"2015-01-01 00:00:00.000\" and ts < \"2015-01-01 00:10:00.000\" ;"
|
||||
|
||||
|
@ -1034,7 +1034,7 @@ class TDTestCase:
|
|||
for index , query in enumerate(querys_mix):
|
||||
sql = "select %s from stable_1 where ts>=\"2015-01-01 00:00:00.000\" and ts < \"2015-01-01 00:10:00.000\" ; " %(query)
|
||||
tdSql.query(sql)
|
||||
|
||||
|
||||
operators = ["+" ,"-" , "*" ,"/" ,"%"]
|
||||
querys_oper = querys_mix
|
||||
|
||||
|
@ -1043,21 +1043,21 @@ class TDTestCase:
|
|||
sql_common= "select "
|
||||
|
||||
for index , query in enumerate(querys_oper):
|
||||
|
||||
|
||||
sql_common += " %s %s " %(query,operator)
|
||||
sql_common=sql_common[:-2] + " from stable_1 where ts>=\"2015-01-01 00:00:00.000\" and ts < \"2015-01-01 00:10:00.000\" ;"
|
||||
|
||||
tdSql.query(sql_common)
|
||||
|
||||
|
||||
def query_mix_arithmetic(self):
|
||||
|
||||
|
||||
tdLog.info (" ====================================== elapsed mixup with arithmetic =================================================")
|
||||
|
||||
|
||||
tdSql.execute("select elapsed(ts,10s)+1 ,elapsed(ts,10s)-2,elapsed(ts,10s)*3,elapsed(ts,10s)/4,elapsed(ts,10s)%5 from sub_table1_1 where ts>=\"2015-01-01 00:00:00.000\" and ts < \"2015-01-01 00:10:00.000\" ; ")
|
||||
tdSql.execute("select elapsed(ts,10s)+1 ,elapsed(ts,10s)-2,elapsed(ts,10s)*3,elapsed(ts,10s)/4,elapsed(ts,10s)%5 from stable_1 where ts>=\"2015-01-01 00:00:00.000\" and ts < \"2015-01-01 00:10:00.000\" ; ")
|
||||
|
||||
|
||||
# queries = ["elapsed(ts,10s)+1" ,"elapsed(ts,10s)-2","elapsed(ts,10s)*3","elapsed(ts,10s)/4","elapsed(ts,10s)%5" ]
|
||||
|
||||
|
||||
# for index ,query in enumerate(queries):
|
||||
# sql = "select %s from sub_table1_1 where ts>=\"2015-01-01 00:00:00.000\" and ts < \"2015-01-01 00:10:00.000\" interval(1s) fill(prev) ;" % (query)
|
||||
# data = tdSql.getResult(sql)
|
||||
|
@ -1067,7 +1067,7 @@ class TDTestCase:
|
|||
def query_with_join(self):
|
||||
|
||||
tdLog.info (" ====================================== elapsed mixup with join =================================================")
|
||||
|
||||
|
||||
tdSql.error("select elapsed(ts,10s) from stable_empty TABLE1 , stable_empty TABLE2 where TABLE1.ts =TABLE2.ts; ")
|
||||
tdSql.error("select elapsed(ts,10s) from stable_empty TABLE1 , stable_empty TABLE2 where TABLE1.ts =TABLE2.ts group by tbname; ")
|
||||
|
||||
|
@ -1102,7 +1102,7 @@ class TDTestCase:
|
|||
|
||||
tdLog.info (" ====================================== elapsed mixup with union all =================================================")
|
||||
|
||||
# union all with empty
|
||||
# union all with empty
|
||||
|
||||
tdSql.query("select elapsed(ts,10s) from regular_table_1 union all select elapsed(ts,10s) from regular_table_2;")
|
||||
|
||||
|
@ -1117,7 +1117,7 @@ class TDTestCase:
|
|||
tdSql.checkRows(600)
|
||||
tdSql.checkData(0,1,0.1)
|
||||
tdSql.checkData(500,0,0)
|
||||
|
||||
|
||||
tdSql.query('select elapsed(ts,10s) from sub_empty_1 union all select elapsed(ts,10s) from sub_empty_2;')
|
||||
tdSql.checkRows(0)
|
||||
|
||||
|
@ -1149,11 +1149,11 @@ class TDTestCase:
|
|||
tdSql.checkRows(0)
|
||||
|
||||
tdSql.error('select elapsed(ts,10s) from sub_empty_1 union all select elapsed(ts,10s) from stable_empty group by tbname;')
|
||||
|
||||
|
||||
tdSql.error('select elapsed(ts,10s) from sub_empty_1 interval(1s) union all select elapsed(ts,10s) from stable_empty interval(1s) group by tbname;')
|
||||
|
||||
|
||||
# tdSql.error('select elapsed(ts,10s) from sub_empty_1 where ts>="2015-01-01 00:00:00.000" and ts < "2015-01-01 00:10:00.000" interval(1s) fill(prev) union all select elapsed(ts,10s) from stable_empty where ts>="2015-01-01 00:00:00.000" and ts < "2015-01-01 00:10:00.000" interval(1s) fill(prev) group by tbname;')
|
||||
|
||||
|
||||
tdSql.query("select elapsed(ts,10s) from stable_empty group by tbname union all select elapsed(ts,10s) from stable_empty group by tbname ;")
|
||||
tdSql.checkRows(0)
|
||||
|
||||
|
@ -1176,7 +1176,7 @@ class TDTestCase:
|
|||
tdSql.checkRows(360)
|
||||
tdSql.checkData(0,1,1)
|
||||
tdSql.checkData(50,1,0)
|
||||
|
||||
|
||||
#case : TD-12229
|
||||
tdSql.query('select elapsed(ts,10s) from stable_empty group by tbname union all select elapsed(ts,10s) from stable_2 group by tbname ;')
|
||||
tdSql.checkRows(3)
|
||||
|
@ -1195,7 +1195,7 @@ class TDTestCase:
|
|||
|
||||
# union all with sub table and regular table
|
||||
|
||||
# sub_table with sub_table
|
||||
# sub_table with sub_table
|
||||
|
||||
tdSql.query('select elapsed(ts,10s) from sub_table1_1 where ts>="2015-01-01 00:00:00.000" and ts < "2015-01-01 00:10:00.000" interval(10s) fill(prev) union all\
|
||||
select elapsed(ts,10s) from sub_table2_2 where ts>="2015-01-01 00:00:00.000" and ts < "2015-01-01 00:10:00.000" interval(10s) fill(prev) ;')
|
||||
|
@ -1232,7 +1232,7 @@ class TDTestCase:
|
|||
tdSql.checkRows(120)
|
||||
tdSql.checkData(0,1,1)
|
||||
tdSql.checkData(12,1,0)
|
||||
|
||||
|
||||
tdSql.query('select elapsed(ts,10s) from sub_empty_1 where ts>="2015-01-01 00:00:00.000" and ts < "2015-01-01 00:10:00.000" interval(10s) fill(prev) union all\
|
||||
select elapsed(ts,10s) from regular_table_2 where ts>="2015-01-01 00:00:00.000" and ts < "2015-01-01 00:10:00.000" interval(10s) fill(prev) ;')
|
||||
tdSql.checkRows(60)
|
||||
|
@ -1245,7 +1245,7 @@ class TDTestCase:
|
|||
tdSql.checkData(0,1,1)
|
||||
tdSql.checkData(12,1,0)
|
||||
|
||||
# stable with stable
|
||||
# stable with stable
|
||||
|
||||
tdSql.query('select elapsed(ts,10s) from stable_1 where ts>="2015-01-01 00:00:00.000" and ts < "2015-01-01 00:10:00.000" interval(10s) fill(prev) group by tbname union all\
|
||||
select elapsed(ts,10s) from stable_1 where ts>="2015-01-01 00:00:00.000" and ts < "2015-01-01 00:10:00.000" interval(10s) fill(prev) group by tbname;')
|
||||
|
@ -1300,23 +1300,23 @@ class TDTestCase:
|
|||
tdLog.info (" ====================================== elapsed query for nest =================================================")
|
||||
|
||||
# ===============================================outer nest============================================
|
||||
|
||||
|
||||
# regular table
|
||||
|
||||
# ts can't be used at outer query
|
||||
|
||||
tdSql.query("select elapsed(ts,10s) from (select ts from regular_table_1 );")
|
||||
|
||||
# case : TD-12164
|
||||
# case : TD-12164
|
||||
|
||||
tdSql.error("select elapsed(ts,10s) from (select qint ts from regular_table_1 );")
|
||||
tdSql.error("select elapsed(tbname ,10s) from (select qint tbname from regular_table_1 );")
|
||||
tdSql.error("select elapsed(tsc ,1s) from (select q_int tsc from regular_table_1) ;")
|
||||
tdSql.error("select elapsed(tsv ,1s) from (select elapsed(ts,1s) tsv from regular_table_1);")
|
||||
tdSql.error("select elapsed(ts ,1s) from (select elapsed(ts,1s) ts from regular_table_1);")
|
||||
# # bug fix
|
||||
# # bug fix
|
||||
# tdSql.error("select elapsed(tsc ,1s) from (select tscol tsc from regular_table_1) ;")
|
||||
|
||||
|
||||
# case TD-12276
|
||||
# tdSql.error("select elapsed(ts,10s) from (select ts,tbname from regular_table_1 order by ts asc );")
|
||||
|
||||
|
@ -1333,11 +1333,11 @@ class TDTestCase:
|
|||
# tdSql.error("select elapsed(ts,10s) from (select ts ,max(q_int),tbname from sub_table1_1 order by ts ) interval(1s);")
|
||||
|
||||
# tdSql.error("select elapsed(ts,10s) from (select ts ,q_int,tbname from sub_table1_1 order by ts ) interval(1s);")
|
||||
|
||||
|
||||
tdSql.query("select elapsed(ts,10s) from (select ts ,tbname,top(q_int,3) from sub_table1_1 ) interval(10s);")
|
||||
|
||||
|
||||
tdSql.query("select elapsed(ts,10s) from (select ts ,tbname,bottom(q_int,3) from sub_table1_1 ) interval(10s);")
|
||||
|
||||
|
||||
tdSql.query("select elapsed(ts,10s) from (select ts ,tbname from sub_table1_1 ) interval(10s);")
|
||||
|
||||
tdSql.query("select elapsed(ts,10s) from (select ts ,tbname from sub_table1_1 ) interval(10s);")
|
||||
|
@ -1345,7 +1345,7 @@ class TDTestCase:
|
|||
# tdSql.error("select elapsed(ts,10s) from (select ts ,count(*),tbname from sub_table1_1 order by ts ) interval(1s);")
|
||||
|
||||
querys = ["count(*)","avg(q_int)", "sum(q_double)","stddev(q_float)","LEASTSQUARES(q_int,0,1)","elapsed(ts,10s)"]
|
||||
|
||||
|
||||
for query in querys:
|
||||
sql1 = "select elapsed(ts,10s) from (select %s from regular_table_1 order by ts ) interval(1s); " % query
|
||||
sql2 = "select elapsed(ts,10s) from (select ts , tbname ,%s from regular_table_1 order by ts ) interval(1s); " % query
|
||||
|
@ -1359,16 +1359,16 @@ class TDTestCase:
|
|||
tdSql.error(sql4)
|
||||
tdSql.error(sql5)
|
||||
|
||||
|
||||
|
||||
# case TD-12164
|
||||
tdSql.error( "select elapsed(ts00 ,1s) from (select elapsed(ts,1s) ts00 from regular_table_1) ; " )
|
||||
tdSql.error( "select elapsed(ts ,1s) from (select elapsed(ts,1s) ts from regular_table_1) ; " )
|
||||
|
||||
|
||||
tdSql.error( "select elapsed(ts00 ,1s) from (select elapsed(ts,1s) ts00 from stable_1 group by tbname ) ; " )
|
||||
tdSql.error( "select elapsed(ts ,1s) from (select elapsed(ts,1s) ts from stable_1 group by tbname) ; " )
|
||||
|
||||
|
||||
# stable
|
||||
# stable
|
||||
|
||||
tdSql.error("select elapsed(ts,10s) from (select ts from stable_1 ) group by tbname ;")
|
||||
|
||||
|
@ -1376,7 +1376,7 @@ class TDTestCase:
|
|||
|
||||
tdSql.error("select elapsed(ts,10s) from (select ts ,q_int,tbname from stable_1 order by ts ) interval(1s) group by tbname;")
|
||||
|
||||
# mixup with aggregate
|
||||
# mixup with aggregate
|
||||
|
||||
querys = ["max(q_int)","min(q_int)" , "first(q_tinyint)", "first(*)","last(q_int)","last(*)","top(q_double,1)",
|
||||
"bottom(q_float,1)","PERCENTILE(q_int,10)","APERCENTILE(q_int,10)" ,"elapsed(ts,10s)"]
|
||||
|
@ -1387,7 +1387,7 @@ class TDTestCase:
|
|||
sql2 = "select elapsed(ts,10s) from (select %s from stable_1 ) where ts>=\"2015-01-01 00:00:00.000\" and ts < \"2015-01-01 00:10:00.000\" interval(10s) fill(prev) group by tbname; " %(query)
|
||||
sql3 = "select elapsed(ts,10s) from (select %s from stable_1 group by tbname) where ts>=\"2015-01-01 00:00:00.000\" and ts < \"2015-01-01 00:10:00.000\" interval(10s) fill(prev) group by tbname; " %(query)
|
||||
|
||||
if query in ["interp(q_int)" ]:
|
||||
if query in ["interp(q_int)" ]:
|
||||
# print(sql1 )
|
||||
# print(sql2)
|
||||
tdSql.query(sql1)
|
||||
|
@ -1444,7 +1444,7 @@ class TDTestCase:
|
|||
# tdSql.query("select spread(data) from (select count(*),avg(q_int) , sum(q_double),stddev(q_float),LEASTSQUARES(q_int,0,1), elapsed(ts,10s) data from regular_table_3 \
|
||||
# where ts>=\"2015-01-01 00:00:00.000\" and ts < \"2015-01-01 00:10:00.000\" interval(1s) fill(prev)); ")
|
||||
# tdSql.checkRows(1)
|
||||
|
||||
|
||||
# tdSql.query("select diff(data) from (select count(*),avg(q_int) , sum(q_double),stddev(q_float),LEASTSQUARES(q_int,0,1), elapsed(ts,10s) data from regular_table_3 \
|
||||
# where ts>=\"2015-01-01 00:00:00.000\" and ts < \"2015-01-01 00:10:00.000\" interval(1s) fill(prev)); ")
|
||||
# tdSql.checkRows(599)
|
||||
|
@ -1474,8 +1474,8 @@ class TDTestCase:
|
|||
# tdSql.checkRows(600)
|
||||
|
||||
def query_session_windows(self):
|
||||
|
||||
# case TD-12344
|
||||
|
||||
# case TD-12344
|
||||
# session not support stable
|
||||
tdSql.error('select elapsed(ts,10s) from stable_1 where ts>="2015-01-01 00:00:00.000" and ts < "2015-01-01 00:10:00.000" session(ts ,10s) group by tbname,ind order by ts asc ')
|
||||
|
||||
|
@ -1488,10 +1488,9 @@ class TDTestCase:
|
|||
|
||||
tdSql.query('select elapsed(ts,10s) from ( select * from sub_table1_1 where ts>="2015-01-01 00:00:00.000" and ts < "2015-01-01 00:10:00.000") session(ts,1w) ; ')
|
||||
|
||||
tdSql.query('select elapsed(ts,10s) from ( select ts ,q_int from sub_table1_1 where ts>="2015-01-01 00:00:00.000" and ts < "2015-01-01 00:10:00.000") session(ts,1w) ; ')
|
||||
|
||||
tdSql.error('select elapsed(ts,10s) from ( select ts ,q_int from sub_table1_1 where ts>="2015-01-01 00:00:00.000" and ts < "2015-01-01 00:10:00.000") session(ts,1w) ; ')
|
||||
tdSql.error('select elapsed(ts,10s) from sub_table1_1 where ts>="2015-01-01 00:00:00.000" and ts < "2015-01-01 00:10:00.000" interval(20s) fill (next) session(ts,1w) ; ')
|
||||
|
||||
|
||||
tdSql.query('select elapsed(ts,10s) from sub_empty_1 where ts>="2015-01-01 00:00:00.000" and ts < "2015-01-01 00:10:00.000" session(ts,1w) ; ')
|
||||
tdSql.checkRows(0)
|
||||
|
||||
|
@ -1512,25 +1511,25 @@ class TDTestCase:
|
|||
# tdSql.error('select elapsed(ts,10s) from ( select ts ,q_int from sub_table1_1 where ts>="2015-01-01 00:00:00.000" and ts < "2015-01-01 00:10:00.000") state_window(q_int) ; ')
|
||||
|
||||
# tdSql.error('select elapsed(ts,10s) from sub_table1_1 where ts>="2015-01-01 00:00:00.000" and ts < "2015-01-01 00:10:00.000" interval(20s) fill (next) state_window(q_int) ; ')
|
||||
|
||||
|
||||
# tdSql.query('select elapsed(ts,10s) from sub_empty_1 where ts>="2015-01-01 00:00:00.000" and ts < "2015-01-01 00:10:00.000" state_window(q_int); ')
|
||||
# tdSql.checkRows(0)
|
||||
|
||||
|
||||
|
||||
def continuous_query(self):
|
||||
tdSql.error('create table elapsed_t as select elapsed(ts) from sub_table1_1 interval(1m) sliding(30s);')
|
||||
tdSql.error('create table elapsed_tb as select elapsed(ts) from stable_1 interval(1m) sliding(30s) group by tbname;')
|
||||
tdSql.error('create table elapsed_tc as select elapsed(ts) from stable_1 interval(10s) sliding(5s) interval(1m) sliding(30s) group by tbname;')
|
||||
|
||||
|
||||
def query_precision(self):
|
||||
def generate_data(precision="ms"):
|
||||
|
||||
|
||||
tdSql.execute("create database if not exists db_%s precision '%s';" %(precision, precision))
|
||||
tdSql.execute("use db_%s;" %precision)
|
||||
tdSql.execute("create stable db_%s.st (ts timestamp , id int) tags(ind int);"%precision)
|
||||
tdSql.execute("create table db_%s.tb1 using st tags(1);"%precision)
|
||||
tdSql.execute("create table db_%s.tb2 using st tags(2);"%precision)
|
||||
|
||||
|
||||
if precision == "ms":
|
||||
start_ts = self.ts
|
||||
step = 10000
|
||||
|
@ -1594,7 +1593,7 @@ class TDTestCase:
|
|||
self.query_session_windows()
|
||||
self.continuous_query()
|
||||
self.query_precision()
|
||||
|
||||
|
||||
def stop(self):
|
||||
tdSql.close()
|
||||
tdLog.success("%s successfully executed" % __file__)
|
||||
|
|
|
@ -18,7 +18,7 @@ class TDTestCase:
|
|||
def init(self, conn, logSql):
|
||||
tdLog.debug(f"start to excute {__file__}")
|
||||
tdSql.init(conn.cursor())
|
||||
|
||||
|
||||
def prepare_datas(self):
|
||||
tdSql.execute(
|
||||
'''create table stb1
|
||||
|
@ -26,7 +26,7 @@ class TDTestCase:
|
|||
tags (t1 int)
|
||||
'''
|
||||
)
|
||||
|
||||
|
||||
tdSql.execute(
|
||||
'''
|
||||
create table t1
|
||||
|
@ -68,7 +68,7 @@ class TDTestCase:
|
|||
( '2023-02-21 01:01:01.000', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL )
|
||||
'''
|
||||
)
|
||||
|
||||
|
||||
def test_errors(self):
|
||||
error_sql_lists = [
|
||||
# "select stateduration(c1,'GT',5,1s) from t1"
|
||||
|
@ -110,35 +110,35 @@ class TDTestCase:
|
|||
for error_sql in error_sql_lists:
|
||||
tdSql.error(error_sql)
|
||||
pass
|
||||
|
||||
|
||||
def support_types(self):
|
||||
other_no_value_types = [
|
||||
"select stateduration(ts,'GT',1,1s) from t1" ,
|
||||
"select stateduration(ts,'GT',1,1s) from t1" ,
|
||||
"select stateduration(c7,'GT',1,1s) from t1",
|
||||
"select stateduration(c8,'GT',1,1s) from t1",
|
||||
"select stateduration(c9,'GT',1,1s) from t1",
|
||||
"select stateduration(ts,'GT',1,1s) from ct1" ,
|
||||
"select stateduration(ts,'GT',1,1s) from ct1" ,
|
||||
"select stateduration(c7,'GT',1,1s) from ct1",
|
||||
"select stateduration(c8,'GT',1,1s) from ct1",
|
||||
"select stateduration(c9,'GT',1,1s) from ct1",
|
||||
"select stateduration(ts,'GT',1,1s) from ct3" ,
|
||||
"select stateduration(ts,'GT',1,1s) from ct3" ,
|
||||
"select stateduration(c7,'GT',1,1s) from ct3",
|
||||
"select stateduration(c8,'GT',1,1s) from ct3",
|
||||
"select stateduration(c9,'GT',1,1s) from ct3",
|
||||
"select stateduration(ts,'GT',1,1s) from ct4" ,
|
||||
"select stateduration(ts,'GT',1,1s) from ct4" ,
|
||||
"select stateduration(c7,'GT',1,1s) from ct4",
|
||||
"select stateduration(c8,'GT',1,1s) from ct4",
|
||||
"select stateduration(c9,'GT',1,1s) from ct4",
|
||||
"select stateduration(ts,'GT',1,1s) from stb1 partition by tbname" ,
|
||||
"select stateduration(ts,'GT',1,1s) from stb1 partition by tbname" ,
|
||||
"select stateduration(c7,'GT',1,1s) from stb1 partition by tbname",
|
||||
"select stateduration(c8,'GT',1,1s) from stb1 partition by tbname",
|
||||
"select stateduration(c9,'GT',1,1s) from stb1 partition by tbname"
|
||||
"select stateduration(c9,'GT',1,1s) from stb1 partition by tbname"
|
||||
]
|
||||
|
||||
|
||||
for type_sql in other_no_value_types:
|
||||
tdSql.error(type_sql)
|
||||
tdLog.info("support type ok , sql is : %s"%type_sql)
|
||||
|
||||
|
||||
type_sql_lists = [
|
||||
"select stateduration(c1,'GT',1,1s) from t1",
|
||||
"select stateduration(c2,'GT',1,1s) from t1",
|
||||
|
@ -168,8 +168,8 @@ class TDTestCase:
|
|||
"select stateduration(c5,'GT',1,1s) from stb1 partition by tbname",
|
||||
"select stateduration(c6,'GT',1,1s) from stb1 partition by tbname",
|
||||
|
||||
"select stateduration(c6,'GT',1,1s) as alisb from stb1 partition by tbname",
|
||||
"select stateduration(c6,'GT',1,1s) alisb from stb1 partition by tbname",
|
||||
"select stateduration(c6,'GT',1,1s) as alisb from stb1 partition by tbname",
|
||||
"select stateduration(c6,'GT',1,1s) alisb from stb1 partition by tbname",
|
||||
]
|
||||
|
||||
for type_sql in type_sql_lists:
|
||||
|
@ -177,7 +177,7 @@ class TDTestCase:
|
|||
|
||||
def support_opers(self):
|
||||
oper_lists = ['LT','lt','Lt','lT','GT','gt','Gt','gT','LE','le','Le','lE','GE','ge','Ge','gE','NE','ne','Ne','nE','EQ','eq','Eq','eQ']
|
||||
|
||||
|
||||
oper_errors = [",","*","NULL","tbname","ts","sum","_c0"]
|
||||
|
||||
for oper in oper_lists:
|
||||
|
@ -190,7 +190,7 @@ class TDTestCase:
|
|||
|
||||
def basic_stateduration_function(self):
|
||||
|
||||
# basic query
|
||||
# basic query
|
||||
tdSql.query("select c1 from ct3")
|
||||
tdSql.checkRows(0)
|
||||
tdSql.query("select c1 from t1")
|
||||
|
@ -211,9 +211,9 @@ class TDTestCase:
|
|||
tdSql.checkRows(0)
|
||||
tdSql.query("select stateduration(c6,'GT',1,1s) from ct3")
|
||||
|
||||
# will support _rowts mix with
|
||||
# will support _rowts mix with
|
||||
# tdSql.query("select (c6,'GT',1,1s),_rowts from ct3")
|
||||
|
||||
|
||||
# auto check for t1 table
|
||||
# used for regular table
|
||||
tdSql.query("select stateduration(c6,'GT',1,1s) from t1")
|
||||
|
@ -229,17 +229,17 @@ class TDTestCase:
|
|||
tdSql.error("select stateduration(c6,'GT',1,1s),tbname from ct1")
|
||||
tdSql.error("select stateduration(c6,'GT',1,1s),t1 from ct1")
|
||||
|
||||
# unique with common col
|
||||
# unique with common col
|
||||
tdSql.error("select stateduration(c6,'GT',1,1s) ,ts from ct1")
|
||||
tdSql.error("select stateduration(c6,'GT',1,1s) ,c1 from ct1")
|
||||
|
||||
# unique with scalar function
|
||||
# unique with scalar function
|
||||
tdSql.error("select stateduration(c6,'GT',1,1s) ,abs(c1) from ct1")
|
||||
tdSql.error("select stateduration(c6,'GT',1,1s) , unique(c2) from ct1")
|
||||
tdSql.error("select stateduration(c6,'GT',1,1s) , abs(c2)+2 from ct1")
|
||||
|
||||
|
||||
# unique with aggregate function
|
||||
|
||||
# unique with aggregate function
|
||||
tdSql.error("select stateduration(c6,'GT',1,1s) ,sum(c1) from ct1")
|
||||
tdSql.error("select stateduration(c6,'GT',1,1s) ,max(c1) from ct1")
|
||||
tdSql.error("select stateduration(c6,'GT',1,1s) ,csum(c1) from ct1")
|
||||
|
@ -262,16 +262,16 @@ class TDTestCase:
|
|||
tdSql.checkData(0, 0, 0)
|
||||
tdSql.checkData(1, 0, 6134400)
|
||||
tdSql.checkData(6, 0, -1)
|
||||
|
||||
|
||||
# unique with union all
|
||||
|
||||
# unique with union all
|
||||
tdSql.query("select stateduration(c1,'GT',1,1s) from ct4 union all select stateduration(c1,'GT',1,1s) from ct1")
|
||||
tdSql.checkRows(25)
|
||||
tdSql.query("select stateduration(c1,'GT',1,1s) from ct4 union all select distinct(c1) from ct4")
|
||||
tdSql.checkRows(22)
|
||||
|
||||
# unique with join
|
||||
# prepare join datas with same ts
|
||||
# unique with join
|
||||
# prepare join datas with same ts
|
||||
|
||||
tdSql.execute(" use db ")
|
||||
tdSql.execute(" create stable st1 (ts timestamp , num int) tags(ind int)")
|
||||
|
@ -328,7 +328,7 @@ class TDTestCase:
|
|||
tdSql.checkRows(12)
|
||||
tdSql.query("select stateduration(c1+2 ,'GT',1,1s) from t1")
|
||||
tdSql.checkRows(12)
|
||||
|
||||
|
||||
|
||||
# bug for stable
|
||||
#partition by tbname
|
||||
|
@ -337,21 +337,20 @@ class TDTestCase:
|
|||
|
||||
# tdSql.query(" select unique(c1) from stb1 partition by tbname ")
|
||||
# tdSql.checkRows(21)
|
||||
|
||||
# group by
|
||||
|
||||
# group by
|
||||
tdSql.error("select stateduration(c1,'GT',1,1s) from ct1 group by c1")
|
||||
tdSql.error("select stateduration(c1,'GT',1,1s) from ct1 group by tbname")
|
||||
|
||||
# super table
|
||||
|
||||
|
||||
def check_unit_time(self):
|
||||
tdSql.execute(" use db ")
|
||||
tdSql.error("select stateduration(c1,'GT',1,1b) from ct1")
|
||||
tdSql.error("select stateduration(c1,'GT',1,1u) from ct1")
|
||||
tdSql.error("select stateduration(c1,'GT',1,1000s) from t1")
|
||||
tdSql.query("select stateduration(c1,'GT',1,1s) from t1")
|
||||
tdSql.checkData(10,0,63072035)
|
||||
tdSql.query("select stateduration(c1,'GT',1,1000s) from t1")
|
||||
tdSql.checkData(10,0,int(63072035/1000))
|
||||
tdSql.query("select stateduration(c1,'GT',1,1m) from t1")
|
||||
tdSql.checkData(10,0,int(63072035/60))
|
||||
tdSql.query("select stateduration(c1,'GT',1,1h) from t1")
|
||||
|
@ -360,8 +359,8 @@ class TDTestCase:
|
|||
tdSql.checkData(10,0,int(63072035/60/24/60))
|
||||
tdSql.query("select stateduration(c1,'GT',1,1w) from t1")
|
||||
tdSql.checkData(10,0,int(63072035/60/7/24/60))
|
||||
|
||||
|
||||
|
||||
|
||||
def check_boundary_values(self):
|
||||
|
||||
tdSql.execute("drop database if exists bound_test")
|
||||
|
|
|
@ -675,7 +675,7 @@ class TDTestCase:
|
|||
tdSql.checkRows(3)
|
||||
tdSql.query("select TO_UNIXTIMESTAMP(datastr) from jsons1 where jtag->'tag1'>1;")
|
||||
tdSql.checkRows(3)
|
||||
tdSql.query("select TIMETRUNCATE(ts,1u) from jsons1 where jtag->'tag1'>1;")
|
||||
tdSql.query("select TIMETRUNCATE(ts,1s) from jsons1 where jtag->'tag1'>1;")
|
||||
tdSql.checkRows(3)
|
||||
tdSql.query("select TIMEDIFF(ts,_c0) from jsons1 where jtag->'tag1'>1;")
|
||||
tdSql.checkRows(3)
|
||||
|
|
|
@ -18,7 +18,7 @@ class TDTestCase:
|
|||
def init(self, conn, logSql):
|
||||
tdLog.debug(f"start to excute {__file__}")
|
||||
tdSql.init(conn.cursor())
|
||||
|
||||
|
||||
def prepare_datas(self):
|
||||
tdSql.execute(
|
||||
'''create table stb1
|
||||
|
@ -26,7 +26,7 @@ class TDTestCase:
|
|||
tags (t1 int)
|
||||
'''
|
||||
)
|
||||
|
||||
|
||||
tdSql.execute(
|
||||
'''
|
||||
create table t1
|
||||
|
@ -68,7 +68,7 @@ class TDTestCase:
|
|||
( '2023-02-21 01:01:01.000', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL )
|
||||
'''
|
||||
)
|
||||
|
||||
|
||||
def test_errors(self):
|
||||
error_sql_lists = [
|
||||
# "select statecount(c1,'GT',5) from t1"
|
||||
|
@ -110,35 +110,35 @@ class TDTestCase:
|
|||
for error_sql in error_sql_lists:
|
||||
tdSql.error(error_sql)
|
||||
pass
|
||||
|
||||
|
||||
def support_types(self):
|
||||
other_no_value_types = [
|
||||
"select statecount(ts,'GT',1) from t1" ,
|
||||
"select statecount(ts,'GT',1) from t1" ,
|
||||
"select statecount(c7,'GT',1) from t1",
|
||||
"select statecount(c8,'GT',1) from t1",
|
||||
"select statecount(c9,'GT',1) from t1",
|
||||
"select statecount(ts,'GT',1) from ct1" ,
|
||||
"select statecount(ts,'GT',1) from ct1" ,
|
||||
"select statecount(c7,'GT',1) from ct1",
|
||||
"select statecount(c8,'GT',1) from ct1",
|
||||
"select statecount(c9,'GT',1) from ct1",
|
||||
"select statecount(ts,'GT',1) from ct3" ,
|
||||
"select statecount(ts,'GT',1) from ct3" ,
|
||||
"select statecount(c7,'GT',1) from ct3",
|
||||
"select statecount(c8,'GT',1) from ct3",
|
||||
"select statecount(c9,'GT',1) from ct3",
|
||||
"select statecount(ts,'GT',1) from ct4" ,
|
||||
"select statecount(ts,'GT',1) from ct4" ,
|
||||
"select statecount(c7,'GT',1) from ct4",
|
||||
"select statecount(c8,'GT',1) from ct4",
|
||||
"select statecount(c9,'GT',1) from ct4",
|
||||
"select statecount(ts,'GT',1) from stb1 partition by tbname" ,
|
||||
"select statecount(ts,'GT',1) from stb1 partition by tbname" ,
|
||||
"select statecount(c7,'GT',1) from stb1 partition by tbname",
|
||||
"select statecount(c8,'GT',1) from stb1 partition by tbname",
|
||||
"select statecount(c9,'GT',1) from stb1 partition by tbname"
|
||||
"select statecount(c9,'GT',1) from stb1 partition by tbname"
|
||||
]
|
||||
|
||||
|
||||
for type_sql in other_no_value_types:
|
||||
tdSql.error(type_sql)
|
||||
tdLog.info("support type ok , sql is : %s"%type_sql)
|
||||
|
||||
|
||||
type_sql_lists = [
|
||||
"select statecount(c1,'GT',1) from t1",
|
||||
"select statecount(c2,'GT',1) from t1",
|
||||
|
@ -168,8 +168,8 @@ class TDTestCase:
|
|||
"select statecount(c5,'GT',1) from stb1 partition by tbname",
|
||||
"select statecount(c6,'GT',1) from stb1 partition by tbname",
|
||||
|
||||
"select statecount(c6,'GT',1) as alisb from stb1 partition by tbname",
|
||||
"select statecount(c6,'GT',1) alisb from stb1 partition by tbname",
|
||||
"select statecount(c6,'GT',1) as alisb from stb1 partition by tbname",
|
||||
"select statecount(c6,'GT',1) alisb from stb1 partition by tbname",
|
||||
]
|
||||
|
||||
for type_sql in type_sql_lists:
|
||||
|
@ -177,7 +177,7 @@ class TDTestCase:
|
|||
|
||||
def support_opers(self):
|
||||
oper_lists = ['LT','lt','Lt','lT','GT','gt','Gt','gT','LE','le','Le','lE','GE','ge','Ge','gE','NE','ne','Ne','nE','EQ','eq','Eq','eQ']
|
||||
|
||||
|
||||
oper_errors = [",","*","NULL","tbname","ts","sum","_c0"]
|
||||
|
||||
for oper in oper_lists:
|
||||
|
@ -190,7 +190,7 @@ class TDTestCase:
|
|||
|
||||
def basic_statecount_function(self):
|
||||
|
||||
# basic query
|
||||
# basic query
|
||||
tdSql.query("select c1 from ct3")
|
||||
tdSql.checkRows(0)
|
||||
tdSql.query("select c1 from t1")
|
||||
|
@ -211,9 +211,9 @@ class TDTestCase:
|
|||
tdSql.checkRows(0)
|
||||
tdSql.query("select statecount(c6,'GT',1) from ct3")
|
||||
|
||||
# will support _rowts mix with
|
||||
# will support _rowts mix with
|
||||
# tdSql.query("select (c6,'GT',1),_rowts from ct3")
|
||||
|
||||
|
||||
# auto check for t1 table
|
||||
# used for regular table
|
||||
tdSql.query("select statecount(c6,'GT',1) from t1")
|
||||
|
@ -229,17 +229,17 @@ class TDTestCase:
|
|||
tdSql.error("select statecount(c6,'GT',1),tbname from ct1")
|
||||
tdSql.error("select statecount(c6,'GT',1),t1 from ct1")
|
||||
|
||||
# unique with common col
|
||||
# unique with common col
|
||||
tdSql.error("select statecount(c6,'GT',1) ,ts from ct1")
|
||||
tdSql.error("select statecount(c6,'GT',1) ,c1 from ct1")
|
||||
|
||||
# unique with scalar function
|
||||
# unique with scalar function
|
||||
tdSql.error("select statecount(c6,'GT',1) ,abs(c1) from ct1")
|
||||
tdSql.error("select statecount(c6,'GT',1) , unique(c2) from ct1")
|
||||
tdSql.error("select statecount(c6,'GT',1) , abs(c2)+2 from ct1")
|
||||
|
||||
|
||||
# unique with aggregate function
|
||||
|
||||
# unique with aggregate function
|
||||
tdSql.error("select statecount(c6,'GT',1) ,sum(c1) from ct1")
|
||||
tdSql.error("select statecount(c6,'GT',1) ,max(c1) from ct1")
|
||||
tdSql.error("select statecount(c6,'GT',1) ,csum(c1) from ct1")
|
||||
|
@ -262,16 +262,16 @@ class TDTestCase:
|
|||
tdSql.checkData(0, 0, 1)
|
||||
tdSql.checkData(1, 0, 2)
|
||||
tdSql.checkData(6, 0, -1)
|
||||
|
||||
|
||||
# unique with union all
|
||||
|
||||
# unique with union all
|
||||
tdSql.query("select statecount(c1,'GT',1) from ct4 union all select statecount(c1,'GT',1) from ct1")
|
||||
tdSql.checkRows(25)
|
||||
tdSql.query("select statecount(c1,'GT',1) from ct4 union all select distinct(c1) from ct4")
|
||||
tdSql.checkRows(22)
|
||||
|
||||
# unique with join
|
||||
# prepare join datas with same ts
|
||||
# unique with join
|
||||
# prepare join datas with same ts
|
||||
|
||||
tdSql.execute(" use db ")
|
||||
tdSql.execute(" create stable st1 (ts timestamp , num int) tags(ind int)")
|
||||
|
@ -323,7 +323,7 @@ class TDTestCase:
|
|||
tdSql.checkData(0, 0, None)
|
||||
tdSql.checkData(1, 0, 0.000000000)
|
||||
tdSql.checkData(3, 0, -1.000000000)
|
||||
|
||||
|
||||
|
||||
# bug for stable
|
||||
#partition by tbname
|
||||
|
@ -332,21 +332,20 @@ class TDTestCase:
|
|||
|
||||
# tdSql.query(" select unique(c1) from stb1 partition by tbname ")
|
||||
# tdSql.checkRows(21)
|
||||
|
||||
# group by
|
||||
|
||||
# group by
|
||||
tdSql.query("select statecount(c1,'GT',1) from ct1 group by c1")
|
||||
tdSql.error("select statecount(c1,'GT',1) from ct1 group by tbname")
|
||||
|
||||
# super table
|
||||
|
||||
|
||||
def check_unit_time(self):
|
||||
tdSql.execute(" use db ")
|
||||
tdSql.error("select stateduration(c1,'GT',1,1b) from ct1")
|
||||
tdSql.error("select stateduration(c1,'GT',1,1u) from ct1")
|
||||
tdSql.error("select stateduration(c1,'GT',1,1000s) from t1")
|
||||
tdSql.query("select stateduration(c1,'GT',1,1s) from t1")
|
||||
tdSql.checkData(10,0,63072035)
|
||||
tdSql.query("select stateduration(c1,'GT',1,1000s) from t1")
|
||||
tdSql.checkData(10,0,int(63072035/1000))
|
||||
tdSql.query("select stateduration(c1,'GT',1,1m) from t1")
|
||||
tdSql.checkData(10,0,int(63072035/60))
|
||||
tdSql.query("select stateduration(c1,'GT',1,1h) from t1")
|
||||
|
@ -355,8 +354,8 @@ class TDTestCase:
|
|||
tdSql.checkData(10,0,int(63072035/60/24/60))
|
||||
tdSql.query("select stateduration(c1,'GT',1,1w) from t1")
|
||||
tdSql.checkData(10,0,int(63072035/60/7/24/60))
|
||||
|
||||
|
||||
|
||||
|
||||
def check_boundary_values(self):
|
||||
|
||||
tdSql.execute("drop database if exists bound_test")
|
||||
|
@ -384,11 +383,11 @@ class TDTestCase:
|
|||
tdSql.execute(
|
||||
f"insert into sub1_bound values ( now(), -2147483643, -9223372036854775803, -32763, -123, -3.39E+38, -1.69e+308, True, 'binary_tb1', 'nchar_tb1', now() )"
|
||||
)
|
||||
|
||||
|
||||
tdSql.error(
|
||||
f"insert into sub1_bound values ( now()+1s, 2147483648, 9223372036854775808, 32768, 128, 3.40E+38, 1.7e+308, True, 'binary_tb1', 'nchar_tb1', now() )"
|
||||
)
|
||||
|
||||
|
||||
tdSql.query("select statecount(c1,'GT',1) from sub1_bound")
|
||||
tdSql.checkRows(5)
|
||||
|
||||
|
@ -396,29 +395,29 @@ class TDTestCase:
|
|||
tdSql.prepare()
|
||||
|
||||
tdLog.printNoPrefix("==========step1:create table ==============")
|
||||
|
||||
|
||||
self.prepare_datas()
|
||||
|
||||
tdLog.printNoPrefix("==========step2:test errors ==============")
|
||||
tdLog.printNoPrefix("==========step2:test errors ==============")
|
||||
|
||||
self.test_errors()
|
||||
|
||||
tdLog.printNoPrefix("==========step3:support types ============")
|
||||
|
||||
tdLog.printNoPrefix("==========step3:support types ============")
|
||||
|
||||
self.support_types()
|
||||
|
||||
tdLog.printNoPrefix("==========step4:support opers ============")
|
||||
tdLog.printNoPrefix("==========step4:support opers ============")
|
||||
self.support_opers()
|
||||
|
||||
tdLog.printNoPrefix("==========step5: statecount basic query ============")
|
||||
tdLog.printNoPrefix("==========step5: statecount basic query ============")
|
||||
|
||||
self.basic_statecount_function()
|
||||
|
||||
tdLog.printNoPrefix("==========step6: statecount boundary query ============")
|
||||
tdLog.printNoPrefix("==========step6: statecount boundary query ============")
|
||||
|
||||
self.check_boundary_values()
|
||||
|
||||
tdLog.printNoPrefix("==========step6: statecount unit time test ============")
|
||||
tdLog.printNoPrefix("==========step6: statecount unit time test ============")
|
||||
|
||||
self.check_unit_time()
|
||||
|
||||
|
|
|
@ -12,11 +12,11 @@ class TDTestCase:
|
|||
|
||||
self.rowNum = 10
|
||||
self.ts = 1537146000000 # 2018-9-17 09:00:00.000
|
||||
|
||||
|
||||
def run(self):
|
||||
tdSql.prepare()
|
||||
|
||||
intData = []
|
||||
intData = []
|
||||
floatData = []
|
||||
|
||||
tdSql.execute('''create table stb(ts timestamp, col1 tinyint, col2 smallint, col3 int, col4 bigint, col5 float, col6 double,
|
||||
|
@ -27,18 +27,18 @@ class TDTestCase:
|
|||
for i in range(self.rowNum):
|
||||
tdSql.execute("insert into ntb values(%d, %d, %d, %d, %d, %f, %f, %d, 'taosdata%d', '涛思数据%d', %d, %d, %d, %d)"
|
||||
% (self.ts + i, i + 1, i + 1, i + 1, i + 1, i + 0.1, i + 0.1, i % 2, i + 1, i + 1, i + 1, i + 1, i + 1, i + 1))
|
||||
intData.append(i + 1)
|
||||
intData.append(i + 1)
|
||||
floatData.append(i + 0.1)
|
||||
for i in range(self.rowNum):
|
||||
tdSql.execute("insert into stb_1 values(%d, %d, %d, %d, %d, %f, %f, %d, 'taosdata%d', '涛思数据%d', %d, %d, %d, %d)"
|
||||
% (self.ts + i, i + 1, i + 1, i + 1, i + 1, i + 0.1, i + 0.1, i % 2, i + 1, i + 1, i + 1, i + 1, i + 1, i + 1))
|
||||
intData.append(i + 1)
|
||||
floatData.append(i + 0.1)
|
||||
intData.append(i + 1)
|
||||
floatData.append(i + 0.1)
|
||||
|
||||
tdSql.query("select timetruncate(1,1d) from ntb")
|
||||
tdSql.checkRows(10)
|
||||
tdSql.query("select timetruncate(1,1u) from ntb")
|
||||
tdSql.checkRows(10)
|
||||
tdSql.error("select timetruncate(1,1u) from ntb")
|
||||
#tdSql.checkRows(10)
|
||||
tdSql.query("select timetruncate(1,1a) from ntb")
|
||||
tdSql.checkRows(10)
|
||||
tdSql.query("select timetruncate(1,1m) from ntb")
|
||||
|
@ -97,8 +97,8 @@ class TDTestCase:
|
|||
|
||||
tdSql.query("select timetruncate(1,1d) from stb")
|
||||
tdSql.checkRows(10)
|
||||
tdSql.query("select timetruncate(1,1u) from stb")
|
||||
tdSql.checkRows(10)
|
||||
tdSql.error("select timetruncate(1,1u) from stb")
|
||||
#tdSql.checkRows(10)
|
||||
tdSql.query("select timetruncate(1,1a) from stb")
|
||||
tdSql.checkRows(10)
|
||||
tdSql.query("select timetruncate(1,1m) from stb")
|
||||
|
@ -156,8 +156,8 @@ class TDTestCase:
|
|||
|
||||
tdSql.query("select timetruncate(1,1d) from stb_1")
|
||||
tdSql.checkRows(10)
|
||||
tdSql.query("select timetruncate(1,1u) from stb_1")
|
||||
tdSql.checkRows(10)
|
||||
tdSql.error("select timetruncate(1,1u) from stb_1")
|
||||
#tdSql.checkRows(10)
|
||||
tdSql.query("select timetruncate(1,1a) from stb_1")
|
||||
tdSql.checkRows(10)
|
||||
tdSql.query("select timetruncate(1,1m) from stb_1")
|
||||
|
@ -217,4 +217,4 @@ class TDTestCase:
|
|||
tdLog.success("%s successfully executed" % __file__)
|
||||
|
||||
tdCases.addWindows(__file__, TDTestCase())
|
||||
tdCases.addLinux(__file__, TDTestCase())
|
||||
tdCases.addLinux(__file__, TDTestCase())
|
||||
|
|
|
@ -89,7 +89,7 @@ python3 ./test.py -f 2-query/query_cols_tags_and_or.py
|
|||
# python3 ./test.py -f 2-query/nestedQuery_str.py
|
||||
|
||||
python3 ./test.py -f 2-query/avg.py
|
||||
python3 ./test.py -f 2-query/elapsed.py
|
||||
#python3 ./test.py -f 2-query/elapsed.py
|
||||
python3 ./test.py -f 2-query/csum.py
|
||||
python3 ./test.py -f 2-query/mavg.py
|
||||
python3 ./test.py -f 2-query/diff.py
|
||||
|
|
Loading…
Reference in New Issue