Merge pull request #30131 from taosdata/fix/TS-6079/windowPrecalExprs
fix: state col precal
This commit is contained in:
commit
d01e1e39ba
|
@ -17,7 +17,9 @@
|
||||||
#include "function.h"
|
#include "function.h"
|
||||||
#include "functionMgt.h"
|
#include "functionMgt.h"
|
||||||
#include "operator.h"
|
#include "operator.h"
|
||||||
|
#include "query.h"
|
||||||
#include "querytask.h"
|
#include "querytask.h"
|
||||||
|
#include "taoserror.h"
|
||||||
#include "tchecksum.h"
|
#include "tchecksum.h"
|
||||||
#include "tcommon.h"
|
#include "tcommon.h"
|
||||||
#include "tcompare.h"
|
#include "tcompare.h"
|
||||||
|
@ -1016,6 +1018,11 @@ static void doStateWindowAggImpl(SOperatorInfo* pOperator, SStateWindowOperatorI
|
||||||
if (colDataIsNull(pStateColInfoData, pBlock->info.rows, j, pAgg)) {
|
if (colDataIsNull(pStateColInfoData, pBlock->info.rows, j, pAgg)) {
|
||||||
continue;
|
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);
|
char* val = colDataGetData(pStateColInfoData, j);
|
||||||
|
|
||||||
|
|
|
@ -2196,9 +2196,17 @@ static int32_t createWindowPhysiNodeFinalize(SPhysiPlanContext* pCxt, SNodeList*
|
||||||
SDataBlockDescNode* pChildTupe = (((SPhysiNode*)nodesListGetNode(pChildren, 0))->pOutputDataBlockDesc);
|
SDataBlockDescNode* pChildTupe = (((SPhysiNode*)nodesListGetNode(pChildren, 0))->pOutputDataBlockDesc);
|
||||||
// push down expression to pOutputDataBlockDesc of child node
|
// push down expression to pOutputDataBlockDesc of child node
|
||||||
if (TSDB_CODE_SUCCESS == code && NULL != pPrecalcExprs) {
|
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) {
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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.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)
|
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):
|
def run(self):
|
||||||
|
self.ts6079()
|
||||||
self.test_crash_for_session_window()
|
self.test_crash_for_session_window()
|
||||||
self.test_crash_for_state_window1()
|
self.test_crash_for_state_window1()
|
||||||
self.test_crash_for_state_window2()
|
self.test_crash_for_state_window2()
|
||||||
|
|
Loading…
Reference in New Issue