From f5f84c3cc697047a70d64efbd71f6c107819f3be Mon Sep 17 00:00:00 2001 From: Shungang Li Date: Fri, 19 Jul 2024 10:59:21 +0800 Subject: [PATCH 1/4] feat: (errcode) ttime.c --- include/common/ttime.h | 4 +- source/common/src/ttime.c | 225 ++++++++------ source/dnode/mnode/impl/src/mndSma.c | 9 +- source/dnode/vnode/src/sma/smaOpen.c | 16 +- source/dnode/vnode/src/sma/smaRollup.c | 5 +- source/dnode/vnode/src/sma/smaTimeRange.c | 11 +- source/libs/command/inc/commandInt.h | 9 +- source/libs/command/src/explain.c | 103 ++++--- source/libs/parser/src/parTranslater.c | 10 +- tests/system-test/2-query/select_null.py | 340 +++++++++++----------- 10 files changed, 405 insertions(+), 327 deletions(-) diff --git a/include/common/ttime.h b/include/common/ttime.h index f50b5ee9d7..2d40bd93a6 100644 --- a/include/common/ttime.h +++ b/include/common/ttime.h @@ -86,11 +86,11 @@ void deltaToUtcInitOnce(); char getPrecisionUnit(int32_t precision); int64_t convertTimePrecision(int64_t ts, int32_t fromPrecision, int32_t toPrecision); -int64_t convertTimeFromPrecisionToUnit(int64_t ts, int32_t fromPrecision, char toUnit); +int32_t convertTimeFromPrecisionToUnit(int64_t time, int32_t fromPrecision, char toUnit, int64_t* pRes); int32_t convertStringToTimestamp(int16_t type, char* inputData, int64_t timePrec, int64_t* timeVal); int32_t getDuration(int64_t val, char unit, int64_t* result, int32_t timePrecision); -void taosFormatUtcTime(char* buf, int32_t bufLen, int64_t ts, int32_t precision); +int32_t taosFormatUtcTime(char* buf, int32_t bufLen, int64_t ts, int32_t precision); struct STm { struct tm tm; diff --git a/source/common/src/ttime.c b/source/common/src/ttime.c index f7885caac0..4fca564804 100644 --- a/source/common/src/ttime.c +++ b/source/common/src/ttime.c @@ -35,7 +35,7 @@ void deltaToUtcInitOnce() { // printf("====delta:%lld\n\n", seconds); } -static int64_t parseFraction(char* str, char** end, int32_t timePrec); +static int32_t parseFraction(char* str, char** end, int32_t timePrec, int64_t* pFraction); static int32_t parseTimeWithTz(const char* timestr, int64_t* time, int32_t timePrec, char delim); static int32_t parseLocaltime(char* timestr, int32_t len, int64_t* utime, int32_t timePrec, char delim); static int32_t parseLocaltimeDst(char* timestr, int32_t len, int64_t* utime, int32_t timePrec, char delim); @@ -95,7 +95,9 @@ char* forwardToTimeStringEnd(char* str) { return &str[i]; } -int64_t parseFraction(char* str, char** end, int32_t timePrec) { +int32_t parseFraction(char* str, char** end, int32_t timePrec, int64_t* pFraction) { + int32_t code = TSDB_CODE_SUCCESS; + int32_t i = 0; int64_t fraction = 0; @@ -112,7 +114,7 @@ int64_t parseFraction(char* str, char** end, int32_t timePrec) { int32_t totalLen = i; if (totalLen <= 0) { - return -1; + TAOS_RETURN(TSDB_CODE_INVALID_PARA); } /* parse the fraction */ @@ -134,21 +136,24 @@ int64_t parseFraction(char* str, char** end, int32_t timePrec) { } times = NANO_SEC_FRACTION_LEN - i; } else { - return -1; + TAOS_RETURN(TSDB_CODE_INVALID_PARA); } fraction = strnatoi(str, i) * factor[times]; *end = str + totalLen; + *pFraction = fraction; - return fraction; + TAOS_RETURN(TSDB_CODE_SUCCESS); } int32_t parseTimezone(char* str, int64_t* tzOffset) { + int32_t code = TSDB_CODE_SUCCESS; + int64_t hour = 0; int32_t i = 0; if (str[i] != '+' && str[i] != '-') { - return -1; + TAOS_RETURN(TSDB_CODE_INVALID_PARA); } i++; @@ -160,7 +165,7 @@ int32_t parseTimezone(char* str, int64_t* tzOffset) { continue; } - return -1; + TAOS_RETURN(TSDB_CODE_INVALID_PARA); } char* sep = strchr(&str[i], ':'); @@ -175,18 +180,18 @@ int32_t parseTimezone(char* str, int64_t* tzOffset) { } if (hour > 12 || hour < 0) { - return -1; + TAOS_RETURN(TSDB_CODE_INVALID_PARA); } // return error if there're illegal charaters after min(2 Digits) char* minStr = &str[i]; if (minStr[1] != '\0' && minStr[2] != '\0') { - return -1; + TAOS_RETURN(TSDB_CODE_INVALID_PARA); } int64_t minute = strnatoi(&str[i], 2); if (minute > 59 || (hour == 12 && minute > 0)) { - return -1; + TAOS_RETURN(TSDB_CODE_INVALID_PARA); } if (str[0] == '+') { @@ -195,13 +200,13 @@ int32_t parseTimezone(char* str, int64_t* tzOffset) { *tzOffset = hour * 3600 + minute * 60; } - return 0; + TAOS_RETURN(TSDB_CODE_SUCCESS); } int32_t offsetOfTimezone(char* tzStr, int64_t* offset) { if (tzStr && (tzStr[0] == 'z' || tzStr[0] == 'Z')) { *offset = 0; - return 0; + return TSDB_CODE_SUCCESS; } return parseTimezone(tzStr, offset); } @@ -219,6 +224,8 @@ int32_t offsetOfTimezone(char* tzStr, int64_t* offset) { * 2013-04-12T15:52:01.123+0800 */ int32_t parseTimeWithTz(const char* timestr, int64_t* time, int32_t timePrec, char delim) { + int32_t code = TSDB_CODE_SUCCESS; + int64_t factor = TSDB_TICK_PER_SECOND(timePrec); int64_t tzOffset = 0; @@ -234,7 +241,7 @@ int32_t parseTimeWithTz(const char* timestr, int64_t* time, int32_t timePrec, ch } if (str == NULL) { - return -1; + TAOS_RETURN(TSDB_CODE_INVALID_PARA); } /* mktime will be affected by TZ, set by using taos_options */ @@ -253,22 +260,18 @@ int32_t parseTimeWithTz(const char* timestr, int64_t* time, int32_t timePrec, ch *time = seconds * factor; } else if (str[0] == '.') { str += 1; - if ((fraction = parseFraction(str, &str, timePrec)) < 0) { - return -1; - } + TAOS_CHECK_RETURN(parseFraction(str, &str, timePrec, &fraction)); *time = seconds * factor + fraction; char seg = str[0]; if (seg != 'Z' && seg != 'z' && seg != '+' && seg != '-') { - return -1; + TAOS_RETURN(TSDB_CODE_INVALID_PARA); } else if ((seg == 'Z' || seg == 'z') && str[1] != '\0') { - return -1; + TAOS_RETURN(TSDB_CODE_INVALID_PARA); } else if (seg == '+' || seg == '-') { // parse the timezone - if (parseTimezone(str, &tzOffset) == -1) { - return -1; - } + TAOS_CHECK_RETURN(parseTimezone(str, &tzOffset)); *time += tzOffset * factor; } @@ -277,16 +280,14 @@ int32_t parseTimeWithTz(const char* timestr, int64_t* time, int32_t timePrec, ch *time = seconds * factor + fraction; // parse the timezone - if (parseTimezone(str, &tzOffset) == -1) { - return -1; - } + TAOS_CHECK_RETURN(parseTimezone(str, &tzOffset)); *time += tzOffset * factor; } else { - return -1; + TAOS_RETURN(TSDB_CODE_INVALID_PARA); } - return 0; + TAOS_RETURN(TSDB_CODE_SUCCESS); } static FORCE_INLINE bool validateTm(struct tm* pTm) { @@ -314,6 +315,8 @@ static FORCE_INLINE bool validateTm(struct tm* pTm) { } int32_t parseLocaltime(char* timestr, int32_t len, int64_t* utime, int32_t timePrec, char delim) { + int32_t code = TSDB_CODE_SUCCESS; + *utime = 0; struct tm tm = {0}; @@ -330,7 +333,7 @@ int32_t parseLocaltime(char* timestr, int32_t len, int64_t* utime, int32_t timeP // if parse failed, try "%Y-%m-%d" format str = taosStrpTime(timestr, "%Y-%m-%d", &tm); if (str == NULL || (((str - timestr) < len) && (*str != '.')) || !validateTm(&tm)) { - return -1; + TAOS_RETURN(TSDB_CODE_INVALID_PARA); } } @@ -347,16 +350,16 @@ int32_t parseLocaltime(char* timestr, int32_t len, int64_t* utime, int32_t timeP if (*str == '.') { /* parse the second fraction part */ - if ((fraction = parseFraction(str + 1, &str, timePrec)) < 0) { - return -1; - } + TAOS_CHECK_RETURN(parseFraction(str + 1, &str, timePrec, &fraction)); } *utime = TSDB_TICK_PER_SECOND(timePrec) * seconds + fraction; - return 0; + TAOS_RETURN(TSDB_CODE_SUCCESS); } int32_t parseLocaltimeDst(char* timestr, int32_t len, int64_t* utime, int32_t timePrec, char delim) { + int32_t code = TSDB_CODE_SUCCESS; + *utime = 0; struct tm tm = {0}; tm.tm_isdst = -1; @@ -374,7 +377,7 @@ int32_t parseLocaltimeDst(char* timestr, int32_t len, int64_t* utime, int32_t ti // if parse failed, try "%Y-%m-%d" format str = taosStrpTime(timestr, "%Y-%m-%d", &tm); if (str == NULL || (((str - timestr) < len) && (*str != '.')) || !validateTm(&tm)) { - return -1; + TAOS_RETURN(TSDB_CODE_INVALID_PARA); } } @@ -384,13 +387,11 @@ int32_t parseLocaltimeDst(char* timestr, int32_t len, int64_t* utime, int32_t ti int64_t fraction = 0; if (*str == '.') { /* parse the second fraction part */ - if ((fraction = parseFraction(str + 1, &str, timePrec)) < 0) { - return -1; - } + TAOS_CHECK_RETURN(parseFraction(str + 1, &str, timePrec, &fraction)); } *utime = TSDB_TICK_PER_SECOND(timePrec) * seconds + fraction; - return 0; + TAOS_RETURN(TSDB_CODE_SUCCESS); } char getPrecisionUnit(int32_t precision) { @@ -482,10 +483,12 @@ int64_t convertTimePrecision(int64_t utime, int32_t fromPrecision, int32_t toPre // !!!!notice: double lose precison if time is too large, for example: 1626006833631000000*1.0 = double = // 1626006833631000064 -int64_t convertTimeFromPrecisionToUnit(int64_t time, int32_t fromPrecision, char toUnit) { +int32_t convertTimeFromPrecisionToUnit(int64_t time, int32_t fromPrecision, char toUnit, int64_t* pRes) { + int32_t code = TSDB_CODE_SUCCESS; + if (fromPrecision != TSDB_TIME_PRECISION_MILLI && fromPrecision != TSDB_TIME_PRECISION_MICRO && fromPrecision != TSDB_TIME_PRECISION_NANO) { - return -1; + TAOS_RETURN(TSDB_CODE_INVALID_PARA); } int64_t factors[3] = {NANOSECOND_PER_MSEC, NANOSECOND_PER_USEC, 1}; @@ -541,15 +544,23 @@ int64_t convertTimeFromPrecisionToUnit(int64_t time, int32_t fromPrecision, char time *= factors[fromPrecision]; break; default: { - return -1; + TAOS_RETURN(TSDB_CODE_INVALID_PARA); } } - if (tmp >= (double)INT64_MAX) return INT64_MAX; - if (tmp <= (double)INT64_MIN) return INT64_MIN; - return time; + if (tmp >= (double)INT64_MAX) { + *pRes = INT64_MAX; + } else if (tmp <= (double)INT64_MIN) { + *pRes = INT64_MIN; + } else { + *pRes = time; + } + + TAOS_RETURN(TSDB_CODE_SUCCESS); } int32_t convertStringToTimestamp(int16_t type, char* inputData, int64_t timePrec, int64_t* timeVal) { + int32_t code = TSDB_CODE_SUCCESS; + int32_t charLen = varDataLen(inputData); char* newColData; if (type == TSDB_DATA_TYPE_BINARY || type == TSDB_DATA_TYPE_VARBINARY) { @@ -558,7 +569,7 @@ int32_t convertStringToTimestamp(int16_t type, char* inputData, int64_t timePrec int32_t ret = taosParseTime(newColData, timeVal, charLen, (int32_t)timePrec, tsDaylight); if (ret != TSDB_CODE_SUCCESS) { taosMemoryFree(newColData); - return TSDB_CODE_INVALID_TIMESTAMP; + TAOS_RETURN(TSDB_CODE_INVALID_TIMESTAMP); } taosMemoryFree(newColData); } else if (type == TSDB_DATA_TYPE_NCHAR) { @@ -566,50 +577,52 @@ int32_t convertStringToTimestamp(int16_t type, char* inputData, int64_t timePrec int len = taosUcs4ToMbs((TdUcs4*)varDataVal(inputData), charLen, newColData); if (len < 0) { taosMemoryFree(newColData); - return TSDB_CODE_FAILED; + TAOS_RETURN(TSDB_CODE_FAILED); } newColData[len] = 0; int32_t ret = taosParseTime(newColData, timeVal, len, (int32_t)timePrec, tsDaylight); if (ret != TSDB_CODE_SUCCESS) { taosMemoryFree(newColData); - return ret; + TAOS_RETURN(ret); } taosMemoryFree(newColData); } else { - return TSDB_CODE_FAILED; + TAOS_RETURN(TSDB_CODE_FAILED); } - return TSDB_CODE_SUCCESS; + TAOS_RETURN(TSDB_CODE_SUCCESS); } int32_t getDuration(int64_t val, char unit, int64_t* result, int32_t timePrecision) { + int32_t code = TSDB_CODE_SUCCESS; + switch (unit) { case 's': if (val > INT64_MAX / MILLISECOND_PER_SECOND) { - return -1; + TAOS_RETURN(TSDB_CODE_OUT_OF_RANGE); } (*result) = convertTimePrecision(val * MILLISECOND_PER_SECOND, TSDB_TIME_PRECISION_MILLI, timePrecision); break; case 'm': if (val > INT64_MAX / MILLISECOND_PER_MINUTE) { - return -1; + TAOS_RETURN(TSDB_CODE_OUT_OF_RANGE); } (*result) = convertTimePrecision(val * MILLISECOND_PER_MINUTE, TSDB_TIME_PRECISION_MILLI, timePrecision); break; case 'h': if (val > INT64_MAX / MILLISECOND_PER_MINUTE) { - return -1; + TAOS_RETURN(TSDB_CODE_OUT_OF_RANGE); } (*result) = convertTimePrecision(val * MILLISECOND_PER_HOUR, TSDB_TIME_PRECISION_MILLI, timePrecision); break; case 'd': if (val > INT64_MAX / MILLISECOND_PER_DAY) { - return -1; + TAOS_RETURN(TSDB_CODE_OUT_OF_RANGE); } (*result) = convertTimePrecision(val * MILLISECOND_PER_DAY, TSDB_TIME_PRECISION_MILLI, timePrecision); break; case 'w': if (val > INT64_MAX / MILLISECOND_PER_WEEK) { - return -1; + TAOS_RETURN(TSDB_CODE_OUT_OF_RANGE); } (*result) = convertTimePrecision(val * MILLISECOND_PER_WEEK, TSDB_TIME_PRECISION_MILLI, timePrecision); break; @@ -623,10 +636,10 @@ int32_t getDuration(int64_t val, char unit, int64_t* result, int32_t timePrecisi (*result) = convertTimePrecision(val, TSDB_TIME_PRECISION_NANO, timePrecision); break; default: { - return -1; + TAOS_RETURN(TSDB_CODE_OUT_OF_RANGE); } } - return 0; + TAOS_RETURN(TSDB_CODE_SUCCESS); } /* @@ -645,47 +658,50 @@ int32_t getDuration(int64_t val, char unit, int64_t* result, int32_t timePrecisi */ int32_t parseAbsoluteDuration(const char* token, int32_t tokenlen, int64_t* duration, char* unit, int32_t timePrecision) { + int32_t code = TSDB_CODE_SUCCESS; + errno = 0; char* endPtr = NULL; /* get the basic numeric value */ int64_t timestamp = taosStr2Int64(token, &endPtr, 10); if ((timestamp == 0 && token[0] != '0') || errno != 0) { - return -1; + TAOS_RETURN(TAOS_SYSTEM_ERROR(errno)); } /* natual month/year are not allowed in absolute duration */ *unit = token[tokenlen - 1]; if (*unit == 'n' || *unit == 'y') { - return -1; + TAOS_RETURN(TSDB_CODE_INVALID_PARA); } return getDuration(timestamp, *unit, duration, timePrecision); } -int32_t parseNatualDuration(const char* token, int32_t tokenLen, int64_t* duration, char* unit, int32_t timePrecision, bool negativeAllow) { +int32_t parseNatualDuration(const char* token, int32_t tokenLen, int64_t* duration, char* unit, int32_t timePrecision, + bool negativeAllow) { + int32_t code = TSDB_CODE_SUCCESS; + errno = 0; /* get the basic numeric value */ *duration = taosStr2Int64(token, NULL, 10); if ((*duration < 0 && !negativeAllow) || errno != 0) { - return -1; + TAOS_RETURN(TAOS_SYSTEM_ERROR(errno)); } *unit = token[tokenLen - 1]; if (*unit == 'n' || *unit == 'y') { - return 0; + TAOS_RETURN(TSDB_CODE_SUCCESS); } - if(isdigit(*unit)) { + if (isdigit(*unit)) { *unit = getPrecisionUnit(timePrecision); } return getDuration(*duration, *unit, duration, timePrecision); } -static bool taosIsLeapYear(int32_t year) { - return (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)); -} +static bool taosIsLeapYear(int32_t year) { return (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)); } int64_t taosTimeAdd(int64_t t, int64_t duration, char unit, int32_t precision) { if (duration == 0) { @@ -900,7 +916,8 @@ int64_t taosTimeTruncate(int64_t ts, const SInterval* pInterval) { // used together with taosTimeTruncate. when offset is great than zero, slide-start/slide-end is the anchor point int64_t taosTimeGetIntervalEnd(int64_t intervalStart, const SInterval* pInterval) { if (pInterval->offset > 0) { - int64_t slideStart = taosTimeAdd(intervalStart, -1 * pInterval->offset, pInterval->offsetUnit, pInterval->precision); + int64_t slideStart = + taosTimeAdd(intervalStart, -1 * pInterval->offset, pInterval->offsetUnit, pInterval->precision); int64_t slideEnd = taosTimeAdd(slideStart, pInterval->interval, pInterval->intervalUnit, pInterval->precision) - 1; int64_t result = taosTimeAdd(slideEnd, pInterval->offset, pInterval->offsetUnit, pInterval->precision); return result; @@ -960,7 +977,9 @@ const char* fmtts(int64_t ts) { return buf; } -void taosFormatUtcTime(char* buf, int32_t bufLen, int64_t t, int32_t precision) { +int32_t taosFormatUtcTime(char* buf, int32_t bufLen, int64_t t, int32_t precision) { + int32_t code = TSDB_CODE_SUCCESS; + char ts[40] = {0}; struct tm ptm; @@ -996,17 +1015,18 @@ void taosFormatUtcTime(char* buf, int32_t bufLen, int64_t t, int32_t precision) default: fractionLen = 0; - return; + TAOS_RETURN(TSDB_CODE_INVALID_PARA); } if (taosLocalTime(", &ptm, buf) == NULL) { - return; + TAOS_RETURN(TAOS_SYSTEM_ERROR(errno)); } int32_t length = (int32_t)strftime(ts, 40, "%Y-%m-%dT%H:%M:%S", &ptm); length += snprintf(ts + length, fractionLen, format, mod); length += (int32_t)strftime(ts + length, 40 - length, "%z", &ptm); tstrncpy(buf, ts, bufLen); + TAOS_RETURN(TSDB_CODE_SUCCESS); } int32_t taosTs2Tm(int64_t ts, int32_t precision, struct STm* tm) { @@ -1055,7 +1075,7 @@ typedef enum { TSFKW_Mon, TSFKW_MS, TSFKW_NS, - //TSFKW_OF, + // TSFKW_OF, TSFKW_PM, TSFKW_P_M, TSFKW_SS, @@ -1076,7 +1096,7 @@ typedef enum { TSFKW_day, TSFKW_ddd, TSFKW_dd, - TSFKW_dy, // mon, tue + TSFKW_dy, // mon, tue TSFKW_d, TSFKW_hh24, TSFKW_hh12, @@ -1268,7 +1288,7 @@ static void parseTsFormat(const char* formatStr, SArray* formats) { } if (*formatStr == '\\' && *(formatStr + 1)) { formatStr++; - last = NULL; // stop expanding last format, create new format + last = NULL; // stop expanding last format, create new format } if (last) { // expand @@ -1289,7 +1309,7 @@ static void parseTsFormat(const char* formatStr, SArray* formats) { // for other strings if (*formatStr == '\\' && *(formatStr + 1)) { formatStr++; - lastOtherFormat = NULL; // stop expanding + lastOtherFormat = NULL; // stop expanding } else { if (lastOtherFormat && !isSeperatorChar(*formatStr)) { // expanding @@ -1304,8 +1324,8 @@ static void parseTsFormat(const char* formatStr, SArray* formats) { formatStr++; } else { TSFormatNode format = { - .type = isSeperatorChar(*formatStr) ? TS_FORMAT_NODE_TYPE_SEPARATOR : TS_FORMAT_NODE_TYPE_CHAR, - .key = NULL}; + .type = isSeperatorChar(*formatStr) ? TS_FORMAT_NODE_TYPE_SEPARATOR : TS_FORMAT_NODE_TYPE_CHAR, + .key = NULL}; format.c = formatStr; format.len = 1; taosArrayPush(formats, &format); @@ -1318,7 +1338,7 @@ static void parseTsFormat(const char* formatStr, SArray* formats) { } static int32_t tm2char(const SArray* formats, const struct STm* tm, char* s, int32_t outLen) { - int32_t size = taosArrayGetSize(formats); + int32_t size = taosArrayGetSize(formats); const char* start = s; for (int32_t i = 0; i < size; ++i) { TSFormatNode* format = taosArrayGet(formats, i); @@ -1923,8 +1943,8 @@ int32_t taosTs2Char(const char* format, SArray** formats, int64_t ts, int32_t pr return tm2char(*formats, &tm, out, outLen); } -int32_t taosChar2Ts(const char* format, SArray** formats, const char* tsStr, int64_t* ts, int32_t precision, char* errMsg, - int32_t errMsgLen) { +int32_t taosChar2Ts(const char* format, SArray** formats, const char* tsStr, int64_t* ts, int32_t precision, + char* errMsg, int32_t errMsgLen) { const char* sErrPos; int32_t fErrIdx; if (!*formats) { @@ -1977,26 +1997,27 @@ static int8_t UNIT_INDEX[26] = {/*a*/ 2, 0, -1, 6, -1, -1, -1, #define GET_UNIT_INDEX(idx) UNIT_INDEX[(idx) - 97] -static int64_t UNIT_MATRIX[10][11] = { /* ns, us, ms, s, min, h, d, w, month, y*/ - /*ns*/ { 1, 1000, 0}, - /*us*/ {1000, 1, 1000, 0}, - /*ms*/ { 0, 1000, 1, 1000, 0}, - /*s*/ { 0, 0, 1000, 1, 60, 0}, - /*min*/ { 0, 0, 0, 60, 1, 60, 0}, - /*h*/ { 0, 0, 0, 0, 60, 1, 1, 0}, - /*d*/ { 0, 0, 0, 0, 0, 24, 1, 7, 1, 0}, - /*w*/ { 0, 0, 0, 0, 0, 0, 7, 1, -1, 0}, - /*mon*/ { 0, 0, 0, 0, 0, 0, 0, 0, 1, 12, 0}, - /*y*/ { 0, 0, 0, 0, 0, 0, 0, 0, 12, 1, 0}}; +static int64_t UNIT_MATRIX[10][11] = {/* ns, us, ms, s, min, h, d, w, month, y*/ + /*ns*/ {1, 1000, 0}, + /*us*/ {1000, 1, 1000, 0}, + /*ms*/ {0, 1000, 1, 1000, 0}, + /*s*/ {0, 0, 1000, 1, 60, 0}, + /*min*/ {0, 0, 0, 60, 1, 60, 0}, + /*h*/ {0, 0, 0, 0, 60, 1, 1, 0}, + /*d*/ {0, 0, 0, 0, 0, 24, 1, 7, 1, 0}, + /*w*/ {0, 0, 0, 0, 0, 0, 7, 1, -1, 0}, + /*mon*/ {0, 0, 0, 0, 0, 0, 0, 0, 1, 12, 0}, + /*y*/ {0, 0, 0, 0, 0, 0, 0, 0, 12, 1, 0}}; -static bool recursiveTsmaCheckRecursive(int64_t baseInterval, int8_t baseIdx, int64_t interval, int8_t idx, bool checkEq) { +static bool recursiveTsmaCheckRecursive(int64_t baseInterval, int8_t baseIdx, int64_t interval, int8_t idx, + bool checkEq) { if (UNIT_MATRIX[baseIdx][idx] == -1) return false; if (baseIdx == idx) { if (interval < baseInterval) return false; if (checkEq && interval == baseInterval) return false; return interval % baseInterval == 0; } - int8_t next = baseIdx + 1; + int8_t next = baseIdx + 1; int64_t val = UNIT_MATRIX[baseIdx][next]; while (val != 0 && next <= idx) { if (val == -1) { @@ -2006,7 +2027,7 @@ static bool recursiveTsmaCheckRecursive(int64_t baseInterval, int8_t baseIdx, in } if (val % baseInterval == 0 || baseInterval % val == 0) { int8_t extra = baseInterval >= val ? 0 : 1; - bool needCheckEq = baseInterval >= val && !(baseIdx < next && val == 1); + bool needCheckEq = baseInterval >= val && !(baseIdx < next && val == 1); if (!recursiveTsmaCheckRecursive(baseInterval / val + extra, next, interval, idx, needCheckEq && checkEq)) { next++; val = UNIT_MATRIX[baseIdx][next]; @@ -2021,7 +2042,8 @@ static bool recursiveTsmaCheckRecursive(int64_t baseInterval, int8_t baseIdx, in return false; } -static bool recursiveTsmaCheckRecursiveReverse(int64_t baseInterval, int8_t baseIdx, int64_t interval, int8_t idx, bool checkEq) { +static bool recursiveTsmaCheckRecursiveReverse(int64_t baseInterval, int8_t baseIdx, int64_t interval, int8_t idx, + bool checkEq) { if (UNIT_MATRIX[baseIdx][idx] == -1) return false; if (baseIdx == idx) { @@ -2030,7 +2052,7 @@ static bool recursiveTsmaCheckRecursiveReverse(int64_t baseInterval, int8_t base return interval % baseInterval == 0; } - int8_t next = baseIdx - 1; + int8_t next = baseIdx - 1; int64_t val = UNIT_MATRIX[baseIdx][next]; while (val != 0 && next >= 0) { return recursiveTsmaCheckRecursiveReverse(baseInterval * val, next, interval, idx, checkEq); @@ -2041,18 +2063,27 @@ static bool recursiveTsmaCheckRecursiveReverse(int64_t baseInterval, int8_t base /* * @breif check if tsma with param [interval], [unit] can create based on base tsma with baseInterval and baseUnit * @param baseInterval, baseUnit, interval/unit of base tsma - * @param interval the tsma interval going to create. Not that if unit is not calander unit, then interval has already been - * translated to TICKS of [precision] + * @param interval the tsma interval going to create. Not that if unit is not calander unit, then interval has already + * been translated to TICKS of [precision] * @param unit the tsma unit going to create * @param precision the precision of this db * @param checkEq pass true if same interval is not acceptable, false if acceptable. * @ret true the tsma can be created, else cannot * */ -bool checkRecursiveTsmaInterval(int64_t baseInterval, int8_t baseUnit, int64_t interval, int8_t unit, int8_t precision, bool checkEq) { +bool checkRecursiveTsmaInterval(int64_t baseInterval, int8_t baseUnit, int64_t interval, int8_t unit, int8_t precision, + bool checkEq) { bool baseIsCalendarDuration = IS_CALENDAR_TIME_DURATION(baseUnit); - if (!baseIsCalendarDuration) baseInterval = convertTimeFromPrecisionToUnit(baseInterval, precision, baseUnit); + if (!baseIsCalendarDuration) { + if (TSDB_CODE_SUCCESS != convertTimeFromPrecisionToUnit(baseInterval, precision, baseUnit, &baseInterval)) { + return false; + } + } bool isCalendarDuration = IS_CALENDAR_TIME_DURATION(unit); - if (!isCalendarDuration) interval = convertTimeFromPrecisionToUnit(interval, precision, unit); + if (!isCalendarDuration) { + if (TSDB_CODE_SUCCESS != convertTimeFromPrecisionToUnit(interval, precision, unit, &interval)) { + return false; + } + } bool needCheckEq = baseIsCalendarDuration == isCalendarDuration && checkEq; diff --git a/source/dnode/mnode/impl/src/mndSma.c b/source/dnode/mnode/impl/src/mndSma.c index 946df84a0f..ea53e82459 100644 --- a/source/dnode/mnode/impl/src/mndSma.c +++ b/source/dnode/mnode/impl/src/mndSma.c @@ -98,7 +98,7 @@ int32_t mndInitSma(SMnode *pMnode) { mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_INDEX, mndRetrieveIdx); mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_INDEX, mndCancelRetrieveIdx); - + mndSetMsgHandle(pMnode, TDMT_MND_CREATE_TSMA, mndProcessCreateTSMAReq); mndSetMsgHandle(pMnode, TDMT_MND_DROP_TSMA, mndProcessDropTSMAReq); mndSetMsgHandle(pMnode, TDMT_MND_GET_TABLE_TSMA, mndProcessGetTbTSMAReq); @@ -616,7 +616,12 @@ static int32_t mndCreateSma(SMnode *pMnode, SRpcMsg *pReq, SMCreateSmaReq *pCrea // check the maxDelay if (streamObj.conf.triggerParam < TSDB_MIN_ROLLUP_MAX_DELAY) { - int64_t msInterval = convertTimeFromPrecisionToUnit(pCreate->interval, pDb->cfg.precision, TIME_UNIT_MILLISECOND); + int64_t msInterval = -1; + int32_t code = convertTimeFromPrecisionToUnit(pCreate->interval, pDb->cfg.precision, TIME_UNIT_MILLISECOND, &msInterval); + if (TSDB_CODE_SUCCESS != code) { + mError("sma:%s, failed to create since convert time failed: %s", smaObj.name, tstrerror(code)); + return code; + } streamObj.conf.triggerParam = msInterval > TSDB_MIN_ROLLUP_MAX_DELAY ? msInterval : TSDB_MIN_ROLLUP_MAX_DELAY; } if (streamObj.conf.triggerParam > TSDB_MAX_ROLLUP_MAX_DELAY) { diff --git a/source/dnode/vnode/src/sma/smaOpen.c b/source/dnode/vnode/src/sma/smaOpen.c index 633e096314..29854b4441 100644 --- a/source/dnode/vnode/src/sma/smaOpen.c +++ b/source/dnode/vnode/src/sma/smaOpen.c @@ -23,7 +23,9 @@ static int32_t rsmaRestore(SSma *pSma); #define SMA_SET_KEEP_CFG(v, l) \ do { \ SRetention *r = &pCfg->retentions[l]; \ - pKeepCfg->keep2 = convertTimeFromPrecisionToUnit(r->keep, pCfg->precision, TIME_UNIT_MINUTE); \ + int64_t keep = -1; \ + convertTimeFromPrecisionToUnit(r->keep, pCfg->precision, TIME_UNIT_MINUTE, &keep); \ + pKeepCfg->keep2 = (int32_t)keep; \ pKeepCfg->keep0 = pKeepCfg->keep2; \ pKeepCfg->keep1 = pKeepCfg->keep2; \ pKeepCfg->days = smaEvalDays(v, pCfg->retentions, l, pCfg->precision, pCfg->days); \ @@ -60,8 +62,12 @@ static int32_t rsmaRestore(SSma *pSma); * @return int32_t */ static int32_t smaEvalDays(SVnode *pVnode, SRetention *r, int8_t level, int8_t precision, int32_t duration) { - int32_t freqDuration = convertTimeFromPrecisionToUnit((r + TSDB_RETENTION_L0)->freq, precision, TIME_UNIT_MINUTE); - int32_t keepDuration = convertTimeFromPrecisionToUnit((r + TSDB_RETENTION_L0)->keep, precision, TIME_UNIT_MINUTE); + int32_t code = TSDB_CODE_SUCCESS; + + int64_t freqDuration = -1; + int64_t keepDuration = -1; + code = convertTimeFromPrecisionToUnit((r + TSDB_RETENTION_L0)->freq, precision, TIME_UNIT_MINUTE, &freqDuration); + code = convertTimeFromPrecisionToUnit((r + TSDB_RETENTION_L0)->keep, precision, TIME_UNIT_MINUTE, &keepDuration); int32_t days = duration; // min if (days < freqDuration) { @@ -76,8 +82,8 @@ static int32_t smaEvalDays(SVnode *pVnode, SRetention *r, int8_t level, int8_t p goto _exit; } - freqDuration = convertTimeFromPrecisionToUnit((r + level)->freq, precision, TIME_UNIT_MINUTE); - keepDuration = convertTimeFromPrecisionToUnit((r + level)->keep, precision, TIME_UNIT_MINUTE); + code = convertTimeFromPrecisionToUnit((r + level)->freq, precision, TIME_UNIT_MINUTE, &freqDuration); + code = convertTimeFromPrecisionToUnit((r + level)->keep, precision, TIME_UNIT_MINUTE, &keepDuration); int32_t nFreqTimes = (r + level)->freq / (60 * 1000); // use 60s for freq of 1st level days *= (nFreqTimes > 1 ? nFreqTimes : 1); diff --git a/source/dnode/vnode/src/sma/smaRollup.c b/source/dnode/vnode/src/sma/smaRollup.c index 5ab2a57954..823f65a9fd 100644 --- a/source/dnode/vnode/src/sma/smaRollup.c +++ b/source/dnode/vnode/src/sma/smaRollup.c @@ -335,8 +335,9 @@ static int32_t tdSetRSmaInfoItemParams(SSma *pSma, SRSmaParam *param, SRSmaStat } if (param->maxdelay[idx] < TSDB_MIN_ROLLUP_MAX_DELAY) { - int64_t msInterval = - convertTimeFromPrecisionToUnit(pRetention[idx + 1].freq, pTsdbCfg->precision, TIME_UNIT_MILLISECOND); + int64_t msInterval = -1; + TAOS_CHECK_RETURN(convertTimeFromPrecisionToUnit(pRetention[idx + 1].freq, pTsdbCfg->precision, + TIME_UNIT_MILLISECOND, &msInterval)); pItem->maxDelay = (int32_t)msInterval; } else { pItem->maxDelay = (int32_t)param->maxdelay[idx]; diff --git a/source/dnode/vnode/src/sma/smaTimeRange.c b/source/dnode/vnode/src/sma/smaTimeRange.c index d0913081ac..fe3117de49 100644 --- a/source/dnode/vnode/src/sma/smaTimeRange.c +++ b/source/dnode/vnode/src/sma/smaTimeRange.c @@ -69,8 +69,9 @@ static int32_t tdProcessTSmaGetDaysImpl(SVnodeCfg *pCfg, void *pCont, uint32_t c } STsdbCfg *pTsdbCfg = &pCfg->tsdbCfg; - int64_t sInterval = convertTimeFromPrecisionToUnit(tsma.interval, pTsdbCfg->precision, TIME_UNIT_SECOND); - if (sInterval <= 0) { + int64_t sInterval = -1; + code = convertTimeFromPrecisionToUnit(tsma.interval, pTsdbCfg->precision, TIME_UNIT_SECOND, &sInterval); + if (TSDB_CODE_SUCCESS != code || 0 == sInterval) { *days = pTsdbCfg->days; goto _exit; } @@ -78,7 +79,11 @@ static int32_t tdProcessTSmaGetDaysImpl(SVnodeCfg *pCfg, void *pCont, uint32_t c if (records >= SMA_STORAGE_SPLIT_FACTOR) { *days = pTsdbCfg->days; } else { - int64_t mInterval = convertTimeFromPrecisionToUnit(tsma.interval, pTsdbCfg->precision, TIME_UNIT_MINUTE); + int64_t mInterval = -1; + code = convertTimeFromPrecisionToUnit(tsma.interval, pTsdbCfg->precision, TIME_UNIT_MINUTE, &mInterval); + if (TSDB_CODE_SUCCESS != code) { + goto _exit; + } int64_t daysPerFile = mInterval * SMA_STORAGE_MINUTES_DAY * 2; if (daysPerFile > SMA_STORAGE_MINUTES_MAX) { diff --git a/source/libs/command/inc/commandInt.h b/source/libs/command/inc/commandInt.h index a583f21117..e433d61860 100644 --- a/source/libs/command/inc/commandInt.h +++ b/source/libs/command/inc/commandInt.h @@ -176,7 +176,14 @@ typedef struct SExplainCtx { #define EXPLAIN_JOIN_STRING(_type) ((JOIN_TYPE_INNER == _type) ? "Inner join" : "Join") #define EXPLAIN_MERGE_MODE_STRING(_mode) ((_mode) == MERGE_TYPE_SORT ? "sort" : ((_mode) == MERGE_TYPE_NON_SORT ? "merge" : "column")) -#define INVERAL_TIME_FROM_PRECISION_TO_UNIT(_t, _u, _p) (((_u) == 'n' || (_u) == 'y') ? (_t) : (convertTimeFromPrecisionToUnit(_t, _p, _u))) +#define INVERAL_TIME_FROM_PRECISION_TO_UNIT(_t, _u, _p, _r) \ +do { \ + if ((_u) == 'n' || (_u) == 'y') { \ + _r = (_t); \ + } else { \ + code = convertTimeFromPrecisionToUnit(_t, _p, _u, &_r); \ + } \ +} while(0) #define EXPLAIN_ROW_NEW(level, ...) \ do { \ diff --git a/source/libs/command/src/explain.c b/source/libs/command/src/explain.c index 843e3ee734..e0040ac0e1 100644 --- a/source/libs/command/src/explain.c +++ b/source/libs/command/src/explain.c @@ -55,7 +55,7 @@ char* qExplainGetAsofOpStr(int32_t opType) { case OP_TYPE_LOWER_EQUAL: return "<="; case OP_TYPE_EQUAL: - return "="; + return "="; default: return "UNKNOWN"; } @@ -192,13 +192,13 @@ int32_t qExplainGenerateResNodeExecInfo(SPhysiNode *pNode, SArray **pExecInfo, S if (0 == group->physiPlanExecIdx) { group->nodeIdx = 0; } - + rsp = taosArrayGet(group->nodeExecInfo, group->nodeIdx++); if (group->physiPlanExecIdx >= rsp->numOfPlans) { qError("physiPlanIdx %d exceed plan num %d", group->physiPlanExecIdx, rsp->numOfPlans); return TSDB_CODE_APP_ERROR; } - + if(taosArrayPush(*pExecInfo, rsp->subplanInfo + group->physiPlanExecIdx) == NULL) return terrno; } else { for (int32_t i = 0; i < group->nodeNum; ++i) { @@ -338,7 +338,7 @@ static char* qExplainGetScanMode(STableScanPhysiNode* pScan) { isGroupByTag = (NULL != pScan->pGroupTags) && !isGroupByTbname; if ((((!isGroupByTag) || isGroupByTbname) && pScan->groupSort) || (isGroupByTag && (pScan->groupSort || pScan->scan.groupOrderScan))) { return "seq_grp_order"; - } + } if ((isGroupByTbname && (pScan->groupSort || pScan->scan.groupOrderScan)) || (isGroupByTag && (pScan->groupSort || pScan->scan.groupOrderScan))) { return "grp_order"; @@ -416,7 +416,7 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen)); EXPLAIN_ROW_END(); QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1)); - } + } } break; } @@ -581,7 +581,7 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen)); EXPLAIN_ROW_END(); QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1)); - } + } } break; } @@ -621,7 +621,7 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i EXPLAIN_ROW_NEW(level + 1, EXPLAIN_MERGEBLOCKS_FORMAT, pPrjNode->mergeDataBlock? "True":"False"); EXPLAIN_ROW_END(); - QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1)); + QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1)); if (pPrjNode->node.pConditions) { EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT); @@ -629,7 +629,7 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen)); EXPLAIN_ROW_END(); QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1)); - } + } } break; } @@ -689,7 +689,7 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i EXPLAIN_ROW_APPEND(EXPLAIN_GRP_JOIN_FORMAT, pJoinNode->grpJoin); EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT); EXPLAIN_ROW_END(); - + QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1)); } @@ -705,7 +705,7 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i EXPLAIN_ROW_NEW(level + 1, EXPLAIN_PRIM_CONDITIONS_FORMAT); QRY_ERR_RET(nodesNodeToSQL(pJoinNode->pPrimKeyCond, tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen)); EXPLAIN_ROW_END(); - QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1)); + QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1)); } if (NULL != pJoinNode->pEqLeft && pJoinNode->pEqLeft->length > 0) { @@ -733,7 +733,7 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i QRY_ERR_RET( nodesNodeToSQL(pJoinNode->pFullOnCond, tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen)); EXPLAIN_ROW_END(); - QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1)); + QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1)); } if (NULL != pJoinNode->pColOnCond) { @@ -741,7 +741,7 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i QRY_ERR_RET( nodesNodeToSQL(pJoinNode->pColOnCond, tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen)); EXPLAIN_ROW_END(); - QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1)); + QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1)); } } break; @@ -831,7 +831,7 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen)); EXPLAIN_ROW_END(); QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1)); - } + } } break; } @@ -844,7 +844,7 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i qError("exchange src group %d not in groupHash", pExchNode->srcStartGroupId); QRY_ERR_RET(TSDB_CODE_APP_ERROR); } - + nodeNum += group->nodeNum; } @@ -876,7 +876,7 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen)); EXPLAIN_ROW_END(); QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1)); - } + } } for (int32_t i = pExchNode->srcStartGroupId; i <= pExchNode->srcEndGroupId; ++i) { @@ -956,7 +956,7 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen)); EXPLAIN_ROW_END(); QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1)); - } + } } break; } @@ -991,10 +991,17 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i EXPLAIN_ROW_END(); QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1)); uint8_t precision = qExplainGetIntervalPrecision(pIntNode); + int64_t time1 = -1; + int64_t time2 = -1; + int32_t code = TSDB_CODE_SUCCESS; + INVERAL_TIME_FROM_PRECISION_TO_UNIT(pIntNode->interval, pIntNode->intervalUnit, precision, time1); + QRY_ERR_RET(code); + INVERAL_TIME_FROM_PRECISION_TO_UNIT(pIntNode->sliding, pIntNode->slidingUnit, precision, time2); + QRY_ERR_RET(code); EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIME_WINDOWS_FORMAT, - INVERAL_TIME_FROM_PRECISION_TO_UNIT(pIntNode->interval, pIntNode->intervalUnit, precision), + time1, pIntNode->intervalUnit, pIntNode->offset, getPrecisionUnit(precision), - INVERAL_TIME_FROM_PRECISION_TO_UNIT(pIntNode->sliding, pIntNode->slidingUnit, precision), + time2, pIntNode->slidingUnit); EXPLAIN_ROW_END(); QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1)); @@ -1043,10 +1050,17 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i EXPLAIN_ROW_END(); QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1)); uint8_t precision = qExplainGetIntervalPrecision(pIntNode); + int64_t time1 = -1; + int64_t time2 = -1; + int32_t code = TSDB_CODE_SUCCESS; + INVERAL_TIME_FROM_PRECISION_TO_UNIT(pIntNode->interval, pIntNode->intervalUnit, precision, time1); + QRY_ERR_RET(code); + INVERAL_TIME_FROM_PRECISION_TO_UNIT(pIntNode->sliding, pIntNode->slidingUnit, precision, time2); + QRY_ERR_RET(code); EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIME_WINDOWS_FORMAT, - INVERAL_TIME_FROM_PRECISION_TO_UNIT(pIntNode->interval, pIntNode->intervalUnit, precision), + time1, pIntNode->intervalUnit, pIntNode->offset, getPrecisionUnit(precision), - INVERAL_TIME_FROM_PRECISION_TO_UNIT(pIntNode->sliding, pIntNode->slidingUnit, precision), + time2, pIntNode->slidingUnit); EXPLAIN_ROW_END(); QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1)); @@ -1123,7 +1137,7 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen)); EXPLAIN_ROW_END(); QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1)); - } + } } break; } @@ -1163,7 +1177,7 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen)); EXPLAIN_ROW_END(); QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1)); - } + } } break; } @@ -1205,7 +1219,7 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen)); EXPLAIN_ROW_END(); QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1)); - } + } } break; } @@ -1247,7 +1261,7 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen)); EXPLAIN_ROW_END(); QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1)); - } + } } break; } @@ -1340,7 +1354,7 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen)); EXPLAIN_ROW_END(); QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1)); - } + } } break; } @@ -1381,7 +1395,7 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen)); EXPLAIN_ROW_END(); QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1)); - } + } } break; } @@ -1422,7 +1436,7 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen)); EXPLAIN_ROW_END(); QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1)); - } + } } break; } @@ -1464,7 +1478,7 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen)); EXPLAIN_ROW_END(); QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1)); - } + } } break; } @@ -1535,7 +1549,7 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen)); EXPLAIN_ROW_END(); QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1)); - } + } } break; } @@ -1563,10 +1577,17 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i EXPLAIN_ROW_END(); QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1)); uint8_t precision = qExplainGetIntervalPrecision(pIntNode); + int64_t time1 = -1; + int64_t time2 = -1; + int32_t code = TSDB_CODE_SUCCESS; + INVERAL_TIME_FROM_PRECISION_TO_UNIT(pIntNode->interval, pIntNode->intervalUnit, precision, time1); + QRY_ERR_RET(code); + INVERAL_TIME_FROM_PRECISION_TO_UNIT(pIntNode->sliding, pIntNode->slidingUnit, precision, time2); + QRY_ERR_RET(code); EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIME_WINDOWS_FORMAT, - INVERAL_TIME_FROM_PRECISION_TO_UNIT(pIntNode->interval, pIntNode->intervalUnit, precision), + time1, pIntNode->intervalUnit, pIntNode->offset, getPrecisionUnit(precision), - INVERAL_TIME_FROM_PRECISION_TO_UNIT(pIntNode->sliding, pIntNode->slidingUnit, precision), + time2, pIntNode->slidingUnit); EXPLAIN_ROW_END(); QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1)); @@ -1577,7 +1598,7 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen)); EXPLAIN_ROW_END(); QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1)); - } + } } break; } @@ -1644,7 +1665,7 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen)); EXPLAIN_ROW_END(); QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1)); - } + } } break; } @@ -1669,7 +1690,7 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen)); EXPLAIN_ROW_END(); QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1)); - + EXPLAIN_ROW_NEW(level + 1, EXPLAIN_EVENT_END_FORMAT); QRY_ERR_RET(nodesNodeToSQL(pEventNode->pEndCond, tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen)); @@ -1722,7 +1743,7 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i if (pJoinNode->pPrimKeyCond) { QRY_ERR_RET( nodesNodeToSQL(pJoinNode->pPrimKeyCond, tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen)); - conditionsGot = true; + conditionsGot = true; } if (pJoinNode->pColEqCond) { if (conditionsGot) { @@ -1730,7 +1751,7 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i } QRY_ERR_RET( nodesNodeToSQL(pJoinNode->pColEqCond, tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen)); - conditionsGot = true; + conditionsGot = true; } if (pJoinNode->pTagEqCond) { if (conditionsGot) { @@ -1738,7 +1759,7 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i } QRY_ERR_RET( nodesNodeToSQL(pJoinNode->pTagEqCond, tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen)); - conditionsGot = true; + conditionsGot = true; } if (pJoinNode->pFullOnCond) { if (conditionsGot) { @@ -1746,14 +1767,14 @@ int32_t qExplainResNodeToRowsImpl(SExplainResNode *pResNode, SExplainCtx *ctx, i } QRY_ERR_RET(nodesNodeToSQL(pJoinNode->pFullOnCond, tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen)); - } + } EXPLAIN_ROW_END(); - QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1)); + QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1)); if (pJoinNode->timeRangeTarget) { EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TABLE_TIMERANGE_FORMAT, qExplainGetTimerangeTargetStr(pJoinNode->timeRangeTarget), pJoinNode->timeRange.skey, pJoinNode->timeRange.ekey); EXPLAIN_ROW_END(); - QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1)); + QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1)); } } break; @@ -2124,7 +2145,7 @@ int32_t qExplainUpdateExecInfo(SExplainCtx *pCtx, SExplainRsp *pRspMsg, int32_t code = TSDB_CODE_OUT_OF_MEMORY; TAOS_CHECK_ERRNO(code); } - + groupDone = (taosArrayGetSize(group->nodeExecInfo) >= group->nodeNum); taosWUnLockLatch(&group->lock); diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index c2278649e1..26321a0215 100644 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -1523,7 +1523,7 @@ static int32_t biMakeTbnameProjectAstNode(char* funcName, char* tableAlias, SNod if (!multiResFunc) { code = TSDB_CODE_OUT_OF_MEMORY; } - + if (TSDB_CODE_SUCCESS == code) { tstrncpy(multiResFunc->functionName, funcName, TSDB_FUNC_NAME_LEN); code = nodesListMakeStrictAppend(&multiResFunc->pParameterList, (SNode*)tbNameFunc); @@ -5210,7 +5210,8 @@ static int32_t translateFill(STranslateContext* pCxt, SSelectStmt* pSelect, SInt } static int64_t getMonthsFromTimeVal(int64_t val, int32_t fromPrecision, char unit) { - int64_t days = convertTimeFromPrecisionToUnit(val, fromPrecision, 'd'); + int64_t days = -1; + convertTimeFromPrecisionToUnit(val, fromPrecision, 'd', &days); switch (unit) { case 'b': case 'u': @@ -8209,7 +8210,8 @@ static SNode* makeIntervalVal(SRetention* pRetension, int8_t precision) { if (NULL == pVal) { return NULL; } - int64_t timeVal = convertTimeFromPrecisionToUnit(pRetension->freq, precision, pRetension->freqUnit); + int64_t timeVal = -1; + convertTimeFromPrecisionToUnit(pRetension->freq, precision, pRetension->freqUnit, &timeVal); char buf[20] = {0}; int32_t len = snprintf(buf, sizeof(buf), "%" PRId64 "%c", timeVal, pRetension->freqUnit); pVal->literal = strndup(buf, len); @@ -8758,7 +8760,7 @@ static int32_t translateUseDatabase(STranslateContext* pCxt, SUseDatabaseStmt* p if (TSDB_CODE_SUCCESS == code) { code = tNameExtractFullName(&name, usedbReq.db); } - if (TSDB_CODE_SUCCESS == code) + if (TSDB_CODE_SUCCESS == code) code = getDBVgVersion(pCxt, usedbReq.db, &usedbReq.vgVersion, &usedbReq.dbId, &usedbReq.numOfTable, &usedbReq.stateTs); if (TSDB_CODE_SUCCESS == code) { code = buildCmdMsg(pCxt, TDMT_MND_USE_DB, (FSerializeFunc)tSerializeSUseDbReq, &usedbReq); diff --git a/tests/system-test/2-query/select_null.py b/tests/system-test/2-query/select_null.py index 682a98ad19..d6e48e4f99 100755 --- a/tests/system-test/2-query/select_null.py +++ b/tests/system-test/2-query/select_null.py @@ -33,7 +33,7 @@ class TDTestCase: self.testcasePath = os.path.split(__file__)[0] self.testcaseFilename = os.path.split(__file__)[-1] os.system("rm -rf %s/%s.sql" % (self.testcasePath,self.testcaseFilename)) - + self.db = "sel_null" def insert_data(self,database,vgroups): @@ -46,10 +46,10 @@ class TDTestCase: for i in range(5): tdSql.execute('''create table %s.stb0_%d using %s.stb0 tags(%d,'varchar%d',%d,%d, %d, %d,%d,'binary%d','nchar%d',%d,%d,%d ) ;'''%(database,i,database,i,i,i,i,i,i,i,i,i,i,i,i)) - + # insert data - for i in range(num_random): - for j in range(50): + for i in range(num_random): + for j in range(50): tdSql.execute('''insert into %s.stb0_0 (ts , c1 , c0) values(now, %d, %d) ;''' % (database,j,j)) tdSql.execute('''insert into %s.stb0_1 (ts , c1 , c0) values(now, %d, %d) ;''' % (database,j,j)) tdSql.execute('''insert into %s.stb0_2 (ts , c1 , c0) values(now, %d, %d) ;''' % (database,j,j)) @@ -60,378 +60,378 @@ class TDTestCase: tdSql.checkData(0,0,5*num_random*50) tdSql.query("select count(*) from %s.stb0_0;"%database) tdSql.checkData(0,0,num_random*50) - - def ts_3085(self,database): + + def ts_3085(self,database): sql = "select count(c0null) from(select * from %s.stb0 limit 20,4) "%(database) - tdSql.query(sql) + tdSql.query(sql) tdSql.checkData(0,0,0) - + offset = random.randint(10,100) for i in range(offset): sql = "select count(c0null) from(select * from %s.stb0 limit %d,%d) "%(database,offset,i) - tdSql.query(sql) + tdSql.query(sql) tdSql.checkData(0,0,0) sql = "select count(c1null) from(select * from %s.stb0 limit %d,%d) "%(database,offset,i) - tdSql.query(sql) + tdSql.query(sql) tdSql.checkData(0,0,0) sql = "select count(c0) from(select * from %s.stb0 limit %d,%d) "%(database,offset,i) - tdSql.query(sql) + tdSql.query(sql) tdSql.checkData(0,0,i) sql = "select count(c1) from(select * from %s.stb0 limit %d,%d) "%(database,offset,i) - tdSql.query(sql) + tdSql.query(sql) tdSql.checkData(0,0,i) sql = "select count(t0) from(select * from %s.stb0 limit %d,%d) "%(database,offset,i) - tdSql.query(sql) + tdSql.query(sql) tdSql.checkData(0,0,i) sql = "select count(t1) from(select * from %s.stb0 limit %d,%d) "%(database,offset,i) - tdSql.query(sql) + tdSql.query(sql) tdSql.checkData(0,0,i) - def ts_2974_max(self,database): + def ts_2974_max(self,database): sql = "select max(c0) from %s.stb0 where ts Date: Fri, 19 Jul 2024 11:31:46 +0800 Subject: [PATCH 2/4] feat: (errcode) geomFunc.c --- source/libs/geometry/src/geomFunc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/libs/geometry/src/geomFunc.c b/source/libs/geometry/src/geomFunc.c index 6e32aaf1a6..601588571e 100644 --- a/source/libs/geometry/src/geomFunc.c +++ b/source/libs/geometry/src/geomFunc.c @@ -180,7 +180,7 @@ int32_t executeGeomFromTextFunc(SColumnInfoData *pInputData, int32_t i, SColumnI goto _exit; } - colDataSetVal(pOutputData, i, output, (output == NULL)); + code = colDataSetVal(pOutputData, i, output, (output == NULL)); _exit: if (output) { @@ -200,7 +200,7 @@ int32_t executeAsTextFunc(SColumnInfoData *pInputData, int32_t i, SColumnInfoDat goto _exit; } - colDataSetVal(pOutputData, i, output, (output == NULL)); + code = colDataSetVal(pOutputData, i, output, (output == NULL)); _exit: if (output) { @@ -228,7 +228,7 @@ int32_t executeRelationFunc(const GEOSGeometry *geom1, const GEOSPreparedGeometr } } - colDataSetVal(pOutputData, i, &res, (res==-1)); + code = colDataSetVal(pOutputData, i, &res, (res==-1)); return code; } From bebe2c5266a71565921519b8eee4ac4ec81e5664 Mon Sep 17 00:00:00 2001 From: Shungang Li Date: Fri, 19 Jul 2024 11:36:03 +0800 Subject: [PATCH 3/4] feat: (errcode) geosWrapper.c --- source/libs/geometry/src/geosWrapper.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source/libs/geometry/src/geosWrapper.c b/source/libs/geometry/src/geosWrapper.c index c7c83f4796..c5250c8481 100644 --- a/source/libs/geometry/src/geosWrapper.c +++ b/source/libs/geometry/src/geosWrapper.c @@ -86,9 +86,9 @@ _exit: return code; } -static int initWktRegex(pcre2_code **ppRegex, pcre2_match_data **ppMatchData) { - int ret = 0; - char *wktPatternWithSpace = taosMemoryCalloc(4, 1024); +static int32_t initWktRegex(pcre2_code **ppRegex, pcre2_match_data **ppMatchData) { + int32_t code = 0; + char *wktPatternWithSpace = taosMemoryCalloc(4, 1024); sprintf( wktPatternWithSpace, "^( *)point( *)z?m?( *)((empty)|(\\(( *)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?(( " @@ -142,9 +142,9 @@ static int initWktRegex(pcre2_code **ppRegex, pcre2_match_data **ppMatchData) { "*)(([-+]?[0-9]+\\.?[0-9]*)|([-+]?[0-9]*\\.?[0-9]+))(e[-+]?[0-9]+)?){1,3}( *))*( *)\\)))( *))*( *)\\)))( *))*( " "*)\\)))|(GEOCOLLECTION\\((?R)(( *)(,)( *)(?R))*( *)\\))( *)$"); - ret = doRegComp(ppRegex, ppMatchData, wktPatternWithSpace); + code = doRegComp(ppRegex, ppMatchData, wktPatternWithSpace); taosMemoryFree(wktPatternWithSpace); - return ret; + return code; } int32_t initCtxGeomFromText() { From 1a992b65c33dd3809ec7f99a253f490688b4b764 Mon Sep 17 00:00:00 2001 From: Shungang Li Date: Fri, 19 Jul 2024 17:44:07 +0800 Subject: [PATCH 4/4] enh: rename tpcr2.c to tpcre2.c --- source/util/src/{tpcr2.c => tpcre2.c} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename source/util/src/{tpcr2.c => tpcre2.c} (100%) diff --git a/source/util/src/tpcr2.c b/source/util/src/tpcre2.c similarity index 100% rename from source/util/src/tpcr2.c rename to source/util/src/tpcre2.c