diff --git a/cmake/cmake.version b/cmake/cmake.version
index 42de285c8eefb58f61ac4fc77fe9fd309ca4d926..5150ee3b75e2ac429961850995d06b5b2fd40cc9 100644
--- a/cmake/cmake.version
+++ b/cmake/cmake.version
@@ -2,7 +2,7 @@
IF (DEFINED VERNUMBER)
SET(TD_VER_NUMBER ${VERNUMBER})
ELSE ()
- SET(TD_VER_NUMBER "3.0.3.1")
+ SET(TD_VER_NUMBER "3.0.3.2")
ENDIF ()
IF (DEFINED VERCOMPATIBLE)
diff --git a/cmake/taostools_CMakeLists.txt.in b/cmake/taostools_CMakeLists.txt.in
index 2de3881dd289ebf247aa0b70d514b97527af039a..3f27cb2517c66363ce638389e0b1897de1321635 100644
--- a/cmake/taostools_CMakeLists.txt.in
+++ b/cmake/taostools_CMakeLists.txt.in
@@ -2,7 +2,7 @@
# taos-tools
ExternalProject_Add(taos-tools
GIT_REPOSITORY https://github.com/taosdata/taos-tools.git
- GIT_TAG 273a3fe
+ GIT_TAG ddd654a
SOURCE_DIR "${TD_SOURCE_DIR}/tools/taos-tools"
BINARY_DIR ""
#BUILD_IN_SOURCE TRUE
diff --git a/docs/en/28-releases/01-tdengine.md b/docs/en/28-releases/01-tdengine.md
index 9910a3d89a863fe42a9cf519b4146af519b1f049..b160058d02c22dc824b0e960ad61cbe596999a70 100644
--- a/docs/en/28-releases/01-tdengine.md
+++ b/docs/en/28-releases/01-tdengine.md
@@ -10,6 +10,14 @@ For TDengine 2.x installation packages by version, please visit [here](https://w
import Release from "/components/ReleaseV3";
+## 3.0.3.2
+
+
+
+## 3.0.3.1
+
+
+
## 3.0.3.1
diff --git a/docs/en/28-releases/02-tools.md b/docs/en/28-releases/02-tools.md
index a060d2dd77b51ed0990f4cc3bd9a6ea0a9fdfa29..17581b780a8cba5e0e73ef7d0ff8da8e54f0de56 100644
--- a/docs/en/28-releases/02-tools.md
+++ b/docs/en/28-releases/02-tools.md
@@ -10,6 +10,10 @@ For other historical version installers, please visit [here](https://www.taosdat
import Release from "/components/ReleaseV3";
+## 2.4.11
+
+
+
## 2.4.10
diff --git a/docs/zh/28-releases/01-tdengine.md b/docs/zh/28-releases/01-tdengine.md
index 62d5c5f592df2e7338e163bc5cbc45c0d582aa14..b4441ad078059f51d8632e0db9c8007db9eb804e 100644
--- a/docs/zh/28-releases/01-tdengine.md
+++ b/docs/zh/28-releases/01-tdengine.md
@@ -10,6 +10,10 @@ TDengine 2.x 各版本安装包请访问[这里](https://www.taosdata.com/all-do
import Release from "/components/ReleaseV3";
+## 3.0.3.2
+
+
+
## 3.0.3.1
diff --git a/docs/zh/28-releases/02-tools.md b/docs/zh/28-releases/02-tools.md
index 0e4eda60014bd81bbdbfa686b1f38acc347d1b7f..cce6834f12af02568632949bde044b81ea718808 100644
--- a/docs/zh/28-releases/02-tools.md
+++ b/docs/zh/28-releases/02-tools.md
@@ -10,6 +10,10 @@ taosTools 各版本安装包下载链接如下:
import Release from "/components/ReleaseV3";
+## 2.4.11
+
+
+
## 2.4.10
diff --git a/include/common/ttime.h b/include/common/ttime.h
index 4a7c47d1725dcc3dd1fde1e5c17a021e992156fb..f189959f22ca4bee4b07518aff00e7bbc527fb87 100644
--- a/include/common/ttime.h
+++ b/include/common/ttime.h
@@ -64,7 +64,7 @@ static FORCE_INLINE int64_t taosGetTimestampToday(int32_t precision) {
: 1000000000;
time_t t = taosTime(NULL);
struct tm tm;
- taosLocalTime(&t, &tm);
+ taosLocalTime(&t, &tm, NULL);
tm.tm_hour = 0;
tm.tm_min = 0;
tm.tm_sec = 0;
diff --git a/include/os/osTime.h b/include/os/osTime.h
index 0a0a54119b4a40b79e54b7183b0cdc57cac03ca7..51a285a1393171ea59940498a4c8134afa270366 100644
--- a/include/os/osTime.h
+++ b/include/os/osTime.h
@@ -91,7 +91,7 @@ static FORCE_INLINE int64_t taosGetMonoTimestampMs() {
}
char *taosStrpTime(const char *buf, const char *fmt, struct tm *tm);
-struct tm *taosLocalTime(const time_t *timep, struct tm *result);
+struct tm *taosLocalTime(const time_t *timep, struct tm *result, char *buf);
struct tm *taosLocalTimeNolock(struct tm *result, const time_t *timep, int dst);
time_t taosTime(time_t *t);
time_t taosMktime(struct tm *timep);
diff --git a/source/common/src/tdatablock.c b/source/common/src/tdatablock.c
index a65f30f0235e60c4aaf4a2535efe4993afe07c69..e021e655496cd9f94e787ebfcb00a958519fb50c 100644
--- a/source/common/src/tdatablock.c
+++ b/source/common/src/tdatablock.c
@@ -1836,7 +1836,9 @@ static char* formatTimestamp(char* buf, int64_t val, int precision) {
}
}
struct tm ptm = {0};
- taosLocalTime(&tt, &ptm);
+ if (taosLocalTime(&tt, &ptm, buf) == NULL) {
+ return buf;
+ }
size_t pos = strftime(buf, 35, "%Y-%m-%d %H:%M:%S", &ptm);
if (precision == TSDB_TIME_PRECISION_NANO) {
diff --git a/source/common/src/ttime.c b/source/common/src/ttime.c
index 7996498d451f95df794fab75c644eed044d37c4b..dcd539bd91e11c570a9f779f9c1c9a3811765c41 100644
--- a/source/common/src/ttime.c
+++ b/source/common/src/ttime.c
@@ -727,7 +727,7 @@ int64_t taosTimeAdd(int64_t t, int64_t duration, char unit, int32_t precision) {
struct tm tm;
time_t tt = (time_t)(t / TSDB_TICK_PER_SECOND(precision));
- taosLocalTime(&tt, &tm);
+ taosLocalTime(&tt, &tm, NULL);
int32_t mon = tm.tm_year * 12 + tm.tm_mon + (int32_t)numOfMonth;
tm.tm_year = mon / 12;
tm.tm_mon = mon % 12;
@@ -750,11 +750,11 @@ int32_t taosTimeCountInterval(int64_t skey, int64_t ekey, int64_t interval, char
struct tm tm;
time_t t = (time_t)skey;
- taosLocalTime(&t, &tm);
+ taosLocalTime(&t, &tm, NULL);
int32_t smon = tm.tm_year * 12 + tm.tm_mon;
t = (time_t)ekey;
- taosLocalTime(&t, &tm);
+ taosLocalTime(&t, &tm, NULL);
int32_t emon = tm.tm_year * 12 + tm.tm_mon;
if (unit == 'y') {
@@ -774,7 +774,7 @@ int64_t taosTimeTruncate(int64_t t, const SInterval* pInterval, int32_t precisio
start /= (int64_t)(TSDB_TICK_PER_SECOND(precision));
struct tm tm;
time_t tt = (time_t)start;
- taosLocalTime(&tt, &tm);
+ taosLocalTime(&tt, &tm, NULL);
tm.tm_sec = 0;
tm.tm_min = 0;
tm.tm_hour = 0;
@@ -867,13 +867,17 @@ const char* fmtts(int64_t ts) {
if (ts > -62135625943 && ts < 32503651200) {
time_t t = (time_t)ts;
- taosLocalTime(&t, &tm);
+ if (taosLocalTime(&t, &tm, buf) == NULL) {
+ return buf;
+ }
pos += strftime(buf + pos, sizeof(buf), "s=%Y-%m-%d %H:%M:%S", &tm);
}
if (ts > -62135625943000 && ts < 32503651200000) {
time_t t = (time_t)(ts / 1000);
- taosLocalTime(&t, &tm);
+ if (taosLocalTime(&t, &tm, buf) == NULL) {
+ return buf;
+ }
if (pos > 0) {
buf[pos++] = ' ';
buf[pos++] = '|';
@@ -885,7 +889,9 @@ const char* fmtts(int64_t ts) {
{
time_t t = (time_t)(ts / 1000000);
- taosLocalTime(&t, &tm);
+ if (taosLocalTime(&t, &tm, buf) == NULL) {
+ return buf;
+ }
if (pos > 0) {
buf[pos++] = ' ';
buf[pos++] = '|';
@@ -937,7 +943,9 @@ void taosFormatUtcTime(char* buf, int32_t bufLen, int64_t t, int32_t precision)
ASSERT(false);
}
- taosLocalTime(", &ptm);
+ if (taosLocalTime(", &ptm, buf) == NULL) {
+ return;
+ }
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);
diff --git a/source/dnode/mgmt/exe/dmMain.c b/source/dnode/mgmt/exe/dmMain.c
index 9a092e2df50133ba68f6fc399a81d9df54a77356..f0e020edfed8136e6b7fbfc3a023c1ef2822fd01 100644
--- a/source/dnode/mgmt/exe/dmMain.c
+++ b/source/dnode/mgmt/exe/dmMain.c
@@ -20,6 +20,21 @@
#include "tglobal.h"
#include "version.h"
+#if defined(CUS_NAME) || defined(CUS_PROMPT) || defined(CUS_EMAIL)
+#include "cus_name.h"
+#else
+#ifndef CUS_NAME
+ #define CUS_NAME "TDengine"
+#endif
+
+#ifndef CUS_PROMPT
+ #define CUS_PROMPT "taos"
+#endif
+
+#ifndef CUS_EMAIL
+ #define CUS_EMAIL ""
+#endif
+#endif
// clang-format off
#define DM_APOLLO_URL "The apollo string to use when configuring the server, such as: -a 'jsonFile:./tests/cfg.json', cfg.json text can be '{\"fqdn\":\"td1\"}'."
#define DM_CFG_DIR "Configuration directory."
@@ -232,7 +247,7 @@ static void dmDumpCfg() {
}
static int32_t dmInitLog() {
- return taosCreateLog("taosdlog", 1, configDir, global.envCmd, global.envFile, global.apolloUrl, global.pArgs, 0);
+ return taosCreateLog(CUS_PROMPT"dlog", 1, configDir, global.envCmd, global.envFile, global.apolloUrl, global.pArgs, 0);
}
static void taosCleanupArgs() {
diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c
index ce97915c75fc6aa04aa222c246e59c6c26249fbe..b9fd8512d0b0e854f4b264c79cebe4ebec261a5e 100644
--- a/source/libs/executor/src/scanoperator.c
+++ b/source/libs/executor/src/scanoperator.c
@@ -90,7 +90,7 @@ static void getNextTimeWindow(SInterval* pInterval, STimeWindow* tw, int32_t ord
struct tm tm;
time_t t = (time_t)key;
- taosLocalTime(&t, &tm);
+ taosLocalTime(&t, &tm, NULL);
int mon = (int)(tm.tm_year * 12 + tm.tm_mon + interval * factor);
tm.tm_year = mon / 12;
diff --git a/source/libs/executor/src/timewindowoperator.c b/source/libs/executor/src/timewindowoperator.c
index 29acc1fea203d44b86ebd1a0867d4d041c09a2de..987a82436f92f942cc9b65001834112bea342270 100644
--- a/source/libs/executor/src/timewindowoperator.c
+++ b/source/libs/executor/src/timewindowoperator.c
@@ -283,7 +283,7 @@ static void getNextTimeWindow(SInterval* pInterval, int32_t precision, int32_t o
struct tm tm;
time_t t = (time_t)key;
- taosLocalTime(&t, &tm);
+ taosLocalTime(&t, &tm, NULL);
int mon = (int)(tm.tm_year * 12 + tm.tm_mon + interval * factor);
tm.tm_year = mon / 12;
diff --git a/source/libs/function/src/builtins.c b/source/libs/function/src/builtins.c
index a88b1388bab39c0db6443884c7974b0c340e849b..a36204bab7c10a67af4ddec40f61b21cde2d2842 100644
--- a/source/libs/function/src/builtins.c
+++ b/source/libs/function/src/builtins.c
@@ -213,8 +213,9 @@ static int32_t addTimezoneParam(SNodeList* pList) {
char buf[6] = {0};
time_t t = taosTime(NULL);
struct tm tmInfo;
- taosLocalTime(&t, &tmInfo);
- strftime(buf, sizeof(buf), "%z", &tmInfo);
+ if (taosLocalTime(&t, &tmInfo, buf) != NULL) {
+ strftime(buf, sizeof(buf), "%z", &tmInfo);
+ }
int32_t len = (int32_t)strlen(buf);
SValueNode* pVal = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE);
diff --git a/source/libs/scalar/src/sclfunc.c b/source/libs/scalar/src/sclfunc.c
index 1affbac613cdb2caeb0d8862506caee85f7697b6..24b25cec80ce58390b7a83d71a607bbaba18fe50 100644
--- a/source/libs/scalar/src/sclfunc.c
+++ b/source/libs/scalar/src/sclfunc.c
@@ -1067,9 +1067,15 @@ int32_t toISO8601Function(SScalarParam *pInput, int32_t inputNum, SScalarParam *
}
struct tm tmInfo;
- taosLocalTime((const time_t *)&timeVal, &tmInfo);
+ int32_t len = 0;
+
+ if (taosLocalTime((const time_t *)&timeVal, &tmInfo, buf) == NULL) {
+ len = (int32_t)strlen(buf);
+ goto _end;
+ }
+
strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%S", &tmInfo);
- int32_t len = (int32_t)strlen(buf);
+ len = (int32_t)strlen(buf);
// add timezone string
if (tzLen > 0) {
@@ -1103,6 +1109,7 @@ int32_t toISO8601Function(SScalarParam *pInput, int32_t inputNum, SScalarParam *
len += fracLen;
}
+_end:
memmove(buf + VARSTR_HEADER_SIZE, buf, len);
varDataSetLen(buf, len);
diff --git a/source/os/src/osTime.c b/source/os/src/osTime.c
index 5d5bff8c4875bc6ee834ad3abcfcc440fe0de403..f120b6650a613dfb46003c85819c0551a3008de2 100644
--- a/source/os/src/osTime.c
+++ b/source/os/src/osTime.c
@@ -407,12 +407,21 @@ time_t taosMktime(struct tm *timep) {
#endif
}
-struct tm *taosLocalTime(const time_t *timep, struct tm *result) {
+struct tm *taosLocalTime(const time_t *timep, struct tm *result, char *buf) {
+ struct tm *res = NULL;
+
if (result == NULL) {
- return localtime(timep);
+ res = localtime(timep);
+ if (res == NULL && buf != NULL) {
+ sprintf(buf, "NaN");
+ }
+ return res;
}
#ifdef WINDOWS
if (*timep < 0) {
+ if (buf != NULL) {
+ sprintf(buf, "NaN");
+ }
return NULL;
// TODO: bugs in following code
SYSTEMTIME ss, s;
@@ -421,6 +430,9 @@ struct tm *taosLocalTime(const time_t *timep, struct tm *result) {
struct tm tm1;
time_t tt = 0;
if (localtime_s(&tm1, &tt) != 0 ) {
+ if (buf != NULL) {
+ sprintf(buf, "NaN");
+ }
return NULL;
}
ss.wYear = tm1.tm_year + 1900;
@@ -449,11 +461,17 @@ struct tm *taosLocalTime(const time_t *timep, struct tm *result) {
result->tm_isdst = 0;
} else {
if (localtime_s(result, timep) != 0) {
+ if (buf != NULL) {
+ sprintf(buf, "NaN");
+ }
return NULL;
}
}
#else
- localtime_r(timep, result);
+ res = localtime_r(timep, result);
+ if (res == NULL && buf != NULL) {
+ sprintf(buf, "NaN");
+ }
#endif
return result;
}
diff --git a/source/os/src/osTimezone.c b/source/os/src/osTimezone.c
index ad223bff27de80a454d09215926dcdf44e95c23c..cd6ad7cdb5b45c35bae19093a2a97b0c0d8e9bdf 100644
--- a/source/os/src/osTimezone.c
+++ b/source/os/src/osTimezone.c
@@ -893,7 +893,7 @@ void taosGetSystemTimezone(char *outTimezoneStr, enum TdTimezone *tsTimezone) {
*/
time_t tx1 = taosGetTimestampSec();
struct tm tm1;
- taosLocalTime(&tx1, &tm1);
+ taosLocalTime(&tx1, &tm1, NULL);
daylight = tm1.tm_isdst;
/*
@@ -921,7 +921,7 @@ void taosGetSystemTimezone(char *outTimezoneStr, enum TdTimezone *tsTimezone) {
*/
time_t tx1 = taosGetTimestampSec();
struct tm tm1;
- taosLocalTime(&tx1, &tm1);
+ taosLocalTime(&tx1, &tm1, NULL);
/* load time zone string from /etc/timezone */
// FILE *f = fopen("/etc/timezone", "r");
errno = 0;
@@ -1008,7 +1008,7 @@ void taosGetSystemTimezone(char *outTimezoneStr, enum TdTimezone *tsTimezone) {
*/
time_t tx1 = taosGetTimestampSec();
struct tm tm1;
- taosLocalTime(&tx1, &tm1);
+ taosLocalTime(&tx1, &tm1, NULL);
/*
* format example:
diff --git a/source/util/src/tlog.c b/source/util/src/tlog.c
index bd9ea058b4f911d5060c85b9303afb3d2cc5dbdb..a3d3c399abcd6040cf042dec045024549e2d3179 100644
--- a/source/util/src/tlog.c
+++ b/source/util/src/tlog.c
@@ -121,7 +121,7 @@ static FORCE_INLINE void taosUpdateDaylight() {
struct timeval timeSecs;
taosGetTimeOfDay(&timeSecs);
time_t curTime = timeSecs.tv_sec;
- ptm = taosLocalTime(&curTime, &Tm);
+ ptm = taosLocalTime(&curTime, &Tm, NULL);
tsDaylightActive = ptm->tm_isdst;
}
static FORCE_INLINE int32_t taosGetDaylight() { return tsDaylightActive; }
@@ -437,7 +437,7 @@ static inline int32_t taosBuildLogHead(char *buffer, const char *flags) {
taosGetTimeOfDay(&timeSecs);
time_t curTime = timeSecs.tv_sec;
- ptm = taosLocalTime(&curTime, &Tm);
+ ptm = taosLocalTime(&curTime, &Tm, NULL);
return sprintf(buffer, "%02d/%02d %02d:%02d:%02d.%06d %08" PRId64 " %s", ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour,
ptm->tm_min, ptm->tm_sec, (int32_t)timeSecs.tv_usec, taosGetSelfPthreadId(), flags);
diff --git a/tools/shell/src/shellArguments.c b/tools/shell/src/shellArguments.c
index 08dfc7f538132057dd26329315f3606a98d8e713..0f5585991e5efcf4d3c69b74a5b0b3e254a99e60 100644
--- a/tools/shell/src/shellArguments.c
+++ b/tools/shell/src/shellArguments.c
@@ -59,8 +59,7 @@ char cusEmail[] = "";
#define SHELL_VERSION "Print program version."
#ifdef WEBSOCKET
-#define SHELL_DSN \
- "Use dsn to connect to the TDengine cloud server or to a remote server which provides WebSocket connection."
+#define SHELL_DSN "Use dsn to connect to the cloud server or to a remote server which provides WebSocket connection."
#define SHELL_REST "Use RESTful mode when connecting."
#define SHELL_TIMEOUT "Set the timeout for websocket query in seconds, default is 30."
#endif
diff --git a/tools/shell/src/shellEngine.c b/tools/shell/src/shellEngine.c
index cb47f9716dc0ba758657661c4ec45f78a5fba359..70130397ba7d4b9539080bff1ad81c193e751a54 100644
--- a/tools/shell/src/shellEngine.c
+++ b/tools/shell/src/shellEngine.c
@@ -291,8 +291,7 @@ char *shellFormatTimestamp(char *buf, int64_t val, int32_t precision) {
}
struct tm ptm = {0};
- if (taosLocalTime(&tt, &ptm) == NULL) {
- sprintf(buf, "NaN");
+ if (taosLocalTime(&tt, &ptm, buf) == NULL) {
return buf;
}
size_t pos = strftime(buf, 35, "%Y-%m-%d %H:%M:%S", &ptm);
diff --git a/utils/test/c/tmqDemo.c b/utils/test/c/tmqDemo.c
index d105b505793eae17068af9e9db02eff5071f5bd4..ce069c2b05878cb6806f2784be896942cb701ae4 100644
--- a/utils/test/c/tmqDemo.c
+++ b/utils/test/c/tmqDemo.c
@@ -597,7 +597,7 @@ void printParaIntoFile() {
time_t tTime = taosGetTimestampSec();
struct tm tm;
- taosLocalTime(&tTime, &tm);
+ taosLocalTime(&tTime, &tm, NULL);
taosFprintfFile(pFile, "###################################################################\n");
taosFprintfFile(pFile, "# configDir: %s\n", configDir);
diff --git a/utils/test/c/tmqSim.c b/utils/test/c/tmqSim.c
index 69debe7ab50c0dff57cbc570cbb7643f3249521b..f2de219f4e740b090a87ebbb7e9ceb9cb1c6dcc2 100644
--- a/utils/test/c/tmqSim.c
+++ b/utils/test/c/tmqSim.c
@@ -166,7 +166,7 @@ static void printHelp() {
char* getCurrentTimeString(char* timeString) {
time_t tTime = taosGetTimestampSec();
struct tm tm;
- taosLocalTime(&tTime, &tm);
+ taosLocalTime(&tTime, &tm, NULL);
sprintf(timeString, "%d-%02d-%02d %02d:%02d:%02d", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour,
tm.tm_min, tm.tm_sec);
@@ -472,7 +472,9 @@ static char* shellFormatTimestamp(char* buf, int64_t val, int32_t precision) {
}
struct tm ptm;
- taosLocalTime(&tt, &ptm);
+ if (taosLocalTime(&tt, &ptm, buf) == NULL) {
+ return buf;
+ }
size_t pos = strftime(buf, 35, "%Y-%m-%d %H:%M:%S", &ptm);
if (precision == TSDB_TIME_PRECISION_NANO) {
diff --git a/utils/tsim/src/simExe.c b/utils/tsim/src/simExe.c
index 9dd63d14a28a7f65593703773b1eb1c19d02f5d7..1be28635ef721167d67a33e7837f782c70e17d49 100644
--- a/utils/tsim/src/simExe.c
+++ b/utils/tsim/src/simExe.c
@@ -772,7 +772,9 @@ bool simExecuteNativeSqlCommand(SScript *script, char *rest, bool isSlow) {
tt = (*(int64_t *)row[i]) / 1000000000;
}
- taosLocalTime(&tt, &tp);
+ if (taosLocalTime(&tt, &tp, timeStr) == NULL) {
+ break;
+ }
strftime(timeStr, 64, "%y-%m-%d %H:%M:%S", &tp);
if (precision == TSDB_TIME_PRECISION_MILLI) {
sprintf(value, "%s.%03d", timeStr, (int32_t)(*((int64_t *)row[i]) % 1000));