Merge pull request #18112 from taosdata/fix/TD-19892
fix(query): report error if certain function query stable has duplicate timestamps
This commit is contained in:
commit
49a3623f1a
|
@ -659,7 +659,11 @@ int32_t projectApplyFunctions(SExprInfo* pExpr, SSDataBlock* pResult, SSDataBloc
|
||||||
pfCtx->pDstBlock = pResult;
|
pfCtx->pDstBlock = pResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
numOfRows = pfCtx->fpSet.process(pfCtx);
|
int32_t code = pfCtx->fpSet.process(pfCtx);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
numOfRows = pResInfo->numOfRes;
|
||||||
} else if (fmIsAggFunc(pfCtx->functionId)) {
|
} else if (fmIsAggFunc(pfCtx->functionId)) {
|
||||||
// selective value output should be set during corresponding function execution
|
// selective value output should be set during corresponding function execution
|
||||||
if (fmIsSelectValueFunc(pfCtx->functionId)) {
|
if (fmIsSelectValueFunc(pfCtx->functionId)) {
|
||||||
|
|
|
@ -2640,8 +2640,8 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
|
||||||
{
|
{
|
||||||
.name = "diff",
|
.name = "diff",
|
||||||
.type = FUNCTION_TYPE_DIFF,
|
.type = FUNCTION_TYPE_DIFF,
|
||||||
.classification = FUNC_MGT_INDEFINITE_ROWS_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_KEEP_ORDER_FUNC |
|
.classification = FUNC_MGT_INDEFINITE_ROWS_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC |
|
||||||
FUNC_MGT_FORBID_STREAM_FUNC | FUNC_MGT_CUMULATIVE_FUNC,
|
FUNC_MGT_KEEP_ORDER_FUNC | FUNC_MGT_FORBID_STREAM_FUNC | FUNC_MGT_CUMULATIVE_FUNC,
|
||||||
.translateFunc = translateDiff,
|
.translateFunc = translateDiff,
|
||||||
.getEnvFunc = getDiffFuncEnv,
|
.getEnvFunc = getDiffFuncEnv,
|
||||||
.initFunc = diffFunctionSetup,
|
.initFunc = diffFunctionSetup,
|
||||||
|
@ -2653,7 +2653,8 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
|
||||||
{
|
{
|
||||||
.name = "statecount",
|
.name = "statecount",
|
||||||
.type = FUNCTION_TYPE_STATE_COUNT,
|
.type = FUNCTION_TYPE_STATE_COUNT,
|
||||||
.classification = FUNC_MGT_INDEFINITE_ROWS_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_FORBID_STREAM_FUNC,
|
.classification = FUNC_MGT_INDEFINITE_ROWS_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC |
|
||||||
|
FUNC_MGT_FORBID_STREAM_FUNC,
|
||||||
.translateFunc = translateStateCount,
|
.translateFunc = translateStateCount,
|
||||||
.getEnvFunc = getStateFuncEnv,
|
.getEnvFunc = getStateFuncEnv,
|
||||||
.initFunc = functionSetup,
|
.initFunc = functionSetup,
|
||||||
|
@ -2664,7 +2665,8 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
|
||||||
{
|
{
|
||||||
.name = "stateduration",
|
.name = "stateduration",
|
||||||
.type = FUNCTION_TYPE_STATE_DURATION,
|
.type = FUNCTION_TYPE_STATE_DURATION,
|
||||||
.classification = FUNC_MGT_INDEFINITE_ROWS_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC | FUNC_MGT_FORBID_STREAM_FUNC,
|
.classification = FUNC_MGT_INDEFINITE_ROWS_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC |
|
||||||
|
FUNC_MGT_FORBID_STREAM_FUNC,
|
||||||
.translateFunc = translateStateDuration,
|
.translateFunc = translateStateDuration,
|
||||||
.getEnvFunc = getStateFuncEnv,
|
.getEnvFunc = getStateFuncEnv,
|
||||||
.initFunc = functionSetup,
|
.initFunc = functionSetup,
|
||||||
|
@ -2675,7 +2677,7 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
|
||||||
{
|
{
|
||||||
.name = "csum",
|
.name = "csum",
|
||||||
.type = FUNCTION_TYPE_CSUM,
|
.type = FUNCTION_TYPE_CSUM,
|
||||||
.classification = FUNC_MGT_INDEFINITE_ROWS_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_TIMELINE_FUNC |
|
.classification = FUNC_MGT_INDEFINITE_ROWS_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC |
|
||||||
FUNC_MGT_FORBID_STREAM_FUNC | FUNC_MGT_CUMULATIVE_FUNC | FUNC_MGT_KEEP_ORDER_FUNC,
|
FUNC_MGT_FORBID_STREAM_FUNC | FUNC_MGT_CUMULATIVE_FUNC | FUNC_MGT_KEEP_ORDER_FUNC,
|
||||||
.translateFunc = translateCsum,
|
.translateFunc = translateCsum,
|
||||||
.getEnvFunc = getCsumFuncEnv,
|
.getEnvFunc = getCsumFuncEnv,
|
||||||
|
@ -2688,7 +2690,8 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
|
||||||
{
|
{
|
||||||
.name = "mavg",
|
.name = "mavg",
|
||||||
.type = FUNCTION_TYPE_MAVG,
|
.type = FUNCTION_TYPE_MAVG,
|
||||||
.classification = FUNC_MGT_INDEFINITE_ROWS_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_FORBID_STREAM_FUNC,
|
.classification = FUNC_MGT_INDEFINITE_ROWS_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC |
|
||||||
|
FUNC_MGT_FORBID_STREAM_FUNC,
|
||||||
.translateFunc = translateMavg,
|
.translateFunc = translateMavg,
|
||||||
.getEnvFunc = getMavgFuncEnv,
|
.getEnvFunc = getMavgFuncEnv,
|
||||||
.initFunc = mavgFunctionSetup,
|
.initFunc = mavgFunctionSetup,
|
||||||
|
|
|
@ -48,6 +48,9 @@ typedef struct SSumRes {
|
||||||
double dsum;
|
double dsum;
|
||||||
};
|
};
|
||||||
int16_t type;
|
int16_t type;
|
||||||
|
int64_t prevTs; // used for csum only
|
||||||
|
bool isPrevTsSet; //used for csum only
|
||||||
|
|
||||||
} SSumRes;
|
} SSumRes;
|
||||||
|
|
||||||
typedef struct SAvgRes {
|
typedef struct SAvgRes {
|
||||||
|
@ -190,6 +193,8 @@ typedef struct SStateInfo {
|
||||||
int64_t count;
|
int64_t count;
|
||||||
int64_t durationStart;
|
int64_t durationStart;
|
||||||
};
|
};
|
||||||
|
int64_t prevTs;
|
||||||
|
bool isPrevTsSet;
|
||||||
} SStateInfo;
|
} SStateInfo;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
@ -205,6 +210,8 @@ typedef enum {
|
||||||
typedef struct SMavgInfo {
|
typedef struct SMavgInfo {
|
||||||
int32_t pos;
|
int32_t pos;
|
||||||
double sum;
|
double sum;
|
||||||
|
int64_t prevTs;
|
||||||
|
bool isPrevTsSet;
|
||||||
int32_t numOfPoints;
|
int32_t numOfPoints;
|
||||||
bool pointsMeet;
|
bool pointsMeet;
|
||||||
double points[];
|
double points[];
|
||||||
|
@ -3388,6 +3395,7 @@ bool diffFunctionSetup(SqlFunctionCtx* pCtx, SResultRowEntryInfo* pResInfo) {
|
||||||
SDiffInfo* pDiffInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
SDiffInfo* pDiffInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
pDiffInfo->hasPrev = false;
|
pDiffInfo->hasPrev = false;
|
||||||
pDiffInfo->prev.i64 = 0;
|
pDiffInfo->prev.i64 = 0;
|
||||||
|
pDiffInfo->prevTs = -1;
|
||||||
if (pCtx->numOfParams > 1) {
|
if (pCtx->numOfParams > 1) {
|
||||||
pDiffInfo->ignoreNegative = pCtx->param[1].param.i; // TODO set correct param
|
pDiffInfo->ignoreNegative = pCtx->param[1].param.i; // TODO set correct param
|
||||||
} else {
|
} else {
|
||||||
|
@ -3398,7 +3406,7 @@ bool diffFunctionSetup(SqlFunctionCtx* pCtx, SResultRowEntryInfo* pResInfo) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void doSetPrevVal(SDiffInfo* pDiffInfo, int32_t type, const char* pv) {
|
static void doSetPrevVal(SDiffInfo* pDiffInfo, int32_t type, const char* pv, int64_t ts) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case TSDB_DATA_TYPE_BOOL:
|
case TSDB_DATA_TYPE_BOOL:
|
||||||
pDiffInfo->prev.i64 = *(bool*)pv ? 1 : 0;
|
pDiffInfo->prev.i64 = *(bool*)pv ? 1 : 0;
|
||||||
|
@ -3425,11 +3433,13 @@ static void doSetPrevVal(SDiffInfo* pDiffInfo, int32_t type, const char* pv) {
|
||||||
default:
|
default:
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
|
pDiffInfo->prevTs = ts;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void doHandleDiff(SDiffInfo* pDiffInfo, int32_t type, const char* pv, SColumnInfoData* pOutput, int32_t pos,
|
static void doHandleDiff(SDiffInfo* pDiffInfo, int32_t type, const char* pv, SColumnInfoData* pOutput, int32_t pos,
|
||||||
int32_t order) {
|
int32_t order, int64_t ts) {
|
||||||
int32_t factor = (order == TSDB_ORDER_ASC) ? 1 : -1;
|
int32_t factor = (order == TSDB_ORDER_ASC) ? 1 : -1;
|
||||||
|
pDiffInfo->prevTs = ts;
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case TSDB_DATA_TYPE_INT: {
|
case TSDB_DATA_TYPE_INT: {
|
||||||
int32_t v = *(int32_t*)pv;
|
int32_t v = *(int32_t*)pv;
|
||||||
|
@ -3513,6 +3523,8 @@ int32_t diffFunction(SqlFunctionCtx* pCtx) {
|
||||||
|
|
||||||
SColumnInfoData* pInputCol = pInput->pData[0];
|
SColumnInfoData* pInputCol = pInput->pData[0];
|
||||||
|
|
||||||
|
TSKEY* tsList = (int64_t*)pInput->pPTS->pData;
|
||||||
|
|
||||||
int32_t numOfElems = 0;
|
int32_t numOfElems = 0;
|
||||||
int32_t startOffset = pCtx->offset;
|
int32_t startOffset = pCtx->offset;
|
||||||
|
|
||||||
|
@ -3534,7 +3546,10 @@ int32_t diffFunction(SqlFunctionCtx* pCtx) {
|
||||||
char* pv = colDataGetData(pInputCol, i);
|
char* pv = colDataGetData(pInputCol, i);
|
||||||
|
|
||||||
if (pDiffInfo->hasPrev) {
|
if (pDiffInfo->hasPrev) {
|
||||||
doHandleDiff(pDiffInfo, pInputCol->info.type, pv, pOutput, pos, pCtx->order);
|
if (tsList[i] == pDiffInfo->prevTs) {
|
||||||
|
return TSDB_CODE_FUNC_DUP_TIMESTAMP;
|
||||||
|
}
|
||||||
|
doHandleDiff(pDiffInfo, pInputCol->info.type, pv, pOutput, pos, pCtx->order, tsList[i]);
|
||||||
// handle selectivity
|
// handle selectivity
|
||||||
if (pCtx->subsidiaries.num > 0) {
|
if (pCtx->subsidiaries.num > 0) {
|
||||||
appendSelectivityValue(pCtx, i, pos);
|
appendSelectivityValue(pCtx, i, pos);
|
||||||
|
@ -3542,7 +3557,7 @@ int32_t diffFunction(SqlFunctionCtx* pCtx) {
|
||||||
|
|
||||||
numOfElems++;
|
numOfElems++;
|
||||||
} else {
|
} else {
|
||||||
doSetPrevVal(pDiffInfo, pInputCol->info.type, pv);
|
doSetPrevVal(pDiffInfo, pInputCol->info.type, pv, tsList[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
pDiffInfo->hasPrev = true;
|
pDiffInfo->hasPrev = true;
|
||||||
|
@ -3564,7 +3579,10 @@ int32_t diffFunction(SqlFunctionCtx* pCtx) {
|
||||||
|
|
||||||
// there is a row of previous data block to be handled in the first place.
|
// there is a row of previous data block to be handled in the first place.
|
||||||
if (pDiffInfo->hasPrev) {
|
if (pDiffInfo->hasPrev) {
|
||||||
doHandleDiff(pDiffInfo, pInputCol->info.type, pv, pOutput, pos, pCtx->order);
|
if (tsList[i] == pDiffInfo->prevTs) {
|
||||||
|
return TSDB_CODE_FUNC_DUP_TIMESTAMP;
|
||||||
|
}
|
||||||
|
doHandleDiff(pDiffInfo, pInputCol->info.type, pv, pOutput, pos, pCtx->order, tsList[i]);
|
||||||
// handle selectivity
|
// handle selectivity
|
||||||
if (pCtx->subsidiaries.num > 0) {
|
if (pCtx->subsidiaries.num > 0) {
|
||||||
appendSelectivityValue(pCtx, i, pos);
|
appendSelectivityValue(pCtx, i, pos);
|
||||||
|
@ -3572,15 +3590,15 @@ int32_t diffFunction(SqlFunctionCtx* pCtx) {
|
||||||
|
|
||||||
numOfElems++;
|
numOfElems++;
|
||||||
} else {
|
} else {
|
||||||
doSetPrevVal(pDiffInfo, pInputCol->info.type, pv);
|
doSetPrevVal(pDiffInfo, pInputCol->info.type, pv, tsList[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
pDiffInfo->hasPrev = true;
|
pDiffInfo->hasPrev = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// initial value is not set yet
|
pResInfo->numOfRes = numOfElems;
|
||||||
return numOfElems;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t getTopBotInfoSize(int64_t numOfItems) { return sizeof(STopBotRes) + numOfItems * sizeof(STopBotResItem); }
|
int32_t getTopBotInfoSize(int64_t numOfItems) { return sizeof(STopBotRes) + numOfItems * sizeof(STopBotResItem); }
|
||||||
|
@ -4931,6 +4949,7 @@ int32_t stateCountFunction(SqlFunctionCtx* pCtx) {
|
||||||
SStateInfo* pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
SStateInfo* pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
|
||||||
SInputColumnInfoData* pInput = &pCtx->input;
|
SInputColumnInfoData* pInput = &pCtx->input;
|
||||||
|
TSKEY* tsList = (int64_t*)pInput->pPTS->pData;
|
||||||
|
|
||||||
SColumnInfoData* pInputCol = pInput->pData[0];
|
SColumnInfoData* pInputCol = pInput->pData[0];
|
||||||
|
|
||||||
|
@ -4943,7 +4962,15 @@ int32_t stateCountFunction(SqlFunctionCtx* pCtx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = pInput->startRowIndex; i < pInput->numOfRows + pInput->startRowIndex; i += 1) {
|
for (int32_t i = pInput->startRowIndex; i < pInput->numOfRows + pInput->startRowIndex; i += 1) {
|
||||||
|
if (pInfo->isPrevTsSet == true && tsList[i] == pInfo->prevTs) {
|
||||||
|
return TSDB_CODE_FUNC_DUP_TIMESTAMP;
|
||||||
|
} else {
|
||||||
|
pInfo->prevTs = tsList[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
pInfo->isPrevTsSet = true;
|
||||||
numOfElems++;
|
numOfElems++;
|
||||||
|
|
||||||
if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
|
if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
|
||||||
colDataAppendNULL(pOutput, i);
|
colDataAppendNULL(pOutput, i);
|
||||||
// handle selectivity
|
// handle selectivity
|
||||||
|
@ -4969,7 +4996,8 @@ int32_t stateCountFunction(SqlFunctionCtx* pCtx) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return numOfElems;
|
pResInfo->numOfRes = numOfElems;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t stateDurationFunction(SqlFunctionCtx* pCtx) {
|
int32_t stateDurationFunction(SqlFunctionCtx* pCtx) {
|
||||||
|
@ -4992,11 +5020,19 @@ int32_t stateDurationFunction(SqlFunctionCtx* pCtx) {
|
||||||
|
|
||||||
int8_t op = getStateOpType(varDataVal(pCtx->param[1].param.pz));
|
int8_t op = getStateOpType(varDataVal(pCtx->param[1].param.pz));
|
||||||
if (STATE_OPER_INVALID == op) {
|
if (STATE_OPER_INVALID == op) {
|
||||||
return 0;
|
return TSDB_CODE_INVALID_PARA;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = pInput->startRowIndex; i < pInput->numOfRows + pInput->startRowIndex; i += 1) {
|
for (int32_t i = pInput->startRowIndex; i < pInput->numOfRows + pInput->startRowIndex; i += 1) {
|
||||||
|
if (pInfo->isPrevTsSet == true && tsList[i] == pInfo->prevTs) {
|
||||||
|
return TSDB_CODE_FUNC_DUP_TIMESTAMP;
|
||||||
|
} else {
|
||||||
|
pInfo->prevTs = tsList[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
pInfo->isPrevTsSet = true;
|
||||||
numOfElems++;
|
numOfElems++;
|
||||||
|
|
||||||
if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
|
if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
|
||||||
colDataAppendNULL(pOutput, i);
|
colDataAppendNULL(pOutput, i);
|
||||||
// handle selectivity
|
// handle selectivity
|
||||||
|
@ -5026,7 +5062,8 @@ int32_t stateDurationFunction(SqlFunctionCtx* pCtx) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return numOfElems;
|
pResInfo->numOfRes = numOfElems;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool getCsumFuncEnv(SFunctionNode* UNUSED_PARAM(pFunc), SFuncExecEnv* pEnv) {
|
bool getCsumFuncEnv(SFunctionNode* UNUSED_PARAM(pFunc), SFuncExecEnv* pEnv) {
|
||||||
|
@ -5039,6 +5076,7 @@ int32_t csumFunction(SqlFunctionCtx* pCtx) {
|
||||||
SSumRes* pSumRes = GET_ROWCELL_INTERBUF(pResInfo);
|
SSumRes* pSumRes = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
|
||||||
SInputColumnInfoData* pInput = &pCtx->input;
|
SInputColumnInfoData* pInput = &pCtx->input;
|
||||||
|
TSKEY* tsList = (int64_t*)pInput->pPTS->pData;
|
||||||
|
|
||||||
SColumnInfoData* pInputCol = pInput->pData[0];
|
SColumnInfoData* pInputCol = pInput->pData[0];
|
||||||
SColumnInfoData* pOutput = (SColumnInfoData*)pCtx->pOutput;
|
SColumnInfoData* pOutput = (SColumnInfoData*)pCtx->pOutput;
|
||||||
|
@ -5047,6 +5085,13 @@ int32_t csumFunction(SqlFunctionCtx* pCtx) {
|
||||||
int32_t type = pInputCol->info.type;
|
int32_t type = pInputCol->info.type;
|
||||||
int32_t startOffset = pCtx->offset;
|
int32_t startOffset = pCtx->offset;
|
||||||
for (int32_t i = pInput->startRowIndex; i < pInput->numOfRows + pInput->startRowIndex; i += 1) {
|
for (int32_t i = pInput->startRowIndex; i < pInput->numOfRows + pInput->startRowIndex; i += 1) {
|
||||||
|
if (pSumRes->isPrevTsSet == true && tsList[i] == pSumRes->prevTs) {
|
||||||
|
return TSDB_CODE_FUNC_DUP_TIMESTAMP;
|
||||||
|
} else {
|
||||||
|
pSumRes->prevTs = tsList[i];
|
||||||
|
}
|
||||||
|
pSumRes->isPrevTsSet = true;
|
||||||
|
|
||||||
int32_t pos = startOffset + numOfElems;
|
int32_t pos = startOffset + numOfElems;
|
||||||
if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
|
if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
|
||||||
// colDataAppendNULL(pOutput, i);
|
// colDataAppendNULL(pOutput, i);
|
||||||
|
@ -5084,7 +5129,8 @@ int32_t csumFunction(SqlFunctionCtx* pCtx) {
|
||||||
numOfElems++;
|
numOfElems++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return numOfElems;
|
pResInfo->numOfRes = numOfElems;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool getMavgFuncEnv(SFunctionNode* UNUSED_PARAM(pFunc), SFuncExecEnv* pEnv) {
|
bool getMavgFuncEnv(SFunctionNode* UNUSED_PARAM(pFunc), SFuncExecEnv* pEnv) {
|
||||||
|
@ -5100,6 +5146,8 @@ bool mavgFunctionSetup(SqlFunctionCtx* pCtx, SResultRowEntryInfo* pResultInfo) {
|
||||||
SMavgInfo* pInfo = GET_ROWCELL_INTERBUF(pResultInfo);
|
SMavgInfo* pInfo = GET_ROWCELL_INTERBUF(pResultInfo);
|
||||||
pInfo->pos = 0;
|
pInfo->pos = 0;
|
||||||
pInfo->sum = 0;
|
pInfo->sum = 0;
|
||||||
|
pInfo->prevTs = -1;
|
||||||
|
pInfo->isPrevTsSet = false;
|
||||||
pInfo->numOfPoints = pCtx->param[1].param.i;
|
pInfo->numOfPoints = pCtx->param[1].param.i;
|
||||||
if (pInfo->numOfPoints < 1 || pInfo->numOfPoints > MAVG_MAX_POINTS_NUM) {
|
if (pInfo->numOfPoints < 1 || pInfo->numOfPoints > MAVG_MAX_POINTS_NUM) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -5114,6 +5162,7 @@ int32_t mavgFunction(SqlFunctionCtx* pCtx) {
|
||||||
SMavgInfo* pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
SMavgInfo* pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
|
||||||
SInputColumnInfoData* pInput = &pCtx->input;
|
SInputColumnInfoData* pInput = &pCtx->input;
|
||||||
|
TSKEY* tsList = (int64_t*)pInput->pPTS->pData;
|
||||||
|
|
||||||
SColumnInfoData* pInputCol = pInput->pData[0];
|
SColumnInfoData* pInputCol = pInput->pData[0];
|
||||||
SColumnInfoData* pTsOutput = pCtx->pTsOutput;
|
SColumnInfoData* pTsOutput = pCtx->pTsOutput;
|
||||||
|
@ -5123,6 +5172,13 @@ int32_t mavgFunction(SqlFunctionCtx* pCtx) {
|
||||||
int32_t type = pInputCol->info.type;
|
int32_t type = pInputCol->info.type;
|
||||||
int32_t startOffset = pCtx->offset;
|
int32_t startOffset = pCtx->offset;
|
||||||
for (int32_t i = pInput->startRowIndex; i < pInput->numOfRows + pInput->startRowIndex; i += 1) {
|
for (int32_t i = pInput->startRowIndex; i < pInput->numOfRows + pInput->startRowIndex; i += 1) {
|
||||||
|
if (pInfo->isPrevTsSet == true && tsList[i] == pInfo->prevTs) {
|
||||||
|
return TSDB_CODE_FUNC_DUP_TIMESTAMP;
|
||||||
|
} else {
|
||||||
|
pInfo->prevTs = tsList[i];
|
||||||
|
}
|
||||||
|
pInfo->isPrevTsSet = true;
|
||||||
|
|
||||||
int32_t pos = startOffset + numOfElems;
|
int32_t pos = startOffset + numOfElems;
|
||||||
if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
|
if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
|
||||||
// colDataAppendNULL(pOutput, i);
|
// colDataAppendNULL(pOutput, i);
|
||||||
|
@ -5167,7 +5223,8 @@ int32_t mavgFunction(SqlFunctionCtx* pCtx) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return numOfElems;
|
pResInfo->numOfRes = numOfElems;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static SSampleInfo* getSampleOutputInfo(SqlFunctionCtx* pCtx) {
|
static SSampleInfo* getSampleOutputInfo(SqlFunctionCtx* pCtx) {
|
||||||
|
@ -6207,6 +6264,9 @@ int32_t derivativeFunction(SqlFunctionCtx* pCtx) {
|
||||||
if (!pDerivInfo->valueSet) { // initial value is not set yet
|
if (!pDerivInfo->valueSet) { // initial value is not set yet
|
||||||
pDerivInfo->valueSet = true;
|
pDerivInfo->valueSet = true;
|
||||||
} else {
|
} else {
|
||||||
|
if (tsList[i] == pDerivInfo->prevTs) {
|
||||||
|
return TSDB_CODE_FUNC_DUP_TIMESTAMP;
|
||||||
|
}
|
||||||
double r = ((v - pDerivInfo->prevValue) * pDerivInfo->tsWindow) / (tsList[i] - pDerivInfo->prevTs);
|
double r = ((v - pDerivInfo->prevValue) * pDerivInfo->tsWindow) / (tsList[i] - pDerivInfo->prevTs);
|
||||||
if (pDerivInfo->ignoreNegative && r < 0) {
|
if (pDerivInfo->ignoreNegative && r < 0) {
|
||||||
} else {
|
} else {
|
||||||
|
@ -6245,6 +6305,9 @@ int32_t derivativeFunction(SqlFunctionCtx* pCtx) {
|
||||||
if (!pDerivInfo->valueSet) { // initial value is not set yet
|
if (!pDerivInfo->valueSet) { // initial value is not set yet
|
||||||
pDerivInfo->valueSet = true;
|
pDerivInfo->valueSet = true;
|
||||||
} else {
|
} else {
|
||||||
|
if (tsList[i] == pDerivInfo->prevTs) {
|
||||||
|
return TSDB_CODE_FUNC_DUP_TIMESTAMP;
|
||||||
|
}
|
||||||
double r = ((pDerivInfo->prevValue - v) * pDerivInfo->tsWindow) / (pDerivInfo->prevTs - tsList[i]);
|
double r = ((pDerivInfo->prevValue - v) * pDerivInfo->tsWindow) / (pDerivInfo->prevTs - tsList[i]);
|
||||||
if (pDerivInfo->ignoreNegative && r < 0) {
|
if (pDerivInfo->ignoreNegative && r < 0) {
|
||||||
} else {
|
} else {
|
||||||
|
@ -6272,7 +6335,9 @@ int32_t derivativeFunction(SqlFunctionCtx* pCtx) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return numOfElems;
|
pResInfo->numOfRes = numOfElems;
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool getIrateFuncEnv(struct SFunctionNode* pFunc, SFuncExecEnv* pEnv) {
|
bool getIrateFuncEnv(struct SFunctionNode* pFunc, SFuncExecEnv* pEnv) {
|
||||||
|
@ -6337,11 +6402,15 @@ int32_t irateFunction(SqlFunctionCtx* pCtx) {
|
||||||
pRateInfo->lastKey = tsList[i];
|
pRateInfo->lastKey = tsList[i];
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
|
} else if (tsList[i] == pRateInfo->lastKey) {
|
||||||
|
return TSDB_CODE_FUNC_DUP_TIMESTAMP;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((INT64_MIN == pRateInfo->firstKey) || tsList[i] > pRateInfo->firstKey) {
|
if ((INT64_MIN == pRateInfo->firstKey) || tsList[i] > pRateInfo->firstKey) {
|
||||||
pRateInfo->firstValue = v;
|
pRateInfo->firstValue = v;
|
||||||
pRateInfo->firstKey = tsList[i];
|
pRateInfo->firstKey = tsList[i];
|
||||||
|
} else if (tsList[i] == pRateInfo->firstKey) {
|
||||||
|
return TSDB_CODE_FUNC_DUP_TIMESTAMP;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@ from util.cases import *
|
||||||
from util.sql import *
|
from util.sql import *
|
||||||
from util.dnodes import *
|
from util.dnodes import *
|
||||||
|
|
||||||
|
msec_per_min=60 * 1000
|
||||||
class TDTestCase:
|
class TDTestCase:
|
||||||
def init(self, conn, logSql, replicaVar=1):
|
def init(self, conn, logSql, replicaVar=1):
|
||||||
self.replicaVar = int(replicaVar)
|
self.replicaVar = int(replicaVar)
|
||||||
|
@ -54,7 +54,7 @@ class TDTestCase:
|
||||||
|
|
||||||
if tdSql.queryRows == 0:
|
if tdSql.queryRows == 0:
|
||||||
tdSql.query(self.csum_query_form(
|
tdSql.query(self.csum_query_form(
|
||||||
col=col, alias=alias, table_expr=table_expr, condition=condition
|
col=col, alias=alias, table_expr=table_expr.replace("csum", "ts, csum"), condition=condition
|
||||||
))
|
))
|
||||||
print(f"case in {line}: ", end='')
|
print(f"case in {line}: ", end='')
|
||||||
tdSql.checkRows(0)
|
tdSql.checkRows(0)
|
||||||
|
@ -132,7 +132,7 @@ class TDTestCase:
|
||||||
pre_result = np.array(pre_result, dtype = 'int64')
|
pre_result = np.array(pre_result, dtype = 'int64')
|
||||||
pre_csum = np.cumsum(pre_result)[offset_val:]
|
pre_csum = np.cumsum(pre_result)[offset_val:]
|
||||||
tdSql.query(self.csum_query_form(
|
tdSql.query(self.csum_query_form(
|
||||||
col=col, alias=alias, table_expr=table_expr, condition=condition
|
col=col, alias=alias, table_expr=table_expr.replace("csum", "ts,csum"), condition=condition
|
||||||
))
|
))
|
||||||
|
|
||||||
for i in range(tdSql.queryRows):
|
for i in range(tdSql.queryRows):
|
||||||
|
@ -163,7 +163,7 @@ class TDTestCase:
|
||||||
self.checkcsum(**case6)
|
self.checkcsum(**case6)
|
||||||
|
|
||||||
# case7~8: nested query
|
# case7~8: nested query
|
||||||
case7 = {"table_expr": "(select c1 from db.stb1 order by ts, tbname )"}
|
case7 = {"table_expr": "(select ts,c1 from db.stb1 order by ts, tbname )"}
|
||||||
self.checkcsum(**case7)
|
self.checkcsum(**case7)
|
||||||
case8 = {"table_expr": "(select csum(c1) c1 from db.t1)"}
|
case8 = {"table_expr": "(select csum(c1) c1 from db.t1)"}
|
||||||
self.checkcsum(**case8)
|
self.checkcsum(**case8)
|
||||||
|
@ -315,19 +315,19 @@ class TDTestCase:
|
||||||
for j in range(data_row):
|
for j in range(data_row):
|
||||||
tdSql.execute(
|
tdSql.execute(
|
||||||
f"insert into t{i} values ("
|
f"insert into t{i} values ("
|
||||||
f"{basetime + (j+1)*10}, {random.randint(-200, -1)}, {random.uniform(200, -1)}, {basetime + random.randint(-200, -1)}, "
|
f"{basetime + (j+1)*10 + i * msec_per_min}, {random.randint(-200, -1)}, {random.uniform(200, -1)}, {basetime + random.randint(-200, -1)}, "
|
||||||
f"'binary_{j}', {random.uniform(-200, -1)}, {random.choice([0,1])}, {random.randint(-200,-1)}, "
|
f"'binary_{j}', {random.uniform(-200, -1)}, {random.choice([0,1])}, {random.randint(-200,-1)}, "
|
||||||
f"{random.randint(-200, -1)}, {random.randint(-127, -1)}, 'nchar_{j}' )"
|
f"{random.randint(-200, -1)}, {random.randint(-127, -1)}, 'nchar_{j}' )"
|
||||||
)
|
)
|
||||||
|
|
||||||
tdSql.execute(
|
tdSql.execute(
|
||||||
f"insert into t{i} values ("
|
f"insert into t{i} values ("
|
||||||
f"{basetime - (j+1) * 10}, {random.randint(1, 200)}, {random.uniform(1, 200)}, {basetime - random.randint(1, 200)}, "
|
f"{basetime - (j+1) * 10 + i * msec_per_min}, {random.randint(1, 200)}, {random.uniform(1, 200)}, {basetime - random.randint(1, 200)}, "
|
||||||
f"'binary_{j}_1', {random.uniform(1, 200)}, {random.choice([0, 1])}, {random.randint(1,200)}, "
|
f"'binary_{j}_1', {random.uniform(1, 200)}, {random.choice([0, 1])}, {random.randint(1,200)}, "
|
||||||
f"{random.randint(1,200)}, {random.randint(1,127)}, 'nchar_{j}_1' )"
|
f"{random.randint(1,200)}, {random.randint(1,127)}, 'nchar_{j}_1' )"
|
||||||
)
|
)
|
||||||
tdSql.execute(
|
tdSql.execute(
|
||||||
f"insert into tt{i} values ( {basetime-(j+1) * 10}, {random.randint(1, 200)} )"
|
f"insert into tt{i} values ( {basetime-(j+1) * 10 + i * msec_per_min}, {random.randint(1, 200)} )"
|
||||||
)
|
)
|
||||||
|
|
||||||
pass
|
pass
|
||||||
|
@ -366,26 +366,26 @@ class TDTestCase:
|
||||||
|
|
||||||
tdLog.printNoPrefix("######## insert only NULL test:")
|
tdLog.printNoPrefix("######## insert only NULL test:")
|
||||||
for i in range(tbnum):
|
for i in range(tbnum):
|
||||||
tdSql.execute(f"insert into db.t{i}(ts) values ({nowtime - 5})")
|
tdSql.execute(f"insert into db.t{i}(ts) values ({nowtime - 5 + i * msec_per_min})")
|
||||||
tdSql.execute(f"insert into db.t{i}(ts) values ({nowtime + 5})")
|
tdSql.execute(f"insert into db.t{i}(ts) values ({nowtime + 5 + i * msec_per_min})")
|
||||||
self.csum_current_query()
|
self.csum_current_query()
|
||||||
self.csum_error_query()
|
self.csum_error_query()
|
||||||
|
|
||||||
tdLog.printNoPrefix("######## insert data in the range near the max(bigint/double):")
|
tdLog.printNoPrefix("######## insert data in the range near the max(bigint/double):")
|
||||||
self.csum_test_table(tbnum)
|
self.csum_test_table(tbnum)
|
||||||
tdSql.execute(f"insert into db.t1(ts, c1,c2,c5,c7) values "
|
tdSql.execute(f"insert into db.t1(ts, c1,c2,c5,c7) values "
|
||||||
f"({nowtime - (per_table_rows + 1) * 10}, {2**31-1}, {3.4*10**38}, {1.7*10**308}, {2**63-1})")
|
f"({nowtime - (per_table_rows + 1) * 10 + i * msec_per_min}, {2**31-1}, {3.4*10**38}, {1.7*10**308}, {2**63-1})")
|
||||||
tdSql.execute(f"insert into db.t1(ts, c1,c2,c5,c7) values "
|
tdSql.execute(f"insert into db.t1(ts, c1,c2,c5,c7) values "
|
||||||
f"({nowtime - (per_table_rows + 2) * 10}, {2**31-1}, {3.4*10**38}, {1.7*10**308}, {2**63-1})")
|
f"({nowtime - (per_table_rows + 2) * 10 + i * msec_per_min}, {2**31-1}, {3.4*10**38}, {1.7*10**308}, {2**63-1})")
|
||||||
self.csum_current_query()
|
self.csum_current_query()
|
||||||
self.csum_error_query()
|
self.csum_error_query()
|
||||||
|
|
||||||
tdLog.printNoPrefix("######## insert data in the range near the min(bigint/double):")
|
tdLog.printNoPrefix("######## insert data in the range near the min(bigint/double):")
|
||||||
self.csum_test_table(tbnum)
|
self.csum_test_table(tbnum)
|
||||||
tdSql.execute(f"insert into db.t1(ts, c1,c2,c5,c7) values "
|
tdSql.execute(f"insert into db.t1(ts, c1,c2,c5,c7) values "
|
||||||
f"({nowtime - (per_table_rows + 1) * 10}, {1-2**31}, {-3.4*10**38}, {-1.7*10**308}, {1-2**63})")
|
f"({nowtime - (per_table_rows + 1) * 10 + i * msec_per_min}, {1-2**31}, {-3.4*10**38}, {-1.7*10**308}, {1-2**63})")
|
||||||
tdSql.execute(f"insert into db.t1(ts, c1,c2,c5,c7) values "
|
tdSql.execute(f"insert into db.t1(ts, c1,c2,c5,c7) values "
|
||||||
f"({nowtime - (per_table_rows + 2) * 10}, {1-2**31}, {-3.4*10**38}, {-1.7*10**308}, {512-2**63})")
|
f"({nowtime - (per_table_rows + 2) * 10 + i * msec_per_min}, {1-2**31}, {-3.4*10**38}, {-1.7*10**308}, {512-2**63})")
|
||||||
self.csum_current_query()
|
self.csum_current_query()
|
||||||
self.csum_error_query()
|
self.csum_error_query()
|
||||||
|
|
||||||
|
@ -398,9 +398,9 @@ class TDTestCase:
|
||||||
|
|
||||||
tdLog.printNoPrefix("######## insert data mix with NULL test:")
|
tdLog.printNoPrefix("######## insert data mix with NULL test:")
|
||||||
for i in range(tbnum):
|
for i in range(tbnum):
|
||||||
tdSql.execute(f"insert into db.t{i}(ts) values ({nowtime})")
|
tdSql.execute(f"insert into db.t{i}(ts) values ({nowtime + i * msec_per_min})")
|
||||||
tdSql.execute(f"insert into db.t{i}(ts) values ({nowtime-(per_table_rows+3)*10})")
|
tdSql.execute(f"insert into db.t{i}(ts) values ({nowtime-(per_table_rows+3)*10 + i * msec_per_min})")
|
||||||
tdSql.execute(f"insert into db.t{i}(ts) values ({nowtime+(per_table_rows+3)*10})")
|
tdSql.execute(f"insert into db.t{i}(ts) values ({nowtime+(per_table_rows+3)*10 + i * msec_per_min})")
|
||||||
self.csum_current_query()
|
self.csum_current_query()
|
||||||
self.csum_error_query()
|
self.csum_error_query()
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@ from util.cases import *
|
||||||
from util.sql import *
|
from util.sql import *
|
||||||
from util.dnodes import *
|
from util.dnodes import *
|
||||||
|
|
||||||
|
msec_per_min=60*1000
|
||||||
class TDTestCase:
|
class TDTestCase:
|
||||||
def init(self, conn, logSql, replicaVar=1):
|
def init(self, conn, logSql, replicaVar=1):
|
||||||
self.replicaVar = int(replicaVar)
|
self.replicaVar = int(replicaVar)
|
||||||
|
@ -312,19 +312,19 @@ class TDTestCase:
|
||||||
for j in range(data_row):
|
for j in range(data_row):
|
||||||
tdSql.execute(
|
tdSql.execute(
|
||||||
f"insert into db.t{i} values ("
|
f"insert into db.t{i} values ("
|
||||||
f"{basetime + (j+1)*10}, {random.randint(-200, -1)}, {random.uniform(200, -1)}, {basetime + random.randint(-200, -1)}, "
|
f"{basetime + (j+1)*10 + i* msec_per_min}, {random.randint(-200, -1)}, {random.uniform(200, -1)}, {basetime + random.randint(-200, -1)}, "
|
||||||
f"'binary_{j}', {random.uniform(-200, -1)}, {random.choice([0,1])}, {random.randint(-200,-1)}, "
|
f"'binary_{j}', {random.uniform(-200, -1)}, {random.choice([0,1])}, {random.randint(-200,-1)}, "
|
||||||
f"{random.randint(-200, -1)}, {random.randint(-127, -1)}, 'nchar_{j}' )"
|
f"{random.randint(-200, -1)}, {random.randint(-127, -1)}, 'nchar_{j}' )"
|
||||||
)
|
)
|
||||||
|
|
||||||
tdSql.execute(
|
tdSql.execute(
|
||||||
f"insert into db.t{i} values ("
|
f"insert into db.t{i} values ("
|
||||||
f"{basetime - (j+1) * 10}, {random.randint(1, 200)}, {random.uniform(1, 200)}, {basetime - random.randint(1, 200)}, "
|
f"{basetime - (j+1) * 10 + i* msec_per_min}, {random.randint(1, 200)}, {random.uniform(1, 200)}, {basetime - random.randint(1, 200)}, "
|
||||||
f"'binary_{j}_1', {random.uniform(1, 200)}, {random.choice([0, 1])}, {random.randint(1,200)}, "
|
f"'binary_{j}_1', {random.uniform(1, 200)}, {random.choice([0, 1])}, {random.randint(1,200)}, "
|
||||||
f"{random.randint(1,200)}, {random.randint(1,127)}, 'nchar_{j}_1' )"
|
f"{random.randint(1,200)}, {random.randint(1,127)}, 'nchar_{j}_1' )"
|
||||||
)
|
)
|
||||||
tdSql.execute(
|
tdSql.execute(
|
||||||
f"insert into db.tt{i} values ( {basetime-(j+1) * 10}, {random.randint(1, 200)} )"
|
f"insert into db.tt{i} values ( {basetime-(j+1) * 10 + i* msec_per_min}, {random.randint(1, 200)} )"
|
||||||
)
|
)
|
||||||
|
|
||||||
pass
|
pass
|
||||||
|
@ -394,26 +394,26 @@ class TDTestCase:
|
||||||
|
|
||||||
tdLog.printNoPrefix("######## insert only NULL test:")
|
tdLog.printNoPrefix("######## insert only NULL test:")
|
||||||
for i in range(tbnum):
|
for i in range(tbnum):
|
||||||
tdSql.execute(f"insert into db.t{i}(ts) values ({nowtime - 5})")
|
tdSql.execute(f"insert into db.t{i}(ts) values ({nowtime - 5 + i* msec_per_min})")
|
||||||
tdSql.execute(f"insert into db.t{i}(ts) values ({nowtime + 5})")
|
tdSql.execute(f"insert into db.t{i}(ts) values ({nowtime + 5 + i* msec_per_min})")
|
||||||
self.diff_current_query()
|
self.diff_current_query()
|
||||||
self.diff_error_query()
|
self.diff_error_query()
|
||||||
|
|
||||||
tdLog.printNoPrefix("######## insert data in the range near the max(bigint/double):")
|
tdLog.printNoPrefix("######## insert data in the range near the max(bigint/double):")
|
||||||
self.diff_test_table(tbnum)
|
self.diff_test_table(tbnum)
|
||||||
tdSql.execute(f"insert into db.t1(ts, c1,c2,c5,c7) values "
|
tdSql.execute(f"insert into db.t1(ts, c1,c2,c5,c7) values "
|
||||||
f"({nowtime - (per_table_rows + 1) * 10}, {2**31-1}, {3.4*10**38}, {1.7*10**308}, {2**63-1})")
|
f"({nowtime - (per_table_rows + 1) * 10 + i* msec_per_min}, {2**31-1}, {3.4*10**38}, {1.7*10**308}, {2**63-1})")
|
||||||
tdSql.execute(f"insert into db.t1(ts, c1,c2,c5,c7) values "
|
tdSql.execute(f"insert into db.t1(ts, c1,c2,c5,c7) values "
|
||||||
f"({nowtime - (per_table_rows + 2) * 10}, {2**31-1}, {3.4*10**38}, {1.7*10**308}, {2**63-1})")
|
f"({nowtime - (per_table_rows + 2) * 10 + i* msec_per_min}, {2**31-1}, {3.4*10**38}, {1.7*10**308}, {2**63-1})")
|
||||||
self.diff_current_query()
|
self.diff_current_query()
|
||||||
self.diff_error_query()
|
self.diff_error_query()
|
||||||
|
|
||||||
tdLog.printNoPrefix("######## insert data in the range near the min(bigint/double):")
|
tdLog.printNoPrefix("######## insert data in the range near the min(bigint/double):")
|
||||||
self.diff_test_table(tbnum)
|
self.diff_test_table(tbnum)
|
||||||
tdSql.execute(f"insert into db.t1(ts, c1,c2,c5,c7) values "
|
tdSql.execute(f"insert into db.t1(ts, c1,c2,c5,c7) values "
|
||||||
f"({nowtime - (per_table_rows + 1) * 10}, {1-2**31}, {-3.4*10**38}, {-1.7*10**308}, {1-2**63})")
|
f"({nowtime - (per_table_rows + 1) * 10 + i* msec_per_min}, {1-2**31}, {-3.4*10**38}, {-1.7*10**308}, {1-2**63})")
|
||||||
tdSql.execute(f"insert into db.t1(ts, c1,c2,c5,c7) values "
|
tdSql.execute(f"insert into db.t1(ts, c1,c2,c5,c7) values "
|
||||||
f"({nowtime - (per_table_rows + 2) * 10}, {1-2**31}, {-3.4*10**38}, {-1.7*10**308}, {512-2**63})")
|
f"({nowtime - (per_table_rows + 2) * 10 + i* msec_per_min}, {1-2**31}, {-3.4*10**38}, {-1.7*10**308}, {512-2**63})")
|
||||||
self.diff_current_query()
|
self.diff_current_query()
|
||||||
self.diff_error_query()
|
self.diff_error_query()
|
||||||
|
|
||||||
|
@ -426,9 +426,9 @@ class TDTestCase:
|
||||||
|
|
||||||
tdLog.printNoPrefix("######## insert data mix with NULL test:")
|
tdLog.printNoPrefix("######## insert data mix with NULL test:")
|
||||||
for i in range(tbnum):
|
for i in range(tbnum):
|
||||||
tdSql.execute(f"insert into db.t{i}(ts) values ({nowtime})")
|
tdSql.execute(f"insert into db.t{i}(ts) values ({nowtime + i* msec_per_min})")
|
||||||
tdSql.execute(f"insert into db.t{i}(ts) values ({nowtime-(per_table_rows+3)*10})")
|
tdSql.execute(f"insert into db.t{i}(ts) values ({nowtime-(per_table_rows+3)*10 + i* msec_per_min})")
|
||||||
tdSql.execute(f"insert into db.t{i}(ts) values ({nowtime+(per_table_rows+3)*10})")
|
tdSql.execute(f"insert into db.t{i}(ts) values ({nowtime+(per_table_rows+3)*10 + i* msec_per_min})")
|
||||||
self.diff_current_query()
|
self.diff_current_query()
|
||||||
self.diff_error_query()
|
self.diff_error_query()
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,7 @@ class TDTestCase:
|
||||||
|
|
||||||
ts = self.ts
|
ts = self.ts
|
||||||
for row in range(rownums):
|
for row in range(rownums):
|
||||||
ts = self.ts + time_step*row
|
ts = self.ts + (time_step) * row + tbnum * 60 * 1000
|
||||||
c1 = random.randint(0,1000)
|
c1 = random.randint(0,1000)
|
||||||
c2 = random.randint(0,100000)
|
c2 = random.randint(0,100000)
|
||||||
c3 = random.randint(0,125)
|
c3 = random.randint(0,125)
|
||||||
|
|
|
@ -26,6 +26,7 @@ from util.sql import *
|
||||||
from util.dnodes import *
|
from util.dnodes import *
|
||||||
|
|
||||||
dbname = 'db'
|
dbname = 'db'
|
||||||
|
msec_per_min = 60 * 1000
|
||||||
class TDTestCase:
|
class TDTestCase:
|
||||||
def init(self, conn, logSql, replicaVar=1):
|
def init(self, conn, logSql, replicaVar=1):
|
||||||
self.replicaVar = int(replicaVar)
|
self.replicaVar = int(replicaVar)
|
||||||
|
@ -327,7 +328,7 @@ class TDTestCase:
|
||||||
self.checkmavg(**case6)
|
self.checkmavg(**case6)
|
||||||
|
|
||||||
# case7~8: nested query
|
# case7~8: nested query
|
||||||
case7 = {"table_expr": f"(select c1 from {dbname}.stb1)"}
|
case7 = {"table_expr": f"(select ts, c1 from {dbname}.stb1)"}
|
||||||
self.checkmavg(**case7)
|
self.checkmavg(**case7)
|
||||||
# case8 = {"table_expr": f"(select _c0, mavg(c1, 1) c1 from {dbname}.stb1 group by tbname)"}
|
# case8 = {"table_expr": f"(select _c0, mavg(c1, 1) c1 from {dbname}.stb1 group by tbname)"}
|
||||||
# self.checkmavg(**case8)
|
# self.checkmavg(**case8)
|
||||||
|
@ -568,19 +569,19 @@ class TDTestCase:
|
||||||
for j in range(data_row):
|
for j in range(data_row):
|
||||||
tdSql.execute(
|
tdSql.execute(
|
||||||
f"insert into {dbname}.t{i} values ("
|
f"insert into {dbname}.t{i} values ("
|
||||||
f"{basetime + (j+1)*10}, {random.randint(-200, -1)}, {random.uniform(200, -1)}, {basetime + random.randint(-200, -1)}, "
|
f"{basetime + (j+1)*10 + i * msec_per_min}, {random.randint(-200, -1)}, {random.uniform(200, -1)}, {basetime + random.randint(-200, -1)}, "
|
||||||
f"'binary_{j}', {random.uniform(-200, -1)}, {random.choice([0,1])}, {random.randint(-200,-1)}, "
|
f"'binary_{j}', {random.uniform(-200, -1)}, {random.choice([0,1])}, {random.randint(-200,-1)}, "
|
||||||
f"{random.randint(-200, -1)}, {random.randint(-127, -1)}, 'nchar_{j}' )"
|
f"{random.randint(-200, -1)}, {random.randint(-127, -1)}, 'nchar_{j}' )"
|
||||||
)
|
)
|
||||||
|
|
||||||
tdSql.execute(
|
tdSql.execute(
|
||||||
f"insert into {dbname}.t{i} values ("
|
f"insert into {dbname}.t{i} values ("
|
||||||
f"{basetime - (j+1) * 10}, {random.randint(1, 200)}, {random.uniform(1, 200)}, {basetime - random.randint(1, 200)}, "
|
f"{basetime - (j+1) * 10 + i * msec_per_min}, {random.randint(1, 200)}, {random.uniform(1, 200)}, {basetime - random.randint(1, 200)}, "
|
||||||
f"'binary_{j}_1', {random.uniform(1, 200)}, {random.choice([0, 1])}, {random.randint(1,200)}, "
|
f"'binary_{j}_1', {random.uniform(1, 200)}, {random.choice([0, 1])}, {random.randint(1,200)}, "
|
||||||
f"{random.randint(1,200)}, {random.randint(1,127)}, 'nchar_{j}_1' )"
|
f"{random.randint(1,200)}, {random.randint(1,127)}, 'nchar_{j}_1' )"
|
||||||
)
|
)
|
||||||
tdSql.execute(
|
tdSql.execute(
|
||||||
f"insert into {dbname}.tt{i} values ( {basetime-(j+1) * 10}, {random.randint(1, 200)} )"
|
f"insert into {dbname}.tt{i} values ( {basetime-(j+1) * 10 + i * msec_per_min}, {random.randint(1, 200)} )"
|
||||||
)
|
)
|
||||||
|
|
||||||
pass
|
pass
|
||||||
|
@ -619,8 +620,8 @@ class TDTestCase:
|
||||||
|
|
||||||
tdLog.printNoPrefix("######## insert only NULL test:")
|
tdLog.printNoPrefix("######## insert only NULL test:")
|
||||||
for i in range(tbnum):
|
for i in range(tbnum):
|
||||||
tdSql.execute(f"insert into {dbname}.t{i}(ts) values ({nowtime - 5})")
|
tdSql.execute(f"insert into {dbname}.t{i}(ts) values ({nowtime - 5 + i * msec_per_min})")
|
||||||
tdSql.execute(f"insert into {dbname}.t{i}(ts) values ({nowtime + 5})")
|
tdSql.execute(f"insert into {dbname}.t{i}(ts) values ({nowtime + 5 + i * msec_per_min})")
|
||||||
self.mavg_current_query()
|
self.mavg_current_query()
|
||||||
self.mavg_error_query()
|
self.mavg_error_query()
|
||||||
|
|
||||||
|
@ -651,9 +652,9 @@ class TDTestCase:
|
||||||
|
|
||||||
tdLog.printNoPrefix("######## insert data mix with NULL test:")
|
tdLog.printNoPrefix("######## insert data mix with NULL test:")
|
||||||
for i in range(tbnum):
|
for i in range(tbnum):
|
||||||
tdSql.execute(f"insert into {dbname}.t{i}(ts) values ({nowtime})")
|
tdSql.execute(f"insert into {dbname}.t{i}(ts) values ({nowtime + i * msec_per_min})")
|
||||||
tdSql.execute(f"insert into {dbname}.t{i}(ts) values ({nowtime-(per_table_rows+3)*10})")
|
tdSql.execute(f"insert into {dbname}.t{i}(ts) values ({nowtime-(per_table_rows+3)*10 + i * msec_per_min})")
|
||||||
tdSql.execute(f"insert into {dbname}.t{i}(ts) values ({nowtime+(per_table_rows+3)*10})")
|
tdSql.execute(f"insert into {dbname}.t{i}(ts) values ({nowtime+(per_table_rows+3)*10 + i * msec_per_min})")
|
||||||
self.mavg_current_query()
|
self.mavg_current_query()
|
||||||
self.mavg_error_query()
|
self.mavg_error_query()
|
||||||
|
|
||||||
|
@ -676,7 +677,7 @@ class TDTestCase:
|
||||||
tdSql.checkRows(4)
|
tdSql.checkRows(4)
|
||||||
|
|
||||||
def mavg_support_stable(self):
|
def mavg_support_stable(self):
|
||||||
tdSql.query(f" select mavg(1,3) from {dbname}.stb1 ")
|
tdSql.query(f"select mavg(1,3) from {dbname}.stb1 ")
|
||||||
tdSql.checkRows(68)
|
tdSql.checkRows(68)
|
||||||
tdSql.checkData(0,0,1.000000000)
|
tdSql.checkData(0,0,1.000000000)
|
||||||
tdSql.query(f"select mavg(c1,3) from {dbname}.stb1 partition by tbname ")
|
tdSql.query(f"select mavg(c1,3) from {dbname}.stb1 partition by tbname ")
|
||||||
|
|
|
@ -20,15 +20,15 @@ class TDTestCase:
|
||||||
|
|
||||||
for i in range(tb_nums):
|
for i in range(tb_nums):
|
||||||
tbname = f"{dbname}.sub_{stb_name}_{i}"
|
tbname = f"{dbname}.sub_{stb_name}_{i}"
|
||||||
ts = self.ts + i*10000
|
ts = self.ts + i*1000*120
|
||||||
tdSql.execute(f"create table {tbname} using {dbname}.{stb_name} tags ({ts} , {i} , {i}*10 ,{i}*1.0,{i}*1.0 , 1 , 2, 'true', 'binary_{i}' ,'nchar_{i}',{i},{i},10,20 )")
|
tdSql.execute(f"create table {tbname} using {dbname}.{stb_name} tags ({ts} , {i} , {i}*10 ,{i}*1.0,{i}*1.0 , 1 , 2, 'true', 'binary_{i}' ,'nchar_{i}',{i},{i},10,20 )")
|
||||||
|
|
||||||
for row in range(row_nums):
|
for row in range(row_nums):
|
||||||
ts = self.ts + row*1000
|
ts = ts + row*1000
|
||||||
tdSql.execute(f"insert into {tbname} values({ts} , {row} , {row} , {row} , {row} , 1 , 2 , 'true' , 'binary_{row}' , 'nchar_{row}' , {row} , {row} , 1 ,2 )")
|
tdSql.execute(f"insert into {tbname} values({ts} , {row} , {row} , {row} , {row} , 1 , 2 , 'true' , 'binary_{row}' , 'nchar_{row}' , {row} , {row} , 1 ,2 )")
|
||||||
|
|
||||||
for null in range(5):
|
for null in range(5):
|
||||||
ts = self.ts + row_nums*1000 + null*1000
|
ts = ts + row_nums*1000 + null*1000
|
||||||
tdSql.execute(f"insert into {tbname} values({ts} , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL )")
|
tdSql.execute(f"insert into {tbname} values({ts} , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL , NULL )")
|
||||||
|
|
||||||
def basic_query(self, dbname="db"):
|
def basic_query(self, dbname="db"):
|
||||||
|
@ -160,13 +160,13 @@ class TDTestCase:
|
||||||
tdSql.query(f"select tbname , count(c1) from {dbname}.stb partition by tbname interval(10s) slimit 5 soffset 1 ")
|
tdSql.query(f"select tbname , count(c1) from {dbname}.stb partition by tbname interval(10s) slimit 5 soffset 1 ")
|
||||||
|
|
||||||
tdSql.query(f"select tbname , max(c1) from {dbname}.stb partition by tbname interval(10s)")
|
tdSql.query(f"select tbname , max(c1) from {dbname}.stb partition by tbname interval(10s)")
|
||||||
tdSql.checkRows(self.row_nums*2)
|
tdSql.checkRows(self.row_nums*10)
|
||||||
|
|
||||||
tdSql.query(f"select unique(c1) from {dbname}.stb partition by tbname order by tbname")
|
tdSql.query(f"select unique(c1) from {dbname}.stb partition by tbname order by tbname")
|
||||||
|
|
||||||
tdSql.query(f"select tbname , count(c1) from {dbname}.sub_stb_1 partition by tbname interval(10s)")
|
tdSql.query(f"select tbname , count(c1) from {dbname}.sub_stb_1 partition by tbname interval(10s)")
|
||||||
tdSql.checkData(0,0,'sub_stb_1')
|
tdSql.checkData(0,0,'sub_stb_1')
|
||||||
tdSql.checkData(0,1,self.row_nums)
|
tdSql.checkData(0,1, 4)
|
||||||
|
|
||||||
tdSql.query(f"select c1 , mavg(c1 ,2 ) from {dbname}.stb partition by c1")
|
tdSql.query(f"select c1 , mavg(c1 ,2 ) from {dbname}.stb partition by c1")
|
||||||
tdSql.checkRows(90)
|
tdSql.checkRows(90)
|
||||||
|
@ -193,7 +193,7 @@ class TDTestCase:
|
||||||
tdSql.query(f"select c1 , DERIVATIVE(c1,2,1) from {dbname}.stb partition by c1 order by c1")
|
tdSql.query(f"select c1 , DERIVATIVE(c1,2,1) from {dbname}.stb partition by c1 order by c1")
|
||||||
tdSql.checkRows(90)
|
tdSql.checkRows(90)
|
||||||
# bug need fix
|
# bug need fix
|
||||||
tdSql.checkData(0,1,None)
|
tdSql.checkData(0,1,0.0)
|
||||||
|
|
||||||
|
|
||||||
tdSql.query(f"select tbname , max(c1) from {dbname}.stb partition by tbname order by tbname slimit 5 soffset 0 ")
|
tdSql.query(f"select tbname , max(c1) from {dbname}.stb partition by tbname order by tbname slimit 5 soffset 0 ")
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -17,52 +17,52 @@ class TDTestCase(TDTestCase):
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
tdSql.prepare()
|
tdSql.prepare()
|
||||||
|
|
||||||
startTime = time.time()
|
|
||||||
|
|
||||||
self.function_before_26()
|
startTime = time.time()
|
||||||
|
|
||||||
self.dropandcreateDB_random("%s" %self.db_nest, 1)
|
self.function_before_26()
|
||||||
|
|
||||||
|
self.dropandcreateDB_random("%s" %self.db_nest, 1)
|
||||||
|
|
||||||
# self.math_nest(['UNIQUE'])
|
# self.math_nest(['UNIQUE'])
|
||||||
# self.math_nest(['MODE'])
|
# self.math_nest(['MODE'])
|
||||||
# self.math_nest(['SAMPLE'])
|
# self.math_nest(['SAMPLE'])
|
||||||
|
|
||||||
# self.math_nest(['ABS','SQRT'])
|
# self.math_nest(['ABS','SQRT'])
|
||||||
# self.math_nest(['SIN','COS','TAN','ASIN','ACOS','ATAN'])
|
# self.math_nest(['SIN','COS','TAN','ASIN','ACOS','ATAN'])
|
||||||
# self.math_nest(['POW','LOG'])
|
# self.math_nest(['POW','LOG'])
|
||||||
# self.math_nest(['FLOOR','CEIL','ROUND'])
|
# self.math_nest(['FLOOR','CEIL','ROUND'])
|
||||||
# self.math_nest(['MAVG'])
|
# self.math_nest(['MAVG'])
|
||||||
# self.math_nest(['HYPERLOGLOG'])
|
# self.math_nest(['HYPERLOGLOG'])
|
||||||
# self.math_nest(['TAIL'])
|
# self.math_nest(['TAIL'])
|
||||||
# self.math_nest(['CSUM'])
|
# self.math_nest(['CSUM'])
|
||||||
# self.math_nest(['statecount','stateduration'])
|
# self.math_nest(['statecount','stateduration'])
|
||||||
# self.math_nest(['HISTOGRAM'])
|
# self.math_nest(['HISTOGRAM'])
|
||||||
|
|
||||||
self.str_nest(['LTRIM','RTRIM','LOWER','UPPER'])
|
self.str_nest(['LTRIM','RTRIM','LOWER','UPPER'])
|
||||||
self.str_nest(['LENGTH','CHAR_LENGTH'])
|
self.str_nest(['LENGTH','CHAR_LENGTH'])
|
||||||
self.str_nest(['SUBSTR'])
|
self.str_nest(['SUBSTR'])
|
||||||
self.str_nest(['CONCAT'])
|
self.str_nest(['CONCAT'])
|
||||||
self.str_nest(['CONCAT_WS'])
|
self.str_nest(['CONCAT_WS'])
|
||||||
self.time_nest(['CAST'])
|
self.time_nest(['CAST'])
|
||||||
self.time_nest(['CAST_1'])
|
self.time_nest(['CAST_1'])
|
||||||
self.time_nest(['CAST_2'])
|
self.time_nest(['CAST_2'])
|
||||||
self.time_nest(['CAST_3'])
|
self.time_nest(['CAST_3'])
|
||||||
self.time_nest(['CAST_4'])
|
self.time_nest(['CAST_4'])
|
||||||
|
|
||||||
self.time_nest(['NOW','TODAY'])
|
self.time_nest(['NOW','TODAY'])
|
||||||
self.time_nest(['TIMEZONE'])
|
self.time_nest(['TIMEZONE'])
|
||||||
self.time_nest(['TIMETRUNCATE'])
|
self.time_nest(['TIMETRUNCATE'])
|
||||||
self.time_nest(['TO_ISO8601'])
|
self.time_nest(['TO_ISO8601'])
|
||||||
self.time_nest(['TO_UNIXTIMESTAMP'])
|
self.time_nest(['TO_UNIXTIMESTAMP'])
|
||||||
self.time_nest(['ELAPSED'])
|
self.time_nest(['ELAPSED'])
|
||||||
self.time_nest(['TIMEDIFF_1'])
|
self.time_nest(['TIMEDIFF_1'])
|
||||||
self.time_nest(['TIMEDIFF_2'])
|
self.time_nest(['TIMEDIFF_2'])
|
||||||
|
|
||||||
endTime = time.time()
|
endTime = time.time()
|
||||||
print("total time %ds" % (endTime - startTime))
|
print("total time %ds" % (endTime - startTime))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
tdSql.close()
|
tdSql.close()
|
||||||
|
|
Loading…
Reference in New Issue