Merge pull request #30131 from taosdata/fix/TS-6079/windowPrecalExprs

fix: state col precal
This commit is contained in:
Simon Guan 2025-03-12 19:55:40 +08:00 committed by GitHub
commit d01e1e39ba
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 33 additions and 2 deletions

View File

@ -17,7 +17,9 @@
#include "function.h"
#include "functionMgt.h"
#include "operator.h"
#include "query.h"
#include "querytask.h"
#include "taoserror.h"
#include "tchecksum.h"
#include "tcommon.h"
#include "tcompare.h"
@ -1016,6 +1018,11 @@ static void doStateWindowAggImpl(SOperatorInfo* pOperator, SStateWindowOperatorI
if (colDataIsNull(pStateColInfoData, pBlock->info.rows, j, pAgg)) {
continue;
}
if (pStateColInfoData->pData == NULL) {
qError("%s:%d state column data is null", __FILE__, __LINE__);
pTaskInfo->code = TSDB_CODE_QRY_EXECUTOR_INTERNAL_ERROR;
T_LONG_JMP(pTaskInfo->env, TSDB_CODE_QRY_EXECUTOR_INTERNAL_ERROR);
}
char* val = colDataGetData(pStateColInfoData, j);

View File

@ -2196,9 +2196,17 @@ static int32_t createWindowPhysiNodeFinalize(SPhysiPlanContext* pCxt, SNodeList*
SDataBlockDescNode* pChildTupe = (((SPhysiNode*)nodesListGetNode(pChildren, 0))->pOutputDataBlockDesc);
// push down expression to pOutputDataBlockDesc of child node
if (TSDB_CODE_SUCCESS == code && NULL != pPrecalcExprs) {
code = setListSlotId(pCxt, pChildTupe->dataBlockId, -1, pPrecalcExprs, &pWindow->pExprs);
SNodeList* pOutput;
code = setListSlotId(pCxt, pChildTupe->dataBlockId, -1, pPrecalcExprs, &pOutput);
if (TSDB_CODE_SUCCESS == code) {
code = addDataBlockSlots(pCxt, pWindow->pExprs, pChildTupe);
code = addDataBlockSlots(pCxt, pOutput, pChildTupe);
}
if (TSDB_CODE_SUCCESS == code) {
if (pWindow->pExprs == NULL) {
pWindow->pExprs = pOutput;
} else {
code = nodesListAppendList(pWindow->pExprs, pOutput);
}
}
}

View File

@ -203,7 +203,23 @@ class TDTestCase:
tdSql.execute("insert into t0 values(now, 3,NULL,3,3,3,3,3,3,3)", queryTimes=1)
tdSql.query("select first(c2) from t0 session(ts, 1s) order by ts", queryTimes=1)
def ts6079(self):
ts = 1741757485230
tdSql.execute("drop database if exists ts6079")
tdSql.execute("create database ts6079 vgroups 2 replica 1")
tdSql.execute("CREATE STABLE ts6079.`meters` (`ts` TIMESTAMP, `current` FLOAT, `voltage` INT, `phase` FLOAT) TAGS (`groupid` INT, `location` VARCHAR(24))")
for tableIndex in range(10):
tdSql.execute(f"CREATE TABLE ts6079.t{tableIndex} USING ts6079.meters TAGS ({tableIndex}, 'tb{tableIndex}')")
for num in range(10):
tdSql.execute(f"INSERT INTO ts6079.t{tableIndex} VALUES({ts + num}, {num * 1.0}, {215 + num}, 0.0)")
tdSql.query("select _wstart ,first(ts),last(ts),count(*),to_char(ts, 'yyyymmdd') as ts from ts6079.meters partition by to_char(ts, 'yyyymmdd') as ts state_window(cast(current as varchar(2)));")
tdSql.checkRows(10)
tdSql.checkData(0, 3, 10)
def run(self):
self.ts6079()
self.test_crash_for_session_window()
self.test_crash_for_state_window1()
self.test_crash_for_state_window2()