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

feat(query): fixed a crash bug

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