fix: rewirte to groupkey func

This commit is contained in:
facetosea 2025-02-19 01:32:02 +08:00
parent 5c64684965
commit a29ddccb5a
2 changed files with 47 additions and 21 deletions

View File

@ -3860,10 +3860,7 @@ static EDealRes doCheckExprForGroupBy(SNode** pNode, void* pContext) {
SNode* pGroupNode = NULL; SNode* pGroupNode = NULL;
FOREACH(pGroupNode, getGroupByList(pCxt)) { FOREACH(pGroupNode, getGroupByList(pCxt)) {
SNode* pActualNode = getGroupByNode(pGroupNode); SNode* pActualNode = getGroupByNode(pGroupNode);
if (nodesEqualNode(pActualNode, *pNode)) { if (nodesEqualNode(pActualNode, *pNode) || IsEqualTbNameFuncNode(pSelect, pActualNode, *pNode)) {
return DEAL_RES_IGNORE_CHILD;
}
if (IsEqualTbNameFuncNode(pSelect, pActualNode, *pNode)) {
return rewriteExprToGroupKeyFunc(pCxt, pNode); return rewriteExprToGroupKeyFunc(pCxt, pNode);
} }
if (isTbnameFuction(pActualNode) && QUERY_NODE_COLUMN == nodeType(*pNode) && if (isTbnameFuction(pActualNode) && QUERY_NODE_COLUMN == nodeType(*pNode) &&
@ -3893,11 +3890,22 @@ static EDealRes doCheckExprForGroupBy(SNode** pNode, void* pContext) {
} }
} }
if (isScanPseudoColumnFunc(*pNode) || QUERY_NODE_COLUMN == nodeType(*pNode)) { if (isScanPseudoColumnFunc(*pNode)) {
if (((pSelect->selectFuncNum > 1 && pCxt->stableQuery) || (isDistinctOrderBy(pCxt) && pCxt->currClause == SQL_CLAUSE_ORDER_BY)) && if (((pSelect->selectFuncNum > 1 && pCxt->stableQuery) ||
!isRelatedToOtherExpr((SExprNode*)*pNode)) { (isDistinctOrderBy(pCxt) && pCxt->currClause == SQL_CLAUSE_ORDER_BY)) &&
!isRelatedToOtherExpr((SExprNode*)*pNode)) {
return generateDealNodeErrMsg(pCxt, getGroupByErrorCode(pCxt), ((SExprNode*)(*pNode))->userAlias); return generateDealNodeErrMsg(pCxt, getGroupByErrorCode(pCxt), ((SExprNode*)(*pNode))->userAlias);
} }
}
if (QUERY_NODE_COLUMN == nodeType(*pNode)) {
if (((pSelect->selectFuncNum > 1) || (isDistinctOrderBy(pCxt) && pCxt->currClause == SQL_CLAUSE_ORDER_BY)) &&
!isRelatedToOtherExpr((SExprNode*)*pNode)) {
return generateDealNodeErrMsg(pCxt, getGroupByErrorCode(pCxt), ((SExprNode*)(*pNode))->userAlias);
}
}
if (isScanPseudoColumnFunc(*pNode) || QUERY_NODE_COLUMN == nodeType(*pNode)) {
if (isWindowJoinStmt(pSelect) && if (isWindowJoinStmt(pSelect) &&
(isWindowJoinProbeTableCol(pSelect, *pNode) || isWindowJoinGroupCol(pSelect, *pNode) || (isWindowJoinProbeTableCol(pSelect, *pNode) || isWindowJoinGroupCol(pSelect, *pNode) ||
(isWindowJoinSubTbname(pSelect, *pNode)) || isWindowJoinSubTbTag(pSelect, *pNode))) { (isWindowJoinSubTbname(pSelect, *pNode)) || isWindowJoinSubTbTag(pSelect, *pNode))) {

View File

@ -1082,22 +1082,39 @@ class TDTestCase:
tdSql.checkData(3, 1, "2022-09-30 15:15:04") tdSql.checkData(3, 1, "2022-09-30 15:15:04")
tdSql.checkData(3, 2, "2022-09-30 15:15:04") tdSql.checkData(3, 2, "2022-09-30 15:15:04")
# tdSql.query(f'select tbname, cols(last(ts), ts as ts1), cols(last(f1), ts as ts2) from {dbname}.sta group by tbname;') tdSql.query(f'select tbname, cols(last(ts), ts as ts1), cols(last(f1), ts as ts2) from {dbname}.sta group by tbname;')
# tdSql.checkRows(5) tdSql.checkRows(5)
# tdSql.checkCols(3) tdSql.checkCols(3)
# tdSql.checkData(0, 1, "2022-09-30 15:15:04") tdSql.query(f'select tbname, cols(last(ts), ts as ts1), cols(last(f1), ts as ts2) from {dbname}.sta group by tbname order by ts1;')
# tdSql.checkData(0, 2, "2022-09-30 15:15:03") tdSql.checkRows(5)
# tdSql.checkData(1, 1, "2022-09-30 15:15:04") tdSql.checkCols(3)
# tdSql.checkData(1, 2, "2022-09-30 15:15:03") tdSql.checkData(0, 1, "2022-09-26 15:15:04")
# tdSql.checkData(2, 1, "2022-09-30 15:15:04") tdSql.checkData(0, 2, "2022-09-26 15:15:03")
# tdSql.checkData(2, 2, "2022-09-30 15:15:03") tdSql.checkData(1, 1, "2022-09-27 15:15:04")
# tdSql.checkData(3, 1, "2022-09-30 15:15:04") tdSql.checkData(1, 2, "2022-09-27 15:15:03")
# tdSql.checkData(3, 2, "2022-09-30 15:15:03") tdSql.checkData(2, 1, "2022-09-28 15:15:04")
# tdSql.checkData(4, 1, "2022-09-30 15:15:04") tdSql.checkData(2, 2, "2022-09-28 15:15:03")
# tdSql.checkData(4, 2, "2022-09-30 15:15:03") tdSql.checkData(3, 1, "2022-09-29 15:15:04")
tdSql.checkData(3, 2, "2022-09-29 15:15:03")
tdSql.checkData(4, 1, "2022-09-30 15:15:04")
tdSql.checkData(4, 2, "2022-09-30 15:15:03")
tdSql.query(f'select t1, cols(last(ts), ts as ts1), cols(last(f1), ts as ts2) from {dbname}.sta group by t1;')
tdSql.checkRows(4)
tdSql.checkCols(3)
tdSql.query(f'select t1, cols(last(ts), ts as ts1), cols(last(f1), ts as ts2) from {dbname}.sta group by t1 order by ts1;')
tdSql.checkRows(4)
tdSql.checkCols(3)
tdSql.checkData(0, 1, "2022-09-26 15:15:04")
tdSql.checkData(0, 2, "2022-09-26 15:15:03")
tdSql.checkData(1, 1, "2022-09-28 15:15:04")
tdSql.checkData(1, 2, "2022-09-28 15:15:03")
tdSql.checkData(2, 1, "2022-09-29 15:15:04")
tdSql.checkData(2, 2, "2022-09-29 15:15:03")
tdSql.checkData(3, 1, "2022-09-30 15:15:04")
tdSql.checkData(3, 2, "2022-09-30 15:15:03")
def run(self): def run(self):
self.test1()
self.funcNestTest() self.funcNestTest()
self.funcSupperTableTest() self.funcSupperTableTest()
self.create_test_data() self.create_test_data()
@ -1110,6 +1127,7 @@ class TDTestCase:
self.stream_cols_test() self.stream_cols_test()
self.include_null_test() self.include_null_test()
self.long_column_name_test() self.long_column_name_test()
self.test1()
def stop(self): def stop(self):