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) {
|
static EDealRes translateCaseWhen(STranslateContext* pCxt, SCaseWhenNode* pCaseWhen) {
|
||||||
bool first = true;
|
bool first = true;
|
||||||
|
bool allNullThen = true;
|
||||||
SNode* pNode = NULL;
|
SNode* pNode = NULL;
|
||||||
FOREACH(pNode, pCaseWhen->pWhenThenList) {
|
FOREACH(pNode, pCaseWhen->pWhenThenList) {
|
||||||
SWhenThenNode* pWhenThen = (SWhenThenNode*)pNode;
|
SWhenThenNode* pWhenThen = (SWhenThenNode*)pNode;
|
||||||
|
@ -1889,12 +1890,28 @@ static EDealRes translateCaseWhen(STranslateContext* pCxt, SCaseWhenNode* pCaseW
|
||||||
}
|
}
|
||||||
pWhenThen->pWhen = pIsTrue;
|
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;
|
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) {
|
FOREACH(pNode, pCaseWhen->pWhenThenList) {
|
||||||
SWhenThenNode* pWhenThen = (SWhenThenNode*)pNode;
|
SWhenThenNode* pWhenThen = (SWhenThenNode*)pNode;
|
||||||
if (!dataTypeEqual(&pCaseWhen->node.resType, &((SExprNode*)pNode)->resType)) {
|
if (!dataTypeEqual(&pCaseWhen->node.resType, &((SExprNode*)pNode)->resType)) {
|
||||||
|
|
Loading…
Reference in New Issue