fix: set parent sort error
This commit is contained in:
parent
c1f3a4ef44
commit
ad0d637086
|
@ -562,6 +562,7 @@ typedef enum ELogicConditionType {
|
|||
#define TSDB_QUERY_CLEAR_TYPE(x, _type) ((x) &= (~_type))
|
||||
#define TSDB_QUERY_RESET_TYPE(x) ((x) = TSDB_QUERY_TYPE_NON_TYPE)
|
||||
|
||||
#define TSDB_ORDER_NONE 0
|
||||
#define TSDB_ORDER_ASC 1
|
||||
#define TSDB_ORDER_DESC 2
|
||||
|
||||
|
|
|
@ -2757,6 +2757,7 @@ static int32_t taosCfgDynamicOptionsForClient(SConfig *pCfg, const char *name) {
|
|||
{"tsmaDataDeleteMark", &tsmaDataDeleteMark},
|
||||
{"numOfRpcSessions", &tsNumOfRpcSessions},
|
||||
{"bypassFlag", &tsBypassFlag},
|
||||
{"safetyCheckLevel", &tsSafetyCheckLevel},
|
||||
{"streamCoverage", &tsStreamCoverage}};
|
||||
|
||||
if ((code = taosCfgSetOption(debugOptions, tListLen(debugOptions), pItem, true)) != TSDB_CODE_SUCCESS) {
|
||||
|
|
|
@ -70,6 +70,7 @@ bool isPartTagAgg(SAggLogicNode* pAgg);
|
|||
bool isPartTableWinodw(SWindowLogicNode* pWindow);
|
||||
bool keysHasCol(SNodeList* pKeys);
|
||||
bool keysHasTbname(SNodeList* pKeys);
|
||||
bool projectCouldMergeUnsortDataBlock(SProjectLogicNode* pProject);
|
||||
SFunctionNode* createGroupKeyAggFunc(SColumnNode* pGroupCol);
|
||||
int32_t getTimeRangeFromNode(SNode** pPrimaryKeyCond, STimeWindow* pTimeRange, bool* pIsStrict);
|
||||
int32_t tagScanSetExecutionMode(SScanLogicNode* pScan);
|
||||
|
|
|
@ -412,7 +412,7 @@ static int32_t createScanLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect
|
|||
int32_t code = makeScanLogicNode(pCxt, pRealTable, pSelect->hasRepeatScanFuncs, (SLogicNode**)&pScan);
|
||||
|
||||
pScan->node.groupAction = GROUP_ACTION_NONE;
|
||||
pScan->node.resultDataOrder = DATA_ORDER_LEVEL_IN_BLOCK;
|
||||
pScan->node.resultDataOrder = (pRealTable->pMeta->tableType == TSDB_SUPER_TABLE) ? DATA_ORDER_LEVEL_IN_BLOCK : DATA_ORDER_LEVEL_GLOBAL;
|
||||
if (pCxt->pPlanCxt->streamQuery) {
|
||||
pScan->triggerType = pCxt->pPlanCxt->triggerType;
|
||||
pScan->watermark = pCxt->pPlanCxt->watermark;
|
||||
|
|
|
@ -223,6 +223,13 @@ static void optSetParentOrder(SLogicNode* pNode, EOrder order, SLogicNode* pNode
|
|||
// Use window output ts order instead.
|
||||
order = pNode->outputTsOrder;
|
||||
break;
|
||||
case QUERY_NODE_LOGIC_PLAN_PROJECT:
|
||||
if (projectCouldMergeUnsortDataBlock((SProjectLogicNode*)pNode)) {
|
||||
pNode->outputTsOrder = TSDB_ORDER_NONE;
|
||||
return;
|
||||
}
|
||||
pNode->outputTsOrder = order;
|
||||
break;
|
||||
default:
|
||||
pNode->outputTsOrder = order;
|
||||
break;
|
||||
|
|
|
@ -2053,6 +2053,23 @@ static bool projectCanMergeDataBlock(SProjectLogicNode* pProject) {
|
|||
return DATA_ORDER_LEVEL_GLOBAL == pChild->resultDataOrder ? true : false;
|
||||
}
|
||||
|
||||
bool projectCouldMergeUnsortDataBlock(SProjectLogicNode* pProject) {
|
||||
SLogicNode* pChild = (SLogicNode*)nodesListGetNode(pProject->node.pChildren, 0);
|
||||
if (DATA_ORDER_LEVEL_GLOBAL == pChild->resultDataOrder) {
|
||||
return false;
|
||||
}
|
||||
if (GROUP_ACTION_KEEP == pProject->node.groupAction) {
|
||||
return false;
|
||||
}
|
||||
if (DATA_ORDER_LEVEL_NONE == pProject->node.resultDataOrder) {
|
||||
return true;
|
||||
}
|
||||
if (1 != LIST_LENGTH(pProject->node.pChildren)) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static int32_t createProjectPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChildren,
|
||||
SProjectLogicNode* pProjectLogicNode, SPhysiNode** pPhyNode) {
|
||||
SProjectPhysiNode* pProject =
|
||||
|
|
|
@ -353,6 +353,13 @@ class TDTestCase:
|
|||
tdSql.checkData(0, 2, -999)
|
||||
tdSql.checkData(0, 3, None)
|
||||
tdSql.checkData(0, 4,-9.99000)
|
||||
|
||||
tdSql.query(f"select last_row(c1), c2, c3 , c4, c5 from (select * from {dbname}.ct1)")
|
||||
tdSql.checkData(0, 0, 9)
|
||||
tdSql.checkData(0, 1, -99999)
|
||||
tdSql.checkData(0, 2, -999)
|
||||
tdSql.checkData(0, 3, None)
|
||||
tdSql.checkData(0, 4,-9.99000)
|
||||
|
||||
# bug need fix
|
||||
tdSql.query(f"select last_row(c1), c2, c3 , c4, c5 from {dbname}.stb1 where tbname='ct1'")
|
||||
|
@ -477,6 +484,11 @@ class TDTestCase:
|
|||
tdSql.checkData(0,1,33333)
|
||||
tdSql.checkData(0,2,333)
|
||||
tdSql.checkData(0,3,3)
|
||||
tdSql.query(f"select last_row(abs(floor(t1)) ,t2 ,ceil(abs(t3)) , abs(ceil(t4)) ) from (select * from {dbname}.stb1)")
|
||||
tdSql.checkData(0,0,3)
|
||||
tdSql.checkData(0,1,33333)
|
||||
tdSql.checkData(0,2,333)
|
||||
tdSql.checkData(0,3,3)
|
||||
|
||||
# filter by tag
|
||||
tdSql.query(f"select tbname ,last_row(c1) from {dbname}.stb1 where t1 =0 ")
|
||||
|
@ -912,6 +924,70 @@ class TDTestCase:
|
|||
tdSql.checkData(0 , 1 , None)
|
||||
tdSql.checkData(0 , 2 , None)
|
||||
|
||||
def lastrow_in_subquery(self, dbname="db"):
|
||||
tdSql.execute(f'create database if not exists {dbname};')
|
||||
tdSql.execute(f'use {dbname}')
|
||||
tdSql.execute(f'drop table if exists {dbname}.meters')
|
||||
|
||||
tdSql.execute(f'create table {dbname}.meters (ts timestamp, c0 int, c1 float, c2 nchar(30), c3 bool) tags (t1 nchar(30))')
|
||||
tdSql.execute(f'create table {dbname}.d0 using {dbname}.meters tags("st1")')
|
||||
tdSql.execute(f'create table {dbname}.d1 using {dbname}.meters tags("st2")')
|
||||
tdSql.execute(f'insert into {dbname}.d0 values(1734574929000, 1, 1, "c2", true)')
|
||||
tdSql.execute(f'insert into {dbname}.d0 values(1734574929001, 2, 2, "bbbbbbbbb1", false)')
|
||||
tdSql.execute(f'insert into {dbname}.d0 values(1734574929002, 2, 2, "bbbbbbbbb1", false)')
|
||||
tdSql.execute(f'insert into {dbname}.d0 values(1734574929003, 3, 3, "a2", true)')
|
||||
tdSql.execute(f'insert into {dbname}.d0 values(1734574929004, 4, 4, "bbbbbbbbb2", false)')
|
||||
|
||||
tdSql.execute(f'insert into {dbname}.d1 values(1734574929000, 1, 1, "c2", true)')
|
||||
|
||||
tdSql.execute(f'use {dbname}')
|
||||
tdSql.execute(f'Create table {dbname}.normal_table (ts timestamp, c0 int, c1 float, c2 nchar(30), c3 bool)')
|
||||
tdSql.execute(f'insert into {dbname}.normal_table (select * from {dbname}.d0)')
|
||||
|
||||
tdSql.query(f'select count(1), last(ts), last_row(c0) from (select * from {dbname}.meters)')
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 0, 6)
|
||||
tdSql.checkData(0, 1, 1734574929004)
|
||||
tdSql.checkData(0, 2, 4)
|
||||
tdSql.query(f'select count(1), last(ts), last_row(c0) from (select * from {dbname}.meters order by ts desc)')
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 0, 6)
|
||||
tdSql.checkData(0, 1, 1734574929004)
|
||||
tdSql.checkData(0, 2, 4)
|
||||
tdSql.query(f'select count(1), last(ts), last_row(c0) from (select * from {dbname}.meters order by ts asc)')
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 0, 6)
|
||||
tdSql.checkData(0, 1, 1734574929004)
|
||||
tdSql.checkData(0, 2, 4)
|
||||
tdSql.query(f'select count(1), last(ts), last_row(c0) from (select * from {dbname}.meters order by c0 asc)')
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 0, 6)
|
||||
tdSql.checkData(0, 1, 1734574929004)
|
||||
tdSql.checkData(0, 2, 4)
|
||||
tdSql.query(f'select count(1), last_row(ts), last_row(c0) from (select * from {dbname}.meters)')
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 0, 6)
|
||||
tdSql.checkData(0, 1, 1734574929004)
|
||||
tdSql.checkData(0, 2, 4)
|
||||
tdSql.query(f'select tbname, last_row(ts), last_row(c0) from (select *, tbname from {dbname}.meters) group by tbname order by tbname')
|
||||
tdSql.checkRows(2)
|
||||
tdSql.checkData(0, 0, 'd0')
|
||||
tdSql.checkData(0, 1, 1734574929004)
|
||||
tdSql.checkData(0, 2, 4)
|
||||
tdSql.checkData(1, 0, 'd1')
|
||||
tdSql.checkData(1, 1, 1734574929000)
|
||||
tdSql.checkData(1, 2, 1)
|
||||
tdSql.query(f'select count(1), last_row(ts), last_row(c0) from (select * from {dbname}.d0)')
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 0, 5)
|
||||
tdSql.checkData(0, 1, 1734574929004)
|
||||
tdSql.checkData(0, 2, 4)
|
||||
tdSql.query(f'select count(1), last_row(ts), last_row(c0) from (select * from {dbname}.normal_table)')
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 0, 5)
|
||||
tdSql.checkData(0, 1, 1734574929004)
|
||||
tdSql.checkData(0, 2, 4)
|
||||
|
||||
def run(self): # sourcery skip: extract-duplicate-method, remove-redundant-fstring
|
||||
# tdSql.prepare()
|
||||
|
||||
|
@ -944,6 +1020,8 @@ class TDTestCase:
|
|||
self.basic_query()
|
||||
|
||||
self.lastRowDelayTest("DELAYTEST")
|
||||
|
||||
self.lastrow_in_subquery("db1")
|
||||
|
||||
|
||||
def stop(self):
|
||||
|
|
Loading…
Reference in New Issue