diff --git a/src/common/src/texpr.c b/src/common/src/texpr.c index bd778284124635f1f79092d3379e7248894d8b9a..7f1bfd2943ae103265baa85f888b186c8ce395c9 100644 --- a/src/common/src/texpr.c +++ b/src/common/src/texpr.c @@ -100,7 +100,13 @@ int32_t exprTreeValidateExprNode(tExprNode *pExpr) { if (!IS_NUMERIC_TYPE(leftType) || !IS_NUMERIC_TYPE(rightType)) { return TSDB_CODE_TSC_INVALID_OPERATION; } - if (leftType == TSDB_DATA_TYPE_TIMESTAMP || rightType == TSDB_DATA_TYPE_TIMESTAMP) { + if (IS_TIMESTAMP_TYPE(leftType) || IS_TIMESTAMP_TYPE(rightType)) { + //timestamp cannot be used in arithmetic + //operation with other data types + if (!IS_TIMESTAMP_TYPE(leftType) || !IS_TIMESTAMP_TYPE(rightType) || + (pExpr->_node.optr != TSDB_BINARY_OP_ADD && pExpr->_node.optr != TSDB_BINARY_OP_SUBTRACT)) { + return TSDB_CODE_TSC_INVALID_OPERATION; + } pExpr->resultType = TSDB_DATA_TYPE_TIMESTAMP; pExpr->resultBytes = tDataTypes[TSDB_DATA_TYPE_TIMESTAMP].bytes; } else { diff --git a/src/inc/ttype.h b/src/inc/ttype.h index 07e9d5c2d35fa349a649901dee407005711ac8e7..0c0c64eb77e57cd005ac16261bf3a3565fcc3987 100644 --- a/src/inc/ttype.h +++ b/src/inc/ttype.h @@ -208,7 +208,7 @@ typedef struct { #define IS_FLOAT_TYPE(_t) ((_t) == TSDB_DATA_TYPE_FLOAT || (_t) == TSDB_DATA_TYPE_DOUBLE) #define IS_TIMESTAMP_TYPE(_t) ((_t) == TSDB_DATA_TYPE_TIMESTAMP) -#define IS_NUMERIC_TYPE(_t) ((IS_SIGNED_NUMERIC_TYPE(_t)) || (IS_UNSIGNED_NUMERIC_TYPE(_t)) || (IS_FLOAT_TYPE(_t)) || IS_TIMESTAMP_TYPE(_t)) +#define IS_NUMERIC_TYPE(_t) ((IS_SIGNED_NUMERIC_TYPE(_t)) || (IS_UNSIGNED_NUMERIC_TYPE(_t)) || (IS_FLOAT_TYPE(_t)) || (IS_TIMESTAMP_TYPE(_t))) #define IS_VALID_TINYINT(_t) ((_t) > INT8_MIN && (_t) <= INT8_MAX) #define IS_VALID_SMALLINT(_t) ((_t) > INT16_MIN && (_t) <= INT16_MAX)