From bf13c90a619329b9b4014709d59604ae05c056fc Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Tue, 11 Feb 2025 19:14:15 +0800 Subject: [PATCH] feat: support range fill with interval limitation --- include/libs/nodes/querynodes.h | 2 +- source/libs/nodes/src/nodesUtilFuncs.c | 2 +- source/libs/parser/inc/parAst.h | 4 +- source/libs/parser/inc/sql.y | 5 +- source/libs/parser/src/parAstCreater.c | 24 ++++-- source/libs/parser/src/parTranslater.c | 14 +--- tests/army/query/function/in/interp.in | 99 ++++++++++++++++++++++++ tests/army/query/function/test_interp.py | 19 +++++ 8 files changed, 147 insertions(+), 22 deletions(-) diff --git a/include/libs/nodes/querynodes.h b/include/libs/nodes/querynodes.h index ec3e37b7e5..c80dda863f 100644 --- a/include/libs/nodes/querynodes.h +++ b/include/libs/nodes/querynodes.h @@ -420,7 +420,7 @@ typedef struct SWindowOffsetNode { typedef struct SRangeAroundNode { ENodeType type; - SNode* pTimepoint; + SNode* pRange; SNode* pInterval; } SRangeAroundNode; diff --git a/source/libs/nodes/src/nodesUtilFuncs.c b/source/libs/nodes/src/nodesUtilFuncs.c index f178b42988..b6607e38d9 100644 --- a/source/libs/nodes/src/nodesUtilFuncs.c +++ b/source/libs/nodes/src/nodesUtilFuncs.c @@ -1271,7 +1271,7 @@ void nodesDestroyNode(SNode* pNode) { case QUERY_NODE_RANGE_AROUND: { SRangeAroundNode* pAround = (SRangeAroundNode*)pNode; nodesDestroyNode(pAround->pInterval); - nodesDestroyNode(pAround->pTimepoint); + nodesDestroyNode(pAround->pRange); break; } case QUERY_NODE_STREAM_NOTIFY_OPTIONS: { diff --git a/source/libs/parser/inc/parAst.h b/source/libs/parser/inc/parAst.h index 559009d215..d99dfc977a 100644 --- a/source/libs/parser/inc/parAst.h +++ b/source/libs/parser/inc/parAst.h @@ -164,9 +164,9 @@ SNode* createIntervalWindowNode(SAstCreateContext* pCxt, SNode* pInterval, S SNode* createWindowOffsetNode(SAstCreateContext* pCxt, SNode* pStartOffset, SNode* pEndOffset); SNode* createFillNode(SAstCreateContext* pCxt, EFillMode mode, SNode* pValues); SNode* createGroupingSetNode(SAstCreateContext* pCxt, SNode* pNode); -SNode* createInterpTimeRange(SAstCreateContext* pCxt, SNode* pStart, SNode* pEnd); +SNode* createInterpTimeRange(SAstCreateContext* pCxt, SNode* pStart, SNode* pEnd, SNode* pInterval); SNode* createInterpTimePoint(SAstCreateContext* pCxt, SNode* pPoint); -SNode* createInterpTimeAround(SAstCreateContext* pCxt, SNode* pTimepoint, SNode* pInterval); +SNode* createInterpTimeAround(SAstCreateContext* pCxt, SNode* pStart, SNode* pEnd, SNode* pInterval); SNode* createWhenThenNode(SAstCreateContext* pCxt, SNode* pWhen, SNode* pThen); SNode* createCaseWhenNode(SAstCreateContext* pCxt, SNode* pCase, SNodeList* pWhenThenList, SNode* pElse); SNode* createAlterSingleTagColumnNode(SAstCreateContext* pCtx, SToken* token, SNode* pVal); diff --git a/source/libs/parser/inc/sql.y b/source/libs/parser/inc/sql.y index 9642eb7f5b..cc410f0507 100755 --- a/source/libs/parser/inc/sql.y +++ b/source/libs/parser/inc/sql.y @@ -1705,7 +1705,10 @@ having_clause_opt(A) ::= HAVING search_condition(B). range_opt(A) ::= . { A = NULL; } range_opt(A) ::= - RANGE NK_LP expr_or_subquery(B) NK_COMMA expr_or_subquery(C) NK_RP. { A = createInterpTimeRange(pCxt, releaseRawExprNode(pCxt, B), releaseRawExprNode(pCxt, C)); } + RANGE NK_LP expr_or_subquery(B) NK_COMMA expr_or_subquery(C) NK_COMMA expr_or_subquery(D) NK_RP. { + A = createInterpTimeRange(pCxt, releaseRawExprNode(pCxt, B), releaseRawExprNode(pCxt, C), releaseRawExprNode(pCxt, D)); } +range_opt(A) ::= + RANGE NK_LP expr_or_subquery(B) NK_COMMA expr_or_subquery(C) NK_RP. { A = createInterpTimeRange(pCxt, releaseRawExprNode(pCxt, B), releaseRawExprNode(pCxt, C), NULL); } range_opt(A) ::= RANGE NK_LP expr_or_subquery(B) NK_RP. { A = createInterpTimePoint(pCxt, releaseRawExprNode(pCxt, B)); } diff --git a/source/libs/parser/src/parAstCreater.c b/source/libs/parser/src/parAstCreater.c index 0c0c42def5..2ca072fef1 100644 --- a/source/libs/parser/src/parAstCreater.c +++ b/source/libs/parser/src/parAstCreater.c @@ -1471,13 +1471,19 @@ _err: return NULL; } -SNode* createInterpTimeRange(SAstCreateContext* pCxt, SNode* pStart, SNode* pEnd) { +SNode* createInterpTimeRange(SAstCreateContext* pCxt, SNode* pStart, SNode* pEnd, SNode* pInterval) { CHECK_PARSER_STATUS(pCxt); - if (pEnd && nodeType(pEnd) == QUERY_NODE_VALUE && ((SValueNode*)pEnd)->flag & VALUE_FLAG_IS_DURATION) { - return createInterpTimeAround(pCxt, pStart, pEnd); + if (NULL == pInterval) { + if (pEnd && nodeType(pEnd) == QUERY_NODE_VALUE && ((SValueNode*)pEnd)->flag & VALUE_FLAG_IS_DURATION) { + return createInterpTimeAround(pCxt, pStart, NULL, pEnd); + } + return createBetweenAnd(pCxt, createPrimaryKeyCol(pCxt, NULL), pStart, pEnd); } - return createBetweenAnd(pCxt, createPrimaryKeyCol(pCxt, NULL), pStart, pEnd); + + return createInterpTimeAround(pCxt, pStart, pEnd, pInterval); + _err: + nodesDestroyNode(pStart); nodesDestroyNode(pEnd); return NULL; @@ -1491,12 +1497,16 @@ _err: return NULL; } -SNode* createInterpTimeAround(SAstCreateContext* pCxt, SNode* pTimepoint, SNode* pInterval) { +SNode* createInterpTimeAround(SAstCreateContext* pCxt, SNode* pStart, SNode* pEnd, SNode* pInterval) { CHECK_PARSER_STATUS(pCxt); SRangeAroundNode* pAround = NULL; pCxt->errCode = nodesMakeNode(QUERY_NODE_RANGE_AROUND, (SNode**)&pAround); CHECK_PARSER_STATUS(pCxt); - pAround->pTimepoint = createInterpTimePoint(pCxt, pTimepoint); + if (NULL == pEnd) { + pAround->pRange = createInterpTimePoint(pCxt, pStart); + } else { + pAround->pRange = createBetweenAnd(pCxt, createPrimaryKeyCol(pCxt, NULL), pStart, pEnd); + } pAround->pInterval = pInterval; CHECK_PARSER_STATUS(pCxt); return (SNode*)pAround; @@ -1668,7 +1678,7 @@ SNode* addRangeClause(SAstCreateContext* pCxt, SNode* pStmt, SNode* pRange) { if (pRange && nodeType(pRange) == QUERY_NODE_RANGE_AROUND) { pSelect->pRangeAround = pRange; SRangeAroundNode* pAround = (SRangeAroundNode*)pRange; - TSWAP(pSelect->pRange, pAround->pTimepoint); + TSWAP(pSelect->pRange, pAround->pRange); } else { pSelect->pRange = pRange; } diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index 43ac27ea33..17c9d315bc 100755 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -2572,7 +2572,7 @@ static int32_t translateInterpFunc(STranslateContext* pCxt, SFunctionNode* pFunc if (!fmIsInterpFunc(pFunc->funcId)) { return TSDB_CODE_SUCCESS; } - if (!isSelectStmt(pCxt->pCurrStmt) || SQL_CLAUSE_SELECT != pCxt->currClause) { + if (!isSelectStmt(pCxt->pCurrStmt) || (SQL_CLAUSE_SELECT != pCxt->currClause && SQL_CLAUSE_ORDER_BY != pCxt->currClause)) { return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_NOT_ALLOWED_FUNC); } SSelectStmt* pSelect = (SSelectStmt*)pCxt->pCurrStmt; @@ -6415,7 +6415,7 @@ static int32_t translateInterpAround(STranslateContext* pCxt, SSelectStmt* pSele SRangeAroundNode* pAround = (SRangeAroundNode*)pSelect->pRangeAround; code = translateExpr(pCxt, &pAround->pInterval); if (TSDB_CODE_SUCCESS == code) { - if (nodeType(pAround->pInterval) == QUERY_NODE_VALUE) { + if (nodeType(pAround->pInterval) == QUERY_NODE_VALUE && ((SValueNode*)pAround->pInterval)->flag & VALUE_FLAG_IS_DURATION) { SValueNode* pVal = (SValueNode*)pAround->pInterval; if (pVal->datum.i == 0) { return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_FILL_TIME_RANGE, @@ -6475,14 +6475,8 @@ static int32_t translateInterp(STranslateContext* pCxt, SSelectStmt* pSelect) { "Missing RANGE clause, EVERY clause or FILL clause"); } } - } else { - if (pSelect->pEvery) { - return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_INTERP_CLAUSE, - "Range clause with around interval can't be used with EVERY clause"); - } - if (!pSelect->pFill) { - return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_INTERP_CLAUSE, "Missing FILL clause"); - } + } else if (!pSelect->pFill) { + return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_INTERP_CLAUSE, "Missing FILL clause"); } } diff --git a/tests/army/query/function/in/interp.in b/tests/army/query/function/in/interp.in index 1ba768e6e3..c087309b4c 100644 --- a/tests/army/query/function/in/interp.in +++ b/tests/army/query/function/in/interp.in @@ -68,3 +68,102 @@ select _irowts, interp(c1), t1 from test.ts5941_child range('2020-02-01 00:00:00 select _irowts, interp(c1), t1 from test.ts5941_child range('2020-02-01 00:00:00', '2020-02-01 00:00:20') every(1s) fill(linear); select _irowts, interp(c1), t1 from test.ts5941_child range('2020-02-01 00:00:00', '2020-02-01 00:00:20') every(1s) fill(null); select _irowts, interp(c1), t1 from test.ts5941_child range('2020-02-01 00:00:00', '2020-02-01 00:00:20') every(1s) fill(value, 1); + +select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(prev, 99); +select interp(c1), _isfilled from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(prev, 99); +select _isfilled, _irowts, interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(prev, 99); +select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(prev, 99) order by _irowts; +select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(prev, 99) order by interp(c1) desc; +select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(prev, 99) order by _irowts desc; +select interp(c1), _irowts_origin from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(prev, 99); +select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(prev, 99) order by _irowts_origin; +select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(prev, 99) order by _irowts_origin desc; +select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(prev, 99) order by interp(c1), _irowts_origin desc; +select _irowts, interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(prev, 99) order by interp(c1) desc, _irowts desc; +select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(prev, 99) order by _irowts, _irowts_origin desc; +select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(prev, 99) order by _irowts desc, _irowts_origin; +select _irowts_origin, interp(c1), _irowts from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(prev, 99); +select _irowts_origin, interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(prev, 99) order by _irowts; +select _irowts_origin, interp(c1), _irowts from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(prev, 99) order by _irowts_origin desc, _irowts; +select _isfilled, _irowts_origin, _irowts, interp(c1), tbname from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(prev, 99) order by _irowts_origin desc, _irowts desc; +select interp(c1), interp(c4) from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(prev, 99, 98); +select interp(c1), _isfilled, interp(c6) from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(prev, 99, false); +select _isfilled, _irowts, interp(c1), interp(c5) from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(prev, 99, 98); +select interp(c1), interp(c4) from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(prev, 99, NULL) order by _irowts; +select interp(c1), interp(c6) from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(prev, 99, 0) order by _irowts desc; +select interp(c1), _irowts_origin, interp(c4) from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(prev, 99, 'a'); +select interp(c1), interp(c4), interp(c5) from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(prev, 99, 9.9, 9) order by _irowts_origin; +select interp(c1), interp(c2) from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(prev, 99, 9) order by _irowts_origin desc; +select interp(c6), interp(c1) from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(prev, 3, 99) order by _irowts, _irowts_origin desc; +select interp(c1), interp(c4) from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(prev, 100, 99) order by _irowts desc, _irowts_origin; +select _irowts_origin, interp(c1), _irowts, interp(c6) from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(prev, 99, 0); +select _irowts_origin, interp(c6), interp(c1) from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(prev, 99, 99) order by _irowts; +select _irowts_origin, interp(c4), interp(c1), _irowts from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(prev, 99, 9) order by _irowts_origin desc, _irowts; +select _isfilled, interp(c4), _irowts_origin, _irowts, interp(c1), tbname from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(prev, 99, 1) order by _irowts_origin desc, _irowts desc; + + +select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(next, 99); +select interp(c1), _isfilled from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(next, 99); +select _isfilled, _irowts, interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(next, 99); +select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(next, 99) order by _irowts; +select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(next, 99) order by interp(c1) desc; +select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(next, 99) order by _irowts desc; +select interp(c1), _irowts_origin from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(next, 99); +select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(next, 99) order by _irowts_origin; +select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(next, 99) order by _irowts_origin desc; +select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(next, 99) order by interp(c1), _irowts_origin desc; +select _irowts, interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(next, 99) order by interp(c1) desc, _irowts desc; +select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(next, 99) order by _irowts, _irowts_origin desc; +select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(next, 99) order by _irowts desc, _irowts_origin; +select _irowts_origin, interp(c1), _irowts from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(next, 99); +select _irowts_origin, interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(next, 99) order by _irowts; +select _irowts_origin, interp(c1), _irowts from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(next, 99) order by _irowts_origin desc, _irowts; +select _isfilled, _irowts_origin, _irowts, interp(c1), tbname from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(next, 99) order by _irowts_origin desc, _irowts desc; +select interp(c1), interp(c4) from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(next, 99, 98); +select interp(c1), _isfilled, interp(c6) from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(next, 99, false); +select _isfilled, _irowts, interp(c1), interp(c5) from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(next, 99, 98); +select interp(c1), interp(c4) from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(next, 99, NULL) order by _irowts; +select interp(c1), interp(c6) from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(next, 99, 0) order by _irowts desc; +select interp(c1), _irowts_origin, interp(c4) from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(next, 99, 'a'); +select interp(c1), interp(c4), interp(c5) from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(next, 99, 9.9, 9) order by _irowts_origin; +select interp(c1), interp(c2) from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(next, 99, 9) order by _irowts_origin desc; +select interp(c6), interp(c1) from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(next, 3, 99) order by _irowts, _irowts_origin desc; +select interp(c1), interp(c4) from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(next, 100, 99) order by _irowts desc, _irowts_origin; +select _irowts_origin, interp(c1), _irowts, interp(c6) from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(next, 99, 0); +select _irowts_origin, interp(c6), interp(c1) from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(next, 99, 99) order by _irowts; +select _irowts_origin, interp(c4), interp(c1), _irowts from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(next, 99, 9) order by _irowts_origin desc, _irowts; +select _isfilled, interp(c4), _irowts_origin, _irowts, interp(c1), tbname from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(next, 99, 1) order by _irowts_origin desc, _irowts desc; + + +select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(near, 99); +select interp(c1), _isfilled from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(near, 99); +select _isfilled, _irowts, interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(near, 99); +select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(near, 99) order by _irowts; +select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(near, 99) order by interp(c1) desc; +select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(near, 99) order by _irowts desc; +select interp(c1), _irowts_origin from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(near, 99); +select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(near, 99) order by _irowts_origin; +select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(near, 99) order by _irowts_origin desc; +select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(near, 99) order by interp(c1), _irowts_origin desc; +select _irowts, interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(near, 99) order by interp(c1) desc, _irowts desc; +select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(near, 99) order by _irowts, _irowts_origin desc; +select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(near, 99) order by _irowts desc, _irowts_origin; +select _irowts_origin, interp(c1), _irowts from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(near, 99); +select _irowts_origin, interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(near, 99) order by _irowts; +select _irowts_origin, interp(c1), _irowts from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(near, 99) order by _irowts_origin desc, _irowts; +select _isfilled, _irowts_origin, _irowts, interp(c1), tbname from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(near, 99) order by _irowts_origin desc, _irowts desc; +select interp(c1), interp(c4) from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(near, 99, 98); +select interp(c1), _isfilled, interp(c6) from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(near, 99, false); +select _isfilled, _irowts, interp(c1), interp(c5) from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(near, 99, 98); +select interp(c1), interp(c4) from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(near, 99, NULL) order by _irowts; +select interp(c1), interp(c6) from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(near, 99, 0) order by _irowts desc; +select interp(c1), _irowts_origin, interp(c4) from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(near, 99, 'a'); +select interp(c1), interp(c4), interp(c5) from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(near, 99, 9.9, 9) order by _irowts_origin; +select interp(c1), interp(c2) from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(near, 99, 9) order by _irowts_origin desc; +select interp(c6), interp(c1) from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(near, 3, 99) order by _irowts, _irowts_origin desc; +select interp(c1), interp(c4) from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(near, 100, 99) order by _irowts desc, _irowts_origin; +select _irowts_origin, interp(c1), _irowts, interp(c6) from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(near, 99, 0); +select _irowts_origin, interp(c6), interp(c1) from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(near, 99, 99) order by _irowts; +select _irowts_origin, interp(c4), interp(c1), _irowts from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(near, 99, 9) order by _irowts_origin desc, _irowts; +select _isfilled, interp(c4), _irowts_origin, _irowts, interp(c1), tbname from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(near, 99, 1) order by _irowts_origin desc, _irowts desc; + diff --git a/tests/army/query/function/test_interp.py b/tests/army/query/function/test_interp.py index e543d81363..ffbadd6e7e 100644 --- a/tests/army/query/function/test_interp.py +++ b/tests/army/query/function/test_interp.py @@ -71,8 +71,27 @@ class TDTestCase(TBase): tdCom.compare_testcase_result(self.sqlFile, self.ansFile, testCase) + def test_abnormal_query(self, testCase): + tdLog.info("test abnormal query.") + tdSql.error("select interp(c1), interp(c4) from test.td32727 range('2020-02-01 00:00:00.000', '2020-02-01 00:00:30.000', 1s) every(2s) fill(prev, 99);") + tdSql.error("select _irowts from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(near);") + tdSql.error("select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s);") + tdSql.error("select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) fill(near);") + tdSql.error("select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(near);") + tdSql.error("select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(near, c1);") + tdSql.error("select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', 1s, '2020-01-01 00:00:30.000') every(2s) fill(near, 99);") + tdSql.error("select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(linear, 99);") + tdSql.error("select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(value, 99);") + tdSql.error("select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(value_f, 99);") + tdSql.error("select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(null, 99);") + tdSql.error("select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1s) every(2s) fill(null_f, 99);") + tdSql.error("select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', '1s') every(2s) fill(prev, 99);") + tdSql.error("select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1n) every(2s) fill(prev, 99);") + tdSql.error("select interp(c1) from test.td32861 range('2020-01-01 00:00:00.000', '2020-01-01 00:00:30.000', 1y) every(2s) fill(prev, 99);") + def test_interp(self): self.test_normal_query_new("interp") + self.test_abnormal_query("interp") def run(self): tdLog.debug(f"start to excute {__file__}")