feat(query): add today()/today() + duration in insert clause
TD-14243
This commit is contained in:
parent
8572bd2afa
commit
b355e2b3c8
|
@ -40,6 +40,7 @@ extern "C" {
|
||||||
* @return timestamp decided by global conf variable, tsTimePrecision
|
* @return timestamp decided by global conf variable, tsTimePrecision
|
||||||
* if precision == TSDB_TIME_PRECISION_MICRO, it returns timestamp in microsecond.
|
* if precision == TSDB_TIME_PRECISION_MICRO, it returns timestamp in microsecond.
|
||||||
* precision == TSDB_TIME_PRECISION_MILLI, it returns timestamp in millisecond.
|
* precision == TSDB_TIME_PRECISION_MILLI, it returns timestamp in millisecond.
|
||||||
|
* precision == TSDB_TIME_PRECISION_NANO, it returns timestamp in nanosecond.
|
||||||
*/
|
*/
|
||||||
static FORCE_INLINE int64_t taosGetTimestamp(int32_t precision) {
|
static FORCE_INLINE int64_t taosGetTimestamp(int32_t precision) {
|
||||||
if (precision == TSDB_TIME_PRECISION_MICRO) {
|
if (precision == TSDB_TIME_PRECISION_MICRO) {
|
||||||
|
@ -51,6 +52,24 @@ static FORCE_INLINE int64_t taosGetTimestamp(int32_t precision) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @return timestamp of today at 00:00:00 in given precision
|
||||||
|
* if precision == TSDB_TIME_PRECISION_MICRO, it returns timestamp in microsecond.
|
||||||
|
* precision == TSDB_TIME_PRECISION_MILLI, it returns timestamp in millisecond.
|
||||||
|
* precision == TSDB_TIME_PRECISION_NANO, it returns timestamp in nanosecond.
|
||||||
|
*/
|
||||||
|
static FORCE_INLINE int64_t taosGetTimestampToday(int32_t precision) {
|
||||||
|
int64_t factor = (precision == TSDB_TIME_PRECISION_MILLI) ? 1000 :
|
||||||
|
(precision == TSDB_TIME_PRECISION_MICRO) ? 1000000 : 1000000000;
|
||||||
|
time_t t = taosTime(NULL);
|
||||||
|
struct tm * tm= taosLocalTime(&t, NULL);
|
||||||
|
tm->tm_hour = 0;
|
||||||
|
tm->tm_min = 0;
|
||||||
|
tm->tm_sec = 0;
|
||||||
|
|
||||||
|
return (int64_t)taosMktime(tm) * factor;
|
||||||
|
}
|
||||||
|
|
||||||
int64_t taosTimeAdd(int64_t t, int64_t duration, char unit, int32_t precision);
|
int64_t taosTimeAdd(int64_t t, int64_t duration, char unit, int32_t precision);
|
||||||
int64_t taosTimeTruncate(int64_t t, const SInterval* pInterval, int32_t precision);
|
int64_t taosTimeTruncate(int64_t t, const SInterval* pInterval, int32_t precision);
|
||||||
int32_t taosTimeCountInterval(int64_t skey, int64_t ekey, int64_t interval, char unit, int32_t precision);
|
int32_t taosTimeCountInterval(int64_t skey, int64_t ekey, int64_t interval, char unit, int32_t precision);
|
||||||
|
|
|
@ -27,9 +27,11 @@ extern "C" {
|
||||||
#ifndef ALLOW_FORBID_FUNC
|
#ifndef ALLOW_FORBID_FUNC
|
||||||
#define strptime STRPTIME_FUNC_TAOS_FORBID
|
#define strptime STRPTIME_FUNC_TAOS_FORBID
|
||||||
#define gettimeofday GETTIMEOFDAY_FUNC_TAOS_FORBID
|
#define gettimeofday GETTIMEOFDAY_FUNC_TAOS_FORBID
|
||||||
|
#define localtime LOCALTIME_FUNC_TAOS_FORBID
|
||||||
#define localtime_s LOCALTIMES_FUNC_TAOS_FORBID
|
#define localtime_s LOCALTIMES_FUNC_TAOS_FORBID
|
||||||
#define localtime_r LOCALTIMER_FUNC_TAOS_FORBID
|
#define localtime_r LOCALTIMER_FUNC_TAOS_FORBID
|
||||||
#define time TIME_FUNC_TAOS_FORBID
|
#define time TIME_FUNC_TAOS_FORBID
|
||||||
|
#define mktime MKTIME_FUNC_TAOS_FORBID
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
|
#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
|
||||||
|
@ -82,6 +84,8 @@ static FORCE_INLINE int64_t taosGetTimestampNs() {
|
||||||
|
|
||||||
char *taosStrpTime(const char *buf, const char *fmt, struct tm *tm);
|
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);
|
||||||
|
time_t taosTime(time_t *t);
|
||||||
|
time_t taosMktime(struct tm *timep);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -764,7 +764,7 @@ static char* formatTimestamp(char* buf, int64_t val, int precision) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct tm* ptm = localtime(&tt);
|
struct tm* ptm = taosLocalTime(&tt, NULL);
|
||||||
size_t pos = strftime(buf, 35, "%Y-%m-%d %H:%M:%S", ptm);
|
size_t pos = strftime(buf, 35, "%Y-%m-%d %H:%M:%S", ptm);
|
||||||
|
|
||||||
if (precision == TSDB_TIME_PRECISION_NANO) {
|
if (precision == TSDB_TIME_PRECISION_NANO) {
|
||||||
|
|
|
@ -1368,7 +1368,7 @@ static char* formatTimestamp(char* buf, int64_t val, int precision) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct tm* ptm = localtime(&tt);
|
struct tm* ptm = taosLocalTime(&tt, NULL);
|
||||||
size_t pos = strftime(buf, 35, "%Y-%m-%d %H:%M:%S", ptm);
|
size_t pos = strftime(buf, 35, "%Y-%m-%d %H:%M:%S", ptm);
|
||||||
|
|
||||||
if (precision == TSDB_TIME_PRECISION_NANO) {
|
if (precision == TSDB_TIME_PRECISION_NANO) {
|
||||||
|
|
|
@ -70,7 +70,7 @@ void deltaToUtcInitOnce() {
|
||||||
struct tm tm = {0};
|
struct tm tm = {0};
|
||||||
|
|
||||||
(void)taosStrpTime("1970-01-01 00:00:00", (const char*)("%Y-%m-%d %H:%M:%S"), &tm);
|
(void)taosStrpTime("1970-01-01 00:00:00", (const char*)("%Y-%m-%d %H:%M:%S"), &tm);
|
||||||
m_deltaUtc = (int64_t)mktime(&tm);
|
m_deltaUtc = (int64_t)taosMktime(&tm);
|
||||||
// printf("====delta:%lld\n\n", seconds);
|
// printf("====delta:%lld\n\n", seconds);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -344,7 +344,7 @@ int32_t parseLocaltimeDst(char* timestr, int64_t* time, int32_t timePrec) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* mktime will be affected by TZ, set by using taos_options */
|
/* mktime will be affected by TZ, set by using taos_options */
|
||||||
int64_t seconds = mktime(&tm);
|
int64_t seconds = taosMktime(&tm);
|
||||||
|
|
||||||
int64_t fraction = 0;
|
int64_t fraction = 0;
|
||||||
|
|
||||||
|
@ -539,7 +539,7 @@ int64_t taosTimeAdd(int64_t t, int64_t duration, char unit, int32_t precision) {
|
||||||
tm.tm_year = mon / 12;
|
tm.tm_year = mon / 12;
|
||||||
tm.tm_mon = mon % 12;
|
tm.tm_mon = mon % 12;
|
||||||
|
|
||||||
return (int64_t)(mktime(&tm) * TSDB_TICK_PER_SECOND(precision));
|
return (int64_t)(taosMktime(&tm) * TSDB_TICK_PER_SECOND(precision));
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t taosTimeCountInterval(int64_t skey, int64_t ekey, int64_t interval, char unit, int32_t precision) {
|
int32_t taosTimeCountInterval(int64_t skey, int64_t ekey, int64_t interval, char unit, int32_t precision) {
|
||||||
|
@ -598,7 +598,7 @@ int64_t taosTimeTruncate(int64_t t, const SInterval* pInterval, int32_t precisio
|
||||||
tm.tm_mon = mon % 12;
|
tm.tm_mon = mon % 12;
|
||||||
}
|
}
|
||||||
|
|
||||||
start = (int64_t)(mktime(&tm) * TSDB_TICK_PER_SECOND(precision));
|
start = (int64_t)(taosMktime(&tm) * TSDB_TICK_PER_SECOND(precision));
|
||||||
} else {
|
} else {
|
||||||
int64_t delta = t - pInterval->interval;
|
int64_t delta = t - pInterval->interval;
|
||||||
int32_t factor = (delta >= 0) ? 1 : -1;
|
int32_t factor = (delta >= 0) ? 1 : -1;
|
||||||
|
@ -745,7 +745,7 @@ void taosFormatUtcTime(char* buf, int32_t bufLen, int64_t t, int32_t precision)
|
||||||
assert(false);
|
assert(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
ptm = localtime(");
|
ptm = taosLocalTime(", NULL);
|
||||||
int32_t length = (int32_t)strftime(ts, 40, "%Y-%m-%dT%H:%M:%S", ptm);
|
int32_t length = (int32_t)strftime(ts, 40, "%Y-%m-%dT%H:%M:%S", ptm);
|
||||||
length += snprintf(ts + length, fractionLen, format, mod);
|
length += snprintf(ts + length, fractionLen, format, mod);
|
||||||
length += (int32_t)strftime(ts + length, 40 - length, "%z", ptm);
|
length += (int32_t)strftime(ts + length, 40 - length, "%z", ptm);
|
||||||
|
|
|
@ -173,12 +173,12 @@ static void getNextTimeWindow(SInterval* pInterval, int32_t precision, int32_t o
|
||||||
int mon = (int)(tm.tm_year * 12 + tm.tm_mon + interval * factor);
|
int mon = (int)(tm.tm_year * 12 + tm.tm_mon + interval * factor);
|
||||||
tm.tm_year = mon / 12;
|
tm.tm_year = mon / 12;
|
||||||
tm.tm_mon = mon % 12;
|
tm.tm_mon = mon % 12;
|
||||||
tw->skey = convertTimePrecision((int64_t)mktime(&tm) * 1000L, TSDB_TIME_PRECISION_MILLI, precision);
|
tw->skey = convertTimePrecision((int64_t)taosMktime(&tm) * 1000L, TSDB_TIME_PRECISION_MILLI, precision);
|
||||||
|
|
||||||
mon = (int)(mon + interval);
|
mon = (int)(mon + interval);
|
||||||
tm.tm_year = mon / 12;
|
tm.tm_year = mon / 12;
|
||||||
tm.tm_mon = mon % 12;
|
tm.tm_mon = mon % 12;
|
||||||
tw->ekey = convertTimePrecision((int64_t)mktime(&tm) * 1000L, TSDB_TIME_PRECISION_MILLI, precision);
|
tw->ekey = convertTimePrecision((int64_t)taosMktime(&tm) * 1000L, TSDB_TIME_PRECISION_MILLI, precision);
|
||||||
|
|
||||||
tw->ekey -= 1;
|
tw->ekey -= 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -312,6 +312,8 @@ static int parseTime(char **end, SToken *pToken, int16_t timePrec, int64_t *time
|
||||||
|
|
||||||
if (pToken->type == TK_NOW) {
|
if (pToken->type == TK_NOW) {
|
||||||
ts = taosGetTimestamp(timePrec);
|
ts = taosGetTimestamp(timePrec);
|
||||||
|
} else if (pToken->type == TK_TODAY) {
|
||||||
|
ts = taosGetTimestampToday(timePrec);
|
||||||
} else if (pToken->type == TK_NK_INTEGER) {
|
} else if (pToken->type == TK_NK_INTEGER) {
|
||||||
bool isSigned = false;
|
bool isSigned = false;
|
||||||
toInteger(pToken->z, pToken->n, 10, &ts, &isSigned);
|
toInteger(pToken->z, pToken->n, 10, &ts, &isSigned);
|
||||||
|
@ -376,8 +378,8 @@ static int parseTime(char **end, SToken *pToken, int16_t timePrec, int64_t *time
|
||||||
}
|
}
|
||||||
|
|
||||||
static FORCE_INLINE int32_t checkAndTrimValue(SToken* pToken, uint32_t type, char* tmpTokenBuf, SMsgBuf* pMsgBuf) {
|
static FORCE_INLINE int32_t checkAndTrimValue(SToken* pToken, uint32_t type, char* tmpTokenBuf, SMsgBuf* pMsgBuf) {
|
||||||
if ((pToken->type != TK_NOW && pToken->type != TK_NK_INTEGER && pToken->type != TK_NK_STRING && pToken->type != TK_NK_FLOAT && pToken->type != TK_NK_BOOL &&
|
if ((pToken->type != TK_NOW && pToken->type != TK_TODAY && pToken->type != TK_NK_INTEGER && pToken->type != TK_NK_STRING && pToken->type != TK_NK_FLOAT &&
|
||||||
pToken->type != TK_NULL && pToken->type != TK_NK_HEX && pToken->type != TK_NK_OCT && pToken->type != TK_NK_BIN) ||
|
pToken->type != TK_NK_BOOL && pToken->type != TK_NULL && pToken->type != TK_NK_HEX && pToken->type != TK_NK_OCT && pToken->type != TK_NK_BIN) ||
|
||||||
(pToken->n == 0) || (pToken->type == TK_NK_RP)) {
|
(pToken->n == 0) || (pToken->type == TK_NK_RP)) {
|
||||||
return buildSyntaxErrMsg(pMsgBuf, "invalid data or symbol", pToken->z);
|
return buildSyntaxErrMsg(pMsgBuf, "invalid data or symbol", pToken->z);
|
||||||
}
|
}
|
||||||
|
|
|
@ -841,7 +841,7 @@ int32_t toISO8601Function(SScalarParam *pInput, int32_t inputNum, SScalarParam *
|
||||||
memmove(fraction, fraction + TSDB_TIME_PRECISION_SEC_DIGITS, TSDB_TIME_PRECISION_SEC_DIGITS);
|
memmove(fraction, fraction + TSDB_TIME_PRECISION_SEC_DIGITS, TSDB_TIME_PRECISION_SEC_DIGITS);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct tm *tmInfo = localtime((const time_t *)&timeVal);
|
struct tm *tmInfo = taosLocalTime((const time_t *)&timeVal, NULL);
|
||||||
strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%S%z", tmInfo);
|
strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%S%z", tmInfo);
|
||||||
int32_t len = (int32_t)strlen(buf);
|
int32_t len = (int32_t)strlen(buf);
|
||||||
|
|
||||||
|
|
|
@ -406,7 +406,18 @@ FORCE_INLINE int32_t taosGetTimeOfDay(struct timeval *tv) {
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
time_t taosTime(time_t *t) {
|
||||||
|
return time(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
time_t taosMktime(struct tm *timep) {
|
||||||
|
return mktime(timep);
|
||||||
|
}
|
||||||
|
|
||||||
struct tm *taosLocalTime(const time_t *timep, struct tm *result) {
|
struct tm *taosLocalTime(const time_t *timep, struct tm *result) {
|
||||||
|
if (result == NULL) {
|
||||||
|
return localtime(timep);
|
||||||
|
}
|
||||||
#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
|
#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
|
||||||
localtime_s(result, timep);
|
localtime_s(result, timep);
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -596,7 +596,7 @@ void printParaIntoFile() {
|
||||||
g_fp = pFile;
|
g_fp = pFile;
|
||||||
|
|
||||||
time_t tTime = taosGetTimestampSec();
|
time_t tTime = taosGetTimestampSec();
|
||||||
struct tm tm = *localtime(&tTime);
|
struct tm tm = *taosLocalTime(&tTime, NULL);
|
||||||
|
|
||||||
taosFprintfFile(pFile, "###################################################################\n");
|
taosFprintfFile(pFile, "###################################################################\n");
|
||||||
taosFprintfFile(pFile, "# configDir: %s\n", configDir);
|
taosFprintfFile(pFile, "# configDir: %s\n", configDir);
|
||||||
|
|
|
@ -678,7 +678,7 @@ bool simExecuteNativeSqlCommand(SScript *script, char *rest, bool isSlow) {
|
||||||
if (tt < 0) tt = 0;
|
if (tt < 0) tt = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
tp = localtime(&tt);
|
tp = taosLocalTime(&tt, NULL);
|
||||||
strftime(timeStr, 64, "%y-%m-%d %H:%M:%S", tp);
|
strftime(timeStr, 64, "%y-%m-%d %H:%M:%S", tp);
|
||||||
if (precision == TSDB_TIME_PRECISION_MILLI) {
|
if (precision == TSDB_TIME_PRECISION_MILLI) {
|
||||||
sprintf(value, "%s.%03d", timeStr, (int32_t)(*((int64_t *)row[i]) % 1000));
|
sprintf(value, "%s.%03d", timeStr, (int32_t)(*((int64_t *)row[i]) % 1000));
|
||||||
|
|
|
@ -452,7 +452,7 @@ static char *formatTimestamp(char *buf, int64_t val, int precision) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct tm *ptm = localtime(&tt);
|
struct tm *ptm = taosLocalTime(&tt, NULL);
|
||||||
size_t pos = strftime(buf, 35, "%Y-%m-%d %H:%M:%S", ptm);
|
size_t pos = strftime(buf, 35, "%Y-%m-%d %H:%M:%S", ptm);
|
||||||
|
|
||||||
if (precision == TSDB_TIME_PRECISION_NANO) {
|
if (precision == TSDB_TIME_PRECISION_NANO) {
|
||||||
|
|
Loading…
Reference in New Issue