diff --git a/src/common/inc/texpr.h b/src/common/inc/texpr.h index 30e46baeb0b59fe56d7b4b339eff97740fa6cea7..7756aa7b118ccc82c5cbd34cb5ed5b2746c2991b 100644 --- a/src/common/inc/texpr.h +++ b/src/common/inc/texpr.h @@ -47,28 +47,29 @@ struct SSchema; /////////////////////////////////////////// // SCALAR FUNCTIONS -#define TSDB_FUNC_SCALAR_POW (TSDB_FUNC_FLAG_SCALAR | 0x0000) -#define TSDB_FUNC_SCALAR_LOG (TSDB_FUNC_FLAG_SCALAR | 0x0001) -#define TSDB_FUNC_SCALAR_ABS (TSDB_FUNC_FLAG_SCALAR | 0x0002) -#define TSDB_FUNC_SCALAR_ACOS (TSDB_FUNC_FLAG_SCALAR | 0x0003) -#define TSDB_FUNC_SCALAR_ASIN (TSDB_FUNC_FLAG_SCALAR | 0x0004) -#define TSDB_FUNC_SCALAR_ATAN (TSDB_FUNC_FLAG_SCALAR | 0x0005) -#define TSDB_FUNC_SCALAR_COS (TSDB_FUNC_FLAG_SCALAR | 0x0006) -#define TSDB_FUNC_SCALAR_SIN (TSDB_FUNC_FLAG_SCALAR | 0x0007) -#define TSDB_FUNC_SCALAR_TAN (TSDB_FUNC_FLAG_SCALAR | 0x0008) -#define TSDB_FUNC_SCALAR_SQRT (TSDB_FUNC_FLAG_SCALAR | 0x0009) -#define TSDB_FUNC_SCALAR_CEIL (TSDB_FUNC_FLAG_SCALAR | 0x000A) -#define TSDB_FUNC_SCALAR_FLOOR (TSDB_FUNC_FLAG_SCALAR | 0x000B) -#define TSDB_FUNC_SCALAR_ROUND (TSDB_FUNC_FLAG_SCALAR | 0x000C) -#define TSDB_FUNC_SCALAR_CONCAT (TSDB_FUNC_FLAG_SCALAR | 0x000D) -#define TSDB_FUNC_SCALAR_LENGTH (TSDB_FUNC_FLAG_SCALAR | 0x000E) -#define TSDB_FUNC_SCALAR_CONCAT_WS (TSDB_FUNC_FLAG_SCALAR | 0x000F) -#define TSDB_FUNC_SCALAR_CHAR_LENGTH (TSDB_FUNC_FLAG_SCALAR | 0x0010) -#define TSDB_FUNC_SCALAR_CAST (TSDB_FUNC_FLAG_SCALAR | 0x0011) -#define TSDB_FUNC_SCALAR_NOW (TSDB_FUNC_FLAG_SCALAR | 0x0012) -#define TSDB_FUNC_SCALAR_TODAY (TSDB_FUNC_FLAG_SCALAR | 0x0013) -#define TSDB_FUNC_SCALAR_TIMEZONE (TSDB_FUNC_FLAG_SCALAR | 0x0014) -#define TSDB_FUNC_SCALAR_MAX_NUM 21 +#define TSDB_FUNC_SCALAR_POW (TSDB_FUNC_FLAG_SCALAR | 0x0000) +#define TSDB_FUNC_SCALAR_LOG (TSDB_FUNC_FLAG_SCALAR | 0x0001) +#define TSDB_FUNC_SCALAR_ABS (TSDB_FUNC_FLAG_SCALAR | 0x0002) +#define TSDB_FUNC_SCALAR_ACOS (TSDB_FUNC_FLAG_SCALAR | 0x0003) +#define TSDB_FUNC_SCALAR_ASIN (TSDB_FUNC_FLAG_SCALAR | 0x0004) +#define TSDB_FUNC_SCALAR_ATAN (TSDB_FUNC_FLAG_SCALAR | 0x0005) +#define TSDB_FUNC_SCALAR_COS (TSDB_FUNC_FLAG_SCALAR | 0x0006) +#define TSDB_FUNC_SCALAR_SIN (TSDB_FUNC_FLAG_SCALAR | 0x0007) +#define TSDB_FUNC_SCALAR_TAN (TSDB_FUNC_FLAG_SCALAR | 0x0008) +#define TSDB_FUNC_SCALAR_SQRT (TSDB_FUNC_FLAG_SCALAR | 0x0009) +#define TSDB_FUNC_SCALAR_CEIL (TSDB_FUNC_FLAG_SCALAR | 0x000A) +#define TSDB_FUNC_SCALAR_FLOOR (TSDB_FUNC_FLAG_SCALAR | 0x000B) +#define TSDB_FUNC_SCALAR_ROUND (TSDB_FUNC_FLAG_SCALAR | 0x000C) +#define TSDB_FUNC_SCALAR_CONCAT (TSDB_FUNC_FLAG_SCALAR | 0x000D) +#define TSDB_FUNC_SCALAR_LENGTH (TSDB_FUNC_FLAG_SCALAR | 0x000E) +#define TSDB_FUNC_SCALAR_CONCAT_WS (TSDB_FUNC_FLAG_SCALAR | 0x000F) +#define TSDB_FUNC_SCALAR_CHAR_LENGTH (TSDB_FUNC_FLAG_SCALAR | 0x0010) +#define TSDB_FUNC_SCALAR_CAST (TSDB_FUNC_FLAG_SCALAR | 0x0011) +#define TSDB_FUNC_SCALAR_NOW (TSDB_FUNC_FLAG_SCALAR | 0x0012) +#define TSDB_FUNC_SCALAR_TODAY (TSDB_FUNC_FLAG_SCALAR | 0x0013) +#define TSDB_FUNC_SCALAR_TIMEZONE (TSDB_FUNC_FLAG_SCALAR | 0x0014) +#define TSDB_FUNC_SCALAR_TO_ISO8601 (TSDB_FUNC_FLAG_SCALAR | 0x0015) +#define TSDB_FUNC_SCALAR_MAX_NUM 22 #define TSDB_FUNC_SCALAR_NAME_MAX_LEN 16 diff --git a/src/common/src/texpr.c b/src/common/src/texpr.c index 7f1bfd2943ae103265baa85f888b186c8ce395c9..70d64b8ce48a0e52941764d151be968d03c95c92 100644 --- a/src/common/src/texpr.c +++ b/src/common/src/texpr.c @@ -81,7 +81,8 @@ int32_t exprTreeValidateFunctionNode(char* msgbuf, tExprNode *pExpr) { } case TSDB_FUNC_SCALAR_NOW: case TSDB_FUNC_SCALAR_TODAY: - case TSDB_FUNC_SCALAR_TIMEZONE: { + case TSDB_FUNC_SCALAR_TIMEZONE: + case TSDB_FUNC_SCALAR_TO_ISO8601: { return exprValidateTimeNode(pExpr); } @@ -1274,6 +1275,19 @@ int32_t exprValidateTimeNode(tExprNode *pExpr) { pExpr->resultBytes = TSDB_TIMEZONE_LEN; break; } + case TSDB_FUNC_SCALAR_TO_ISO8601: { + if (pExpr->_func.numChildren != 1) { + return TSDB_CODE_TSC_INVALID_OPERATION; + } + tExprNode *child = pExpr->_func.pChildren[0]; + if (child->resultType != TSDB_DATA_TYPE_BIGINT) { + return TSDB_CODE_TSC_INVALID_OPERATION; + } + pExpr->resultType = TSDB_DATA_TYPE_BINARY; + pExpr->resultBytes = 64;//2013-04-12T15:52:01.123000000+0800 + + break; + } default: { assert(false); break; @@ -1795,6 +1809,31 @@ void vectorTimeFunc(int16_t functionId, tExprOperandInfo *pInputs, int32_t numIn varDataSetLen(outputData, varDataLen(inputData[0])); break; } + case TSDB_FUNC_SCALAR_TO_ISO8601: { + assert(numInputs == 1); + assert(pInputs[0].type == TSDB_DATA_TYPE_BIGINT); + + char fraction[20] = {0}; + bool hasFraction = false; + NUM_TO_STRING(pInputs[0].type, inputData[0], sizeof(fraction), fraction); + int32_t tsDigits = strlen(fraction); + if (tsDigits > 10) { + hasFraction = true; + memmove(fraction, fraction, 10); + } + + char buf[64] = {0}; + int64_t timeVal; + GET_TYPED_DATA(timeVal, int64_t, pInputs[0].type, inputData[0]); + struct tm *tmInfo = localtime(&timeVal); + strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%S%z", tmInfo); + int32_t len = (int32_t)strlen(buf); + + memcpy(((char*)varDataVal(outputData)), buf, len); + varDataSetLen(outputData, len); + + break; + } default: { assert(false); break; @@ -1918,4 +1957,9 @@ tScalarFunctionInfo aScalarFunctions[] = { "timezone", vectorTimeFunc }, + { + TSDB_FUNC_SCALAR_TO_ISO8601, + "to_iso8601", + vectorTimeFunc + }, };