Merge branch '3.0' into fix/3_liaohj
This commit is contained in:
commit
d7e1f37cd4
|
@ -2,7 +2,7 @@
|
|||
IF (DEFINED VERNUMBER)
|
||||
SET(TD_VER_NUMBER ${VERNUMBER})
|
||||
ELSE ()
|
||||
SET(TD_VER_NUMBER "3.2.4.0.alpha")
|
||||
SET(TD_VER_NUMBER "3.3.1.0.alpha")
|
||||
ENDIF ()
|
||||
|
||||
IF (DEFINED VERCOMPATIBLE)
|
||||
|
|
|
@ -887,4 +887,4 @@ The `pycumsum` function finds the cumulative sum for all data in the input colum
|
|||
|
||||
</details>
|
||||
## Manage and Use UDF
|
||||
You need to add UDF to TDengine before using it in SQL queries. For more information about how to manage UDF and how to invoke UDF, please see [Manage and Use UDF](../taos-sql/udf/).
|
||||
You need to add UDF to TDengine before using it in SQL queries. For more information about how to manage UDF and how to invoke UDF, please see [Manage and Use UDF](../../taos-sql/udf/).
|
||||
|
|
|
@ -58,6 +58,8 @@ window_clause: {
|
|||
SESSION(ts_col, tol_val)
|
||||
| STATE_WINDOW(col)
|
||||
| INTERVAL(interval_val [, interval_offset]) [SLIDING (sliding_val)] [WATERMARK(watermark_val)] [FILL(fill_mod_and_val)]
|
||||
| EVENT_WINDOW START WITH start_trigger_condition END WITH end_trigger_condition
|
||||
| COUNT_WINDOW(count_val[, sliding_val])
|
||||
|
||||
interp_clause:
|
||||
RANGE(ts_val [, ts_val]) EVERY(every_val) FILL(fill_mod_and_val)
|
||||
|
@ -95,6 +97,7 @@ The list of currently supported Hints is as follows:
|
|||
| PARTITION_FIRST| None | Use Partition before aggregate, conflict with SORT_FOR_GROUP | With normal column in partition by list |
|
||||
| PARA_TABLES_SORT| None | When sorting the supertable rows by timestamp, No temporary disk space is used. When there are numerous tables, each with long rows, the corresponding algorithm associated with this prompt may consume a substantial amount of memory, potentially leading to an Out Of Memory (OOM) situation. | Sorting the supertable rows by timestamp |
|
||||
| SMALLDATA_TS_SORT| None | When sorting the supertable rows by timestamp, if the length of query columns >= 256, and there are relatively few rows, this hint can improve performance. | Sorting the supertable rows by timestamp |
|
||||
| SKIP_TSMA| None| To explicitly disable tsma optimization for select query|Select query with agg funcs|
|
||||
|
||||
For example:
|
||||
|
||||
|
|
|
@ -31,7 +31,7 @@ A PARTITION BY clause is processed as follows:
|
|||
select _wstart, location, max(current) from meters partition by location interval(10m)
|
||||
```
|
||||
|
||||
The most common usage of PARTITION BY is partitioning the data in subtables by tags then perform computation when querying data in a supertable. More specifically, `PARTITION BY TBNAME` partitions the data of each subtable into a single timeline, and this method facilitates the statistical analysis in many use cases of processing timeseries data. For example, calculate the average voltage of each meter every 10 minutes£º
|
||||
The most common usage of PARTITION BY is partitioning the data in subtables by tags then perform computation when querying data in a supertable. More specifically, `PARTITION BY TBNAME` partitions the data of each subtable into a single timeline, and this method facilitates the statistical analysis in many use cases of processing timeseries data. For example, calculate the average voltage of each meter every 10 minutes£º
|
||||
```sql
|
||||
select _wstart, tbname, avg(voltage) from meters partition by tbname interval(10m)
|
||||
```
|
||||
|
@ -44,12 +44,12 @@ Aggregation by time window is supported in TDengine. For example, in the case wh
|
|||
window_clause: {
|
||||
SESSION(ts_col, tol_val)
|
||||
| STATE_WINDOW(col)
|
||||
| INTERVAL(interval_val [, offset]) [SLIDING (sliding_value)] [FILL({NONE | VALUE | PREV | NULL | LINEAR | NEXT})]
|
||||
| INTERVAL(interval_val [, interval_offset]) [SLIDING (sliding_value)] [FILL({NONE | VALUE | PREV | NULL | LINEAR | NEXT})]
|
||||
| EVENT_WINDOW START WITH start_trigger_condition END WITH end_trigger_condition
|
||||
}
|
||||
```
|
||||
|
||||
Both interval_val and sliding_value are time durations which have 3 forms of representation.
|
||||
Both interval_val and sliding_value are time durations, and interval_offset is the window offset, interval_offset must be less than interval_val, There are 3 forms of representation.
|
||||
- INTERVAL(1s, 500a) SLIDING(1s), the unit char should be any one of a (millisecond), b (nanosecond), d (day), h (hour), m (minute), n (month), s (second), u (microsecond), w (week), y (year).
|
||||
- INTERVAL(1000, 500) SLIDING(1000), the unit will the same as the queried database, if there are more than one databases, higher precision will be used.
|
||||
- INTERVAL('1s', '500a') SLIDING('1s'), unit must be specified, no spaces allowed.
|
||||
|
|
|
@ -10,6 +10,10 @@ For TDengine 2.x installation packages by version, please visit [here](https://t
|
|||
|
||||
import Release from "/components/ReleaseV3";
|
||||
|
||||
## 3.3.0.0
|
||||
|
||||
<Release type="tdengine" version="3.3.0.0" />
|
||||
|
||||
## 3.2.3.0
|
||||
|
||||
<Release type="tdengine" version="3.2.3.0" />
|
||||
|
|
|
@ -58,6 +58,8 @@ window_clause: {
|
|||
SESSION(ts_col, tol_val)
|
||||
| STATE_WINDOW(col)
|
||||
| INTERVAL(interval_val [, interval_offset]) [SLIDING (sliding_val)] [WATERMARK(watermark_val)] [FILL(fill_mod_and_val)]
|
||||
| EVENT_WINDOW START WITH start_trigger_condition END WITH end_trigger_condition
|
||||
| COUNT_WINDOW(count_val[, sliding_val])
|
||||
|
||||
interp_clause:
|
||||
RANGE(ts_val [, ts_val]) EVERY(every_val) FILL(fill_mod_and_val)
|
||||
|
@ -95,6 +97,7 @@ Hints 是用户控制单个语句查询优化的一种手段,当 Hint 不适
|
|||
| PARTITION_FIRST| 无 | 在聚合之前使用PARTITION计算分组, 与SORT_FOR_GROUP冲突 | partition by 列表有普通列时 |
|
||||
| PARA_TABLES_SORT| 无 | 超级表的数据按时间戳排序时, 不使用临时磁盘空间, 只使用内存。当子表数量多, 行长比较大时候, 会使用大量内存, 可能发生OOM | 超级表的数据按时间戳排序时 |
|
||||
| SMALLDATA_TS_SORT| 无 | 超级表的数据按时间戳排序时, 查询列长度大于等于256, 但是行数不多, 使用这个提示, 可以提高性能 | 超级表的数据按时间戳排序时 |
|
||||
| SKIP_TSMA | 无 | 用于显示的禁用TSMA查询优化 | 带Agg函数的查询语句 |
|
||||
|
||||
举例:
|
||||
|
||||
|
|
|
@ -53,7 +53,7 @@ window_clause: {
|
|||
}
|
||||
```
|
||||
|
||||
其中,interval_val 和 sliding_val 都表示时间段, 语法上支持三种方式,举例说明如下:
|
||||
其中,interval_val 和 sliding_val 都表示时间段,interval_offset 表示窗口偏移量,interval_offset 必须小于 interval_val,语法上支持三种方式,举例说明如下:
|
||||
- INTERVAL(1s, 500a) SLIDING(1s), 自带时间单位的形式,其中的时间单位是单字符表示, 分别为: a (毫秒), b (纳秒), d (天), h (小时), m (分钟), n (月), s (秒), u (微妙), w (周), y (年).
|
||||
- INTERVAL(1000, 500) SLIDING(1000), 不带时间单位的形式,将使用查询库的时间精度作为默认时间单位,当存在多个库时默认采用精度更高的库.
|
||||
- INTERVAL('1s', '500a') SLIDING('1s'), 自带时间单位的字符串形式,字符串内部不能有任何空格等其它字符.
|
||||
|
|
|
@ -10,6 +10,10 @@ TDengine 2.x 各版本安装包请访问[这里](https://www.taosdata.com/all-do
|
|||
|
||||
import Release from "/components/ReleaseV3";
|
||||
|
||||
## 3.3.0.0
|
||||
|
||||
<Release type="tdengine" version="3.3.0.0" />
|
||||
|
||||
## 3.2.3.0
|
||||
|
||||
<Release type="tdengine" version="3.2.3.0" />
|
||||
|
|
|
@ -35,7 +35,6 @@ extern "C" {
|
|||
#define CACHESCAN_RETRIEVE_TYPE_SINGLE 0x2
|
||||
#define CACHESCAN_RETRIEVE_LAST_ROW 0x4
|
||||
#define CACHESCAN_RETRIEVE_LAST 0x8
|
||||
#define CACHESCAN_RETRIEVE_PK 0x10
|
||||
|
||||
#define META_READER_LOCK 0x0
|
||||
#define META_READER_NOLOCK 0x1
|
||||
|
|
|
@ -60,15 +60,15 @@ int32_t tsTimeToGetAvailableConn = 500000;
|
|||
int32_t tsKeepAliveIdle = 60;
|
||||
|
||||
int32_t tsNumOfCommitThreads = 2;
|
||||
int32_t tsNumOfTaskQueueThreads = 10;
|
||||
int32_t tsNumOfMnodeQueryThreads = 4;
|
||||
int32_t tsNumOfTaskQueueThreads = 16;
|
||||
int32_t tsNumOfMnodeQueryThreads = 16;
|
||||
int32_t tsNumOfMnodeFetchThreads = 1;
|
||||
int32_t tsNumOfMnodeReadThreads = 1;
|
||||
int32_t tsNumOfVnodeQueryThreads = 4;
|
||||
int32_t tsNumOfVnodeQueryThreads = 16;
|
||||
float tsRatioOfVnodeStreamThreads = 0.5F;
|
||||
int32_t tsNumOfVnodeFetchThreads = 4;
|
||||
int32_t tsNumOfVnodeRsmaThreads = 2;
|
||||
int32_t tsNumOfQnodeQueryThreads = 4;
|
||||
int32_t tsNumOfQnodeQueryThreads = 16;
|
||||
int32_t tsNumOfQnodeFetchThreads = 1;
|
||||
int32_t tsNumOfSnodeStreamThreads = 4;
|
||||
int32_t tsNumOfSnodeWriteThreads = 1;
|
||||
|
@ -554,7 +554,7 @@ static int32_t taosAddClientCfg(SConfig *pCfg) {
|
|||
if (cfgAddInt32(pCfg, "keepAliveIdle", tsKeepAliveIdle, 1, 7200000, CFG_SCOPE_BOTH, CFG_DYN_ENT_BOTH) != 0) return -1;
|
||||
|
||||
tsNumOfTaskQueueThreads = tsNumOfCores;
|
||||
tsNumOfTaskQueueThreads = TMAX(tsNumOfTaskQueueThreads, 10);
|
||||
tsNumOfTaskQueueThreads = TMAX(tsNumOfTaskQueueThreads, 16);
|
||||
|
||||
if (cfgAddInt32(pCfg, "numOfTaskQueueThreads", tsNumOfTaskQueueThreads, 4, 1024, CFG_SCOPE_CLIENT, CFG_DYN_NONE) != 0)
|
||||
return -1;
|
||||
|
@ -645,7 +645,7 @@ static int32_t taosAddServerCfg(SConfig *pCfg) {
|
|||
return -1;
|
||||
|
||||
tsNumOfVnodeQueryThreads = tsNumOfCores * 2;
|
||||
tsNumOfVnodeQueryThreads = TMAX(tsNumOfVnodeQueryThreads, 4);
|
||||
tsNumOfVnodeQueryThreads = TMAX(tsNumOfVnodeQueryThreads, 16);
|
||||
if (cfgAddInt32(pCfg, "numOfVnodeQueryThreads", tsNumOfVnodeQueryThreads, 4, 1024, CFG_SCOPE_SERVER, CFG_DYN_NONE) !=
|
||||
0)
|
||||
return -1;
|
||||
|
@ -666,7 +666,7 @@ static int32_t taosAddServerCfg(SConfig *pCfg) {
|
|||
return -1;
|
||||
|
||||
tsNumOfQnodeQueryThreads = tsNumOfCores * 2;
|
||||
tsNumOfQnodeQueryThreads = TMAX(tsNumOfQnodeQueryThreads, 4);
|
||||
tsNumOfQnodeQueryThreads = TMAX(tsNumOfQnodeQueryThreads, 16);
|
||||
if (cfgAddInt32(pCfg, "numOfQnodeQueryThreads", tsNumOfQnodeQueryThreads, 4, 1024, CFG_SCOPE_SERVER, CFG_DYN_NONE) !=
|
||||
0)
|
||||
return -1;
|
||||
|
@ -918,7 +918,7 @@ static int32_t taosUpdateServerCfg(SConfig *pCfg) {
|
|||
pItem = cfgGetItem(tsCfg, "numOfVnodeQueryThreads");
|
||||
if (pItem != NULL && pItem->stype == CFG_STYPE_DEFAULT) {
|
||||
tsNumOfVnodeQueryThreads = numOfCores * 2;
|
||||
tsNumOfVnodeQueryThreads = TMAX(tsNumOfVnodeQueryThreads, 4);
|
||||
tsNumOfVnodeQueryThreads = TMAX(tsNumOfVnodeQueryThreads, 16);
|
||||
pItem->i32 = tsNumOfVnodeQueryThreads;
|
||||
pItem->stype = stype;
|
||||
}
|
||||
|
@ -948,7 +948,7 @@ static int32_t taosUpdateServerCfg(SConfig *pCfg) {
|
|||
pItem = cfgGetItem(tsCfg, "numOfQnodeQueryThreads");
|
||||
if (pItem != NULL && pItem->stype == CFG_STYPE_DEFAULT) {
|
||||
tsNumOfQnodeQueryThreads = numOfCores * 2;
|
||||
tsNumOfQnodeQueryThreads = TMAX(tsNumOfQnodeQueryThreads, 4);
|
||||
tsNumOfQnodeQueryThreads = TMAX(tsNumOfQnodeQueryThreads, 16);
|
||||
pItem->i32 = tsNumOfQnodeQueryThreads;
|
||||
pItem->stype = stype;
|
||||
}
|
||||
|
|
|
@ -907,21 +907,34 @@ END:
|
|||
return code;
|
||||
}
|
||||
|
||||
static int32_t sendDeleteSubToVnode(SMqSubscribeObj *pSub, STrans *pTrans){
|
||||
static int32_t sendDeleteSubToVnode(SMnode *pMnode, SMqSubscribeObj *pSub, STrans *pTrans){
|
||||
// iter all vnode to delete handle
|
||||
int32_t sz = taosArrayGetSize(pSub->unassignedVgs);
|
||||
for (int32_t i = 0; i < sz; i++) {
|
||||
SMqVgEp *pVgEp = taosArrayGetP(pSub->unassignedVgs, i);
|
||||
SMqVDeleteReq *pReq = taosMemoryCalloc(1, sizeof(SMqVDeleteReq));
|
||||
if(pReq == NULL){
|
||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||
return -1;
|
||||
}
|
||||
pReq->head.vgId = htonl(pVgEp->vgId);
|
||||
pReq->vgId = pVgEp->vgId;
|
||||
pReq->consumerId = -1;
|
||||
memcpy(pReq->subKey, pSub->key, TSDB_SUBSCRIBE_KEY_LEN);
|
||||
|
||||
SVgObj *pVgObj = mndAcquireVgroup(pMnode, pVgEp->vgId);
|
||||
if (pVgObj == NULL) {
|
||||
taosMemoryFree(pReq);
|
||||
terrno = TSDB_CODE_MND_VGROUP_NOT_EXIST;
|
||||
return -1;
|
||||
}
|
||||
STransAction action = {0};
|
||||
action.epSet = pVgEp->epSet;
|
||||
action.epSet = mndGetVgroupEpset(pMnode, pVgObj);;
|
||||
action.pCont = pReq;
|
||||
action.contLen = sizeof(SMqVDeleteReq);
|
||||
action.msgType = TDMT_VND_TMQ_DELETE_SUB;
|
||||
|
||||
mndReleaseVgroup(pMnode, pVgObj);
|
||||
if (mndTransAppendRedoAction(pTrans, &action) != 0) {
|
||||
taosMemoryFree(pReq);
|
||||
return -1;
|
||||
|
@ -1002,7 +1015,7 @@ static int32_t mndProcessDropCgroupReq(SRpcMsg *pMsg) {
|
|||
goto end;
|
||||
}
|
||||
|
||||
code = sendDeleteSubToVnode(pSub, pTrans);
|
||||
code = sendDeleteSubToVnode(pMnode, pSub, pTrans);
|
||||
if (code != 0) {
|
||||
goto end;
|
||||
}
|
||||
|
@ -1263,7 +1276,7 @@ int32_t mndDropSubByTopic(SMnode *pMnode, STrans *pTrans, const char *topicName)
|
|||
goto END;
|
||||
}
|
||||
|
||||
code = sendDeleteSubToVnode(pSub, pTrans);
|
||||
code = sendDeleteSubToVnode(pMnode, pSub, pTrans);
|
||||
if (code != 0) {
|
||||
goto END;
|
||||
}
|
||||
|
|
|
@ -1490,6 +1490,7 @@ static int32_t mndAddAlterVnodeHashRangeAction(SMnode *pMnode, STrans *pTrans, i
|
|||
return -1;
|
||||
}
|
||||
|
||||
mInfo("trans:%d, add alter vnode hash range action for from vgId:%d to vgId:%d", pTrans->id, srcVgId, pVgroup->vgId);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -894,19 +894,14 @@ typedef enum {
|
|||
READER_EXEC_ROWS = 0x2,
|
||||
} EExecMode;
|
||||
|
||||
#define LAST_COL_VERSION (0x1)
|
||||
|
||||
typedef struct {
|
||||
int64_t version;
|
||||
SRowKey rowKey;
|
||||
int8_t dirty;
|
||||
SColVal colVal;
|
||||
} SLastCol;
|
||||
|
||||
typedef struct {
|
||||
TSKEY ts;
|
||||
int8_t dirty;
|
||||
SColVal colVal;
|
||||
} SLastColV1;
|
||||
|
||||
int32_t tsdbOpenCache(STsdb *pTsdb);
|
||||
void tsdbCloseCache(STsdb *pTsdb);
|
||||
int32_t tsdbCacheUpdate(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, TSDBROW *row);
|
||||
|
|
|
@ -130,7 +130,6 @@ static void tsdbClosePgCache(STsdb *pTsdb) {
|
|||
enum {
|
||||
LFLAG_LAST_ROW = 0,
|
||||
LFLAG_LAST = 1,
|
||||
LFLAG_PRIMARY_KEY = CACHESCAN_RETRIEVE_PK,
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
|
@ -139,10 +138,6 @@ typedef struct {
|
|||
int8_t lflag;
|
||||
} SLastKey;
|
||||
|
||||
#define LAST_COL_VERSION_BASE (((int64_t)(0x1)) << 63)
|
||||
#define LAST_COL_VERSION (LAST_COL_VERSION_BASE + 2)
|
||||
|
||||
#define HAS_PRIMARY_KEY(k) (((k).lflag & LFLAG_PRIMARY_KEY) == LFLAG_PRIMARY_KEY)
|
||||
#define IS_LAST_ROW_KEY(k) (((k).lflag & LFLAG_LAST) == LFLAG_LAST_ROW)
|
||||
#define IS_LAST_KEY(k) (((k).lflag & LFLAG_LAST) == LFLAG_LAST)
|
||||
|
||||
|
@ -180,9 +175,9 @@ static int myCmp(void *state, const char *a, size_t alen, const char *b, size_t
|
|||
return 1;
|
||||
}
|
||||
|
||||
if (lhs->lflag < rhs->lflag) {
|
||||
if ((lhs->lflag & LFLAG_LAST) < (rhs->lflag & LFLAG_LAST)) {
|
||||
return -1;
|
||||
} else if (lhs->lflag > rhs->lflag) {
|
||||
} else if ((lhs->lflag & LFLAG_LAST) > (rhs->lflag & LFLAG_LAST)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -335,131 +330,163 @@ static void rocksMayWrite(STsdb *pTsdb, bool force, bool read, bool lock) {
|
|||
}
|
||||
}
|
||||
|
||||
// note: new object do not own colVal's resource, just copy the pointer
|
||||
static SLastCol *tsdbCacheConvertLastColV1(SLastColV1 *pLastColV1) {
|
||||
SLastCol *pLastCol = taosMemoryCalloc(1, sizeof(SLastCol));
|
||||
if (pLastCol == NULL) return NULL;
|
||||
pLastCol->version = LAST_COL_VERSION;
|
||||
pLastCol->rowKey.ts = pLastColV1->ts;
|
||||
typedef struct {
|
||||
TSKEY ts;
|
||||
int8_t dirty;
|
||||
struct {
|
||||
int16_t cid;
|
||||
int8_t type;
|
||||
int8_t flag;
|
||||
union {
|
||||
int64_t val;
|
||||
struct {
|
||||
uint32_t nData;
|
||||
uint8_t *pData;
|
||||
};
|
||||
} value;
|
||||
} colVal;
|
||||
} SLastColV0;
|
||||
|
||||
static int32_t tsdbCacheDeserializeV0(char const *value, SLastCol *pLastCol) {
|
||||
SLastColV0 *pLastColV0 = (SLastColV0 *)value;
|
||||
|
||||
pLastCol->rowKey.ts = pLastColV0->ts;
|
||||
pLastCol->rowKey.numOfPKs = 0;
|
||||
pLastCol->dirty = pLastColV1->dirty;
|
||||
pLastCol->colVal = pLastColV1->colVal;
|
||||
pLastCol->dirty = pLastColV0->dirty;
|
||||
pLastCol->colVal.cid = pLastColV0->colVal.cid;
|
||||
pLastCol->colVal.flag = pLastColV0->colVal.flag;
|
||||
pLastCol->colVal.value.type = pLastColV0->colVal.type;
|
||||
|
||||
if (IS_VAR_DATA_TYPE(pLastCol->colVal.value.type)) {
|
||||
pLastCol->colVal.value.nData = pLastColV0->colVal.value.nData;
|
||||
pLastCol->colVal.value.pData = (uint8_t *)(&pLastColV0[1]);
|
||||
return sizeof(SLastColV0) + pLastColV0->colVal.value.nData;
|
||||
} else {
|
||||
pLastCol->colVal.value.val = pLastColV0->colVal.value.val;
|
||||
return sizeof(SLastColV0);
|
||||
}
|
||||
}
|
||||
|
||||
static SLastCol *tsdbCacheDeserialize(char const *value, size_t size) {
|
||||
if (!value) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
SLastCol* pLastCol = taosMemoryCalloc(1, sizeof(SLastCol));
|
||||
if (NULL == pLastCol) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int32_t offset = tsdbCacheDeserializeV0(value, pLastCol);
|
||||
if (offset == size) {
|
||||
// version 0
|
||||
return pLastCol;
|
||||
}
|
||||
|
||||
static SLastCol *tsdbCacheDeserializeV1(char const *value) {
|
||||
if (!value) {
|
||||
} else if (offset > size) {
|
||||
terrno = TSDB_CODE_INVALID_DATA_FMT;
|
||||
taosMemoryFreeClear(pLastCol);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
SLastColV1 *pLastColV1 = (SLastColV1 *)value;
|
||||
SColVal *pColVal = &pLastColV1->colVal;
|
||||
if (IS_VAR_DATA_TYPE(pColVal->value.type)) {
|
||||
if (pColVal->value.nData > 0) {
|
||||
pColVal->value.pData = (char *)value + sizeof(*pLastColV1);
|
||||
} else {
|
||||
pColVal->value.pData = NULL;
|
||||
// version
|
||||
int8_t version = *(int8_t *)(value + offset);
|
||||
offset += sizeof(int8_t);
|
||||
|
||||
// numOfPKs
|
||||
pLastCol->rowKey.numOfPKs = *(uint8_t *)(value + offset);
|
||||
offset += sizeof(uint8_t);
|
||||
|
||||
// pks
|
||||
for (int32_t i = 0; i < pLastCol->rowKey.numOfPKs; i++) {
|
||||
pLastCol->rowKey.pks[i] = *(SValue *)(value + offset);
|
||||
offset += sizeof(SValue);
|
||||
|
||||
if (IS_VAR_DATA_TYPE(pLastCol->rowKey.pks[i].type)) {
|
||||
pLastCol->rowKey.pks[i].pData = (uint8_t *)value + offset;
|
||||
offset += pLastCol->rowKey.pks[i].nData;
|
||||
}
|
||||
}
|
||||
|
||||
return tsdbCacheConvertLastColV1(pLastColV1);
|
||||
}
|
||||
|
||||
static SLastCol *tsdbCacheDeserializeV2(char const *value) {
|
||||
if (!value) {
|
||||
if (offset > size) {
|
||||
terrno = TSDB_CODE_INVALID_DATA_FMT;
|
||||
taosMemoryFreeClear(pLastCol);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
SLastCol *pLastCol = taosMemoryMalloc(sizeof(SLastCol));
|
||||
*pLastCol = *(SLastCol *)(value);
|
||||
|
||||
char* currentPos = (char *)value + sizeof(*pLastCol);
|
||||
for (int8_t i = 0; i < pLastCol->rowKey.numOfPKs; i++) {
|
||||
SValue* pValue = &pLastCol->rowKey.pks[i];
|
||||
if (IS_VAR_DATA_TYPE(pValue->type)) {
|
||||
if (pValue->nData > 0) {
|
||||
pValue->pData = currentPos;
|
||||
currentPos += pValue->nData;
|
||||
} else {
|
||||
pValue->pData = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SColVal *pColVal = &pLastCol->colVal;
|
||||
if (IS_VAR_DATA_TYPE(pColVal->value.type)) {
|
||||
if (pColVal->value.nData > 0) {
|
||||
pColVal->value.pData = currentPos;
|
||||
currentPos += pColVal->value.nData;
|
||||
} else {
|
||||
pColVal->value.pData = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return pLastCol;
|
||||
}
|
||||
|
||||
static SLastCol *tsdbCacheDeserialize(char const *value) {
|
||||
if (!value) {
|
||||
return NULL;
|
||||
/*
|
||||
typedef struct {
|
||||
SLastColV0 lastColV0;
|
||||
char colData[];
|
||||
int8_t version;
|
||||
uint8_t numOfPKs;
|
||||
SValue pks[0];
|
||||
char pk0Data[];
|
||||
SValue pks[1];
|
||||
char pk1Data[];
|
||||
...
|
||||
} SLastColDisk;
|
||||
*/
|
||||
static int32_t tsdbCacheSerializeV0(char const *value, SLastCol *pLastCol) {
|
||||
SLastColV0 *pLastColV0 = (SLastColV0 *)value;
|
||||
|
||||
pLastColV0->ts = pLastCol->rowKey.ts;
|
||||
pLastColV0->dirty = pLastCol->dirty;
|
||||
pLastColV0->colVal.cid = pLastCol->colVal.cid;
|
||||
pLastColV0->colVal.flag = pLastCol->colVal.flag;
|
||||
pLastColV0->colVal.type = pLastCol->colVal.value.type;
|
||||
if (IS_VAR_DATA_TYPE(pLastCol->colVal.value.type)) {
|
||||
pLastColV0->colVal.value.nData = pLastCol->colVal.value.nData;
|
||||
if (pLastCol->colVal.value.nData > 0) {
|
||||
memcpy(&pLastColV0[1], pLastCol->colVal.value.pData, pLastCol->colVal.value.nData);
|
||||
}
|
||||
return sizeof(SLastColV0) + pLastCol->colVal.value.nData;
|
||||
} else {
|
||||
pLastColV0->colVal.value.val = pLastCol->colVal.value.val;
|
||||
return sizeof(SLastColV0);
|
||||
}
|
||||
|
||||
bool hasVersion = ((*(int64_t *)value) & LAST_COL_VERSION_BASE) == LAST_COL_VERSION_BASE;
|
||||
if (!hasVersion) {
|
||||
return tsdbCacheDeserializeV1(value);
|
||||
}
|
||||
return tsdbCacheDeserializeV2(value);
|
||||
}
|
||||
|
||||
static uint32_t tsdbCacheCopyVarData(SValue *from, SValue *to) {
|
||||
ASSERT(from->nData >= 0);
|
||||
if (from->nData > 0) {
|
||||
memcpy(to->pData, from->pData, from->nData);
|
||||
}
|
||||
to->type = from->type;
|
||||
to->nData = from->nData;
|
||||
return from->nData;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void tsdbCacheSerialize(SLastCol *pLastCol, char **value, size_t *size) {
|
||||
SColVal *pColVal = &pLastCol->colVal;
|
||||
size_t length = sizeof(*pLastCol);
|
||||
*size = sizeof(SLastColV0);
|
||||
if (IS_VAR_DATA_TYPE(pLastCol->colVal.value.type)) {
|
||||
*size += pLastCol->colVal.value.nData;
|
||||
}
|
||||
*size += sizeof(uint8_t) + sizeof(uint8_t); // version + numOfPKs
|
||||
|
||||
for (int8_t i = 0; i < pLastCol->rowKey.numOfPKs; i++) {
|
||||
*size += sizeof(SValue);
|
||||
if (IS_VAR_DATA_TYPE(pLastCol->rowKey.pks[i].type)) {
|
||||
length += pLastCol->rowKey.pks[i].nData;
|
||||
*size += pLastCol->rowKey.pks[i].nData;
|
||||
}
|
||||
}
|
||||
if (IS_VAR_DATA_TYPE(pColVal->value.type)) {
|
||||
length += pColVal->value.nData;
|
||||
}
|
||||
|
||||
// set version
|
||||
*value = taosMemoryMalloc(length);
|
||||
*value = taosMemoryMalloc(*size);
|
||||
|
||||
// copy last col
|
||||
SLastCol* pToLastCol = (SLastCol *)(*value);
|
||||
*pToLastCol = *pLastCol;
|
||||
char *currentPos = *value + sizeof(*pLastCol);
|
||||
int32_t offset = tsdbCacheSerializeV0(*value, pLastCol);
|
||||
|
||||
// copy var data pks
|
||||
// version
|
||||
((uint8_t *)(*value + offset))[0] = LAST_COL_VERSION;
|
||||
offset++;
|
||||
|
||||
// numOfPKs
|
||||
((uint8_t *)(*value + offset))[0] = pLastCol->rowKey.numOfPKs;
|
||||
offset++;
|
||||
|
||||
// pks
|
||||
for (int8_t i = 0; i < pLastCol->rowKey.numOfPKs; i++) {
|
||||
SValue *pFromValue = &pLastCol->rowKey.pks[i];
|
||||
if (IS_VAR_DATA_TYPE(pFromValue->type)) {
|
||||
SValue *pToValue = &pToLastCol->rowKey.pks[i];
|
||||
pToValue->pData = (pFromValue->nData == 0) ? NULL : currentPos;
|
||||
currentPos += tsdbCacheCopyVarData(pFromValue, pToValue);
|
||||
((SValue *)(*value + offset))[0] = pLastCol->rowKey.pks[i];
|
||||
offset += sizeof(SValue);
|
||||
if (IS_VAR_DATA_TYPE(pLastCol->rowKey.pks[i].type)) {
|
||||
if (pLastCol->rowKey.pks[i].nData > 0) {
|
||||
memcpy(*value + offset, pLastCol->rowKey.pks[i].pData, pLastCol->rowKey.pks[i].nData);
|
||||
}
|
||||
offset += pLastCol->rowKey.pks[i].nData;
|
||||
}
|
||||
}
|
||||
|
||||
// copy var data value
|
||||
if (IS_VAR_DATA_TYPE(pColVal->value.type)) {
|
||||
SValue *pFromValue = &pColVal->value;
|
||||
SValue *pToValue = &pToLastCol->colVal.value;
|
||||
pToValue->pData = (pFromValue->nData == 0) ? NULL : currentPos;
|
||||
currentPos += tsdbCacheCopyVarData(pFromValue, pToValue);
|
||||
}
|
||||
*size = length;
|
||||
}
|
||||
|
||||
static void tsdbCachePutBatch(SLastCol *pLastCol, const void *key, size_t klen, SCacheFlushState *state) {
|
||||
|
@ -545,9 +572,7 @@ static void reallocVarDataVal(SValue *pValue) {
|
|||
}
|
||||
}
|
||||
|
||||
static void reallocVarData(SColVal *pColVal) {
|
||||
reallocVarDataVal(&pColVal->value);
|
||||
}
|
||||
static void reallocVarData(SColVal *pColVal) { reallocVarDataVal(&pColVal->value); }
|
||||
|
||||
static void tsdbCacheDeleter(const void *key, size_t klen, void *value, void *ud) {
|
||||
SLastCol *pLastCol = (SLastCol *)value;
|
||||
|
@ -571,8 +596,7 @@ static int32_t tsdbCacheNewTableColumn(STsdb *pTsdb, int64_t uid, int16_t cid, i
|
|||
SRowKey noneRowKey = {0};
|
||||
noneRowKey.ts = TSKEY_MIN;
|
||||
noneRowKey.numOfPKs = 0;
|
||||
SLastCol noneCol = {
|
||||
.version = LAST_COL_VERSION, .rowKey = noneRowKey, .colVal = COL_VAL_NONE(cid, col_type), .dirty = 1};
|
||||
SLastCol noneCol = {.rowKey = noneRowKey, .colVal = COL_VAL_NONE(cid, col_type), .dirty = 1};
|
||||
SLastCol *pLastCol = &noneCol;
|
||||
|
||||
SLastCol *pTmpLastCol = taosMemoryCalloc(1, sizeof(SLastCol));
|
||||
|
@ -644,11 +668,9 @@ static int32_t tsdbCacheDropTableColumn(STsdb *pTsdb, int64_t uid, int16_t cid,
|
|||
size_t *keys_list_sizes = taosMemoryCalloc(2, sizeof(size_t));
|
||||
const size_t klen = ROCKS_KEY_LEN;
|
||||
|
||||
int8_t lflag = hasPrimaryKey ? LFLAG_PRIMARY_KEY : 0;
|
||||
|
||||
char *keys = taosMemoryCalloc(2, sizeof(SLastKey));
|
||||
((SLastKey *)keys)[0] = (SLastKey){.lflag = lflag | LFLAG_LAST, .uid = uid, .cid = cid};
|
||||
((SLastKey *)keys)[1] = (SLastKey){.lflag = lflag | LFLAG_LAST_ROW, .uid = uid, .cid = cid};
|
||||
((SLastKey *)keys)[0] = (SLastKey){.lflag = LFLAG_LAST, .uid = uid, .cid = cid};
|
||||
((SLastKey *)keys)[1] = (SLastKey){.lflag = LFLAG_LAST_ROW, .uid = uid, .cid = cid};
|
||||
|
||||
keys_list[0] = keys;
|
||||
keys_list[1] = keys + sizeof(SLastKey);
|
||||
|
@ -672,13 +694,13 @@ static int32_t tsdbCacheDropTableColumn(STsdb *pTsdb, int64_t uid, int16_t cid,
|
|||
|
||||
rocksdb_writebatch_t *wb = pTsdb->rCache.writebatch;
|
||||
{
|
||||
SLastCol *pLastCol = tsdbCacheDeserialize(values_list[0]);
|
||||
SLastCol *pLastCol = tsdbCacheDeserialize(values_list[0], values_list_sizes[0]);
|
||||
if (NULL != pLastCol) {
|
||||
rocksdb_writebatch_delete(wb, keys_list[0], klen);
|
||||
}
|
||||
taosMemoryFreeClear(pLastCol);
|
||||
|
||||
pLastCol = tsdbCacheDeserialize(values_list[1]);
|
||||
pLastCol = tsdbCacheDeserialize(values_list[1], values_list_sizes[1]);
|
||||
if (NULL != pLastCol) {
|
||||
rocksdb_writebatch_delete(wb, keys_list[1], klen);
|
||||
}
|
||||
|
@ -724,18 +746,12 @@ int32_t tsdbCacheNewTable(STsdb *pTsdb, tb_uid_t uid, tb_uid_t suid, SSchemaWrap
|
|||
taosThreadMutexLock(&pTsdb->lruMutex);
|
||||
|
||||
if (suid < 0) {
|
||||
int8_t lflag = 0;
|
||||
int nCols = pSchemaRow->nCols;
|
||||
if (nCols >= 2) {
|
||||
lflag = (pSchemaRow->pSchema[1].flags & COL_IS_KEY) ? LFLAG_PRIMARY_KEY : 0;
|
||||
}
|
||||
|
||||
for (int i = 0; i < nCols; ++i) {
|
||||
for (int i = 0; i < pSchemaRow->nCols; ++i) {
|
||||
int16_t cid = pSchemaRow->pSchema[i].colId;
|
||||
int8_t col_type = pSchemaRow->pSchema[i].type;
|
||||
|
||||
(void)tsdbCacheNewTableColumn(pTsdb, uid, cid, col_type, lflag | LFLAG_LAST_ROW);
|
||||
(void)tsdbCacheNewTableColumn(pTsdb, uid, cid, col_type, lflag | LFLAG_LAST);
|
||||
(void)tsdbCacheNewTableColumn(pTsdb, uid, cid, col_type, LFLAG_LAST_ROW);
|
||||
(void)tsdbCacheNewTableColumn(pTsdb, uid, cid, col_type, LFLAG_LAST);
|
||||
}
|
||||
} else {
|
||||
STSchema *pTSchema = NULL;
|
||||
|
@ -745,18 +761,12 @@ int32_t tsdbCacheNewTable(STsdb *pTsdb, tb_uid_t uid, tb_uid_t suid, SSchemaWrap
|
|||
return -1;
|
||||
}
|
||||
|
||||
int8_t lflag = 0;
|
||||
int nCols = pTSchema->numOfCols;
|
||||
if (nCols >= 2) {
|
||||
lflag = (pTSchema->columns[1].flags & COL_IS_KEY) ? LFLAG_PRIMARY_KEY : 0;
|
||||
}
|
||||
|
||||
for (int i = 0; i < nCols; ++i) {
|
||||
for (int i = 0; i < pTSchema->numOfCols; ++i) {
|
||||
int16_t cid = pTSchema->columns[i].colId;
|
||||
int8_t col_type = pTSchema->columns[i].type;
|
||||
|
||||
(void)tsdbCacheNewTableColumn(pTsdb, uid, cid, col_type, lflag | LFLAG_LAST_ROW);
|
||||
(void)tsdbCacheNewTableColumn(pTsdb, uid, cid, col_type, lflag | LFLAG_LAST);
|
||||
(void)tsdbCacheNewTableColumn(pTsdb, uid, cid, col_type, LFLAG_LAST_ROW);
|
||||
(void)tsdbCacheNewTableColumn(pTsdb, uid, cid, col_type, LFLAG_LAST);
|
||||
}
|
||||
|
||||
taosMemoryFree(pTSchema);
|
||||
|
@ -935,7 +945,6 @@ static void tsdbCacheUpdateLastCol(SLastCol *pLastCol, SRowKey *pRowKey, SColVal
|
|||
int nData = 0;
|
||||
|
||||
// update rowkey
|
||||
pLastCol->version = LAST_COL_VERSION;
|
||||
pLastCol->rowKey.ts = pRowKey->ts;
|
||||
pLastCol->rowKey.numOfPKs = pRowKey->numOfPKs;
|
||||
for (int8_t i = 0; i < pRowKey->numOfPKs; i++) {
|
||||
|
@ -1016,19 +1025,19 @@ int32_t tsdbCacheUpdate(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, TSDBROW *pRow
|
|||
STsdbRowKey tsdbRowKey = {0};
|
||||
tsdbRowGetKey(pRow, &tsdbRowKey);
|
||||
SRowKey *pRowKey = &tsdbRowKey.key;
|
||||
int8_t lflag = (pRowKey->numOfPKs != 0) ? LFLAG_PRIMARY_KEY : 0;
|
||||
|
||||
taosThreadMutexLock(&pTsdb->lruMutex);
|
||||
for (int i = 0; i < num_keys; ++i) {
|
||||
SColVal *pColVal = (SColVal *)taosArrayGet(aColVal, i);
|
||||
int16_t cid = pColVal->cid;
|
||||
|
||||
SLastKey *key = &(SLastKey){.lflag = lflag | LFLAG_LAST_ROW, .uid = uid, .cid = cid};
|
||||
SLastKey *key = &(SLastKey){.lflag = LFLAG_LAST_ROW, .uid = uid, .cid = cid};
|
||||
size_t klen = ROCKS_KEY_LEN;
|
||||
LRUHandle *h = taosLRUCacheLookup(pCache, key, klen);
|
||||
if (h) {
|
||||
SLastCol *pLastCol = (SLastCol *)taosLRUCacheValue(pCache, h);
|
||||
if (tRowKeyCompare(&pLastCol->rowKey, pRowKey) != 1) {
|
||||
int32_t cmp_res = tRowKeyCompare(&pLastCol->rowKey, pRowKey);
|
||||
if (cmp_res < 0 || (cmp_res == 0 && !COL_VAL_IS_NONE(pColVal))) {
|
||||
tsdbCacheUpdateLastCol(pLastCol, pRowKey, pColVal);
|
||||
}
|
||||
taosLRUCacheRelease(pCache, h, false);
|
||||
|
@ -1040,7 +1049,7 @@ int32_t tsdbCacheUpdate(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, TSDBROW *pRow
|
|||
}
|
||||
|
||||
if (COL_VAL_IS_VALUE(pColVal)) {
|
||||
key->lflag = lflag | LFLAG_LAST;
|
||||
key->lflag = LFLAG_LAST;
|
||||
LRUHandle *h = taosLRUCacheLookup(pCache, key, klen);
|
||||
if (h) {
|
||||
SLastCol *pLastCol = (SLastCol *)taosLRUCacheValue(pCache, h);
|
||||
|
@ -1078,9 +1087,6 @@ int32_t tsdbCacheUpdate(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, TSDBROW *pRow
|
|||
rocksdb_free(errs[i]);
|
||||
}
|
||||
taosMemoryFree(errs);
|
||||
taosMemoryFree(keys_list);
|
||||
taosMemoryFree(keys_list_sizes);
|
||||
taosMemoryFree(values_list_sizes);
|
||||
|
||||
rocksdb_writebatch_t *wb = pTsdb->rCache.writebatch;
|
||||
for (int i = 0; i < num_keys; ++i) {
|
||||
|
@ -1088,22 +1094,28 @@ int32_t tsdbCacheUpdate(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, TSDBROW *pRow
|
|||
SColVal *pColVal = (SColVal *)TARRAY_DATA(aColVal) + idxKey->idx;
|
||||
// SColVal *pColVal = (SColVal *)taosArrayGet(aColVal, idxKey->idx);
|
||||
|
||||
SLastCol *pLastCol = tsdbCacheDeserialize(values_list[i]);
|
||||
SLastCol *pLastCol = tsdbCacheDeserialize(values_list[i], values_list_sizes[i]);
|
||||
SLastCol *PToFree = pLastCol;
|
||||
|
||||
if (IS_LAST_ROW_KEY(idxKey->key)) {
|
||||
if (NULL == pLastCol || (tRowKeyCompare(&pLastCol->rowKey, pRowKey) != 1)) {
|
||||
int32_t cmp_res = 1;
|
||||
if (pLastCol) {
|
||||
cmp_res = tRowKeyCompare(&pLastCol->rowKey, pRowKey);
|
||||
}
|
||||
|
||||
if (NULL == pLastCol || cmp_res < 0 || (cmp_res == 0 && !COL_VAL_IS_NONE(pColVal))) {
|
||||
char *value = NULL;
|
||||
size_t vlen = 0;
|
||||
tsdbCacheSerialize(&(SLastCol){.rowKey = *pRowKey, .colVal = *pColVal}, &value, &vlen);
|
||||
// SLastKey key = (SLastKey){.ltype = 0, .uid = uid, .cid = pColVal->cid};
|
||||
SLastCol lastColTmp = {.rowKey = *pRowKey, .colVal = *pColVal};
|
||||
tsdbCacheSerialize(&lastColTmp, &value, &vlen);
|
||||
|
||||
taosThreadMutexLock(&pTsdb->rCache.rMutex);
|
||||
|
||||
rocksdb_writebatch_put(wb, (char *)&idxKey->key, ROCKS_KEY_LEN, value, vlen);
|
||||
|
||||
taosThreadMutexUnlock(&pTsdb->rCache.rMutex);
|
||||
|
||||
pLastCol = (SLastCol *)value;
|
||||
pLastCol = &lastColTmp;
|
||||
SLastCol *pTmpLastCol = taosMemoryCalloc(1, sizeof(SLastCol));
|
||||
*pTmpLastCol = *pLastCol;
|
||||
pLastCol = pTmpLastCol;
|
||||
|
@ -1135,15 +1147,16 @@ int32_t tsdbCacheUpdate(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, TSDBROW *pRow
|
|||
if (NULL == pLastCol || (tRowKeyCompare(&pLastCol->rowKey, pRowKey) != 1)) {
|
||||
char *value = NULL;
|
||||
size_t vlen = 0;
|
||||
tsdbCacheSerialize(&(SLastCol){.rowKey = *pRowKey, .colVal = *pColVal}, &value, &vlen);
|
||||
// SLastKey key = (SLastKey){.ltype = 1, .uid = uid, .cid = pColVal->cid};
|
||||
SLastCol lastColTmp = {.rowKey = *pRowKey, .colVal = *pColVal};
|
||||
tsdbCacheSerialize(&lastColTmp, &value, &vlen);
|
||||
|
||||
taosThreadMutexLock(&pTsdb->rCache.rMutex);
|
||||
|
||||
rocksdb_writebatch_put(wb, (char *)&idxKey->key, ROCKS_KEY_LEN, value, vlen);
|
||||
|
||||
taosThreadMutexUnlock(&pTsdb->rCache.rMutex);
|
||||
|
||||
pLastCol = (SLastCol *)value;
|
||||
pLastCol = &lastColTmp;
|
||||
SLastCol *pTmpLastCol = taosMemoryCalloc(1, sizeof(SLastCol));
|
||||
*pTmpLastCol = *pLastCol;
|
||||
pLastCol = pTmpLastCol;
|
||||
|
@ -1179,7 +1192,10 @@ int32_t tsdbCacheUpdate(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, TSDBROW *pRow
|
|||
|
||||
rocksMayWrite(pTsdb, true, false, true);
|
||||
|
||||
taosMemoryFree(keys_list);
|
||||
taosMemoryFree(keys_list_sizes);
|
||||
taosMemoryFree(values_list);
|
||||
taosMemoryFree(values_list_sizes);
|
||||
|
||||
taosArrayDestroy(remainCols);
|
||||
}
|
||||
|
@ -1409,7 +1425,7 @@ static int32_t tsdbCacheLoadFromRaw(STsdb *pTsdb, tb_uid_t uid, SArray *pLastArr
|
|||
for (int i = 0; i < num_keys; ++i) {
|
||||
SIdxKey *idxKey = taosArrayGet(remainCols, i);
|
||||
slotIds[i] = pr->pSlotIds[idxKey->idx];
|
||||
if (idxKey->key.lflag == CACHESCAN_RETRIEVE_LAST >> 3) {
|
||||
if (IS_LAST_KEY(idxKey->key)) {
|
||||
if (NULL == lastTmpIndexArray) {
|
||||
lastTmpIndexArray = taosArrayInit(num_keys, sizeof(int32_t));
|
||||
}
|
||||
|
@ -1455,8 +1471,7 @@ static int32_t tsdbCacheLoadFromRaw(STsdb *pTsdb, tb_uid_t uid, SArray *pLastArr
|
|||
}
|
||||
|
||||
// still null, then make up a none col value
|
||||
SLastCol noneCol = {.version = LAST_COL_VERSION,
|
||||
.rowKey.ts = TSKEY_MIN,
|
||||
SLastCol noneCol = {.rowKey.ts = TSKEY_MIN,
|
||||
.colVal = COL_VAL_NONE(idxKey->key.cid, pr->pSchema->columns[slotIds[i]].type)};
|
||||
if (!pLastCol) {
|
||||
pLastCol = &noneCol;
|
||||
|
@ -1548,17 +1563,15 @@ static int32_t tsdbCacheLoadFromRocks(STsdb *pTsdb, tb_uid_t uid, SArray *pLastA
|
|||
keys_list_sizes, values_list, values_list_sizes, errs);
|
||||
for (int i = 0; i < num_keys; ++i) {
|
||||
if (errs[i]) {
|
||||
tsdbError("vgId:%d, %s failed at line %d since %s, index:%d", TD_VID(pTsdb->pVnode), __func__, __LINE__, errs[i],
|
||||
i);
|
||||
rocksdb_free(errs[i]);
|
||||
}
|
||||
}
|
||||
taosMemoryFree(key_list);
|
||||
taosMemoryFree(keys_list);
|
||||
taosMemoryFree(keys_list_sizes);
|
||||
taosMemoryFree(errs);
|
||||
|
||||
SLRUCache *pCache = pTsdb->lruCache;
|
||||
for (int i = 0, j = 0; i < num_keys && j < TARRAY_SIZE(remainCols); ++i) {
|
||||
SLastCol *pLastCol = tsdbCacheDeserialize(values_list[i]);
|
||||
SLastCol *pLastCol = tsdbCacheDeserialize(values_list[i], values_list_sizes[i]);
|
||||
SLastCol *PToFree = pLastCol;
|
||||
SIdxKey *idxKey = &((SIdxKey *)TARRAY_DATA(remainCols))[j];
|
||||
if (pLastCol) {
|
||||
|
@ -1600,6 +1613,10 @@ static int32_t tsdbCacheLoadFromRocks(STsdb *pTsdb, tb_uid_t uid, SArray *pLastA
|
|||
}
|
||||
}
|
||||
|
||||
taosMemoryFree(errs);
|
||||
taosMemoryFree(key_list);
|
||||
taosMemoryFree(keys_list);
|
||||
taosMemoryFree(keys_list_sizes);
|
||||
taosMemoryFree(values_list);
|
||||
taosMemoryFree(values_list_sizes);
|
||||
|
||||
|
@ -1621,7 +1638,7 @@ int32_t tsdbCacheGetBatch(STsdb *pTsdb, tb_uid_t uid, SArray *pLastArray, SCache
|
|||
for (int i = 0; i < num_keys; ++i) {
|
||||
int16_t cid = ((int16_t *)TARRAY_DATA(pCidList))[i];
|
||||
|
||||
SLastKey *key = &(SLastKey){.lflag = ltype, .uid = uid, .cid = cid};
|
||||
SLastKey key = {.lflag = ltype, .uid = uid, .cid = cid};
|
||||
// for select last_row, last case
|
||||
int32_t funcType = FUNCTION_TYPE_CACHE_LAST;
|
||||
if (pr->pFuncTypeList != NULL && taosArrayGetSize(pr->pFuncTypeList) > i) {
|
||||
|
@ -1629,10 +1646,10 @@ int32_t tsdbCacheGetBatch(STsdb *pTsdb, tb_uid_t uid, SArray *pLastArray, SCache
|
|||
}
|
||||
if (((pr->type & CACHESCAN_RETRIEVE_LAST) == CACHESCAN_RETRIEVE_LAST) && FUNCTION_TYPE_CACHE_LAST_ROW == funcType) {
|
||||
int8_t tempType = CACHESCAN_RETRIEVE_LAST_ROW | (pr->type ^ CACHESCAN_RETRIEVE_LAST);
|
||||
key->lflag = (tempType & CACHESCAN_RETRIEVE_LAST) >> 3;
|
||||
key.lflag = (tempType & CACHESCAN_RETRIEVE_LAST) >> 3;
|
||||
}
|
||||
|
||||
LRUHandle *h = taosLRUCacheLookup(pCache, key, ROCKS_KEY_LEN);
|
||||
LRUHandle *h = taosLRUCacheLookup(pCache, &key, ROCKS_KEY_LEN);
|
||||
if (h) {
|
||||
SLastCol *pLastCol = (SLastCol *)taosLRUCacheValue(pCache, h);
|
||||
|
||||
|
@ -1645,8 +1662,7 @@ int32_t tsdbCacheGetBatch(STsdb *pTsdb, tb_uid_t uid, SArray *pLastArray, SCache
|
|||
|
||||
taosLRUCacheRelease(pCache, h, false);
|
||||
} else {
|
||||
SLastCol noneCol = {.version = LAST_COL_VERSION,
|
||||
.rowKey.ts = TSKEY_MIN,
|
||||
SLastCol noneCol = {.rowKey.ts = TSKEY_MIN,
|
||||
.colVal = COL_VAL_NONE(cid, pr->pSchema->columns[pr->pSlotIds[i]].type)};
|
||||
|
||||
taosArrayPush(pLastArray, &noneCol);
|
||||
|
@ -1654,7 +1670,7 @@ int32_t tsdbCacheGetBatch(STsdb *pTsdb, tb_uid_t uid, SArray *pLastArray, SCache
|
|||
if (!remainCols) {
|
||||
remainCols = taosArrayInit(num_keys, sizeof(SIdxKey));
|
||||
}
|
||||
taosArrayPush(remainCols, &(SIdxKey){i, *key});
|
||||
taosArrayPush(remainCols, &(SIdxKey){i, key});
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1711,17 +1727,12 @@ int32_t tsdbCacheDel(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, TSKEY sKey, TSKE
|
|||
size_t *keys_list_sizes = taosMemoryCalloc(num_keys * 2, sizeof(size_t));
|
||||
const size_t klen = ROCKS_KEY_LEN;
|
||||
|
||||
int8_t lflag = 0;
|
||||
if (num_keys >= 2) {
|
||||
lflag = (pTSchema->columns[1].flags & COL_IS_KEY) ? LFLAG_PRIMARY_KEY : 0;
|
||||
}
|
||||
|
||||
for (int i = 0; i < num_keys; ++i) {
|
||||
int16_t cid = pTSchema->columns[i].colId;
|
||||
|
||||
char *keys = taosMemoryCalloc(2, sizeof(SLastKey));
|
||||
((SLastKey *)keys)[0] = (SLastKey){.lflag = lflag | LFLAG_LAST, .uid = uid, .cid = cid};
|
||||
((SLastKey *)keys)[1] = (SLastKey){.lflag = lflag | LFLAG_LAST_ROW, .uid = uid, .cid = cid};
|
||||
((SLastKey *)keys)[0] = (SLastKey){.lflag = LFLAG_LAST, .uid = uid, .cid = cid};
|
||||
((SLastKey *)keys)[1] = (SLastKey){.lflag = LFLAG_LAST_ROW, .uid = uid, .cid = cid};
|
||||
|
||||
keys_list[i] = keys;
|
||||
keys_list[num_keys + i] = keys + sizeof(SLastKey);
|
||||
|
@ -1751,14 +1762,14 @@ int32_t tsdbCacheDel(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, TSKEY sKey, TSKE
|
|||
|
||||
rocksdb_writebatch_t *wb = pTsdb->rCache.writebatch;
|
||||
for (int i = 0; i < num_keys; ++i) {
|
||||
SLastCol *pLastCol = tsdbCacheDeserialize(values_list[i]);
|
||||
SLastCol *pLastCol = tsdbCacheDeserialize(values_list[i], values_list_sizes[i]);
|
||||
taosThreadMutexLock(&pTsdb->rCache.rMutex);
|
||||
if (NULL != pLastCol && (pLastCol->rowKey.ts <= eKey && pLastCol->rowKey.ts >= sKey)) {
|
||||
rocksdb_writebatch_delete(wb, keys_list[i], klen);
|
||||
}
|
||||
taosMemoryFreeClear(pLastCol);
|
||||
|
||||
pLastCol = tsdbCacheDeserialize(values_list[i + num_keys]);
|
||||
pLastCol = tsdbCacheDeserialize(values_list[i + num_keys], values_list_sizes[i + num_keys]);
|
||||
if (NULL != pLastCol && (pLastCol->rowKey.ts <= eKey && pLastCol->rowKey.ts >= sKey)) {
|
||||
rocksdb_writebatch_delete(wb, keys_list[num_keys + i], klen);
|
||||
}
|
||||
|
@ -3284,8 +3295,7 @@ static int32_t initLastColArrayPartial(STSchema *pTSchema, SArray **ppColArray,
|
|||
|
||||
for (int32_t i = 0; i < nCols; ++i) {
|
||||
int16_t slotId = slotIds[i];
|
||||
SLastCol col = {.version = LAST_COL_VERSION,
|
||||
.rowKey.ts = 0,
|
||||
SLastCol col = {.rowKey.ts = 0,
|
||||
.colVal = COL_VAL_NULL(pTSchema->columns[slotId].colId, pTSchema->columns[slotId].type)};
|
||||
taosArrayPush(pColArray, &col);
|
||||
}
|
||||
|
@ -3391,12 +3401,12 @@ static int32_t mergeLastCid(tb_uid_t uid, STsdb *pTsdb, SArray **ppLastArray, SC
|
|||
STColumn *pTColumn = &pTSchema->columns[0];
|
||||
|
||||
*pColVal = COL_VAL_VALUE(pTColumn->colId, ((SValue){.type = pTColumn->type, .val = rowTs}));
|
||||
taosArraySet(pColArray, 0, &(SLastCol){.version = LAST_COL_VERSION, .rowKey.ts = rowTs, .colVal = *pColVal});
|
||||
taosArraySet(pColArray, 0, &(SLastCol){.rowKey.ts = rowTs, .colVal = *pColVal});
|
||||
continue;
|
||||
}
|
||||
tsdbRowGetColVal(pRow, pTSchema, slotIds[iCol], pColVal);
|
||||
|
||||
*pCol = (SLastCol){.version = LAST_COL_VERSION, .rowKey.ts = rowTs, .colVal = *pColVal};
|
||||
*pCol = (SLastCol){.rowKey.ts = rowTs, .colVal = *pColVal};
|
||||
if (IS_VAR_DATA_TYPE(pColVal->value.type) /*&& pColVal->value.nData > 0*/) {
|
||||
if (pColVal->value.nData > 0) {
|
||||
pCol->colVal.value.pData = taosMemoryMalloc(pCol->colVal.value.nData);
|
||||
|
@ -3446,7 +3456,7 @@ static int32_t mergeLastCid(tb_uid_t uid, STsdb *pTsdb, SArray **ppLastArray, SC
|
|||
|
||||
tsdbRowGetColVal(pRow, pTSchema, slotIds[iCol], pColVal);
|
||||
if (!COL_VAL_IS_VALUE(tColVal) && COL_VAL_IS_VALUE(pColVal)) {
|
||||
SLastCol lastCol = {.version = LAST_COL_VERSION, .rowKey.ts = rowTs, .colVal = *pColVal};
|
||||
SLastCol lastCol = {.rowKey.ts = rowTs, .colVal = *pColVal};
|
||||
if (IS_VAR_DATA_TYPE(pColVal->value.type) /* && pColVal->value.nData > 0 */) {
|
||||
SLastCol *pLastCol = (SLastCol *)taosArrayGet(pColArray, iCol);
|
||||
taosMemoryFree(pLastCol->colVal.value.pData);
|
||||
|
@ -3570,12 +3580,12 @@ static int32_t mergeLastRowCid(tb_uid_t uid, STsdb *pTsdb, SArray **ppLastArray,
|
|||
STColumn *pTColumn = &pTSchema->columns[0];
|
||||
|
||||
*pColVal = COL_VAL_VALUE(pTColumn->colId, ((SValue){.type = pTColumn->type, .val = rowTs}));
|
||||
taosArraySet(pColArray, 0, &(SLastCol){.version = LAST_COL_VERSION, .rowKey.ts = rowTs, .colVal = *pColVal});
|
||||
taosArraySet(pColArray, 0, &(SLastCol){.rowKey.ts = rowTs, .colVal = *pColVal});
|
||||
continue;
|
||||
}
|
||||
tsdbRowGetColVal(pRow, pTSchema, slotIds[iCol], pColVal);
|
||||
|
||||
*pCol = (SLastCol){.version = LAST_COL_VERSION, .rowKey.ts = rowTs, .colVal = *pColVal};
|
||||
*pCol = (SLastCol){.rowKey.ts = rowTs, .colVal = *pColVal};
|
||||
if (IS_VAR_DATA_TYPE(pColVal->value.type) /*&& pColVal->value.nData > 0*/) {
|
||||
if (pColVal->value.nData > 0) {
|
||||
pCol->colVal.value.pData = taosMemoryMalloc(pCol->colVal.value.nData);
|
||||
|
|
|
@ -385,9 +385,6 @@ int32_t tsdbRetrieveCacheRows(void* pReader, SSDataBlock* pResBlock, const int32
|
|||
}
|
||||
|
||||
int8_t ltype = (pr->type & CACHESCAN_RETRIEVE_LAST) >> 3;
|
||||
if (pr->rowKey.numOfPKs > 0) {
|
||||
ltype |= CACHESCAN_RETRIEVE_PK;
|
||||
}
|
||||
|
||||
STableKeyInfo* pTableList = pr->pTableList;
|
||||
|
||||
|
|
|
@ -327,6 +327,7 @@ static int32_t abort_edit(STFileSystem *fs) {
|
|||
} else if (fs->etype == TSDB_FEDIT_MERGE) {
|
||||
current_fname(fs->tsdb, fname, TSDB_FCURRENT_M);
|
||||
} else {
|
||||
tsdbError("vgId:%d %s failed since invalid etype:%d", TD_VID(fs->tsdb->pVnode), __func__, fs->etype);
|
||||
ASSERT(0);
|
||||
}
|
||||
|
||||
|
|
|
@ -666,6 +666,7 @@ int32_t vnodeSnapWriterOpen(SVnode *pVnode, SSnapshotParam *pParam, SVSnapWriter
|
|||
|
||||
_err:
|
||||
vError("vgId:%d, vnode snapshot writer open failed since %s", TD_VID(pVnode), tstrerror(code));
|
||||
if (pWriter) taosMemoryFreeClear(pWriter);
|
||||
*ppWriter = NULL;
|
||||
return code;
|
||||
}
|
||||
|
|
|
@ -1149,7 +1149,7 @@ static int32_t vnodeProcessCreateTbReq(SVnode *pVnode, int64_t ver, void *pReq,
|
|||
if (i < tbNames->size - 1) {
|
||||
taosStringBuilderAppendChar(&sb, ',');
|
||||
}
|
||||
taosMemoryFreeClear(*key);
|
||||
//taosMemoryFreeClear(*key);
|
||||
}
|
||||
|
||||
size_t len = 0;
|
||||
|
@ -1173,7 +1173,7 @@ _exit:
|
|||
taosArrayDestroy(tbUids);
|
||||
tDecoderClear(&decoder);
|
||||
tEncoderClear(&encoder);
|
||||
taosArrayDestroy(tbNames);
|
||||
taosArrayDestroyP(tbNames, taosMemoryFree);
|
||||
return rcode;
|
||||
}
|
||||
|
||||
|
|
|
@ -3448,18 +3448,21 @@ int32_t ctgDropTSMAForTbEnqueue(SCatalog *pCtg, SName *pName, bool syncOp) {
|
|||
SCtgDBCache *pDbCache = NULL;
|
||||
SCtgCacheOperation *pOp = NULL;
|
||||
char dbFName[TSDB_DB_FNAME_LEN];
|
||||
SCtgTSMACache *pCtgCache = NULL;
|
||||
tNameGetFullDbName(pName, dbFName);
|
||||
CTG_ERR_JRET(ctgGetDBCache(pCtg, dbFName, &pDbCache));
|
||||
if (NULL == pDbCache || !pDbCache->tsmaCache) {
|
||||
goto _return;
|
||||
}
|
||||
|
||||
SCtgTSMACache *pCtgCache = taosHashGet(pDbCache->tsmaCache, pName->tname, strlen(pName->tname));
|
||||
if (!pCtgCache || !pCtgCache->pTsmas || pCtgCache->pTsmas->size == 0) {
|
||||
goto _return;
|
||||
}
|
||||
pCtgCache = taosHashAcquire(pDbCache->tsmaCache, pName->tname, strlen(pName->tname));
|
||||
if (!pCtgCache) goto _return;
|
||||
|
||||
CTG_LOCK(CTG_READ, &pCtgCache->tsmaLock);
|
||||
if (!pCtgCache->pTsmas || pCtgCache->pTsmas->size == 0) {
|
||||
CTG_UNLOCK(CTG_READ, &pCtgCache->tsmaLock);
|
||||
goto _return;
|
||||
}
|
||||
STSMACache *pCache = taosArrayGetP(pCtgCache->pTsmas, 0);
|
||||
pOp = createDropAllTbTsmaCtgCacheOp(pCtg, pCache, syncOp);
|
||||
if (!pOp) {
|
||||
|
@ -3469,10 +3472,11 @@ int32_t ctgDropTSMAForTbEnqueue(SCatalog *pCtg, SName *pName, bool syncOp) {
|
|||
}
|
||||
CTG_UNLOCK(CTG_READ, &pCtgCache->tsmaLock);
|
||||
CTG_ERR_JRET(ctgEnqueue(pCtg, pOp));
|
||||
|
||||
taosHashRelease(pDbCache->tsmaCache, pCtgCache);
|
||||
return TSDB_CODE_SUCCESS;
|
||||
|
||||
_return:
|
||||
if (pCtgCache) taosHashRelease(pDbCache->tsmaCache, pCtgCache);
|
||||
if (pOp) {
|
||||
taosMemoryFree(pOp->data);
|
||||
taosMemoryFree(pOp);
|
||||
|
|
|
@ -160,9 +160,6 @@ SOperatorInfo* createCacherowsScanOperator(SLastRowScanPhysiNode* pScanNode, SRe
|
|||
// partition by tbname
|
||||
if (oneTableForEachGroup(pTableListInfo) || (totalTables == 1)) {
|
||||
pInfo->retrieveType = CACHESCAN_RETRIEVE_TYPE_ALL | SCAN_ROW_TYPE(pScanNode->ignoreNull);
|
||||
if (pInfo->numOfPks > 0) {
|
||||
pInfo->retrieveType |= CACHESCAN_RETRIEVE_PK;
|
||||
}
|
||||
|
||||
STableKeyInfo* pList = tableListGetInfo(pTableListInfo, 0);
|
||||
|
||||
|
|
|
@ -2679,7 +2679,7 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
|
|||
{
|
||||
.name = "_avg_partial",
|
||||
.type = FUNCTION_TYPE_AVG_PARTIAL,
|
||||
.classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_IGNORE_NULL_FUNC,
|
||||
.classification = FUNC_MGT_AGG_FUNC,
|
||||
.translateFunc = translateAvgPartial,
|
||||
.dataRequiredFunc = statisDataRequired,
|
||||
.getEnvFunc = getAvgFuncEnv,
|
||||
|
@ -2694,7 +2694,7 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
|
|||
{
|
||||
.name = "_avg_merge",
|
||||
.type = FUNCTION_TYPE_AVG_MERGE,
|
||||
.classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_IGNORE_NULL_FUNC,
|
||||
.classification = FUNC_MGT_AGG_FUNC,
|
||||
.translateFunc = translateAvgMerge,
|
||||
.getEnvFunc = getAvgFuncEnv,
|
||||
.initFunc = avgFunctionSetup,
|
||||
|
|
|
@ -1998,6 +1998,82 @@ static int32_t pdcOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan)
|
|||
return pdcOptimizeImpl(pCxt, pLogicSubplan->pNode);
|
||||
}
|
||||
|
||||
|
||||
static bool eliminateNotNullCondMayBeOptimized(SLogicNode* pNode) {
|
||||
if (QUERY_NODE_LOGIC_PLAN_AGG != nodeType(pNode)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
SAggLogicNode* pAgg = (SAggLogicNode*)pNode;
|
||||
if (pNode->pChildren->length != 1 || NULL != pAgg->pGroupKeys) {
|
||||
return false;
|
||||
}
|
||||
|
||||
SLogicNode* pChild = (SLogicNode*)nodesListGetNode(pAgg->node.pChildren, 0);
|
||||
if (QUERY_NODE_LOGIC_PLAN_SCAN != nodeType(pChild)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
SScanLogicNode* pScan = (SScanLogicNode*)pChild;
|
||||
if (NULL == pScan->node.pConditions || QUERY_NODE_OPERATOR != nodeType(pScan->node.pConditions)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
SOperatorNode* pOp = (SOperatorNode*)pScan->node.pConditions;
|
||||
if (OP_TYPE_IS_NOT_NULL != pOp->opType) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (QUERY_NODE_COLUMN != nodeType(pOp->pLeft)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
SNode* pTmp = NULL;
|
||||
FOREACH(pTmp, pAgg->pAggFuncs) {
|
||||
SFunctionNode* pFunc = (SFunctionNode*)pTmp;
|
||||
if (!fmIsIgnoreNullFunc(pFunc->funcId)) {
|
||||
return false;
|
||||
}
|
||||
if (fmIsMultiResFunc(pFunc->funcId)) {
|
||||
SNode* pParam = NULL;
|
||||
FOREACH(pParam, pFunc->pParameterList) {
|
||||
if (QUERY_NODE_COLUMN != nodeType(pParam)) {
|
||||
return false;
|
||||
}
|
||||
if (!nodesEqualNode(pParam, pOp->pLeft)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
SNode* pParam = nodesListGetNode(pFunc->pParameterList, 0);
|
||||
if (QUERY_NODE_COLUMN != nodeType(pParam)) {
|
||||
return false;
|
||||
}
|
||||
if (!nodesEqualNode(pParam, pOp->pLeft)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static int32_t eliminateNotNullCondOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan) {
|
||||
SLogicNode* pNode = (SLogicNode*)optFindPossibleNode(pLogicSubplan->pNode, eliminateNotNullCondMayBeOptimized);
|
||||
if (NULL == pNode) {
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
SScanLogicNode* pScan = (SScanLogicNode*)nodesListGetNode(pNode->pChildren, 0);
|
||||
nodesDestroyNode(pScan->node.pConditions);
|
||||
pScan->node.pConditions = NULL;
|
||||
|
||||
pCxt->optimized = true;
|
||||
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
static bool sortPriKeyOptIsPriKeyOrderBy(SNodeList* pSortKeys) {
|
||||
if (1 != LIST_LENGTH(pSortKeys)) {
|
||||
return false;
|
||||
|
@ -6670,6 +6746,7 @@ static int32_t tsmaOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan
|
|||
static const SOptimizeRule optimizeRuleSet[] = {
|
||||
{.pName = "ScanPath", .optimizeFunc = scanPathOptimize},
|
||||
{.pName = "PushDownCondition", .optimizeFunc = pdcOptimize},
|
||||
{.pName = "EliminateNotNullCond", .optimizeFunc = eliminateNotNullCondOptimize},
|
||||
{.pName = "JoinCondOptimize", .optimizeFunc = joinCondOptimize},
|
||||
{.pName = "HashJoin", .optimizeFunc = hashJoinOptimize},
|
||||
{.pName = "StableJoin", .optimizeFunc = stableJoinOptimize},
|
||||
|
|
|
@ -287,6 +287,7 @@ typedef struct SSchJob {
|
|||
|
||||
SExplainCtx *explainCtx;
|
||||
int8_t status;
|
||||
int8_t inRetry;
|
||||
SQueryNodeAddr resNode;
|
||||
tsem_t rspSem;
|
||||
SSchOpStatus opStatus;
|
||||
|
|
|
@ -851,9 +851,18 @@ int32_t schChkResetJobRetry(SSchJob *pJob, int32_t rspCode) {
|
|||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
int32_t schResetJobForRetry(SSchJob *pJob, int32_t rspCode) {
|
||||
int32_t schResetJobForRetry(SSchJob *pJob, int32_t rspCode, bool *inRetry) {
|
||||
int8_t origInRetry = atomic_val_compare_exchange_8(&pJob->inRetry, 0, 1);
|
||||
if (0 != origInRetry) {
|
||||
SCH_JOB_DLOG("job already in retry, origInRetry: %d", pJob->inRetry);
|
||||
return TSDB_CODE_SCH_IGNORE_ERROR;
|
||||
}
|
||||
|
||||
*inRetry = true;
|
||||
|
||||
SCH_ERR_RET(schChkResetJobRetry(pJob, rspCode));
|
||||
|
||||
int32_t code = 0;
|
||||
int32_t numOfLevels = taosArrayGetSize(pJob->levels);
|
||||
for (int32_t i = 0; i < numOfLevels; ++i) {
|
||||
SSchLevel *pLevel = taosArrayGet(pJob->levels, i);
|
||||
|
@ -865,7 +874,11 @@ int32_t schResetJobForRetry(SSchJob *pJob, int32_t rspCode) {
|
|||
for (int32_t j = 0; j < numOfTasks; ++j) {
|
||||
SSchTask *pTask = taosArrayGet(pLevel->subTasks, j);
|
||||
SCH_LOCK_TASK(pTask);
|
||||
SCH_ERR_RET(schChkUpdateRedirectCtx(pJob, pTask, NULL, rspCode));
|
||||
code = schChkUpdateRedirectCtx(pJob, pTask, NULL, rspCode);
|
||||
if (TSDB_CODE_SUCCESS != code) {
|
||||
SCH_UNLOCK_TASK(pTask);
|
||||
SCH_RET(code);
|
||||
}
|
||||
qClearSubplanExecutionNode(pTask->plan);
|
||||
schResetTaskForRetry(pJob, pTask);
|
||||
SCH_UNLOCK_TASK(pTask);
|
||||
|
@ -880,6 +893,7 @@ int32_t schResetJobForRetry(SSchJob *pJob, int32_t rspCode) {
|
|||
|
||||
int32_t schHandleJobRetry(SSchJob *pJob, SSchTask *pTask, SDataBuf *pMsg, int32_t rspCode) {
|
||||
int32_t code = 0;
|
||||
bool inRetry = false;
|
||||
|
||||
taosMemoryFreeClear(pMsg->pData);
|
||||
taosMemoryFreeClear(pMsg->pEpSet);
|
||||
|
@ -888,19 +902,27 @@ int32_t schHandleJobRetry(SSchJob *pJob, SSchTask *pTask, SDataBuf *pMsg, int32_
|
|||
|
||||
SCH_TASK_DLOG("start to redirect all job tasks cause of error: %s", tstrerror(rspCode));
|
||||
|
||||
SCH_ERR_JRET(schResetJobForRetry(pJob, rspCode));
|
||||
SCH_ERR_JRET(schResetJobForRetry(pJob, rspCode, &inRetry));
|
||||
|
||||
SCH_ERR_JRET(schLaunchJob(pJob));
|
||||
|
||||
SCH_LOCK_TASK(pTask);
|
||||
|
||||
atomic_store_8(&pJob->inRetry, 0);
|
||||
|
||||
SCH_RET(code);
|
||||
|
||||
_return:
|
||||
|
||||
SCH_LOCK_TASK(pTask);
|
||||
|
||||
SCH_RET(schProcessOnTaskFailure(pJob, pTask, code));
|
||||
code = schProcessOnTaskFailure(pJob, pTask, code);
|
||||
|
||||
if (inRetry) {
|
||||
atomic_store_8(&pJob->inRetry, 0);
|
||||
}
|
||||
|
||||
SCH_RET(code);
|
||||
}
|
||||
|
||||
bool schChkCurrentOp(SSchJob *pJob, int32_t op, int8_t sync) {
|
||||
|
|
|
@ -1961,6 +1961,7 @@ STaskDbWrapper* taskDbOpenImpl(char* key, char* statePath, char* dbPath) {
|
|||
stInfo("newly create db, need to restart");
|
||||
// pre create db
|
||||
pTaskDb->db = rocksdb_open(pTaskDb->pCfOpts[0], dbPath, &err);
|
||||
if (pTaskDb->db == NULL) goto _EXIT;
|
||||
rocksdb_close(pTaskDb->db);
|
||||
|
||||
if (cfNames != NULL) {
|
||||
|
|
|
@ -542,7 +542,9 @@ bool hasRowBuff(SStreamFileState* pFileState, void* pKey, int32_t keyLen) {
|
|||
}
|
||||
|
||||
SStreamSnapshot* getSnapshot(SStreamFileState* pFileState) {
|
||||
int64_t mark = (pFileState->deleteMark == INT64_MAX) ? INT64_MIN : pFileState->maxTs - pFileState->deleteMark;
|
||||
int64_t mark = (pFileState->deleteMark == INT64_MAX || pFileState->maxTs == INT64_MIN)
|
||||
? INT64_MIN
|
||||
: pFileState->maxTs - pFileState->deleteMark;
|
||||
clearExpiredRowBuff(pFileState, mark, false);
|
||||
return pFileState->usedBuffs;
|
||||
}
|
||||
|
|
|
@ -1100,6 +1100,14 @@ static int32_t syncNodeOnSnapshotPrepRsp(SSyncNode *pSyncNode, SSyncSnapshotSend
|
|||
int32_t code = -1;
|
||||
SSnapshot snapshot = {0};
|
||||
|
||||
if (pMsg->snapBeginIndex > pSyncNode->commitIndex) {
|
||||
sSError(pSender,
|
||||
"snapshot begin index is greater than commit index. snapBeginIndex:%" PRId64 ", commitIndex:%" PRId64,
|
||||
pMsg->snapBeginIndex, pSyncNode->commitIndex);
|
||||
terrno = TSDB_CODE_SYN_INVALID_SNAPSHOT_MSG;
|
||||
return -1;
|
||||
}
|
||||
|
||||
taosThreadMutexLock(&pSender->pSndBuf->mutex);
|
||||
pSyncNode->pFsm->FpGetSnapshotInfo(pSyncNode->pFsm, &snapshot);
|
||||
|
||||
|
|
|
@ -224,7 +224,7 @@ int32_t taosMulModeMkDir(const char *dirname, int mode, bool checkAccess) {
|
|||
#ifdef WINDOWS
|
||||
code = _mkdir(temp, mode);
|
||||
#elif defined(DARWIN)
|
||||
code = mkdir(dirname, 0777);
|
||||
code = mkdir(temp, 0777);
|
||||
#else
|
||||
code = mkdir(temp, mode);
|
||||
#endif
|
||||
|
|
|
@ -719,7 +719,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_TSMA_INVALID_STAT, "Invalid tsma state"
|
|||
TAOS_DEFINE_ERROR(TSDB_CODE_TSMA_INVALID_PTR, "Invalid tsma pointer")
|
||||
TAOS_DEFINE_ERROR(TSDB_CODE_TSMA_INVALID_PARA, "Invalid tsma parameters")
|
||||
TAOS_DEFINE_ERROR(TSDB_CODE_TSMA_INVALID_TB, "Invalid table to create tsma, only stable or normal table allowed")
|
||||
TAOS_DEFINE_ERROR(TSDB_CODE_TSMA_INVALID_INTERVAL, "Invalid tsma interval, 1ms ~ 1h is allowed")
|
||||
TAOS_DEFINE_ERROR(TSDB_CODE_TSMA_INVALID_INTERVAL, "Invalid tsma interval, 1m ~ 1h is allowed")
|
||||
TAOS_DEFINE_ERROR(TSDB_CODE_TSMA_INVALID_FUNC_PARAM, "Invalid tsma func param, only one non-tag column allowed")
|
||||
TAOS_DEFINE_ERROR(TSDB_CODE_TSMA_UNSUPPORTED_FUNC, "Tsma func not supported")
|
||||
TAOS_DEFINE_ERROR(TSDB_CODE_TSMA_MUST_BE_DROPPED, "Tsma must be dropped first")
|
||||
|
|
|
@ -0,0 +1,672 @@
|
|||
from frame.log import *
|
||||
from frame.cases import *
|
||||
from frame.sql import *
|
||||
from frame.caseBase import *
|
||||
from frame import *
|
||||
from frame.eos import *
|
||||
|
||||
|
||||
class TDTestCase(TBase):
|
||||
"""Add test case to improve the compare.c coverage
|
||||
"""
|
||||
def init(self, conn, logSql, replicaVar=1):
|
||||
self.replicaVar = int(replicaVar)
|
||||
tdLog.debug("start to execute %s" % __file__)
|
||||
tdSql.init(conn.cursor())
|
||||
|
||||
def prepare_data(self):
|
||||
# database
|
||||
tdSql.execute("create database db;")
|
||||
tdSql.execute("use db;")
|
||||
|
||||
# create table
|
||||
tdSql.execute("create table rt(ts timestamp, c_int8 tinyint, c_uint8 tinyint unsigned, c_bool bool, c_int16 smallint, c_uint16 smallint unsigned, c_int32 int, c_uint32 int unsigned, c_float float, c_int64 bigint, c_uint64 bigint unsigned, c_double double, c_binary binary(16), c_varchar varchar(16), c_nchar nchar(16), c_varbinary varbinary(16));")
|
||||
# insert data
|
||||
sql = "insert into rt values \
|
||||
('2024-05-08 12:00:00.000', 1, 2, true, 1, 2, 1, 2, 1.1, 111111, 222222, 111111.111111, 'a', 'a', 'a', \"0x01\"), \
|
||||
('2024-05-08 12:00:01.000', 2, 1, false, 2, 1, 2, 1, 2.2, 222222, 111111, 222222.222222, 'b', 'b', 'b', \"0x02\"), \
|
||||
('2024-05-08 12:00:02.000', 3, 3, true, 3, 3, 3, 3, null, 333333, 333333, 3.1111111, 'c', 'c', 'c', \"0x03\"), \
|
||||
('2024-05-08 12:00:03.000', 4, 4, false, 4, 4, 4, 4, 4.4, 444444, 222222, 444444.444444, 'd', 'd', 'd', \"0x04\"), \
|
||||
('2024-05-08 12:00:04.000', 5, 5, true, 5, 5, 5, 5, 5.5, 2, 3, 555555.555555, 'e', 'e', 'e', \"0x05\"), \
|
||||
('2024-05-08 12:00:05.000', 6, 6, false, -5, 5, 5, 5, 5.0, 6, 6, 5, 'e', 'e', 'e', \"0x06\");"
|
||||
tdSql.execute(sql)
|
||||
|
||||
def test_notin(self):
|
||||
# setChkNotInBytes1
|
||||
tdSql.query("select * from rt where c_int8 not in (6, 7);")
|
||||
tdSql.checkRows(5)
|
||||
tdSql.query("select * from rt where c_int8 not in (1, 2);")
|
||||
tdSql.checkRows(4)
|
||||
tdSql.query("select * from rt where c_bool not in (true);")
|
||||
tdSql.checkRows(3)
|
||||
|
||||
# setChkNotInBytes8
|
||||
tdSql.query("select * from rt where c_int64 not in (6666666, 7777777);")
|
||||
tdSql.checkRows(6)
|
||||
tdSql.query("select * from rt where c_uint64 not in (5555555555);")
|
||||
tdSql.checkRows(6)
|
||||
tdSql.query("select * from rt where c_double not in (111111.111111, 222222.222222);")
|
||||
tdSql.checkRows(4)
|
||||
|
||||
# setChkNotInString
|
||||
tdSql.query("select * from rt where c_binary not in ('f', 'g', 'h');")
|
||||
tdSql.checkRows(6)
|
||||
tdSql.query("select * from rt where c_varchar not in ('a', 'b', 'c');")
|
||||
tdSql.checkRows(3)
|
||||
tdSql.query("select * from rt where c_nchar not in ('d', 'e', 'f');")
|
||||
tdSql.checkRows(3)
|
||||
tdSql.query("select * from rt where c_varbinary not in ('0x01', '0x02');")
|
||||
tdSql.checkRows(4)
|
||||
|
||||
def test_compare_value(self):
|
||||
# compareUint16Val
|
||||
tdSql.query("select * from rt where c_uint16 = 5;")
|
||||
tdSql.checkRows(2)
|
||||
tdSql.query("select * from rt where c_uint16 < 5;")
|
||||
tdSql.checkRows(4)
|
||||
|
||||
# compareFloatVal
|
||||
tdSql.query("select * from rt where c_float is null;")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_float < t2.c_float;")
|
||||
tdSql.checkRows(10)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_float > t2.c_float;")
|
||||
tdSql.checkRows(10)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_float = t2.c_float;")
|
||||
tdSql.checkRows(5)
|
||||
|
||||
# compareDoubleVal
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_double = t2.c_double;")
|
||||
tdSql.checkRows(6)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_double < t2.c_double;")
|
||||
tdSql.checkRows(15)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_double > t2.c_double;")
|
||||
tdSql.checkRows(15)
|
||||
|
||||
def test_compareInt8Int16(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int8 > t2.c_int16;")
|
||||
tdSql.checkRows(21)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int8 < t2.c_int16;")
|
||||
tdSql.checkRows(10)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int8 = t2.c_int16;")
|
||||
tdSql.checkRows(5)
|
||||
|
||||
def test_compareInt8Int32(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int8 < t2.c_int32;")
|
||||
tdSql.checkRows(14)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int8 > t2.c_int32;")
|
||||
tdSql.checkRows(16)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int8 = t2.c_int32;")
|
||||
tdSql.checkRows(6)
|
||||
|
||||
def test_compareInt8Int64(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int8 < t2.c_int64;")
|
||||
tdSql.checkRows(30)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int8 > t2.c_int64;")
|
||||
tdSql.checkRows(4)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int8 = t2.c_int64;")
|
||||
tdSql.checkRows(2)
|
||||
|
||||
def test_compareInt8Double(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int8 < t2.c_double;")
|
||||
tdSql.checkRows(31)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int8 > t2.c_double;")
|
||||
tdSql.checkRows(4)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int8 = t2.c_double;")
|
||||
tdSql.checkRows(1)
|
||||
|
||||
def test_compareInt8Uint8(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int8 < t2.c_uint8;")
|
||||
tdSql.checkRows(15)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int8 > t2.c_uint8;")
|
||||
tdSql.checkRows(15)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int8 = t2.c_uint8;")
|
||||
tdSql.checkRows(6)
|
||||
|
||||
def test_compareInt8Uint16(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int8 < t2.c_uint16;")
|
||||
tdSql.checkRows(14)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int8 > t2.c_uint16;")
|
||||
tdSql.checkRows(16)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int8 = t2.c_uint16;")
|
||||
tdSql.checkRows(6)
|
||||
|
||||
def test_compareInt8Uint32(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int8 < t2.c_uint32;")
|
||||
tdSql.checkRows(14)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int8 > t2.c_uint32;")
|
||||
tdSql.checkRows(16)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int8 = t2.c_uint32;")
|
||||
tdSql.checkRows(6)
|
||||
|
||||
def test_compareInt8Uint64(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int8 < t2.c_uint64;")
|
||||
tdSql.checkRows(31)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int8 > t2.c_uint64;")
|
||||
tdSql.checkRows(3)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int8 = t2.c_uint64;")
|
||||
tdSql.checkRows(2)
|
||||
|
||||
def test_compareInt16Int32(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int16 < t2.c_int32;")
|
||||
tdSql.checkRows(20)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int16 > t2.c_int32;")
|
||||
tdSql.checkRows(10)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int16 = t2.c_int32;")
|
||||
tdSql.checkRows(6)
|
||||
|
||||
def test_compareInt16Int64(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int16 < t2.c_int64;")
|
||||
tdSql.checkRows(32)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int16 > t2.c_int64;")
|
||||
tdSql.checkRows(3)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int16 = t2.c_int32;")
|
||||
tdSql.checkRows(6)
|
||||
|
||||
def test_compareInt16Double(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int16 < t2.c_double;")
|
||||
tdSql.checkRows(33)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int16 > t2.c_double;")
|
||||
tdSql.checkRows(2)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int16 = t2.c_double;")
|
||||
tdSql.checkRows(1)
|
||||
|
||||
def test_compareInt16Uint8(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int16 < t2.c_uint8;")
|
||||
tdSql.checkRows(21)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int16 > t2.c_uint8;")
|
||||
tdSql.checkRows(10)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int16 = t2.c_uint8;")
|
||||
tdSql.checkRows(5)
|
||||
|
||||
def test_compareInt16Uint16(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int16 < t2.c_uint16;")
|
||||
tdSql.checkRows(20)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int16 > t2.c_uint16;")
|
||||
tdSql.checkRows(10)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int16 = t2.c_uint16;")
|
||||
tdSql.checkRows(6)
|
||||
|
||||
def test_compareInt16Uint32(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int16 < t2.c_uint32;")
|
||||
tdSql.checkRows(20)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int16 > t2.c_uint32;")
|
||||
tdSql.checkRows(10)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int16 = t2.c_uint32;")
|
||||
tdSql.checkRows(6)
|
||||
|
||||
def test_compareInt16Uint64(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int16 < t2.c_uint64;")
|
||||
tdSql.checkRows(33)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int16 > t2.c_uint64;")
|
||||
tdSql.checkRows(2)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int16 = t2.c_uint64;")
|
||||
tdSql.checkRows(1)
|
||||
|
||||
def test_compareInt32Int16(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int32 < t2.c_int16;")
|
||||
tdSql.checkRows(10)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int32 > t2.c_int16;")
|
||||
tdSql.checkRows(20)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int32 = t2.c_int16;")
|
||||
tdSql.checkRows(6)
|
||||
|
||||
def test_compareInt32Int64(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int32 < t2.c_int64;")
|
||||
tdSql.checkRows(31)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int32 > t2.c_int64;")
|
||||
tdSql.checkRows(4)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int32 = t2.c_int64;")
|
||||
tdSql.checkRows(1)
|
||||
|
||||
def test_compareInt32Float(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int32 < t2.c_float;")
|
||||
tdSql.checkRows(17)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int32 > t2.c_float;")
|
||||
tdSql.checkRows(11)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int32 = t2.c_float;")
|
||||
tdSql.checkRows(2)
|
||||
|
||||
def test_compareInt32Uint8(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int32 < t2.c_uint8;")
|
||||
tdSql.checkRows(16)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int32 > t2.c_uint8;")
|
||||
tdSql.checkRows(14)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int32 = t2.c_uint8;")
|
||||
tdSql.checkRows(6)
|
||||
|
||||
def test_compareInt32Uint16(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int32 < t2.c_uint16;")
|
||||
tdSql.checkRows(14)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int32 > t2.c_uint16;")
|
||||
tdSql.checkRows(14)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int32 = t2.c_uint16;")
|
||||
tdSql.checkRows(8)
|
||||
|
||||
def test_compareInt32Uint32(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int32 < t2.c_uint32;")
|
||||
tdSql.checkRows(14)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int32 > t2.c_uint32;")
|
||||
tdSql.checkRows(14)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int32 = t2.c_uint32;")
|
||||
tdSql.checkRows(8)
|
||||
|
||||
def test_compareInt32Uint64(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int32 < t2.c_uint64;")
|
||||
tdSql.checkRows(32)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int32 > t2.c_uint64;")
|
||||
tdSql.checkRows(3)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int32 = t2.c_uint64;")
|
||||
tdSql.checkRows(1)
|
||||
|
||||
def test_compareInt64Uint8(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int64 < t2.c_uint8;")
|
||||
tdSql.checkRows(4)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int64 > t2.c_uint8;")
|
||||
tdSql.checkRows(30)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int64 = t2.c_uint8;")
|
||||
tdSql.checkRows(2)
|
||||
|
||||
def test_compareInt64Uint16(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int64 < t2.c_uint16;")
|
||||
tdSql.checkRows(4)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int64 > t2.c_uint16;")
|
||||
tdSql.checkRows(31)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int64 = t2.c_uint16;")
|
||||
tdSql.checkRows(1)
|
||||
|
||||
def test_compareInt64Uint32(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int64 < t2.c_uint32;")
|
||||
tdSql.checkRows(4)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int64 > t2.c_uint32;")
|
||||
tdSql.checkRows(31)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_int64 = t2.c_uint32;")
|
||||
tdSql.checkRows(1)
|
||||
|
||||
def test_compareFloatInt32(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_float < t2.c_int32;")
|
||||
tdSql.checkRows(11)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_float > t2.c_int32;")
|
||||
tdSql.checkRows(17)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_float = t2.c_int32;")
|
||||
tdSql.checkRows(2)
|
||||
|
||||
def test_compareFloatUint8(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_float < t2.c_uint8;")
|
||||
tdSql.checkRows(13)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_float > t2.c_uint8;")
|
||||
tdSql.checkRows(16)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_float = t2.c_uint8;")
|
||||
tdSql.checkRows(1)
|
||||
|
||||
def test_compareFloatUint16(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_float < t2.c_uint16;")
|
||||
tdSql.checkRows(11)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_float > t2.c_uint16;")
|
||||
tdSql.checkRows(17)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_float = t2.c_uint16;")
|
||||
tdSql.checkRows(2)
|
||||
|
||||
def test_compareFloatUint32(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_float < t2.c_uint32;")
|
||||
tdSql.checkRows(11)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_float > t2.c_uint32;")
|
||||
tdSql.checkRows(17)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_float = t2.c_uint32;")
|
||||
tdSql.checkRows(2)
|
||||
|
||||
def test_compareFloatUint64(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_float < t2.c_uint64;")
|
||||
tdSql.checkRows(27)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_float > t2.c_uint64;")
|
||||
tdSql.checkRows(3)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_float = t2.c_uint64;")
|
||||
tdSql.checkRows(0)
|
||||
|
||||
def test_compareDoubleUint8(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_double < t2.c_uint8;")
|
||||
tdSql.checkRows(4)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_double > t2.c_uint8;")
|
||||
tdSql.checkRows(31)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_double = t2.c_uint8;")
|
||||
tdSql.checkRows(1)
|
||||
|
||||
def test_compareDoubleUint16(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_double < t2.c_uint16;")
|
||||
tdSql.checkRows(3)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_double > t2.c_uint16;")
|
||||
tdSql.checkRows(31)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_double = t2.c_uint16;")
|
||||
tdSql.checkRows(2)
|
||||
|
||||
def test_compareDoubleUint32(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_double < t2.c_uint32;")
|
||||
tdSql.checkRows(3)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_double > t2.c_uint32;")
|
||||
tdSql.checkRows(31)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_double = t2.c_uint32;")
|
||||
tdSql.checkRows(2)
|
||||
|
||||
def test_compareDoubleUint64(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_double < t2.c_uint64;")
|
||||
tdSql.checkRows(14)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_double > t2.c_uint64;")
|
||||
tdSql.checkRows(22)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_double = t2.c_uint64;")
|
||||
tdSql.checkRows(0)
|
||||
|
||||
def test_compareUint8Int16(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint8 < t2.c_int16;")
|
||||
tdSql.checkRows(10)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint8 > t2.c_int16;")
|
||||
tdSql.checkRows(21)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint8 = t2.c_int16;")
|
||||
tdSql.checkRows(5)
|
||||
|
||||
def test_compareUint8Int32(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint8 < t2.c_int32;")
|
||||
tdSql.checkRows(14)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint8 > t2.c_int32;")
|
||||
tdSql.checkRows(16)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint8 = t2.c_int32;")
|
||||
tdSql.checkRows(6)
|
||||
|
||||
def test_compareUint8Int64(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint8 < t2.c_int64;")
|
||||
tdSql.checkRows(30)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint8 > t2.c_int64;")
|
||||
tdSql.checkRows(4)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint8 = t2.c_int64;")
|
||||
tdSql.checkRows(2)
|
||||
|
||||
def test_compareUint8Float(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint8 < t2.c_float;")
|
||||
tdSql.checkRows(16)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint8 > t2.c_float;")
|
||||
tdSql.checkRows(13)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint8 = t2.c_float;")
|
||||
tdSql.checkRows(1)
|
||||
|
||||
def test_compareUint8Double(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint8 < t2.c_double;")
|
||||
tdSql.checkRows(31)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint8 > t2.c_double;")
|
||||
tdSql.checkRows(4)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint8 = t2.c_double;")
|
||||
tdSql.checkRows(1)
|
||||
|
||||
def test_compareUint8Uint16(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint8 < t2.c_uint16;")
|
||||
tdSql.checkRows(14)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint8 > t2.c_uint16;")
|
||||
tdSql.checkRows(16)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint8 = t2.c_uint16;")
|
||||
tdSql.checkRows(6)
|
||||
|
||||
def test_compareUint8Uint32(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint8 < t2.c_uint32;")
|
||||
tdSql.checkRows(14)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint8 > t2.c_uint32;")
|
||||
tdSql.checkRows(16)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint8 = t2.c_uint32;")
|
||||
tdSql.checkRows(6)
|
||||
|
||||
def test_compareUint8Uint64(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint8 < t2.c_uint64;")
|
||||
tdSql.checkRows(31)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint8 > t2.c_uint64;")
|
||||
tdSql.checkRows(3)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint8 = t2.c_uint64;")
|
||||
tdSql.checkRows(2)
|
||||
|
||||
def test_compareUint16Int16(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint16 < t2.c_int16;")
|
||||
tdSql.checkRows(10)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint16 > t2.c_int16;")
|
||||
tdSql.checkRows(20)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint16 = t2.c_int16;")
|
||||
tdSql.checkRows(6)
|
||||
|
||||
def test_compareUint16Int32(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint16 < t2.c_int32;")
|
||||
tdSql.checkRows(14)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint16 > t2.c_int32;")
|
||||
tdSql.checkRows(14)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint16 = t2.c_int32;")
|
||||
tdSql.checkRows(8)
|
||||
|
||||
def test_compareUint16Int64(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint16 < t2.c_int64;")
|
||||
tdSql.checkRows(31)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint16 > t2.c_int64;")
|
||||
tdSql.checkRows(4)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint16 = t2.c_int64;")
|
||||
tdSql.checkRows(1)
|
||||
|
||||
def test_compareUint16Float(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint16 < t2.c_float;")
|
||||
tdSql.checkRows(17)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint16 > t2.c_float;")
|
||||
tdSql.checkRows(11)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint16 = t2.c_float;")
|
||||
tdSql.checkRows(2)
|
||||
|
||||
def test_compareUint16Double(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint16 < t2.c_double;")
|
||||
tdSql.checkRows(31)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint16 > t2.c_double;")
|
||||
tdSql.checkRows(3)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint16 = t2.c_double;")
|
||||
tdSql.checkRows(2)
|
||||
|
||||
def test_compareUint16Uint8(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint16 < t2.c_uint8;")
|
||||
tdSql.checkRows(16)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint16 > t2.c_uint8;")
|
||||
tdSql.checkRows(14)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint16 = t2.c_uint8;")
|
||||
tdSql.checkRows(6)
|
||||
|
||||
def test_compareUint16Uint32(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint16 < t2.c_uint32;")
|
||||
tdSql.checkRows(14)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint16 > t2.c_uint32;")
|
||||
tdSql.checkRows(14)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint16 = t2.c_uint32;")
|
||||
tdSql.checkRows(8)
|
||||
|
||||
def test_compareUint32Int32(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint32 < t2.c_int32;")
|
||||
tdSql.checkRows(14)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint32 > t2.c_int32;")
|
||||
tdSql.checkRows(14)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint32 = t2.c_int32;")
|
||||
tdSql.checkRows(8)
|
||||
|
||||
def test_compareUint32Int64(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint32 < t2.c_int64;")
|
||||
tdSql.checkRows(31)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint32 > t2.c_int64;")
|
||||
tdSql.checkRows(4)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint32 = t2.c_int64;")
|
||||
tdSql.checkRows(1)
|
||||
|
||||
def test_compareUint32Float(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint32 < t2.c_float;")
|
||||
tdSql.checkRows(17)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint32 > t2.c_float;")
|
||||
tdSql.checkRows(11)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint32 = t2.c_float;")
|
||||
tdSql.checkRows(2)
|
||||
|
||||
def test_compareUint32Double(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint32 < t2.c_double;")
|
||||
tdSql.checkRows(31)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint32 > t2.c_double;")
|
||||
tdSql.checkRows(3)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint32 = t2.c_double;")
|
||||
tdSql.checkRows(2)
|
||||
|
||||
def test_compareUint32Uint8(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint32 < t2.c_uint8;")
|
||||
tdSql.checkRows(16)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint32 > t2.c_uint8;")
|
||||
tdSql.checkRows(14)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint32 = t2.c_uint8;")
|
||||
tdSql.checkRows(6)
|
||||
|
||||
def test_compareUint32Uint16(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint32 < t2.c_uint16;")
|
||||
tdSql.checkRows(14)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint32 > t2.c_uint16;")
|
||||
tdSql.checkRows(14)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint32 = t2.c_uint16;")
|
||||
tdSql.checkRows(8)
|
||||
|
||||
def test_compareUint32Uint64(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint32 < t2.c_uint64;")
|
||||
tdSql.checkRows(32)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint32 > t2.c_uint64;")
|
||||
tdSql.checkRows(3)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint32 = t2.c_uint64;")
|
||||
tdSql.checkRows(1)
|
||||
|
||||
def test_compareUint64Int16(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint64 < t2.c_int16;")
|
||||
tdSql.checkRows(2)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint64 > t2.c_int16;")
|
||||
tdSql.checkRows(33)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint64 = t2.c_int16;")
|
||||
tdSql.checkRows(1)
|
||||
|
||||
def test_compareUint64Int32(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint64 < t2.c_int32;")
|
||||
tdSql.checkRows(3)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint64 > t2.c_int32;")
|
||||
tdSql.checkRows(32)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint64 = t2.c_int32;")
|
||||
tdSql.checkRows(1)
|
||||
|
||||
def test_compareUint64Int64(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint64 < t2.c_int64;")
|
||||
tdSql.checkRows(17)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint64 > t2.c_int64;")
|
||||
tdSql.checkRows(14)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint64 = t2.c_int64;")
|
||||
tdSql.checkRows(5)
|
||||
|
||||
def test_compareUint64Float(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint64 < t2.c_float;")
|
||||
tdSql.checkRows(3)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint64 > t2.c_float;")
|
||||
tdSql.checkRows(27)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint64 = t2.c_float;")
|
||||
tdSql.checkRows(0)
|
||||
|
||||
def test_compareUint64Double(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint64 < t2.c_double;")
|
||||
tdSql.checkRows(22)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint64 > t2.c_double;")
|
||||
tdSql.checkRows(14)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint64 = t2.c_double;")
|
||||
tdSql.checkRows(0)
|
||||
|
||||
def test_compareUint64Uint8(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint64 < t2.c_uint8;")
|
||||
tdSql.checkRows(3)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint64 > t2.c_uint8;")
|
||||
tdSql.checkRows(31)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint64 = t2.c_uint8;")
|
||||
tdSql.checkRows(2)
|
||||
|
||||
def test_compareUint64Uint16(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint64 < t2.c_uint16;")
|
||||
tdSql.checkRows(3)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint64 > t2.c_uint16;")
|
||||
tdSql.checkRows(32)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint64 = t2.c_uint16;")
|
||||
tdSql.checkRows(1)
|
||||
|
||||
def test_compareUint64Uint32(self):
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint64 < t2.c_uint32;")
|
||||
tdSql.checkRows(3)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint64 > t2.c_uint32;")
|
||||
tdSql.checkRows(32)
|
||||
tdSql.query("select * from rt t1 left join rt t2 on timetruncate(t1.ts, 1m) = timetruncate(t2.ts, 1m) where t1.c_uint64 = t2.c_uint32;")
|
||||
tdSql.checkRows(1)
|
||||
|
||||
def run(self):
|
||||
self.prepare_data()
|
||||
self.test_notin()
|
||||
self.test_compare_value()
|
||||
self.test_compareInt8Int16()
|
||||
self.test_compareInt8Int32()
|
||||
self.test_compareInt8Int64()
|
||||
self.test_compareInt8Double()
|
||||
self.test_compareInt8Uint8()
|
||||
self.test_compareInt8Uint16()
|
||||
self.test_compareInt8Uint32()
|
||||
self.test_compareInt8Uint64()
|
||||
self.test_compareInt16Int32()
|
||||
self.test_compareInt16Int64()
|
||||
self.test_compareInt16Double()
|
||||
self.test_compareInt16Uint8()
|
||||
self.test_compareInt16Uint16()
|
||||
self.test_compareInt16Uint32()
|
||||
self.test_compareInt16Uint64()
|
||||
self.test_compareInt32Int16()
|
||||
self.test_compareInt32Int64()
|
||||
self.test_compareInt32Float()
|
||||
self.test_compareInt32Uint8()
|
||||
self.test_compareInt32Uint16()
|
||||
self.test_compareInt32Uint32()
|
||||
self.test_compareInt32Uint64()
|
||||
self.test_compareInt64Uint8()
|
||||
self.test_compareInt64Uint16()
|
||||
self.test_compareInt64Uint32()
|
||||
self.test_compareFloatInt32()
|
||||
self.test_compareFloatUint8()
|
||||
self.test_compareFloatUint16()
|
||||
self.test_compareFloatUint32()
|
||||
self.test_compareFloatUint64()
|
||||
self.test_compareDoubleUint8()
|
||||
self.test_compareDoubleUint16()
|
||||
self.test_compareDoubleUint32()
|
||||
self.test_compareDoubleUint64()
|
||||
self.test_compareUint8Int16()
|
||||
self.test_compareUint8Int32()
|
||||
self.test_compareUint8Int64()
|
||||
self.test_compareUint8Float()
|
||||
self.test_compareUint8Double()
|
||||
self.test_compareUint8Uint16()
|
||||
self.test_compareUint8Uint32()
|
||||
self.test_compareUint8Uint64()
|
||||
self.test_compareUint16Int16()
|
||||
self.test_compareUint16Int32()
|
||||
self.test_compareUint16Int64()
|
||||
self.test_compareUint16Float()
|
||||
self.test_compareUint16Double()
|
||||
self.test_compareUint16Uint8()
|
||||
self.test_compareUint16Uint32()
|
||||
self.test_compareUint32Int32()
|
||||
self.test_compareUint32Int64()
|
||||
self.test_compareUint32Float()
|
||||
self.test_compareUint32Double()
|
||||
self.test_compareUint32Uint8()
|
||||
self.test_compareUint32Uint16()
|
||||
self.test_compareUint32Uint64()
|
||||
self.test_compareUint64Int16()
|
||||
self.test_compareUint64Int32()
|
||||
self.test_compareUint64Int64()
|
||||
self.test_compareUint64Float()
|
||||
self.test_compareUint64Double()
|
||||
self.test_compareUint64Uint8()
|
||||
self.test_compareUint64Uint16()
|
||||
self.test_compareUint64Uint32()
|
||||
|
||||
def stop(self):
|
||||
tdSql.close()
|
||||
tdLog.success("%s successfully executed" % __file__)
|
||||
|
||||
tdCases.addWindows(__file__, TDTestCase())
|
||||
tdCases.addLinux(__file__, TDTestCase())
|
|
@ -15,6 +15,7 @@
|
|||
,,y,army,./pytest.sh python3 ./test.py -f community/cluster/snapshot.py -N 3 -L 3 -D 2
|
||||
,,y,army,./pytest.sh python3 ./test.py -f community/query/function/test_func_elapsed.py
|
||||
,,y,army,./pytest.sh python3 ./test.py -f community/query/test_join.py
|
||||
,,y,army,./pytest.sh python3 ./test.py -f community/query/test_compare.py
|
||||
,,y,army,./pytest.sh python3 ./test.py -f community/query/fill/fill_desc.py -N 3 -L 3 -D 2
|
||||
,,y,army,./pytest.sh python3 ./test.py -f community/cluster/incSnapshot.py -N 3
|
||||
,,y,army,./pytest.sh python3 ./test.py -f community/query/query_basic.py -N 3
|
||||
|
@ -383,6 +384,7 @@
|
|||
,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/test_ts4479.py
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/test_td29793.py
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/insert_timestamp.py
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/test_td29157.py
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/show.py
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/show_tag_index.py
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/information_schema.py
|
||||
|
@ -483,6 +485,30 @@
|
|||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_and_last_row.py -Q 2
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_and_last_row.py -Q 3
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last_and_last_row.py -Q 4
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last+last_row.py
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last+last_row.py -Q 2
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last+last_row.py -Q 3
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/last+last_row.py -Q 4
|
||||
#,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_1.py
|
||||
#,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_1.py -R
|
||||
#,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_1.py -Q 2
|
||||
#,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_1.py -Q 3
|
||||
#,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_1.py -Q 4
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_2.py
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_2.py -R
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_2.py -Q 2
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_2.py -Q 3
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_2.py -Q 4
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_3.py
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_3.py -R
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_3.py -Q 2
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_3.py -Q 3
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_3.py -Q 4
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_4.py
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_4.py -R
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_4.py -Q 2
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_4.py -Q 3
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/primary_ts_base_4.py -Q 4
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/leastsquares.py
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/leastsquares.py -R
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/length.py
|
||||
|
|
|
@ -0,0 +1,55 @@
|
|||
from util.log import *
|
||||
from util.cases import *
|
||||
from util.sql import *
|
||||
|
||||
|
||||
class TDTestCase:
|
||||
"""Verify td-29157
|
||||
"""
|
||||
def init(self, conn, logSql, replicaVer=1):
|
||||
tdLog.debug("start to execute %s" % __file__)
|
||||
tdSql.init(conn.cursor(), True)
|
||||
self.conn = conn
|
||||
self.db_name = "td29157"
|
||||
|
||||
def run(self):
|
||||
self.conn.execute(f"drop database if exists {self.db_name}")
|
||||
self.conn.execute(f"CREATE DATABASE {self.db_name}")
|
||||
self.conn.execute(f"USE {self.db_name}")
|
||||
|
||||
tdSql.execute("create table stb1 (ts timestamp, c0 varbinary(10)) tags(t0 varbinary(10));")
|
||||
tdSql.execute("insert into ctb11 using stb1 tags(\"0x11\") values(now,\"0x01\");")
|
||||
tdSql.execute("insert into ctb12 using stb1 tags(\"0x22\") values(now,\"0x02\");")
|
||||
tdSql.query("show tags from ctb11;")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 3, 't0')
|
||||
tdSql.checkData(0, 4, 'VARBINARY(10)')
|
||||
tdSql.checkData(0, 5, '\\x30783131')
|
||||
|
||||
tdSql.execute("create table stb2 (ts timestamp, c0 geometry(500)) tags(t0 geometry(100));")
|
||||
tdSql.execute("insert into ctb2 using stb2 tags('LINESTRING (1.000000 1.000000, 2.000000 2.000000, 5.000000 5.000000)') values(now,'POLYGON((1.0 1.0, 2.0 2.0, 1.0 1.0))');")
|
||||
tdSql.query("show tags from ctb2;")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 3, 't0')
|
||||
tdSql.checkData(0, 4, 'GEOMETRY(100)')
|
||||
tdSql.checkData(0, 5, 'LINESTRING (1.000000 1.000000, 2.000000 2.000000, 5.000000 5.000000)')
|
||||
|
||||
tdSql.execute("create table stb3 (ts timestamp, c0 bigint, c1 varchar(10)) tags(t0 geometry(100), t1 varbinary(10));")
|
||||
tdSql.execute("insert into ctb3 using stb3 tags('POLYGON EMPTY', \"0x03\") values(now,100, \"abc\");")
|
||||
tdSql.query("show tags from ctb3;")
|
||||
tdSql.checkRows(2)
|
||||
tdSql.checkData(0, 3, 't0')
|
||||
tdSql.checkData(0, 4, 'GEOMETRY(100)')
|
||||
tdSql.checkData(0, 5, 'POLYGON EMPTY')
|
||||
tdSql.checkData(1, 3, 't1')
|
||||
tdSql.checkData(1, 4, 'VARBINARY(10)')
|
||||
tdSql.checkData(1, 5, '\\x30783033')
|
||||
|
||||
|
||||
def stop(self):
|
||||
tdSql.execute("drop database if exists %s" % self.db_name)
|
||||
tdSql.close()
|
||||
tdLog.success("%s successfully executed" % __file__)
|
||||
|
||||
tdCases.addWindows(__file__, TDTestCase())
|
||||
tdCases.addLinux(__file__, TDTestCase())
|
|
@ -162,15 +162,15 @@ class TDTestCase:
|
|||
tdSql.checkData( i, 0, date_init_stamp)
|
||||
|
||||
|
||||
tdSql.query(f"select cast(c2 as timestamp) as b from {self.dbname}.t1")
|
||||
for i in range(len(data_t1_c2)):
|
||||
if data_t1_c2[i] is None:
|
||||
tdSql.checkData( i, 0 , None )
|
||||
elif i == 10:
|
||||
continue
|
||||
else:
|
||||
date_init_stamp = _datetime_epoch+datetime.timedelta(seconds=int(data_t1_c2[i]) / 1000.0)
|
||||
tdSql.checkData( i, 0, date_init_stamp)
|
||||
# tdSql.query(f"select cast(c2 as timestamp) as b from {self.dbname}.t1")
|
||||
# for i in range(len(data_t1_c2)):
|
||||
# if data_t1_c2[i] is None:
|
||||
# tdSql.checkData( i, 0 , None )
|
||||
# elif i == 10:
|
||||
# continue
|
||||
# else:
|
||||
# date_init_stamp = _datetime_epoch+datetime.timedelta(seconds=int(data_t1_c2[i]) / 1000.0)
|
||||
# tdSql.checkData( i, 0, date_init_stamp)
|
||||
|
||||
|
||||
tdLog.printNoPrefix("==========step12: cast smallint to bigint, expect no changes")
|
||||
|
@ -389,15 +389,15 @@ class TDTestCase:
|
|||
date_init_stamp = _datetime_epoch+datetime.timedelta(seconds=int(data_ct4_c6[i]) / 1000.0)
|
||||
tdSql.checkData( i, 0, date_init_stamp)
|
||||
|
||||
tdSql.query(f"select cast(c6 as timestamp) as b from {self.dbname}.t1")
|
||||
for i in range(len(data_t1_c6)):
|
||||
if data_t1_c6[i] is None:
|
||||
tdSql.checkData( i, 0 , None )
|
||||
elif i == 10:
|
||||
continue
|
||||
else:
|
||||
date_init_stamp = _datetime_epoch+datetime.timedelta(seconds=int(data_t1_c6[i]) / 1000.0)
|
||||
tdSql.checkData( i, 0, date_init_stamp)
|
||||
# tdSql.query(f"select cast(c6 as timestamp) as b from {self.dbname}.t1")
|
||||
# for i in range(len(data_t1_c6)):
|
||||
# if data_t1_c6[i] is None:
|
||||
# tdSql.checkData( i, 0 , None )
|
||||
# elif i == 10:
|
||||
# continue
|
||||
# else:
|
||||
# date_init_stamp = _datetime_epoch+datetime.timedelta(seconds=int(data_t1_c6[i]) / 1000.0)
|
||||
# tdSql.checkData( i, 0, date_init_stamp)
|
||||
|
||||
tdLog.printNoPrefix("==========step28: cast bool to bigint, expect no changes")
|
||||
tdSql.query(f"select c7 from {self.dbname}.ct4")
|
||||
|
|
|
@ -0,0 +1,353 @@
|
|||
###################################################################
|
||||
# Copyright (c) 2016 by TAOS Technologies, Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# This file is proprietary and confidential to TAOS Technologies.
|
||||
# No part of this file may be reproduced, stored, transmitted,
|
||||
# disclosed or used in any form or by any means other than as
|
||||
# expressly provided by the written permission from Jianhui Tao
|
||||
#
|
||||
###################################################################
|
||||
|
||||
# -*- coding: utf-8 -*-
|
||||
from util.cases import tdCases
|
||||
#from .nestedQueryInterval import *
|
||||
from .nestedQuery import *
|
||||
from faker import Faker
|
||||
import random
|
||||
|
||||
class TDTestCase(TDTestCase):
|
||||
|
||||
def explain_scan_value(self,sql,cachemodel):
|
||||
tdLog.info(cachemodel)
|
||||
if cachemodel=='none':
|
||||
tdSql.query(sql)
|
||||
self.check_sql_result_include(sql,'Table Scan')
|
||||
self.check_sql_result_not_include(sql,'Last Row Scan')
|
||||
|
||||
elif cachemodel=='last_row':
|
||||
tdSql.query(sql)
|
||||
self.check_sql_result_include(sql,'Last Row Scan')
|
||||
self.check_sql_result_not_include(sql,'Table Scan')
|
||||
elif cachemodel=='last_row_1':
|
||||
tdSql.query("reset query cache;")
|
||||
tdSql.query(sql)
|
||||
self.check_sql_result_include(sql,'Last Row')
|
||||
self.check_sql_result_include(sql,'Table')
|
||||
|
||||
elif cachemodel=='last_value':
|
||||
tdSql.query(sql)
|
||||
self.check_sql_result_not_include(sql,'Last Row Scan')
|
||||
self.check_sql_result_include(sql,'Table Scan')
|
||||
elif cachemodel=='last_value_1':
|
||||
tdSql.query(sql)
|
||||
self.check_sql_result_include(sql,'Last Row Scan')
|
||||
self.check_sql_result_include(sql,'Table Scan')
|
||||
|
||||
elif cachemodel=='both':
|
||||
tdSql.query(sql)
|
||||
self.check_sql_result_include(sql,'Last Row Scan')
|
||||
self.check_sql_result_not_include(sql,'Table Scan')
|
||||
|
||||
else:
|
||||
tdSql.query(sql)
|
||||
tdLog.info(sql)
|
||||
tdLog.exit(f"explain_scan_value : checkEqual error")
|
||||
|
||||
|
||||
def check_sql_result_include(self, sql,include_result):
|
||||
result = os.popen("taos -s 'reset query cache; %s'" %sql)
|
||||
res = result.read()
|
||||
#tdLog.info(res)
|
||||
if (include_result in res):
|
||||
tdLog.info(f"check_sql_result_include : checkEqual success")
|
||||
else :
|
||||
tdLog.info(res)
|
||||
tdLog.info(sql)
|
||||
tdLog.exit(f"check_sql_result_include : checkEqual error")
|
||||
|
||||
def check_sql_result_not_include(self, sql,not_include_result):
|
||||
result = os.popen("taos -s 'reset query cache; %s'" %sql)
|
||||
res = result.read()
|
||||
#tdLog.info(res)
|
||||
if (not_include_result in res):
|
||||
tdLog.info(res)
|
||||
tdLog.info(sql)
|
||||
tdLog.exit(f"check_sql_result_not_include : checkEqual error")
|
||||
else :
|
||||
tdLog.info(f"check_sql_result_not_include : checkEqual success")
|
||||
|
||||
def cachemodel_none(self, dbname="nested"):
|
||||
|
||||
|
||||
sql = f"explain select last(*) from {dbname}.stable_1 "
|
||||
self.explain_scan_value(sql,"none")
|
||||
sql = f"explain select last_row(*) from {dbname}.stable_1 "
|
||||
self.explain_scan_value(sql,"none")
|
||||
sql = f"explain select last(*),last_row(*) from {dbname}.stable_1 "
|
||||
self.explain_scan_value(sql,"none")
|
||||
sql = f"explain select last(*),last(*) from {dbname}.stable_1 "
|
||||
self.explain_scan_value(sql,"none")
|
||||
sql = f"explain select last_row(*),last_row(*) from {dbname}.stable_1 "
|
||||
self.explain_scan_value(sql,"none")
|
||||
|
||||
sql = f"explain select last(*) from {dbname}.stable_1 group by tbname"
|
||||
self.explain_scan_value(sql,"none")
|
||||
sql = f"explain select last_row(*) from {dbname}.stable_1 group by tbname"
|
||||
self.explain_scan_value(sql,"none")
|
||||
sql = f"explain select last(*),last_row(*) from {dbname}.stable_1 group by tbname"
|
||||
self.explain_scan_value(sql,"none")
|
||||
sql = f"explain select last(*),last(*) from {dbname}.stable_1 group by tbname"
|
||||
self.explain_scan_value(sql,"none")
|
||||
sql = f"explain select last_row(*),last_row(*) from {dbname}.stable_1 group by tbname"
|
||||
self.explain_scan_value(sql,"none")
|
||||
|
||||
sql = f"explain select last(*) from {dbname}.stable_1 partition by tbname"
|
||||
self.explain_scan_value(sql,"none")
|
||||
sql = f"explain select last_row(*) from {dbname}.stable_1 partition by tbname"
|
||||
self.explain_scan_value(sql,"none")
|
||||
sql = f"explain select last(*),last_row(*) from {dbname}.stable_1 partition by tbname"
|
||||
self.explain_scan_value(sql,"none")
|
||||
sql = f"explain select last(*),last(*) from {dbname}.stable_1 partition by tbname"
|
||||
self.explain_scan_value(sql,"none")
|
||||
sql = f"explain select last_row(*),last_row(*) from {dbname}.stable_1 partition by tbname"
|
||||
self.explain_scan_value(sql,"none")
|
||||
|
||||
|
||||
# last(id+1)
|
||||
sql = f"explain select last(*) from {dbname}.stable_1 "
|
||||
self.explain_scan_value(sql,"none")
|
||||
sql = f"explain select last_row(*) from {dbname}.stable_1 "
|
||||
self.explain_scan_value(sql,"none")
|
||||
sql = f"explain select last(*),last_row(*) from {dbname}.stable_1 "
|
||||
self.explain_scan_value(sql,"none")
|
||||
sql = f"explain select last(*),last(*) from {dbname}.stable_1 "
|
||||
self.explain_scan_value(sql,"none")
|
||||
sql = f"explain select last_row(*),last_row(*) from {dbname}.stable_1 "
|
||||
self.explain_scan_value(sql,"none")
|
||||
|
||||
sql = f"explain select last(*) from {dbname}.stable_1 group by tbname"
|
||||
self.explain_scan_value(sql,"none")
|
||||
sql = f"explain select last_row(*) from {dbname}.stable_1 group by tbname"
|
||||
self.explain_scan_value(sql,"none")
|
||||
sql = f"explain select last(*),last_row(*) from {dbname}.stable_1 group by tbname"
|
||||
self.explain_scan_value(sql,"none")
|
||||
sql = f"explain select last(*),last(*) from {dbname}.stable_1 group by tbname"
|
||||
self.explain_scan_value(sql,"none")
|
||||
sql = f"explain select last_row(*),last_row(*) from {dbname}.stable_1 group by tbname"
|
||||
self.explain_scan_value(sql,"none")
|
||||
|
||||
sql = f"explain select last(*) from {dbname}.stable_1 partition by tbname"
|
||||
self.explain_scan_value(sql,"none")
|
||||
sql = f"explain select last_row(*) from {dbname}.stable_1 partition by tbname"
|
||||
self.explain_scan_value(sql,"none")
|
||||
sql = f"explain select last(*),last_row(*) from {dbname}.stable_1 partition by tbname"
|
||||
self.explain_scan_value(sql,"none")
|
||||
sql = f"explain select last(*),last(*) from {dbname}.stable_1 partition by tbname"
|
||||
self.explain_scan_value(sql,"none")
|
||||
sql = f"explain select last_row(*),last_row(*) from {dbname}.stable_1 partition by tbname"
|
||||
self.explain_scan_value(sql,"none")
|
||||
|
||||
|
||||
#last(id)+1
|
||||
sql = f"explain select last(*) from {dbname}.stable_1 "
|
||||
self.explain_scan_value(sql,"none")
|
||||
sql = f"explain select last_row(*) from {dbname}.stable_1 "
|
||||
self.explain_scan_value(sql,"none")
|
||||
sql = f"explain select last(*),last_row(*) from {dbname}.stable_1 "
|
||||
self.explain_scan_value(sql,"none")
|
||||
sql = f"explain select last(*),last(*) from {dbname}.stable_1 "
|
||||
self.explain_scan_value(sql,"none")
|
||||
sql = f"explain select last_row(*),last_row(*) from {dbname}.stable_1 "
|
||||
self.explain_scan_value(sql,"none")
|
||||
|
||||
sql = f"explain select last(*) from {dbname}.stable_1 group by tbname"
|
||||
self.explain_scan_value(sql,"none")
|
||||
sql = f"explain select last_row(*) from {dbname}.stable_1 group by tbname"
|
||||
self.explain_scan_value(sql,"none")
|
||||
sql = f"explain select last(*),last_row(*) from {dbname}.stable_1 group by tbname"
|
||||
self.explain_scan_value(sql,"none")
|
||||
sql = f"explain select last(*),last(*) from {dbname}.stable_1 group by tbname"
|
||||
self.explain_scan_value(sql,"none")
|
||||
sql = f"explain select last_row(*),last_row(*) from {dbname}.stable_1 group by tbname"
|
||||
self.explain_scan_value(sql,"none")
|
||||
|
||||
sql = f"explain select last(*) from {dbname}.stable_1 partition by tbname"
|
||||
self.explain_scan_value(sql,"none")
|
||||
sql = f"explain select last_row(*) from {dbname}.stable_1 partition by tbname"
|
||||
self.explain_scan_value(sql,"none")
|
||||
sql = f"explain select last(*),last_row(*) from {dbname}.stable_1 partition by tbname"
|
||||
self.explain_scan_value(sql,"none")
|
||||
sql = f"explain select last(*),last(*) from {dbname}.stable_1 partition by tbname"
|
||||
self.explain_scan_value(sql,"none")
|
||||
sql = f"explain select last_row(*),last_row(*) from {dbname}.stable_1 partition by tbname"
|
||||
self.explain_scan_value(sql,"none")
|
||||
|
||||
|
||||
def cachemodel_last_row(self, dbname="nested"):
|
||||
|
||||
sql = f"explain select last(*) from {dbname}.stable_1 "
|
||||
self.explain_scan_value(sql,"last_value")
|
||||
sql = f"explain select last_row(*) from {dbname}.stable_1 "
|
||||
self.explain_scan_value(sql,"last_row")
|
||||
sql = f"explain select last(*),last_row(*) from {dbname}.stable_1 "
|
||||
self.explain_scan_value(sql,"last_row_1")
|
||||
sql = f"explain select last(*),last(*) from {dbname}.stable_1 "
|
||||
self.explain_scan_value(sql,"last_value")
|
||||
sql = f"explain select last_row(*),last_row(*) from {dbname}.stable_1 "
|
||||
self.explain_scan_value(sql,"last_row")
|
||||
|
||||
def cachemodel_last_value(self, dbname="nested"):
|
||||
|
||||
sql = f"explain select last(*) from {dbname}.stable_1 "
|
||||
self.explain_scan_value(sql,"last_row")
|
||||
sql = f"explain select last_row(*) from {dbname}.stable_1 "
|
||||
self.explain_scan_value(sql,"last_value")
|
||||
sql = f"explain select last(*),last_row(*) from {dbname}.stable_1 "
|
||||
self.explain_scan_value(sql,"last_row_1")
|
||||
sql = f"explain select last(*),last(*) from {dbname}.stable_1 "
|
||||
self.explain_scan_value(sql,"last_row")
|
||||
sql = f"explain select last_row(*),last_row(*) from {dbname}.stable_1 "
|
||||
self.explain_scan_value(sql,"last_value")
|
||||
|
||||
sql = f"explain select last(q_int)+1 from {dbname}.stable_1 "
|
||||
self.explain_scan_value(sql,"last_row")
|
||||
sql = f"explain select last_row(q_int)+1 from {dbname}.stable_1 "
|
||||
self.explain_scan_value(sql,"last_value")
|
||||
sql = f"explain select last(q_int)+1,last_row(q_int)+1 from {dbname}.stable_1 "
|
||||
self.explain_scan_value(sql,"last_row_1")
|
||||
sql = f"explain select last(q_int)+1,last(q_int)+1 from {dbname}.stable_1 "
|
||||
self.explain_scan_value(sql,"last_row")
|
||||
sql = f"explain select last_row(q_int)+1,last_row(q_int)+1 from {dbname}.stable_1 "
|
||||
self.explain_scan_value(sql,"last_value")
|
||||
|
||||
def cachemodel_both(self, dbname="nested"):
|
||||
|
||||
sql = f"explain select last(*) from {dbname}.stable_1 "
|
||||
self.explain_scan_value(sql,"both")
|
||||
sql = f"explain select last_row(*) from {dbname}.stable_1 "
|
||||
self.explain_scan_value(sql,"both")
|
||||
sql = f"explain select last(*),last_row(*) from {dbname}.stable_1 "
|
||||
self.explain_scan_value(sql,"both")
|
||||
sql = f"explain select last(*),last(*) from {dbname}.stable_1 "
|
||||
self.explain_scan_value(sql,"both")
|
||||
sql = f"explain select last_row(*),last_row(*) from {dbname}.stable_1 "
|
||||
self.explain_scan_value(sql,"both")
|
||||
|
||||
sql = f"explain select last(*) from {dbname}.stable_1 group by tbname"
|
||||
self.explain_scan_value(sql,"both")
|
||||
sql = f"explain select last_row(*) from {dbname}.stable_1 group by tbname"
|
||||
self.explain_scan_value(sql,"both")
|
||||
sql = f"explain select last(*),last_row(*) from {dbname}.stable_1 group by tbname"
|
||||
self.explain_scan_value(sql,"both")
|
||||
sql = f"explain select last(*),last(*) from {dbname}.stable_1 group by tbname"
|
||||
self.explain_scan_value(sql,"both")
|
||||
sql = f"explain select last_row(*),last_row(*) from {dbname}.stable_1 group by tbname"
|
||||
self.explain_scan_value(sql,"both")
|
||||
|
||||
sql = f"explain select last(*) from {dbname}.stable_1 partition by tbname"
|
||||
self.explain_scan_value(sql,"both")
|
||||
sql = f"explain select last_row(*) from {dbname}.stable_1 partition by tbname"
|
||||
self.explain_scan_value(sql,"both")
|
||||
sql = f"explain select last(*),last_row(*) from {dbname}.stable_1 partition by tbname"
|
||||
self.explain_scan_value(sql,"both")
|
||||
sql = f"explain select last(*),last(*) from {dbname}.stable_1 partition by tbname"
|
||||
self.explain_scan_value(sql,"both")
|
||||
sql = f"explain select last_row(*),last_row(*) from {dbname}.stable_1 partition by tbname"
|
||||
self.explain_scan_value(sql,"both")
|
||||
|
||||
def modify_tables(self):
|
||||
fake = Faker('zh_CN')
|
||||
tdSql.execute('delete from stable_1_3;')
|
||||
tdSql.execute('delete from stable_1_4;')
|
||||
tdSql.execute('''create table stable_1_5 using stable_1 tags('stable_1_5', '%d' , '%d', '%d' , '%d' , 1 , 'binary6.%s' , 'nchar6.%s' , '%f', '%f' ,'%d') ;'''
|
||||
%(fake.random_int(min=-2147483647, max=2147483647, step=1), fake.random_int(min=-9223372036854775807, max=9223372036854775807, step=1),
|
||||
fake.random_int(min=-32767, max=32767, step=1) , fake.random_int(min=-127, max=127, step=1) ,
|
||||
fake.pystr() ,fake.pystr() ,fake.pyfloat(),fake.pyfloat(),fake.random_int(min=-2147483647, max=2147483647, step=1)))
|
||||
tdSql.execute('''create table stable_1_6 using stable_1 tags('stable_1_6', '%d' , '%d', '%d' , '%d' , 1 , 'binary6.%s' , 'nchar6.%s' , '%f', '%f' ,'%d') ;'''
|
||||
%(fake.random_int(min=-2147483647, max=2147483647, step=1), fake.random_int(min=-9223372036854775807, max=9223372036854775807, step=1),
|
||||
fake.random_int(min=-32767, max=32767, step=1) , fake.random_int(min=-127, max=127, step=1) ,
|
||||
fake.pystr() ,fake.pystr() ,fake.pyfloat(),fake.pyfloat(),fake.random_int(min=-2147483647, max=2147483647, step=1)))
|
||||
tdSql.execute('''create table stable_1_7 using stable_1 tags('stable_1_7', '%d' , '%d', '%d' , '%d' , 1 , 'binary6.%s' , 'nchar6.%s' , '%f', '%f' ,'%d') ;'''
|
||||
%(fake.random_int(min=-2147483647, max=2147483647, step=1), fake.random_int(min=-9223372036854775807, max=9223372036854775807, step=1),
|
||||
fake.random_int(min=-32767, max=32767, step=1) , fake.random_int(min=-127, max=127, step=1) ,
|
||||
fake.pystr() ,fake.pystr() ,fake.pyfloat(),fake.pyfloat(),fake.random_int(min=-2147483647, max=2147483647, step=1)))
|
||||
tdSql.execute('''create table stable_1_8 using stable_1 tags('stable_1_8', '%d' , '%d', '%d' , '%d' , 1 , 'binary6.%s' , 'nchar6.%s' , '%f', '%f' ,'%d') ;'''
|
||||
%(fake.random_int(min=-2147483647, max=2147483647, step=1), fake.random_int(min=-9223372036854775807, max=9223372036854775807, step=1),
|
||||
fake.random_int(min=-32767, max=32767, step=1) , fake.random_int(min=-127, max=127, step=1) ,
|
||||
fake.pystr() ,fake.pystr() ,fake.pyfloat(),fake.pyfloat(),fake.random_int(min=-2147483647, max=2147483647, step=1)))
|
||||
tdSql.execute('''create table stable_1_9 using stable_1 tags('stable_1_9', '%d' , '%d', '%d' , '%d' , 1 , 'binary6.%s' , 'nchar6.%s' , '%f', '%f' ,'%d') ;'''
|
||||
%(fake.random_int(min=-2147483647, max=2147483647, step=1), fake.random_int(min=-9223372036854775807, max=9223372036854775807, step=1),
|
||||
fake.random_int(min=-32767, max=32767, step=1) , fake.random_int(min=-127, max=127, step=1) ,
|
||||
fake.pystr() ,fake.pystr() ,fake.pyfloat(),fake.pyfloat(),fake.random_int(min=-2147483647, max=2147483647, step=1)))
|
||||
tdSql.execute('''create table stable_1_90 using stable_1 tags('stable_1_90', '%d' , '%d', '%d' , '%d' , 1 , 'binary6.%s' , 'nchar6.%s' , '%f', '%f' ,'%d') ;'''
|
||||
%(fake.random_int(min=-2147483647, max=2147483647, step=1), fake.random_int(min=-9223372036854775807, max=9223372036854775807, step=1),
|
||||
fake.random_int(min=-32767, max=32767, step=1) , fake.random_int(min=-127, max=127, step=1) ,
|
||||
fake.pystr() ,fake.pystr() ,fake.pyfloat(),fake.pyfloat(),fake.random_int(min=-2147483647, max=2147483647, step=1)))
|
||||
tdSql.execute('''create table stable_1_91 using stable_1 tags('stable_1_91', '%d' , '%d', '%d' , '%d' , 1 , 'binary6.%s' , 'nchar6.%s' , '%f', '%f' ,'%d') ;'''
|
||||
%(fake.random_int(min=-2147483647, max=2147483647, step=1), fake.random_int(min=-9223372036854775807, max=9223372036854775807, step=1),
|
||||
fake.random_int(min=-32767, max=32767, step=1) , fake.random_int(min=-127, max=127, step=1) ,
|
||||
fake.pystr() ,fake.pystr() ,fake.pyfloat(),fake.pyfloat(),fake.random_int(min=-2147483647, max=2147483647, step=1)))
|
||||
tdSql.execute('''create table stable_1_92 using stable_1 tags('stable_1_92', '%d' , '%d', '%d' , '%d' , 1 , 'binary6.%s' , 'nchar6.%s' , '%f', '%f' ,'%d') ;'''
|
||||
%(fake.random_int(min=-2147483647, max=2147483647, step=1), fake.random_int(min=-9223372036854775807, max=9223372036854775807, step=1),
|
||||
fake.random_int(min=-32767, max=32767, step=1) , fake.random_int(min=-127, max=127, step=1) ,
|
||||
fake.pystr() ,fake.pystr() ,fake.pyfloat(),fake.pyfloat(),fake.random_int(min=-2147483647, max=2147483647, step=1)))
|
||||
|
||||
tdSql.execute('alter stable stable_1 add tag t_int_null INT;')
|
||||
tdSql.execute('alter stable stable_1 add tag t_bigint_null BIGINT;')
|
||||
tdSql.execute('alter stable stable_1 add tag t_smallint_null SMALLINT;')
|
||||
tdSql.execute('alter stable stable_1 add tag t_tinyint_null TINYINT;')
|
||||
tdSql.execute('alter stable stable_1 add tag t_bool_null BOOL;')
|
||||
tdSql.execute('alter stable stable_1 add tag t_binary_null VARCHAR(100);')
|
||||
tdSql.execute('alter stable stable_1 add tag t_nchar_null NCHAR(100);')
|
||||
tdSql.execute('alter stable stable_1 add tag t_float_null FLOAT;')
|
||||
tdSql.execute('alter stable stable_1 add tag t_double_null DOUBLE;')
|
||||
tdSql.execute('alter stable stable_1 add tag t_ts_null TIMESTAMP;')
|
||||
|
||||
tdSql.execute('alter stable stable_1 drop column q_nchar8;')
|
||||
tdSql.execute('alter stable stable_1 drop column q_binary8;')
|
||||
tdSql.execute('alter stable stable_1 drop column q_nchar7;')
|
||||
tdSql.execute('alter stable stable_1 drop column q_binary7;')
|
||||
tdSql.execute('alter stable stable_1 drop column q_nchar6;')
|
||||
tdSql.execute('alter stable stable_1 drop column q_binary6;')
|
||||
tdSql.execute('alter stable stable_1 drop column q_nchar5;')
|
||||
tdSql.execute('alter stable stable_1 drop column q_binary5;')
|
||||
tdSql.execute('alter stable stable_1 drop column q_nchar4;')
|
||||
tdSql.execute('alter stable stable_1 drop column q_binary4;')
|
||||
|
||||
def run(self):
|
||||
tdSql.prepare()
|
||||
|
||||
startTime = time.time()
|
||||
|
||||
self.dropandcreateDB_random("nested", 1)
|
||||
self.modify_tables()
|
||||
|
||||
for i in range(2):
|
||||
self.cachemodel_none()
|
||||
tdSql.query("alter database nested cachemodel 'last_row' ")
|
||||
tdSql.query("reset query cache;")
|
||||
self.cachemodel_last_row()
|
||||
tdSql.query("alter database nested cachemodel 'last_value' ")
|
||||
tdSql.query("reset query cache;")
|
||||
self.cachemodel_last_value()
|
||||
tdSql.query("alter database nested cachemodel 'both' ")
|
||||
tdSql.query("reset query cache;")
|
||||
self.cachemodel_both()
|
||||
tdSql.query("alter database nested cachemodel 'none' ")
|
||||
tdSql.query("reset query cache;")
|
||||
|
||||
|
||||
endTime = time.time()
|
||||
print("total time %ds" % (endTime - startTime))
|
||||
|
||||
|
||||
|
||||
|
||||
def stop(self):
|
||||
tdSql.close()
|
||||
tdLog.success("%s successfully executed" % __file__)
|
||||
|
||||
|
||||
tdCases.addWindows(__file__, TDTestCase())
|
||||
tdCases.addLinux(__file__, TDTestCase())
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,52 @@
|
|||
###################################################################
|
||||
# Copyright (c) 2016 by TAOS Technologies, Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# This file is proprietary and confidential to TAOS Technologies.
|
||||
# No part of this file may be reproduced, stored, transmitted,
|
||||
# disclosed or used in any form or by any means other than as
|
||||
# expressly provided by the written permission from Jianhui Tao
|
||||
#
|
||||
###################################################################
|
||||
|
||||
# -*- coding: utf-8 -*-
|
||||
from util.cases import tdCases
|
||||
from .primary_ts_base import *
|
||||
from faker import Faker
|
||||
import random
|
||||
|
||||
class TDTestCase(TDTestCase):
|
||||
|
||||
def run(self):
|
||||
startTime = time.time()
|
||||
self.dropandcreateDB_primary_key(self.database, 1 , 1 ,'yes','yes','no')
|
||||
|
||||
self.fun_pk_interp(self.database,'interp','')
|
||||
self.multiple_agg_groupby(self.database,1)
|
||||
self.fun_pk_diff(self.database,'diff','')
|
||||
self.fun_pk_twa(self.database,'derivative',',1s,0')
|
||||
self.fun_pk_twa(self.database,'derivative',',1s,1')
|
||||
self.fun_pk_unique(self.database,'unique','')
|
||||
# self.fun_pk_last_init(self.database,'last','')
|
||||
# self.fun_pk_last(self.database,'last','')
|
||||
# self.fun_pk_last(self.database,'last_row','')
|
||||
# self.fun_pk_first(self.database,'first','')
|
||||
|
||||
# self.query_pk_fun(self.database,'')
|
||||
|
||||
# self.touying_pk_1(self.database,1)
|
||||
# self.touying_pk_where(self.database,'')
|
||||
# self.touying_pk_where(self.database,'tags')
|
||||
# self.touying_pk_where(self.database,'distinct')
|
||||
# self.count_pk(self.database,1)
|
||||
|
||||
endTime = time.time()
|
||||
print("total time %ds" % (endTime - startTime))
|
||||
|
||||
def stop(self):
|
||||
tdSql.close()
|
||||
tdLog.success("%s successfully executed" % __file__)
|
||||
|
||||
|
||||
tdCases.addWindows(__file__, TDTestCase())
|
||||
tdCases.addLinux(__file__, TDTestCase())
|
|
@ -0,0 +1,52 @@
|
|||
###################################################################
|
||||
# Copyright (c) 2016 by TAOS Technologies, Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# This file is proprietary and confidential to TAOS Technologies.
|
||||
# No part of this file may be reproduced, stored, transmitted,
|
||||
# disclosed or used in any form or by any means other than as
|
||||
# expressly provided by the written permission from Jianhui Tao
|
||||
#
|
||||
###################################################################
|
||||
|
||||
# -*- coding: utf-8 -*-
|
||||
from util.cases import tdCases
|
||||
from .primary_ts_base import *
|
||||
from faker import Faker
|
||||
import random
|
||||
|
||||
class TDTestCase(TDTestCase):
|
||||
|
||||
def run(self):
|
||||
startTime = time.time()
|
||||
self.dropandcreateDB_primary_key(self.database, 1 , 1 ,'yes','yes','no')
|
||||
|
||||
# self.fun_pk_interp(self.database,'interp','')
|
||||
# self.multiple_agg_groupby(self.database,1)
|
||||
# self.fun_pk_diff(self.database,'diff','')
|
||||
# self.fun_pk_twa(self.database,'derivative',',1s,0')
|
||||
# self.fun_pk_twa(self.database,'derivative',',1s,1')
|
||||
# self.fun_pk_unique(self.database,'unique','')
|
||||
self.fun_pk_last_init(self.database,'last','')
|
||||
self.fun_pk_last(self.database,'last','')
|
||||
self.fun_pk_last(self.database,'last_row','')
|
||||
self.fun_pk_first(self.database,'first','')
|
||||
|
||||
self.query_pk_fun(self.database,'')
|
||||
|
||||
# self.touying_pk_1(self.database,1)
|
||||
# self.touying_pk_where(self.database,'')
|
||||
# self.touying_pk_where(self.database,'tags')
|
||||
# self.touying_pk_where(self.database,'distinct')
|
||||
# self.count_pk(self.database,1)
|
||||
|
||||
endTime = time.time()
|
||||
print("total time %ds" % (endTime - startTime))
|
||||
|
||||
def stop(self):
|
||||
tdSql.close()
|
||||
tdLog.success("%s successfully executed" % __file__)
|
||||
|
||||
|
||||
tdCases.addWindows(__file__, TDTestCase())
|
||||
tdCases.addLinux(__file__, TDTestCase())
|
|
@ -0,0 +1,52 @@
|
|||
###################################################################
|
||||
# Copyright (c) 2016 by TAOS Technologies, Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# This file is proprietary and confidential to TAOS Technologies.
|
||||
# No part of this file may be reproduced, stored, transmitted,
|
||||
# disclosed or used in any form or by any means other than as
|
||||
# expressly provided by the written permission from Jianhui Tao
|
||||
#
|
||||
###################################################################
|
||||
|
||||
# -*- coding: utf-8 -*-
|
||||
from util.cases import tdCases
|
||||
from .primary_ts_base import *
|
||||
from faker import Faker
|
||||
import random
|
||||
|
||||
class TDTestCase(TDTestCase):
|
||||
|
||||
def run(self):
|
||||
startTime = time.time()
|
||||
self.dropandcreateDB_primary_key(self.database, 1 , 1 ,'yes','yes','no')
|
||||
|
||||
# self.fun_pk_interp(self.database,'interp','')
|
||||
# self.multiple_agg_groupby(self.database,1)
|
||||
# self.fun_pk_diff(self.database,'diff','')
|
||||
# self.fun_pk_twa(self.database,'derivative',',1s,0')
|
||||
# self.fun_pk_twa(self.database,'derivative',',1s,1')
|
||||
# self.fun_pk_unique(self.database,'unique','')
|
||||
# self.fun_pk_last_init(self.database,'last','')
|
||||
# self.fun_pk_last(self.database,'last','')
|
||||
# self.fun_pk_last(self.database,'last_row','')
|
||||
# self.fun_pk_first(self.database,'first','')
|
||||
|
||||
# self.query_pk_fun(self.database,'')
|
||||
|
||||
self.touying_pk_1(self.database,1)
|
||||
self.touying_pk_where(self.database,'')
|
||||
# self.touying_pk_where(self.database,'tags')
|
||||
# self.touying_pk_where(self.database,'distinct')
|
||||
# self.count_pk(self.database,1)
|
||||
|
||||
endTime = time.time()
|
||||
print("total time %ds" % (endTime - startTime))
|
||||
|
||||
def stop(self):
|
||||
tdSql.close()
|
||||
tdLog.success("%s successfully executed" % __file__)
|
||||
|
||||
|
||||
tdCases.addWindows(__file__, TDTestCase())
|
||||
tdCases.addLinux(__file__, TDTestCase())
|
|
@ -0,0 +1,52 @@
|
|||
###################################################################
|
||||
# Copyright (c) 2016 by TAOS Technologies, Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# This file is proprietary and confidential to TAOS Technologies.
|
||||
# No part of this file may be reproduced, stored, transmitted,
|
||||
# disclosed or used in any form or by any means other than as
|
||||
# expressly provided by the written permission from Jianhui Tao
|
||||
#
|
||||
###################################################################
|
||||
|
||||
# -*- coding: utf-8 -*-
|
||||
from util.cases import tdCases
|
||||
from .primary_ts_base import *
|
||||
from faker import Faker
|
||||
import random
|
||||
|
||||
class TDTestCase(TDTestCase):
|
||||
|
||||
def run(self):
|
||||
startTime = time.time()
|
||||
self.dropandcreateDB_primary_key(self.database, 1 , 1 ,'yes','yes','no')
|
||||
|
||||
# self.fun_pk_interp(self.database,'interp','')
|
||||
# self.multiple_agg_groupby(self.database,1)
|
||||
# self.fun_pk_diff(self.database,'diff','')
|
||||
# self.fun_pk_twa(self.database,'derivative',',1s,0')
|
||||
# self.fun_pk_twa(self.database,'derivative',',1s,1')
|
||||
# self.fun_pk_unique(self.database,'unique','')
|
||||
# self.fun_pk_last_init(self.database,'last','')
|
||||
# self.fun_pk_last(self.database,'last','')
|
||||
# self.fun_pk_last(self.database,'last_row','')
|
||||
# self.fun_pk_first(self.database,'first','')
|
||||
|
||||
# self.query_pk_fun(self.database,'')
|
||||
|
||||
# self.touying_pk_1(self.database,1)
|
||||
# self.touying_pk_where(self.database,'')
|
||||
self.touying_pk_where(self.database,'tags')
|
||||
self.touying_pk_where(self.database,'distinct')
|
||||
self.count_pk(self.database,1)
|
||||
|
||||
endTime = time.time()
|
||||
print("total time %ds" % (endTime - startTime))
|
||||
|
||||
def stop(self):
|
||||
tdSql.close()
|
||||
tdLog.success("%s successfully executed" % __file__)
|
||||
|
||||
|
||||
tdCases.addWindows(__file__, TDTestCase())
|
||||
tdCases.addLinux(__file__, TDTestCase())
|
|
@ -488,6 +488,8 @@ int32_t shellReadCommand(char *command) {
|
|||
c = taosGetConsoleChar();
|
||||
|
||||
if (c == (char)EOF) {
|
||||
taosMemoryFreeClear(cmd.buffer);
|
||||
taosMemoryFreeClear(cmd.command);
|
||||
return c;
|
||||
}
|
||||
|
||||
|
@ -524,6 +526,8 @@ int32_t shellReadCommand(char *command) {
|
|||
case 4: // EOF or Ctrl+D
|
||||
taosResetTerminalMode();
|
||||
printf("\r\n");
|
||||
taosMemoryFreeClear(cmd.buffer);
|
||||
taosMemoryFreeClear(cmd.command);
|
||||
return -1;
|
||||
case 5: // ctrl E
|
||||
shellPositionCursorEnd(&cmd);
|
||||
|
|
Loading…
Reference in New Issue