Merge branch 'feature/qnode' of github.com:taosdata/TDengine into feature/qnode
This commit is contained in:
commit
cd9038f92c
|
@ -1464,35 +1464,6 @@ SELECT ROUND(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
- 该函数适用于内层查询和外层查询。
|
- 该函数适用于内层查询和外层查询。
|
||||||
- 版本2.6.0.x后支持
|
- 版本2.6.0.x后支持
|
||||||
|
|
||||||
### 四则运算
|
|
||||||
|
|
||||||
```
|
|
||||||
SELECT field_name [+|-|*|/|%][Value|field_name] FROM { tb_name | stb_name } [WHERE clause];
|
|
||||||
```
|
|
||||||
|
|
||||||
**功能说明**:统计表/超级表中某列或多列间的值加、减、乘、除、取余计算结果。
|
|
||||||
|
|
||||||
**返回数据类型**:双精度浮点数。
|
|
||||||
|
|
||||||
**应用字段**:不能应用在 timestamp、binary、nchar、bool 类型字段。
|
|
||||||
|
|
||||||
**适用于**:表、超级表。
|
|
||||||
|
|
||||||
**使用说明**:
|
|
||||||
|
|
||||||
- 支持两列或多列之间进行计算,可使用括号控制计算优先级;
|
|
||||||
- NULL 字段不参与计算,如果参与计算的某行中包含 NULL,该行的计算结果为 NULL。
|
|
||||||
|
|
||||||
```
|
|
||||||
taos> SELECT current + voltage * phase FROM d1001;
|
|
||||||
(current+(voltage*phase)) |
|
|
||||||
============================
|
|
||||||
78.190000713 |
|
|
||||||
84.540003240 |
|
|
||||||
80.810000718 |
|
|
||||||
Query OK, 3 row(s) in set (0.001046s)
|
|
||||||
```
|
|
||||||
|
|
||||||
### STATECOUNT
|
### STATECOUNT
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
|
@ -0,0 +1,71 @@
|
||||||
|
---
|
||||||
|
sidebar_label: 运算符
|
||||||
|
title: 运算符
|
||||||
|
---
|
||||||
|
|
||||||
|
## 算术运算符
|
||||||
|
|
||||||
|
| # | **运算符** | **支持的类型** | **说明** |
|
||||||
|
| --- | :--------: | -------------- | -------------------------- |
|
||||||
|
| 1 | +, - | 数值类型 | 表达正数和负数,一元运算符 |
|
||||||
|
| 2 | +, - | 数值类型 | 表示加法和减法,二元运算符 |
|
||||||
|
| 3 | \*, / | 数值类型 | 表示乘法和除法,二元运算符 |
|
||||||
|
| 4 | % | 数值类型 | 表示取余运算,二元运算符 |
|
||||||
|
|
||||||
|
## 位运算符
|
||||||
|
|
||||||
|
| # | **运算符** | **支持的类型** | **说明** |
|
||||||
|
| --- | :--------: | -------------- | ------------------ |
|
||||||
|
| 1 | & | 数值类型 | 按位与,二元运算符 |
|
||||||
|
| 2 | \| | 数值类型 | 按位或,二元运算符 |
|
||||||
|
|
||||||
|
## JSON 运算符
|
||||||
|
|
||||||
|
`->` 运算符可以对 JSON 类型的列按键取值。->左侧是列标识符,右侧是键的字符串常量,如 col->'name',返回键'name'的值。
|
||||||
|
|
||||||
|
## 集合运算符
|
||||||
|
|
||||||
|
集合运算符将两个查询的结果合并为一个结果。包含集合运算符的查询称之为复合查询。复合查询中每条查询的选择列表中的相应表达式在数量上必须匹配,并且必须位于同一数据类型组中(如数值类型或字符串类型)。
|
||||||
|
|
||||||
|
- 对于字符串类型数据,返回值的数据类型按如下方式确定:
|
||||||
|
- 如果具有相同的类型(都为 BINARY 或都为 NCHAR),则返回此类型,并以较大的长度作为返回值长度。
|
||||||
|
- 如果具有不同的类型,则返回 BINARY 类型,并以较大的长度(NCHAR 类型长度按四倍计算)作为返回值长度。
|
||||||
|
- 对于数值类型数据,返回值的数据类型是数字表达范围较大的那个。
|
||||||
|
|
||||||
|
TDengine 支持 `UNION ALL` 操作符。UNION ALL 将查询返回的结果集合并返回,并不去重。在同一个 SQL 语句中,UNION ALL 最多支持 100 个。
|
||||||
|
|
||||||
|
## 比较运算符
|
||||||
|
|
||||||
|
| # | **运算符** | **支持的类型** | **说明** |
|
||||||
|
| --- | :---------------: | -------------------------------------------------------------------- | -------------------- |
|
||||||
|
| 1 | = | 除 BLOB、MEDIUMBLOB 和 JSON 外的所有类型 | 相等 |
|
||||||
|
| 2 | <\>, != | 除 BLOB、MEDIUMBLOB 和 JSON 外的所有类型,且不可以为表的时间戳主键列 | 不相等 |
|
||||||
|
| 3 | \>, \< | 除 BLOB、MEDIUMBLOB 和 JSON 外的所有类型 | 大于,小于 |
|
||||||
|
| 4 | \>=, \<= | 除 BLOB、MEDIUMBLOB 和 JSON 外的所有类型 | 大于等于,小于等于 |
|
||||||
|
| 5 | IS [NOT] NULL | 所有类型 | 是否为空值 |
|
||||||
|
| 6 | [NOT] BETWEEN AND | 除 BOOL、BLOB、MEDIUMBLOB 和 JSON 外的所有类型 | 闭区间比较 |
|
||||||
|
| 7 | IN | 除 BLOB、MEDIUMBLOB 和 JSON 外的所有类型,且不可以为表的时间戳主键列 | 与列表内的任意值相等 |
|
||||||
|
| 8 | LIKE | BINARY、NCHAR 和 VARCHAR | 通配符匹配 |
|
||||||
|
| 9 | MATCH, NMATCH | BINARY、NCHAR 和 VARCHAR | 正则表达式匹配 |
|
||||||
|
| 10 | CONTAINS | JSON | JSON 中是否存在某键 |
|
||||||
|
|
||||||
|
LIKE 条件使用通配符字符串进行匹配检查,规则如下:
|
||||||
|
|
||||||
|
- '%'(百分号)匹配 0 到任意个字符;'\_'(下划线)匹配单个任意 ASCII 字符。
|
||||||
|
- 如果希望匹配字符串中原本就带有的 \_(下划线)字符,那么可以在通配符字符串中写作 \_,即加一个反斜线来进行转义。
|
||||||
|
- 通配符字符串最长不能超过 100 字节。不建议使用太长的通配符字符串,否则将有可能严重影响 LIKE 操作的执行性能。
|
||||||
|
|
||||||
|
MATCH 条件和 NMATCH 条件使用正则表达式进行匹配,规则如下:
|
||||||
|
|
||||||
|
- 支持符合 POSIX 规范的正则表达式,具体规范内容可参见 Regular Expressions。
|
||||||
|
- 只能针对子表名(即 tbname)、字符串类型的标签值进行正则表达式过滤,不支持普通列的过滤。
|
||||||
|
- 正则匹配字符串长度不能超过 128 字节。可以通过参数 maxRegexStringLen 设置和调整最大允许的正则匹配字符串,该参数是客户端配置参数,需要重启客户端才能生效
|
||||||
|
|
||||||
|
## 逻辑运算符
|
||||||
|
|
||||||
|
| # | **运算符** | **支持的类型** | **说明** |
|
||||||
|
| --- | :--------: | -------------- | --------------------------------------------------------------------------- |
|
||||||
|
| 1 | AND | BOOL | 逻辑与,如果两个条件均为 TRUE, 则返回 TRUE。如果任一为 FALSE,则返回 FALSE |
|
||||||
|
| 2 | OR | BOOL | 逻辑或,如果任一条件为 TRUE, 则返回 TRUE。如果两者都是 FALSE,则返回 FALSE |
|
||||||
|
|
||||||
|
TDengine 在计算逻辑条件时,会进行短路径优化,即对于 AND,第一个条件为 FALSE,则不再计算第二个条件,直接返回 FALSE;对于 OR,第一个条件为 TRUE,则不再计算第二个条件,直接返回 TRUE。
|
|
@ -254,6 +254,7 @@ typedef enum ELogicConditionType {
|
||||||
#define TSDB_TRANS_STAGE_LEN 12
|
#define TSDB_TRANS_STAGE_LEN 12
|
||||||
#define TSDB_TRANS_TYPE_LEN 16
|
#define TSDB_TRANS_TYPE_LEN 16
|
||||||
#define TSDB_TRANS_ERROR_LEN 64
|
#define TSDB_TRANS_ERROR_LEN 64
|
||||||
|
#define TSDB_TRANS_DESC_LEN 128
|
||||||
|
|
||||||
#define TSDB_STEP_NAME_LEN 32
|
#define TSDB_STEP_NAME_LEN 32
|
||||||
#define TSDB_STEP_DESC_LEN 128
|
#define TSDB_STEP_DESC_LEN 128
|
||||||
|
|
|
@ -130,7 +130,7 @@ static void dmProcessRpcMsg(SDnode *pDnode, SRpcMsg *pRpc, SEpSet *pEpSet) {
|
||||||
|
|
||||||
_OVER:
|
_OVER:
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
dError("msg:%s, failed to process since %s", TMSG_INFO(pRpc->msgType), terrstr());
|
dTrace("msg:%p, failed to process since %s, type:%s", pMsg, terrstr(), TMSG_INFO(pRpc->msgType));
|
||||||
if (terrno != 0) code = terrno;
|
if (terrno != 0) code = terrno;
|
||||||
|
|
||||||
if (IsReq(pRpc)) {
|
if (IsReq(pRpc)) {
|
||||||
|
|
|
@ -60,14 +60,12 @@ typedef enum {
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
TRN_STAGE_PREPARE = 0,
|
TRN_STAGE_PREPARE = 0,
|
||||||
TRN_STAGE_REDO_LOG = 1,
|
TRN_STAGE_REDO_ACTION = 1,
|
||||||
TRN_STAGE_REDO_ACTION = 2,
|
TRN_STAGE_ROLLBACK = 2,
|
||||||
TRN_STAGE_ROLLBACK = 3,
|
TRN_STAGE_UNDO_ACTION = 3,
|
||||||
TRN_STAGE_UNDO_ACTION = 4,
|
TRN_STAGE_COMMIT = 4,
|
||||||
TRN_STAGE_UNDO_LOG = 5,
|
TRN_STAGE_COMMIT_ACTION = 5,
|
||||||
TRN_STAGE_COMMIT = 6,
|
TRN_STAGE_FINISHED = 6
|
||||||
TRN_STAGE_COMMIT_LOG = 7,
|
|
||||||
TRN_STAGE_FINISHED = 8
|
|
||||||
} ETrnStage;
|
} ETrnStage;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
@ -131,7 +129,7 @@ typedef enum {
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
TRN_EXEC_PARALLEL = 0,
|
TRN_EXEC_PARALLEL = 0,
|
||||||
TRN_EXEC_ONE_BY_ONE = 1,
|
TRN_EXEC_NO_PARALLEL = 1,
|
||||||
} ETrnExecType;
|
} ETrnExecType;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
@ -168,16 +166,16 @@ typedef struct {
|
||||||
SRpcHandleInfo rpcInfo;
|
SRpcHandleInfo rpcInfo;
|
||||||
void* rpcRsp;
|
void* rpcRsp;
|
||||||
int32_t rpcRspLen;
|
int32_t rpcRspLen;
|
||||||
SArray* redoLogs;
|
int32_t redoActionPos;
|
||||||
SArray* undoLogs;
|
|
||||||
SArray* commitLogs;
|
|
||||||
SArray* redoActions;
|
SArray* redoActions;
|
||||||
SArray* undoActions;
|
SArray* undoActions;
|
||||||
|
SArray* commitActions;
|
||||||
int64_t createdTime;
|
int64_t createdTime;
|
||||||
int64_t lastExecTime;
|
int64_t lastExecTime;
|
||||||
int64_t dbUid;
|
int64_t dbUid;
|
||||||
char dbname[TSDB_DB_FNAME_LEN];
|
char dbname[TSDB_DB_FNAME_LEN];
|
||||||
char lastError[TSDB_TRANS_ERROR_LEN];
|
char lastError[TSDB_TRANS_ERROR_LEN];
|
||||||
|
char desc[TSDB_TRANS_DESC_LEN];
|
||||||
int32_t startFunc;
|
int32_t startFunc;
|
||||||
int32_t stopFunc;
|
int32_t stopFunc;
|
||||||
int32_t paramLen;
|
int32_t paramLen;
|
||||||
|
|
|
@ -26,31 +26,24 @@ typedef enum {
|
||||||
TRANS_START_FUNC_TEST = 1,
|
TRANS_START_FUNC_TEST = 1,
|
||||||
TRANS_STOP_FUNC_TEST = 2,
|
TRANS_STOP_FUNC_TEST = 2,
|
||||||
TRANS_START_FUNC_MQ_REB = 3,
|
TRANS_START_FUNC_MQ_REB = 3,
|
||||||
TRANS_STOP_FUNC_TEST_MQ_REB = 4,
|
TRANS_STOP_FUNC_MQ_REB = 4,
|
||||||
} ETrnFunc;
|
} ETrnFunc;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
SEpSet epSet;
|
int32_t id;
|
||||||
tmsg_t msgType;
|
|
||||||
int8_t msgSent;
|
|
||||||
int8_t msgReceived;
|
|
||||||
int32_t errCode;
|
int32_t errCode;
|
||||||
int32_t acceptableCode;
|
int32_t acceptableCode;
|
||||||
|
int8_t stage;
|
||||||
|
int8_t isRaw;
|
||||||
|
int8_t rawWritten;
|
||||||
|
int8_t msgSent;
|
||||||
|
int8_t msgReceived;
|
||||||
|
tmsg_t msgType;
|
||||||
|
SEpSet epSet;
|
||||||
int32_t contLen;
|
int32_t contLen;
|
||||||
void *pCont;
|
void *pCont;
|
||||||
} STransAction;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
SSdbRaw *pRaw;
|
SSdbRaw *pRaw;
|
||||||
} STransLog;
|
} STransAction;
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
ETrnStep stepType;
|
|
||||||
STransAction redoAction;
|
|
||||||
STransAction undoAction;
|
|
||||||
STransLog redoLog;
|
|
||||||
STransLog undoLog;
|
|
||||||
} STransStep;
|
|
||||||
|
|
||||||
typedef void (*TransCbFp)(SMnode *pMnode, void *param, int32_t paramLen);
|
typedef void (*TransCbFp)(SMnode *pMnode, void *param, int32_t paramLen);
|
||||||
|
|
||||||
|
@ -69,7 +62,7 @@ int32_t mndTransAppendUndoAction(STrans *pTrans, STransAction *pAction);
|
||||||
void mndTransSetRpcRsp(STrans *pTrans, void *pCont, int32_t contLen);
|
void mndTransSetRpcRsp(STrans *pTrans, void *pCont, int32_t contLen);
|
||||||
void mndTransSetCb(STrans *pTrans, ETrnFunc startFunc, ETrnFunc stopFunc, void *param, int32_t paramLen);
|
void mndTransSetCb(STrans *pTrans, ETrnFunc startFunc, ETrnFunc stopFunc, void *param, int32_t paramLen);
|
||||||
void mndTransSetDbInfo(STrans *pTrans, SDbObj *pDb);
|
void mndTransSetDbInfo(STrans *pTrans, SDbObj *pDb);
|
||||||
void mndTransSetExecOneByOne(STrans *pTrans);
|
void mndTransSetNoParallel(STrans *pTrans);
|
||||||
|
|
||||||
int32_t mndTransPrepare(SMnode *pMnode, STrans *pTrans);
|
int32_t mndTransPrepare(SMnode *pMnode, STrans *pTrans);
|
||||||
void mndTransProcessRsp(SRpcMsg *pRsp);
|
void mndTransProcessRsp(SRpcMsg *pRsp);
|
||||||
|
|
|
@ -78,10 +78,8 @@ static int32_t mndCreateDefaultAcct(SMnode *pMnode) {
|
||||||
if (pRaw == NULL) return -1;
|
if (pRaw == NULL) return -1;
|
||||||
sdbSetRawStatus(pRaw, SDB_STATUS_READY);
|
sdbSetRawStatus(pRaw, SDB_STATUS_READY);
|
||||||
|
|
||||||
mDebug("acct:%s, will be created while deploy sdb, raw:%p", acctObj.acct, pRaw);
|
mDebug("acct:%s, will be created when deploying, raw:%p", acctObj.acct, pRaw);
|
||||||
#if 0
|
|
||||||
return sdbWrite(pMnode->pSdb, pRaw);
|
|
||||||
#else
|
|
||||||
STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_TYPE_CREATE_ACCT, NULL);
|
STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_TYPE_CREATE_ACCT, NULL);
|
||||||
if (pTrans == NULL) {
|
if (pTrans == NULL) {
|
||||||
mError("acct:%s, failed to create since %s", acctObj.acct, terrstr());
|
mError("acct:%s, failed to create since %s", acctObj.acct, terrstr());
|
||||||
|
@ -94,7 +92,6 @@ static int32_t mndCreateDefaultAcct(SMnode *pMnode) {
|
||||||
mndTransDrop(pTrans);
|
mndTransDrop(pTrans);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
sdbSetRawStatus(pRaw, SDB_STATUS_READY);
|
|
||||||
|
|
||||||
if (mndTransPrepare(pMnode, pTrans) != 0) {
|
if (mndTransPrepare(pMnode, pTrans) != 0) {
|
||||||
mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr());
|
mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr());
|
||||||
|
@ -104,7 +101,6 @@ static int32_t mndCreateDefaultAcct(SMnode *pMnode) {
|
||||||
|
|
||||||
mndTransDrop(pTrans);
|
mndTransDrop(pTrans);
|
||||||
return 0;
|
return 0;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static SSdbRaw *mndAcctActionEncode(SAcctObj *pAcct) {
|
static SSdbRaw *mndAcctActionEncode(SAcctObj *pAcct) {
|
||||||
|
|
|
@ -172,13 +172,13 @@ static int32_t mndCreateDefaultCluster(SMnode *pMnode) {
|
||||||
clusterObj.id = mndGenerateUid(clusterObj.name, TSDB_CLUSTER_ID_LEN);
|
clusterObj.id = mndGenerateUid(clusterObj.name, TSDB_CLUSTER_ID_LEN);
|
||||||
clusterObj.id = (clusterObj.id >= 0 ? clusterObj.id : -clusterObj.id);
|
clusterObj.id = (clusterObj.id >= 0 ? clusterObj.id : -clusterObj.id);
|
||||||
pMnode->clusterId = clusterObj.id;
|
pMnode->clusterId = clusterObj.id;
|
||||||
mDebug("cluster:%" PRId64 ", name is %s", clusterObj.id, clusterObj.name);
|
mInfo("cluster:%" PRId64 ", name is %s", clusterObj.id, clusterObj.name);
|
||||||
|
|
||||||
SSdbRaw *pRaw = mndClusterActionEncode(&clusterObj);
|
SSdbRaw *pRaw = mndClusterActionEncode(&clusterObj);
|
||||||
if (pRaw == NULL) return -1;
|
if (pRaw == NULL) return -1;
|
||||||
sdbSetRawStatus(pRaw, SDB_STATUS_READY);
|
sdbSetRawStatus(pRaw, SDB_STATUS_READY);
|
||||||
|
|
||||||
mDebug("cluster:%" PRId64 ", will be created while deploy sdb, raw:%p", clusterObj.id, pRaw);
|
mDebug("cluster:%" PRId64 ", will be created when deploying, raw:%p", clusterObj.id, pRaw);
|
||||||
#if 0
|
#if 0
|
||||||
return sdbWrite(pMnode->pSdb, pRaw);
|
return sdbWrite(pMnode->pSdb, pRaw);
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -1314,7 +1314,7 @@ int32_t mndValidateDbInfo(SMnode *pMnode, SDbVgVersion *pDbs, int32_t numOfDbs,
|
||||||
|
|
||||||
SDbObj *pDb = mndAcquireDb(pMnode, pDbVgVersion->dbFName);
|
SDbObj *pDb = mndAcquireDb(pMnode, pDbVgVersion->dbFName);
|
||||||
if (pDb == NULL) {
|
if (pDb == NULL) {
|
||||||
mDebug("db:%s, no exist", pDbVgVersion->dbFName);
|
mTrace("db:%s, no exist", pDbVgVersion->dbFName);
|
||||||
memcpy(usedbRsp.db, pDbVgVersion->dbFName, TSDB_DB_FNAME_LEN);
|
memcpy(usedbRsp.db, pDbVgVersion->dbFName, TSDB_DB_FNAME_LEN);
|
||||||
usedbRsp.uid = pDbVgVersion->dbId;
|
usedbRsp.uid = pDbVgVersion->dbId;
|
||||||
usedbRsp.vgVersion = -1;
|
usedbRsp.vgVersion = -1;
|
||||||
|
|
|
@ -99,7 +99,7 @@ static int32_t mndCreateDefaultDnode(SMnode *pMnode) {
|
||||||
if (pRaw == NULL) return -1;
|
if (pRaw == NULL) return -1;
|
||||||
if (sdbSetRawStatus(pRaw, SDB_STATUS_READY) != 0) return -1;
|
if (sdbSetRawStatus(pRaw, SDB_STATUS_READY) != 0) return -1;
|
||||||
|
|
||||||
mDebug("dnode:%d, will be created while deploy sdb, raw:%p", dnodeObj.id, pRaw);
|
mDebug("dnode:%d, will be created when deploying, raw:%p", dnodeObj.id, pRaw);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
return sdbWrite(pMnode->pSdb, pRaw);
|
return sdbWrite(pMnode->pSdb, pRaw);
|
||||||
|
@ -395,9 +395,10 @@ static int32_t mndProcessStatusReq(SRpcMsg *pReq) {
|
||||||
mndReleaseQnode(pMnode, pQnode);
|
mndReleaseQnode(pMnode, pQnode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int64_t dnodeVer = sdbGetTableVer(pMnode->pSdb, SDB_DNODE) + sdbGetTableVer(pMnode->pSdb, SDB_MNODE);
|
||||||
int64_t curMs = taosGetTimestampMs();
|
int64_t curMs = taosGetTimestampMs();
|
||||||
bool online = mndIsDnodeOnline(pMnode, pDnode, curMs);
|
bool online = mndIsDnodeOnline(pMnode, pDnode, curMs);
|
||||||
bool dnodeChanged = (statusReq.dnodeVer != sdbGetTableVer(pMnode->pSdb, SDB_DNODE));
|
bool dnodeChanged = (statusReq.dnodeVer != dnodeVer);
|
||||||
bool reboot = (pDnode->rebootTime != statusReq.rebootTime);
|
bool reboot = (pDnode->rebootTime != statusReq.rebootTime);
|
||||||
bool needCheck = !online || dnodeChanged || reboot;
|
bool needCheck = !online || dnodeChanged || reboot;
|
||||||
|
|
||||||
|
@ -440,7 +441,8 @@ static int32_t mndProcessStatusReq(SRpcMsg *pReq) {
|
||||||
if (!online) {
|
if (!online) {
|
||||||
mInfo("dnode:%d, from offline to online", pDnode->id);
|
mInfo("dnode:%d, from offline to online", pDnode->id);
|
||||||
} else {
|
} else {
|
||||||
mDebug("dnode:%d, send dnode eps", pDnode->id);
|
mDebug("dnode:%d, send dnode epset, online:%d ver:% " PRId64 ":%" PRId64 " reboot:%d", pDnode->id, online,
|
||||||
|
statusReq.dnodeVer, dnodeVer, reboot);
|
||||||
}
|
}
|
||||||
|
|
||||||
pDnode->rebootTime = statusReq.rebootTime;
|
pDnode->rebootTime = statusReq.rebootTime;
|
||||||
|
@ -448,7 +450,7 @@ static int32_t mndProcessStatusReq(SRpcMsg *pReq) {
|
||||||
pDnode->numOfSupportVnodes = statusReq.numOfSupportVnodes;
|
pDnode->numOfSupportVnodes = statusReq.numOfSupportVnodes;
|
||||||
|
|
||||||
SStatusRsp statusRsp = {0};
|
SStatusRsp statusRsp = {0};
|
||||||
statusRsp.dnodeVer = sdbGetTableVer(pMnode->pSdb, SDB_DNODE) + sdbGetTableVer(pMnode->pSdb, SDB_MNODE);
|
statusRsp.dnodeVer = dnodeVer;
|
||||||
statusRsp.dnodeCfg.dnodeId = pDnode->id;
|
statusRsp.dnodeCfg.dnodeId = pDnode->id;
|
||||||
statusRsp.dnodeCfg.clusterId = pMnode->clusterId;
|
statusRsp.dnodeCfg.clusterId = pMnode->clusterId;
|
||||||
statusRsp.pDnodeEps = taosArrayInit(mndGetDnodeSize(pMnode), sizeof(SDnodeEp));
|
statusRsp.pDnodeEps = taosArrayInit(mndGetDnodeSize(pMnode), sizeof(SDnodeEp));
|
||||||
|
|
|
@ -472,7 +472,7 @@ int32_t mndProcessRpcMsg(SRpcMsg *pMsg) {
|
||||||
} else if (code == 0) {
|
} else if (code == 0) {
|
||||||
mTrace("msg:%p, successfully processed and response", pMsg);
|
mTrace("msg:%p, successfully processed and response", pMsg);
|
||||||
} else {
|
} else {
|
||||||
mError("msg:%p, failed to process since %s, app:%p type:%s", pMsg, terrstr(), pMsg->info.ahandle,
|
mDebug("msg:%p, failed to process since %s, app:%p type:%s", pMsg, terrstr(), pMsg->info.ahandle,
|
||||||
TMSG_INFO(pMsg->msgType));
|
TMSG_INFO(pMsg->msgType));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -90,7 +90,7 @@ static int32_t mndCreateDefaultMnode(SMnode *pMnode) {
|
||||||
if (pRaw == NULL) return -1;
|
if (pRaw == NULL) return -1;
|
||||||
sdbSetRawStatus(pRaw, SDB_STATUS_READY);
|
sdbSetRawStatus(pRaw, SDB_STATUS_READY);
|
||||||
|
|
||||||
mDebug("mnode:%d, will be created while deploy sdb, raw:%p", mnodeObj.id, pRaw);
|
mDebug("mnode:%d, will be created when deploying, raw:%p", mnodeObj.id, pRaw);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
return sdbWrite(pMnode->pSdb, pRaw);
|
return sdbWrite(pMnode->pSdb, pRaw);
|
||||||
|
@ -367,7 +367,7 @@ static int32_t mndCreateMnode(SMnode *pMnode, SRpcMsg *pReq, SDnodeObj *pDnode,
|
||||||
if (pTrans == NULL) goto _OVER;
|
if (pTrans == NULL) goto _OVER;
|
||||||
|
|
||||||
mDebug("trans:%d, used to create mnode:%d", pTrans->id, pCreate->dnodeId);
|
mDebug("trans:%d, used to create mnode:%d", pTrans->id, pCreate->dnodeId);
|
||||||
mndTransSetExecOneByOne(pTrans);
|
mndTransSetNoParallel(pTrans);
|
||||||
if (mndSetCreateMnodeRedoLogs(pMnode, pTrans, &mnodeObj) != 0) goto _OVER;
|
if (mndSetCreateMnodeRedoLogs(pMnode, pTrans, &mnodeObj) != 0) goto _OVER;
|
||||||
if (mndSetCreateMnodeCommitLogs(pMnode, pTrans, &mnodeObj) != 0) goto _OVER;
|
if (mndSetCreateMnodeCommitLogs(pMnode, pTrans, &mnodeObj) != 0) goto _OVER;
|
||||||
if (mndSetCreateMnodeRedoActions(pMnode, pTrans, pDnode, &mnodeObj) != 0) goto _OVER;
|
if (mndSetCreateMnodeRedoActions(pMnode, pTrans, pDnode, &mnodeObj) != 0) goto _OVER;
|
||||||
|
@ -539,7 +539,7 @@ static int32_t mndDropMnode(SMnode *pMnode, SRpcMsg *pReq, SMnodeObj *pObj) {
|
||||||
if (pTrans == NULL) goto _OVER;
|
if (pTrans == NULL) goto _OVER;
|
||||||
|
|
||||||
mDebug("trans:%d, used to drop mnode:%d", pTrans->id, pObj->id);
|
mDebug("trans:%d, used to drop mnode:%d", pTrans->id, pObj->id);
|
||||||
mndTransSetExecOneByOne(pTrans);
|
mndTransSetNoParallel(pTrans);
|
||||||
if (mndSetDropMnodeRedoLogs(pMnode, pTrans, pObj) != 0) goto _OVER;
|
if (mndSetDropMnodeRedoLogs(pMnode, pTrans, pObj) != 0) goto _OVER;
|
||||||
if (mndSetDropMnodeCommitLogs(pMnode, pTrans, pObj) != 0) goto _OVER;
|
if (mndSetDropMnodeCommitLogs(pMnode, pTrans, pObj) != 0) goto _OVER;
|
||||||
if (mndSetDropMnodeRedoActions(pMnode, pTrans, pObj->pDnode, pObj) != 0) goto _OVER;
|
if (mndSetDropMnodeRedoActions(pMnode, pTrans, pObj->pDnode, pObj) != 0) goto _OVER;
|
||||||
|
|
|
@ -507,7 +507,7 @@ static int32_t mndCreateSma(SMnode *pMnode, SRpcMsg *pReq, SMCreateSmaReq *pCrea
|
||||||
|
|
||||||
mDebug("trans:%d, used to create sma:%s", pTrans->id, pCreate->name);
|
mDebug("trans:%d, used to create sma:%s", pTrans->id, pCreate->name);
|
||||||
mndTransSetDbInfo(pTrans, pDb);
|
mndTransSetDbInfo(pTrans, pDb);
|
||||||
mndTransSetExecOneByOne(pTrans);
|
mndTransSetNoParallel(pTrans);
|
||||||
|
|
||||||
if (mndSetCreateSmaRedoLogs(pMnode, pTrans, &smaObj) != 0) goto _OVER;
|
if (mndSetCreateSmaRedoLogs(pMnode, pTrans, &smaObj) != 0) goto _OVER;
|
||||||
if (mndSetCreateSmaVgroupRedoLogs(pMnode, pTrans, &streamObj.fixedSinkVg) != 0) goto _OVER;
|
if (mndSetCreateSmaVgroupRedoLogs(pMnode, pTrans, &streamObj.fixedSinkVg) != 0) goto _OVER;
|
||||||
|
|
|
@ -1597,7 +1597,7 @@ static int32_t mndProcessTableMetaReq(SRpcMsg *pReq) {
|
||||||
pReq->info.rspLen = rspLen;
|
pReq->info.rspLen = rspLen;
|
||||||
code = 0;
|
code = 0;
|
||||||
|
|
||||||
mDebug("stb:%s.%s, meta is retrieved", infoReq.dbFName, infoReq.tbName);
|
mTrace("%s.%s, meta is retrieved", infoReq.dbFName, infoReq.tbName);
|
||||||
|
|
||||||
_OVER:
|
_OVER:
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
|
|
|
@ -501,7 +501,7 @@ static int32_t mndPersistRebResult(SMnode *pMnode, SRpcMsg *pMsg, const SMqRebOu
|
||||||
// 4. TODO commit log: modification log
|
// 4. TODO commit log: modification log
|
||||||
|
|
||||||
// 5. set cb
|
// 5. set cb
|
||||||
mndTransSetCb(pTrans, TRANS_START_FUNC_MQ_REB, TRANS_STOP_FUNC_TEST_MQ_REB, NULL, 0);
|
mndTransSetCb(pTrans, TRANS_START_FUNC_MQ_REB, TRANS_STOP_FUNC_MQ_REB, NULL, 0);
|
||||||
|
|
||||||
// 6. execution
|
// 6. execution
|
||||||
if (mndTransPrepare(pMnode, pTrans) != 0) {
|
if (mndTransPrepare(pMnode, pTrans) != 0) {
|
||||||
|
|
|
@ -65,7 +65,7 @@ int32_t mndSyncGetSnapshot(struct SSyncFSM *pFsm, SSnapshot *pSnapshot) {
|
||||||
void mndRestoreFinish(struct SSyncFSM *pFsm) {
|
void mndRestoreFinish(struct SSyncFSM *pFsm) {
|
||||||
SMnode *pMnode = pFsm->data;
|
SMnode *pMnode = pFsm->data;
|
||||||
if (!pMnode->deploy) {
|
if (!pMnode->deploy) {
|
||||||
mInfo("mnode sync restore finished");
|
mInfo("mnode sync restore finished, and will handle outstanding transactions");
|
||||||
mndTransPullup(pMnode);
|
mndTransPullup(pMnode);
|
||||||
mndSetRestore(pMnode, true);
|
mndSetRestore(pMnode, true);
|
||||||
} else {
|
} else {
|
||||||
|
@ -244,7 +244,7 @@ void mndSyncStart(SMnode *pMnode) {
|
||||||
} else {
|
} else {
|
||||||
syncStart(pMgmt->sync);
|
syncStart(pMgmt->sync);
|
||||||
}
|
}
|
||||||
mDebug("sync:%" PRId64 " is started, standby:%d", pMgmt->sync, pMgmt->standby);
|
mDebug("mnode sync started, id:%" PRId64 " standby:%d", pMgmt->sync, pMgmt->standby);
|
||||||
}
|
}
|
||||||
|
|
||||||
void mndSyncStop(SMnode *pMnode) {}
|
void mndSyncStop(SMnode *pMnode) {}
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -77,7 +77,7 @@ static int32_t mndCreateDefaultUser(SMnode *pMnode, char *acct, char *user, char
|
||||||
if (pRaw == NULL) return -1;
|
if (pRaw == NULL) return -1;
|
||||||
sdbSetRawStatus(pRaw, SDB_STATUS_READY);
|
sdbSetRawStatus(pRaw, SDB_STATUS_READY);
|
||||||
|
|
||||||
mDebug("user:%s, will be created while deploy sdb, raw:%p", userObj.user, pRaw);
|
mDebug("user:%s, will be created when deploying, raw:%p", userObj.user, pRaw);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
return sdbWrite(pMnode->pSdb, pRaw);
|
return sdbWrite(pMnode->pSdb, pRaw);
|
||||||
|
|
|
@ -501,7 +501,7 @@ int32_t mndAllocVgroup(SMnode *pMnode, SDbObj *pDb, SVgObj **ppVgroups) {
|
||||||
*ppVgroups = pVgroups;
|
*ppVgroups = pVgroups;
|
||||||
code = 0;
|
code = 0;
|
||||||
|
|
||||||
mInfo("db:%s, %d vgroups is alloced, replica:%d", pDb->name, pDb->cfg.numOfVgroups, pDb->cfg.replications);
|
mInfo("db:%s, total %d vgroups is alloced, replica:%d", pDb->name, pDb->cfg.numOfVgroups, pDb->cfg.replications);
|
||||||
|
|
||||||
_OVER:
|
_OVER:
|
||||||
if (code != 0) taosMemoryFree(pVgroups);
|
if (code != 0) taosMemoryFree(pVgroups);
|
||||||
|
@ -539,7 +539,7 @@ int32_t mndAddVnodeToVgroup(SMnode *pMnode, SVgObj *pVgroup, SArray *pArray) {
|
||||||
pVgid->role = TAOS_SYNC_STATE_FOLLOWER;
|
pVgid->role = TAOS_SYNC_STATE_FOLLOWER;
|
||||||
pDnode->numOfVnodes++;
|
pDnode->numOfVnodes++;
|
||||||
|
|
||||||
mInfo("db:%s, vgId:%d, vn:%d dnode:%d is added", pVgroup->dbName, pVgroup->vgId, maxPos, pVgid->dnodeId);
|
mInfo("db:%s, vgId:%d, vnode_index:%d dnode:%d is added", pVgroup->dbName, pVgroup->vgId, maxPos, pVgid->dnodeId);
|
||||||
maxPos++;
|
maxPos++;
|
||||||
if (maxPos == 3) return 0;
|
if (maxPos == 3) return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -168,6 +168,7 @@ typedef struct SSdb {
|
||||||
char *currDir;
|
char *currDir;
|
||||||
char *tmpDir;
|
char *tmpDir;
|
||||||
int64_t lastCommitVer;
|
int64_t lastCommitVer;
|
||||||
|
int64_t lastCommitTerm;
|
||||||
int64_t curVer;
|
int64_t curVer;
|
||||||
int64_t curTerm;
|
int64_t curTerm;
|
||||||
int64_t tableVer[SDB_MAX];
|
int64_t tableVer[SDB_MAX];
|
||||||
|
|
|
@ -55,6 +55,7 @@ SSdb *sdbInit(SSdbOpt *pOption) {
|
||||||
pSdb->curVer = -1;
|
pSdb->curVer = -1;
|
||||||
pSdb->curTerm = -1;
|
pSdb->curTerm = -1;
|
||||||
pSdb->lastCommitVer = -1;
|
pSdb->lastCommitVer = -1;
|
||||||
|
pSdb->lastCommitTerm = -1;
|
||||||
pSdb->pMnode = pOption->pMnode;
|
pSdb->pMnode = pOption->pMnode;
|
||||||
taosThreadMutexInit(&pSdb->filelock, NULL);
|
taosThreadMutexInit(&pSdb->filelock, NULL);
|
||||||
mDebug("sdb init successfully");
|
mDebug("sdb init successfully");
|
||||||
|
|
|
@ -70,6 +70,7 @@ static void sdbResetData(SSdb *pSdb) {
|
||||||
pSdb->curVer = -1;
|
pSdb->curVer = -1;
|
||||||
pSdb->curTerm = -1;
|
pSdb->curTerm = -1;
|
||||||
pSdb->lastCommitVer = -1;
|
pSdb->lastCommitVer = -1;
|
||||||
|
pSdb->lastCommitTerm = -1;
|
||||||
mDebug("sdb reset successfully");
|
mDebug("sdb reset successfully");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -211,12 +212,12 @@ static int32_t sdbReadFileImp(SSdb *pSdb) {
|
||||||
char file[PATH_MAX] = {0};
|
char file[PATH_MAX] = {0};
|
||||||
|
|
||||||
snprintf(file, sizeof(file), "%s%ssdb.data", pSdb->currDir, TD_DIRSEP);
|
snprintf(file, sizeof(file), "%s%ssdb.data", pSdb->currDir, TD_DIRSEP);
|
||||||
mDebug("start to read file:%s", file);
|
mDebug("start to read sdb file:%s", file);
|
||||||
|
|
||||||
SSdbRaw *pRaw = taosMemoryMalloc(WAL_MAX_SIZE + 100);
|
SSdbRaw *pRaw = taosMemoryMalloc(WAL_MAX_SIZE + 100);
|
||||||
if (pRaw == NULL) {
|
if (pRaw == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
mError("failed read file since %s", terrstr());
|
mError("failed read sdb file since %s", terrstr());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -224,12 +225,12 @@ static int32_t sdbReadFileImp(SSdb *pSdb) {
|
||||||
if (pFile == NULL) {
|
if (pFile == NULL) {
|
||||||
taosMemoryFree(pRaw);
|
taosMemoryFree(pRaw);
|
||||||
terrno = TAOS_SYSTEM_ERROR(errno);
|
terrno = TAOS_SYSTEM_ERROR(errno);
|
||||||
mError("failed to read file:%s since %s", file, terrstr());
|
mError("failed to read sdb file:%s since %s", file, terrstr());
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sdbReadFileHead(pSdb, pFile) != 0) {
|
if (sdbReadFileHead(pSdb, pFile) != 0) {
|
||||||
mError("failed to read file:%s head since %s", file, terrstr());
|
mError("failed to read sdb file:%s head since %s", file, terrstr());
|
||||||
taosMemoryFree(pRaw);
|
taosMemoryFree(pRaw);
|
||||||
taosCloseFile(&pFile);
|
taosCloseFile(&pFile);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -245,13 +246,13 @@ static int32_t sdbReadFileImp(SSdb *pSdb) {
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
code = TAOS_SYSTEM_ERROR(errno);
|
code = TAOS_SYSTEM_ERROR(errno);
|
||||||
mError("failed to read file:%s since %s", file, tstrerror(code));
|
mError("failed to read sdb file:%s since %s", file, tstrerror(code));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret != readLen) {
|
if (ret != readLen) {
|
||||||
code = TSDB_CODE_FILE_CORRUPTED;
|
code = TSDB_CODE_FILE_CORRUPTED;
|
||||||
mError("failed to read file:%s since %s", file, tstrerror(code));
|
mError("failed to read sdb file:%s since %s", file, tstrerror(code));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -259,34 +260,36 @@ static int32_t sdbReadFileImp(SSdb *pSdb) {
|
||||||
ret = taosReadFile(pFile, pRaw->pData, readLen);
|
ret = taosReadFile(pFile, pRaw->pData, readLen);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
code = TAOS_SYSTEM_ERROR(errno);
|
code = TAOS_SYSTEM_ERROR(errno);
|
||||||
mError("failed to read file:%s since %s", file, tstrerror(code));
|
mError("failed to read sdb file:%s since %s", file, tstrerror(code));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret != readLen) {
|
if (ret != readLen) {
|
||||||
code = TSDB_CODE_FILE_CORRUPTED;
|
code = TSDB_CODE_FILE_CORRUPTED;
|
||||||
mError("failed to read file:%s since %s", file, tstrerror(code));
|
mError("failed to read sdb file:%s since %s", file, tstrerror(code));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t totalLen = sizeof(SSdbRaw) + pRaw->dataLen + sizeof(int32_t);
|
int32_t totalLen = sizeof(SSdbRaw) + pRaw->dataLen + sizeof(int32_t);
|
||||||
if ((!taosCheckChecksumWhole((const uint8_t *)pRaw, totalLen)) != 0) {
|
if ((!taosCheckChecksumWhole((const uint8_t *)pRaw, totalLen)) != 0) {
|
||||||
code = TSDB_CODE_CHECKSUM_ERROR;
|
code = TSDB_CODE_CHECKSUM_ERROR;
|
||||||
mError("failed to read file:%s since %s", file, tstrerror(code));
|
mError("failed to read sdb file:%s since %s", file, tstrerror(code));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
code = sdbWriteWithoutFree(pSdb, pRaw);
|
code = sdbWriteWithoutFree(pSdb, pRaw);
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
mError("failed to read file:%s since %s", file, terrstr());
|
mError("failed to read sdb file:%s since %s", file, terrstr());
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
code = 0;
|
code = 0;
|
||||||
pSdb->lastCommitVer = pSdb->curVer;
|
pSdb->lastCommitVer = pSdb->curVer;
|
||||||
|
pSdb->lastCommitTerm = pSdb->curTerm;
|
||||||
memcpy(pSdb->tableVer, tableVer, sizeof(tableVer));
|
memcpy(pSdb->tableVer, tableVer, sizeof(tableVer));
|
||||||
mDebug("read file:%s successfully, ver:%" PRId64, file, pSdb->lastCommitVer);
|
mDebug("read sdb file:%s successfully, ver:%" PRId64 " term:%" PRId64, file, pSdb->lastCommitVer,
|
||||||
|
pSdb->lastCommitTerm);
|
||||||
|
|
||||||
_OVER:
|
_OVER:
|
||||||
taosCloseFile(&pFile);
|
taosCloseFile(&pFile);
|
||||||
|
@ -302,7 +305,7 @@ int32_t sdbReadFile(SSdb *pSdb) {
|
||||||
sdbResetData(pSdb);
|
sdbResetData(pSdb);
|
||||||
int32_t code = sdbReadFileImp(pSdb);
|
int32_t code = sdbReadFileImp(pSdb);
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
mError("failed to read sdb since %s", terrstr());
|
mError("failed to read sdb file since %s", terrstr());
|
||||||
sdbResetData(pSdb);
|
sdbResetData(pSdb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -318,18 +321,19 @@ static int32_t sdbWriteFileImp(SSdb *pSdb) {
|
||||||
char curfile[PATH_MAX] = {0};
|
char curfile[PATH_MAX] = {0};
|
||||||
snprintf(curfile, sizeof(curfile), "%s%ssdb.data", pSdb->currDir, TD_DIRSEP);
|
snprintf(curfile, sizeof(curfile), "%s%ssdb.data", pSdb->currDir, TD_DIRSEP);
|
||||||
|
|
||||||
mDebug("start to write file:%s, current ver:%" PRId64 " term:%" PRId64 ", commit ver:%" PRId64, curfile, pSdb->curVer,
|
mDebug("start to write sdb file, current ver:%" PRId64 " term:%" PRId64 ", commit ver:%" PRId64 " term:%" PRId64
|
||||||
pSdb->curTerm, pSdb->lastCommitVer);
|
" file:%s",
|
||||||
|
pSdb->curVer, pSdb->curTerm, pSdb->lastCommitVer, pSdb->lastCommitTerm, curfile);
|
||||||
|
|
||||||
TdFilePtr pFile = taosOpenFile(tmpfile, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_TRUNC);
|
TdFilePtr pFile = taosOpenFile(tmpfile, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_TRUNC);
|
||||||
if (pFile == NULL) {
|
if (pFile == NULL) {
|
||||||
terrno = TAOS_SYSTEM_ERROR(errno);
|
terrno = TAOS_SYSTEM_ERROR(errno);
|
||||||
mError("failed to open file:%s for write since %s", tmpfile, terrstr());
|
mError("failed to open sdb file:%s for write since %s", tmpfile, terrstr());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sdbWriteFileHead(pSdb, pFile) != 0) {
|
if (sdbWriteFileHead(pSdb, pFile) != 0) {
|
||||||
mError("failed to write file:%s head since %s", tmpfile, terrstr());
|
mError("failed to write sdb file:%s head since %s", tmpfile, terrstr());
|
||||||
taosCloseFile(&pFile);
|
taosCloseFile(&pFile);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -338,7 +342,7 @@ static int32_t sdbWriteFileImp(SSdb *pSdb) {
|
||||||
SdbEncodeFp encodeFp = pSdb->encodeFps[i];
|
SdbEncodeFp encodeFp = pSdb->encodeFps[i];
|
||||||
if (encodeFp == NULL) continue;
|
if (encodeFp == NULL) continue;
|
||||||
|
|
||||||
mTrace("write %s to file, total %d rows", sdbTableName(i), sdbGetSize(pSdb, i));
|
mTrace("write %s to sdb file, total %d rows", sdbTableName(i), sdbGetSize(pSdb, i));
|
||||||
|
|
||||||
SHashObj *hash = pSdb->hashObjs[i];
|
SHashObj *hash = pSdb->hashObjs[i];
|
||||||
TdThreadRwlock *pLock = &pSdb->locks[i];
|
TdThreadRwlock *pLock = &pSdb->locks[i];
|
||||||
|
@ -394,7 +398,7 @@ static int32_t sdbWriteFileImp(SSdb *pSdb) {
|
||||||
code = taosFsyncFile(pFile);
|
code = taosFsyncFile(pFile);
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
code = TAOS_SYSTEM_ERROR(errno);
|
code = TAOS_SYSTEM_ERROR(errno);
|
||||||
mError("failed to sync file:%s since %s", tmpfile, tstrerror(code));
|
mError("failed to sync sdb file:%s since %s", tmpfile, tstrerror(code));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -404,15 +408,17 @@ static int32_t sdbWriteFileImp(SSdb *pSdb) {
|
||||||
code = taosRenameFile(tmpfile, curfile);
|
code = taosRenameFile(tmpfile, curfile);
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
code = TAOS_SYSTEM_ERROR(errno);
|
code = TAOS_SYSTEM_ERROR(errno);
|
||||||
mError("failed to write file:%s since %s", curfile, tstrerror(code));
|
mError("failed to write sdb file:%s since %s", curfile, tstrerror(code));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
mError("failed to write file:%s since %s", curfile, tstrerror(code));
|
mError("failed to write sdb file:%s since %s", curfile, tstrerror(code));
|
||||||
} else {
|
} else {
|
||||||
pSdb->lastCommitVer = pSdb->curVer;
|
pSdb->lastCommitVer = pSdb->curVer;
|
||||||
mDebug("write file:%s successfully, ver:%" PRId64 " term:%" PRId64, curfile, pSdb->lastCommitVer, pSdb->curTerm);
|
pSdb->lastCommitTerm = pSdb->curTerm;
|
||||||
|
mDebug("write sdb file successfully, ver:%" PRId64 " term:%" PRId64 " file:%s", pSdb->lastCommitVer,
|
||||||
|
pSdb->lastCommitTerm, curfile);
|
||||||
}
|
}
|
||||||
|
|
||||||
terrno = code;
|
terrno = code;
|
||||||
|
@ -427,7 +433,7 @@ int32_t sdbWriteFile(SSdb *pSdb) {
|
||||||
taosThreadMutexLock(&pSdb->filelock);
|
taosThreadMutexLock(&pSdb->filelock);
|
||||||
int32_t code = sdbWriteFileImp(pSdb);
|
int32_t code = sdbWriteFileImp(pSdb);
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
mError("failed to write sdb since %s", terrstr());
|
mError("failed to write sdb file since %s", terrstr());
|
||||||
}
|
}
|
||||||
taosThreadMutexUnlock(&pSdb->filelock);
|
taosThreadMutexUnlock(&pSdb->filelock);
|
||||||
return code;
|
return code;
|
||||||
|
@ -493,7 +499,7 @@ int32_t sdbStartRead(SSdb *pSdb, SSdbIter **ppIter) {
|
||||||
if (taosCopyFile(datafile, pIter->name) < 0) {
|
if (taosCopyFile(datafile, pIter->name) < 0) {
|
||||||
taosThreadMutexUnlock(&pSdb->filelock);
|
taosThreadMutexUnlock(&pSdb->filelock);
|
||||||
terrno = TAOS_SYSTEM_ERROR(errno);
|
terrno = TAOS_SYSTEM_ERROR(errno);
|
||||||
mError("failed to copy file %s to %s since %s", datafile, pIter->name, terrstr());
|
mError("failed to copy sdb file %s to %s since %s", datafile, pIter->name, terrstr());
|
||||||
sdbCloseIter(pIter);
|
sdbCloseIter(pIter);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -502,7 +508,7 @@ int32_t sdbStartRead(SSdb *pSdb, SSdbIter **ppIter) {
|
||||||
pIter->file = taosOpenFile(pIter->name, TD_FILE_READ);
|
pIter->file = taosOpenFile(pIter->name, TD_FILE_READ);
|
||||||
if (pIter->file == NULL) {
|
if (pIter->file == NULL) {
|
||||||
terrno = TAOS_SYSTEM_ERROR(errno);
|
terrno = TAOS_SYSTEM_ERROR(errno);
|
||||||
mError("failed to open file:%s since %s", pIter->name, terrstr());
|
mError("failed to open sdb file:%s since %s", pIter->name, terrstr());
|
||||||
sdbCloseIter(pIter);
|
sdbCloseIter(pIter);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -79,7 +79,11 @@ int32_t qwExecTask(QW_FPARAMS_DEF, SQWTaskCtx *ctx, bool *queryEnd) {
|
||||||
if (taskHandle) {
|
if (taskHandle) {
|
||||||
code = qExecTask(taskHandle, &pRes, &useconds);
|
code = qExecTask(taskHandle, &pRes, &useconds);
|
||||||
if (code) {
|
if (code) {
|
||||||
|
if (code != TSDB_CODE_OPS_NOT_SUPPORT) {
|
||||||
QW_TASK_ELOG("qExecTask failed, code:%x - %s", code, tstrerror(code));
|
QW_TASK_ELOG("qExecTask failed, code:%x - %s", code, tstrerror(code));
|
||||||
|
} else {
|
||||||
|
QW_TASK_DLOG("qExecTask failed, code:%x - %s", code, tstrerror(code));
|
||||||
|
}
|
||||||
QW_ERR_RET(code);
|
QW_ERR_RET(code);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,7 +42,7 @@ static void windowSBfAdd(SUpdateInfo *pInfo, uint64_t count) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void windowSBfDelete(SUpdateInfo *pInfo, uint64_t count) {
|
static void windowSBfDelete(SUpdateInfo *pInfo, uint64_t count) {
|
||||||
if (count < pInfo->numSBFs - 1) {
|
if (count < pInfo->numSBFs) {
|
||||||
for (uint64_t i = 0; i < count; ++i) {
|
for (uint64_t i = 0; i < count; ++i) {
|
||||||
SScalableBf *pTsSBFs = taosArrayGetP(pInfo->pTsSBFs, 0);
|
SScalableBf *pTsSBFs = taosArrayGetP(pInfo->pTsSBFs, 0);
|
||||||
tScalableBfDestroy(pTsSBFs);
|
tScalableBfDestroy(pTsSBFs);
|
||||||
|
|
|
@ -0,0 +1,79 @@
|
||||||
|
{
|
||||||
|
"filetype": "insert",
|
||||||
|
"cfgdir": "/etc/taos/",
|
||||||
|
"host": "test216",
|
||||||
|
"port": 6030,
|
||||||
|
"user": "root",
|
||||||
|
"password": "taosdata",
|
||||||
|
"thread_count": 8,
|
||||||
|
"thread_count_create_tbl": 8,
|
||||||
|
"result_file": "./insert_res.txt",
|
||||||
|
"confirm_parameter_prompt": "no",
|
||||||
|
"insert_interval": 0,
|
||||||
|
"interlace_rows": 1000,
|
||||||
|
"num_of_records_per_req": 100000,
|
||||||
|
"databases": [
|
||||||
|
{
|
||||||
|
"dbinfo": {
|
||||||
|
"name": "db",
|
||||||
|
"drop": "yes",
|
||||||
|
"vgroups": 24
|
||||||
|
},
|
||||||
|
"super_tables": [
|
||||||
|
{
|
||||||
|
"name": "stb",
|
||||||
|
"child_table_exists": "no",
|
||||||
|
"childtable_count": 100000,
|
||||||
|
"childtable_prefix": "stb_",
|
||||||
|
"auto_create_table": "no",
|
||||||
|
"batch_create_tbl_num": 50000,
|
||||||
|
"data_source": "rand",
|
||||||
|
"insert_mode": "taosc",
|
||||||
|
"insert_rows": 5,
|
||||||
|
"interlace_rows": 100000,
|
||||||
|
"insert_interval": 0,
|
||||||
|
"max_sql_len": 10000000,
|
||||||
|
"disorder_ratio": 0,
|
||||||
|
"disorder_range": 1000,
|
||||||
|
"timestamp_step": 10,
|
||||||
|
"start_timestamp": "2022-05-01 00:00:00.000",
|
||||||
|
"sample_format": "csv",
|
||||||
|
"use_sample_ts": "no",
|
||||||
|
"tags_file": "",
|
||||||
|
"columns": [
|
||||||
|
{
|
||||||
|
"type": "INT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "TINYINT",
|
||||||
|
"count": 1
|
||||||
|
},
|
||||||
|
{"type": "DOUBLE"},
|
||||||
|
|
||||||
|
{
|
||||||
|
"type": "BINARY",
|
||||||
|
"len": 40,
|
||||||
|
"count": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "nchar",
|
||||||
|
"len": 20,
|
||||||
|
"count": 1
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
{
|
||||||
|
"type": "TINYINT",
|
||||||
|
"count": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "BINARY",
|
||||||
|
"len": 16,
|
||||||
|
"count": 1
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
{
|
||||||
|
"filetype": "query",
|
||||||
|
"cfgdir": "/etc/taos",
|
||||||
|
"host": "test216",
|
||||||
|
"port": 6030,
|
||||||
|
"user": "root",
|
||||||
|
"password": "taosdata",
|
||||||
|
"confirm_parameter_prompt": "no",
|
||||||
|
"databases": "db",
|
||||||
|
"query_times": 100,
|
||||||
|
"query_mode": "taosc",
|
||||||
|
"specified_table_query": {
|
||||||
|
"query_interval": 0,
|
||||||
|
"threads": 8,
|
||||||
|
"sqls": [
|
||||||
|
{
|
||||||
|
"sql": "select count(*) from stb_0 ",
|
||||||
|
"result": "./query_res0.txt"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"sql": "select last_row(*) from stb_1 ",
|
||||||
|
"result": "./query_res1.txt"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"sql": "select last(*) from stb_2 ",
|
||||||
|
"result": "./query_res2.txt"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"sql": "select first(*) from stb_3 ",
|
||||||
|
"result": "./query_res3.txt"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"sql": "select avg(c0),min(c2),max(c1) from stb_4",
|
||||||
|
"result": "./query_res4.txt"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"sql": "select avg(c0),min(c2),max(c1) from stb_5 where ts <= '2022-05-01 20:00:00.500' and ts >= '2022-05-01 00:00:00.000' ",
|
||||||
|
"result": "./query_res5.txt"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
|
@ -132,11 +132,11 @@ class TDTestCase:
|
||||||
querystmt.bind_param(queryparam)
|
querystmt.bind_param(queryparam)
|
||||||
querystmt.execute()
|
querystmt.execute()
|
||||||
result=querystmt.use_result()
|
result=querystmt.use_result()
|
||||||
rows=result.fetch_all()
|
# rows=result.fetch_all()
|
||||||
print( querystmt.use_result())
|
# print( querystmt.use_result())
|
||||||
|
|
||||||
# result = conn.query("select * from log")
|
# result = conn.query("select * from log")
|
||||||
# rows=result.fetch_all()
|
rows=result.fetch_all()
|
||||||
# rows=result.fetch_all()
|
# rows=result.fetch_all()
|
||||||
print(rows)
|
print(rows)
|
||||||
assert rows[1][0] == "ts"
|
assert rows[1][0] == "ts"
|
||||||
|
@ -213,7 +213,7 @@ class TDTestCase:
|
||||||
params[11].float([3, None, 1])
|
params[11].float([3, None, 1])
|
||||||
params[12].double([3, None, 1.2])
|
params[12].double([3, None, 1.2])
|
||||||
params[13].binary(["abc", "dddafadfadfadfadfa", None])
|
params[13].binary(["abc", "dddafadfadfadfadfa", None])
|
||||||
params[14].nchar(["涛思数据", None, "a long string with 中文字符"])
|
params[14].nchar(["涛思数据", None, "a? long string with 中文字符"])
|
||||||
params[15].timestamp([None, None, 1626861392591])
|
params[15].timestamp([None, None, 1626861392591])
|
||||||
|
|
||||||
stmt.bind_param_batch(params)
|
stmt.bind_param_batch(params)
|
||||||
|
@ -230,9 +230,31 @@ class TDTestCase:
|
||||||
querystmt1.execute()
|
querystmt1.execute()
|
||||||
result1=querystmt1.use_result()
|
result1=querystmt1.use_result()
|
||||||
rows1=result1.fetch_all()
|
rows1=result1.fetch_all()
|
||||||
assert str(rows1[0][0]) == "2021-07-21 17:56:32.589111"
|
print("1",rows1)
|
||||||
assert rows1[0][10] == 3
|
|
||||||
assert rows1[1][10] == 4
|
querystmt2=conn.statement("select abs(?) from log where bu < ?")
|
||||||
|
queryparam2=new_bind_params(2)
|
||||||
|
print(type(queryparam2))
|
||||||
|
queryparam2[0].int(5)
|
||||||
|
queryparam2[1].int(5)
|
||||||
|
querystmt2.bind_param(queryparam2)
|
||||||
|
querystmt2.execute()
|
||||||
|
result2=querystmt2.use_result()
|
||||||
|
rows2=result2.fetch_all()
|
||||||
|
print("2",rows2)
|
||||||
|
|
||||||
|
querystmt3=conn.statement("select abs(?) from log where nn= 'a? long string with 中文字符' ")
|
||||||
|
queryparam3=new_bind_params(1)
|
||||||
|
print(type(queryparam3))
|
||||||
|
queryparam3[0].int(5)
|
||||||
|
querystmt3.bind_param(queryparam3)
|
||||||
|
querystmt3.execute()
|
||||||
|
result3=querystmt3.use_result()
|
||||||
|
rows3=result3.fetch_all()
|
||||||
|
print("3",rows3)
|
||||||
|
# assert str(rows1[0][0]) == "2021-07-21 17:56:32.589111"
|
||||||
|
# assert rows1[0][10] == 3
|
||||||
|
# assert rows1[1][10] == 4
|
||||||
|
|
||||||
# conn.execute("drop database if exists %s" % dbname)
|
# conn.execute("drop database if exists %s" % dbname)
|
||||||
conn.close()
|
conn.close()
|
||||||
|
@ -247,7 +269,6 @@ class TDTestCase:
|
||||||
config = buildPath+ "../sim/dnode1/cfg/"
|
config = buildPath+ "../sim/dnode1/cfg/"
|
||||||
host="localhost"
|
host="localhost"
|
||||||
connectstmt=self.newcon(host,config)
|
connectstmt=self.newcon(host,config)
|
||||||
print(connectstmt)
|
|
||||||
self.test_stmt_insert_multi(connectstmt)
|
self.test_stmt_insert_multi(connectstmt)
|
||||||
connectstmt=self.newcon(host,config)
|
connectstmt=self.newcon(host,config)
|
||||||
self.test_stmt_set_tbname_tag(connectstmt)
|
self.test_stmt_set_tbname_tag(connectstmt)
|
|
@ -0,0 +1,181 @@
|
||||||
|
###################################################################
|
||||||
|
# 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 -*-
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import threading as thd
|
||||||
|
import multiprocessing as mp
|
||||||
|
from numpy.lib.function_base import insert
|
||||||
|
import taos
|
||||||
|
from taos import *
|
||||||
|
from util.log import *
|
||||||
|
from util.cases import *
|
||||||
|
from util.sql import *
|
||||||
|
import numpy as np
|
||||||
|
import datetime as dt
|
||||||
|
from datetime import datetime
|
||||||
|
from ctypes import *
|
||||||
|
import time
|
||||||
|
# constant define
|
||||||
|
WAITS = 5 # wait seconds
|
||||||
|
|
||||||
|
class TDTestCase:
|
||||||
|
#
|
||||||
|
# --------------- main frame -------------------
|
||||||
|
def caseDescription(self):
|
||||||
|
'''
|
||||||
|
limit and offset keyword function test cases;
|
||||||
|
case1: limit offset base function test
|
||||||
|
case2: offset return valid
|
||||||
|
'''
|
||||||
|
return
|
||||||
|
|
||||||
|
def getBuildPath(self):
|
||||||
|
selfPath = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
|
||||||
|
if ("community" in selfPath):
|
||||||
|
projPath = selfPath[:selfPath.find("community")]
|
||||||
|
else:
|
||||||
|
projPath = selfPath[:selfPath.find("tests")]
|
||||||
|
|
||||||
|
for root, dirs, files in os.walk(projPath):
|
||||||
|
if ("taosd" in files):
|
||||||
|
rootRealPath = os.path.dirname(os.path.realpath(root))
|
||||||
|
if ("packaging" not in rootRealPath):
|
||||||
|
buildPath = root[:len(root)-len("/build/bin")]
|
||||||
|
break
|
||||||
|
return buildPath
|
||||||
|
|
||||||
|
# init
|
||||||
|
def init(self, conn, logSql):
|
||||||
|
tdLog.debug("start to execute %s" % __file__)
|
||||||
|
tdSql.init(conn.cursor())
|
||||||
|
# tdSql.prepare()
|
||||||
|
# self.create_tables();
|
||||||
|
self.ts = 1500000000000
|
||||||
|
|
||||||
|
# stop
|
||||||
|
def stop(self):
|
||||||
|
tdSql.close()
|
||||||
|
tdLog.success("%s successfully executed" % __file__)
|
||||||
|
|
||||||
|
|
||||||
|
# --------------- case -------------------
|
||||||
|
|
||||||
|
|
||||||
|
def newcon(self,host,cfg):
|
||||||
|
user = "root"
|
||||||
|
password = "taosdata"
|
||||||
|
port =6030
|
||||||
|
con=taos.connect(host=host, user=user, password=password, config=cfg ,port=port)
|
||||||
|
print(con)
|
||||||
|
return con
|
||||||
|
|
||||||
|
def test_stmt_insert_multi(self,conn):
|
||||||
|
# type: (TaosConnection) -> None
|
||||||
|
|
||||||
|
dbname = "pytest_taos_stmt_multi"
|
||||||
|
try:
|
||||||
|
conn.execute("drop database if exists %s" % dbname)
|
||||||
|
conn.execute("create database if not exists %s" % dbname)
|
||||||
|
conn.select_db(dbname)
|
||||||
|
|
||||||
|
conn.execute(
|
||||||
|
"create table if not exists log(ts timestamp, bo bool, nil tinyint, ti tinyint, si smallint, ii int,\
|
||||||
|
bi bigint, tu tinyint unsigned, su smallint unsigned, iu int unsigned, bu bigint unsigned, \
|
||||||
|
ff float, dd double, bb binary(100), nn nchar(100), tt timestamp)",
|
||||||
|
)
|
||||||
|
# conn.load_table_info("log")
|
||||||
|
|
||||||
|
start = datetime.now()
|
||||||
|
stmt = conn.statement("insert into log values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")
|
||||||
|
|
||||||
|
params = new_multi_binds(16)
|
||||||
|
params[0].timestamp((1626861392589, 1626861392590, 1626861392591))
|
||||||
|
params[1].bool((True, None, False))
|
||||||
|
params[2].tinyint([-128, -128, None]) # -128 is tinyint null
|
||||||
|
params[3].tinyint([0, 127, None])
|
||||||
|
params[4].smallint([3, None, 2])
|
||||||
|
params[5].int([3, 4, None])
|
||||||
|
params[6].bigint([3, 4, None])
|
||||||
|
params[7].tinyint_unsigned([3, 4, None])
|
||||||
|
params[8].smallint_unsigned([3, 4, None])
|
||||||
|
params[9].int_unsigned([3, 4, None])
|
||||||
|
params[10].bigint_unsigned([3, 4, None])
|
||||||
|
params[11].float([3, None, 1])
|
||||||
|
params[12].double([3, None, 1.2])
|
||||||
|
params[13].binary(["abc", "dddafadfadfadfadfa", None])
|
||||||
|
params[14].nchar(["涛思数据", None, "a long string with 中文字符"])
|
||||||
|
params[15].timestamp([None, None, 1626861392591])
|
||||||
|
# print(type(stmt))
|
||||||
|
stmt.bind_param_batch(params)
|
||||||
|
stmt.execute()
|
||||||
|
end = datetime.now()
|
||||||
|
print("elapsed time: ", end - start)
|
||||||
|
assert stmt.affected_rows == 3
|
||||||
|
|
||||||
|
#query
|
||||||
|
querystmt=conn.statement("select ?,bu from log")
|
||||||
|
queryparam=new_bind_params(1)
|
||||||
|
print(type(queryparam))
|
||||||
|
queryparam[0].binary("ts")
|
||||||
|
querystmt.bind_param(queryparam)
|
||||||
|
querystmt.execute()
|
||||||
|
result=querystmt.use_result()
|
||||||
|
# rows=result.fetch_all()
|
||||||
|
# print( querystmt.use_result())
|
||||||
|
|
||||||
|
# result = conn.query("select * from log")
|
||||||
|
rows=result.fetch_all()
|
||||||
|
# rows=result.fetch_all()
|
||||||
|
print(rows)
|
||||||
|
assert rows[1][0] == "ts"
|
||||||
|
assert rows[0][1] == 3
|
||||||
|
|
||||||
|
#query
|
||||||
|
querystmt1=conn.statement("select * from log where bu < ?")
|
||||||
|
queryparam1=new_bind_params(1)
|
||||||
|
print(type(queryparam1))
|
||||||
|
queryparam1[0].int(4)
|
||||||
|
querystmt1.bind_param(queryparam1)
|
||||||
|
querystmt1.execute()
|
||||||
|
result1=querystmt1.use_result()
|
||||||
|
rows1=result1.fetch_all()
|
||||||
|
print(rows1)
|
||||||
|
assert str(rows1[0][0]) == "2021-07-21 17:56:32.589000"
|
||||||
|
assert rows1[0][10] == 3
|
||||||
|
|
||||||
|
|
||||||
|
stmt.close()
|
||||||
|
|
||||||
|
# conn.execute("drop database if exists %s" % dbname)
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
except Exception as err:
|
||||||
|
# conn.execute("drop database if exists %s" % dbname)
|
||||||
|
conn.close()
|
||||||
|
raise err
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
buildPath = self.getBuildPath()
|
||||||
|
config = buildPath+ "../sim/dnode1/cfg/"
|
||||||
|
host="localhost"
|
||||||
|
connectstmt=self.newcon(host,config)
|
||||||
|
self.test_stmt_insert_multi(connectstmt)
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
# add case with filename
|
||||||
|
#
|
||||||
|
tdCases.addWindows(__file__, TDTestCase())
|
||||||
|
tdCases.addLinux(__file__, TDTestCase())
|
|
@ -0,0 +1,176 @@
|
||||||
|
###################################################################
|
||||||
|
# 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 -*-
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import threading as thd
|
||||||
|
import multiprocessing as mp
|
||||||
|
from numpy.lib.function_base import insert
|
||||||
|
import taos
|
||||||
|
from taos import *
|
||||||
|
from util.log import *
|
||||||
|
from util.cases import *
|
||||||
|
from util.sql import *
|
||||||
|
import numpy as np
|
||||||
|
import datetime as dt
|
||||||
|
from datetime import datetime
|
||||||
|
from ctypes import *
|
||||||
|
import time
|
||||||
|
# constant define
|
||||||
|
WAITS = 5 # wait seconds
|
||||||
|
|
||||||
|
class TDTestCase:
|
||||||
|
#
|
||||||
|
# --------------- main frame -------------------
|
||||||
|
def caseDescription(self):
|
||||||
|
'''
|
||||||
|
limit and offset keyword function test cases;
|
||||||
|
case1: limit offset base function test
|
||||||
|
case2: offset return valid
|
||||||
|
'''
|
||||||
|
return
|
||||||
|
|
||||||
|
def getBuildPath(self):
|
||||||
|
selfPath = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
|
||||||
|
if ("community" in selfPath):
|
||||||
|
projPath = selfPath[:selfPath.find("community")]
|
||||||
|
else:
|
||||||
|
projPath = selfPath[:selfPath.find("tests")]
|
||||||
|
|
||||||
|
for root, dirs, files in os.walk(projPath):
|
||||||
|
if ("taosd" in files):
|
||||||
|
rootRealPath = os.path.dirname(os.path.realpath(root))
|
||||||
|
if ("packaging" not in rootRealPath):
|
||||||
|
buildPath = root[:len(root)-len("/build/bin")]
|
||||||
|
break
|
||||||
|
return buildPath
|
||||||
|
|
||||||
|
# init
|
||||||
|
def init(self, conn, logSql):
|
||||||
|
tdLog.debug("start to execute %s" % __file__)
|
||||||
|
tdSql.init(conn.cursor())
|
||||||
|
# tdSql.prepare()
|
||||||
|
# self.create_tables();
|
||||||
|
self.ts = 1500000000000
|
||||||
|
|
||||||
|
# stop
|
||||||
|
def stop(self):
|
||||||
|
tdSql.close()
|
||||||
|
tdLog.success("%s successfully executed" % __file__)
|
||||||
|
|
||||||
|
|
||||||
|
# --------------- case -------------------
|
||||||
|
|
||||||
|
|
||||||
|
def newcon(self,host,cfg):
|
||||||
|
user = "root"
|
||||||
|
password = "taosdata"
|
||||||
|
port =6030
|
||||||
|
con=taos.connect(host=host, user=user, password=password, config=cfg ,port=port)
|
||||||
|
print(con)
|
||||||
|
return con
|
||||||
|
|
||||||
|
def test_stmt_set_tbname_tag(self,conn):
|
||||||
|
dbname = "pytest_taos_stmt_set_tbname_tag"
|
||||||
|
|
||||||
|
try:
|
||||||
|
conn.execute("drop database if exists %s" % dbname)
|
||||||
|
conn.execute("create database if not exists %s PRECISION 'us' " % dbname)
|
||||||
|
conn.select_db(dbname)
|
||||||
|
conn.execute("create table if not exists log(ts timestamp, bo bool, nil tinyint, ti tinyint, si smallint, ii int,\
|
||||||
|
bi bigint, tu tinyint unsigned, su smallint unsigned, iu int unsigned, bu bigint unsigned, \
|
||||||
|
ff float, dd double, bb binary(100), nn nchar(100), tt timestamp , vc varchar(100)) tags (t1 timestamp, t2 bool,\
|
||||||
|
t3 tinyint, t4 tinyint, t5 smallint, t6 int, t7 bigint, t8 tinyint unsigned, t9 smallint unsigned, \
|
||||||
|
t10 int unsigned, t11 bigint unsigned, t12 float, t13 double, t14 binary(100), t15 nchar(100), t16 timestamp)")
|
||||||
|
|
||||||
|
stmt = conn.statement("insert into ? using log tags (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) \
|
||||||
|
values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)")
|
||||||
|
tags = new_bind_params(16)
|
||||||
|
tags[0].timestamp(1626861392589123, PrecisionEnum.Microseconds)
|
||||||
|
tags[1].bool(True)
|
||||||
|
tags[2].null()
|
||||||
|
tags[3].tinyint(2)
|
||||||
|
tags[4].smallint(3)
|
||||||
|
tags[5].int(4)
|
||||||
|
tags[6].bigint(5)
|
||||||
|
tags[7].tinyint_unsigned(6)
|
||||||
|
tags[8].smallint_unsigned(7)
|
||||||
|
tags[9].int_unsigned(8)
|
||||||
|
tags[10].bigint_unsigned(9)
|
||||||
|
tags[11].float(10.1)
|
||||||
|
tags[12].double(10.11)
|
||||||
|
tags[13].binary("hello")
|
||||||
|
tags[14].nchar("stmt")
|
||||||
|
tags[15].timestamp(1626861392589, PrecisionEnum.Milliseconds)
|
||||||
|
stmt.set_tbname_tags("tb1", tags)
|
||||||
|
params = new_multi_binds(16)
|
||||||
|
params[0].timestamp((1626861392589111, 1626861392590111, 1626861392591111))
|
||||||
|
params[1].bool((True, None, False))
|
||||||
|
params[2].tinyint([-128, -128, None]) # -128 is tinyint null
|
||||||
|
params[3].tinyint([0, 127, None])
|
||||||
|
params[4].smallint([3, None, 2])
|
||||||
|
params[5].int([3, 4, None])
|
||||||
|
params[6].bigint([3, 4, None])
|
||||||
|
params[7].tinyint_unsigned([3, 4, None])
|
||||||
|
params[8].smallint_unsigned([3, 4, None])
|
||||||
|
params[9].int_unsigned([3, 4, None])
|
||||||
|
params[10].bigint_unsigned([3, 4, 5])
|
||||||
|
params[11].float([3, None, 1])
|
||||||
|
params[12].double([3, None, 1.2])
|
||||||
|
params[13].binary(["abc", "dddafadfadfadfadfa", None])
|
||||||
|
params[14].nchar(["涛思数据", None, "a long string with 中文字符"])
|
||||||
|
params[15].timestamp([None, None, 1626861392591])
|
||||||
|
params[16].binary(["涛思数据16", None, "a long string with 中文-字符"])
|
||||||
|
|
||||||
|
stmt.bind_param_batch(params)
|
||||||
|
stmt.execute()
|
||||||
|
|
||||||
|
assert stmt.affected_rows == 3
|
||||||
|
|
||||||
|
#query
|
||||||
|
querystmt1=conn.statement("select * from log where bu < ?")
|
||||||
|
queryparam1=new_bind_params(1)
|
||||||
|
print(type(queryparam1))
|
||||||
|
queryparam1[0].int(5)
|
||||||
|
querystmt1.bind_param(queryparam1)
|
||||||
|
querystmt1.execute()
|
||||||
|
result1=querystmt1.use_result()
|
||||||
|
rows1=result1.fetch_all()
|
||||||
|
print(rows1)
|
||||||
|
# assert str(rows1[0][0]) == "2021-07-21 17:56:32.589111"
|
||||||
|
# assert rows1[0][10] == 3
|
||||||
|
# assert rows1[1][10] == 4
|
||||||
|
|
||||||
|
# conn.execute("drop database if exists %s" % dbname)
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
except Exception as err:
|
||||||
|
# conn.execute("drop database if exists %s" % dbname)
|
||||||
|
conn.close()
|
||||||
|
raise err
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
buildPath = self.getBuildPath()
|
||||||
|
config = buildPath+ "../sim/dnode1/cfg/"
|
||||||
|
host="localhost"
|
||||||
|
connectstmt=self.newcon(host,config)
|
||||||
|
self.test_stmt_set_tbname_tag(connectstmt)
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
# add case with filename
|
||||||
|
#
|
||||||
|
tdCases.addWindows(__file__, TDTestCase())
|
||||||
|
tdCases.addLinux(__file__, TDTestCase())
|
|
@ -15,6 +15,7 @@ python3 ./test.py -f 0-others/user_control.py
|
||||||
python3 ./test.py -f 0-others/fsync.py
|
python3 ./test.py -f 0-others/fsync.py
|
||||||
|
|
||||||
python3 ./test.py -f 1-insert/opentsdb_telnet_line_taosc_insert.py
|
python3 ./test.py -f 1-insert/opentsdb_telnet_line_taosc_insert.py
|
||||||
|
python3 ./test.py -f 1-insert/test_stmt_muti_insert_query.py
|
||||||
|
|
||||||
python3 ./test.py -f 2-query/between.py
|
python3 ./test.py -f 2-query/between.py
|
||||||
python3 ./test.py -f 2-query/distinct.py
|
python3 ./test.py -f 2-query/distinct.py
|
||||||
|
|
|
@ -283,9 +283,7 @@ void dumpTrans(SSdb *pSdb, SJson *json) {
|
||||||
tjsonAddStringToObject(item, "createdTime", i642str(pObj->createdTime));
|
tjsonAddStringToObject(item, "createdTime", i642str(pObj->createdTime));
|
||||||
tjsonAddStringToObject(item, "dbUid", i642str(pObj->dbUid));
|
tjsonAddStringToObject(item, "dbUid", i642str(pObj->dbUid));
|
||||||
tjsonAddStringToObject(item, "dbname", pObj->dbname);
|
tjsonAddStringToObject(item, "dbname", pObj->dbname);
|
||||||
tjsonAddIntegerToObject(item, "redoLogNum", taosArrayGetSize(pObj->redoLogs));
|
tjsonAddIntegerToObject(item, "commitLogNum", taosArrayGetSize(pObj->commitActions));
|
||||||
tjsonAddIntegerToObject(item, "undoLogNum", taosArrayGetSize(pObj->undoLogs));
|
|
||||||
tjsonAddIntegerToObject(item, "commitLogNum", taosArrayGetSize(pObj->commitLogs));
|
|
||||||
tjsonAddIntegerToObject(item, "redoActionNum", taosArrayGetSize(pObj->redoActions));
|
tjsonAddIntegerToObject(item, "redoActionNum", taosArrayGetSize(pObj->redoActions));
|
||||||
tjsonAddIntegerToObject(item, "undoActionNum", taosArrayGetSize(pObj->undoActions));
|
tjsonAddIntegerToObject(item, "undoActionNum", taosArrayGetSize(pObj->undoActions));
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue