fix:conflict from 3.0
This commit is contained in:
commit
187aca4d6b
|
@ -204,65 +204,65 @@
|
||||||
#define TK_SPLIT 186
|
#define TK_SPLIT 186
|
||||||
#define TK_SYNCDB 187
|
#define TK_SYNCDB 187
|
||||||
#define TK_DELETE 188
|
#define TK_DELETE 188
|
||||||
#define TK_NULL 189
|
#define TK_INSERT 189
|
||||||
#define TK_NK_QUESTION 190
|
#define TK_NULL 190
|
||||||
#define TK_NK_ARROW 191
|
#define TK_NK_QUESTION 191
|
||||||
#define TK_ROWTS 192
|
#define TK_NK_ARROW 192
|
||||||
#define TK_TBNAME 193
|
#define TK_ROWTS 193
|
||||||
#define TK_QSTARTTS 194
|
#define TK_TBNAME 194
|
||||||
#define TK_QENDTS 195
|
#define TK_QSTARTTS 195
|
||||||
#define TK_WSTARTTS 196
|
#define TK_QENDTS 196
|
||||||
#define TK_WENDTS 197
|
#define TK_WSTARTTS 197
|
||||||
#define TK_WDURATION 198
|
#define TK_WENDTS 198
|
||||||
#define TK_CAST 199
|
#define TK_WDURATION 199
|
||||||
#define TK_NOW 200
|
#define TK_CAST 200
|
||||||
#define TK_TODAY 201
|
#define TK_NOW 201
|
||||||
#define TK_TIMEZONE 202
|
#define TK_TODAY 202
|
||||||
#define TK_CLIENT_VERSION 203
|
#define TK_TIMEZONE 203
|
||||||
#define TK_SERVER_VERSION 204
|
#define TK_CLIENT_VERSION 204
|
||||||
#define TK_SERVER_STATUS 205
|
#define TK_SERVER_VERSION 205
|
||||||
#define TK_CURRENT_USER 206
|
#define TK_SERVER_STATUS 206
|
||||||
#define TK_COUNT 207
|
#define TK_CURRENT_USER 207
|
||||||
#define TK_LAST_ROW 208
|
#define TK_COUNT 208
|
||||||
#define TK_BETWEEN 209
|
#define TK_LAST_ROW 209
|
||||||
#define TK_IS 210
|
#define TK_BETWEEN 210
|
||||||
#define TK_NK_LT 211
|
#define TK_IS 211
|
||||||
#define TK_NK_GT 212
|
#define TK_NK_LT 212
|
||||||
#define TK_NK_LE 213
|
#define TK_NK_GT 213
|
||||||
#define TK_NK_GE 214
|
#define TK_NK_LE 214
|
||||||
#define TK_NK_NE 215
|
#define TK_NK_GE 215
|
||||||
#define TK_MATCH 216
|
#define TK_NK_NE 216
|
||||||
#define TK_NMATCH 217
|
#define TK_MATCH 217
|
||||||
#define TK_CONTAINS 218
|
#define TK_NMATCH 218
|
||||||
#define TK_JOIN 219
|
#define TK_CONTAINS 219
|
||||||
#define TK_INNER 220
|
#define TK_JOIN 220
|
||||||
#define TK_SELECT 221
|
#define TK_INNER 221
|
||||||
#define TK_DISTINCT 222
|
#define TK_SELECT 222
|
||||||
#define TK_WHERE 223
|
#define TK_DISTINCT 223
|
||||||
#define TK_PARTITION 224
|
#define TK_WHERE 224
|
||||||
#define TK_BY 225
|
#define TK_PARTITION 225
|
||||||
#define TK_SESSION 226
|
#define TK_BY 226
|
||||||
#define TK_STATE_WINDOW 227
|
#define TK_SESSION 227
|
||||||
#define TK_SLIDING 228
|
#define TK_STATE_WINDOW 228
|
||||||
#define TK_FILL 229
|
#define TK_SLIDING 229
|
||||||
#define TK_VALUE 230
|
#define TK_FILL 230
|
||||||
#define TK_NONE 231
|
#define TK_VALUE 231
|
||||||
#define TK_PREV 232
|
#define TK_NONE 232
|
||||||
#define TK_LINEAR 233
|
#define TK_PREV 233
|
||||||
#define TK_NEXT 234
|
#define TK_LINEAR 234
|
||||||
#define TK_HAVING 235
|
#define TK_NEXT 235
|
||||||
#define TK_RANGE 236
|
#define TK_HAVING 236
|
||||||
#define TK_EVERY 237
|
#define TK_RANGE 237
|
||||||
#define TK_ORDER 238
|
#define TK_EVERY 238
|
||||||
#define TK_SLIMIT 239
|
#define TK_ORDER 239
|
||||||
#define TK_SOFFSET 240
|
#define TK_SLIMIT 240
|
||||||
#define TK_LIMIT 241
|
#define TK_SOFFSET 241
|
||||||
#define TK_OFFSET 242
|
#define TK_LIMIT 242
|
||||||
#define TK_ASC 243
|
#define TK_OFFSET 243
|
||||||
#define TK_NULLS 244
|
#define TK_ASC 244
|
||||||
#define TK_ID 245
|
#define TK_NULLS 245
|
||||||
#define TK_NK_BITNOT 246
|
#define TK_ID 246
|
||||||
#define TK_INSERT 247
|
#define TK_NK_BITNOT 247
|
||||||
#define TK_VALUES 248
|
#define TK_VALUES 248
|
||||||
#define TK_IMPORT 249
|
#define TK_IMPORT 249
|
||||||
#define TK_NK_SEMI 250
|
#define TK_NK_SEMI 250
|
||||||
|
|
|
@ -208,7 +208,7 @@ int32_t doFilterTag(const SNode* pFilterNode, SIndexMetaArg* metaArg, SArray* re
|
||||||
* destory index env
|
* destory index env
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void indexCleanUp();
|
void indexCleanup();
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -194,6 +194,7 @@ typedef enum ENodeType {
|
||||||
QUERY_NODE_KILL_QUERY_STMT,
|
QUERY_NODE_KILL_QUERY_STMT,
|
||||||
QUERY_NODE_KILL_TRANSACTION_STMT,
|
QUERY_NODE_KILL_TRANSACTION_STMT,
|
||||||
QUERY_NODE_DELETE_STMT,
|
QUERY_NODE_DELETE_STMT,
|
||||||
|
QUERY_NODE_INSERT_STMT,
|
||||||
QUERY_NODE_QUERY,
|
QUERY_NODE_QUERY,
|
||||||
|
|
||||||
// logic plan node
|
// logic plan node
|
||||||
|
@ -247,6 +248,7 @@ typedef enum ENodeType {
|
||||||
QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC,
|
QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC,
|
||||||
QUERY_NODE_PHYSICAL_PLAN_DISPATCH,
|
QUERY_NODE_PHYSICAL_PLAN_DISPATCH,
|
||||||
QUERY_NODE_PHYSICAL_PLAN_INSERT,
|
QUERY_NODE_PHYSICAL_PLAN_INSERT,
|
||||||
|
QUERY_NODE_PHYSICAL_PLAN_QUERY_INSERT,
|
||||||
QUERY_NODE_PHYSICAL_PLAN_DELETE,
|
QUERY_NODE_PHYSICAL_PLAN_DELETE,
|
||||||
QUERY_NODE_PHYSICAL_SUBPLAN,
|
QUERY_NODE_PHYSICAL_SUBPLAN,
|
||||||
QUERY_NODE_PHYSICAL_PLAN
|
QUERY_NODE_PHYSICAL_PLAN
|
||||||
|
|
|
@ -131,6 +131,7 @@ typedef struct SVnodeModifyLogicNode {
|
||||||
int8_t tableType; // table type
|
int8_t tableType; // table type
|
||||||
char tableFName[TSDB_TABLE_FNAME_LEN];
|
char tableFName[TSDB_TABLE_FNAME_LEN];
|
||||||
STimeWindow deleteTimeRange;
|
STimeWindow deleteTimeRange;
|
||||||
|
SVgroupsInfo* pVgroupList;
|
||||||
} SVnodeModifyLogicNode;
|
} SVnodeModifyLogicNode;
|
||||||
|
|
||||||
typedef struct SExchangeLogicNode {
|
typedef struct SExchangeLogicNode {
|
||||||
|
@ -456,6 +457,15 @@ typedef struct SDataInserterNode {
|
||||||
char* pData;
|
char* pData;
|
||||||
} SDataInserterNode;
|
} SDataInserterNode;
|
||||||
|
|
||||||
|
typedef struct SQueryInserterNode {
|
||||||
|
SDataSinkNode sink;
|
||||||
|
uint64_t tableId;
|
||||||
|
int8_t tableType; // table type
|
||||||
|
char tableFName[TSDB_TABLE_FNAME_LEN];
|
||||||
|
int32_t vgId;
|
||||||
|
SEpSet epSet;
|
||||||
|
} SQueryInserterNode;
|
||||||
|
|
||||||
typedef struct SDataDeleterNode {
|
typedef struct SDataDeleterNode {
|
||||||
SDataSinkNode sink;
|
SDataSinkNode sink;
|
||||||
uint64_t tableId;
|
uint64_t tableId;
|
||||||
|
|
|
@ -302,6 +302,14 @@ typedef struct SDeleteStmt {
|
||||||
bool deleteZeroRows;
|
bool deleteZeroRows;
|
||||||
} SDeleteStmt;
|
} SDeleteStmt;
|
||||||
|
|
||||||
|
typedef struct SInsertStmt {
|
||||||
|
ENodeType type; // QUERY_NODE_INSERT_STMT
|
||||||
|
SNode* pTable;
|
||||||
|
SNodeList* pCols;
|
||||||
|
SNode* pQuery;
|
||||||
|
uint8_t precision;
|
||||||
|
} SInsertStmt;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
PAYLOAD_TYPE_KV = 0,
|
PAYLOAD_TYPE_KV = 0,
|
||||||
PAYLOAD_TYPE_RAW = 1,
|
PAYLOAD_TYPE_RAW = 1,
|
||||||
|
|
|
@ -56,7 +56,7 @@ typedef struct SParseContext {
|
||||||
} SParseContext;
|
} SParseContext;
|
||||||
|
|
||||||
int32_t qParseSql(SParseContext* pCxt, SQuery** pQuery);
|
int32_t qParseSql(SParseContext* pCxt, SQuery** pQuery);
|
||||||
bool qIsInsertSql(const char* pStr, size_t length);
|
bool qIsInsertValuesSql(const char* pStr, size_t length);
|
||||||
|
|
||||||
// for async mode
|
// for async mode
|
||||||
int32_t qParseSqlSyntax(SParseContext* pCxt, SQuery** pQuery, struct SCatalogReq* pCatalogReq);
|
int32_t qParseSqlSyntax(SParseContext* pCxt, SQuery** pQuery, struct SCatalogReq* pCatalogReq);
|
||||||
|
|
|
@ -26,7 +26,7 @@ extern "C" {
|
||||||
|
|
||||||
extern bool gRaftDetailLog;
|
extern bool gRaftDetailLog;
|
||||||
|
|
||||||
#define SYNC_MAX_BATCH_SIZE 100
|
#define SYNC_MAX_BATCH_SIZE 500
|
||||||
#define SYNC_INDEX_BEGIN 0
|
#define SYNC_INDEX_BEGIN 0
|
||||||
#define SYNC_INDEX_INVALID -1
|
#define SYNC_INDEX_INVALID -1
|
||||||
#define SYNC_TERM_INVALID 0xFFFFFFFFFFFFFFFF
|
#define SYNC_TERM_INVALID 0xFFFFFFFFFFFFFFFF
|
||||||
|
|
|
@ -396,8 +396,7 @@ int32_t stmtGetFromCache(STscStmt* pStmt) {
|
||||||
.requestId = pStmt->exec.pRequest->requestId,
|
.requestId = pStmt->exec.pRequest->requestId,
|
||||||
.requestObjRefId = pStmt->exec.pRequest->self,
|
.requestObjRefId = pStmt->exec.pRequest->self,
|
||||||
.mgmtEps = getEpSet_s(&pStmt->taos->pAppInfo->mgmtEp)};
|
.mgmtEps = getEpSet_s(&pStmt->taos->pAppInfo->mgmtEp)};
|
||||||
int32_t code =
|
int32_t code = catalogGetTableMeta(pStmt->pCatalog, &conn, &pStmt->bInfo.sname, &pTableMeta);
|
||||||
catalogGetTableMeta(pStmt->pCatalog, &conn, &pStmt->bInfo.sname, &pTableMeta);
|
|
||||||
if (TSDB_CODE_PAR_TABLE_NOT_EXIST == code) {
|
if (TSDB_CODE_PAR_TABLE_NOT_EXIST == code) {
|
||||||
STMT_ERR_RET(stmtCleanBindInfo(pStmt));
|
STMT_ERR_RET(stmtCleanBindInfo(pStmt));
|
||||||
|
|
||||||
|
@ -849,7 +848,7 @@ int stmtIsInsert(TAOS_STMT* stmt, int* insert) {
|
||||||
if (pStmt->sql.type) {
|
if (pStmt->sql.type) {
|
||||||
*insert = (STMT_TYPE_INSERT == pStmt->sql.type || STMT_TYPE_MULTI_INSERT == pStmt->sql.type);
|
*insert = (STMT_TYPE_INSERT == pStmt->sql.type || STMT_TYPE_MULTI_INSERT == pStmt->sql.type);
|
||||||
} else {
|
} else {
|
||||||
*insert = qIsInsertSql(pStmt->sql.sqlStr, 0);
|
*insert = qIsInsertValuesSql(pStmt->sql.sqlStr, pStmt->sql.sqlLen);
|
||||||
}
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -919,7 +918,6 @@ int stmtGetColFields(TAOS_STMT* stmt, int* nums, TAOS_FIELD_E** fields) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int stmtGetParamNum(TAOS_STMT* stmt, int* nums) {
|
int stmtGetParamNum(TAOS_STMT* stmt, int* nums) {
|
||||||
STscStmt* pStmt = (STscStmt*)stmt;
|
STscStmt* pStmt = (STscStmt*)stmt;
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#define _DEFAULT_SOURCE
|
#define _DEFAULT_SOURCE
|
||||||
#include "dmMgmt.h"
|
#include "dmMgmt.h"
|
||||||
#include "dmNodes.h"
|
#include "dmNodes.h"
|
||||||
|
#include "index.h"
|
||||||
#include "qworker.h"
|
#include "qworker.h"
|
||||||
|
|
||||||
static bool dmRequireNode(SDnode *pDnode, SMgmtWrapper *pWrapper) {
|
static bool dmRequireNode(SDnode *pDnode, SMgmtWrapper *pWrapper) {
|
||||||
|
@ -213,6 +214,7 @@ void dmCleanupDnode(SDnode *pDnode) {
|
||||||
dmCleanupServer(pDnode);
|
dmCleanupServer(pDnode);
|
||||||
dmClearVars(pDnode);
|
dmClearVars(pDnode);
|
||||||
rpcCleanup();
|
rpcCleanup();
|
||||||
|
indexCleanup();
|
||||||
dDebug("dnode is closed, ptr:%p", pDnode);
|
dDebug("dnode is closed, ptr:%p", pDnode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1373,9 +1373,9 @@ char *buildRetension(SArray *pRetension) {
|
||||||
static void dumpDbInfoData(SSDataBlock *pBlock, SDbObj *pDb, SShowObj *pShow, int32_t rows, int64_t numOfTables,
|
static void dumpDbInfoData(SSDataBlock *pBlock, SDbObj *pDb, SShowObj *pShow, int32_t rows, int64_t numOfTables,
|
||||||
bool sysDb, ESdbStatus objStatus, bool sysinfo) {
|
bool sysDb, ESdbStatus objStatus, bool sysinfo) {
|
||||||
int32_t cols = 0;
|
int32_t cols = 0;
|
||||||
|
|
||||||
int32_t bytes = pShow->pMeta->pSchemas[cols].bytes;
|
int32_t bytes = pShow->pMeta->pSchemas[cols].bytes;
|
||||||
char *buf = taosMemoryMalloc(bytes);
|
char *buf = taosMemoryMalloc(bytes);
|
||||||
|
|
||||||
const char *name = mndGetDbStr(pDb->name);
|
const char *name = mndGetDbStr(pDb->name);
|
||||||
if (name != NULL) {
|
if (name != NULL) {
|
||||||
STR_WITH_MAXSIZE_TO_VARSTR(buf, name, bytes);
|
STR_WITH_MAXSIZE_TO_VARSTR(buf, name, bytes);
|
||||||
|
@ -1383,11 +1383,11 @@ static void dumpDbInfoData(SSDataBlock *pBlock, SDbObj *pDb, SShowObj *pShow, in
|
||||||
STR_WITH_MAXSIZE_TO_VARSTR(buf, "NULL", bytes);
|
STR_WITH_MAXSIZE_TO_VARSTR(buf, "NULL", bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
char *status = "ready";
|
char *statusStr = "ready";
|
||||||
if (objStatus == SDB_STATUS_CREATING) status = "creating";
|
if (objStatus == SDB_STATUS_CREATING) statusStr = "creating";
|
||||||
if (objStatus == SDB_STATUS_DROPPING) status = "dropping";
|
if (objStatus == SDB_STATUS_DROPPING) statusStr = "dropping";
|
||||||
char statusB[24] = {0};
|
char statusVstr[24] = {0};
|
||||||
STR_WITH_SIZE_TO_VARSTR(statusB, status, strlen(status));
|
STR_WITH_SIZE_TO_VARSTR(statusVstr, statusStr, strlen(statusStr));
|
||||||
|
|
||||||
if (sysDb || !sysinfo) {
|
if (sysDb || !sysinfo) {
|
||||||
for (int32_t i = 0; i < pShow->numOfColumns; ++i) {
|
for (int32_t i = 0; i < pShow->numOfColumns; ++i) {
|
||||||
|
@ -1397,7 +1397,7 @@ static void dumpDbInfoData(SSDataBlock *pBlock, SDbObj *pDb, SShowObj *pShow, in
|
||||||
} else if (i == 3) {
|
} else if (i == 3) {
|
||||||
colDataAppend(pColInfo, rows, (const char *)&numOfTables, false);
|
colDataAppend(pColInfo, rows, (const char *)&numOfTables, false);
|
||||||
} else if (i == 20) {
|
} else if (i == 20) {
|
||||||
colDataAppend(pColInfo, rows, statusB, false);
|
colDataAppend(pColInfo, rows, statusVstr, false);
|
||||||
} else {
|
} else {
|
||||||
colDataAppendNULL(pColInfo, rows);
|
colDataAppendNULL(pColInfo, rows);
|
||||||
}
|
}
|
||||||
|
@ -1405,7 +1405,6 @@ static void dumpDbInfoData(SSDataBlock *pBlock, SDbObj *pDb, SShowObj *pShow, in
|
||||||
} else {
|
} else {
|
||||||
SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
colDataAppend(pColInfo, rows, buf, false);
|
colDataAppend(pColInfo, rows, buf, false);
|
||||||
taosMemoryFree(buf);
|
|
||||||
|
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
colDataAppend(pColInfo, rows, (const char *)&pDb->createdTime, false);
|
colDataAppend(pColInfo, rows, (const char *)&pDb->createdTime, false);
|
||||||
|
@ -1419,30 +1418,29 @@ static void dumpDbInfoData(SSDataBlock *pBlock, SDbObj *pDb, SShowObj *pShow, in
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.replications, false);
|
colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.replications, false);
|
||||||
|
|
||||||
const char *src = pDb->cfg.strict ? "strict" : "no_strict";
|
const char *strictStr = pDb->cfg.strict ? "strict" : "no_strict";
|
||||||
char strict[24] = {0};
|
char strictVstr[24] = {0};
|
||||||
STR_WITH_SIZE_TO_VARSTR(strict, src, strlen(src));
|
STR_WITH_SIZE_TO_VARSTR(strictVstr, strictStr, strlen(strictStr));
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
colDataAppend(pColInfo, rows, (const char *)strict, false);
|
colDataAppend(pColInfo, rows, (const char *)strictVstr, false);
|
||||||
|
|
||||||
char tmp[128] = {0};
|
char durationVstr[128] = {0};
|
||||||
int32_t len = 0;
|
int32_t len = sprintf(&durationVstr[VARSTR_HEADER_SIZE], "%dm", pDb->cfg.daysPerFile);
|
||||||
len = sprintf(&tmp[VARSTR_HEADER_SIZE], "%dm", pDb->cfg.daysPerFile);
|
varDataSetLen(durationVstr, len);
|
||||||
varDataSetLen(tmp, len);
|
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
colDataAppend(pColInfo, rows, (const char *)tmp, false);
|
colDataAppend(pColInfo, rows, (const char *)durationVstr, false);
|
||||||
|
|
||||||
|
char keepVstr[128] = {0};
|
||||||
if (pDb->cfg.daysToKeep0 > pDb->cfg.daysToKeep1 || pDb->cfg.daysToKeep0 > pDb->cfg.daysToKeep2) {
|
if (pDb->cfg.daysToKeep0 > pDb->cfg.daysToKeep1 || pDb->cfg.daysToKeep0 > pDb->cfg.daysToKeep2) {
|
||||||
len = sprintf(&tmp[VARSTR_HEADER_SIZE], "%dm,%dm,%dm", pDb->cfg.daysToKeep1, pDb->cfg.daysToKeep2,
|
len = sprintf(&keepVstr[VARSTR_HEADER_SIZE], "%dm,%dm,%dm", pDb->cfg.daysToKeep1, pDb->cfg.daysToKeep2,
|
||||||
pDb->cfg.daysToKeep0);
|
pDb->cfg.daysToKeep0);
|
||||||
} else {
|
} else {
|
||||||
len = sprintf(&tmp[VARSTR_HEADER_SIZE], "%dm,%dm,%dm", pDb->cfg.daysToKeep0, pDb->cfg.daysToKeep1,
|
len = sprintf(&keepVstr[VARSTR_HEADER_SIZE], "%dm,%dm,%dm", pDb->cfg.daysToKeep0, pDb->cfg.daysToKeep1,
|
||||||
pDb->cfg.daysToKeep2);
|
pDb->cfg.daysToKeep2);
|
||||||
}
|
}
|
||||||
|
varDataSetLen(keepVstr, len);
|
||||||
varDataSetLen(tmp, len);
|
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
colDataAppend(pColInfo, rows, (const char *)tmp, false);
|
colDataAppend(pColInfo, rows, (const char *)keepVstr, false);
|
||||||
|
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.buffer, false);
|
colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.buffer, false);
|
||||||
|
@ -1469,68 +1467,49 @@ static void dumpDbInfoData(SSDataBlock *pBlock, SDbObj *pDb, SShowObj *pShow, in
|
||||||
colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.compression, false);
|
colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.compression, false);
|
||||||
|
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
|
|
||||||
STR_WITH_SIZE_TO_VARSTR(strict, src, strlen(src));
|
|
||||||
#if 0
|
|
||||||
char cacheModel[24] = {0};
|
|
||||||
bool null = false;
|
|
||||||
if (pDb->cfg.cacheLastRow == 0) {
|
|
||||||
STR_TO_VARSTR(cacheModel, "no_cache");
|
|
||||||
} else if (pDb->cfg.cacheLastRow == 1) {
|
|
||||||
STR_TO_VARSTR(cacheModel, "last_row_cache")
|
|
||||||
} else {
|
|
||||||
null = true;
|
|
||||||
}
|
|
||||||
colDataAppend(pColInfo, rows, cacheModel, null);
|
|
||||||
#endif
|
|
||||||
colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.cacheLastRow, false);
|
colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.cacheLastRow, false);
|
||||||
|
|
||||||
char *prec = NULL;
|
const char *precStr = NULL;
|
||||||
switch (pDb->cfg.precision) {
|
switch (pDb->cfg.precision) {
|
||||||
case TSDB_TIME_PRECISION_MILLI:
|
case TSDB_TIME_PRECISION_MILLI:
|
||||||
prec = TSDB_TIME_PRECISION_MILLI_STR;
|
precStr = TSDB_TIME_PRECISION_MILLI_STR;
|
||||||
break;
|
break;
|
||||||
case TSDB_TIME_PRECISION_MICRO:
|
case TSDB_TIME_PRECISION_MICRO:
|
||||||
prec = TSDB_TIME_PRECISION_MICRO_STR;
|
precStr = TSDB_TIME_PRECISION_MICRO_STR;
|
||||||
break;
|
break;
|
||||||
case TSDB_TIME_PRECISION_NANO:
|
case TSDB_TIME_PRECISION_NANO:
|
||||||
prec = TSDB_TIME_PRECISION_NANO_STR;
|
precStr = TSDB_TIME_PRECISION_NANO_STR;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
prec = "none";
|
precStr = "none";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
char precVstr[10] = {0};
|
||||||
char t[10] = {0};
|
STR_WITH_SIZE_TO_VARSTR(precVstr, precStr, 2);
|
||||||
STR_WITH_SIZE_TO_VARSTR(t, prec, 2);
|
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
colDataAppend(pColInfo, rows, (const char *)t, false);
|
colDataAppend(pColInfo, rows, (const char *)precVstr, false);
|
||||||
|
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.numOfStables, false);
|
colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.numOfStables, false);
|
||||||
|
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
colDataAppend(pColInfo, rows, (const char *)statusB, false);
|
colDataAppend(pColInfo, rows, (const char *)statusVstr, false);
|
||||||
|
|
||||||
// pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
|
||||||
// colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.schemaless, false);
|
|
||||||
|
|
||||||
char *p = buildRetension(pDb->cfg.pRetensions);
|
|
||||||
|
|
||||||
|
char *rentensionVstr = buildRetension(pDb->cfg.pRetensions);
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
|
||||||
if (p == NULL) {
|
if (rentensionVstr == NULL) {
|
||||||
colDataAppendNULL(pColInfo, rows);
|
colDataAppendNULL(pColInfo, rows);
|
||||||
} else {
|
} else {
|
||||||
colDataAppend(pColInfo, rows, (const char *)p, false);
|
colDataAppend(pColInfo, rows, (const char *)rentensionVstr, false);
|
||||||
taosMemoryFree(p);
|
taosMemoryFree(rentensionVstr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
taosMemoryFree(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setInformationSchemaDbCfg(SDbObj *pDbObj) {
|
static void setInformationSchemaDbCfg(SDbObj *pDbObj) {
|
||||||
ASSERT(pDbObj != NULL);
|
tstrncpy(pDbObj->name, TSDB_INFORMATION_SCHEMA_DB, tListLen(pDbObj->name));
|
||||||
strncpy(pDbObj->name, TSDB_INFORMATION_SCHEMA_DB, tListLen(pDbObj->name));
|
|
||||||
|
|
||||||
pDbObj->createdTime = 0;
|
pDbObj->createdTime = 0;
|
||||||
pDbObj->cfg.numOfVgroups = 0;
|
pDbObj->cfg.numOfVgroups = 0;
|
||||||
pDbObj->cfg.strict = 1;
|
pDbObj->cfg.strict = 1;
|
||||||
|
@ -1539,9 +1518,7 @@ static void setInformationSchemaDbCfg(SDbObj *pDbObj) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setPerfSchemaDbCfg(SDbObj *pDbObj) {
|
static void setPerfSchemaDbCfg(SDbObj *pDbObj) {
|
||||||
ASSERT(pDbObj != NULL);
|
tstrncpy(pDbObj->name, TSDB_PERFORMANCE_SCHEMA_DB, tListLen(pDbObj->name));
|
||||||
strncpy(pDbObj->name, TSDB_PERFORMANCE_SCHEMA_DB, tListLen(pDbObj->name));
|
|
||||||
|
|
||||||
pDbObj->createdTime = 0;
|
pDbObj->createdTime = 0;
|
||||||
pDbObj->cfg.numOfVgroups = 0;
|
pDbObj->cfg.numOfVgroups = 0;
|
||||||
pDbObj->cfg.strict = 1;
|
pDbObj->cfg.strict = 1;
|
||||||
|
@ -1585,14 +1562,11 @@ static int32_t mndRetrieveDbs(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBloc
|
||||||
|
|
||||||
while (numOfRows < rowsCapacity) {
|
while (numOfRows < rowsCapacity) {
|
||||||
pShow->pIter = sdbFetchAll(pSdb, SDB_DB, pShow->pIter, (void **)&pDb, &objStatus);
|
pShow->pIter = sdbFetchAll(pSdb, SDB_DB, pShow->pIter, (void **)&pDb, &objStatus);
|
||||||
if (pShow->pIter == NULL) {
|
if (pShow->pIter == NULL) break;
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_READ_OR_WRITE_DB, pDb) == 0) {
|
if (mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_READ_OR_WRITE_DB, pDb) == 0) {
|
||||||
int32_t numOfTables = 0;
|
int32_t numOfTables = 0;
|
||||||
sdbTraverse(pSdb, SDB_VGROUP, mndGetTablesOfDbFp, &numOfTables, NULL, NULL);
|
sdbTraverse(pSdb, SDB_VGROUP, mndGetTablesOfDbFp, &numOfTables, NULL, NULL);
|
||||||
|
|
||||||
dumpDbInfoData(pBlock, pDb, pShow, numOfRows, numOfTables, false, objStatus, sysinfo);
|
dumpDbInfoData(pBlock, pDb, pShow, numOfRows, numOfTables, false, objStatus, sysinfo);
|
||||||
numOfRows++;
|
numOfRows++;
|
||||||
}
|
}
|
||||||
|
|
|
@ -240,7 +240,7 @@ typedef struct SColMatchInfo {
|
||||||
int32_t srcSlotId; // source slot id
|
int32_t srcSlotId; // source slot id
|
||||||
int32_t colId;
|
int32_t colId;
|
||||||
int32_t targetSlotId;
|
int32_t targetSlotId;
|
||||||
bool output;
|
bool output; // todo remove this?
|
||||||
bool reserved;
|
bool reserved;
|
||||||
int32_t matchType; // determinate the source according to col id or slot id
|
int32_t matchType; // determinate the source according to col id or slot id
|
||||||
} SColMatchInfo;
|
} SColMatchInfo;
|
||||||
|
@ -479,6 +479,8 @@ typedef struct SAggOperatorInfo {
|
||||||
uint64_t groupId;
|
uint64_t groupId;
|
||||||
SGroupResInfo groupResInfo;
|
SGroupResInfo groupResInfo;
|
||||||
SExprSupp scalarExprSup;
|
SExprSupp scalarExprSup;
|
||||||
|
|
||||||
|
SNode *pCondition;
|
||||||
} SAggOperatorInfo;
|
} SAggOperatorInfo;
|
||||||
|
|
||||||
typedef struct SProjectOperatorInfo {
|
typedef struct SProjectOperatorInfo {
|
||||||
|
@ -680,6 +682,8 @@ typedef struct SSortOperatorInfo {
|
||||||
|
|
||||||
int64_t startTs; // sort start time
|
int64_t startTs; // sort start time
|
||||||
uint64_t sortElapsed; // sort elapsed time, time to flush to disk not included.
|
uint64_t sortElapsed; // sort elapsed time, time to flush to disk not included.
|
||||||
|
|
||||||
|
SNode* pCondition;
|
||||||
} SSortOperatorInfo;
|
} SSortOperatorInfo;
|
||||||
|
|
||||||
typedef struct STagFilterOperatorInfo {
|
typedef struct STagFilterOperatorInfo {
|
||||||
|
@ -758,7 +762,7 @@ SOperatorInfo* createTagScanOperatorInfo(SReadHandle* pReadHandle, STagScanPhysi
|
||||||
STableListInfo* pTableListInfo, SExecTaskInfo* pTaskInfo);
|
STableListInfo* pTableListInfo, SExecTaskInfo* pTaskInfo);
|
||||||
SOperatorInfo* createSysTableScanOperatorInfo(void* readHandle, SSystemTableScanPhysiNode *pScanPhyNode, const char* pUser, SExecTaskInfo* pTaskInfo);
|
SOperatorInfo* createSysTableScanOperatorInfo(void* readHandle, SSystemTableScanPhysiNode *pScanPhyNode, const char* pUser, SExecTaskInfo* pTaskInfo);
|
||||||
|
|
||||||
SOperatorInfo* createAggregateOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols, SSDataBlock* pResultBlock, SExprInfo* pScalarExprInfo,
|
SOperatorInfo* createAggregateOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols, SSDataBlock* pResultBlock, SNode* pCondition, SExprInfo* pScalarExprInfo,
|
||||||
int32_t numOfScalarExpr, SExecTaskInfo* pTaskInfo);
|
int32_t numOfScalarExpr, SExecTaskInfo* pTaskInfo);
|
||||||
|
|
||||||
SOperatorInfo* createIndefinitOutputOperatorInfo(SOperatorInfo* downstream, SPhysiNode *pNode, SExecTaskInfo* pTaskInfo);
|
SOperatorInfo* createIndefinitOutputOperatorInfo(SOperatorInfo* downstream, SPhysiNode *pNode, SExecTaskInfo* pTaskInfo);
|
||||||
|
|
|
@ -700,7 +700,7 @@ void relocateColumnData(SSDataBlock* pBlock, const SArray* pColMatchInfo, SArray
|
||||||
while (i < numOfSrcCols && j < taosArrayGetSize(pColMatchInfo)) {
|
while (i < numOfSrcCols && j < taosArrayGetSize(pColMatchInfo)) {
|
||||||
SColumnInfoData* p = taosArrayGet(pCols, i);
|
SColumnInfoData* p = taosArrayGet(pCols, i);
|
||||||
SColMatchInfo* pmInfo = taosArrayGet(pColMatchInfo, j);
|
SColMatchInfo* pmInfo = taosArrayGet(pColMatchInfo, j);
|
||||||
if (!outputEveryColumn && !pmInfo->output) {
|
if (!outputEveryColumn && pmInfo->reserved) {
|
||||||
j++;
|
j++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3012,11 +3012,19 @@ static SSDataBlock* getAggregateResult(SOperatorInfo* pOperator) {
|
||||||
}
|
}
|
||||||
|
|
||||||
blockDataEnsureCapacity(pInfo->pRes, pOperator->resultInfo.capacity);
|
blockDataEnsureCapacity(pInfo->pRes, pOperator->resultInfo.capacity);
|
||||||
|
while (1) {
|
||||||
doBuildResultDatablock(pOperator, pInfo, &pAggInfo->groupResInfo, pAggInfo->aggSup.pResultBuf);
|
doBuildResultDatablock(pOperator, pInfo, &pAggInfo->groupResInfo, pAggInfo->aggSup.pResultBuf);
|
||||||
if (pInfo->pRes->info.rows == 0 || !hasDataInGroupInfo(&pAggInfo->groupResInfo)) {
|
doFilter(pAggInfo->pCondition, pInfo->pRes);
|
||||||
|
|
||||||
|
if (!hasDataInGroupInfo(&pAggInfo->groupResInfo)) {
|
||||||
doSetOperatorCompleted(pOperator);
|
doSetOperatorCompleted(pOperator);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pInfo->pRes->info.rows > 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
size_t rows = blockDataGetNumOfRows(pInfo->pRes);
|
size_t rows = blockDataGetNumOfRows(pInfo->pRes);
|
||||||
pOperator->resultInfo.totalRows += rows;
|
pOperator->resultInfo.totalRows += rows;
|
||||||
|
|
||||||
|
@ -3557,7 +3565,7 @@ int32_t initExprSupp(SExprSupp* pSup, SExprInfo* pExprInfo, int32_t numOfExpr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SOperatorInfo* createAggregateOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols,
|
SOperatorInfo* createAggregateOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols,
|
||||||
SSDataBlock* pResultBlock, SExprInfo* pScalarExprInfo,
|
SSDataBlock* pResultBlock, SNode* pCondition, SExprInfo* pScalarExprInfo,
|
||||||
int32_t numOfScalarExpr, SExecTaskInfo* pTaskInfo) {
|
int32_t numOfScalarExpr, SExecTaskInfo* pTaskInfo) {
|
||||||
SAggOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SAggOperatorInfo));
|
SAggOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SAggOperatorInfo));
|
||||||
SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
|
SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
|
||||||
|
@ -3581,6 +3589,7 @@ SOperatorInfo* createAggregateOperatorInfo(SOperatorInfo* downstream, SExprInfo*
|
||||||
}
|
}
|
||||||
|
|
||||||
pInfo->groupId = INT32_MIN;
|
pInfo->groupId = INT32_MIN;
|
||||||
|
pInfo->pCondition = pCondition;
|
||||||
pOperator->name = "TableAggregate";
|
pOperator->name = "TableAggregate";
|
||||||
pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_HASH_AGG;
|
pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_HASH_AGG;
|
||||||
pOperator->blocking = true;
|
pOperator->blocking = true;
|
||||||
|
@ -4328,7 +4337,7 @@ SOperatorInfo* createOperatorTree(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo
|
||||||
pScalarExprInfo, numOfScalarExpr, pTaskInfo);
|
pScalarExprInfo, numOfScalarExpr, pTaskInfo);
|
||||||
} else {
|
} else {
|
||||||
pOptr =
|
pOptr =
|
||||||
createAggregateOperatorInfo(ops[0], pExprInfo, num, pResBlock, pScalarExprInfo, numOfScalarExpr, pTaskInfo);
|
createAggregateOperatorInfo(ops[0], pExprInfo, num, pResBlock, pAggNode->node.pConditions, pScalarExprInfo, numOfScalarExpr, pTaskInfo);
|
||||||
}
|
}
|
||||||
} else if (QUERY_NODE_PHYSICAL_PLAN_HASH_INTERVAL == type || QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERVAL == type) {
|
} else if (QUERY_NODE_PHYSICAL_PLAN_HASH_INTERVAL == type || QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERVAL == type) {
|
||||||
SIntervalPhysiNode* pIntervalPhyNode = (SIntervalPhysiNode*)pPhyNode;
|
SIntervalPhysiNode* pIntervalPhyNode = (SIntervalPhysiNode*)pPhyNode;
|
||||||
|
|
|
@ -46,7 +46,7 @@ SOperatorInfo* createSortOperatorInfo(SOperatorInfo* downstream, SSortPhysiNode*
|
||||||
initResultSizeInfo(pOperator, 1024);
|
initResultSizeInfo(pOperator, 1024);
|
||||||
|
|
||||||
pInfo->pSortInfo = createSortInfo(pSortPhyNode->pSortKeys);
|
pInfo->pSortInfo = createSortInfo(pSortPhyNode->pSortKeys);
|
||||||
;
|
pInfo->pCondition = pSortPhyNode->node.pConditions;
|
||||||
pInfo->pColMatchInfo = pColMatchColInfo;
|
pInfo->pColMatchInfo = pColMatchColInfo;
|
||||||
pOperator->name = "SortOperator";
|
pOperator->name = "SortOperator";
|
||||||
pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_SORT;
|
pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_SORT;
|
||||||
|
@ -205,14 +205,27 @@ SSDataBlock* doSort(SOperatorInfo* pOperator) {
|
||||||
longjmp(pTaskInfo->env, code);
|
longjmp(pTaskInfo->env, code);
|
||||||
}
|
}
|
||||||
|
|
||||||
SSDataBlock* pBlock = getSortedBlockData(pInfo->pSortHandle, pInfo->binfo.pRes, pOperator->resultInfo.capacity,
|
SSDataBlock* pBlock = NULL;
|
||||||
|
while (1) {
|
||||||
|
pBlock = getSortedBlockData(pInfo->pSortHandle, pInfo->binfo.pRes, pOperator->resultInfo.capacity,
|
||||||
pInfo->pColMatchInfo, pInfo);
|
pInfo->pColMatchInfo, pInfo);
|
||||||
|
if (pBlock != NULL) {
|
||||||
|
doFilter(pInfo->pCondition, pBlock);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pBlock == NULL) {
|
||||||
|
doSetOperatorCompleted(pOperator);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (blockDataGetNumOfRows(pBlock) > 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (pBlock != NULL) {
|
if (pBlock != NULL) {
|
||||||
pOperator->resultInfo.totalRows += pBlock->info.rows;
|
pOperator->resultInfo.totalRows += pBlock->info.rows;
|
||||||
} else {
|
|
||||||
doSetOperatorCompleted(pOperator);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return pBlock;
|
return pBlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -605,7 +605,7 @@ static int32_t translateTopBot(SFunctionNode* pFunc, char* pErrBuf, int32_t len)
|
||||||
}
|
}
|
||||||
|
|
||||||
SValueNode* pValue = (SValueNode*)pParamNode1;
|
SValueNode* pValue = (SValueNode*)pParamNode1;
|
||||||
if (pValue->node.resType.type != TSDB_DATA_TYPE_BIGINT) {
|
if (!IS_INTEGER_TYPE(pValue->node.resType.type)) {
|
||||||
return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
|
return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1615,26 +1615,27 @@ static int32_t translateSubstr(SFunctionNode* pFunc, char* pErrBuf, int32_t len)
|
||||||
}
|
}
|
||||||
|
|
||||||
SExprNode* pPara0 = (SExprNode*)nodesListGetNode(pFunc->pParameterList, 0);
|
SExprNode* pPara0 = (SExprNode*)nodesListGetNode(pFunc->pParameterList, 0);
|
||||||
SExprNode* p1 = (SExprNode*)nodesListGetNode(pFunc->pParameterList, 1);
|
SExprNode* pPara1 = (SExprNode*)nodesListGetNode(pFunc->pParameterList, 1);
|
||||||
|
|
||||||
uint8_t para1Type = p1->resType.type;
|
uint8_t para0Type = pPara0->resType.type;
|
||||||
if (!IS_VAR_DATA_TYPE(pPara0->resType.type) || !IS_INTEGER_TYPE(para1Type)) {
|
uint8_t para1Type = pPara1->resType.type;
|
||||||
|
if (!IS_VAR_DATA_TYPE(para0Type) || !IS_INTEGER_TYPE(para1Type)) {
|
||||||
return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
|
return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (((SValueNode*)p1)->datum.i < 1) {
|
if (((SValueNode*)pPara1)->datum.i == 0) {
|
||||||
return invaildFuncParaValueErrMsg(pErrBuf, len, pFunc->functionName);
|
return invaildFuncParaValueErrMsg(pErrBuf, len, pFunc->functionName);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (3 == numOfParams) {
|
if (3 == numOfParams) {
|
||||||
SExprNode* p2 = (SExprNode*)nodesListGetNode(pFunc->pParameterList, 2);
|
SExprNode* pPara2 = (SExprNode*)nodesListGetNode(pFunc->pParameterList, 2);
|
||||||
uint8_t para2Type = p2->resType.type;
|
uint8_t para2Type = pPara2->resType.type;
|
||||||
if (!IS_INTEGER_TYPE(para2Type)) {
|
if (!IS_INTEGER_TYPE(para2Type)) {
|
||||||
return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
|
return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t v = ((SValueNode*)p1)->datum.i;
|
int64_t v = ((SValueNode*)pPara2)->datum.i;
|
||||||
if (v < 0 || v > INT16_MAX) {
|
if (v < 0) {
|
||||||
return invaildFuncParaValueErrMsg(pErrBuf, len, pFunc->functionName);
|
return invaildFuncParaValueErrMsg(pErrBuf, len, pFunc->functionName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -92,10 +92,12 @@ typedef struct SStddevRes {
|
||||||
union {
|
union {
|
||||||
double quadraticDSum;
|
double quadraticDSum;
|
||||||
int64_t quadraticISum;
|
int64_t quadraticISum;
|
||||||
|
uint64_t quadraticUSum;
|
||||||
};
|
};
|
||||||
union {
|
union {
|
||||||
double dsum;
|
double dsum;
|
||||||
int64_t isum;
|
int64_t isum;
|
||||||
|
uint64_t usum;
|
||||||
};
|
};
|
||||||
int16_t type;
|
int16_t type;
|
||||||
} SStddevRes;
|
} SStddevRes;
|
||||||
|
@ -1729,6 +1731,68 @@ int32_t stddevFunction(SqlFunctionCtx* pCtx) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_UTINYINT: {
|
||||||
|
uint8_t* plist = (uint8_t*)pCol->pData;
|
||||||
|
for (int32_t i = start; i < numOfRows + start; ++i) {
|
||||||
|
if (pCol->hasNull && colDataIsNull_f(pCol->nullbitmap, i)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
numOfElem += 1;
|
||||||
|
pStddevRes->count += 1;
|
||||||
|
pStddevRes->usum += plist[i];
|
||||||
|
pStddevRes->quadraticISum += plist[i] * plist[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_USMALLINT: {
|
||||||
|
uint16_t* plist = (uint16_t*)pCol->pData;
|
||||||
|
for (int32_t i = start; i < numOfRows + pInput->startRowIndex; ++i) {
|
||||||
|
if (pCol->hasNull && colDataIsNull_f(pCol->nullbitmap, i)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
numOfElem += 1;
|
||||||
|
pStddevRes->count += 1;
|
||||||
|
pStddevRes->usum += plist[i];
|
||||||
|
pStddevRes->quadraticISum += plist[i] * plist[i];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_UINT: {
|
||||||
|
uint32_t* plist = (uint32_t*)pCol->pData;
|
||||||
|
for (int32_t i = start; i < numOfRows + pInput->startRowIndex; ++i) {
|
||||||
|
if (pCol->hasNull && colDataIsNull_f(pCol->nullbitmap, i)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
numOfElem += 1;
|
||||||
|
pStddevRes->count += 1;
|
||||||
|
pStddevRes->usum += plist[i];
|
||||||
|
pStddevRes->quadraticISum += plist[i] * plist[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_UBIGINT: {
|
||||||
|
uint64_t* plist = (uint64_t*)pCol->pData;
|
||||||
|
for (int32_t i = start; i < numOfRows + pInput->startRowIndex; ++i) {
|
||||||
|
if (pCol->hasNull && colDataIsNull_f(pCol->nullbitmap, i)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
numOfElem += 1;
|
||||||
|
pStddevRes->count += 1;
|
||||||
|
pStddevRes->usum += plist[i];
|
||||||
|
pStddevRes->quadraticISum += plist[i] * plist[i];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_FLOAT: {
|
case TSDB_DATA_TYPE_FLOAT: {
|
||||||
float* plist = (float*)pCol->pData;
|
float* plist = (float*)pCol->pData;
|
||||||
for (int32_t i = start; i < numOfRows + pInput->startRowIndex; ++i) {
|
for (int32_t i = start; i < numOfRows + pInput->startRowIndex; ++i) {
|
||||||
|
@ -1771,9 +1835,12 @@ _stddev_over:
|
||||||
|
|
||||||
static void stddevTransferInfo(SStddevRes* pInput, SStddevRes* pOutput) {
|
static void stddevTransferInfo(SStddevRes* pInput, SStddevRes* pOutput) {
|
||||||
pOutput->type = pInput->type;
|
pOutput->type = pInput->type;
|
||||||
if (IS_INTEGER_TYPE(pOutput->type)) {
|
if (IS_SIGNED_NUMERIC_TYPE(pOutput->type)) {
|
||||||
pOutput->quadraticISum += pInput->quadraticISum;
|
pOutput->quadraticISum += pInput->quadraticISum;
|
||||||
pOutput->isum += pInput->isum;
|
pOutput->isum += pInput->isum;
|
||||||
|
} else if (IS_UNSIGNED_NUMERIC_TYPE(pOutput->type)) {
|
||||||
|
pOutput->quadraticUSum += pInput->quadraticUSum;
|
||||||
|
pOutput->usum += pInput->usum;
|
||||||
} else {
|
} else {
|
||||||
pOutput->quadraticDSum += pInput->quadraticDSum;
|
pOutput->quadraticDSum += pInput->quadraticDSum;
|
||||||
pOutput->dsum += pInput->dsum;
|
pOutput->dsum += pInput->dsum;
|
||||||
|
@ -1848,6 +1915,22 @@ int32_t stddevInvertFunction(SqlFunctionCtx* pCtx) {
|
||||||
LIST_STDDEV_SUB_N(pStddevRes->isum, int64_t);
|
LIST_STDDEV_SUB_N(pStddevRes->isum, int64_t);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case TSDB_DATA_TYPE_UTINYINT: {
|
||||||
|
LIST_STDDEV_SUB_N(pStddevRes->isum, uint8_t);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TSDB_DATA_TYPE_USMALLINT: {
|
||||||
|
LIST_STDDEV_SUB_N(pStddevRes->isum, uint16_t);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TSDB_DATA_TYPE_UINT: {
|
||||||
|
LIST_STDDEV_SUB_N(pStddevRes->isum, uint32_t);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TSDB_DATA_TYPE_UBIGINT: {
|
||||||
|
LIST_STDDEV_SUB_N(pStddevRes->isum, uint64_t);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case TSDB_DATA_TYPE_FLOAT: {
|
case TSDB_DATA_TYPE_FLOAT: {
|
||||||
LIST_STDDEV_SUB_N(pStddevRes->dsum, float);
|
LIST_STDDEV_SUB_N(pStddevRes->dsum, float);
|
||||||
break;
|
break;
|
||||||
|
@ -1871,9 +1954,12 @@ int32_t stddevFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
|
||||||
int32_t type = pStddevRes->type;
|
int32_t type = pStddevRes->type;
|
||||||
double avg;
|
double avg;
|
||||||
|
|
||||||
if (IS_INTEGER_TYPE(type)) {
|
if (IS_SIGNED_NUMERIC_TYPE(type)) {
|
||||||
avg = pStddevRes->isum / ((double)pStddevRes->count);
|
avg = pStddevRes->isum / ((double)pStddevRes->count);
|
||||||
pStddevRes->result = sqrt(fabs(pStddevRes->quadraticISum / ((double)pStddevRes->count) - avg * avg));
|
pStddevRes->result = sqrt(fabs(pStddevRes->quadraticISum / ((double)pStddevRes->count) - avg * avg));
|
||||||
|
} else if (IS_UNSIGNED_NUMERIC_TYPE(type)) {
|
||||||
|
avg = pStddevRes->usum / ((double)pStddevRes->count);
|
||||||
|
pStddevRes->result = sqrt(fabs(pStddevRes->quadraticUSum / ((double)pStddevRes->count) - avg * avg));
|
||||||
} else {
|
} else {
|
||||||
avg = pStddevRes->dsum / ((double)pStddevRes->count);
|
avg = pStddevRes->dsum / ((double)pStddevRes->count);
|
||||||
pStddevRes->result = sqrt(fabs(pStddevRes->quadraticDSum / ((double)pStddevRes->count) - avg * avg));
|
pStddevRes->result = sqrt(fabs(pStddevRes->quadraticDSum / ((double)pStddevRes->count) - avg * avg));
|
||||||
|
@ -1913,9 +1999,12 @@ int32_t stddevCombine(SqlFunctionCtx* pDestCtx, SqlFunctionCtx* pSourceCtx) {
|
||||||
SResultRowEntryInfo* pSResInfo = GET_RES_INFO(pSourceCtx);
|
SResultRowEntryInfo* pSResInfo = GET_RES_INFO(pSourceCtx);
|
||||||
SStddevRes* pSBuf = GET_ROWCELL_INTERBUF(pSResInfo);
|
SStddevRes* pSBuf = GET_ROWCELL_INTERBUF(pSResInfo);
|
||||||
|
|
||||||
if (IS_INTEGER_TYPE(type)) {
|
if (IS_SIGNED_NUMERIC_TYPE(type)) {
|
||||||
pDBuf->isum += pSBuf->isum;
|
pDBuf->isum += pSBuf->isum;
|
||||||
pDBuf->quadraticISum += pSBuf->quadraticISum;
|
pDBuf->quadraticISum += pSBuf->quadraticISum;
|
||||||
|
} else if (IS_UNSIGNED_NUMERIC_TYPE(type)) {
|
||||||
|
pDBuf->usum += pSBuf->usum;
|
||||||
|
pDBuf->quadraticUSum += pSBuf->quadraticUSum;
|
||||||
} else {
|
} else {
|
||||||
pDBuf->dsum += pSBuf->dsum;
|
pDBuf->dsum += pSBuf->dsum;
|
||||||
pDBuf->quadraticDSum += pSBuf->quadraticDSum;
|
pDBuf->quadraticDSum += pSBuf->quadraticDSum;
|
||||||
|
|
|
@ -65,9 +65,10 @@ void indexInit() {
|
||||||
indexQhandle = taosInitScheduler(INDEX_QUEUE_SIZE, INDEX_NUM_OF_THREADS, "index");
|
indexQhandle = taosInitScheduler(INDEX_QUEUE_SIZE, INDEX_NUM_OF_THREADS, "index");
|
||||||
indexRefMgt = taosOpenRef(10, indexDestroy);
|
indexRefMgt = taosOpenRef(10, indexDestroy);
|
||||||
}
|
}
|
||||||
void indexCleanUp() {
|
void indexCleanup() {
|
||||||
// refacto later
|
// refacto later
|
||||||
taosCleanUpScheduler(indexQhandle);
|
taosCleanUpScheduler(indexQhandle);
|
||||||
|
taosCloseRef(indexRefMgt);
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct SIdxColInfo {
|
typedef struct SIdxColInfo {
|
||||||
|
|
|
@ -397,6 +397,7 @@ static int32_t logicVnodeModifCopy(const SVnodeModifyLogicNode* pSrc, SVnodeModi
|
||||||
COPY_SCALAR_FIELD(tableType);
|
COPY_SCALAR_FIELD(tableType);
|
||||||
COPY_CHAR_ARRAY_FIELD(tableFName);
|
COPY_CHAR_ARRAY_FIELD(tableFName);
|
||||||
COPY_OBJECT_FIELD(deleteTimeRange, sizeof(STimeWindow));
|
COPY_OBJECT_FIELD(deleteTimeRange, sizeof(STimeWindow));
|
||||||
|
CLONE_OBJECT_FIELD(pVgroupList, vgroupsInfoClone);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
#include "query.h"
|
#include "query.h"
|
||||||
#include "querynodes.h"
|
#include "querynodes.h"
|
||||||
#include "taoserror.h"
|
#include "taoserror.h"
|
||||||
#include "tjson.h"
|
|
||||||
#include "tdatablock.h"
|
#include "tdatablock.h"
|
||||||
|
#include "tjson.h"
|
||||||
|
|
||||||
static int32_t nodeToJson(const void* pObj, SJson* pJson);
|
static int32_t nodeToJson(const void* pObj, SJson* pJson);
|
||||||
static int32_t jsonToNode(const SJson* pJson, void* pObj);
|
static int32_t jsonToNode(const SJson* pJson, void* pObj);
|
||||||
|
@ -179,6 +179,8 @@ const char* nodesNodeName(ENodeType type) {
|
||||||
return "ShowVnodeStmt";
|
return "ShowVnodeStmt";
|
||||||
case QUERY_NODE_DELETE_STMT:
|
case QUERY_NODE_DELETE_STMT:
|
||||||
return "DeleteStmt";
|
return "DeleteStmt";
|
||||||
|
case QUERY_NODE_INSERT_STMT:
|
||||||
|
return "InsertStmt";
|
||||||
case QUERY_NODE_LOGIC_PLAN_SCAN:
|
case QUERY_NODE_LOGIC_PLAN_SCAN:
|
||||||
return "LogicScan";
|
return "LogicScan";
|
||||||
case QUERY_NODE_LOGIC_PLAN_JOIN:
|
case QUERY_NODE_LOGIC_PLAN_JOIN:
|
||||||
|
@ -271,6 +273,8 @@ const char* nodesNodeName(ENodeType type) {
|
||||||
return "PhysiDispatch";
|
return "PhysiDispatch";
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_INSERT:
|
case QUERY_NODE_PHYSICAL_PLAN_INSERT:
|
||||||
return "PhysiInsert";
|
return "PhysiInsert";
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_QUERY_INSERT:
|
||||||
|
return "PhysiQueryInsert";
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_DELETE:
|
case QUERY_NODE_PHYSICAL_PLAN_DELETE:
|
||||||
return "PhysiDelete";
|
return "PhysiDelete";
|
||||||
case QUERY_NODE_PHYSICAL_SUBPLAN:
|
case QUERY_NODE_PHYSICAL_SUBPLAN:
|
||||||
|
@ -2210,6 +2214,58 @@ static int32_t physiDispatchNodeToJson(const void* pObj, SJson* pJson) { return
|
||||||
|
|
||||||
static int32_t jsonToPhysiDispatchNode(const SJson* pJson, void* pObj) { return jsonToPhysicDataSinkNode(pJson, pObj); }
|
static int32_t jsonToPhysiDispatchNode(const SJson* pJson, void* pObj) { return jsonToPhysicDataSinkNode(pJson, pObj); }
|
||||||
|
|
||||||
|
static const char* jkQueryInsertPhysiPlanTableId = "TableId";
|
||||||
|
static const char* jkQueryInsertPhysiPlanTableType = "TableType";
|
||||||
|
static const char* jkQueryInsertPhysiPlanTableFName = "TableFName";
|
||||||
|
static const char* jkQueryInsertPhysiPlanVgId = "VgId";
|
||||||
|
static const char* jkQueryInsertPhysiPlanEpSet = "EpSet";
|
||||||
|
|
||||||
|
static int32_t physiQueryInsertNodeToJson(const void* pObj, SJson* pJson) {
|
||||||
|
const SQueryInserterNode* pNode = (const SQueryInserterNode*)pObj;
|
||||||
|
|
||||||
|
int32_t code = physicDataSinkNodeToJson(pObj, pJson);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = tjsonAddIntegerToObject(pJson, jkQueryInsertPhysiPlanTableId, pNode->tableId);
|
||||||
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = tjsonAddIntegerToObject(pJson, jkQueryInsertPhysiPlanTableType, pNode->tableType);
|
||||||
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = tjsonAddStringToObject(pJson, jkQueryInsertPhysiPlanTableFName, pNode->tableFName);
|
||||||
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = tjsonAddIntegerToObject(pJson, jkQueryInsertPhysiPlanVgId, pNode->vgId);
|
||||||
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = tjsonAddObject(pJson, jkQueryInsertPhysiPlanEpSet, epSetToJson, &pNode->epSet);
|
||||||
|
}
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t jsonToPhysiQueryInsertNode(const SJson* pJson, void* pObj) {
|
||||||
|
SQueryInserterNode* pNode = (SQueryInserterNode*)pObj;
|
||||||
|
|
||||||
|
int32_t code = jsonToPhysicDataSinkNode(pJson, pObj);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = tjsonGetUBigIntValue(pJson, jkQueryInsertPhysiPlanTableId, &pNode->tableId);
|
||||||
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = tjsonGetTinyIntValue(pJson, jkQueryInsertPhysiPlanTableType, &pNode->tableType);
|
||||||
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = tjsonGetStringValue(pJson, jkQueryInsertPhysiPlanTableFName, pNode->tableFName);
|
||||||
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = tjsonGetIntValue(pJson, jkQueryInsertPhysiPlanVgId, &pNode->vgId);
|
||||||
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = tjsonToObject(pJson, jkQueryInsertPhysiPlanEpSet, jsonToEpSet, &pNode->epSet);
|
||||||
|
}
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
static const char* jkDeletePhysiPlanTableId = "TableId";
|
static const char* jkDeletePhysiPlanTableId = "TableId";
|
||||||
static const char* jkDeletePhysiPlanTableType = "TableType";
|
static const char* jkDeletePhysiPlanTableType = "TableType";
|
||||||
static const char* jkDeletePhysiPlanTableFName = "TableFName";
|
static const char* jkDeletePhysiPlanTableFName = "TableFName";
|
||||||
|
@ -4232,6 +4288,8 @@ static int32_t specificNodeToJson(const void* pObj, SJson* pJson) {
|
||||||
return physiDispatchNodeToJson(pObj, pJson);
|
return physiDispatchNodeToJson(pObj, pJson);
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_INSERT:
|
case QUERY_NODE_PHYSICAL_PLAN_INSERT:
|
||||||
break;
|
break;
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_QUERY_INSERT:
|
||||||
|
return physiQueryInsertNodeToJson(pObj, pJson);
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_DELETE:
|
case QUERY_NODE_PHYSICAL_PLAN_DELETE:
|
||||||
return physiDeleteNodeToJson(pObj, pJson);
|
return physiDeleteNodeToJson(pObj, pJson);
|
||||||
case QUERY_NODE_PHYSICAL_SUBPLAN:
|
case QUERY_NODE_PHYSICAL_SUBPLAN:
|
||||||
|
@ -4374,6 +4432,8 @@ static int32_t jsonToSpecificNode(const SJson* pJson, void* pObj) {
|
||||||
return jsonToPhysiInterpFuncNode(pJson, pObj);
|
return jsonToPhysiInterpFuncNode(pJson, pObj);
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_DISPATCH:
|
case QUERY_NODE_PHYSICAL_PLAN_DISPATCH:
|
||||||
return jsonToPhysiDispatchNode(pJson, pObj);
|
return jsonToPhysiDispatchNode(pJson, pObj);
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_QUERY_INSERT:
|
||||||
|
return jsonToPhysiQueryInsertNode(pJson, pObj);
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_DELETE:
|
case QUERY_NODE_PHYSICAL_PLAN_DELETE:
|
||||||
return jsonToPhysiDeleteNode(pJson, pObj);
|
return jsonToPhysiDeleteNode(pJson, pObj);
|
||||||
case QUERY_NODE_PHYSICAL_SUBPLAN:
|
case QUERY_NODE_PHYSICAL_SUBPLAN:
|
||||||
|
|
|
@ -229,6 +229,8 @@ SNode* nodesMakeNode(ENodeType type) {
|
||||||
return makeNode(type, sizeof(SKillStmt));
|
return makeNode(type, sizeof(SKillStmt));
|
||||||
case QUERY_NODE_DELETE_STMT:
|
case QUERY_NODE_DELETE_STMT:
|
||||||
return makeNode(type, sizeof(SDeleteStmt));
|
return makeNode(type, sizeof(SDeleteStmt));
|
||||||
|
case QUERY_NODE_INSERT_STMT:
|
||||||
|
return makeNode(type, sizeof(SInsertStmt));
|
||||||
case QUERY_NODE_QUERY:
|
case QUERY_NODE_QUERY:
|
||||||
return makeNode(type, sizeof(SQuery));
|
return makeNode(type, sizeof(SQuery));
|
||||||
case QUERY_NODE_LOGIC_PLAN_SCAN:
|
case QUERY_NODE_LOGIC_PLAN_SCAN:
|
||||||
|
@ -325,6 +327,8 @@ SNode* nodesMakeNode(ENodeType type) {
|
||||||
return makeNode(type, sizeof(SDataDispatcherNode));
|
return makeNode(type, sizeof(SDataDispatcherNode));
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_INSERT:
|
case QUERY_NODE_PHYSICAL_PLAN_INSERT:
|
||||||
return makeNode(type, sizeof(SDataInserterNode));
|
return makeNode(type, sizeof(SDataInserterNode));
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_QUERY_INSERT:
|
||||||
|
return makeNode(type, sizeof(SQueryInserterNode));
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_DELETE:
|
case QUERY_NODE_PHYSICAL_PLAN_DELETE:
|
||||||
return makeNode(type, sizeof(SDataDeleterNode));
|
return makeNode(type, sizeof(SDataDeleterNode));
|
||||||
case QUERY_NODE_PHYSICAL_SUBPLAN:
|
case QUERY_NODE_PHYSICAL_SUBPLAN:
|
||||||
|
@ -690,6 +694,13 @@ void nodesDestroyNode(SNode* pNode) {
|
||||||
nodesDestroyNode(pStmt->pTagCond);
|
nodesDestroyNode(pStmt->pTagCond);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case QUERY_NODE_INSERT_STMT: {
|
||||||
|
SInsertStmt* pStmt = (SInsertStmt*)pNode;
|
||||||
|
nodesDestroyNode(pStmt->pTable);
|
||||||
|
nodesDestroyList(pStmt->pCols);
|
||||||
|
nodesDestroyNode(pStmt->pQuery);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case QUERY_NODE_QUERY: {
|
case QUERY_NODE_QUERY: {
|
||||||
SQuery* pQuery = (SQuery*)pNode;
|
SQuery* pQuery = (SQuery*)pNode;
|
||||||
nodesDestroyNode(pQuery->pRoot);
|
nodesDestroyNode(pQuery->pRoot);
|
||||||
|
@ -925,6 +936,11 @@ void nodesDestroyNode(SNode* pNode) {
|
||||||
taosMemoryFreeClear(pSink->pData);
|
taosMemoryFreeClear(pSink->pData);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_QUERY_INSERT: {
|
||||||
|
SQueryInserterNode* pSink = (SQueryInserterNode*)pNode;
|
||||||
|
destroyDataSinkNode((SDataSinkNode*)pSink);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_DELETE: {
|
case QUERY_NODE_PHYSICAL_PLAN_DELETE: {
|
||||||
SDataDeleterNode* pSink = (SDataDeleterNode*)pNode;
|
SDataDeleterNode* pSink = (SDataDeleterNode*)pNode;
|
||||||
destroyDataSinkNode((SDataSinkNode*)pSink);
|
destroyDataSinkNode((SDataSinkNode*)pSink);
|
||||||
|
@ -1524,7 +1540,6 @@ int32_t nodesCollectColumnsFromNode(SNode* node, const char* pTableAlias, EColle
|
||||||
}
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct SCollectFuncsCxt {
|
typedef struct SCollectFuncsCxt {
|
||||||
|
|
|
@ -210,6 +210,7 @@ SNode* createSyncdbStmt(SAstCreateContext* pCxt, const SToken* pDbName);
|
||||||
SNode* createGrantStmt(SAstCreateContext* pCxt, int64_t privileges, SToken* pDbName, SToken* pUserName);
|
SNode* createGrantStmt(SAstCreateContext* pCxt, int64_t privileges, SToken* pDbName, SToken* pUserName);
|
||||||
SNode* createRevokeStmt(SAstCreateContext* pCxt, int64_t privileges, SToken* pDbName, SToken* pUserName);
|
SNode* createRevokeStmt(SAstCreateContext* pCxt, int64_t privileges, SToken* pDbName, SToken* pUserName);
|
||||||
SNode* createDeleteStmt(SAstCreateContext* pCxt, SNode* pTable, SNode* pWhere);
|
SNode* createDeleteStmt(SAstCreateContext* pCxt, SNode* pTable, SNode* pWhere);
|
||||||
|
SNode* createInsertStmt(SAstCreateContext* pCxt, SNode* pTable, SNodeList* pCols, SNode* pQuery);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -259,7 +259,7 @@ multi_create_clause(A) ::= multi_create_clause(B) create_subtable_clause(C).
|
||||||
|
|
||||||
create_subtable_clause(A) ::=
|
create_subtable_clause(A) ::=
|
||||||
not_exists_opt(B) full_table_name(C) USING full_table_name(D)
|
not_exists_opt(B) full_table_name(C) USING full_table_name(D)
|
||||||
specific_tags_opt(E) TAGS NK_LP expression_list(F) NK_RP table_options(G). { A = createCreateSubTableClause(pCxt, B, C, D, E, F, G); }
|
specific_cols_opt(E) TAGS NK_LP expression_list(F) NK_RP table_options(G). { A = createCreateSubTableClause(pCxt, B, C, D, E, F, G); }
|
||||||
|
|
||||||
%type multi_drop_clause { SNodeList* }
|
%type multi_drop_clause { SNodeList* }
|
||||||
%destructor multi_drop_clause { nodesDestroyList($$); }
|
%destructor multi_drop_clause { nodesDestroyList($$); }
|
||||||
|
@ -268,10 +268,10 @@ multi_drop_clause(A) ::= multi_drop_clause(B) drop_table_clause(C).
|
||||||
|
|
||||||
drop_table_clause(A) ::= exists_opt(B) full_table_name(C). { A = createDropTableClause(pCxt, B, C); }
|
drop_table_clause(A) ::= exists_opt(B) full_table_name(C). { A = createDropTableClause(pCxt, B, C); }
|
||||||
|
|
||||||
%type specific_tags_opt { SNodeList* }
|
%type specific_cols_opt { SNodeList* }
|
||||||
%destructor specific_tags_opt { nodesDestroyList($$); }
|
%destructor specific_cols_opt { nodesDestroyList($$); }
|
||||||
specific_tags_opt(A) ::= . { A = NULL; }
|
specific_cols_opt(A) ::= . { A = NULL; }
|
||||||
specific_tags_opt(A) ::= NK_LP col_name_list(B) NK_RP. { A = B; }
|
specific_cols_opt(A) ::= NK_LP col_name_list(B) NK_RP. { A = B; }
|
||||||
|
|
||||||
full_table_name(A) ::= table_name(B). { A = createRealTableNode(pCxt, NULL, &B, NULL); }
|
full_table_name(A) ::= table_name(B). { A = createRealTableNode(pCxt, NULL, &B, NULL); }
|
||||||
full_table_name(A) ::= db_name(B) NK_DOT table_name(C). { A = createRealTableNode(pCxt, &B, &C, NULL); }
|
full_table_name(A) ::= db_name(B) NK_DOT table_name(C). { A = createRealTableNode(pCxt, &B, &C, NULL); }
|
||||||
|
@ -515,6 +515,9 @@ cmd ::= DELETE FROM full_table_name(A) where_clause_opt(B).
|
||||||
/************************************************ select **************************************************************/
|
/************************************************ select **************************************************************/
|
||||||
cmd ::= query_expression(A). { pCxt->pRootNode = A; }
|
cmd ::= query_expression(A). { pCxt->pRootNode = A; }
|
||||||
|
|
||||||
|
/************************************************ insert **************************************************************/
|
||||||
|
cmd ::= INSERT INTO full_table_name(A) specific_cols_opt(B) query_expression(C). { pCxt->pRootNode = createInsertStmt(pCxt, A, B, C); }
|
||||||
|
|
||||||
/************************************************ literal *************************************************************/
|
/************************************************ literal *************************************************************/
|
||||||
literal(A) ::= NK_INTEGER(B). { A = createRawExprNode(pCxt, &B, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &B)); }
|
literal(A) ::= NK_INTEGER(B). { A = createRawExprNode(pCxt, &B, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &B)); }
|
||||||
literal(A) ::= NK_FLOAT(B). { A = createRawExprNode(pCxt, &B, createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &B)); }
|
literal(A) ::= NK_FLOAT(B). { A = createRawExprNode(pCxt, &B, createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &B)); }
|
||||||
|
@ -973,4 +976,4 @@ null_ordering_opt(A) ::= .
|
||||||
null_ordering_opt(A) ::= NULLS FIRST. { A = NULL_ORDER_FIRST; }
|
null_ordering_opt(A) ::= NULLS FIRST. { A = NULL_ORDER_FIRST; }
|
||||||
null_ordering_opt(A) ::= NULLS LAST. { A = NULL_ORDER_LAST; }
|
null_ordering_opt(A) ::= NULLS LAST. { A = NULL_ORDER_LAST; }
|
||||||
|
|
||||||
%fallback ID NK_BITNOT INSERT VALUES IMPORT NK_SEMI FILE.
|
%fallback ID NK_BITNOT VALUES IMPORT NK_SEMI FILE.
|
||||||
|
|
|
@ -1662,3 +1662,13 @@ SNode* createDeleteStmt(SAstCreateContext* pCxt, SNode* pTable, SNode* pWhere) {
|
||||||
}
|
}
|
||||||
return (SNode*)pStmt;
|
return (SNode*)pStmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SNode* createInsertStmt(SAstCreateContext* pCxt, SNode* pTable, SNodeList* pCols, SNode* pQuery) {
|
||||||
|
CHECK_PARSER_STATUS(pCxt);
|
||||||
|
SInsertStmt* pStmt = (SInsertStmt*)nodesMakeNode(QUERY_NODE_INSERT_STMT);
|
||||||
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
|
pStmt->pTable = pTable;
|
||||||
|
pStmt->pCols = pCols;
|
||||||
|
pStmt->pQuery = pQuery;
|
||||||
|
return (SNode*)pStmt;
|
||||||
|
}
|
||||||
|
|
|
@ -447,6 +447,14 @@ static int32_t collectMetaKeyFromDelete(SCollectMetaKeyCxt* pCxt, SDeleteStmt* p
|
||||||
return collectMetaKeyFromRealTableImpl(pCxt, (SRealTableNode*)pStmt->pFromTable, AUTH_TYPE_WRITE);
|
return collectMetaKeyFromRealTableImpl(pCxt, (SRealTableNode*)pStmt->pFromTable, AUTH_TYPE_WRITE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t collectMetaKeyFromInsert(SCollectMetaKeyCxt* pCxt, SInsertStmt* pStmt) {
|
||||||
|
int32_t code = collectMetaKeyFromRealTableImpl(pCxt, (SRealTableNode*)pStmt->pTable, AUTH_TYPE_WRITE);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = collectMetaKeyFromQuery(pCxt, pStmt->pQuery);
|
||||||
|
}
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t collectMetaKeyFromShowBlockDist(SCollectMetaKeyCxt* pCxt, SShowTableDistributedStmt* pStmt) {
|
static int32_t collectMetaKeyFromShowBlockDist(SCollectMetaKeyCxt* pCxt, SShowTableDistributedStmt* pStmt) {
|
||||||
SName name = {.type = TSDB_TABLE_NAME_T, .acctId = pCxt->pParseCxt->acctId};
|
SName name = {.type = TSDB_TABLE_NAME_T, .acctId = pCxt->pParseCxt->acctId};
|
||||||
strcpy(name.dbname, pStmt->dbName);
|
strcpy(name.dbname, pStmt->dbName);
|
||||||
|
@ -554,6 +562,8 @@ static int32_t collectMetaKeyFromQuery(SCollectMetaKeyCxt* pCxt, SNode* pStmt) {
|
||||||
return collectMetaKeyFromShowTransactions(pCxt, (SShowStmt*)pStmt);
|
return collectMetaKeyFromShowTransactions(pCxt, (SShowStmt*)pStmt);
|
||||||
case QUERY_NODE_DELETE_STMT:
|
case QUERY_NODE_DELETE_STMT:
|
||||||
return collectMetaKeyFromDelete(pCxt, (SDeleteStmt*)pStmt);
|
return collectMetaKeyFromDelete(pCxt, (SDeleteStmt*)pStmt);
|
||||||
|
case QUERY_NODE_INSERT_STMT:
|
||||||
|
return collectMetaKeyFromInsert(pCxt, (SInsertStmt*)pStmt);
|
||||||
case QUERY_NODE_SHOW_TABLE_DISTRIBUTED_STMT:
|
case QUERY_NODE_SHOW_TABLE_DISTRIBUTED_STMT:
|
||||||
return collectMetaKeyFromShowBlockDist(pCxt, (SShowTableDistributedStmt*)pStmt);
|
return collectMetaKeyFromShowBlockDist(pCxt, (SShowTableDistributedStmt*)pStmt);
|
||||||
case QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT:
|
case QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT:
|
||||||
|
|
|
@ -88,6 +88,14 @@ static int32_t authDelete(SAuthCxt* pCxt, SDeleteStmt* pDelete) {
|
||||||
return checkAuth(pCxt, ((SRealTableNode*)pDelete->pFromTable)->table.dbName, AUTH_TYPE_WRITE);
|
return checkAuth(pCxt, ((SRealTableNode*)pDelete->pFromTable)->table.dbName, AUTH_TYPE_WRITE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t authInsert(SAuthCxt* pCxt, SInsertStmt* pInsert) {
|
||||||
|
int32_t code = checkAuth(pCxt, ((SRealTableNode*)pInsert->pTable)->table.dbName, AUTH_TYPE_WRITE);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = authQuery(pCxt, pInsert->pQuery);
|
||||||
|
}
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t authQuery(SAuthCxt* pCxt, SNode* pStmt) {
|
static int32_t authQuery(SAuthCxt* pCxt, SNode* pStmt) {
|
||||||
switch (nodeType(pStmt)) {
|
switch (nodeType(pStmt)) {
|
||||||
case QUERY_NODE_SET_OPERATOR:
|
case QUERY_NODE_SET_OPERATOR:
|
||||||
|
@ -98,6 +106,8 @@ static int32_t authQuery(SAuthCxt* pCxt, SNode* pStmt) {
|
||||||
return authDropUser(pCxt, (SDropUserStmt*)pStmt);
|
return authDropUser(pCxt, (SDropUserStmt*)pStmt);
|
||||||
case QUERY_NODE_DELETE_STMT:
|
case QUERY_NODE_DELETE_STMT:
|
||||||
return authDelete(pCxt, (SDeleteStmt*)pStmt);
|
return authDelete(pCxt, (SDeleteStmt*)pStmt);
|
||||||
|
case QUERY_NODE_INSERT_STMT:
|
||||||
|
return authInsert(pCxt, (SInsertStmt*)pStmt);
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -300,6 +300,14 @@ static int32_t calcConstDelete(SCalcConstContext* pCxt, SDeleteStmt* pDelete) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t calcConstInsert(SCalcConstContext* pCxt, SInsertStmt* pInsert) {
|
||||||
|
int32_t code = calcConstFromTable(pCxt, pInsert->pTable);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = calcConstQuery(pCxt, pInsert->pQuery, false);
|
||||||
|
}
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t calcConstQuery(SCalcConstContext* pCxt, SNode* pStmt, bool subquery) {
|
static int32_t calcConstQuery(SCalcConstContext* pCxt, SNode* pStmt, bool subquery) {
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
switch (nodeType(pStmt)) {
|
switch (nodeType(pStmt)) {
|
||||||
|
@ -320,6 +328,9 @@ static int32_t calcConstQuery(SCalcConstContext* pCxt, SNode* pStmt, bool subque
|
||||||
case QUERY_NODE_DELETE_STMT:
|
case QUERY_NODE_DELETE_STMT:
|
||||||
code = calcConstDelete(pCxt, (SDeleteStmt*)pStmt);
|
code = calcConstDelete(pCxt, (SDeleteStmt*)pStmt);
|
||||||
break;
|
break;
|
||||||
|
case QUERY_NODE_INSERT_STMT:
|
||||||
|
code = calcConstInsert(pCxt, (SInsertStmt*)pStmt);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -110,7 +110,7 @@ typedef struct SMemParam {
|
||||||
static int32_t skipInsertInto(char** pSql, SMsgBuf* pMsg) {
|
static int32_t skipInsertInto(char** pSql, SMsgBuf* pMsg) {
|
||||||
SToken sToken;
|
SToken sToken;
|
||||||
NEXT_TOKEN(*pSql, sToken);
|
NEXT_TOKEN(*pSql, sToken);
|
||||||
if (TK_INSERT != sToken.type) {
|
if (TK_INSERT != sToken.type && TK_IMPORT != sToken.type) {
|
||||||
return buildSyntaxErrMsg(pMsg, "keyword INSERT is expected", sToken.z);
|
return buildSyntaxErrMsg(pMsg, "keyword INSERT is expected", sToken.z);
|
||||||
}
|
}
|
||||||
NEXT_TOKEN(*pSql, sToken);
|
NEXT_TOKEN(*pSql, sToken);
|
||||||
|
|
|
@ -2839,6 +2839,21 @@ static int32_t translateDelete(STranslateContext* pCxt, SDeleteStmt* pDelete) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t translateInsert(STranslateContext* pCxt, SInsertStmt* pInsert) {
|
||||||
|
pCxt->pCurrStmt = (SNode*)pInsert;
|
||||||
|
int32_t code = translateFrom(pCxt, pInsert->pTable);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = translateExprList(pCxt, pInsert->pCols);
|
||||||
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = resetTranslateNamespace(pCxt);
|
||||||
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = translateQuery(pCxt, pInsert->pQuery);
|
||||||
|
}
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
static int64_t getUnitPerMinute(uint8_t precision) {
|
static int64_t getUnitPerMinute(uint8_t precision) {
|
||||||
switch (precision) {
|
switch (precision) {
|
||||||
case TSDB_TIME_PRECISION_MILLI:
|
case TSDB_TIME_PRECISION_MILLI:
|
||||||
|
@ -4608,6 +4623,9 @@ static int32_t translateQuery(STranslateContext* pCxt, SNode* pNode) {
|
||||||
case QUERY_NODE_DELETE_STMT:
|
case QUERY_NODE_DELETE_STMT:
|
||||||
code = translateDelete(pCxt, (SDeleteStmt*)pNode);
|
code = translateDelete(pCxt, (SDeleteStmt*)pNode);
|
||||||
break;
|
break;
|
||||||
|
case QUERY_NODE_INSERT_STMT:
|
||||||
|
code = translateInsert(pCxt, (SInsertStmt*)pNode);
|
||||||
|
break;
|
||||||
case QUERY_NODE_CREATE_DATABASE_STMT:
|
case QUERY_NODE_CREATE_DATABASE_STMT:
|
||||||
code = translateCreateDatabase(pCxt, (SCreateDatabaseStmt*)pNode);
|
code = translateCreateDatabase(pCxt, (SCreateDatabaseStmt*)pNode);
|
||||||
break;
|
break;
|
||||||
|
@ -6224,6 +6242,10 @@ static int32_t setQuery(STranslateContext* pCxt, SQuery* pQuery) {
|
||||||
pQuery->execMode = QUERY_EXEC_MODE_SCHEDULE;
|
pQuery->execMode = QUERY_EXEC_MODE_SCHEDULE;
|
||||||
pQuery->msgType = TDMT_VND_DELETE;
|
pQuery->msgType = TDMT_VND_DELETE;
|
||||||
break;
|
break;
|
||||||
|
case QUERY_NODE_INSERT_STMT:
|
||||||
|
pQuery->execMode = QUERY_EXEC_MODE_SCHEDULE;
|
||||||
|
pQuery->msgType = TDMT_VND_SUBMIT;
|
||||||
|
break;
|
||||||
case QUERY_NODE_VNODE_MODIF_STMT:
|
case QUERY_NODE_VNODE_MODIF_STMT:
|
||||||
pQuery->execMode = QUERY_EXEC_MODE_SCHEDULE;
|
pQuery->execMode = QUERY_EXEC_MODE_SCHEDULE;
|
||||||
pQuery->msgType = toMsgType(((SVnodeModifOpStmt*)pQuery->pRoot)->sqlNodeType);
|
pQuery->msgType = toMsgType(((SVnodeModifOpStmt*)pQuery->pRoot)->sqlNodeType);
|
||||||
|
|
|
@ -376,8 +376,6 @@ int32_t parseJsontoTagData(const char* json, SArray* pTagVals, STag** ppTag, voi
|
||||||
|
|
||||||
char* jsonKey = item->string;
|
char* jsonKey = item->string;
|
||||||
if (!isValidateTag(jsonKey)) {
|
if (!isValidateTag(jsonKey)) {
|
||||||
fprintf(stdout, "%s(%d) %s %08" PRId64 "\n", __FILE__, __LINE__, __func__, taosGetSelfPthreadId());
|
|
||||||
fflush(stdout);
|
|
||||||
retCode = buildSyntaxErrMsg(pMsgBuf, "json key not validate", jsonKey);
|
retCode = buildSyntaxErrMsg(pMsgBuf, "json key not validate", jsonKey);
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,19 +19,28 @@
|
||||||
#include "parInt.h"
|
#include "parInt.h"
|
||||||
#include "parToken.h"
|
#include "parToken.h"
|
||||||
|
|
||||||
bool qIsInsertSql(const char* pStr, size_t length) {
|
bool qIsInsertValuesSql(const char* pStr, size_t length) {
|
||||||
if (NULL == pStr) {
|
if (NULL == pStr) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char* pSql = pStr;
|
||||||
|
|
||||||
int32_t index = 0;
|
int32_t index = 0;
|
||||||
|
SToken t = tStrGetToken((char*)pStr, &index, false);
|
||||||
|
if (TK_INSERT != t.type && TK_IMPORT != t.type) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
do {
|
do {
|
||||||
SToken t0 = tStrGetToken((char*)pStr, &index, false);
|
pStr += index;
|
||||||
if (t0.type != TK_NK_LP) {
|
index = 0;
|
||||||
return t0.type == TK_INSERT || t0.type == TK_IMPORT;
|
t = tStrGetToken((char*)pStr, &index, false);
|
||||||
|
if (TK_USING == t.type || TK_VALUES == t.type) {
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
} while (1);
|
} while (pStr - pSql < length);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t analyseSemantic(SParseContext* pCxt, SQuery* pQuery, SParseMetaCache* pMetaCache) {
|
static int32_t analyseSemantic(SParseContext* pCxt, SQuery* pQuery, SParseMetaCache* pMetaCache) {
|
||||||
|
@ -148,7 +157,7 @@ static void rewriteExprAlias(SNode* pRoot) {
|
||||||
|
|
||||||
int32_t qParseSql(SParseContext* pCxt, SQuery** pQuery) {
|
int32_t qParseSql(SParseContext* pCxt, SQuery** pQuery) {
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
if (qIsInsertSql(pCxt->pSql, pCxt->sqlLen)) {
|
if (qIsInsertValuesSql(pCxt->pSql, pCxt->sqlLen)) {
|
||||||
code = parseInsertSql(pCxt, pQuery, NULL);
|
code = parseInsertSql(pCxt, pQuery, NULL);
|
||||||
} else {
|
} else {
|
||||||
code = parseSqlIntoAst(pCxt, pQuery);
|
code = parseSqlIntoAst(pCxt, pQuery);
|
||||||
|
@ -160,7 +169,7 @@ int32_t qParseSql(SParseContext* pCxt, SQuery** pQuery) {
|
||||||
int32_t qParseSqlSyntax(SParseContext* pCxt, SQuery** pQuery, struct SCatalogReq* pCatalogReq) {
|
int32_t qParseSqlSyntax(SParseContext* pCxt, SQuery** pQuery, struct SCatalogReq* pCatalogReq) {
|
||||||
SParseMetaCache metaCache = {0};
|
SParseMetaCache metaCache = {0};
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
if (qIsInsertSql(pCxt->pSql, pCxt->sqlLen)) {
|
if (qIsInsertValuesSql(pCxt->pSql, pCxt->sqlLen)) {
|
||||||
code = parseInsertSyntax(pCxt, pQuery, &metaCache);
|
code = parseInsertSyntax(pCxt, pQuery, &metaCache);
|
||||||
} else {
|
} else {
|
||||||
code = parseSqlSyntax(pCxt, pQuery, &metaCache);
|
code = parseSqlSyntax(pCxt, pQuery, &metaCache);
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -40,6 +40,12 @@ TEST_F(ParserExplainToSyncdbTest, grant) {
|
||||||
run("GRANT READ, WRITE ON test.* TO wxy");
|
run("GRANT READ, WRITE ON test.* TO wxy");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(ParserExplainToSyncdbTest, insert) {
|
||||||
|
useDb("root", "test");
|
||||||
|
|
||||||
|
run("INSERT INTO t1 SELECT * FROM t1");
|
||||||
|
}
|
||||||
|
|
||||||
// todo kill connection
|
// todo kill connection
|
||||||
// todo kill query
|
// todo kill query
|
||||||
// todo kill stream
|
// todo kill stream
|
||||||
|
|
|
@ -26,6 +26,7 @@ typedef int32_t (*FCreateLogicNode)(SLogicPlanContext*, void*, SLogicNode**);
|
||||||
typedef int32_t (*FCreateSelectLogicNode)(SLogicPlanContext*, SSelectStmt*, SLogicNode**);
|
typedef int32_t (*FCreateSelectLogicNode)(SLogicPlanContext*, SSelectStmt*, SLogicNode**);
|
||||||
typedef int32_t (*FCreateSetOpLogicNode)(SLogicPlanContext*, SSetOperator*, SLogicNode**);
|
typedef int32_t (*FCreateSetOpLogicNode)(SLogicPlanContext*, SSetOperator*, SLogicNode**);
|
||||||
typedef int32_t (*FCreateDeleteLogicNode)(SLogicPlanContext*, SDeleteStmt*, SLogicNode**);
|
typedef int32_t (*FCreateDeleteLogicNode)(SLogicPlanContext*, SDeleteStmt*, SLogicNode**);
|
||||||
|
typedef int32_t (*FCreateInsertLogicNode)(SLogicPlanContext*, SInsertStmt*, SLogicNode**);
|
||||||
|
|
||||||
static int32_t doCreateLogicNodeByTable(SLogicPlanContext* pCxt, SSelectStmt* pSelect, SNode* pTable,
|
static int32_t doCreateLogicNodeByTable(SLogicPlanContext* pCxt, SSelectStmt* pSelect, SNode* pTable,
|
||||||
SLogicNode** pLogicNode);
|
SLogicNode** pLogicNode);
|
||||||
|
@ -1262,6 +1263,47 @@ static int32_t createDeleteLogicNode(SLogicPlanContext* pCxt, SDeleteStmt* pDele
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t creatInsertRootLogicNode(SLogicPlanContext* pCxt, SInsertStmt* pInsert, FCreateInsertLogicNode func,
|
||||||
|
SLogicNode** pRoot) {
|
||||||
|
return createRootLogicNode(pCxt, pInsert, pInsert->precision, (FCreateLogicNode)func, pRoot);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t createVnodeModifLogicNodeByInsert(SLogicPlanContext* pCxt, SInsertStmt* pInsert,
|
||||||
|
SLogicNode** pLogicNode) {
|
||||||
|
SVnodeModifyLogicNode* pModify = (SVnodeModifyLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_VNODE_MODIFY);
|
||||||
|
if (NULL == pModify) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
SRealTableNode* pRealTable = (SRealTableNode*)pInsert->pTable;
|
||||||
|
|
||||||
|
pModify->modifyType = MODIFY_TABLE_TYPE_INSERT;
|
||||||
|
pModify->tableId = pRealTable->pMeta->uid;
|
||||||
|
pModify->tableType = pRealTable->pMeta->tableType;
|
||||||
|
snprintf(pModify->tableFName, sizeof(pModify->tableFName), "%d.%s.%s", pCxt->pPlanCxt->acctId,
|
||||||
|
pRealTable->table.dbName, pRealTable->table.tableName);
|
||||||
|
TSWAP(pModify->pVgroupList, pRealTable->pVgroupList);
|
||||||
|
|
||||||
|
*pLogicNode = (SLogicNode*)pModify;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t createInsertLogicNode(SLogicPlanContext* pCxt, SInsertStmt* pInsert, SLogicNode** pLogicNode) {
|
||||||
|
SLogicNode* pRoot = NULL;
|
||||||
|
int32_t code = createQueryLogicNode(pCxt, pInsert->pQuery, &pRoot);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = creatInsertRootLogicNode(pCxt, pInsert, createVnodeModifLogicNodeByInsert, &pRoot);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
*pLogicNode = pRoot;
|
||||||
|
} else {
|
||||||
|
nodesDestroyNode((SNode*)pRoot);
|
||||||
|
}
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t createQueryLogicNode(SLogicPlanContext* pCxt, SNode* pStmt, SLogicNode** pLogicNode) {
|
static int32_t createQueryLogicNode(SLogicPlanContext* pCxt, SNode* pStmt, SLogicNode** pLogicNode) {
|
||||||
switch (nodeType(pStmt)) {
|
switch (nodeType(pStmt)) {
|
||||||
case QUERY_NODE_SELECT_STMT:
|
case QUERY_NODE_SELECT_STMT:
|
||||||
|
@ -1274,6 +1316,8 @@ static int32_t createQueryLogicNode(SLogicPlanContext* pCxt, SNode* pStmt, SLogi
|
||||||
return createSetOperatorLogicNode(pCxt, (SSetOperator*)pStmt, pLogicNode);
|
return createSetOperatorLogicNode(pCxt, (SSetOperator*)pStmt, pLogicNode);
|
||||||
case QUERY_NODE_DELETE_STMT:
|
case QUERY_NODE_DELETE_STMT:
|
||||||
return createDeleteLogicNode(pCxt, (SDeleteStmt*)pStmt, pLogicNode);
|
return createDeleteLogicNode(pCxt, (SDeleteStmt*)pStmt, pLogicNode);
|
||||||
|
case QUERY_NODE_INSERT_STMT:
|
||||||
|
return createInsertLogicNode(pCxt, (SInsertStmt*)pStmt, pLogicNode);
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -849,7 +849,8 @@ static EDealRes rewriteProjectCondForPushDownImpl(SNode** ppNode, void* pContext
|
||||||
return DEAL_RES_CONTINUE;
|
return DEAL_RES_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t rewriteProjectCondForPushDown(SOptimizeContext* pCxt, SProjectLogicNode* pProject, SNode** ppProjectCond) {
|
static int32_t rewriteProjectCondForPushDown(SOptimizeContext* pCxt, SProjectLogicNode* pProject,
|
||||||
|
SNode** ppProjectCond) {
|
||||||
SRewriteProjCondContext cxt = {.pProj = pProject, .errCode = TSDB_CODE_SUCCESS};
|
SRewriteProjCondContext cxt = {.pProj = pProject, .errCode = TSDB_CODE_SUCCESS};
|
||||||
SNode* pProjectCond = pProject->node.pConditions;
|
SNode* pProjectCond = pProject->node.pConditions;
|
||||||
nodesRewriteExpr(&pProjectCond, rewriteProjectCondForPushDownImpl, &cxt);
|
nodesRewriteExpr(&pProjectCond, rewriteProjectCondForPushDownImpl, &cxt);
|
||||||
|
@ -2082,13 +2083,18 @@ static const int32_t optimizeRuleNum = (sizeof(optimizeRuleSet) / sizeof(SOptimi
|
||||||
static void dumpLogicSubplan(const char* pRuleName, SLogicSubplan* pSubplan) {
|
static void dumpLogicSubplan(const char* pRuleName, SLogicSubplan* pSubplan) {
|
||||||
char* pStr = NULL;
|
char* pStr = NULL;
|
||||||
nodesNodeToString((SNode*)pSubplan, false, &pStr, NULL);
|
nodesNodeToString((SNode*)pSubplan, false, &pStr, NULL);
|
||||||
|
if (NULL == pRuleName) {
|
||||||
|
qDebugL("before optimize: %s", pStr);
|
||||||
|
} else {
|
||||||
qDebugL("apply optimize %s rule: %s", pRuleName, pStr);
|
qDebugL("apply optimize %s rule: %s", pRuleName, pStr);
|
||||||
|
}
|
||||||
taosMemoryFree(pStr);
|
taosMemoryFree(pStr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t applyOptimizeRule(SPlanContext* pCxt, SLogicSubplan* pLogicSubplan) {
|
static int32_t applyOptimizeRule(SPlanContext* pCxt, SLogicSubplan* pLogicSubplan) {
|
||||||
SOptimizeContext cxt = {.pPlanCxt = pCxt, .optimized = false};
|
SOptimizeContext cxt = {.pPlanCxt = pCxt, .optimized = false};
|
||||||
bool optimized = false;
|
bool optimized = false;
|
||||||
|
dumpLogicSubplan(NULL, pLogicSubplan);
|
||||||
do {
|
do {
|
||||||
optimized = false;
|
optimized = false;
|
||||||
for (int32_t i = 0; i < optimizeRuleNum; ++i) {
|
for (int32_t i = 0; i < optimizeRuleNum; ++i) {
|
||||||
|
|
|
@ -632,8 +632,8 @@ static int32_t createJoinPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChildren
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TSDB_CODE_SUCCESS == code && NULL != pJoinLogicNode->pOnConditions) {
|
if (TSDB_CODE_SUCCESS == code && NULL != pJoinLogicNode->pOnConditions) {
|
||||||
code = setNodeSlotId(pCxt, ((SPhysiNode*)pJoin)->pOutputDataBlockDesc->dataBlockId, -1, pJoinLogicNode->pOnConditions,
|
code = setNodeSlotId(pCxt, ((SPhysiNode*)pJoin)->pOutputDataBlockDesc->dataBlockId, -1,
|
||||||
&pJoin->pOnConditions);
|
pJoinLogicNode->pOnConditions, &pJoin->pOnConditions);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
@ -1496,12 +1496,60 @@ static SSubplan* makeSubplan(SPhysiPlanContext* pCxt, SLogicSubplan* pLogicSubpl
|
||||||
return pSubplan;
|
return pSubplan;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t buildInsertSubplan(SPhysiPlanContext* pCxt, SVnodeModifyLogicNode* pModify, SSubplan* pSubplan) {
|
static int32_t buildInsertValuesSubplan(SPhysiPlanContext* pCxt, SVnodeModifyLogicNode* pModify, SSubplan* pSubplan) {
|
||||||
pSubplan->msgType = pModify->msgType;
|
pSubplan->msgType = pModify->msgType;
|
||||||
pSubplan->execNode.epSet = pModify->pVgDataBlocks->vg.epSet;
|
pSubplan->execNode.epSet = pModify->pVgDataBlocks->vg.epSet;
|
||||||
return createDataInserter(pCxt, pModify->pVgDataBlocks, &pSubplan->pDataSink);
|
return createDataInserter(pCxt, pModify->pVgDataBlocks, &pSubplan->pDataSink);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t createQueryInserter(SPhysiPlanContext* pCxt, SVnodeModifyLogicNode* pModify, SSubplan* pSubplan,
|
||||||
|
SDataSinkNode** pSink) {
|
||||||
|
SQueryInserterNode* pInserter = (SQueryInserterNode*)nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_QUERY_INSERT);
|
||||||
|
if (NULL == pInserter) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
pInserter->tableId = pModify->tableId;
|
||||||
|
pInserter->tableType = pModify->tableType;
|
||||||
|
strcpy(pInserter->tableFName, pModify->tableFName);
|
||||||
|
pInserter->vgId = pModify->pVgroupList->vgroups[0].vgId;
|
||||||
|
pInserter->epSet = pModify->pVgroupList->vgroups[0].epSet;
|
||||||
|
vgroupInfoToNodeAddr(pModify->pVgroupList->vgroups, &pSubplan->execNode);
|
||||||
|
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
|
pInserter->sink.pInputDataBlockDesc =
|
||||||
|
(SDataBlockDescNode*)nodesCloneNode((SNode*)pSubplan->pNode->pOutputDataBlockDesc);
|
||||||
|
if (NULL == pInserter->sink.pInputDataBlockDesc) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
*pSink = (SDataSinkNode*)pInserter;
|
||||||
|
} else {
|
||||||
|
nodesDestroyNode((SNode*)pInserter);
|
||||||
|
}
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t buildInsertSelectSubplan(SPhysiPlanContext* pCxt, SVnodeModifyLogicNode* pModify, SSubplan* pSubplan) {
|
||||||
|
int32_t code =
|
||||||
|
createPhysiNode(pCxt, (SLogicNode*)nodesListGetNode(pModify->node.pChildren, 0), pSubplan, &pSubplan->pNode);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = createQueryInserter(pCxt, pModify, pSubplan, &pSubplan->pDataSink);
|
||||||
|
}
|
||||||
|
pSubplan->msgType = TDMT_VND_SUBMIT;
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t buildInsertSubplan(SPhysiPlanContext* pCxt, SVnodeModifyLogicNode* pModify, SSubplan* pSubplan) {
|
||||||
|
if (NULL == pModify->node.pChildren) {
|
||||||
|
return buildInsertValuesSubplan(pCxt, pModify, pSubplan);
|
||||||
|
}
|
||||||
|
return buildInsertSelectSubplan(pCxt, pModify, pSubplan);
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t createDataDeleter(SPhysiPlanContext* pCxt, SVnodeModifyLogicNode* pModify, const SPhysiNode* pRoot,
|
static int32_t createDataDeleter(SPhysiPlanContext* pCxt, SVnodeModifyLogicNode* pModify, const SPhysiNode* pRoot,
|
||||||
SDataSinkNode** pSink) {
|
SDataSinkNode** pSink) {
|
||||||
SDataDeleterNode* pDeleter = (SDataDeleterNode*)nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_DELETE);
|
SDataDeleterNode* pDeleter = (SDataDeleterNode*)nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_DELETE);
|
||||||
|
|
|
@ -82,29 +82,41 @@ static int32_t scaleOutByVgroups(SScaleOutContext* pCxt, SLogicSubplan* pSubplan
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t scaleOutForModify(SScaleOutContext* pCxt, SLogicSubplan* pSubplan, int32_t level, SNodeList* pGroup) {
|
static int32_t scaleOutForMerge(SScaleOutContext* pCxt, SLogicSubplan* pSubplan, int32_t level, SNodeList* pGroup) {
|
||||||
|
return nodesListStrictAppend(pGroup, (SNode*)singleCloneSubLogicPlan(pCxt, pSubplan, level));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t scaleOutForInsertValues(SScaleOutContext* pCxt, SLogicSubplan* pSubplan, int32_t level,
|
||||||
|
SNodeList* pGroup) {
|
||||||
SVnodeModifyLogicNode* pNode = (SVnodeModifyLogicNode*)pSubplan->pNode;
|
SVnodeModifyLogicNode* pNode = (SVnodeModifyLogicNode*)pSubplan->pNode;
|
||||||
if (MODIFY_TABLE_TYPE_DELETE == pNode->modifyType) {
|
|
||||||
return scaleOutByVgroups(pCxt, pSubplan, level, pGroup);
|
|
||||||
} else {
|
|
||||||
size_t numOfVgroups = taosArrayGetSize(pNode->pDataBlocks);
|
size_t numOfVgroups = taosArrayGetSize(pNode->pDataBlocks);
|
||||||
for (int32_t i = 0; i < numOfVgroups; ++i) {
|
for (int32_t i = 0; i < numOfVgroups; ++i) {
|
||||||
SLogicSubplan* pNewSubplan = singleCloneSubLogicPlan(pCxt, pSubplan, level);
|
SLogicSubplan* pNewSubplan = singleCloneSubLogicPlan(pCxt, pSubplan, level);
|
||||||
if (NULL == pNewSubplan) {
|
if (NULL == pNewSubplan) {
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
((SVnodeModifyLogicNode*)pNewSubplan->pNode)->pVgDataBlocks =
|
((SVnodeModifyLogicNode*)pNewSubplan->pNode)->pVgDataBlocks = (SVgDataBlocks*)taosArrayGetP(pNode->pDataBlocks, i);
|
||||||
(SVgDataBlocks*)taosArrayGetP(pNode->pDataBlocks, i);
|
|
||||||
if (TSDB_CODE_SUCCESS != nodesListStrictAppend(pGroup, (SNode*)pNewSubplan)) {
|
if (TSDB_CODE_SUCCESS != nodesListStrictAppend(pGroup, (SNode*)pNewSubplan)) {
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t scaleOutForInsert(SScaleOutContext* pCxt, SLogicSubplan* pSubplan, int32_t level, SNodeList* pGroup) {
|
||||||
|
SVnodeModifyLogicNode* pNode = (SVnodeModifyLogicNode*)pSubplan->pNode;
|
||||||
|
if (NULL == pNode->node.pChildren) {
|
||||||
|
return scaleOutForInsertValues(pCxt, pSubplan, level, pGroup);
|
||||||
|
}
|
||||||
|
return scaleOutForMerge(pCxt, pSubplan, level, pGroup);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t scaleOutForMerge(SScaleOutContext* pCxt, SLogicSubplan* pSubplan, int32_t level, SNodeList* pGroup) {
|
static int32_t scaleOutForModify(SScaleOutContext* pCxt, SLogicSubplan* pSubplan, int32_t level, SNodeList* pGroup) {
|
||||||
return nodesListStrictAppend(pGroup, (SNode*)singleCloneSubLogicPlan(pCxt, pSubplan, level));
|
SVnodeModifyLogicNode* pNode = (SVnodeModifyLogicNode*)pSubplan->pNode;
|
||||||
|
if (MODIFY_TABLE_TYPE_DELETE == pNode->modifyType) {
|
||||||
|
return scaleOutByVgroups(pCxt, pSubplan, level, pGroup);
|
||||||
|
}
|
||||||
|
return scaleOutForInsert(pCxt, pSubplan, level, pGroup);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t scaleOutForScan(SScaleOutContext* pCxt, SLogicSubplan* pSubplan, int32_t level, SNodeList* pGroup) {
|
static int32_t scaleOutForScan(SScaleOutContext* pCxt, SLogicSubplan* pSubplan, int32_t level, SNodeList* pGroup) {
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#define SPLIT_FLAG_MASK(n) (1 << n)
|
#define SPLIT_FLAG_MASK(n) (1 << n)
|
||||||
|
|
||||||
#define SPLIT_FLAG_STABLE_SPLIT SPLIT_FLAG_MASK(0)
|
#define SPLIT_FLAG_STABLE_SPLIT SPLIT_FLAG_MASK(0)
|
||||||
|
#define SPLIT_FLAG_INSERT_SPLIT SPLIT_FLAG_MASK(1)
|
||||||
|
|
||||||
#define SPLIT_FLAG_SET_MASK(val, mask) (val) |= (mask)
|
#define SPLIT_FLAG_SET_MASK(val, mask) (val) |= (mask)
|
||||||
#define SPLIT_FLAG_TEST_MASK(val, mask) (((val) & (mask)) != 0)
|
#define SPLIT_FLAG_TEST_MASK(val, mask) (((val) & (mask)) != 0)
|
||||||
|
@ -1196,6 +1197,41 @@ static int32_t smaIndexSplit(SSplitContext* pCxt, SLogicSubplan* pSubplan) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct SInsertSelectSplitInfo {
|
||||||
|
SLogicNode* pQueryRoot;
|
||||||
|
SLogicSubplan* pSubplan;
|
||||||
|
} SInsertSelectSplitInfo;
|
||||||
|
|
||||||
|
static bool insSelSplFindSplitNode(SSplitContext* pCxt, SLogicSubplan* pSubplan, SLogicNode* pNode,
|
||||||
|
SInsertSelectSplitInfo* pInfo) {
|
||||||
|
if (QUERY_NODE_LOGIC_PLAN_VNODE_MODIFY == nodeType(pNode) && 1 == LIST_LENGTH(pNode->pChildren) &&
|
||||||
|
MODIFY_TABLE_TYPE_INSERT == ((SVnodeModifyLogicNode*)pNode)->modifyType) {
|
||||||
|
pInfo->pQueryRoot = (SLogicNode*)nodesListGetNode(pNode->pChildren, 0);
|
||||||
|
pInfo->pSubplan = pSubplan;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t insertSelectSplit(SSplitContext* pCxt, SLogicSubplan* pSubplan) {
|
||||||
|
SInsertSelectSplitInfo info = {0};
|
||||||
|
if (!splMatch(pCxt, pSubplan, SPLIT_FLAG_INSERT_SPLIT, (FSplFindSplitNode)insSelSplFindSplitNode, &info)) {
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t code = splCreateExchangeNodeForSubplan(pCxt, info.pSubplan, info.pQueryRoot, info.pSubplan->subplanType);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = nodesListMakeStrictAppend(&info.pSubplan->pChildren, (SNode*)splCreateScanSubplan(pCxt, info.pQueryRoot, 0));
|
||||||
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
info.pSubplan->subplanType = SUBPLAN_TYPE_MODIFY;
|
||||||
|
SPLIT_FLAG_SET_MASK(info.pSubplan->splitFlag, SPLIT_FLAG_INSERT_SPLIT);
|
||||||
|
}
|
||||||
|
++(pCxt->groupId);
|
||||||
|
pCxt->split = true;
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
typedef struct SQnodeSplitInfo {
|
typedef struct SQnodeSplitInfo {
|
||||||
SLogicNode* pSplitNode;
|
SLogicNode* pSplitNode;
|
||||||
SLogicSubplan* pSubplan;
|
SLogicSubplan* pSubplan;
|
||||||
|
@ -1249,7 +1285,8 @@ static const SSplitRule splitRuleSet[] = {
|
||||||
{.pName = "SingleTableJoinSplit", .splitFunc = singleTableJoinSplit},
|
{.pName = "SingleTableJoinSplit", .splitFunc = singleTableJoinSplit},
|
||||||
{.pName = "UnionAllSplit", .splitFunc = unionAllSplit},
|
{.pName = "UnionAllSplit", .splitFunc = unionAllSplit},
|
||||||
{.pName = "UnionDistinctSplit", .splitFunc = unionDistinctSplit},
|
{.pName = "UnionDistinctSplit", .splitFunc = unionDistinctSplit},
|
||||||
{.pName = "SmaIndexSplit", .splitFunc = smaIndexSplit}
|
{.pName = "SmaIndexSplit", .splitFunc = smaIndexSplit},
|
||||||
|
{.pName = "InsertSelectSplit", .splitFunc = insertSelectSplit}
|
||||||
};
|
};
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
|
@ -1258,7 +1295,11 @@ static const int32_t splitRuleNum = (sizeof(splitRuleSet) / sizeof(SSplitRule));
|
||||||
static void dumpLogicSubplan(const char* pRuleName, SLogicSubplan* pSubplan) {
|
static void dumpLogicSubplan(const char* pRuleName, SLogicSubplan* pSubplan) {
|
||||||
char* pStr = NULL;
|
char* pStr = NULL;
|
||||||
nodesNodeToString((SNode*)pSubplan, false, &pStr, NULL);
|
nodesNodeToString((SNode*)pSubplan, false, &pStr, NULL);
|
||||||
|
if (NULL == pRuleName) {
|
||||||
|
qDebugL("before split: %s", pStr);
|
||||||
|
} else {
|
||||||
qDebugL("apply split %s rule: %s", pRuleName, pStr);
|
qDebugL("apply split %s rule: %s", pRuleName, pStr);
|
||||||
|
}
|
||||||
taosMemoryFree(pStr);
|
taosMemoryFree(pStr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1266,6 +1307,7 @@ static int32_t applySplitRule(SPlanContext* pCxt, SLogicSubplan* pSubplan) {
|
||||||
SSplitContext cxt = {
|
SSplitContext cxt = {
|
||||||
.pPlanCxt = pCxt, .queryId = pSubplan->id.queryId, .groupId = pSubplan->id.groupId + 1, .split = false};
|
.pPlanCxt = pCxt, .queryId = pSubplan->id.queryId, .groupId = pSubplan->id.groupId + 1, .split = false};
|
||||||
bool split = false;
|
bool split = false;
|
||||||
|
dumpLogicSubplan(NULL, pSubplan);
|
||||||
do {
|
do {
|
||||||
split = false;
|
split = false;
|
||||||
for (int32_t i = 0; i < splitRuleNum; ++i) {
|
for (int32_t i = 0; i < splitRuleNum; ++i) {
|
||||||
|
@ -1293,8 +1335,16 @@ static void setVgroupsInfo(SLogicNode* pNode, SLogicSubplan* pSubplan) {
|
||||||
FOREACH(pChild, pNode->pChildren) { setVgroupsInfo((SLogicNode*)pChild, pSubplan); }
|
FOREACH(pChild, pNode->pChildren) { setVgroupsInfo((SLogicNode*)pChild, pSubplan); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool needSplitSubplan(SLogicSubplan* pLogicSubplan) {
|
||||||
|
if (QUERY_NODE_LOGIC_PLAN_VNODE_MODIFY != nodeType(pLogicSubplan->pNode)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
SVnodeModifyLogicNode* pModify = (SVnodeModifyLogicNode*)pLogicSubplan->pNode;
|
||||||
|
return (MODIFY_TABLE_TYPE_INSERT == pModify->modifyType && NULL != pModify->node.pChildren);
|
||||||
|
}
|
||||||
|
|
||||||
int32_t splitLogicPlan(SPlanContext* pCxt, SLogicSubplan* pLogicSubplan) {
|
int32_t splitLogicPlan(SPlanContext* pCxt, SLogicSubplan* pLogicSubplan) {
|
||||||
if (QUERY_NODE_LOGIC_PLAN_VNODE_MODIFY == nodeType(pLogicSubplan->pNode)) {
|
if (!needSplitSubplan(pLogicSubplan)) {
|
||||||
setVgroupsInfo(pLogicSubplan->pNode, pLogicSubplan);
|
setVgroupsInfo(pLogicSubplan->pNode, pLogicSubplan);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -91,3 +91,9 @@ TEST_F(PlanOtherTest, delete) {
|
||||||
|
|
||||||
run("DELETE FROM st1 WHERE ts > now - 2d and ts < now - 1d AND tag1 = 10");
|
run("DELETE FROM st1 WHERE ts > now - 2d and ts < now - 1d AND tag1 = 10");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(PlanOtherTest, insert) {
|
||||||
|
useDb("root", "test");
|
||||||
|
|
||||||
|
run("INSERT INTO t1 SELECT * FROM t1");
|
||||||
|
}
|
||||||
|
|
|
@ -40,7 +40,7 @@ int32_t schSwitchJobStatus(SSchJob* pJob, int32_t status, void* param) {
|
||||||
SCH_RET(schProcessOnJobFailure(pJob, (param ? *(int32_t*)param : 0)));
|
SCH_RET(schProcessOnJobFailure(pJob, (param ? *(int32_t*)param : 0)));
|
||||||
break;
|
break;
|
||||||
case JOB_TASK_STATUS_DROP:
|
case JOB_TASK_STATUS_DROP:
|
||||||
SCH_ERR_JRET(schProcessOnJobDropped(pJob, *(int32_t*)param));
|
schProcessOnJobDropped(pJob, *(int32_t*)param);
|
||||||
|
|
||||||
if (taosRemoveRef(schMgmt.jobRef, pJob->refId)) {
|
if (taosRemoveRef(schMgmt.jobRef, pJob->refId)) {
|
||||||
SCH_JOB_ELOG("remove job from job list failed, refId:0x%" PRIx64, pJob->refId);
|
SCH_JOB_ELOG("remove job from job list failed, refId:0x%" PRIx64, pJob->refId);
|
||||||
|
|
|
@ -144,11 +144,9 @@ void schedulerFreeJob(int64_t* jobId, int32_t errCode) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (schJobDone(pJob)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
schSwitchJobStatus(pJob, JOB_TASK_STATUS_DROP, (void*)&errCode);
|
schSwitchJobStatus(pJob, JOB_TASK_STATUS_DROP, (void*)&errCode);
|
||||||
|
|
||||||
|
schReleaseJob(*jobId);
|
||||||
*jobId = 0;
|
*jobId = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,7 @@ typedef struct SRaftCfg {
|
||||||
TdFilePtr pFile;
|
TdFilePtr pFile;
|
||||||
char path[TSDB_FILENAME_LEN * 2];
|
char path[TSDB_FILENAME_LEN * 2];
|
||||||
int8_t isStandBy;
|
int8_t isStandBy;
|
||||||
int8_t snapshotEnable;
|
int8_t snapshotStrategy;
|
||||||
SyncIndex lastConfigIndex;
|
SyncIndex lastConfigIndex;
|
||||||
|
|
||||||
SyncIndex configIndexArr[MAX_CONFIG_INDEX_COUNT];
|
SyncIndex configIndexArr[MAX_CONFIG_INDEX_COUNT];
|
||||||
|
@ -62,7 +62,7 @@ int32_t raftCfgFromStr(const char *s, SRaftCfg *pRaftCfg);
|
||||||
|
|
||||||
typedef struct SRaftCfgMeta {
|
typedef struct SRaftCfgMeta {
|
||||||
int8_t isStandBy;
|
int8_t isStandBy;
|
||||||
int8_t snapshotEnable;
|
int8_t snapshotStrategy;
|
||||||
SyncIndex lastConfigIndex;
|
SyncIndex lastConfigIndex;
|
||||||
} SRaftCfgMeta;
|
} SRaftCfgMeta;
|
||||||
|
|
||||||
|
|
|
@ -96,12 +96,20 @@ int32_t syncNodeElect(SSyncNode* pSyncNode) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pSyncNode->pRaftCfg->snapshotEnable) {
|
switch (pSyncNode->pRaftCfg->snapshotStrategy) {
|
||||||
ret = syncNodeRequestVotePeersSnapshot(pSyncNode);
|
case SYNC_STRATEGY_NO_SNAPSHOT:
|
||||||
} else {
|
|
||||||
ret = syncNodeRequestVotePeers(pSyncNode);
|
ret = syncNodeRequestVotePeers(pSyncNode);
|
||||||
}
|
break;
|
||||||
|
|
||||||
|
case SYNC_STRATEGY_STANDARD_SNAPSHOT:
|
||||||
|
case SYNC_STRATEGY_WAL_FIRST:
|
||||||
|
ret = syncNodeRequestVotePeersSnapshot(pSyncNode);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
ret = syncNodeRequestVotePeers(pSyncNode);
|
||||||
|
break;
|
||||||
|
}
|
||||||
ASSERT(ret == 0);
|
ASSERT(ret == 0);
|
||||||
syncNodeResetElectTimer(pSyncNode);
|
syncNodeResetElectTimer(pSyncNode);
|
||||||
|
|
||||||
|
|
|
@ -672,12 +672,12 @@ int32_t syncNodeProposeBatch(SSyncNode* pSyncNode, SRpcMsg* pMsgArr, bool* pIsWe
|
||||||
}
|
}
|
||||||
|
|
||||||
if (arrSize > SYNC_MAX_BATCH_SIZE) {
|
if (arrSize > SYNC_MAX_BATCH_SIZE) {
|
||||||
syncNodeErrorLog(pSyncNode, "sync propose match batch error");
|
syncNodeErrorLog(pSyncNode, "sync propose batch error");
|
||||||
terrno = TSDB_CODE_SYN_BATCH_ERROR;
|
terrno = TSDB_CODE_SYN_BATCH_ERROR;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pSyncNode->state == TAOS_SYNC_STATE_LEADER) {
|
if (pSyncNode->state != TAOS_SYNC_STATE_LEADER) {
|
||||||
syncNodeErrorLog(pSyncNode, "sync propose not leader");
|
syncNodeErrorLog(pSyncNode, "sync propose not leader");
|
||||||
terrno = TSDB_CODE_SYN_NOT_LEADER;
|
terrno = TSDB_CODE_SYN_NOT_LEADER;
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -707,15 +707,38 @@ int32_t syncNodeProposeBatch(SSyncNode* pSyncNode, SRpcMsg* pMsgArr, bool* pIsWe
|
||||||
syncClientRequestBatch2RpcMsg(pSyncMsg, &rpcMsg);
|
syncClientRequestBatch2RpcMsg(pSyncMsg, &rpcMsg);
|
||||||
taosMemoryFree(pSyncMsg); // only free msg body, do not free rpc msg content
|
taosMemoryFree(pSyncMsg); // only free msg body, do not free rpc msg content
|
||||||
|
|
||||||
if (pSyncNode->FpEqMsg != NULL && (*pSyncNode->FpEqMsg)(pSyncNode->msgcb, &rpcMsg) == 0) {
|
if (pSyncNode->replicaNum == 1 && pSyncNode->vgId != 1) {
|
||||||
// enqueue msg ok
|
int32_t code = syncNodeOnClientRequestBatchCb(pSyncNode, pSyncMsg);
|
||||||
|
if (code == 0) {
|
||||||
|
// update rpc msg applyIndex
|
||||||
|
SRpcMsg* msgArr = syncClientRequestBatchRpcMsgArr(pSyncMsg);
|
||||||
|
ASSERT(arrSize == pSyncMsg->dataCount);
|
||||||
|
for (int i = 0; i < arrSize; ++i) {
|
||||||
|
pMsgArr[i].info.conn.applyIndex = msgArr[i].info.conn.applyIndex;
|
||||||
|
syncRespMgrDel(pSyncNode->pSyncRespMgr, raftArr[i].seqNum);
|
||||||
|
}
|
||||||
|
|
||||||
|
rpcFreeCont(rpcMsg.pCont);
|
||||||
|
terrno = 0;
|
||||||
|
return 1;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
sError("enqueue msg error, FpEqMsg is NULL");
|
|
||||||
terrno = TSDB_CODE_SYN_INTERNAL_ERROR;
|
terrno = TSDB_CODE_SYN_INTERNAL_ERROR;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
if (pSyncNode->FpEqMsg != NULL && (*pSyncNode->FpEqMsg)(pSyncNode->msgcb, &rpcMsg) == 0) {
|
||||||
|
// enqueue msg ok
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
sError("vgId:%d, enqueue msg error, FpEqMsg is NULL", pSyncNode->vgId);
|
||||||
|
terrno = TSDB_CODE_SYN_INTERNAL_ERROR;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -730,7 +753,7 @@ int32_t syncNodePropose(SSyncNode* pSyncNode, SRpcMsg* pMsg, bool isWeak) {
|
||||||
if (pSyncNode->changing && pMsg->msgType != TDMT_SYNC_CONFIG_CHANGE_FINISH) {
|
if (pSyncNode->changing && pMsg->msgType != TDMT_SYNC_CONFIG_CHANGE_FINISH) {
|
||||||
ret = -1;
|
ret = -1;
|
||||||
terrno = TSDB_CODE_SYN_PROPOSE_NOT_READY;
|
terrno = TSDB_CODE_SYN_PROPOSE_NOT_READY;
|
||||||
sError("sync propose not ready, type:%s,%d", TMSG_INFO(pMsg->msgType), pMsg->msgType);
|
sError("vgId:%d, sync propose not ready, type:%s,%d", pSyncNode->vgId, TMSG_INFO(pMsg->msgType), pMsg->msgType);
|
||||||
goto _END;
|
goto _END;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -739,7 +762,8 @@ int32_t syncNodePropose(SSyncNode* pSyncNode, SRpcMsg* pMsg, bool isWeak) {
|
||||||
if (!syncNodeCanChange(pSyncNode)) {
|
if (!syncNodeCanChange(pSyncNode)) {
|
||||||
ret = -1;
|
ret = -1;
|
||||||
terrno = TSDB_CODE_SYN_RECONFIG_NOT_READY;
|
terrno = TSDB_CODE_SYN_RECONFIG_NOT_READY;
|
||||||
sError("sync reconfig not ready, type:%s,%d", TMSG_INFO(pMsg->msgType), pMsg->msgType);
|
sError("vgId:%d, sync reconfig not ready, type:%s,%d", pSyncNode->vgId, TMSG_INFO(pMsg->msgType),
|
||||||
|
pMsg->msgType);
|
||||||
goto _END;
|
goto _END;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -780,7 +804,7 @@ int32_t syncNodePropose(SSyncNode* pSyncNode, SRpcMsg* pMsg, bool isWeak) {
|
||||||
} else {
|
} else {
|
||||||
ret = -1;
|
ret = -1;
|
||||||
terrno = TSDB_CODE_SYN_INTERNAL_ERROR;
|
terrno = TSDB_CODE_SYN_INTERNAL_ERROR;
|
||||||
sError("enqueue msg error, FpEqMsg is NULL");
|
sError("vgId:%d, enqueue msg error, FpEqMsg is NULL", pSyncNode->vgId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -790,7 +814,7 @@ int32_t syncNodePropose(SSyncNode* pSyncNode, SRpcMsg* pMsg, bool isWeak) {
|
||||||
} else {
|
} else {
|
||||||
ret = -1;
|
ret = -1;
|
||||||
terrno = TSDB_CODE_SYN_NOT_LEADER;
|
terrno = TSDB_CODE_SYN_NOT_LEADER;
|
||||||
sError("sync propose not leader, %s", syncUtilState2String(pSyncNode->state));
|
sError("vgId:%d, sync propose not leader, %s", pSyncNode->vgId, syncUtilState2String(pSyncNode->state));
|
||||||
goto _END;
|
goto _END;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -820,7 +844,7 @@ SSyncNode* syncNodeOpen(const SSyncInfo* pOldSyncInfo) {
|
||||||
// create a new raft config file
|
// create a new raft config file
|
||||||
SRaftCfgMeta meta;
|
SRaftCfgMeta meta;
|
||||||
meta.isStandBy = pSyncInfo->isStandBy;
|
meta.isStandBy = pSyncInfo->isStandBy;
|
||||||
meta.snapshotEnable = pSyncInfo->snapshotStrategy;
|
meta.snapshotStrategy = pSyncInfo->snapshotStrategy;
|
||||||
meta.lastConfigIndex = SYNC_INDEX_INVALID;
|
meta.lastConfigIndex = SYNC_INDEX_INVALID;
|
||||||
ret = raftCfgCreateFile((SSyncCfg*)&(pSyncInfo->syncCfg), meta, pSyncNode->configPath);
|
ret = raftCfgCreateFile((SSyncCfg*)&(pSyncInfo->syncCfg), meta, pSyncNode->configPath);
|
||||||
ASSERT(ret == 0);
|
ASSERT(ret == 0);
|
||||||
|
@ -969,7 +993,7 @@ SSyncNode* syncNodeOpen(const SSyncInfo* pOldSyncInfo) {
|
||||||
pSyncNode->FpOnSnapshotSend = syncNodeOnSnapshotSendCb;
|
pSyncNode->FpOnSnapshotSend = syncNodeOnSnapshotSendCb;
|
||||||
pSyncNode->FpOnSnapshotRsp = syncNodeOnSnapshotRspCb;
|
pSyncNode->FpOnSnapshotRsp = syncNodeOnSnapshotRspCb;
|
||||||
|
|
||||||
if (pSyncNode->pRaftCfg->snapshotEnable) {
|
if (pSyncNode->pRaftCfg->snapshotStrategy) {
|
||||||
sInfo("sync node use snapshot");
|
sInfo("sync node use snapshot");
|
||||||
pSyncNode->FpOnRequestVote = syncNodeOnRequestVoteSnapshotCb;
|
pSyncNode->FpOnRequestVote = syncNodeOnRequestVoteSnapshotCb;
|
||||||
pSyncNode->FpOnRequestVoteReply = syncNodeOnRequestVoteReplySnapshotCb;
|
pSyncNode->FpOnRequestVoteReply = syncNodeOnRequestVoteReplySnapshotCb;
|
||||||
|
@ -1107,7 +1131,7 @@ void syncNodeClose(SSyncNode* pSyncNode) {
|
||||||
// option
|
// option
|
||||||
// bool syncNodeSnapshotEnable(SSyncNode* pSyncNode) { return pSyncNode->pRaftCfg->snapshotEnable; }
|
// bool syncNodeSnapshotEnable(SSyncNode* pSyncNode) { return pSyncNode->pRaftCfg->snapshotEnable; }
|
||||||
|
|
||||||
ESyncStrategy syncNodeStrategy(SSyncNode* pSyncNode) { return pSyncNode->pRaftCfg->snapshotEnable; }
|
ESyncStrategy syncNodeStrategy(SSyncNode* pSyncNode) { return pSyncNode->pRaftCfg->snapshotStrategy; }
|
||||||
|
|
||||||
// ping --------------
|
// ping --------------
|
||||||
int32_t syncNodePing(SSyncNode* pSyncNode, const SRaftId* destRaftId, SyncPing* pMsg) {
|
int32_t syncNodePing(SSyncNode* pSyncNode, const SRaftId* destRaftId, SyncPing* pMsg) {
|
||||||
|
@ -2489,6 +2513,9 @@ int32_t syncNodeOnClientRequestBatchCb(SSyncNode* ths, SyncClientRequestBatch* p
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// update rpc msg conn apply.index
|
||||||
|
msgArr[i].info.conn.applyIndex = pEntry->index;
|
||||||
}
|
}
|
||||||
|
|
||||||
// fsync once
|
// fsync once
|
||||||
|
@ -2496,6 +2523,15 @@ int32_t syncNodeOnClientRequestBatchCb(SSyncNode* ths, SyncClientRequestBatch* p
|
||||||
SWal* pWal = pData->pWal;
|
SWal* pWal = pData->pWal;
|
||||||
walFsync(pWal, true);
|
walFsync(pWal, true);
|
||||||
|
|
||||||
|
if (ths->replicaNum > 1) {
|
||||||
|
// if multi replica, start replicate right now
|
||||||
|
syncNodeReplicate(ths);
|
||||||
|
|
||||||
|
} else if (ths->replicaNum == 1) {
|
||||||
|
// one replica
|
||||||
|
syncMaybeAdvanceCommitIndex(ths);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -182,7 +182,7 @@ cJSON *raftCfg2Json(SRaftCfg *pRaftCfg) {
|
||||||
cJSON *pRoot = cJSON_CreateObject();
|
cJSON *pRoot = cJSON_CreateObject();
|
||||||
cJSON_AddItemToObject(pRoot, "SSyncCfg", syncCfg2Json(&(pRaftCfg->cfg)));
|
cJSON_AddItemToObject(pRoot, "SSyncCfg", syncCfg2Json(&(pRaftCfg->cfg)));
|
||||||
cJSON_AddNumberToObject(pRoot, "isStandBy", pRaftCfg->isStandBy);
|
cJSON_AddNumberToObject(pRoot, "isStandBy", pRaftCfg->isStandBy);
|
||||||
cJSON_AddNumberToObject(pRoot, "snapshotEnable", pRaftCfg->snapshotEnable);
|
cJSON_AddNumberToObject(pRoot, "snapshotStrategy", pRaftCfg->snapshotStrategy);
|
||||||
|
|
||||||
char buf64[128];
|
char buf64[128];
|
||||||
snprintf(buf64, sizeof(buf64), "%ld", pRaftCfg->lastConfigIndex);
|
snprintf(buf64, sizeof(buf64), "%ld", pRaftCfg->lastConfigIndex);
|
||||||
|
@ -228,7 +228,7 @@ int32_t raftCfgCreateFile(SSyncCfg *pCfg, SRaftCfgMeta meta, const char *path) {
|
||||||
SRaftCfg raftCfg;
|
SRaftCfg raftCfg;
|
||||||
raftCfg.cfg = *pCfg;
|
raftCfg.cfg = *pCfg;
|
||||||
raftCfg.isStandBy = meta.isStandBy;
|
raftCfg.isStandBy = meta.isStandBy;
|
||||||
raftCfg.snapshotEnable = meta.snapshotEnable;
|
raftCfg.snapshotStrategy = meta.snapshotStrategy;
|
||||||
raftCfg.lastConfigIndex = meta.lastConfigIndex;
|
raftCfg.lastConfigIndex = meta.lastConfigIndex;
|
||||||
raftCfg.configIndexCount = 1;
|
raftCfg.configIndexCount = 1;
|
||||||
memset(raftCfg.configIndexArr, 0, sizeof(raftCfg.configIndexArr));
|
memset(raftCfg.configIndexArr, 0, sizeof(raftCfg.configIndexArr));
|
||||||
|
@ -257,8 +257,8 @@ int32_t raftCfgFromJson(const cJSON *pRoot, SRaftCfg *pRaftCfg) {
|
||||||
cJSON *pJsonIsStandBy = cJSON_GetObjectItem(pJson, "isStandBy");
|
cJSON *pJsonIsStandBy = cJSON_GetObjectItem(pJson, "isStandBy");
|
||||||
pRaftCfg->isStandBy = cJSON_GetNumberValue(pJsonIsStandBy);
|
pRaftCfg->isStandBy = cJSON_GetNumberValue(pJsonIsStandBy);
|
||||||
|
|
||||||
cJSON *pJsonSnapshotEnable = cJSON_GetObjectItem(pJson, "snapshotEnable");
|
cJSON *pJsonSnapshotStrategy = cJSON_GetObjectItem(pJson, "snapshotStrategy");
|
||||||
pRaftCfg->snapshotEnable = cJSON_GetNumberValue(pJsonSnapshotEnable);
|
pRaftCfg->snapshotStrategy = cJSON_GetNumberValue(pJsonSnapshotStrategy);
|
||||||
|
|
||||||
cJSON *pJsonLastConfigIndex = cJSON_GetObjectItem(pJson, "lastConfigIndex");
|
cJSON *pJsonLastConfigIndex = cJSON_GetObjectItem(pJson, "lastConfigIndex");
|
||||||
pRaftCfg->lastConfigIndex = atoll(cJSON_GetStringValue(pJsonLastConfigIndex));
|
pRaftCfg->lastConfigIndex = atoll(cJSON_GetStringValue(pJsonLastConfigIndex));
|
||||||
|
|
|
@ -132,10 +132,6 @@ int32_t syncNodeAppendEntriesPeersSnapshot2(SSyncNode* pSyncNode) {
|
||||||
SyncIndex preLogIndex = syncNodeGetPreIndex(pSyncNode, nextIndex);
|
SyncIndex preLogIndex = syncNodeGetPreIndex(pSyncNode, nextIndex);
|
||||||
SyncTerm preLogTerm = syncNodeGetPreTerm(pSyncNode, nextIndex);
|
SyncTerm preLogTerm = syncNodeGetPreTerm(pSyncNode, nextIndex);
|
||||||
if (preLogTerm == SYNC_TERM_INVALID) {
|
if (preLogTerm == SYNC_TERM_INVALID) {
|
||||||
SSyncSnapshotSender* pSender = syncNodeGetSnapshotSender(pSyncNode, pDestId);
|
|
||||||
ASSERT(pSender != NULL);
|
|
||||||
ASSERT(!snapshotSenderIsStart(pSender));
|
|
||||||
|
|
||||||
SyncIndex newNextIndex = syncNodeGetLastIndex(pSyncNode) + 1;
|
SyncIndex newNextIndex = syncNodeGetLastIndex(pSyncNode) + 1;
|
||||||
syncIndexMgrSetIndex(pSyncNode->pNextIndex, pDestId, newNextIndex);
|
syncIndexMgrSetIndex(pSyncNode->pNextIndex, pDestId, newNextIndex);
|
||||||
syncIndexMgrSetIndex(pSyncNode->pMatchIndex, pDestId, SYNC_INDEX_INVALID);
|
syncIndexMgrSetIndex(pSyncNode->pMatchIndex, pDestId, SYNC_INDEX_INVALID);
|
||||||
|
@ -145,26 +141,32 @@ int32_t syncNodeAppendEntriesPeersSnapshot2(SSyncNode* pSyncNode) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// entry pointer array
|
||||||
SSyncRaftEntry* entryPArr[SYNC_MAX_BATCH_SIZE];
|
SSyncRaftEntry* entryPArr[SYNC_MAX_BATCH_SIZE];
|
||||||
memset(entryPArr, 0, sizeof(entryPArr));
|
memset(entryPArr, 0, sizeof(entryPArr));
|
||||||
|
|
||||||
|
// get entry batch
|
||||||
int32_t getCount = 0;
|
int32_t getCount = 0;
|
||||||
SyncIndex getEntryIndex = nextIndex;
|
SyncIndex getEntryIndex = nextIndex;
|
||||||
for (int32_t i = 0; i < pSyncNode->batchSize; ++i) {
|
for (int32_t i = 0; i < pSyncNode->batchSize; ++i) {
|
||||||
SSyncRaftEntry* pEntry;
|
SSyncRaftEntry* pEntry = NULL;
|
||||||
int32_t code = pSyncNode->pLogStore->syncLogGetEntry(pSyncNode->pLogStore, getEntryIndex, &pEntry);
|
int32_t code = pSyncNode->pLogStore->syncLogGetEntry(pSyncNode->pLogStore, getEntryIndex, &pEntry);
|
||||||
if (code == 0) {
|
if (code == 0) {
|
||||||
ASSERT(pEntry != NULL);
|
ASSERT(pEntry != NULL);
|
||||||
entryPArr[i] = pEntry;
|
entryPArr[i] = pEntry;
|
||||||
getCount++;
|
getCount++;
|
||||||
|
getEntryIndex++;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// build msg
|
||||||
SyncAppendEntriesBatch* pMsg = syncAppendEntriesBatchBuild(entryPArr, getCount, pSyncNode->vgId);
|
SyncAppendEntriesBatch* pMsg = syncAppendEntriesBatchBuild(entryPArr, getCount, pSyncNode->vgId);
|
||||||
ASSERT(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
|
|
||||||
|
// free entries
|
||||||
for (int32_t i = 0; i < pSyncNode->batchSize; ++i) {
|
for (int32_t i = 0; i < pSyncNode->batchSize; ++i) {
|
||||||
SSyncRaftEntry* pEntry = entryPArr[i];
|
SSyncRaftEntry* pEntry = entryPArr[i];
|
||||||
if (pEntry != NULL) {
|
if (pEntry != NULL) {
|
||||||
|
@ -197,12 +199,6 @@ int32_t syncNodeAppendEntriesPeersSnapshot(SSyncNode* pSyncNode) {
|
||||||
syncIndexMgrLog2("begin append entries peers pNextIndex:", pSyncNode->pNextIndex);
|
syncIndexMgrLog2("begin append entries peers pNextIndex:", pSyncNode->pNextIndex);
|
||||||
syncIndexMgrLog2("begin append entries peers pMatchIndex:", pSyncNode->pMatchIndex);
|
syncIndexMgrLog2("begin append entries peers pMatchIndex:", pSyncNode->pMatchIndex);
|
||||||
logStoreSimpleLog2("begin append entries peers LogStore:", pSyncNode->pLogStore);
|
logStoreSimpleLog2("begin append entries peers LogStore:", pSyncNode->pLogStore);
|
||||||
if (gRaftDetailLog) {
|
|
||||||
SSnapshot snapshot;
|
|
||||||
pSyncNode->pFsm->FpGetSnapshotInfo(pSyncNode->pFsm, &snapshot);
|
|
||||||
sTrace("begin append entries peers, snapshot.lastApplyIndex:%ld, snapshot.lastApplyTerm:%lu",
|
|
||||||
snapshot.lastApplyIndex, snapshot.lastApplyTerm);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t ret = 0;
|
int32_t ret = 0;
|
||||||
for (int i = 0; i < pSyncNode->peersNum; ++i) {
|
for (int i = 0; i < pSyncNode->peersNum; ++i) {
|
||||||
|
@ -224,9 +220,6 @@ int32_t syncNodeAppendEntriesPeersSnapshot(SSyncNode* pSyncNode) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// batch optimized
|
|
||||||
// SyncIndex lastIndex = syncUtilMinIndex(pSyncNode->pLogStore->getLastIndex(pSyncNode->pLogStore), nextIndex);
|
|
||||||
|
|
||||||
// prepare entry
|
// prepare entry
|
||||||
SyncAppendEntries* pMsg = NULL;
|
SyncAppendEntries* pMsg = NULL;
|
||||||
|
|
||||||
|
@ -283,11 +276,24 @@ int32_t syncNodeReplicate(SSyncNode* pSyncNode) {
|
||||||
// start replicate
|
// start replicate
|
||||||
int32_t ret = 0;
|
int32_t ret = 0;
|
||||||
|
|
||||||
if (pSyncNode->pRaftCfg->snapshotEnable) {
|
switch (pSyncNode->pRaftCfg->snapshotStrategy) {
|
||||||
ret = syncNodeAppendEntriesPeersSnapshot(pSyncNode);
|
case SYNC_STRATEGY_NO_SNAPSHOT:
|
||||||
} else {
|
|
||||||
ret = syncNodeAppendEntriesPeers(pSyncNode);
|
ret = syncNodeAppendEntriesPeers(pSyncNode);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SYNC_STRATEGY_STANDARD_SNAPSHOT:
|
||||||
|
ret = syncNodeAppendEntriesPeersSnapshot(pSyncNode);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SYNC_STRATEGY_WAL_FIRST:
|
||||||
|
ret = syncNodeAppendEntriesPeersSnapshot2(pSyncNode);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
ret = syncNodeAppendEntriesPeers(pSyncNode);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -83,7 +83,7 @@ void test3() {
|
||||||
} else {
|
} else {
|
||||||
SRaftCfgMeta meta;
|
SRaftCfgMeta meta;
|
||||||
meta.isStandBy = 7;
|
meta.isStandBy = 7;
|
||||||
meta.snapshotEnable = 9;
|
meta.snapshotStrategy = 9;
|
||||||
meta.lastConfigIndex = 789;
|
meta.lastConfigIndex = 789;
|
||||||
raftCfgCreateFile(pCfg, meta, s);
|
raftCfgCreateFile(pCfg, meta, s);
|
||||||
printf("%s create json file: %s \n", (char*)__FUNCTION__, s);
|
printf("%s create json file: %s \n", (char*)__FUNCTION__, s);
|
||||||
|
@ -108,7 +108,7 @@ void test5() {
|
||||||
|
|
||||||
pCfg->cfg.myIndex = taosGetTimestampSec();
|
pCfg->cfg.myIndex = taosGetTimestampSec();
|
||||||
pCfg->isStandBy += 2;
|
pCfg->isStandBy += 2;
|
||||||
pCfg->snapshotEnable += 3;
|
pCfg->snapshotStrategy += 3;
|
||||||
pCfg->lastConfigIndex += 1000;
|
pCfg->lastConfigIndex += 1000;
|
||||||
|
|
||||||
pCfg->configIndexCount = 5;
|
pCfg->configIndexCount = 5;
|
||||||
|
|
|
@ -260,6 +260,14 @@ char *taosDirName(char *name) {
|
||||||
name[0] = 0;
|
name[0] = 0;
|
||||||
}
|
}
|
||||||
return name;
|
return name;
|
||||||
|
#elif defined(_TD_DARWIN_64)
|
||||||
|
char *end = strrchr(name, '/');
|
||||||
|
if (end != NULL) {
|
||||||
|
*end = '\0';
|
||||||
|
} else {
|
||||||
|
name[0] = 0;
|
||||||
|
}
|
||||||
|
return name;
|
||||||
#else
|
#else
|
||||||
return dirname(name);
|
return dirname(name);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -947,9 +947,9 @@ int32_t taosGetFqdn(char *fqdn) {
|
||||||
hostname[1023] = '\0';
|
hostname[1023] = '\0';
|
||||||
if (gethostname(hostname, 1023) == -1) {
|
if (gethostname(hostname, 1023) == -1) {
|
||||||
#ifdef WINDOWS
|
#ifdef WINDOWS
|
||||||
printf("failed to get hostname, reason:%s", strerror(WSAGetLastError()));
|
printf("failed to get hostname, reason:%s\n", strerror(WSAGetLastError()));
|
||||||
#else
|
#else
|
||||||
printf("failed to get hostname, reason:%s", strerror(errno));
|
printf("failed to get hostname, reason:%s\n", strerror(errno));
|
||||||
#endif
|
#endif
|
||||||
assert(0);
|
assert(0);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -968,7 +968,7 @@ int32_t taosGetFqdn(char *fqdn) {
|
||||||
#endif // __APPLE__
|
#endif // __APPLE__
|
||||||
int32_t ret = getaddrinfo(hostname, NULL, &hints, &result);
|
int32_t ret = getaddrinfo(hostname, NULL, &hints, &result);
|
||||||
if (!result) {
|
if (!result) {
|
||||||
fprintf(stderr, "failed to get fqdn, code:%d, reason:%s", ret, gai_strerror(ret));
|
fprintf(stderr, "failed to get fqdn, code:%d, reason:%s\n", ret, gai_strerror(ret));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -759,9 +759,11 @@ int32_t taosGetSystemUUID(char *uid, int32_t uidlen) {
|
||||||
return 0;
|
return 0;
|
||||||
#elif defined(_TD_DARWIN_64)
|
#elif defined(_TD_DARWIN_64)
|
||||||
uuid_t uuid = {0};
|
uuid_t uuid = {0};
|
||||||
|
char buf[37] = {0};
|
||||||
uuid_generate(uuid);
|
uuid_generate(uuid);
|
||||||
// it's caller's responsibility to make enough space for `uid`, that's 36-char + 1-null
|
// it's caller's responsibility to make enough space for `uid`, that's 36-char + 1-null
|
||||||
uuid_unparse_lower(uuid, uid);
|
uuid_unparse_lower(uuid, buf);
|
||||||
|
memcpy(uid, buf, uidlen);
|
||||||
return 0;
|
return 0;
|
||||||
#else
|
#else
|
||||||
int len = 0;
|
int len = 0;
|
||||||
|
|
|
@ -93,7 +93,7 @@ TS_FUNC = [
|
||||||
"CSUM", "DERIVATIVE", "DIFF", "IRATE", "MAVG", "SAMPLE", "STATECOUNT", "STATEDURATION", "TWA"
|
"CSUM", "DERIVATIVE", "DIFF", "IRATE", "MAVG", "SAMPLE", "STATECOUNT", "STATEDURATION", "TWA"
|
||||||
]
|
]
|
||||||
|
|
||||||
SYSINFO_FUCN = [
|
SYSINFO_FUNC = [
|
||||||
"DATABASE", "CLIENT_VERSION", "SERVER_VERSION", "SERVER_STATUS", "CURRENT_USER", "USER"
|
"DATABASE", "CLIENT_VERSION", "SERVER_VERSION", "SERVER_STATUS", "CURRENT_USER", "USER"
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
@ -167,7 +167,8 @@
|
||||||
./test.sh -f tsim/sma/rsmaPersistenceRecovery.sim
|
./test.sh -f tsim/sma/rsmaPersistenceRecovery.sim
|
||||||
|
|
||||||
# --- valgrind
|
# --- valgrind
|
||||||
./test.sh -f tsim/valgrind/checkError.sim
|
./test.sh -f tsim/valgrind/checkError1.sim
|
||||||
|
./test.sh -f tsim/valgrind/checkError2.sim
|
||||||
|
|
||||||
# --- vnode
|
# --- vnode
|
||||||
# ./test.sh -f tsim/vnode/replica3_basic.sim
|
# ./test.sh -f tsim/vnode/replica3_basic.sim
|
||||||
|
|
|
@ -4,13 +4,17 @@ set +e
|
||||||
#set -x
|
#set -x
|
||||||
|
|
||||||
NODE_NAME=
|
NODE_NAME=
|
||||||
|
DETAIL=0
|
||||||
|
|
||||||
while getopts "n:" arg
|
while getopts "n:d" arg
|
||||||
do
|
do
|
||||||
case $arg in
|
case $arg in
|
||||||
n)
|
n)
|
||||||
NODE_NAME=$OPTARG
|
NODE_NAME=$OPTARG
|
||||||
;;
|
;;
|
||||||
|
d)
|
||||||
|
DETAIL=1
|
||||||
|
;;
|
||||||
?)
|
?)
|
||||||
echo "unkown argument"
|
echo "unkown argument"
|
||||||
;;
|
;;
|
||||||
|
@ -30,15 +34,26 @@ fi
|
||||||
|
|
||||||
TAOS_DIR=`pwd`
|
TAOS_DIR=`pwd`
|
||||||
LOG_DIR=$TAOS_DIR/sim/$NODE_NAME/log
|
LOG_DIR=$TAOS_DIR/sim/$NODE_NAME/log
|
||||||
#CFG_DIR=$TAOS_DIR/sim/$NODE_NAME/cfg
|
|
||||||
|
|
||||||
#echo ---- $LOG_DIR
|
|
||||||
|
|
||||||
#errors=`grep "ERROR SUMMARY:" ${LOG_DIR}/valgrind-taosd-*.log | cut -d ' ' -f 2,3,4,5 | tr -d "\n"`
|
|
||||||
|
|
||||||
error_summary=`cat ${LOG_DIR}/valgrind-taosd-*.log | grep "ERROR SUMMARY:" | awk '{print $4}' | awk '{sum+=$1}END{print sum}'`
|
error_summary=`cat ${LOG_DIR}/valgrind-taosd-*.log | grep "ERROR SUMMARY:" | awk '{print $4}' | awk '{sum+=$1}END{print sum}'`
|
||||||
still_reachable=`cat ${LOG_DIR}/valgrind-taosd-*.log | grep "still reachable in" | wc -l`
|
still_reachable=`cat ${LOG_DIR}/valgrind-taosd-*.log | grep "still reachable in" | wc -l`
|
||||||
definitely_lost=`cat ${LOG_DIR}/valgrind-taosd-*.log | grep "definitely lost in" | wc -l`
|
definitely_lost=`cat ${LOG_DIR}/valgrind-taosd-*.log | grep "definitely lost in" | wc -l`
|
||||||
|
indirectly_lost=`cat ${LOG_DIR}/valgrind-taosd-*.log | grep "indirectly lost in " | wc -l`
|
||||||
|
possibly_lost=`cat ${LOG_DIR}/valgrind-taosd-*.log | grep "possibly lost in " | wc -l`
|
||||||
|
invalid_read=`cat ${LOG_DIR}/valgrind-taosd-*.log | grep "Invalid read of " | wc -l`
|
||||||
|
invalid_write=`cat ${LOG_DIR}/valgrind-taosd-*.log | grep "Invalid write of " | wc -l`
|
||||||
|
invalid_free=`cat ${LOG_DIR}/valgrind-taosd-*.log | grep "Invalid free() " | wc -l`
|
||||||
|
|
||||||
let "errors=$still_reachable+$error_summary+$definitely_lost"
|
if [ $DETAIL -eq 1 ]; then
|
||||||
|
echo error_summary: $error_summary
|
||||||
|
echo still_reachable: $still_reachable
|
||||||
|
echo definitely_lost: $definitely_lost
|
||||||
|
echo indirectly_lost: $indirectly_lost
|
||||||
|
echo possibly_lost: $possibly_lost
|
||||||
|
echo invalid_read: $invalid_read
|
||||||
|
echo invalid_write: $invalid_write
|
||||||
|
echo invalid_free: $invalid_free
|
||||||
|
fi
|
||||||
|
|
||||||
|
let "errors=$error_summary+$still_reachable+$definitely_lost+$indirectly_lost+$possibly_lost+$invalid_read+$invalid_write+$invalid_free"
|
||||||
echo $errors
|
echo $errors
|
||||||
|
|
|
@ -9,17 +9,15 @@ step1:
|
||||||
$x = $x + 1
|
$x = $x + 1
|
||||||
sleep 1000
|
sleep 1000
|
||||||
if $x == 10 then
|
if $x == 10 then
|
||||||
print ====> dnode not ready!
|
print ----> dnode not ready!
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
sql show dnodes
|
sql show dnodes
|
||||||
print ===> $data00 $data01 $data02 $data03 $data04 $data05
|
print ----> $data00 $data01 $data02 $data03 $data04 $data05
|
||||||
if $rows != 1 then
|
if $rows != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
goto _OVER
|
|
||||||
|
|
||||||
print =============== step2: create alter drop show user
|
print =============== step2: create alter drop show user
|
||||||
sql create user u1 pass 'taosdata'
|
sql create user u1 pass 'taosdata'
|
||||||
sql show users
|
sql show users
|
||||||
|
@ -29,5 +27,17 @@ sql alter user u1 pass 'taosdata'
|
||||||
sql drop user u1
|
sql drop user u1
|
||||||
sql_error alter user u2 sysinfo 0
|
sql_error alter user u2 sysinfo 0
|
||||||
|
|
||||||
|
print =============== step3: create drop dnode
|
||||||
|
sql create dnode $hostname port 7200
|
||||||
|
sql drop dnode 2
|
||||||
|
sql alter dnode 1 'debugflag 143'
|
||||||
|
|
||||||
|
print =============== step4: create alter drop show database
|
||||||
|
sql create database db vgroups 1
|
||||||
|
sql show databases
|
||||||
|
sql show db.vgroups
|
||||||
|
sql drop database db
|
||||||
|
sql show databases
|
||||||
|
|
||||||
_OVER:
|
_OVER:
|
||||||
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
|
@ -9,11 +9,11 @@ step1:
|
||||||
$x = $x + 1
|
$x = $x + 1
|
||||||
sleep 1000
|
sleep 1000
|
||||||
if $x == 10 then
|
if $x == 10 then
|
||||||
print ====> dnode not ready!
|
print ----> dnode not ready!
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
sql show dnodes
|
sql show dnodes
|
||||||
print ===> $data00 $data01 $data02 $data03 $data04 $data05
|
print ----> $data00 $data01 $data02 $data03 $data04 $data05
|
||||||
if $rows != 1 then
|
if $rows != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
system sh/stop_dnodes.sh
|
||||||
|
system sh/deploy.sh -n dnode1 -i 1
|
||||||
|
system sh/exec.sh -n dnode1 -s start -v
|
||||||
|
sql connect
|
||||||
|
|
||||||
|
print =============== step1: show dnodes
|
||||||
|
|
||||||
|
$x = 0
|
||||||
|
step1:
|
||||||
|
$x = $x + 1
|
||||||
|
sleep 1000
|
||||||
|
if $x == 10 then
|
||||||
|
print ----> dnode not ready!
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
sql show dnodes
|
||||||
|
print ----> $data00 $data01 $data02 $data03 $data04 $data05
|
||||||
|
if $rows != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
print =============== step2: create alter drop show user
|
||||||
|
sql create user u1 pass 'taosdata'
|
||||||
|
sql show users
|
||||||
|
sql alter user u1 sysinfo 1
|
||||||
|
sql alter user u1 enable 1
|
||||||
|
sql alter user u1 pass 'taosdata'
|
||||||
|
sql drop user u1
|
||||||
|
sql_error alter user u2 sysinfo 0
|
||||||
|
|
||||||
|
print =============== step3:
|
||||||
|
|
||||||
|
print =============== stop
|
||||||
|
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
||||||
|
|
||||||
|
print =============== check
|
||||||
|
print ----> start to check if there are ERRORS in vagrind log file for each dnode
|
||||||
|
system_content sh/checkValgrind.sh -n dnode1
|
||||||
|
|
||||||
|
print cmd return result ----> [ $system_content ]
|
||||||
|
if $system_content <= 40 then
|
||||||
|
return 0
|
||||||
|
endi
|
||||||
|
|
||||||
|
$null=
|
||||||
|
if $system_content == $null then
|
||||||
|
return 0
|
||||||
|
endi
|
||||||
|
|
||||||
|
return -1
|
|
@ -3,8 +3,7 @@ system sh/deploy.sh -n dnode1 -i 1
|
||||||
system sh/exec.sh -n dnode1 -s start -v
|
system sh/exec.sh -n dnode1 -s start -v
|
||||||
sql connect
|
sql connect
|
||||||
|
|
||||||
print =============== step1
|
print =============== step1: create drop show dnodes
|
||||||
|
|
||||||
$x = 0
|
$x = 0
|
||||||
step1:
|
step1:
|
||||||
$x = $x + 1
|
$x = $x + 1
|
||||||
|
@ -19,18 +18,18 @@ if $rows != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
print =============== step2
|
print =============== step2: create db
|
||||||
|
sql create database db vgroups 1
|
||||||
|
|
||||||
print =============== stop
|
_OVER:
|
||||||
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
||||||
|
|
||||||
|
print =============== check
|
||||||
print ----> start to check if there are ERRORS in vagrind log file for each dnode
|
print ----> start to check if there are ERRORS in vagrind log file for each dnode
|
||||||
# -n : dnode[x] be check
|
|
||||||
system_content sh/checkValgrind.sh -n dnode1
|
system_content sh/checkValgrind.sh -n dnode1
|
||||||
|
|
||||||
# temporarily expand the threshold, since no time to fix the memory leaks.
|
|
||||||
print cmd return result ----> [ $system_content ]
|
print cmd return result ----> [ $system_content ]
|
||||||
if $system_content <= 5 then
|
if $system_content <= 60 then
|
||||||
return 0
|
return 0
|
||||||
endi
|
endi
|
||||||
|
|
|
@ -87,29 +87,29 @@ class TDTestCase:
|
||||||
@property
|
@property
|
||||||
def create_stable_sql_err(self):
|
def create_stable_sql_err(self):
|
||||||
return [
|
return [
|
||||||
f"create stable stb1 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(ceil) watermark 1s max_delay 1m",
|
f"create stable stb11 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(ceil) watermark 1s max_delay 1m",
|
||||||
f"create stable stb1 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(count) watermark 1min",
|
f"create stable stb12 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(count) watermark 1min",
|
||||||
f"create stable stb1 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(min) max_delay -1s",
|
f"create stable stb13 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(min) max_delay -1s",
|
||||||
f"create stable stb1 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(min) watermark -1m",
|
f"create stable stb14 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(min) watermark -1m",
|
||||||
f"create stable stb1 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) watermark 1m ",
|
f"create stable stb15 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) watermark 1m ",
|
||||||
f"create stable stb1 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) max_delay 1m ",
|
f"create stable stb16 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) max_delay 1m ",
|
||||||
f"create stable stb2 ({PRIMARY_COL} timestamp, {INT_COL} int, {BINARY_COL} binary(16)) tags (tag1 int) rollup(avg) watermark 1s",
|
f"create stable stb21 ({PRIMARY_COL} timestamp, {INT_COL} int, {BINARY_COL} binary(16)) tags (tag1 int) rollup(avg) watermark 1s",
|
||||||
f"create stable stb2 ({PRIMARY_COL} timestamp, {INT_COL} int, {NCHAR_COL} nchar(16)) tags (tag1 int) rollup(avg) max_delay 1m",
|
f"create stable stb22 ({PRIMARY_COL} timestamp, {INT_COL} int, {NCHAR_COL} nchar(16)) tags (tag1 int) rollup(avg) max_delay 1m",
|
||||||
# f"create table ntb_1 ({PRIMARY_COL} timestamp, {INT_COL} int, {NCHAR_COL} nchar(16)) rollup(avg) watermark 1s max_delay 1s",
|
f"create table ntb_1 ({PRIMARY_COL} timestamp, {INT_COL} int, {NCHAR_COL} nchar(16)) rollup(avg) watermark 1s max_delay 1s",
|
||||||
f"create stable stb2 ({PRIMARY_COL} timestamp, {INT_COL} int, {NCHAR_COL} nchar(16)) tags (tag1 int) " ,
|
f"create stable stb23 ({PRIMARY_COL} timestamp, {INT_COL} int, {NCHAR_COL} nchar(16)) tags (tag1 int) " ,
|
||||||
f"create stable stb2 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) " ,
|
f"create stable stb24 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) " ,
|
||||||
f"create stable stb2 ({PRIMARY_COL} timestamp, {INT_COL} int) " ,
|
f"create stable stb25 ({PRIMARY_COL} timestamp, {INT_COL} int) " ,
|
||||||
f"create stable stb2 ({PRIMARY_COL} timestamp, {INT_COL} int, {BINARY_COL} nchar(16)) " ,
|
f"create stable stb26 ({PRIMARY_COL} timestamp, {INT_COL} int, {BINARY_COL} nchar(16)) " ,
|
||||||
|
|
||||||
# watermark, max_delay: [0, 900000], [ms, s, m, ?]
|
# watermark, max_delay: [0, 900000], [ms, s, m, ?]
|
||||||
f"create stable stb1 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(min) max_delay 1u",
|
f"create stable stb17 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(min) max_delay 1u",
|
||||||
f"create stable stb1 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(min) watermark 1b",
|
f"create stable stb18 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(min) watermark 1b",
|
||||||
f"create stable stb1 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(min) watermark 900001ms",
|
f"create stable stb19 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(min) watermark 900001ms",
|
||||||
f"create stable stb1 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(min) max_delay 16m",
|
f"create stable stb20 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(min) max_delay 16m",
|
||||||
f"create stable stb1 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(min) max_delay 901s",
|
f"create stable stb27 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(min) max_delay 901s",
|
||||||
f"create stable stb1 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(min) max_delay 1h",
|
f"create stable stb28 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(min) max_delay 1h",
|
||||||
f"create stable stb1 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(min) max_delay 0.2h",
|
f"create stable stb29 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(min) max_delay 0.2h",
|
||||||
f"create stable stb1 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(min) watermark 0.002d",
|
f"create stable stb30 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(min) watermark 0.002d",
|
||||||
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -125,8 +125,8 @@ class TDTestCase:
|
||||||
f"create stable stb7 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(first) watermark 5s max_delay 1m sma({INT_COL})",
|
f"create stable stb7 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(first) watermark 5s max_delay 1m sma({INT_COL})",
|
||||||
]
|
]
|
||||||
|
|
||||||
def test_create_stb(self):
|
def test_create_stb(self, db="db2"):
|
||||||
tdSql.execute("use db2")
|
tdSql.execute(f"use {db}")
|
||||||
for err_sql in self.create_stable_sql_err:
|
for err_sql in self.create_stable_sql_err:
|
||||||
tdSql.error(err_sql)
|
tdSql.error(err_sql)
|
||||||
for cur_sql in self.create_stable_sql_current:
|
for cur_sql in self.create_stable_sql_current:
|
||||||
|
@ -136,7 +136,7 @@ class TDTestCase:
|
||||||
tdSql.checkRows(len(self.create_stable_sql_current))
|
tdSql.checkRows(len(self.create_stable_sql_current))
|
||||||
|
|
||||||
tdSql.execute("use db") # because db is a noraml database, not a rollup database, should not be able to create a rollup stable
|
tdSql.execute("use db") # because db is a noraml database, not a rollup database, should not be able to create a rollup stable
|
||||||
# tdSql.error(f"create stable nor_db_rollup_stb ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) watermark 5s max_delay 1m")
|
tdSql.error(f"create stable nor_db_rollup_stb ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) watermark 5s max_delay 1m")
|
||||||
|
|
||||||
|
|
||||||
def test_create_databases(self):
|
def test_create_databases(self):
|
||||||
|
@ -255,6 +255,7 @@ class TDTestCase:
|
||||||
tdSql.execute("drop database if exists db2 ")
|
tdSql.execute("drop database if exists db2 ")
|
||||||
|
|
||||||
tdSql.execute("use db3")
|
tdSql.execute("use db3")
|
||||||
|
self.test_create_stb(db="db3")
|
||||||
# self.__create_tb()
|
# self.__create_tb()
|
||||||
# self.__insert_data()
|
# self.__insert_data()
|
||||||
self.all_test()
|
self.all_test()
|
||||||
|
|
|
@ -96,7 +96,7 @@ class TDTestCase:
|
||||||
ff float, dd double, bb binary(100), nn nchar(100), tt timestamp)",
|
ff float, dd double, bb binary(100), nn nchar(100), tt timestamp)",
|
||||||
)
|
)
|
||||||
# conn.load_table_info("log")
|
# conn.load_table_info("log")
|
||||||
|
tdLog.debug("statement start")
|
||||||
start = datetime.now()
|
start = datetime.now()
|
||||||
stmt = conn.statement("insert into stb1 values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")
|
stmt = conn.statement("insert into stb1 values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")
|
||||||
|
|
||||||
|
@ -118,8 +118,11 @@ class TDTestCase:
|
||||||
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])
|
||||||
# print(type(stmt))
|
# print(type(stmt))
|
||||||
|
tdLog.debug("bind_param_batch start")
|
||||||
stmt.bind_param_batch(params)
|
stmt.bind_param_batch(params)
|
||||||
|
tdLog.debug("bind_param_batch end")
|
||||||
stmt.execute()
|
stmt.execute()
|
||||||
|
tdLog.debug("execute end")
|
||||||
end = datetime.now()
|
end = datetime.now()
|
||||||
print("elapsed time: ", end - start)
|
print("elapsed time: ", end - start)
|
||||||
assert stmt.affected_rows == 3
|
assert stmt.affected_rows == 3
|
||||||
|
@ -155,7 +158,7 @@ class TDTestCase:
|
||||||
print(rows1)
|
print(rows1)
|
||||||
assert str(rows1[0][0]) == "2021-07-21 17:56:32.589000"
|
assert str(rows1[0][0]) == "2021-07-21 17:56:32.589000"
|
||||||
assert rows1[0][10] == 3
|
assert rows1[0][10] == 3
|
||||||
|
tdLog.debug("close start")
|
||||||
|
|
||||||
stmt.close()
|
stmt.close()
|
||||||
|
|
||||||
|
|
|
@ -218,13 +218,13 @@ class TDTestCase:
|
||||||
tdLog.debug("assert 8th case %s"%rows)
|
tdLog.debug("assert 8th case %s"%rows)
|
||||||
assert rows[0][0] == 3, ' 8th case is failed'
|
assert rows[0][0] == 3, ' 8th case is failed'
|
||||||
|
|
||||||
# #query: selector Functions 9
|
#query: selector Functions 9
|
||||||
# queryparam=new_bind_params(1)
|
queryparam=new_bind_params(1)
|
||||||
# queryparam[0].int(2)
|
queryparam[0].int(2)
|
||||||
# rows=self.stmtExe(conn,"select bottom(bu,?) from log group by bu ; ",queryparam)
|
rows=self.stmtExe(conn,"select bottom(bu,?) from log group by bu order by bu desc ; ",queryparam)
|
||||||
# tdLog.debug("assert 9th case %s"%rows)
|
tdLog.debug("assert 9th case %s"%rows)
|
||||||
# assert rows[0][0] == 4, ' 9 case is failed'
|
assert rows[1][0] == 4, ' 9 case is failed'
|
||||||
# assert rows[1][0] == 3, ' 9 case is failed'
|
assert rows[2][0] == 3, ' 9 case is failed'
|
||||||
|
|
||||||
# #query: time-series specific Functions 10
|
# #query: time-series specific Functions 10
|
||||||
|
|
||||||
|
|
|
@ -123,10 +123,10 @@ class TDTestCase:
|
||||||
elif unit.lower() == '1u':
|
elif unit.lower() == '1u':
|
||||||
for i in range(len(self.ts_str)):
|
for i in range(len(self.ts_str)):
|
||||||
tdSql.checkEqual(tdSql.queryResult[i][0],int(((date_time[i]/1000)-self.subtractor*1000000)))
|
tdSql.checkEqual(tdSql.queryResult[i][0],int(((date_time[i]/1000)-self.subtractor*1000000)))
|
||||||
# self.check_tbtype(tb_type)
|
self.check_tbtype(tb_type)
|
||||||
# tdSql.checkRows(len(self.ts_str))
|
tdSql.checkRows(len(self.ts_str))
|
||||||
# for i in range(len(self.ts_str)):
|
for i in range(len(self.ts_str)):
|
||||||
# tdSql.checkEqual(tdSql.queryResult[i][0],int(((date_time[i]/1000000)-self.subtractor*1000000000)))
|
tdSql.checkEqual(tdSql.queryResult[i][0],int(((date_time[i])-self.subtractor*1000000000)))
|
||||||
for unit in self.error_unit:
|
for unit in self.error_unit:
|
||||||
if tb_type.lower() == 'ntb':
|
if tb_type.lower() == 'ntb':
|
||||||
tdSql.error(f'select timediff(ts,{self.subtractor},{unit}) from {self.ntbname}')
|
tdSql.error(f'select timediff(ts,{self.subtractor},{unit}) from {self.ntbname}')
|
||||||
|
|
|
@ -0,0 +1,545 @@
|
||||||
|
import taos
|
||||||
|
import sys
|
||||||
|
import datetime
|
||||||
|
import inspect
|
||||||
|
|
||||||
|
from util.log import *
|
||||||
|
from util.sql import *
|
||||||
|
from util.cases import *
|
||||||
|
import random
|
||||||
|
|
||||||
|
|
||||||
|
class TDTestCase:
|
||||||
|
updatecfgDict = {'debugFlag': 143, "cDebugFlag": 143, "uDebugFlag": 143, "rpcDebugFlag": 143, "tmrDebugFlag": 143,
|
||||||
|
"jniDebugFlag": 143, "simDebugFlag": 143, "dDebugFlag": 143, "dDebugFlag": 143, "vDebugFlag": 143, "mDebugFlag": 143, "qDebugFlag": 143,
|
||||||
|
"wDebugFlag": 143, "sDebugFlag": 143, "tsdbDebugFlag": 143, "tqDebugFlag": 143, "fsDebugFlag": 143, "fnDebugFlag": 143}
|
||||||
|
|
||||||
|
def init(self, conn, logSql):
|
||||||
|
tdLog.debug(f"start to excute {__file__}")
|
||||||
|
tdSql.init(conn.cursor(), True)
|
||||||
|
self.tb_nums = 10
|
||||||
|
self.row_nums = 20
|
||||||
|
self.ts = 1434938400000
|
||||||
|
self.time_step = 1000
|
||||||
|
|
||||||
|
def insert_datas_and_check_abs(self ,tbnums , rownums , time_step ):
|
||||||
|
tdLog.info(" prepare datas for auto check abs function ")
|
||||||
|
|
||||||
|
tdSql.execute(" create database test ")
|
||||||
|
tdSql.execute(" use test ")
|
||||||
|
tdSql.execute(" create stable stb (ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint,\
|
||||||
|
c5 float, c6 double, c7 bool, c8 binary(16),c9 nchar(32), c10 timestamp) tags (t1 int)")
|
||||||
|
for tbnum in range(tbnums):
|
||||||
|
tbname = "sub_tb_%d"%tbnum
|
||||||
|
tdSql.execute(" create table %s using stb tags(%d) "%(tbname , tbnum))
|
||||||
|
|
||||||
|
ts = self.ts
|
||||||
|
for row in range(rownums):
|
||||||
|
ts = self.ts + time_step*row
|
||||||
|
c1 = random.randint(0,10000)
|
||||||
|
c2 = random.randint(0,100000)
|
||||||
|
c3 = random.randint(0,125)
|
||||||
|
c4 = random.randint(0,125)
|
||||||
|
c5 = random.random()/1.0
|
||||||
|
c6 = random.random()/1.0
|
||||||
|
c7 = "'true'"
|
||||||
|
c8 = "'binary_val'"
|
||||||
|
c9 = "'nchar_val'"
|
||||||
|
c10 = ts
|
||||||
|
tdSql.execute(f" insert into {tbname} values ({ts},{c1},{c2},{c3},{c4},{c5},{c6},{c7},{c8},{c9},{c10})")
|
||||||
|
|
||||||
|
tdSql.execute("use test")
|
||||||
|
tbnames = ["stb", "sub_tb_1"]
|
||||||
|
support_types = ["BIGINT", "SMALLINT", "TINYINT", "FLOAT", "DOUBLE", "INT"]
|
||||||
|
for tbname in tbnames:
|
||||||
|
tdSql.query("desc {}".format(tbname))
|
||||||
|
coltypes = tdSql.queryResult
|
||||||
|
colnames = []
|
||||||
|
for coltype in coltypes:
|
||||||
|
colname = coltype[0]
|
||||||
|
if coltype[1] in support_types:
|
||||||
|
colnames.append(colname)
|
||||||
|
cols = random.sample(colnames,3)
|
||||||
|
self.check_function("&",False,tbname,cols[0],cols[1],cols[2])
|
||||||
|
self.check_function("|",False,tbname,cols[0],cols[1],cols[2])
|
||||||
|
|
||||||
|
|
||||||
|
def prepare_datas(self):
|
||||||
|
tdSql.execute(
|
||||||
|
'''create table stb1
|
||||||
|
(ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(16),c9 nchar(32), c10 timestamp)
|
||||||
|
tags (t1 int)
|
||||||
|
'''
|
||||||
|
)
|
||||||
|
|
||||||
|
tdSql.execute(
|
||||||
|
'''
|
||||||
|
create table t1
|
||||||
|
(ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(16),c9 nchar(32), c10 timestamp)
|
||||||
|
'''
|
||||||
|
)
|
||||||
|
for i in range(4):
|
||||||
|
tdSql.execute(f'create table ct{i+1} using stb1 tags ( {i+1} )')
|
||||||
|
|
||||||
|
for i in range(9):
|
||||||
|
tdSql.execute(
|
||||||
|
f"insert into ct1 values ( now()-{i*10}s, {1*i}, {11111*i}, {111*i}, {11*i}, {1.11*i}, {11.11*i}, {i%2}, 'binary{i}', 'nchar{i}', now()+{1*i}a )"
|
||||||
|
)
|
||||||
|
tdSql.execute(
|
||||||
|
f"insert into ct4 values ( now()-{i*90}d, {1*i}, {11111*i}, {111*i}, {11*i}, {1.11*i}, {11.11*i}, {i%2}, 'binary{i}', 'nchar{i}', now()+{1*i}a )"
|
||||||
|
)
|
||||||
|
tdSql.execute(
|
||||||
|
"insert into ct1 values (now()-45s, 0, 0, 0, 0, 0, 0, 0, 'binary0', 'nchar0', now()+8a )")
|
||||||
|
tdSql.execute(
|
||||||
|
"insert into ct1 values (now()+10s, 9, -99999, -999, -99, -9.99, -99.99, 1, 'binary9', 'nchar9', now()+9a )")
|
||||||
|
tdSql.execute(
|
||||||
|
"insert into ct1 values (now()+15s, 9, -99999, -999, -99, -9.99, NULL, 1, 'binary9', 'nchar9', now()+9a )")
|
||||||
|
tdSql.execute(
|
||||||
|
"insert into ct1 values (now()+20s, 9, -99999, -999, NULL, -9.99, -99.99, 1, 'binary9', 'nchar9', now()+9a )")
|
||||||
|
|
||||||
|
tdSql.execute(
|
||||||
|
"insert into ct4 values (now()-810d, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL ) ")
|
||||||
|
tdSql.execute(
|
||||||
|
"insert into ct4 values (now()-400d, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL ) ")
|
||||||
|
tdSql.execute(
|
||||||
|
"insert into ct4 values (now()+90d, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL ) ")
|
||||||
|
|
||||||
|
tdSql.execute(
|
||||||
|
f'''insert into t1 values
|
||||||
|
( '2020-04-21 01:01:01.000', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL )
|
||||||
|
( '2020-10-21 01:01:01.000', 1, 11111, 111, 11, 1.11, 11.11, 1, "binary1", "nchar1", now()+1a )
|
||||||
|
( '2020-12-31 01:01:01.000', 2, 22222, 222, 22, 2.22, 22.22, 0, "binary2", "nchar2", now()+2a )
|
||||||
|
( '2021-01-01 01:01:06.000', 3, 33333, 333, 33, 3.33, 33.33, 0, "binary3", "nchar3", now()+3a )
|
||||||
|
( '2021-05-07 01:01:10.000', 4, 44444, 444, 44, 4.44, 44.44, 1, "binary4", "nchar4", now()+4a )
|
||||||
|
( '2021-07-21 01:01:01.000', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL )
|
||||||
|
( '2021-09-30 01:01:16.000', 5, 55555, 555, 55, 5.55, 55.55, 0, "binary5", "nchar5", now()+5a )
|
||||||
|
( '2022-02-01 01:01:20.000', 6, 66666, 666, 66, 6.66, 66.66, 1, "binary6", "nchar6", now()+6a )
|
||||||
|
( '2022-10-28 01:01:26.000', 7, 00000, 000, 00, 0.00, 00.00, 1, "binary7", "nchar7", "1970-01-01 08:00:00.000" )
|
||||||
|
( '2022-12-01 01:01:30.000', 8, -88888, -888, -88, -8.88, -88.88, 0, "binary8", "nchar8", "1969-01-01 01:00:00.000" )
|
||||||
|
( '2022-12-31 01:01:36.000', 9, -99999999999999999, -999, -99, -9.99, -999999999999999999999.99, 1, "binary9", "nchar9", "1900-01-01 00:00:00.000" )
|
||||||
|
( '2023-02-21 01:01:01.000', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL )
|
||||||
|
'''
|
||||||
|
)
|
||||||
|
|
||||||
|
def prepare_tag_datas(self):
|
||||||
|
# prepare datas
|
||||||
|
tdSql.execute(
|
||||||
|
"create database if not exists testdb keep 3650 duration 1000")
|
||||||
|
tdSql.execute(" use testdb ")
|
||||||
|
tdSql.execute(
|
||||||
|
'''create table stb1
|
||||||
|
(ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(16),c9 nchar(32), c10 timestamp)
|
||||||
|
tags (t0 timestamp, t1 int, t2 bigint, t3 smallint, t4 tinyint, t5 float, t6 double, t7 bool, t8 binary(16),t9 nchar(32))
|
||||||
|
'''
|
||||||
|
)
|
||||||
|
|
||||||
|
tdSql.execute(
|
||||||
|
'''
|
||||||
|
create table t1
|
||||||
|
(ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(16),c9 nchar(32), c10 timestamp)
|
||||||
|
'''
|
||||||
|
)
|
||||||
|
for i in range(4):
|
||||||
|
tdSql.execute(
|
||||||
|
f'create table ct{i+1} using stb1 tags ( now(), {1*i}, {11111*i}, {111*i}, {1*i}, {1.11*i}, {11.11*i}, {i%2}, "binary{i}", "nchar{i}" )')
|
||||||
|
|
||||||
|
for i in range(9):
|
||||||
|
tdSql.execute(
|
||||||
|
f"insert into ct1 values ( now()-{i*10}s, {1*i}, {11111*i}, {111*i}, {11*i}, {1.11*i}, {11.11*i}, {i%2}, 'binary{i}', 'nchar{i}', now()+{1*i}a )"
|
||||||
|
)
|
||||||
|
tdSql.execute(
|
||||||
|
f"insert into ct4 values ( now()-{i*90}d, {1*i}, {11111*i}, {111*i}, {11*i}, {1.11*i}, {11.11*i}, {i%2}, 'binary{i}', 'nchar{i}', now()+{1*i}a )"
|
||||||
|
)
|
||||||
|
tdSql.execute(
|
||||||
|
"insert into ct1 values (now()-45s, 0, 0, 0, 0, 0, 0, 0, 'binary0', 'nchar0', now()+8a )")
|
||||||
|
tdSql.execute(
|
||||||
|
"insert into ct1 values (now()+10s, 9, -99999, -999, -99, -9.99, -99.99, 1, 'binary9', 'nchar9', now()+9a )")
|
||||||
|
tdSql.execute(
|
||||||
|
"insert into ct1 values (now()+15s, 9, -99999, -999, -99, -9.99, NULL, 1, 'binary9', 'nchar9', now()+9a )")
|
||||||
|
tdSql.execute(
|
||||||
|
"insert into ct1 values (now()+20s, 9, -99999, -999, NULL, -9.99, -99.99, 1, 'binary9', 'nchar9', now()+9a )")
|
||||||
|
|
||||||
|
tdSql.execute(
|
||||||
|
"insert into ct4 values (now()-810d, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL ) ")
|
||||||
|
tdSql.execute(
|
||||||
|
"insert into ct4 values (now()-400d, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL ) ")
|
||||||
|
tdSql.execute(
|
||||||
|
"insert into ct4 values (now()+90d, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL ) ")
|
||||||
|
|
||||||
|
tdSql.execute(
|
||||||
|
f'''insert into t1 values
|
||||||
|
( '2020-04-21 01:01:01.000', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL )
|
||||||
|
( '2020-10-21 01:01:01.000', 1, 11111, 111, 11, 1.11, 11.11, 1, "binary1", "nchar1", now()+1a )
|
||||||
|
( '2020-12-31 01:01:01.000', 2, 22222, 222, 22, 2.22, 22.22, 0, "binary2", "nchar2", now()+2a )
|
||||||
|
( '2021-01-01 01:01:06.000', 3, 33333, 333, 33, 3.33, 33.33, 0, "binary3", "nchar3", now()+3a )
|
||||||
|
( '2021-05-07 01:01:10.000', 4, 44444, 444, 44, 4.44, 44.44, 1, "binary4", "nchar4", now()+4a )
|
||||||
|
( '2021-07-21 01:01:01.000', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL )
|
||||||
|
( '2021-09-30 01:01:16.000', 5, 55555, 555, 55, 5.55, 55.55, 0, "binary5", "nchar5", now()+5a )
|
||||||
|
( '2022-02-01 01:01:20.000', 6, 66666, 666, 66, 6.66, 66.66, 1, "binary6", "nchar6", now()+6a )
|
||||||
|
( '2022-10-28 01:01:26.000', 7, 00000, 000, 00, 0.00, 00.00, 1, "binary7", "nchar7", "1970-01-01 08:00:00.000" )
|
||||||
|
( '2022-12-01 01:01:30.000', 8, -88888, -888, -88, -8.88, -88.88, 0, "binary8", "nchar8", "1969-01-01 01:00:00.000" )
|
||||||
|
( '2022-12-31 01:01:36.000', 9, -99999999999999999, -999, -99, -9.99, -999999999999999999999.99, 1, "binary9", "nchar9", "1900-01-01 00:00:00.000" )
|
||||||
|
( '2023-02-21 01:01:01.000', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL )
|
||||||
|
'''
|
||||||
|
)
|
||||||
|
|
||||||
|
def check_result_auto(self, origin_query, abs_query):
|
||||||
|
abs_result = tdSql.getResult(abs_query)
|
||||||
|
origin_result = tdSql.getResult(origin_query)
|
||||||
|
|
||||||
|
auto_result = []
|
||||||
|
|
||||||
|
for row in origin_result:
|
||||||
|
row_check = []
|
||||||
|
for elem in row:
|
||||||
|
if elem == None:
|
||||||
|
elem = None
|
||||||
|
elif elem >= 0:
|
||||||
|
elem = elem
|
||||||
|
else:
|
||||||
|
elem = -elem
|
||||||
|
row_check.append(elem)
|
||||||
|
auto_result.append(row_check)
|
||||||
|
|
||||||
|
check_status = True
|
||||||
|
for row_index, row in enumerate(abs_result):
|
||||||
|
for col_index, elem in enumerate(row):
|
||||||
|
if auto_result[row_index][col_index] != elem:
|
||||||
|
check_status = False
|
||||||
|
if not check_status:
|
||||||
|
tdLog.notice(
|
||||||
|
"abs function value has not as expected , sql is \"%s\" " % abs_query)
|
||||||
|
sys.exit(1)
|
||||||
|
else:
|
||||||
|
tdLog.info(
|
||||||
|
"abs value check pass , it work as expected ,sql is \"%s\" " % abs_query)
|
||||||
|
|
||||||
|
def check_function(self, opera ,agg, tbname , *args):
|
||||||
|
|
||||||
|
if opera =="&":
|
||||||
|
pass
|
||||||
|
elif opera =="|":
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
pass
|
||||||
|
work_sql = " select "
|
||||||
|
for ind , arg in enumerate(args):
|
||||||
|
if ind ==len(args)-1:
|
||||||
|
work_sql += f"cast({arg} as bigint) "
|
||||||
|
else:
|
||||||
|
work_sql += f"cast({arg} as bigint){opera}"
|
||||||
|
|
||||||
|
if not agg:
|
||||||
|
work_sql+= f" from {tbname} order by ts"
|
||||||
|
else:
|
||||||
|
work_sql+= f" from {tbname} "
|
||||||
|
tdSql.query(work_sql)
|
||||||
|
work_result = tdSql.queryResult
|
||||||
|
|
||||||
|
origin_sql = " select "
|
||||||
|
for ind , arg in enumerate(args):
|
||||||
|
if ind ==len(args)-1:
|
||||||
|
origin_sql += f"cast({arg} as bigint) "
|
||||||
|
else:
|
||||||
|
origin_sql += f"cast({arg} as bigint),"
|
||||||
|
if not agg:
|
||||||
|
origin_sql+= f" from {tbname} order by ts"
|
||||||
|
else:
|
||||||
|
origin_sql+= f" from {tbname} "
|
||||||
|
tdSql.query(origin_sql)
|
||||||
|
origin_result = tdSql.queryResult
|
||||||
|
|
||||||
|
# compute and or with byte in binary data
|
||||||
|
compute_result = []
|
||||||
|
|
||||||
|
for row in origin_result:
|
||||||
|
if None in row:
|
||||||
|
compute_result.append(None)
|
||||||
|
else:
|
||||||
|
if opera == "&":
|
||||||
|
result = row[0]
|
||||||
|
for elem in row:
|
||||||
|
result = result&elem
|
||||||
|
elif opera == "|":
|
||||||
|
result = row[0]
|
||||||
|
for elem in row:
|
||||||
|
result = result|elem
|
||||||
|
compute_result.append(result)
|
||||||
|
|
||||||
|
tdSql.query(work_sql)
|
||||||
|
for ind , result in enumerate(compute_result):
|
||||||
|
tdSql.checkData(ind,0,result)
|
||||||
|
|
||||||
|
def test_errors(self):
|
||||||
|
tdSql.execute("use testdb")
|
||||||
|
error_sql_lists = [
|
||||||
|
"select c1&&c2 from t1",
|
||||||
|
"select c1&|c2 from t1",
|
||||||
|
"select c1&(c1=c2) from t1",
|
||||||
|
"select c1&* from t1",
|
||||||
|
"select 123&, from t1",
|
||||||
|
"select 123&\" from t1",
|
||||||
|
"select c1&- from t1;",
|
||||||
|
"select c1&&= from t1)",
|
||||||
|
"select c1&! from t1",
|
||||||
|
"select c1&@ from stb1",
|
||||||
|
"select c1&# from stb1",
|
||||||
|
"select c1&$ from stb1",
|
||||||
|
"select c1&% from stb1",
|
||||||
|
"select c1&() from stb1",
|
||||||
|
]
|
||||||
|
for error_sql in error_sql_lists:
|
||||||
|
tdSql.error(error_sql)
|
||||||
|
|
||||||
|
def basic_query(self):
|
||||||
|
# basic query
|
||||||
|
tdSql.query("select c1&c2|c3 from ct1")
|
||||||
|
tdSql.checkRows(13)
|
||||||
|
tdSql.query("select c1 ,c2&c3, c1&c2&c3 from t1")
|
||||||
|
tdSql.checkRows(12)
|
||||||
|
tdSql.query("select c1 ,c1&c1&c1|c1 from stb1")
|
||||||
|
tdSql.checkRows(25)
|
||||||
|
|
||||||
|
# used for empty table , ct3 is empty
|
||||||
|
tdSql.query("select abs(c1)&c2&c3 from ct3")
|
||||||
|
tdSql.checkRows(0)
|
||||||
|
tdSql.query("select abs(c2&c1&c3) from ct3")
|
||||||
|
tdSql.checkRows(0)
|
||||||
|
tdSql.query("select abs(c3)+c1&c3+c2 from ct3")
|
||||||
|
tdSql.checkRows(0)
|
||||||
|
|
||||||
|
tdSql.query("select abs(c1)&c2&c3 from ct4")
|
||||||
|
tdSql.checkRows(12)
|
||||||
|
tdSql.checkData(0,0,None)
|
||||||
|
tdSql.checkData(1,0,8)
|
||||||
|
tdSql.checkData(10,0,0)
|
||||||
|
tdSql.query("select abs(c2&c1&c3) from ct4")
|
||||||
|
tdSql.checkRows(12)
|
||||||
|
tdSql.checkData(0,0,None)
|
||||||
|
tdSql.checkData(1,0,8)
|
||||||
|
tdSql.checkData(10,0,0)
|
||||||
|
tdSql.query("select (abs(c3)+c1)&(c3+c2) from ct4")
|
||||||
|
tdSql.checkRows(12)
|
||||||
|
tdSql.checkData(0,0,None)
|
||||||
|
tdSql.checkData(1,0,640)
|
||||||
|
tdSql.checkData(10,0,0)
|
||||||
|
|
||||||
|
# used for regular table
|
||||||
|
tdSql.query("select abs(c1)&c3&c3 from t1")
|
||||||
|
tdSql.checkData(0, 0, None)
|
||||||
|
tdSql.checkData(1, 0, 1)
|
||||||
|
tdSql.checkData(3, 0, 1)
|
||||||
|
tdSql.checkData(5, 0, None)
|
||||||
|
|
||||||
|
tdSql.query("select abs(c1)&c2|ceil(c3)&c4|floor(c5) from t1")
|
||||||
|
tdSql.checkData(1, 0, 11)
|
||||||
|
tdSql.checkData(3, 0, 3)
|
||||||
|
tdSql.checkData(5, 0, None)
|
||||||
|
tdSql.query("select ts,c1, c2, c3&c4|c5 from t1")
|
||||||
|
tdSql.checkData(1, 3, 11)
|
||||||
|
tdSql.checkData(3, 3, 3)
|
||||||
|
tdSql.checkData(5, 3, None)
|
||||||
|
|
||||||
|
self.check_function("&",False,"stb1","c1","ceil(c2)","abs(c3)","c4+1")
|
||||||
|
self.check_function("|",False,"stb1","c1","ceil(c2)","abs(c3)","c4+1")
|
||||||
|
self.check_function("&",False,"stb1","c1+c2","ceil(c2)","abs(c3+c2)","c4+1")
|
||||||
|
self.check_function("&",False,"ct4","123","ceil(c2)","abs(c3+c2)","c4+1")
|
||||||
|
self.check_function("&",False,"ct4","123","ceil(t1)","abs(c3+c2)","c4+1")
|
||||||
|
self.check_function("&",False,"ct4","t1+c1","-ceil(t1)","abs(c3+c2)","c4+1")
|
||||||
|
self.check_function("&",False,"stb1","c1","floor(t1)","abs(c1+c2)","t1+1")
|
||||||
|
self.check_function("&",True,"stb1","max(c1)","min(floor(t1))","sum(abs(c1+c2))","last(t1)+1")
|
||||||
|
self.check_function("&",False,"stb1","abs(abs(abs(abs(abs(abs(abs(abs(abs(abs(c1))))))))))","floor(t1)","abs(c1+c2)","t1+1")
|
||||||
|
|
||||||
|
# mix with common col
|
||||||
|
tdSql.query("select c1&abs(c1)&c2&c3 ,c1,c2, t1 from ct1")
|
||||||
|
tdSql.checkData(0, 0, 8)
|
||||||
|
tdSql.checkData(1, 0, 1)
|
||||||
|
tdSql.checkData(4, 0, 0)
|
||||||
|
tdSql.checkData(4, 3, 0)
|
||||||
|
tdSql.checkData(3, 2, 55555)
|
||||||
|
|
||||||
|
|
||||||
|
# mix with common functions
|
||||||
|
tdSql.query(" select c1&abs(c1)&c2&c3, abs(c1), c5, floor(c5) from ct4 ")
|
||||||
|
tdSql.checkData(0, 0, None)
|
||||||
|
tdSql.checkData(0, 1, None)
|
||||||
|
tdSql.checkData(0, 2, None)
|
||||||
|
tdSql.checkData(0, 3, None)
|
||||||
|
|
||||||
|
tdSql.checkData(3, 0, 2)
|
||||||
|
tdSql.checkData(3, 1, 6)
|
||||||
|
tdSql.checkData(3, 2, 6.66000)
|
||||||
|
tdSql.checkData(3, 3, 6.00000)
|
||||||
|
|
||||||
|
tdSql.query("select c1&abs(c1)&c2&c3, abs(c1),c5, floor(c5) from stb1 order by ts ")
|
||||||
|
tdSql.checkData(3, 0, 2)
|
||||||
|
tdSql.checkData(3, 1, 6)
|
||||||
|
tdSql.checkData(3, 2, 6.66000)
|
||||||
|
tdSql.checkData(3, 3, 6.00000)
|
||||||
|
|
||||||
|
# mix with agg functions , not support
|
||||||
|
tdSql.error("select c1&abs(c1)&c2&c3, abs(c1),c5, count(c5) from stb1 ")
|
||||||
|
tdSql.error("select c1&abs(c1)&c2&c3, abs(c1),c5, count(c5) from ct1 ")
|
||||||
|
tdSql.error("select c1&abs(c1)&c2&c3, count(c5) from stb1 ")
|
||||||
|
tdSql.error("select c1&abs(c1)&c2&c3, count(c5) from ct1 ")
|
||||||
|
tdSql.error("select c1&abs(c1)&c2&c3, count(c5) from ct1 ")
|
||||||
|
tdSql.error("select c1&abs(c1)&c2&c3, count(c5) from stb1 ")
|
||||||
|
|
||||||
|
# agg functions mix with agg functions
|
||||||
|
|
||||||
|
tdSql.query("select sum(c1&abs(c1)&c2&c3) ,max(c5), count(c5) from stb1")
|
||||||
|
|
||||||
|
tdSql.query("select max(c1)&max(c2)|first(ts), count(c5) from ct1")
|
||||||
|
|
||||||
|
# bug fix for compute
|
||||||
|
tdSql.query("select c1&abs(c1)&c2&c3, abs(c1&abs(c1)&c2&c3) -0 ,ceil(c1&abs(c1)&c2&c3)-0 from ct4 ")
|
||||||
|
tdSql.checkData(0, 0, None)
|
||||||
|
tdSql.checkData(0, 1, None)
|
||||||
|
tdSql.checkData(0, 2, None)
|
||||||
|
tdSql.checkData(1, 0, 8)
|
||||||
|
tdSql.checkData(1, 1, 8.000000000)
|
||||||
|
tdSql.checkData(1, 2, 8.000000000)
|
||||||
|
|
||||||
|
tdSql.query(" select c1&c2|c3, abs(c1&c2|c3) -0 ,ceil(c1&c2|c3-0.1)-0.1 from ct4")
|
||||||
|
tdSql.checkData(0, 0, None)
|
||||||
|
tdSql.checkData(0, 1, None)
|
||||||
|
tdSql.checkData(0, 2, None)
|
||||||
|
tdSql.checkData(1, 0, 888)
|
||||||
|
tdSql.checkData(1, 1, 888.000000000)
|
||||||
|
tdSql.checkData(1, 2, 894.900000000)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def check_boundary_values(self):
|
||||||
|
|
||||||
|
tdSql.execute("drop database if exists bound_test")
|
||||||
|
tdSql.execute("create database if not exists bound_test")
|
||||||
|
time.sleep(3)
|
||||||
|
tdSql.execute("use bound_test")
|
||||||
|
tdSql.execute(
|
||||||
|
"create table stb_bound (ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(32),c9 nchar(32), c10 timestamp) tags (t1 int);"
|
||||||
|
)
|
||||||
|
tdSql.execute(f'create table sub1_bound using stb_bound tags ( 1 )')
|
||||||
|
tdSql.execute(
|
||||||
|
f"insert into sub1_bound values ( now()-1s, 2147483647, 9223372036854775807, 32767, 127, 3.40E+38, 1.7e+308, True, 'binary_tb1', 'nchar_tb1', now() )"
|
||||||
|
)
|
||||||
|
tdSql.execute(
|
||||||
|
f"insert into sub1_bound values ( now()-1s, -2147483647, -9223372036854775807, -32767, -127, -3.40E+38, -1.7e+308, True, 'binary_tb1', 'nchar_tb1', now() )"
|
||||||
|
)
|
||||||
|
tdSql.execute(
|
||||||
|
f"insert into sub1_bound values ( now(), 2147483646, 9223372036854775806, 32766, 126, 3.40E+38, 1.7e+308, True, 'binary_tb1', 'nchar_tb1', now() )"
|
||||||
|
)
|
||||||
|
tdSql.execute(
|
||||||
|
f"insert into sub1_bound values ( now(), -2147483646, -9223372036854775806, -32766, -126, -3.40E+38, -1.7e+308, True, 'binary_tb1', 'nchar_tb1', now() )"
|
||||||
|
)
|
||||||
|
tdSql.error(
|
||||||
|
f"insert into sub1_bound values ( now()+1s, 2147483648, 9223372036854775808, 32768, 128, 3.40E+38, 1.7e+308, True, 'binary_tb1', 'nchar_tb1', now() )"
|
||||||
|
)
|
||||||
|
self.check_function("&", False , "sub1_bound" ,"c1","c2","c3","c4","c5","c6" )
|
||||||
|
self.check_function("&", False ,"sub1_bound","abs(c1)","abs(c2)","abs(c3)","abs(c4)","abs(c5)","abs(c6)" )
|
||||||
|
self.check_function("&", False ,"stb_bound","123","abs(c2)","t1","abs(c4)","abs(c5)","abs(c6)" )
|
||||||
|
|
||||||
|
# check basic elem for table per row
|
||||||
|
tdSql.query(
|
||||||
|
"select abs(c1) ,abs(c2) , abs(c3) , abs(c4), abs(c5), abs(c6) from sub1_bound ")
|
||||||
|
tdSql.checkData(0, 0, 2147483647)
|
||||||
|
tdSql.checkData(0, 1, 9223372036854775807)
|
||||||
|
tdSql.checkData(0, 2, 32767)
|
||||||
|
tdSql.checkData(0, 3, 127)
|
||||||
|
tdSql.checkData(0, 4, 339999995214436424907732413799364296704.00000)
|
||||||
|
tdSql.checkData(0, 5, 169999999999999993883079578865998174333346074304075874502773119193537729178160565864330091787584707988572262467983188919169916105593357174268369962062473635296474636515660464935663040684957844303524367815028553272712298986386310828644513212353921123253311675499856875650512437415429217994623324794855339589632.000000000)
|
||||||
|
tdSql.checkData(1, 0, 2147483647)
|
||||||
|
tdSql.checkData(1, 1, 9223372036854775807)
|
||||||
|
tdSql.checkData(1, 2, 32767)
|
||||||
|
tdSql.checkData(1, 3, 127)
|
||||||
|
tdSql.checkData(1, 4, 339999995214436424907732413799364296704.00000)
|
||||||
|
tdSql.checkData(1, 5, 169999999999999993883079578865998174333346074304075874502773119193537729178160565864330091787584707988572262467983188919169916105593357174268369962062473635296474636515660464935663040684957844303524367815028553272712298986386310828644513212353921123253311675499856875650512437415429217994623324794855339589632.000000000)
|
||||||
|
tdSql.checkData(3, 0, 2147483646)
|
||||||
|
tdSql.checkData(3, 1, 9223372036854775806)
|
||||||
|
tdSql.checkData(3, 2, 32766)
|
||||||
|
tdSql.checkData(3, 3, 126)
|
||||||
|
tdSql.checkData(3, 4, 339999995214436424907732413799364296704.00000)
|
||||||
|
tdSql.checkData(3, 5, 169999999999999993883079578865998174333346074304075874502773119193537729178160565864330091787584707988572262467983188919169916105593357174268369962062473635296474636515660464935663040684957844303524367815028553272712298986386310828644513212353921123253311675499856875650512437415429217994623324794855339589632.000000000)
|
||||||
|
|
||||||
|
# check + - * / in functions
|
||||||
|
self.check_function("&", False ,"stb_bound","abs(c1+1)","abs(c2)","t1","abs(c3*1)","abs(c5)/2","abs(c6)" )
|
||||||
|
|
||||||
|
tdSql.query(
|
||||||
|
"select abs(c1+1) ,abs(c2) , abs(c3*1) , abs(c4/2), abs(c5)/2, abs(c6) from sub1_bound ")
|
||||||
|
tdSql.checkData(0, 0, 2147483648.000000000)
|
||||||
|
tdSql.checkData(0, 1, 9223372036854775807)
|
||||||
|
tdSql.checkData(0, 2, 32767.000000000)
|
||||||
|
tdSql.checkData(0, 3, 63.500000000)
|
||||||
|
tdSql.checkData(
|
||||||
|
0, 4, 169999997607218212453866206899682148352.000000000)
|
||||||
|
tdSql.checkData(0, 5, 169999999999999993883079578865998174333346074304075874502773119193537729178160565864330091787584707988572262467983188919169916105593357174268369962062473635296474636515660464935663040684957844303524367815028553272712298986386310828644513212353921123253311675499856875650512437415429217994623324794855339589632.000000000)
|
||||||
|
|
||||||
|
tdSql.checkData(1, 0, 2147483646.000000000)
|
||||||
|
tdSql.checkData(1, 1, 9223372036854775808.000000000)
|
||||||
|
tdSql.checkData(1, 2, 32767.000000000)
|
||||||
|
tdSql.checkData(1, 3, 63.500000000)
|
||||||
|
tdSql.checkData(
|
||||||
|
1, 4, 169999997607218212453866206899682148352.000000000)
|
||||||
|
|
||||||
|
|
||||||
|
def test_tag_compute_for_scalar_function(self):
|
||||||
|
|
||||||
|
tdSql.execute("use testdb")
|
||||||
|
|
||||||
|
self.check_function("&", False ,"ct4","123","abs(c1)","t1","abs(t2)","abs(t3)","abs(t4)","t5")
|
||||||
|
self.check_function("&", False ,"ct4","c1+2","abs(t2+2)","t3","abs(t4)","abs(t5)","abs(c1)","t5")
|
||||||
|
|
||||||
|
tdSql.query(" select sum(c1) from stb1 where t1+10 >1; ")
|
||||||
|
tdSql.query("select c1 ,t1 from stb1 where t1 =0 ")
|
||||||
|
tdSql.checkRows(13)
|
||||||
|
self.check_function("&", False ,"t1","c1+2","abs(c2)")
|
||||||
|
tdSql.query("select t1 from stb1 where t1 >0 ")
|
||||||
|
tdSql.checkRows(3)
|
||||||
|
tdSql.query("select t1 from stb1 where t1 =3 ")
|
||||||
|
tdSql.checkRows(1)
|
||||||
|
# tdSql.query("select sum(t1) from (select c1 ,t1 from stb1)")
|
||||||
|
# tdSql.checkData(0,0,61)
|
||||||
|
# tdSql.query("select distinct(c1) ,t1 from stb1")
|
||||||
|
# tdSql.checkRows(20)
|
||||||
|
tdSql.query("select max(c1) , t1&c2&t2 from stb1;")
|
||||||
|
tdSql.checkData(0,1,0)
|
||||||
|
|
||||||
|
# tag filter with abs function
|
||||||
|
tdSql.query("select t1 from stb1 where abs(t1)=1")
|
||||||
|
tdSql.checkRows(1)
|
||||||
|
tdSql.query("select t1 from stb1 where abs(c1+t1)=1")
|
||||||
|
tdSql.checkRows(1)
|
||||||
|
tdSql.checkData(0,0,0)
|
||||||
|
|
||||||
|
tdSql.query(
|
||||||
|
"select abs(c1+t1)*t1 from stb1 where abs(c1)/floor(abs(ceil(t1))) ==1")
|
||||||
|
|
||||||
|
def support_super_table_test(self):
|
||||||
|
tdSql.execute(" use testdb ")
|
||||||
|
self.check_function("|", False , "stb1" , "c1","c2","c3","c4" )
|
||||||
|
self.check_function("|", False , "stb1" , "c1","c2","abs(c3)","c4","ceil(t1)" )
|
||||||
|
self.check_function("&", False , "stb1" , "c1","c2","abs(c3)","floor(c4)","ceil(t1)" )
|
||||||
|
self.check_function("&", True , "stb1" , "max(c1)","max(c2)","sum(abs(c3))","max(floor(c4))","min(ceil(t1))" )
|
||||||
|
|
||||||
|
|
||||||
|
def run(self): # sourcery skip: extract-duplicate-method, remove-redundant-fstring
|
||||||
|
tdSql.prepare()
|
||||||
|
self.prepare_datas()
|
||||||
|
self.prepare_tag_datas()
|
||||||
|
self.test_errors()
|
||||||
|
self.basic_query()
|
||||||
|
self.check_boundary_values()
|
||||||
|
self.test_tag_compute_for_scalar_function()
|
||||||
|
self.support_super_table_test()
|
||||||
|
self.insert_datas_and_check_abs(self.tb_nums,self.row_nums,self.time_step)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
tdSql.close()
|
||||||
|
tdLog.success(f"{__file__} successfully executed")
|
||||||
|
|
||||||
|
|
||||||
|
tdCases.addLinux(__file__, TDTestCase())
|
||||||
|
tdCases.addWindows(__file__, TDTestCase())
|
|
@ -420,11 +420,65 @@ class TDTestCase:
|
||||||
tdSql.query("select csum(abs(c1))+2 from t1 ")
|
tdSql.query("select csum(abs(c1))+2 from t1 ")
|
||||||
tdSql.checkRows(4)
|
tdSql.checkRows(4)
|
||||||
|
|
||||||
|
def csum_support_stable(self):
|
||||||
|
tdSql.query(" select csum(1) from stb1 ")
|
||||||
|
tdSql.checkRows(70)
|
||||||
|
tdSql.query("select csum(c1) from stb1 partition by tbname ")
|
||||||
|
tdSql.checkRows(40)
|
||||||
|
# tdSql.query("select csum(st1) from stb1 partition by tbname")
|
||||||
|
# tdSql.checkRows(70)
|
||||||
|
tdSql.query("select csum(st1+c1) from stb1 partition by tbname")
|
||||||
|
tdSql.checkRows(40)
|
||||||
|
tdSql.query("select csum(st1+c1) from stb1 partition by tbname")
|
||||||
|
tdSql.checkRows(40)
|
||||||
|
tdSql.query("select csum(st1+c1) from stb1 partition by tbname")
|
||||||
|
tdSql.checkRows(40)
|
||||||
|
|
||||||
|
# # bug need fix
|
||||||
|
# tdSql.query("select csum(st1+c1) from stb1 partition by tbname slimit 1 ")
|
||||||
|
# tdSql.checkRows(4)
|
||||||
|
# tdSql.error("select csum(st1+c1) from stb1 partition by tbname limit 1 ")
|
||||||
|
|
||||||
|
|
||||||
|
# bug need fix
|
||||||
|
tdSql.query("select csum(st1+c1) from stb1 partition by tbname")
|
||||||
|
tdSql.checkRows(40)
|
||||||
|
|
||||||
|
# bug need fix
|
||||||
|
# tdSql.query("select tbname , csum(c1) from stb1 partition by tbname")
|
||||||
|
# tdSql.checkRows(40)
|
||||||
|
# tdSql.query("select tbname , csum(st1) from stb1 partition by tbname")
|
||||||
|
# tdSql.checkRows(70)
|
||||||
|
# tdSql.query("select tbname , csum(st1) from stb1 partition by tbname slimit 1")
|
||||||
|
# tdSql.checkRows(7)
|
||||||
|
|
||||||
|
# partition by tags
|
||||||
|
# tdSql.query("select st1 , csum(c1) from stb1 partition by st1")
|
||||||
|
# tdSql.checkRows(40)
|
||||||
|
# tdSql.query("select csum(c1) from stb1 partition by st1")
|
||||||
|
# tdSql.checkRows(40)
|
||||||
|
# tdSql.query("select st1 , csum(c1) from stb1 partition by st1 slimit 1")
|
||||||
|
# tdSql.checkRows(4)
|
||||||
|
# tdSql.query("select csum(c1) from stb1 partition by st1 slimit 1")
|
||||||
|
# tdSql.checkRows(4)
|
||||||
|
|
||||||
|
# partition by col
|
||||||
|
# tdSql.query("select c1 , csum(c1) from stb1 partition by c1")
|
||||||
|
# tdSql.checkRows(41)
|
||||||
|
# tdSql.query("select csum(c1) from stb1 partition by c1")
|
||||||
|
# tdSql.checkRows(41)
|
||||||
|
# tdSql.query("select c1 , csum(c1) from stb1 partition by st1 slimit 1")
|
||||||
|
# tdSql.checkRows(4)
|
||||||
|
# tdSql.query("select csum(c1) from stb1 partition by st1 slimit 1")
|
||||||
|
# tdSql.checkRows(4)
|
||||||
|
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
import traceback
|
import traceback
|
||||||
try:
|
try:
|
||||||
# run in develop branch
|
# run in develop branch
|
||||||
self.csum_test_run()
|
self.csum_test_run()
|
||||||
|
self.csum_support_stable()
|
||||||
pass
|
pass
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -355,9 +355,63 @@ class TDTestCase:
|
||||||
tdSql.execute(f"create table tt{i} using stb2 tags({i})")
|
tdSql.execute(f"create table tt{i} using stb2 tags({i})")
|
||||||
|
|
||||||
pass
|
pass
|
||||||
|
def diff_support_stable(self):
|
||||||
|
tdSql.query(" select diff(1) from stb1 ")
|
||||||
|
tdSql.checkRows(229)
|
||||||
|
tdSql.checkData(0,0,0)
|
||||||
|
tdSql.query("select diff(c1) from stb1 partition by tbname ")
|
||||||
|
tdSql.checkRows(199)
|
||||||
|
# tdSql.query("select diff(st1) from stb1 partition by tbname")
|
||||||
|
# tdSql.checkRows(229)
|
||||||
|
tdSql.query("select diff(st1+c1) from stb1 partition by tbname")
|
||||||
|
tdSql.checkRows(199)
|
||||||
|
tdSql.query("select diff(st1+c1) from stb1 partition by tbname")
|
||||||
|
tdSql.checkRows(199)
|
||||||
|
tdSql.query("select diff(st1+c1) from stb1 partition by tbname")
|
||||||
|
tdSql.checkRows(199)
|
||||||
|
|
||||||
|
# # bug need fix
|
||||||
|
# tdSql.query("select diff(st1+c1) from stb1 partition by tbname slimit 1 ")
|
||||||
|
# tdSql.checkRows(19)
|
||||||
|
# tdSql.error("select diff(st1+c1) from stb1 partition by tbname limit 1 ")
|
||||||
|
|
||||||
|
|
||||||
|
# bug need fix
|
||||||
|
tdSql.query("select diff(st1+c1) from stb1 partition by tbname")
|
||||||
|
tdSql.checkRows(199)
|
||||||
|
|
||||||
|
# bug need fix
|
||||||
|
# tdSql.query("select tbname , diff(c1) from stb1 partition by tbname")
|
||||||
|
# tdSql.checkRows(199)
|
||||||
|
# tdSql.query("select tbname , diff(st1) from stb1 partition by tbname")
|
||||||
|
# tdSql.checkRows(199)
|
||||||
|
# tdSql.query("select tbname , diff(st1) from stb1 partition by tbname slimit 1")
|
||||||
|
# tdSql.checkRows(19)
|
||||||
|
|
||||||
|
# partition by tags
|
||||||
|
# tdSql.query("select st1 , diff(c1) from stb1 partition by st1")
|
||||||
|
# tdSql.checkRows(199)
|
||||||
|
# tdSql.query("select diff(c1) from stb1 partition by st1")
|
||||||
|
# tdSql.checkRows(199)
|
||||||
|
# tdSql.query("select st1 , diff(c1) from stb1 partition by st1 slimit 1")
|
||||||
|
# tdSql.checkRows(19)
|
||||||
|
# tdSql.query("select diff(c1) from stb1 partition by st1 slimit 1")
|
||||||
|
# tdSql.checkRows(19)
|
||||||
|
|
||||||
|
# partition by col
|
||||||
|
# tdSql.query("select c1 , diff(c1) from stb1 partition by c1")
|
||||||
|
# tdSql.checkRows(199)
|
||||||
|
# tdSql.query("select diff(c1) from stb1 partition by c1")
|
||||||
|
# tdSql.checkRows(41)
|
||||||
|
# tdSql.query("select c1 , diff(c1) from stb1 partition by st1 slimit 1")
|
||||||
|
# tdSql.checkRows(19)
|
||||||
|
# tdSql.query("select diff(c1) from stb1 partition by st1 slimit 1")
|
||||||
|
# tdSql.checkRows(19)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def diff_test_run(self) :
|
def diff_test_run(self) :
|
||||||
tdLog.printNoPrefix("==========TD-10594==========")
|
tdLog.printNoPrefix("==========run test case for diff function==========")
|
||||||
tbnum = 10
|
tbnum = 10
|
||||||
nowtime = int(round(time.time() * 1000))
|
nowtime = int(round(time.time() * 1000))
|
||||||
per_table_rows = 10
|
per_table_rows = 10
|
||||||
|
@ -422,6 +476,7 @@ class TDTestCase:
|
||||||
try:
|
try:
|
||||||
# run in develop branch
|
# run in develop branch
|
||||||
self.diff_test_run()
|
self.diff_test_run()
|
||||||
|
self.diff_support_stable()
|
||||||
pass
|
pass
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -673,11 +673,65 @@ class TDTestCase:
|
||||||
tdSql.query("select mavg(abs(c1),1) from t1")
|
tdSql.query("select mavg(abs(c1),1) from t1")
|
||||||
tdSql.checkRows(4)
|
tdSql.checkRows(4)
|
||||||
|
|
||||||
|
def mavg_support_stable(self):
|
||||||
|
tdSql.query(" select mavg(1,3) from stb1 ")
|
||||||
|
tdSql.checkRows(68)
|
||||||
|
tdSql.checkData(0,0,1.000000000)
|
||||||
|
tdSql.query("select mavg(c1,3) from stb1 partition by tbname ")
|
||||||
|
tdSql.checkRows(38)
|
||||||
|
# tdSql.query("select mavg(st1,3) from stb1 partition by tbname")
|
||||||
|
# tdSql.checkRows(38)
|
||||||
|
tdSql.query("select mavg(st1+c1,3) from stb1 partition by tbname")
|
||||||
|
tdSql.checkRows(38)
|
||||||
|
tdSql.query("select mavg(st1+c1,3) from stb1 partition by tbname")
|
||||||
|
tdSql.checkRows(38)
|
||||||
|
tdSql.query("select mavg(st1+c1,3) from stb1 partition by tbname")
|
||||||
|
tdSql.checkRows(38)
|
||||||
|
|
||||||
|
# # bug need fix
|
||||||
|
# tdSql.query("select mavg(st1+c1,3) from stb1 partition by tbname slimit 1 ")
|
||||||
|
# tdSql.checkRows(2)
|
||||||
|
# tdSql.error("select mavg(st1+c1,3) from stb1 partition by tbname limit 1 ")
|
||||||
|
|
||||||
|
|
||||||
|
# bug need fix
|
||||||
|
tdSql.query("select mavg(st1+c1,3) from stb1 partition by tbname")
|
||||||
|
tdSql.checkRows(38)
|
||||||
|
|
||||||
|
# bug need fix
|
||||||
|
# tdSql.query("select tbname , mavg(c1,3) from stb1 partition by tbname")
|
||||||
|
# tdSql.checkRows(38)
|
||||||
|
# tdSql.query("select tbname , mavg(st1,3) from stb1 partition by tbname")
|
||||||
|
# tdSql.checkRows(38)
|
||||||
|
# tdSql.query("select tbname , mavg(st1,3) from stb1 partition by tbname slimit 1")
|
||||||
|
# tdSql.checkRows(2)
|
||||||
|
|
||||||
|
# partition by tags
|
||||||
|
# tdSql.query("select st1 , mavg(c1,3) from stb1 partition by st1")
|
||||||
|
# tdSql.checkRows(38)
|
||||||
|
# tdSql.query("select mavg(c1,3) from stb1 partition by st1")
|
||||||
|
# tdSql.checkRows(38)
|
||||||
|
# tdSql.query("select st1 , mavg(c1,3) from stb1 partition by st1 slimit 1")
|
||||||
|
# tdSql.checkRows(2)
|
||||||
|
# tdSql.query("select mavg(c1,3) from stb1 partition by st1 slimit 1")
|
||||||
|
# tdSql.checkRows(2)
|
||||||
|
|
||||||
|
# partition by col
|
||||||
|
# tdSql.query("select c1 , mavg(c1,3) from stb1 partition by c1")
|
||||||
|
# tdSql.checkRows(38)
|
||||||
|
# tdSql.query("select mavg(c1 ,3) from stb1 partition by c1")
|
||||||
|
# tdSql.checkRows(38)
|
||||||
|
# tdSql.query("select c1 , mavg(c1,3) from stb1 partition by st1 slimit 1")
|
||||||
|
# tdSql.checkRows(2)
|
||||||
|
# tdSql.query("select diff(c1) from stb1 partition by st1 slimit 1")
|
||||||
|
# tdSql.checkRows(2)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
import traceback
|
import traceback
|
||||||
try:
|
try:
|
||||||
# run in develop branch
|
# run in develop branch
|
||||||
self.mavg_test_run()
|
self.mavg_test_run()
|
||||||
|
self.mavg_support_stable()
|
||||||
pass
|
pass
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
|
|
|
@ -478,6 +478,9 @@ class TDTestCase:
|
||||||
self.test_case3()
|
self.test_case3()
|
||||||
# tdLog.debug(" LIMIT test_case3 ............ [OK]")
|
# tdLog.debug(" LIMIT test_case3 ............ [OK]")
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
tdSql.close()
|
||||||
|
tdLog.success(f"{__file__} successfully executed")
|
||||||
|
|
||||||
return
|
return
|
||||||
#
|
#
|
||||||
|
|
|
@ -798,6 +798,36 @@ class TDTestCase:
|
||||||
tdSql.query("select sample(c1,100)+2 from ct1")
|
tdSql.query("select sample(c1,100)+2 from ct1")
|
||||||
tdSql.query("select abs(sample(c1,100)) from ct1")
|
tdSql.query("select abs(sample(c1,100)) from ct1")
|
||||||
|
|
||||||
|
# support stable and tbname
|
||||||
|
tdSql.query("select tbname ,sample(c1,2) from stb1 partition by tbname order by tbname")
|
||||||
|
tdSql.checkRows(4)
|
||||||
|
tdSql.checkData(0,0,'ct1')
|
||||||
|
tdSql.checkData(3,0,'ct4')
|
||||||
|
|
||||||
|
# # bug need fix
|
||||||
|
# tdSql.query(" select tbname ,c1 ,t1, sample(c1,2) from stb1 partition by tbname order by tbname ")
|
||||||
|
# tdSql.checkRows(4)
|
||||||
|
# tdSql.checkData(0,0,'ct1')
|
||||||
|
# tdSql.checkData(3,0,'ct4')
|
||||||
|
# tdSql.checkData(0,2,1)
|
||||||
|
# tdSql.checkData(3,2,4)
|
||||||
|
|
||||||
|
tdSql.query(" select tbname ,c1 ,t1, sample(c1,2) from stb1 partition by t1 order by t1 ")
|
||||||
|
tdSql.checkRows(4)
|
||||||
|
tdSql.checkData(0,0,'ct1')
|
||||||
|
tdSql.checkData(3,0,'ct4')
|
||||||
|
tdSql.checkData(0,2,1)
|
||||||
|
tdSql.checkData(3,2,4)
|
||||||
|
|
||||||
|
# bug need fix
|
||||||
|
# tdSql.query(" select tbname ,c1 ,t1, sample(c1,2) from stb1 partition by c1 order by c1 ")
|
||||||
|
# tdSql.checkRows(21)
|
||||||
|
|
||||||
|
# bug need fix
|
||||||
|
# tdSql.query(" select sample(c1,2) from stb1 partition by c1 ")
|
||||||
|
# tdSql.checkRows(21)
|
||||||
|
|
||||||
|
|
||||||
def sample_test_run(self) :
|
def sample_test_run(self) :
|
||||||
tdLog.printNoPrefix("==========support sample function==========")
|
tdLog.printNoPrefix("==========support sample function==========")
|
||||||
tbnum = 10
|
tbnum = 10
|
||||||
|
|
|
@ -18,6 +18,7 @@ class TDTestCase:
|
||||||
def init(self, conn, logSql):
|
def init(self, conn, logSql):
|
||||||
tdLog.debug(f"start to excute {__file__}")
|
tdLog.debug(f"start to excute {__file__}")
|
||||||
tdSql.init(conn.cursor())
|
tdSql.init(conn.cursor())
|
||||||
|
self.ts = 1420041600000 # 2015-01-01 00:00:00 this is begin time for first record
|
||||||
|
|
||||||
def prepare_datas(self):
|
def prepare_datas(self):
|
||||||
tdSql.execute(
|
tdSql.execute(
|
||||||
|
@ -344,6 +345,8 @@ class TDTestCase:
|
||||||
tdSql.error("select stateduration(c1,'GT',1,1b) from ct1")
|
tdSql.error("select stateduration(c1,'GT',1,1b) from ct1")
|
||||||
tdSql.error("select stateduration(c1,'GT',1,1u) from ct1")
|
tdSql.error("select stateduration(c1,'GT',1,1u) from ct1")
|
||||||
tdSql.error("select stateduration(c1,'GT',1,1000s) from t1")
|
tdSql.error("select stateduration(c1,'GT',1,1000s) from t1")
|
||||||
|
tdSql.error("select stateduration(c1,'GT',1,10m) from t1")
|
||||||
|
tdSql.error("select stateduration(c1,'GT',1,10d) from t1")
|
||||||
tdSql.query("select stateduration(c1,'GT',1,1s) from t1")
|
tdSql.query("select stateduration(c1,'GT',1,1s) from t1")
|
||||||
tdSql.checkData(10,0,63072035)
|
tdSql.checkData(10,0,63072035)
|
||||||
tdSql.query("select stateduration(c1,'GT',1,1m) from t1")
|
tdSql.query("select stateduration(c1,'GT',1,1m) from t1")
|
||||||
|
@ -355,6 +358,58 @@ class TDTestCase:
|
||||||
tdSql.query("select stateduration(c1,'GT',1,1w) from t1")
|
tdSql.query("select stateduration(c1,'GT',1,1w) from t1")
|
||||||
tdSql.checkData(10,0,int(63072035/60/7/24/60))
|
tdSql.checkData(10,0,int(63072035/60/7/24/60))
|
||||||
|
|
||||||
|
def query_precision(self):
|
||||||
|
def generate_data(precision="ms"):
|
||||||
|
tdSql.execute("create database if not exists db_%s precision '%s';" %(precision, precision))
|
||||||
|
tdSql.execute("use db_%s;" %precision)
|
||||||
|
tdSql.execute("create stable db_%s.st (ts timestamp , id int) tags(ind int);"%precision)
|
||||||
|
tdSql.execute("create table db_%s.tb1 using st tags(1);"%precision)
|
||||||
|
tdSql.execute("create table db_%s.tb2 using st tags(2);"%precision)
|
||||||
|
|
||||||
|
if precision == "ms":
|
||||||
|
start_ts = self.ts
|
||||||
|
step = 10000
|
||||||
|
elif precision == "us":
|
||||||
|
start_ts = self.ts*1000
|
||||||
|
step = 10000000
|
||||||
|
elif precision == "ns":
|
||||||
|
start_ts = self.ts*1000000
|
||||||
|
step = 10000000000
|
||||||
|
else:
|
||||||
|
pass
|
||||||
|
|
||||||
|
for i in range(10):
|
||||||
|
|
||||||
|
sql1 = "insert into db_%s.tb1 values (%d,%d)"%(precision ,start_ts+i*step,i)
|
||||||
|
sql2 = "insert into db_%s.tb1 values (%d,%d)"%(precision, start_ts+i*step,i)
|
||||||
|
tdSql.execute(sql1)
|
||||||
|
tdSql.execute(sql2)
|
||||||
|
|
||||||
|
time_units = ["1s","1a","1u","1b"]
|
||||||
|
|
||||||
|
precision_list = ["ms","us","ns"]
|
||||||
|
for pres in precision_list:
|
||||||
|
generate_data(pres)
|
||||||
|
|
||||||
|
for index,unit in enumerate(time_units):
|
||||||
|
|
||||||
|
if pres == "ms":
|
||||||
|
if unit in ["1u","1b"]:
|
||||||
|
tdSql.error("select stateduration(id,'GT',1,%s) from db_%s.tb1 "%(unit,pres))
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
tdSql.query("select stateduration(id,'GT',1,%s) from db_%s.tb1 "%(unit,pres))
|
||||||
|
elif pres == "us" and unit in ["1b"]:
|
||||||
|
if unit in ["1b"]:
|
||||||
|
tdSql.error("select stateduration(id,'GT',1,%s) from db_%s.tb1 "%(unit,pres))
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
tdSql.query("select stateduration(id,'GT',1,%s) from db_%s.tb1 "%(unit,pres))
|
||||||
|
else:
|
||||||
|
|
||||||
|
tdSql.query("select stateduration(id,'GT',1,%s) from db_%s.tb1 "%(unit,pres))
|
||||||
|
basic_result = 70
|
||||||
|
tdSql.checkData(9,0,basic_result*pow(1000,index))
|
||||||
|
|
||||||
def check_boundary_values(self):
|
def check_boundary_values(self):
|
||||||
|
|
||||||
|
@ -420,6 +475,8 @@ class TDTestCase:
|
||||||
tdLog.printNoPrefix("==========step6: statecount unit time test ============")
|
tdLog.printNoPrefix("==========step6: statecount unit time test ============")
|
||||||
|
|
||||||
self.check_unit_time()
|
self.check_unit_time()
|
||||||
|
self.query_precision()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
|
|
|
@ -337,7 +337,7 @@ class TDTestCase:
|
||||||
tdSql.checkData(2,0,5)
|
tdSql.checkData(2,0,5)
|
||||||
|
|
||||||
# nest query
|
# nest query
|
||||||
# tdSql.query("select tail(c1,2) from (select c1 from ct1)")
|
# tdSql.query("select tail(c1,2) from (select _rowts , c1 from ct1)")
|
||||||
tdSql.query("select c1 from (select tail(c1,2) c1 from ct4) order by 1 nulls first")
|
tdSql.query("select c1 from (select tail(c1,2) c1 from ct4) order by 1 nulls first")
|
||||||
tdSql.checkRows(2)
|
tdSql.checkRows(2)
|
||||||
tdSql.checkData(0, 0, None)
|
tdSql.checkData(0, 0, None)
|
||||||
|
@ -363,9 +363,58 @@ class TDTestCase:
|
||||||
tdSql.error("select tail(c1,2) from ct1 group by tbname")
|
tdSql.error("select tail(c1,2) from ct1 group by tbname")
|
||||||
|
|
||||||
# super table
|
# super table
|
||||||
|
tdSql.error("select tbname , tail(c1,2) from stb1 group by tbname")
|
||||||
|
tdSql.query("select tail(c1,2) from stb1 partition by tbname")
|
||||||
|
tdSql.checkRows(4)
|
||||||
|
|
||||||
|
|
||||||
|
# bug need fix
|
||||||
|
# tdSql.query("select tbname , tail(c1,2) from stb1 partition by tbname")
|
||||||
|
# tdSql.checkRows(4)
|
||||||
|
|
||||||
|
# tdSql.query("select tbname , tail(c1,2) from stb1 partition by tbname order by tbname")
|
||||||
|
# tdSql.checkRows(4)
|
||||||
|
|
||||||
|
# tdSql.query(" select tbname , count(c1) from stb1 partition by tbname order by tbname ")
|
||||||
|
# tdSql.checkRows(2)
|
||||||
|
# tdSql.query(" select tbname , max(c1) ,c1 from stb1 partition by tbname order by tbname ")
|
||||||
|
# tdSql.checkRows(2)
|
||||||
|
# tdSql.query(" select tbname ,first(c1) from stb1 partition by tbname order by tbname ")
|
||||||
|
# tdSql.checkRows(2)
|
||||||
|
|
||||||
|
tdSql.query("select tail(c1,2) from stb1 partition by tbname")
|
||||||
|
tdSql.checkRows(4)
|
||||||
|
|
||||||
|
|
||||||
|
# # bug need fix
|
||||||
|
# tdSql.query(" select tbname , tail(c1,2) from stb1 where t1 = 0 partition by tbname ")
|
||||||
|
# tdSql.checkRows(2)
|
||||||
|
# tdSql.query(" select tbname , tail(c1,2) from stb1 where t1 = 0 partition by tbname order by tbname ")
|
||||||
|
# tdSql.checkRows(2)
|
||||||
|
# tdSql.query(" select tbname , tail(c1,2) from stb1 where c1 = 0 partition by tbname order by tbname ")
|
||||||
|
# tdSql.checkRows(3)
|
||||||
|
# tdSql.query(" select tbname , tail(c1,2) from stb1 where c1 = 0 partition by tbname ")
|
||||||
|
# tdSql.checkRows(3)
|
||||||
|
# tdSql.query(" select tbname , tail(c1,2) from stb1 where c1 = 0 partition by tbname ")
|
||||||
|
# tdSql.checkRows(3)
|
||||||
|
tdSql.query(" select tail(t1,2) from stb1 ")
|
||||||
|
tdSql.checkRows(2)
|
||||||
|
tdSql.query(" select tail(t1+c1,2) from stb1 ")
|
||||||
|
tdSql.checkRows(2)
|
||||||
|
tdSql.query(" select tail(t1+c1,2) from stb1 partition by tbname ")
|
||||||
|
tdSql.checkRows(4)
|
||||||
|
tdSql.query(" select tail(t1,2) from stb1 partition by tbname ")
|
||||||
|
tdSql.checkRows(4)
|
||||||
|
|
||||||
|
# nest query
|
||||||
|
tdSql.query(" select tail(c1,2) from (select _rowts , t1 ,c1 , tbname from stb1 ) ")
|
||||||
|
tdSql.checkRows(2)
|
||||||
|
tdSql.checkData(0,0,None)
|
||||||
|
tdSql.checkData(1,0,9)
|
||||||
|
tdSql.query("select tail(t1,2) from (select _rowts , t1 , tbname from stb1 )")
|
||||||
|
tdSql.checkRows(2)
|
||||||
|
tdSql.checkData(0,0,4)
|
||||||
|
tdSql.checkData(1,0,1)
|
||||||
|
|
||||||
def check_boundary_values(self):
|
def check_boundary_values(self):
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,6 @@ class TDTestCase:
|
||||||
self.db_param_precision = ['ms','us','ns']
|
self.db_param_precision = ['ms','us','ns']
|
||||||
self.time_unit = ['1w','1d','1h','1m','1s','1a','1u','1b']
|
self.time_unit = ['1w','1d','1h','1m','1s','1a','1u','1b']
|
||||||
self.error_unit = ['2w','2d','2h','2m','2s','2a','2u','1c','#1']
|
self.error_unit = ['2w','2d','2h','2m','2s','2a','2u','1c','#1']
|
||||||
self.error_unit = ['2w','2d','2h','2m','2s','2a','2u','1c','#1']
|
|
||||||
self.ntbname = 'ntb'
|
self.ntbname = 'ntb'
|
||||||
self.stbname = 'stb'
|
self.stbname = 'stb'
|
||||||
self.ctbname = 'ctb'
|
self.ctbname = 'ctb'
|
||||||
|
|
|
@ -387,8 +387,58 @@ class TDTestCase:
|
||||||
|
|
||||||
# super table
|
# super table
|
||||||
|
|
||||||
|
# super table
|
||||||
|
tdSql.error("select tbname , tail(c1,2) from stb1 group by tbname")
|
||||||
|
tdSql.query("select tail(c1,2) from stb1 partition by tbname")
|
||||||
|
tdSql.checkRows(4)
|
||||||
|
|
||||||
|
|
||||||
|
# bug need fix
|
||||||
|
# tdSql.query("select tbname , tail(c1,2) from stb1 partition by tbname")
|
||||||
|
# tdSql.checkRows(4)
|
||||||
|
|
||||||
|
# tdSql.query("select tbname , tail(c1,2) from stb1 partition by tbname order by tbname")
|
||||||
|
# tdSql.checkRows(4)
|
||||||
|
|
||||||
|
# tdSql.query(" select tbname , count(c1) from stb1 partition by tbname order by tbname ")
|
||||||
|
# tdSql.checkRows(2)
|
||||||
|
# tdSql.query(" select tbname , max(c1) ,c1 from stb1 partition by tbname order by tbname ")
|
||||||
|
# tdSql.checkRows(2)
|
||||||
|
# tdSql.query(" select tbname ,first(c1) from stb1 partition by tbname order by tbname ")
|
||||||
|
# tdSql.checkRows(2)
|
||||||
|
|
||||||
|
tdSql.query("select tail(c1,2) from stb1 partition by tbname")
|
||||||
|
tdSql.checkRows(4)
|
||||||
|
|
||||||
|
|
||||||
|
# # bug need fix
|
||||||
|
# tdSql.query(" select tbname , unique(c1) from stb1 where t1 = 0 partition by tbname ")
|
||||||
|
# tdSql.checkRows(2)
|
||||||
|
# tdSql.query(" select tbname , unique(c1) from stb1 where t1 = 0 partition by tbname order by tbname ")
|
||||||
|
# tdSql.checkRows(2)
|
||||||
|
# tdSql.query(" select tbname , unique(c1) from stb1 where c1 = 0 partition by tbname order by tbname ")
|
||||||
|
# tdSql.checkRows(3)
|
||||||
|
# tdSql.query(" select tbname , unique(c1) from stb1 where c1 = 0 partition by tbname ")
|
||||||
|
# tdSql.checkRows(3)
|
||||||
|
|
||||||
|
tdSql.query(" select unique(t1) from stb1 ")
|
||||||
|
tdSql.checkRows(2)
|
||||||
|
tdSql.query(" select unique(t1+c1) from stb1 ")
|
||||||
|
tdSql.checkRows(13)
|
||||||
|
tdSql.query(" select unique(t1+c1) from stb1 partition by tbname ")
|
||||||
|
tdSql.checkRows(13)
|
||||||
|
tdSql.query(" select unique(t1) from stb1 partition by tbname ")
|
||||||
|
tdSql.checkRows(2)
|
||||||
|
|
||||||
|
# nest query
|
||||||
|
tdSql.query(" select unique(c1) from (select _rowts , t1 ,c1 , tbname from stb1 ) ")
|
||||||
|
tdSql.checkRows(11)
|
||||||
|
tdSql.checkData(0,0,6)
|
||||||
|
tdSql.checkData(10,0,3)
|
||||||
|
tdSql.query("select unique(t1) from (select _rowts , t1 , tbname from stb1 )")
|
||||||
|
tdSql.checkRows(2)
|
||||||
|
tdSql.checkData(0,0,4)
|
||||||
|
tdSql.checkData(1,0,1)
|
||||||
|
|
||||||
def check_boundary_values(self):
|
def check_boundary_values(self):
|
||||||
|
|
||||||
|
|
|
@ -172,7 +172,7 @@ class TDTestCase:
|
||||||
tmqCom.initConsumerTable()
|
tmqCom.initConsumerTable()
|
||||||
|
|
||||||
tdLog.info("create topics from stb with filter")
|
tdLog.info("create topics from stb with filter")
|
||||||
queryString = "select ts, acos(c1), ceil(pow(c1,3)) from %s.%s where (sin(c2) >= 0) and (c1 %% 4 == 0) and (ts >= %d) and (t4 like 'shanghai')"%(paraDict['dbName'], paraDict['stbName'], paraDict["startTs"]+math.ceil(self.rowsPerTbl/5))
|
queryString = "select ts, acos(c1), ceil(pow(c1,3)) from %s.%s where (sin(c2) >= 0) and (c1 %% 4 != 0) and (ts+1a >= %d) and (t4 like '%%shanghai')"%(paraDict['dbName'], paraDict['stbName'], paraDict["startTs"]+math.ceil(self.rowsPerTbl/10))
|
||||||
# queryString = "select * from %s.%s"%(paraDict['dbName'], paraDict['stbName'])
|
# queryString = "select * from %s.%s"%(paraDict['dbName'], paraDict['stbName'])
|
||||||
# sqlString = "create topic %s as stable %s" %(topicNameList[0], paraDict['stbName'])
|
# sqlString = "create topic %s as stable %s" %(topicNameList[0], paraDict['stbName'])
|
||||||
sqlString = "create topic %s as %s" %(topicNameList[0], queryString)
|
sqlString = "create topic %s as %s" %(topicNameList[0], queryString)
|
||||||
|
|
|
@ -27,8 +27,8 @@ python3 ./test.py -f 1-insert/table_comment.py
|
||||||
python3 ./test.py -f 1-insert/time_range_wise.py
|
python3 ./test.py -f 1-insert/time_range_wise.py
|
||||||
python3 ./test.py -f 1-insert/block_wise.py
|
python3 ./test.py -f 1-insert/block_wise.py
|
||||||
python3 ./test.py -f 1-insert/create_retentions.py
|
python3 ./test.py -f 1-insert/create_retentions.py
|
||||||
|
|
||||||
python3 ./test.py -f 1-insert/table_param_ttl.py
|
python3 ./test.py -f 1-insert/table_param_ttl.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
|
||||||
python3 ./test.py -f 2-query/varchar.py
|
python3 ./test.py -f 2-query/varchar.py
|
||||||
|
@ -53,6 +53,7 @@ python3 ./test.py -f 2-query/spread.py
|
||||||
python3 ./test.py -f 2-query/hyperloglog.py
|
python3 ./test.py -f 2-query/hyperloglog.py
|
||||||
python3 ./test.py -f 2-query/explain.py
|
python3 ./test.py -f 2-query/explain.py
|
||||||
python3 ./test.py -f 2-query/leastsquares.py
|
python3 ./test.py -f 2-query/leastsquares.py
|
||||||
|
python3 ./test.py -f 2-query/histogram.py
|
||||||
|
|
||||||
|
|
||||||
python3 ./test.py -f 2-query/timezone.py
|
python3 ./test.py -f 2-query/timezone.py
|
||||||
|
@ -94,7 +95,7 @@ python3 ./test.py -f 2-query/query_cols_tags_and_or.py
|
||||||
# python3 ./test.py -f 2-query/nestedQuery_str.py
|
# python3 ./test.py -f 2-query/nestedQuery_str.py
|
||||||
|
|
||||||
python3 ./test.py -f 2-query/avg.py
|
python3 ./test.py -f 2-query/avg.py
|
||||||
#python3 ./test.py -f 2-query/elapsed.py
|
python3 ./test.py -f 2-query/elapsed.py
|
||||||
python3 ./test.py -f 2-query/csum.py
|
python3 ./test.py -f 2-query/csum.py
|
||||||
python3 ./test.py -f 2-query/mavg.py
|
python3 ./test.py -f 2-query/mavg.py
|
||||||
python3 ./test.py -f 2-query/diff.py
|
python3 ./test.py -f 2-query/diff.py
|
||||||
|
@ -116,9 +117,10 @@ python3 ./test.py -f 2-query/distribute_agg_avg.py
|
||||||
python3 ./test.py -f 2-query/distribute_agg_stddev.py
|
python3 ./test.py -f 2-query/distribute_agg_stddev.py
|
||||||
python3 ./test.py -f 2-query/twa.py
|
python3 ./test.py -f 2-query/twa.py
|
||||||
python3 ./test.py -f 2-query/irate.py
|
python3 ./test.py -f 2-query/irate.py
|
||||||
|
python3 ./test.py -f 2-query/and_or_for_byte.py
|
||||||
|
|
||||||
python3 ./test.py -f 2-query/function_null.py
|
python3 ./test.py -f 2-query/function_null.py
|
||||||
#python3 ./test.py -f 2-query/queryQnode.py
|
python3 ./test.py -f 2-query/queryQnode.py
|
||||||
|
|
||||||
#python3 ./test.py -f 6-cluster/5dnode1mnode.py
|
#python3 ./test.py -f 6-cluster/5dnode1mnode.py
|
||||||
#python3 ./test.py -f 6-cluster/5dnode2mnode.py -N 5 -M 3
|
#python3 ./test.py -f 6-cluster/5dnode2mnode.py -N 5 -M 3
|
||||||
|
@ -172,3 +174,176 @@ python3 ./test.py -f 7-tmq/tmqConsFromTsdb1-1ctb-funcNFilter.py
|
||||||
python3 ./test.py -f 7-tmq/tmqConsFromTsdb1-mutilVg-mutilCtb-funcNFilter.py
|
python3 ./test.py -f 7-tmq/tmqConsFromTsdb1-mutilVg-mutilCtb-funcNFilter.py
|
||||||
python3 ./test.py -f 7-tmq/tmqConsFromTsdb1-mutilVg-mutilCtb.py
|
python3 ./test.py -f 7-tmq/tmqConsFromTsdb1-mutilVg-mutilCtb.py
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#------------querPolicy 2-----------
|
||||||
|
|
||||||
|
python3 ./test.py -f 2-query/between.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/distinct.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/varchar.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/ltrim.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/rtrim.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/length.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/char_length.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/upper.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/lower.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/join.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/join2.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/cast.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/substr.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/union.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/union1.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/concat.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/concat2.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/concat_ws.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/concat_ws2.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/check_tsdb.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/spread.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/hyperloglog.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/explain.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/leastsquares.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/timezone.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/Now.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/Today.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/max.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/min.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/count.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/last.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/first.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/To_iso8601.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/To_unixtimestamp.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/timetruncate.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/diff.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/Timediff.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/json_tag.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/top.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/bottom.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/percentile.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/apercentile.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/abs.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/ceil.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/floor.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/round.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/log.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/pow.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/sqrt.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/sin.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/cos.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/tan.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/arcsin.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/arccos.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/arctan.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/query_cols_tags_and_or.py -Q 2
|
||||||
|
|
||||||
|
# python3 ./test.py -f 2-query/nestedQuery.py -Q 2
|
||||||
|
# python3 ./test.py -f 2-query/nestedQuery_str.py -Q 2
|
||||||
|
|
||||||
|
python3 ./test.py -f 2-query/avg.py -Q 2
|
||||||
|
# python3 ./test.py -f 2-query/elapsed.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/csum.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/mavg.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/diff.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/sample.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/function_diff.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/unique.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/stateduration.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/function_stateduration.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/statecount.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/tail.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/ttl_comment.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/distribute_agg_count.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/distribute_agg_max.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/distribute_agg_min.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/distribute_agg_sum.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/distribute_agg_spread.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/distribute_agg_apercentile.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/distribute_agg_avg.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/distribute_agg_stddev.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/twa.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/irate.py -Q 2
|
||||||
|
python3 ./test.py -f 2-query/function_null.py -Q 2
|
||||||
|
|
||||||
|
#------------querPolicy 3-----------
|
||||||
|
|
||||||
|
python3 ./test.py -f 2-query/between.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/distinct.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/varchar.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/ltrim.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/rtrim.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/length.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/char_length.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/upper.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/lower.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/join.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/join2.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/cast.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/substr.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/union.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/union1.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/concat.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/concat2.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/concat_ws.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/concat_ws2.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/check_tsdb.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/spread.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/hyperloglog.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/explain.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/leastsquares.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/timezone.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/Now.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/Today.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/max.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/min.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/count.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/last.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/first.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/To_iso8601.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/To_unixtimestamp.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/timetruncate.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/diff.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/Timediff.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/json_tag.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/top.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/bottom.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/percentile.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/apercentile.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/abs.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/ceil.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/floor.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/round.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/log.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/pow.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/sqrt.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/sin.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/cos.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/tan.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/arcsin.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/arccos.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/arctan.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/query_cols_tags_and_or.py -Q 3
|
||||||
|
# python3 ./test.py -f 2-query/nestedQuery.py -Q 3
|
||||||
|
# python3 ./test.py -f 2-query/nestedQuery_str.py -Q 3
|
||||||
|
# python3 ./test.py -f 2-query/avg.py -Q 3
|
||||||
|
# python3 ./test.py -f 2-query/elapsed.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/csum.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/mavg.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/diff.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/sample.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/function_diff.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/unique.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/stateduration.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/function_stateduration.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/statecount.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/tail.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/ttl_comment.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/distribute_agg_count.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/distribute_agg_max.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/distribute_agg_min.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/distribute_agg_sum.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/distribute_agg_spread.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/distribute_agg_apercentile.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/distribute_agg_avg.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/distribute_agg_stddev.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/twa.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/irate.py -Q 3
|
||||||
|
python3 ./test.py -f 2-query/function_null.py -Q 3
|
||||||
|
|
|
@ -44,27 +44,27 @@ static int32_t shellParseSingleOpt(int32_t key, char *arg);
|
||||||
|
|
||||||
void shellPrintHelp() {
|
void shellPrintHelp() {
|
||||||
char indent[] = " ";
|
char indent[] = " ";
|
||||||
printf("Usage: taos [OPTION...] \n\n");
|
printf("Usage: taos [OPTION...] \r\n\r\n");
|
||||||
printf("%s%s%s%s\n", indent, "-a,", indent, SHELL_AUTH);
|
printf("%s%s%s%s\r\n", indent, "-a,", indent, SHELL_AUTH);
|
||||||
printf("%s%s%s%s\n", indent, "-A,", indent, SHELL_GEN_AUTH);
|
printf("%s%s%s%s\r\n", indent, "-A,", indent, SHELL_GEN_AUTH);
|
||||||
printf("%s%s%s%s\n", indent, "-c,", indent, SHELL_CFG_DIR);
|
printf("%s%s%s%s\r\n", indent, "-c,", indent, SHELL_CFG_DIR);
|
||||||
printf("%s%s%s%s\n", indent, "-C,", indent, SHELL_DMP_CFG);
|
printf("%s%s%s%s\r\n", indent, "-C,", indent, SHELL_DMP_CFG);
|
||||||
printf("%s%s%s%s\n", indent, "-d,", indent, SHELL_DB);
|
printf("%s%s%s%s\r\n", indent, "-d,", indent, SHELL_DB);
|
||||||
printf("%s%s%s%s\n", indent, "-f,", indent, SHELL_FILE);
|
printf("%s%s%s%s\r\n", indent, "-f,", indent, SHELL_FILE);
|
||||||
printf("%s%s%s%s\n", indent, "-h,", indent, SHELL_HOST);
|
printf("%s%s%s%s\r\n", indent, "-h,", indent, SHELL_HOST);
|
||||||
printf("%s%s%s%s\n", indent, "-k,", indent, SHELL_CHECK);
|
printf("%s%s%s%s\r\n", indent, "-k,", indent, SHELL_CHECK);
|
||||||
printf("%s%s%s%s\n", indent, "-l,", indent, SHELL_PKG_LEN);
|
printf("%s%s%s%s\r\n", indent, "-l,", indent, SHELL_PKG_LEN);
|
||||||
printf("%s%s%s%s\n", indent, "-n,", indent, SHELL_NET_ROLE);
|
printf("%s%s%s%s\r\n", indent, "-n,", indent, SHELL_NET_ROLE);
|
||||||
printf("%s%s%s%s\n", indent, "-N,", indent, SHELL_PKT_NUM);
|
printf("%s%s%s%s\r\n", indent, "-N,", indent, SHELL_PKT_NUM);
|
||||||
printf("%s%s%s%s\n", indent, "-p,", indent, SHELL_PASSWORD);
|
printf("%s%s%s%s\r\n", indent, "-p,", indent, SHELL_PASSWORD);
|
||||||
printf("%s%s%s%s\n", indent, "-P,", indent, SHELL_PORT);
|
printf("%s%s%s%s\r\n", indent, "-P,", indent, SHELL_PORT);
|
||||||
printf("%s%s%s%s\n", indent, "-r,", indent, SHELL_RAW_TIME);
|
printf("%s%s%s%s\r\n", indent, "-r,", indent, SHELL_RAW_TIME);
|
||||||
printf("%s%s%s%s\n", indent, "-s,", indent, SHELL_CMD);
|
printf("%s%s%s%s\r\n", indent, "-s,", indent, SHELL_CMD);
|
||||||
printf("%s%s%s%s\n", indent, "-t,", indent, SHELL_STARTUP);
|
printf("%s%s%s%s\r\n", indent, "-t,", indent, SHELL_STARTUP);
|
||||||
printf("%s%s%s%s\n", indent, "-u,", indent, SHELL_USER);
|
printf("%s%s%s%s\r\n", indent, "-u,", indent, SHELL_USER);
|
||||||
printf("%s%s%s%s\n", indent, "-w,", indent, SHELL_WIDTH);
|
printf("%s%s%s%s\r\n", indent, "-w,", indent, SHELL_WIDTH);
|
||||||
printf("%s%s%s%s\n", indent, "-V,", indent, SHELL_VERSION);
|
printf("%s%s%s%s\r\n", indent, "-V,", indent, SHELL_VERSION);
|
||||||
printf("\n\nReport bugs to %s.\n", SHELL_EMAIL);
|
printf("\r\n\r\nReport bugs to %s.\r\n", SHELL_EMAIL);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef LINUX
|
#ifdef LINUX
|
||||||
|
@ -196,23 +196,23 @@ int32_t shellParseArgsWithoutArgp(int argc, char *argv[]) {
|
||||||
char *key = argv[i];
|
char *key = argv[i];
|
||||||
int32_t keyLen = strlen(key);
|
int32_t keyLen = strlen(key);
|
||||||
if (keyLen != 2) {
|
if (keyLen != 2) {
|
||||||
fprintf(stderr, "invalid option %s\n", key);
|
fprintf(stderr, "invalid option %s\r\n", key);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (key[0] != '-') {
|
if (key[0] != '-') {
|
||||||
fprintf(stderr, "invalid option %s\n", key);
|
fprintf(stderr, "invalid option %s\r\n", key);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (key[1] == 'h' || key[1] == 'P' || key[1] == 'u' || key[1] == 'a' || key[1] == 'c' || key[1] == 's' ||
|
if (key[1] == 'h' || key[1] == 'P' || key[1] == 'u' || key[1] == 'a' || key[1] == 'c' || key[1] == 's' ||
|
||||||
key[1] == 'f' || key[1] == 'd' || key[1] == 'w' || key[1] == 'n' || key[1] == 'l' || key[1] == 'N') {
|
key[1] == 'f' || key[1] == 'd' || key[1] == 'w' || key[1] == 'n' || key[1] == 'l' || key[1] == 'N') {
|
||||||
if (i + 1 >= argc) {
|
if (i + 1 >= argc) {
|
||||||
fprintf(stderr, "option %s requires an argument\n", key);
|
fprintf(stderr, "option %s requires an argument\r\n", key);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
char *val = argv[i + 1];
|
char *val = argv[i + 1];
|
||||||
if (val[0] == '-') {
|
if (val[0] == '-') {
|
||||||
fprintf(stderr, "option %s requires an argument\n", key);
|
fprintf(stderr, "option %s requires an argument\r\n", key);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
shellParseSingleOpt(key[1], val);
|
shellParseSingleOpt(key[1], val);
|
||||||
|
@ -221,7 +221,7 @@ int32_t shellParseArgsWithoutArgp(int argc, char *argv[]) {
|
||||||
key[1] == 't' || key[1] == 'V' || key[1] == '?' || key[1] == 1) {
|
key[1] == 't' || key[1] == 'V' || key[1] == '?' || key[1] == 1) {
|
||||||
shellParseSingleOpt(key[1], NULL);
|
shellParseSingleOpt(key[1], NULL);
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "invalid option %s\n", key);
|
fprintf(stderr, "invalid option %s\r\n", key);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -241,7 +241,7 @@ static void shellInitArgs(int argc, char *argv[]) {
|
||||||
}
|
}
|
||||||
taosSetConsoleEcho(true);
|
taosSetConsoleEcho(true);
|
||||||
if (EOF == getchar()) {
|
if (EOF == getchar()) {
|
||||||
fprintf(stderr, "getchar() return EOF\n");
|
fprintf(stderr, "getchar() return EOF\r\n");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
tstrncpy(shell.args.password, (char *)(argv[i] + 2), sizeof(shell.args.password));
|
tstrncpy(shell.args.password, (char *)(argv[i] + 2), sizeof(shell.args.password));
|
||||||
|
@ -263,22 +263,22 @@ static void shellInitArgs(int argc, char *argv[]) {
|
||||||
static int32_t shellCheckArgs() {
|
static int32_t shellCheckArgs() {
|
||||||
SShellArgs *pArgs = &shell.args;
|
SShellArgs *pArgs = &shell.args;
|
||||||
if (pArgs->host != NULL && (strlen(pArgs->host) <= 0 || strlen(pArgs->host) > TSDB_FQDN_LEN)) {
|
if (pArgs->host != NULL && (strlen(pArgs->host) <= 0 || strlen(pArgs->host) > TSDB_FQDN_LEN)) {
|
||||||
printf("Invalid host:%s\n", pArgs->host);
|
printf("Invalid host:%s\r\n", pArgs->host);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pArgs->user != NULL && (strlen(pArgs->user) <= 0 || strlen(pArgs->user) > TSDB_USER_LEN)) {
|
if (pArgs->user != NULL && (strlen(pArgs->user) <= 0 || strlen(pArgs->user) > TSDB_USER_LEN)) {
|
||||||
printf("Invalid user:%s\n", pArgs->user);
|
printf("Invalid user:%s\r\n", pArgs->user);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pArgs->auth != NULL && (strlen(pArgs->auth) <= 0 || strlen(pArgs->auth) > TSDB_PASSWORD_LEN)) {
|
if (pArgs->auth != NULL && (strlen(pArgs->auth) <= 0 || strlen(pArgs->auth) > TSDB_PASSWORD_LEN)) {
|
||||||
printf("Invalid auth:%s\n", pArgs->auth);
|
printf("Invalid auth:%s\r\n", pArgs->auth);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pArgs->database != NULL && (strlen(pArgs->database) <= 0 || strlen(pArgs->database) > TSDB_DB_NAME_LEN)) {
|
if (pArgs->database != NULL && (strlen(pArgs->database) <= 0 || strlen(pArgs->database) > TSDB_DB_NAME_LEN)) {
|
||||||
printf("Invalid database:%s\n", pArgs->database);
|
printf("Invalid database:%s\r\n", pArgs->database);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -291,7 +291,7 @@ static int32_t shellCheckArgs() {
|
||||||
|
|
||||||
if (pArgs->cfgdir != NULL) {
|
if (pArgs->cfgdir != NULL) {
|
||||||
if (strlen(pArgs->cfgdir) <= 0 || strlen(pArgs->cfgdir) >= PATH_MAX) {
|
if (strlen(pArgs->cfgdir) <= 0 || strlen(pArgs->cfgdir) >= PATH_MAX) {
|
||||||
printf("Invalid cfgdir:%s\n", pArgs->cfgdir);
|
printf("Invalid cfgdir:%s\r\n", pArgs->cfgdir);
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
if (taosExpandDir(pArgs->cfgdir, configDir, PATH_MAX) != 0) {
|
if (taosExpandDir(pArgs->cfgdir, configDir, PATH_MAX) != 0) {
|
||||||
|
@ -301,37 +301,37 @@ static int32_t shellCheckArgs() {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pArgs->commands != NULL && (strlen(pArgs->commands) <= 0)) {
|
if (pArgs->commands != NULL && (strlen(pArgs->commands) <= 0)) {
|
||||||
printf("Invalid commands:%s\n", pArgs->commands);
|
printf("Invalid commands:%s\r\n", pArgs->commands);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pArgs->netrole != NULL && !(strcmp(pArgs->netrole, "client") == 0 || strcmp(pArgs->netrole, "server") == 0)) {
|
if (pArgs->netrole != NULL && !(strcmp(pArgs->netrole, "client") == 0 || strcmp(pArgs->netrole, "server") == 0)) {
|
||||||
printf("Invalid netrole:%s\n", pArgs->netrole);
|
printf("Invalid netrole:%s\r\n", pArgs->netrole);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pArgs->password != NULL && (strlen(pArgs->password) <= 0)) {
|
if (pArgs->password != NULL && (strlen(pArgs->password) <= 0)) {
|
||||||
printf("Invalid password\n");
|
printf("Invalid password\r\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pArgs->port < 0 || pArgs->port > 65535) {
|
if (pArgs->port < 0 || pArgs->port > 65535) {
|
||||||
printf("Invalid port\n");
|
printf("Invalid port\r\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pArgs->pktLen < SHELL_MIN_PKG_LEN || pArgs->pktLen > SHELL_MAX_PKG_LEN) {
|
if (pArgs->pktLen < SHELL_MIN_PKG_LEN || pArgs->pktLen > SHELL_MAX_PKG_LEN) {
|
||||||
printf("Invalid pktLen:%d, range:[%d, %d]\n", pArgs->pktLen, SHELL_MIN_PKG_LEN, SHELL_MAX_PKG_LEN);
|
printf("Invalid pktLen:%d, range:[%d, %d]\r\n", pArgs->pktLen, SHELL_MIN_PKG_LEN, SHELL_MAX_PKG_LEN);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pArgs->pktNum < SHELL_MIN_PKG_NUM || pArgs->pktNum > SHELL_MAX_PKG_NUM) {
|
if (pArgs->pktNum < SHELL_MIN_PKG_NUM || pArgs->pktNum > SHELL_MAX_PKG_NUM) {
|
||||||
printf("Invalid pktNum:%d, range:[%d, %d]\n", pArgs->pktNum, SHELL_MIN_PKG_NUM, SHELL_MAX_PKG_NUM);
|
printf("Invalid pktNum:%d, range:[%d, %d]\r\n", pArgs->pktNum, SHELL_MIN_PKG_NUM, SHELL_MAX_PKG_NUM);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pArgs->displayWidth <= 0 || pArgs->displayWidth > 10 * 1024) {
|
if (pArgs->displayWidth <= 0 || pArgs->displayWidth > 10 * 1024) {
|
||||||
printf("Invalid displayWidth:%d, range:[1, 10 * 1024]\n", pArgs->displayWidth);
|
printf("Invalid displayWidth:%d, range:[1, 10 * 1024]\r\n", pArgs->displayWidth);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -341,8 +341,8 @@ static int32_t shellCheckArgs() {
|
||||||
int32_t shellParseArgs(int32_t argc, char *argv[]) {
|
int32_t shellParseArgs(int32_t argc, char *argv[]) {
|
||||||
shellInitArgs(argc, argv);
|
shellInitArgs(argc, argv);
|
||||||
shell.info.clientVersion =
|
shell.info.clientVersion =
|
||||||
"Welcome to the TDengine shell from %s, Client Version:%s\n"
|
"Welcome to the TDengine shell from %s, Client Version:%s\r\n"
|
||||||
"Copyright (c) 2022 by TAOS Data, Inc. All rights reserved.\n\n";
|
"Copyright (c) 2022 by TAOS Data, Inc. All rights reserved.\r\n\r\n";
|
||||||
shell.info.promptHeader = TAOS_CONSOLE_PROMPT_HEADER;
|
shell.info.promptHeader = TAOS_CONSOLE_PROMPT_HEADER;
|
||||||
shell.info.promptContinue = TAOS_CONSOLE_PROMPT_CONTINUE;
|
shell.info.promptContinue = TAOS_CONSOLE_PROMPT_CONTINUE;
|
||||||
shell.info.promptSize = 6;
|
shell.info.promptSize = 6;
|
||||||
|
|
|
@ -314,7 +314,7 @@ void shellGetScreenSize(int32_t *ws_col, int32_t *ws_row) {
|
||||||
#else
|
#else
|
||||||
struct winsize w;
|
struct winsize w;
|
||||||
if (ioctl(0, TIOCGWINSZ, &w) < 0 || w.ws_col == 0 || w.ws_row == 0) {
|
if (ioctl(0, TIOCGWINSZ, &w) < 0 || w.ws_col == 0 || w.ws_row == 0) {
|
||||||
// fprintf(stderr, "No stream device, and use default value(col 120, row 30)\n");
|
// fprintf(stderr, "No stream device, and use default value(col 120, row 30)\r\n");
|
||||||
if (ws_col != NULL) *ws_col = 120;
|
if (ws_col != NULL) *ws_col = 120;
|
||||||
if (ws_row != NULL) *ws_row = 30;
|
if (ws_row != NULL) *ws_row = 30;
|
||||||
} else {
|
} else {
|
||||||
|
@ -473,7 +473,7 @@ int32_t shellReadCommand(char *command) {
|
||||||
shellPositionCursorHome(&cmd);
|
shellPositionCursorHome(&cmd);
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
printf("\n");
|
printf("\r\n");
|
||||||
shellResetCommand(&cmd, "");
|
shellResetCommand(&cmd, "");
|
||||||
#ifdef WINDOWS
|
#ifdef WINDOWS
|
||||||
raise(SIGINT);
|
raise(SIGINT);
|
||||||
|
@ -483,7 +483,7 @@ int32_t shellReadCommand(char *command) {
|
||||||
break;
|
break;
|
||||||
case 4: // EOF or Ctrl+D
|
case 4: // EOF or Ctrl+D
|
||||||
taosResetTerminalMode();
|
taosResetTerminalMode();
|
||||||
printf("\n");
|
printf("\r\n");
|
||||||
return -1;
|
return -1;
|
||||||
case 5: // ctrl E
|
case 5: // ctrl E
|
||||||
shellPositionCursorEnd(&cmd);
|
shellPositionCursorEnd(&cmd);
|
||||||
|
@ -495,7 +495,7 @@ int32_t shellReadCommand(char *command) {
|
||||||
case '\r':
|
case '\r':
|
||||||
#ifdef WINDOWS
|
#ifdef WINDOWS
|
||||||
#else
|
#else
|
||||||
printf("\n");
|
printf("\r\n");
|
||||||
#endif
|
#endif
|
||||||
if (shellIsReadyGo(&cmd)) {
|
if (shellIsReadyGo(&cmd)) {
|
||||||
sprintf(command, "%s%s", cmd.buffer, cmd.command);
|
sprintf(command, "%s%s", cmd.buffer, cmd.command);
|
||||||
|
|
|
@ -180,7 +180,7 @@ void shellRunSingleCommandImp(char *command) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (shellRegexMatch(command, "^\\s*use\\s+[a-zA-Z0-9_]+\\s*;\\s*$", REG_EXTENDED | REG_ICASE)) {
|
if (shellRegexMatch(command, "^\\s*use\\s+[a-zA-Z0-9_]+\\s*;\\s*$", REG_EXTENDED | REG_ICASE)) {
|
||||||
fprintf(stdout, "Database changed.\n\n");
|
fprintf(stdout, "Database changed.\r\n\r\n");
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
|
|
||||||
taos_free_result(pSql);
|
taos_free_result(pSql);
|
||||||
|
@ -197,19 +197,19 @@ void shellRunSingleCommandImp(char *command) {
|
||||||
|
|
||||||
et = taosGetTimestampUs();
|
et = taosGetTimestampUs();
|
||||||
if (error_no == 0) {
|
if (error_no == 0) {
|
||||||
printf("Query OK, %d rows affected (%.6fs)\n", numOfRows, (et - st) / 1E6);
|
printf("Query OK, %d rows affected (%.6fs)\r\n", numOfRows, (et - st) / 1E6);
|
||||||
} else {
|
} else {
|
||||||
printf("Query interrupted (%s), %d rows affected (%.6fs)\n", taos_errstr(pSql), numOfRows, (et - st) / 1E6);
|
printf("Query interrupted (%s), %d rows affected (%.6fs)\r\n", taos_errstr(pSql), numOfRows, (et - st) / 1E6);
|
||||||
}
|
}
|
||||||
taos_free_result(pSql);
|
taos_free_result(pSql);
|
||||||
} else {
|
} else {
|
||||||
int32_t num_rows_affacted = taos_affected_rows(pSql);
|
int32_t num_rows_affacted = taos_affected_rows(pSql);
|
||||||
taos_free_result(pSql);
|
taos_free_result(pSql);
|
||||||
et = taosGetTimestampUs();
|
et = taosGetTimestampUs();
|
||||||
printf("Query OK, %d of %d rows affected (%.6fs)\n", num_rows_affacted, num_rows_affacted, (et - st) / 1E6);
|
printf("Query OK, %d of %d rows affected (%.6fs)\r\n", num_rows_affacted, num_rows_affacted, (et - st) / 1E6);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("\n");
|
printf("\r\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
char *shellFormatTimestamp(char *buf, int64_t val, int32_t precision) {
|
char *shellFormatTimestamp(char *buf, int64_t val, int32_t precision) {
|
||||||
|
@ -344,7 +344,7 @@ int32_t shellDumpResultToFile(const char *fname, TAOS_RES *tres) {
|
||||||
|
|
||||||
TdFilePtr pFile = taosOpenFile(fullname, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_TRUNC | TD_FILE_STREAM);
|
TdFilePtr pFile = taosOpenFile(fullname, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_TRUNC | TD_FILE_STREAM);
|
||||||
if (pFile == NULL) {
|
if (pFile == NULL) {
|
||||||
fprintf(stderr, "failed to open file: %s\n", fullname);
|
fprintf(stderr, "failed to open file: %s\r\n", fullname);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -358,7 +358,7 @@ int32_t shellDumpResultToFile(const char *fname, TAOS_RES *tres) {
|
||||||
}
|
}
|
||||||
taosFprintfFile(pFile, "%s", fields[col].name);
|
taosFprintfFile(pFile, "%s", fields[col].name);
|
||||||
}
|
}
|
||||||
taosFprintfFile(pFile, "\n");
|
taosFprintfFile(pFile, "\r\n");
|
||||||
|
|
||||||
int32_t numOfRows = 0;
|
int32_t numOfRows = 0;
|
||||||
do {
|
do {
|
||||||
|
@ -369,7 +369,7 @@ int32_t shellDumpResultToFile(const char *fname, TAOS_RES *tres) {
|
||||||
}
|
}
|
||||||
shellDumpFieldToFile(pFile, (const char *)row[i], fields + i, length[i], precision);
|
shellDumpFieldToFile(pFile, (const char *)row[i], fields + i, length[i], precision);
|
||||||
}
|
}
|
||||||
taosFprintfFile(pFile, "\n");
|
taosFprintfFile(pFile, "\r\n");
|
||||||
|
|
||||||
numOfRows++;
|
numOfRows++;
|
||||||
row = taos_fetch_row(tres);
|
row = taos_fetch_row(tres);
|
||||||
|
@ -559,7 +559,7 @@ int32_t shellVerticalPrintResult(TAOS_RES *tres, const char *sql) {
|
||||||
int32_t showMore = 1;
|
int32_t showMore = 1;
|
||||||
do {
|
do {
|
||||||
if (numOfRows < resShowMaxNum) {
|
if (numOfRows < resShowMaxNum) {
|
||||||
printf("*************************** %d.row ***************************\n", numOfRows + 1);
|
printf("*************************** %d.row ***************************\r\n", numOfRows + 1);
|
||||||
|
|
||||||
int32_t *length = taos_fetch_lengths(tres);
|
int32_t *length = taos_fetch_lengths(tres);
|
||||||
|
|
||||||
|
@ -570,16 +570,17 @@ int32_t shellVerticalPrintResult(TAOS_RES *tres, const char *sql) {
|
||||||
printf("%*.s%s: ", padding, " ", field->name);
|
printf("%*.s%s: ", padding, " ", field->name);
|
||||||
|
|
||||||
shellPrintField((const char *)row[i], field, 0, length[i], precision);
|
shellPrintField((const char *)row[i], field, 0, length[i], precision);
|
||||||
|
putchar('\r');
|
||||||
putchar('\n');
|
putchar('\n');
|
||||||
}
|
}
|
||||||
} else if (showMore) {
|
} else if (showMore) {
|
||||||
printf("\n");
|
printf("\r\n");
|
||||||
printf(" Notice: The result shows only the first %d rows.\n", SHELL_DEFAULT_RES_SHOW_NUM);
|
printf(" Notice: The result shows only the first %d rows.\r\n", SHELL_DEFAULT_RES_SHOW_NUM);
|
||||||
printf(" You can use the `LIMIT` clause to get fewer result to show.\n");
|
printf(" You can use the `LIMIT` clause to get fewer result to show.\r\n");
|
||||||
printf(" Or use '>>' to redirect the whole set of the result to a specified file.\n");
|
printf(" Or use '>>' to redirect the whole set of the result to a specified file.\r\n");
|
||||||
printf("\n");
|
printf("\r\n");
|
||||||
printf(" You can use Ctrl+C to stop the underway fetching.\n");
|
printf(" You can use Ctrl+C to stop the underway fetching.\r\n");
|
||||||
printf("\n");
|
printf("\r\n");
|
||||||
showMore = 0;
|
showMore = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -667,10 +668,12 @@ void shellPrintHeader(TAOS_FIELD *fields, int32_t *width, int32_t num_fields) {
|
||||||
rowWidth += width[col] + 3;
|
rowWidth += width[col] + 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
putchar('\r');
|
||||||
putchar('\n');
|
putchar('\n');
|
||||||
for (int32_t i = 0; i < rowWidth; i++) {
|
for (int32_t i = 0; i < rowWidth; i++) {
|
||||||
putchar('=');
|
putchar('=');
|
||||||
}
|
}
|
||||||
|
putchar('\r');
|
||||||
putchar('\n');
|
putchar('\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -709,15 +712,16 @@ int32_t shellHorizontalPrintResult(TAOS_RES *tres, const char *sql) {
|
||||||
putchar(' ');
|
putchar(' ');
|
||||||
putchar('|');
|
putchar('|');
|
||||||
}
|
}
|
||||||
|
putchar('\r');
|
||||||
putchar('\n');
|
putchar('\n');
|
||||||
} else if (showMore) {
|
} else if (showMore) {
|
||||||
printf("\n");
|
printf("\r\n");
|
||||||
printf(" Notice: The result shows only the first %d rows.\n", SHELL_DEFAULT_RES_SHOW_NUM);
|
printf(" Notice: The result shows only the first %d rows.\r\n", SHELL_DEFAULT_RES_SHOW_NUM);
|
||||||
printf(" You can use the `LIMIT` clause to get fewer result to show.\n");
|
printf(" You can use the `LIMIT` clause to get fewer result to show.\r\n");
|
||||||
printf(" Or use '>>' to redirect the whole set of the result to a specified file.\n");
|
printf(" Or use '>>' to redirect the whole set of the result to a specified file.\r\n");
|
||||||
printf("\n");
|
printf("\r\n");
|
||||||
printf(" You can use Ctrl+C to stop the underway fetching.\n");
|
printf(" You can use Ctrl+C to stop the underway fetching.\r\n");
|
||||||
printf("\n");
|
printf("\r\n");
|
||||||
showMore = 0;
|
showMore = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -794,7 +798,7 @@ void shellCleanupHistory() {
|
||||||
|
|
||||||
void shellPrintError(TAOS_RES *tres, int64_t st) {
|
void shellPrintError(TAOS_RES *tres, int64_t st) {
|
||||||
int64_t et = taosGetTimestampUs();
|
int64_t et = taosGetTimestampUs();
|
||||||
fprintf(stderr, "\nDB error: %s (%.6fs)\n", taos_errstr(tres), (et - st) / 1E6);
|
fprintf(stderr, "\r\nDB error: %s (%.6fs)\r\n", taos_errstr(tres), (et - st) / 1E6);
|
||||||
taos_free_result(tres);
|
taos_free_result(tres);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -816,7 +820,7 @@ void shellSourceFile(const char *file) {
|
||||||
|
|
||||||
TdFilePtr pFile = taosOpenFile(fullname, TD_FILE_READ | TD_FILE_STREAM);
|
TdFilePtr pFile = taosOpenFile(fullname, TD_FILE_READ | TD_FILE_STREAM);
|
||||||
if (pFile == NULL) {
|
if (pFile == NULL) {
|
||||||
fprintf(stderr, "failed to open file %s\n", fullname);
|
fprintf(stderr, "failed to open file %s\r\n", fullname);
|
||||||
taosMemoryFree(cmd);
|
taosMemoryFree(cmd);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -837,7 +841,7 @@ void shellSourceFile(const char *file) {
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(cmd + cmd_len, line, read_len);
|
memcpy(cmd + cmd_len, line, read_len);
|
||||||
printf("%s%s\n", shell.info.promptHeader, cmd);
|
printf("%s%s\r\n", shell.info.promptHeader, cmd);
|
||||||
shellRunCommand(cmd);
|
shellRunCommand(cmd);
|
||||||
memset(cmd, 0, TSDB_MAX_ALLOWED_SQL_LEN);
|
memset(cmd, 0, TSDB_MAX_ALLOWED_SQL_LEN);
|
||||||
cmd_len = 0;
|
cmd_len = 0;
|
||||||
|
@ -851,7 +855,7 @@ void shellSourceFile(const char *file) {
|
||||||
void shellGetGrantInfo() {
|
void shellGetGrantInfo() {
|
||||||
char sinfo[1024] = {0};
|
char sinfo[1024] = {0};
|
||||||
tstrncpy(sinfo, taos_get_server_info(shell.conn), sizeof(sinfo));
|
tstrncpy(sinfo, taos_get_server_info(shell.conn), sizeof(sinfo));
|
||||||
strtok(sinfo, "\n");
|
strtok(sinfo, "\r\n");
|
||||||
|
|
||||||
char sql[] = "show grants";
|
char sql[] = "show grants";
|
||||||
|
|
||||||
|
@ -860,25 +864,25 @@ void shellGetGrantInfo() {
|
||||||
int32_t code = taos_errno(tres);
|
int32_t code = taos_errno(tres);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
if (code != TSDB_CODE_OPS_NOT_SUPPORT && code != TSDB_CODE_MND_NO_RIGHTS) {
|
if (code != TSDB_CODE_OPS_NOT_SUPPORT && code != TSDB_CODE_MND_NO_RIGHTS) {
|
||||||
fprintf(stderr, "Failed to check Server Edition, Reason:0x%04x:%s\n\n", code, taos_errstr(tres));
|
fprintf(stderr, "Failed to check Server Edition, Reason:0x%04x:%s\r\n\r\n", code, taos_errstr(tres));
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t num_fields = taos_field_count(tres);
|
int32_t num_fields = taos_field_count(tres);
|
||||||
if (num_fields == 0) {
|
if (num_fields == 0) {
|
||||||
fprintf(stderr, "\nInvalid grant information.\n");
|
fprintf(stderr, "\r\nInvalid grant information.\r\n");
|
||||||
exit(0);
|
exit(0);
|
||||||
} else {
|
} else {
|
||||||
if (tres == NULL) {
|
if (tres == NULL) {
|
||||||
fprintf(stderr, "\nGrant information is null.\n");
|
fprintf(stderr, "\r\nGrant information is null.\r\n");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
TAOS_FIELD *fields = taos_fetch_fields(tres);
|
TAOS_FIELD *fields = taos_fetch_fields(tres);
|
||||||
TAOS_ROW row = taos_fetch_row(tres);
|
TAOS_ROW row = taos_fetch_row(tres);
|
||||||
if (row == NULL) {
|
if (row == NULL) {
|
||||||
fprintf(stderr, "\nFailed to get grant information from server. Abort.\n");
|
fprintf(stderr, "\r\nFailed to get grant information from server. Abort.\r\n");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -891,17 +895,17 @@ void shellGetGrantInfo() {
|
||||||
memcpy(expired, row[2], fields[2].bytes);
|
memcpy(expired, row[2], fields[2].bytes);
|
||||||
|
|
||||||
if (strcmp(serverVersion, "community") == 0) {
|
if (strcmp(serverVersion, "community") == 0) {
|
||||||
fprintf(stdout, "Server is Community Edition.\n");
|
fprintf(stdout, "Server is Community Edition.\r\n");
|
||||||
} else if (strcmp(expiretime, "unlimited") == 0) {
|
} else if (strcmp(expiretime, "unlimited") == 0) {
|
||||||
fprintf(stdout, "Server is Enterprise %s Edition, %s and will never expire.\n", serverVersion, sinfo);
|
fprintf(stdout, "Server is Enterprise %s Edition, %s and will never expire.\r\n", serverVersion, sinfo);
|
||||||
} else {
|
} else {
|
||||||
fprintf(stdout, "Server is Enterprise %s Edition, %s and will expire at %s.\n", serverVersion, sinfo, expiretime);
|
fprintf(stdout, "Server is Enterprise %s Edition, %s and will expire at %s.\r\n", serverVersion, sinfo, expiretime);
|
||||||
}
|
}
|
||||||
|
|
||||||
taos_free_result(tres);
|
taos_free_result(tres);
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(stdout, "\n");
|
fprintf(stdout, "\r\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void shellQueryInterruptHandler(int32_t signum, void *sigInfo, void *context) { tsem_post(&shell.cancelSem); }
|
void shellQueryInterruptHandler(int32_t signum, void *sigInfo, void *context) { tsem_post(&shell.cancelSem); }
|
||||||
|
@ -921,7 +925,7 @@ void *shellCancelHandler(void *arg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
taosResetTerminalMode();
|
taosResetTerminalMode();
|
||||||
printf("\nReceive SIGTERM or other signal, quit shell.\n");
|
printf("\r\nReceive SIGTERM or other signal, quit shell.\r\n");
|
||||||
shellWriteHistory();
|
shellWriteHistory();
|
||||||
shellExit();
|
shellExit();
|
||||||
}
|
}
|
||||||
|
@ -936,7 +940,7 @@ void *shellThreadLoop(void *arg) {
|
||||||
|
|
||||||
char *command = taosMemoryMalloc(SHELL_MAX_COMMAND_SIZE);
|
char *command = taosMemoryMalloc(SHELL_MAX_COMMAND_SIZE);
|
||||||
if (command == NULL) {
|
if (command == NULL) {
|
||||||
printf("failed to malloc command\n");
|
printf("failed to malloc command\r\n");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -979,7 +983,7 @@ int32_t shellExecute() {
|
||||||
|
|
||||||
if (pArgs->commands != NULL || pArgs->file[0] != 0) {
|
if (pArgs->commands != NULL || pArgs->file[0] != 0) {
|
||||||
if (pArgs->commands != NULL) {
|
if (pArgs->commands != NULL) {
|
||||||
printf("%s%s\n", shell.info.promptHeader, pArgs->commands);
|
printf("%s%s\r\n", shell.info.promptHeader, pArgs->commands);
|
||||||
char *cmd = strdup(pArgs->commands);
|
char *cmd = strdup(pArgs->commands);
|
||||||
shellRunCommand(cmd);
|
shellRunCommand(cmd);
|
||||||
taosMemoryFree(cmd);
|
taosMemoryFree(cmd);
|
||||||
|
@ -996,7 +1000,7 @@ int32_t shellExecute() {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tsem_init(&shell.cancelSem, 0, 0) != 0) {
|
if (tsem_init(&shell.cancelSem, 0, 0) != 0) {
|
||||||
printf("failed to create cancel semphore\n");
|
printf("failed to create cancel semphore\r\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,7 @@ static void shellWorkAsClient() {
|
||||||
|
|
||||||
clientRpc = rpcOpen(&rpcInit);
|
clientRpc = rpcOpen(&rpcInit);
|
||||||
if (clientRpc == NULL) {
|
if (clientRpc == NULL) {
|
||||||
printf("failed to init net test client since %s\n", terrstr());
|
printf("failed to init net test client since %s\r\n", terrstr());
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,7 +49,7 @@ static void shellWorkAsClient() {
|
||||||
pArgs->port = tsServerPort;
|
pArgs->port = tsServerPort;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("network test client is initialized, the server is %s:%u\n", fqdn, pArgs->port);
|
printf("network test client is initialized, the server is %s:%u\r\n", fqdn, pArgs->port);
|
||||||
|
|
||||||
tstrncpy(epSet.eps[0].fqdn, fqdn, TSDB_FQDN_LEN);
|
tstrncpy(epSet.eps[0].fqdn, fqdn, TSDB_FQDN_LEN);
|
||||||
epSet.eps[0].port = (uint16_t)pArgs->port;
|
epSet.eps[0].port = (uint16_t)pArgs->port;
|
||||||
|
@ -62,13 +62,13 @@ static void shellWorkAsClient() {
|
||||||
rpcMsg.pCont = rpcMallocCont(pArgs->pktLen);
|
rpcMsg.pCont = rpcMallocCont(pArgs->pktLen);
|
||||||
rpcMsg.contLen = pArgs->pktLen;
|
rpcMsg.contLen = pArgs->pktLen;
|
||||||
|
|
||||||
printf("request is sent, size:%d\n", rpcMsg.contLen);
|
printf("request is sent, size:%d\r\n", rpcMsg.contLen);
|
||||||
rpcSendRecv(clientRpc, &epSet, &rpcMsg, &rpcRsp);
|
rpcSendRecv(clientRpc, &epSet, &rpcMsg, &rpcRsp);
|
||||||
if (rpcRsp.code == 0 && rpcRsp.contLen == rpcMsg.contLen) {
|
if (rpcRsp.code == 0 && rpcRsp.contLen == rpcMsg.contLen) {
|
||||||
printf("response is received, size:%d\n", rpcMsg.contLen);
|
printf("response is received, size:%d\r\n", rpcMsg.contLen);
|
||||||
if (rpcRsp.code == 0) totalSucc++;
|
if (rpcRsp.code == 0) totalSucc++;
|
||||||
} else {
|
} else {
|
||||||
printf("response not received since %s\n", tstrerror(rpcRsp.code));
|
printf("response not received since %s\r\n", tstrerror(rpcRsp.code));
|
||||||
}
|
}
|
||||||
|
|
||||||
rpcFreeCont(rpcRsp.pCont);
|
rpcFreeCont(rpcRsp.pCont);
|
||||||
|
@ -78,7 +78,7 @@ static void shellWorkAsClient() {
|
||||||
uint64_t endTime = taosGetTimestampUs();
|
uint64_t endTime = taosGetTimestampUs();
|
||||||
uint64_t elT = endTime - startTime;
|
uint64_t elT = endTime - startTime;
|
||||||
|
|
||||||
printf("\ntotal succ:%5d/%d\tcost:%8.2lf ms\tspeed:%8.2lf MB/s\n", totalSucc, pArgs->pktNum, elT / 1000.0,
|
printf("\r\ntotal succ:%5d/%d\tcost:%8.2lf ms\tspeed:%8.2lf MB/s\r\n", totalSucc, pArgs->pktNum, elT / 1000.0,
|
||||||
pArgs->pktLen / (elT / 1000000.0) / 1024.0 / 1024.0 * totalSucc);
|
pArgs->pktLen / (elT / 1000000.0) / 1024.0 / 1024.0 * totalSucc);
|
||||||
|
|
||||||
_OVER:
|
_OVER:
|
||||||
|
@ -91,7 +91,7 @@ _OVER:
|
||||||
}
|
}
|
||||||
|
|
||||||
static void shellProcessMsg(void *p, SRpcMsg *pRpc, SEpSet *pEpSet) {
|
static void shellProcessMsg(void *p, SRpcMsg *pRpc, SEpSet *pEpSet) {
|
||||||
printf("request is received, size:%d\n", pRpc->contLen);
|
printf("request is received, size:%d\r\n", pRpc->contLen);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
SRpcMsg rsp = {.info = pRpc->info, .code = 0};
|
SRpcMsg rsp = {.info = pRpc->info, .code = 0};
|
||||||
rsp.pCont = rpcMallocCont(pRpc->contLen);
|
rsp.pCont = rpcMallocCont(pRpc->contLen);
|
||||||
|
@ -124,9 +124,9 @@ static void shellWorkAsServer() {
|
||||||
|
|
||||||
void *serverRpc = rpcOpen(&rpcInit);
|
void *serverRpc = rpcOpen(&rpcInit);
|
||||||
if (serverRpc == NULL) {
|
if (serverRpc == NULL) {
|
||||||
printf("failed to init net test server since %s\n", terrstr());
|
printf("failed to init net test server since %s\r\n", terrstr());
|
||||||
} else {
|
} else {
|
||||||
printf("network test server is initialized, port:%u\n", pArgs->port);
|
printf("network test server is initialized, port:%u\r\n", pArgs->port);
|
||||||
taosSetSignal(SIGTERM, shellNettestHandler);
|
taosSetSignal(SIGTERM, shellNettestHandler);
|
||||||
while (1) taosMsleep(10);
|
while (1) taosMsleep(10);
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,7 +40,7 @@ bool shellRegexMatch(const char *s, const char *reg, int32_t cflags) {
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
regerror(reti, ®ex, msgbuf, sizeof(msgbuf));
|
regerror(reti, ®ex, msgbuf, sizeof(msgbuf));
|
||||||
fprintf(stderr, "Regex match failed: %s\n", msgbuf);
|
fprintf(stderr, "Regex match failed: %s\r\n", msgbuf);
|
||||||
regfree(®ex);
|
regfree(®ex);
|
||||||
shellExit();
|
shellExit();
|
||||||
}
|
}
|
||||||
|
@ -68,19 +68,19 @@ int32_t shellCheckIntSize() {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void shellPrintVersion() { printf("version: %s\n", version); }
|
void shellPrintVersion() { printf("version: %s\r\n", version); }
|
||||||
|
|
||||||
void shellGenerateAuth() {
|
void shellGenerateAuth() {
|
||||||
char secretEncrypt[TSDB_PASSWORD_LEN + 1] = {0};
|
char secretEncrypt[TSDB_PASSWORD_LEN + 1] = {0};
|
||||||
taosEncryptPass_c((uint8_t *)shell.args.password, strlen(shell.args.password), secretEncrypt);
|
taosEncryptPass_c((uint8_t *)shell.args.password, strlen(shell.args.password), secretEncrypt);
|
||||||
printf("%s\n", secretEncrypt);
|
printf("%s\r\n", secretEncrypt);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
|
|
||||||
void shellDumpConfig() {
|
void shellDumpConfig() {
|
||||||
SConfig *pCfg = taosGetCfg();
|
SConfig *pCfg = taosGetCfg();
|
||||||
if (pCfg == NULL) {
|
if (pCfg == NULL) {
|
||||||
printf("TDengine read global config failed!\n");
|
printf("TDengine read global config failed!\r\n");
|
||||||
} else {
|
} else {
|
||||||
cfgDumpCfg(pCfg, 1, true);
|
cfgDumpCfg(pCfg, 1, true);
|
||||||
}
|
}
|
||||||
|
@ -95,23 +95,23 @@ void shellCheckServerStatus() {
|
||||||
code = taos_check_server_status(shell.args.host, shell.args.port, details, 1024);
|
code = taos_check_server_status(shell.args.host, shell.args.port, details, 1024);
|
||||||
switch (code) {
|
switch (code) {
|
||||||
case TSDB_SRV_STATUS_UNAVAILABLE:
|
case TSDB_SRV_STATUS_UNAVAILABLE:
|
||||||
printf("0: unavailable\n");
|
printf("0: unavailable\r\n");
|
||||||
break;
|
break;
|
||||||
case TSDB_SRV_STATUS_NETWORK_OK:
|
case TSDB_SRV_STATUS_NETWORK_OK:
|
||||||
printf("1: network ok\n");
|
printf("1: network ok\r\n");
|
||||||
break;
|
break;
|
||||||
case TSDB_SRV_STATUS_SERVICE_OK:
|
case TSDB_SRV_STATUS_SERVICE_OK:
|
||||||
printf("2: service ok\n");
|
printf("2: service ok\r\n");
|
||||||
break;
|
break;
|
||||||
case TSDB_SRV_STATUS_SERVICE_DEGRADED:
|
case TSDB_SRV_STATUS_SERVICE_DEGRADED:
|
||||||
printf("3: service degraded\n");
|
printf("3: service degraded\r\n");
|
||||||
break;
|
break;
|
||||||
case TSDB_SRV_STATUS_EXTING:
|
case TSDB_SRV_STATUS_EXTING:
|
||||||
printf("4: exiting\n");
|
printf("4: exiting\r\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (strlen(details) != 0) {
|
if (strlen(details) != 0) {
|
||||||
printf("%s\n\n", details);
|
printf("%s\r\n\r\n", details);
|
||||||
}
|
}
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
if (code == TSDB_SRV_STATUS_NETWORK_OK && shell.args.is_startup) {
|
if (code == TSDB_SRV_STATUS_NETWORK_OK && shell.args.is_startup) {
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit 1163c0f60aa65d6cc58283247c8bf8c56ba43b92
|
Subproject commit 50b68d85f7cbaf7a9adfa4082e88ca758770f75e
|
Loading…
Reference in New Issue