fix: the problem of null in case when expression
This commit is contained in:
parent
a5dd241af0
commit
35b79e7e69
|
@ -1878,6 +1878,7 @@ static int32_t rewriteIsTrue(SNode* pSrc, SNode** pIsTrue) {
|
|||
|
||||
static EDealRes translateCaseWhen(STranslateContext* pCxt, SCaseWhenNode* pCaseWhen) {
|
||||
bool first = true;
|
||||
bool allNullThen = true;
|
||||
SNode* pNode = NULL;
|
||||
FOREACH(pNode, pCaseWhen->pWhenThenList) {
|
||||
SWhenThenNode* pWhenThen = (SWhenThenNode*)pNode;
|
||||
|
@ -1889,12 +1890,28 @@ static EDealRes translateCaseWhen(STranslateContext* pCxt, SCaseWhenNode* pCaseW
|
|||
}
|
||||
pWhenThen->pWhen = pIsTrue;
|
||||
}
|
||||
if (first || dataTypeComp(&pCaseWhen->node.resType, &((SExprNode*)pNode)->resType) < 0) {
|
||||
pCaseWhen->node.resType = ((SExprNode*)pNode)->resType;
|
||||
|
||||
SExprNode* pThenExpr = (SExprNode*)pNode;
|
||||
if (TSDB_DATA_TYPE_NULL == pThenExpr->resType.type) {
|
||||
continue;
|
||||
}
|
||||
allNullThen = false;
|
||||
if (first || dataTypeComp(&pCaseWhen->node.resType, &pThenExpr->resType) < 0) {
|
||||
pCaseWhen->node.resType = pThenExpr->resType;
|
||||
}
|
||||
first = false;
|
||||
}
|
||||
|
||||
if (allNullThen) {
|
||||
if (NULL != pCaseWhen->pElse) {
|
||||
pCaseWhen->node.resType = ((SExprNode*)pCaseWhen->pElse)->resType;
|
||||
} else {
|
||||
pCaseWhen->node.resType.type = TSDB_DATA_TYPE_NULL;
|
||||
pCaseWhen->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_NULL].bytes;
|
||||
return DEAL_RES_CONTINUE;
|
||||
}
|
||||
}
|
||||
|
||||
FOREACH(pNode, pCaseWhen->pWhenThenList) {
|
||||
SWhenThenNode* pWhenThen = (SWhenThenNode*)pNode;
|
||||
if (!dataTypeEqual(&pCaseWhen->node.resType, &((SExprNode*)pNode)->resType)) {
|
||||
|
|
Loading…
Reference in New Issue