提交 0c136e94 编写于 作者: X xywang

feat(query): fixed a crash bug

上级 999de65e
......@@ -92,7 +92,7 @@ int32_t exprTreeValidateExprNode(tExprNode *pExpr) {
int16_t leftType = pLeft->resultType;
int16_t rightType = pRight->resultType;
int32_t brChecked = 0;
int32_t leftTreeChecked = 0, rightTreeChecked = 0;
if (pExpr->_node.optr == TSDB_BINARY_OP_ADD || pExpr->_node.optr == TSDB_BINARY_OP_SUBTRACT ||
pExpr->_node.optr == TSDB_BINARY_OP_MULTIPLY || pExpr->_node.optr == TSDB_BINARY_OP_DIVIDE ||
......@@ -117,7 +117,7 @@ int32_t exprTreeValidateExprNode(tExprNode *pExpr) {
return TSDB_CODE_TSC_INVALID_OPERATION;
}
brChecked++;
leftTreeChecked++;
}
if (pLeft->_node.pRight) {
......@@ -129,7 +129,7 @@ int32_t exprTreeValidateExprNode(tExprNode *pExpr) {
return TSDB_CODE_TSC_INVALID_OPERATION;
}
brChecked++;
leftTreeChecked++;
}
if (pRight->_node.pLeft) {
......@@ -141,7 +141,7 @@ int32_t exprTreeValidateExprNode(tExprNode *pExpr) {
return TSDB_CODE_TSC_INVALID_OPERATION;
}
brChecked++;
rightTreeChecked++;
}
if (pRight->_node.pRight) {
......@@ -153,14 +153,15 @@ int32_t exprTreeValidateExprNode(tExprNode *pExpr) {
return TSDB_CODE_TSC_INVALID_OPERATION;
}
brChecked++;
rightTreeChecked++;
}
if (brChecked == 0) {
if ((!IS_NUMERIC_TYPE(leftType) && leftTreeChecked == 0) || (!IS_NUMERIC_TYPE(rightType) && rightTreeChecked == 0)) {
return TSDB_CODE_TSC_INVALID_OPERATION;
}
brChecked = 0;
leftTreeChecked = 0;
rightTreeChecked = 0;
}
if (IS_FLOAT_TYPE(leftType) || IS_FLOAT_TYPE(rightType)) {
if (pLeft->_node.pLeft) {
......@@ -172,7 +173,7 @@ int32_t exprTreeValidateExprNode(tExprNode *pExpr) {
return TSDB_CODE_TSC_INVALID_OPERATION;
}
brChecked++;
leftTreeChecked++;
}
if (pLeft->_node.pRight) {
......@@ -184,7 +185,7 @@ int32_t exprTreeValidateExprNode(tExprNode *pExpr) {
return TSDB_CODE_TSC_INVALID_OPERATION;
}
brChecked++;
leftTreeChecked++;
}
if (pRight->_node.pLeft) {
......@@ -196,7 +197,7 @@ int32_t exprTreeValidateExprNode(tExprNode *pExpr) {
return TSDB_CODE_TSC_INVALID_OPERATION;
}
brChecked++;
rightTreeChecked++;
}
if (pRight->_node.pRight) {
......@@ -208,10 +209,10 @@ int32_t exprTreeValidateExprNode(tExprNode *pExpr) {
return TSDB_CODE_TSC_INVALID_OPERATION;
}
brChecked++;
rightTreeChecked++;
}
if (brChecked == 0) {
if ((IS_FLOAT_TYPE(leftType) && leftTreeChecked == 0) || (IS_FLOAT_TYPE(rightType) && rightTreeChecked == 0)) {
return TSDB_CODE_TSC_INVALID_OPERATION;
}
}
......@@ -247,7 +248,7 @@ int32_t exprTreeValidateExprNode(tExprNode *pExpr) {
return TSDB_CODE_TSC_INVALID_OPERATION;
}
brChecked++;
leftTreeChecked++;
}
if (pLeft->_node.pRight) {
......@@ -259,10 +260,10 @@ int32_t exprTreeValidateExprNode(tExprNode *pExpr) {
return TSDB_CODE_TSC_INVALID_OPERATION;
}
brChecked++;
leftTreeChecked++;
}
if (brChecked == 0) {
if (leftTreeChecked == 0) {
return TSDB_CODE_TSC_INVALID_OPERATION;
}
}
......@@ -612,28 +613,75 @@ void exprTreeExprNodeTraverse(tExprNode *pExpr, int32_t numOfRows, tExprOperandI
exprTreeInternalNodeTraverse(pLeft, numOfRows, &left, param, order, getSourceDataBlock);
leftIn = ltmp;
leftType = left.type;
if (pExpr->_node.optr == TSDB_BINARY_OP_BITAND || pExpr->_node.optr == TSDB_BINARY_OP_BITOR ||
pExpr->_node.optr == TSDB_BINARY_OP_BITXOR || pExpr->_node.optr == TSDB_BINARY_OP_BITNOT ||
pExpr->_node.optr == TSDB_BINARY_OP_LSHIFT || pExpr->_node.optr == TSDB_BINARY_OP_RSHIFT)
{
if (left.type == TSDB_DATA_TYPE_DOUBLE) {
transl = (char *)malloc(sizeof(int64_t) * left.numOfRows);
if (transl == NULL) {
return;
}
transl = (char *)malloc(sizeof(int64_t) * left.numOfRows);
if (transl == NULL) {
return;
}
pl = ltmp;
pt = transl;
pl = ltmp;
pt = transl;
switch (left.type) {
case TSDB_DATA_TYPE_TINYINT:
for (int16_t i = 0; i < left.numOfRows; i++) {
*((int64_t *) pt + i) = (int64_t)(*((int8_t *) pl + i));
}
break;
case TSDB_DATA_TYPE_SMALLINT:
for (int16_t i = 0; i < left.numOfRows; i++) {
*((int64_t *) pt + i) = (int64_t)(*((int16_t *) pl + i));
}
break;
case TSDB_DATA_TYPE_INT:
for (int16_t i = 0; i < left.numOfRows; i++) {
*((int64_t *) pt + i) = (int64_t)(*((int32_t *) pl + i));
}
break;
case TSDB_DATA_TYPE_BIGINT:
for (int16_t i = 0; i < left.numOfRows; i++) {
*((int64_t *) pt + i) = (int64_t)(*((int64_t *) pl + i));
}
break;
case TSDB_DATA_TYPE_UTINYINT:
for (int16_t i = 0; i < left.numOfRows; i++) {
*((int64_t *) pt + i) = (int64_t)(*((uint8_t *) pl + i));
}
break;
case TSDB_DATA_TYPE_USMALLINT:
for (int16_t i = 0; i < left.numOfRows; i++) {
*((int64_t *) pt + i) = (int64_t)(*((uint16_t *) pl + i));
}
break;
case TSDB_DATA_TYPE_UINT:
for (int16_t i = 0; i < left.numOfRows; i++) {
*((int64_t *) pt + i) = (int64_t)(*((uint32_t *) pl + i));
}
break;
case TSDB_DATA_TYPE_UBIGINT:
for (int16_t i = 0; i < left.numOfRows; i++) {
*((int64_t *) pt + i) = (int64_t)(*((uint64_t *) pl + i));
}
break;
case TSDB_DATA_TYPE_FLOAT:
for (int16_t i = 0; i < left.numOfRows; i++) {
*((int64_t *) pt + i) = (int64_t)(*((float *) pl + i));
}
break;
case TSDB_DATA_TYPE_DOUBLE:
for (int16_t i = 0; i < left.numOfRows; i++) {
*((int64_t *) pt + i) = (int64_t)(*((double *) pl + i));
}
leftIn = transl;
leftType = TSDB_DATA_TYPE_BIGINT;
break;
}
} else {
leftType = left.type;
leftIn = transl;
leftType = TSDB_DATA_TYPE_BIGINT;
}
leftNum = left.numOfRows;
} else if (pLeft->nodeType == TSQL_NODE_COL) {
......@@ -663,28 +711,75 @@ void exprTreeExprNodeTraverse(tExprNode *pExpr, int32_t numOfRows, tExprOperandI
exprTreeInternalNodeTraverse(pRight, numOfRows, &right, param, order, getSourceDataBlock);
rightIn = rtmp;
rightType = right.type;
if (pExpr->_node.optr == TSDB_BINARY_OP_BITAND || pExpr->_node.optr == TSDB_BINARY_OP_BITOR ||
pExpr->_node.optr == TSDB_BINARY_OP_BITXOR || pExpr->_node.optr == TSDB_BINARY_OP_BITNOT ||
pExpr->_node.optr == TSDB_BINARY_OP_LSHIFT || pExpr->_node.optr == TSDB_BINARY_OP_RSHIFT)
{
if (right.type == TSDB_DATA_TYPE_DOUBLE) {
transr = (char *)malloc(sizeof(int64_t) * right.numOfRows);
if (transr == NULL) {
return;
}
transr = (char *)malloc(sizeof(int64_t) * right.numOfRows);
if (transr == NULL) {
return;
}
pr = rtmp;
pt = transr;
pr = rtmp;
pt = transr;
switch (right.type) {
case TSDB_DATA_TYPE_TINYINT:
for (int16_t i = 0; i < right.numOfRows; i++) {
*((int64_t *) pt + i) = (int64_t)(*((int8_t *) pr + i));
}
break;
case TSDB_DATA_TYPE_SMALLINT:
for (int16_t i = 0; i < right.numOfRows; i++) {
*((int64_t *) pt + i) = (int64_t)(*((int16_t *) pr + i));
}
break;
case TSDB_DATA_TYPE_INT:
for (int16_t i = 0; i < right.numOfRows; i++) {
*((int64_t *) pt + i) = (int64_t)(*((int32_t *) pr + i));
}
break;
case TSDB_DATA_TYPE_BIGINT:
for (int16_t i = 0; i < right.numOfRows; i++) {
*((int64_t *) pt + i) = (int64_t)(*((int64_t *) pr + i));
}
break;
case TSDB_DATA_TYPE_UTINYINT:
for (int16_t i = 0; i < right.numOfRows; i++) {
*((int64_t *) pt + i) = (int64_t)(*((uint8_t *) pr + i));
}
break;
case TSDB_DATA_TYPE_USMALLINT:
for (int16_t i = 0; i < right.numOfRows; i++) {
*((int64_t *) pt + i) = (int64_t)(*((uint16_t *) pr + i));
}
break;
case TSDB_DATA_TYPE_UINT:
for (int16_t i = 0; i < right.numOfRows; i++) {
*((int64_t *) pt + i) = (int64_t)(*((uint32_t *) pr + i));
}
break;
case TSDB_DATA_TYPE_UBIGINT:
for (int16_t i = 0; i < right.numOfRows; i++) {
*((int64_t *) pt + i) = (int64_t)(*((uint64_t *) pr + i));
}
break;
case TSDB_DATA_TYPE_FLOAT:
for (int16_t i = 0; i < right.numOfRows; i++) {
*((int64_t *) pt + i) = (int64_t)(*((float *) pr + i));
}
break;
case TSDB_DATA_TYPE_DOUBLE:
for (int16_t i = 0; i < right.numOfRows; i++) {
*((int64_t *) pt + i) = (int64_t)(*((double *) pr + i));
}
rightIn = transr;
rightType = TSDB_DATA_TYPE_BIGINT;
break;
}
} else {
rightType = right.type;
rightIn = transr;
rightType = TSDB_DATA_TYPE_BIGINT;
}
rightNum = right.numOfRows;
} else if (pRight->nodeType == TSQL_NODE_COL) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册