From 8fdadfa6617796b2d6763ae06658a9ae337932f3 Mon Sep 17 00:00:00 2001 From: Ganlin Zhao Date: Tue, 8 Feb 2022 14:29:41 +0800 Subject: [PATCH] [TD-11220](query): time related functions --- src/common/src/texpr.c | 8 +++++++- src/inc/ttype.h | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/common/src/texpr.c b/src/common/src/texpr.c index bd77828412..7f1bfd2943 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 07e9d5c2d3..0c0c64eb77 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) -- GitLab