@@ -320,7 +320,8 @@ int32_t taosCreateFillInfo(TSKEY skey, int32_t numOfFillCols,
320320 int32_t fillType , struct SFillColInfo * pCol ,
321321 int32_t primaryTsSlotId , int32_t order ,
322322 const char * id , SExecTaskInfo * pTaskInfo ,
323- int64_t surroundingTime , SFillInfo * * ppFillInfo ) {
323+ int64_t surroundingTime , bool indefRowsMode ,
324+ SFillInfo * * ppFillInfo ) {
324325 int32_t code = TSDB_CODE_SUCCESS ;
325326 int32_t lino = 0 ;
326327 if (fillType == TSDB_FILL_NONE ) {
@@ -384,6 +385,8 @@ int32_t taosCreateFillInfo(TSKEY skey, int32_t numOfFillCols,
384385 QUERY_CHECK_CODE (code , lino , _end );
385386
386387 pFillInfo -> pTaskInfo = pTaskInfo ;
388+ pFillInfo -> indefRowsMode = indefRowsMode ;
389+ pFillInfo -> indefWindowActive = false;
387390
388391_end :
389392 if (code != TSDB_CODE_SUCCESS ) {
@@ -402,6 +405,7 @@ void taosResetFillInfo(SFillInfo* pFillInfo, TSKEY startTimestamp) {
402405 pFillInfo -> numOfRows = 0 ;
403406 pFillInfo -> numOfCurrent = 0 ;
404407 pFillInfo -> numOfTotal = 0 ;
408+ pFillInfo -> indefWindowActive = false;
405409}
406410
407411void * taosDestroyFillInfo (SFillInfo * pFillInfo ) {
@@ -1029,6 +1033,15 @@ int32_t taosFillResultDataBlock(struct SFillInfo* pFillInfo, SSDataBlock* pDstBl
10291033
10301034 // if all blocks are consumed, we have to fill for not filled cols
10311035 if (pFillInfo -> numOfRows == 0 ) {
1036+ if (pFillInfo -> indefRowsMode && pFillInfo -> indefWindowActive ) {
1037+ const SInterval * pInterval = & pFillInfo -> interval ;
1038+ pFillInfo -> currentKey =
1039+ taosTimeAdd (pFillInfo -> currentKey ,
1040+ pInterval -> sliding *
1041+ GET_FORWARD_DIRECTION_FACTOR (pFillInfo -> order ),
1042+ pInterval -> slidingUnit , pInterval -> precision , NULL );
1043+ pFillInfo -> indefWindowActive = false;
1044+ }
10321045 if (!pFillBlock ) {
10331046 code = trySaveNewBlock (pFillInfo , pDstBlock , capacity , & pFillBlock );
10341047 QUERY_CHECK_CODE (code , lino , _end );
@@ -1070,6 +1083,16 @@ int32_t taosFillResultDataBlock(struct SFillInfo* pFillInfo, SSDataBlock* pDstBl
10701083 QUERY_CHECK_CODE (code , lino , _end );
10711084
10721085 if (blockCurTs != fillCurTs || !pFillInfo -> pSrcBlock ) {
1086+ if (pFillInfo -> indefRowsMode && pFillInfo -> indefWindowActive ) {
1087+ const SInterval * pInterval = & pFillInfo -> interval ;
1088+ pFillInfo -> currentKey =
1089+ taosTimeAdd (pFillInfo -> currentKey ,
1090+ pInterval -> sliding *
1091+ GET_FORWARD_DIRECTION_FACTOR (pFillInfo -> order ),
1092+ pInterval -> slidingUnit , pInterval -> precision , NULL );
1093+ pFillInfo -> indefWindowActive = false;
1094+ continue ;
1095+ }
10731096 doFillOneRow (pFillInfo , pFillBlock -> pBlock , blockCurTs , false);
10741097 } else {
10751098 for (int32_t colIdx = 0 ; colIdx < pFillInfo -> numOfCols ; ++ colIdx ) {
@@ -1105,15 +1128,37 @@ int32_t taosFillResultDataBlock(struct SFillInfo* pFillInfo, SSDataBlock* pDstBl
11051128 }
11061129 tryResetColNextPrev (pFillInfo , colIdx );
11071130 }
1108- const SInterval * pInterval = & pFillInfo -> interval ;
1109- pFillInfo -> currentKey =
1110- taosTimeAdd (pFillInfo -> currentKey ,
1111- pInterval -> sliding *
1112- GET_FORWARD_DIRECTION_FACTOR (pFillInfo -> order ),
1113- pInterval -> slidingUnit , pInterval -> precision , NULL );
11141131 pFillBlock -> pBlock -> info .rows += 1 ;
11151132 pFillInfo -> index += 1 ;
11161133 pFillInfo -> numOfCurrent += 1 ;
1134+
1135+ if (pFillInfo -> indefRowsMode ) {
1136+ pFillInfo -> indefWindowActive = true;
1137+ bool lastRowOfWindow = true;
1138+ if (pFillInfo -> index < pFillInfo -> numOfRows ) {
1139+ TSKEY nextTs = getBlockCurTs (pFillInfo -> pSrcBlock , pFillInfo -> index ,
1140+ pFillInfo -> srcTsSlotId );
1141+ if (nextTs == fillCurTs ) {
1142+ lastRowOfWindow = false;
1143+ }
1144+ }
1145+ if (lastRowOfWindow && pFillInfo -> index < pFillInfo -> numOfRows ) {
1146+ const SInterval * pInterval = & pFillInfo -> interval ;
1147+ pFillInfo -> currentKey =
1148+ taosTimeAdd (pFillInfo -> currentKey ,
1149+ pInterval -> sliding *
1150+ GET_FORWARD_DIRECTION_FACTOR (pFillInfo -> order ),
1151+ pInterval -> slidingUnit , pInterval -> precision , NULL );
1152+ pFillInfo -> indefWindowActive = false;
1153+ }
1154+ } else {
1155+ const SInterval * pInterval = & pFillInfo -> interval ;
1156+ pFillInfo -> currentKey =
1157+ taosTimeAdd (pFillInfo -> currentKey ,
1158+ pInterval -> sliding *
1159+ GET_FORWARD_DIRECTION_FACTOR (pFillInfo -> order ),
1160+ pInterval -> slidingUnit , pInterval -> precision , NULL );
1161+ }
11171162 }
11181163 tryExtractReadyBlocks (pFillInfo , pDstBlock , capacity );
11191164 }
0 commit comments