diff --git a/cmake/cmake.version b/cmake/cmake.version
index 03598519ed..5c5abe79bb 100644
--- a/cmake/cmake.version
+++ b/cmake/cmake.version
@@ -2,7 +2,7 @@
IF (DEFINED VERNUMBER)
SET(TD_VER_NUMBER ${VERNUMBER})
ELSE ()
- SET(TD_VER_NUMBER "3.0.1.6")
+ SET(TD_VER_NUMBER "3.0.1.7")
ENDIF ()
IF (DEFINED VERCOMPATIBLE)
diff --git a/docs/en/28-releases/01-tdengine.md b/docs/en/28-releases/01-tdengine.md
index eee2f94ee1..8bfdf72cc7 100644
--- a/docs/en/28-releases/01-tdengine.md
+++ b/docs/en/28-releases/01-tdengine.md
@@ -10,6 +10,10 @@ For TDengine 2.x installation packages by version, please visit [here](https://w
import Release from "/components/ReleaseV3";
+## 3.0.1.7
+
+
+
## 3.0.1.6
diff --git a/docs/en/28-releases/02-tools.md b/docs/en/28-releases/02-tools.md
index 6e8a040f8b..2bc22a4450 100644
--- a/docs/en/28-releases/02-tools.md
+++ b/docs/en/28-releases/02-tools.md
@@ -10,6 +10,10 @@ For other historical version installers, please visit [here](https://www.taosdat
import Release from "/components/ReleaseV3";
+## 2.2.9
+
+
+
## 2.2.7
diff --git a/docs/examples/rust/nativeexample/Cargo.toml b/docs/examples/rust/nativeexample/Cargo.toml
index cdf739d357..5ecc407854 100644
--- a/docs/examples/rust/nativeexample/Cargo.toml
+++ b/docs/examples/rust/nativeexample/Cargo.toml
@@ -10,4 +10,4 @@ chrono = "0.4"
serde = { version = "1", features = ["derive"] }
tokio = { version = "1", features = ["rt", "macros", "rt-multi-thread"] }
-taos = { version = "0.*" }
+taos = { version = "0.4.8" }
diff --git a/docs/examples/rust/nativeexample/examples/stmt_example.rs b/docs/examples/rust/nativeexample/examples/stmt_example.rs
index 9cf8e8e1fc..7d5a7c0f2b 100644
--- a/docs/examples/rust/nativeexample/examples/stmt_example.rs
+++ b/docs/examples/rust/nativeexample/examples/stmt_example.rs
@@ -12,7 +12,10 @@ async fn main() -> anyhow::Result<()> {
// bind table name and tags
stmt.set_tbname_tags(
"d1001",
- &[Value::VarChar("California.SanFransico".into()), Value::Int(2)],
+ &[
+ Value::VarChar("California.SanFransico".into()),
+ Value::Int(2),
+ ],
)?;
// bind values.
let values = vec![
@@ -30,9 +33,9 @@ async fn main() -> anyhow::Result<()> {
ColumnView::from_floats(vec![0.33]),
];
stmt.bind(&values2)?;
-
+
stmt.add_batch()?;
-
+
// execute.
let rows = stmt.execute()?;
assert_eq!(rows, 2);
diff --git a/docs/examples/rust/nativeexample/examples/subscribe_demo.rs b/docs/examples/rust/nativeexample/examples/subscribe_demo.rs
index 11d6d4e004..7551ad46b1 100644
--- a/docs/examples/rust/nativeexample/examples/subscribe_demo.rs
+++ b/docs/examples/rust/nativeexample/examples/subscribe_demo.rs
@@ -50,7 +50,7 @@ async fn main() -> anyhow::Result<()> {
// create super table
format!("CREATE TABLE `meters` (`ts` TIMESTAMP, `current` FLOAT, `voltage` INT, `phase` FLOAT) TAGS (`groupid` INT, `location` BINARY(24))"),
// create topic for subscription
- format!("CREATE TOPIC tmq_meters with META AS DATABASE {db}")
+ format!("CREATE TOPIC tmq_meters AS SELECT * FROM `meters`")
])
.await?;
@@ -64,13 +64,9 @@ async fn main() -> anyhow::Result<()> {
let mut consumer = tmq.build()?;
consumer.subscribe(["tmq_meters"]).await?;
- {
- let mut stream = consumer.stream();
-
- while let Some((offset, message)) = stream.try_next().await? {
- // get information from offset
-
- // the topic
+ consumer
+ .stream()
+ .try_for_each(|(offset, message)| async {
let topic = offset.topic();
// the vgroup id, like partition id in kafka.
let vgroup_id = offset.vgroup_id();
@@ -78,20 +74,14 @@ async fn main() -> anyhow::Result<()> {
if let Some(data) = message.into_data() {
while let Some(block) = data.fetch_raw_block().await? {
- // one block for one table, get table name if needed
- let name = block.table_name();
let records: Vec = block.deserialize().try_collect()?;
- println!(
- "** table: {}, got {} records: {:#?}\n",
- name.unwrap(),
- records.len(),
- records
- );
+ println!("** read {} records: {:#?}\n", records.len(), records);
}
}
consumer.commit(offset).await?;
- }
- }
+ Ok(())
+ })
+ .await?;
consumer.unsubscribe().await;
diff --git a/docs/examples/rust/restexample/examples/insert_example.rs b/docs/examples/rust/restexample/examples/insert_example.rs
index 11a84f1661..4953a09b35 100644
--- a/docs/examples/rust/restexample/examples/insert_example.rs
+++ b/docs/examples/rust/restexample/examples/insert_example.rs
@@ -5,7 +5,6 @@ async fn main() -> anyhow::Result<()> {
let dsn = "ws://";
let taos = TaosBuilder::from_dsn(dsn)?.build()?;
-
taos.exec_many([
"DROP DATABASE IF EXISTS power",
"CREATE DATABASE power",
diff --git a/docs/zh/28-releases/01-tdengine.md b/docs/zh/28-releases/01-tdengine.md
index 4108212c55..fd2be899eb 100644
--- a/docs/zh/28-releases/01-tdengine.md
+++ b/docs/zh/28-releases/01-tdengine.md
@@ -10,6 +10,10 @@ TDengine 2.x 各版本安装包请访问[这里](https://www.taosdata.com/all-do
import Release from "/components/ReleaseV3";
+## 3.0.1.7
+
+
+
## 3.0.1.6
diff --git a/docs/zh/28-releases/02-tools.md b/docs/zh/28-releases/02-tools.md
index 28e0d4bca9..3f73b53fab 100644
--- a/docs/zh/28-releases/02-tools.md
+++ b/docs/zh/28-releases/02-tools.md
@@ -10,6 +10,10 @@ taosTools 各版本安装包下载链接如下:
import Release from "/components/ReleaseV3";
+## 2.2.9
+
+
+
## 2.2.7
diff --git a/include/common/tmsg.h b/include/common/tmsg.h
index afe54bce0b..556c4a9a1f 100644
--- a/include/common/tmsg.h
+++ b/include/common/tmsg.h
@@ -3169,8 +3169,7 @@ typedef struct {
typedef struct {
SMsgHead header;
- int32_t msgNum;
- SBatchMsg msg[];
+ SArray* pMsgs; //SArray
} SBatchReq;
typedef struct {
@@ -3179,17 +3178,40 @@ typedef struct {
int32_t msgLen;
int32_t rspCode;
void* msg;
+} SBatchRspMsg;
+
+typedef struct {
+ SArray* pRsps; //SArray
} SBatchRsp;
-static FORCE_INLINE void tFreeSBatchRsp(void* p) {
+int32_t tSerializeSBatchReq(void *buf, int32_t bufLen, SBatchReq *pReq);
+int32_t tDeserializeSBatchReq(void *buf, int32_t bufLen, SBatchReq *pReq);
+static FORCE_INLINE void tFreeSBatchReqMsg(void* msg) {
+ if (NULL == msg) {
+ return;
+ }
+ SBatchMsg* pMsg = (SBatchMsg*)msg;
+ taosMemoryFree(pMsg->msg);
+}
+
+int32_t tSerializeSBatchRsp(void *buf, int32_t bufLen, SBatchRsp *pRsp);
+int32_t tDeserializeSBatchRsp(void *buf, int32_t bufLen, SBatchRsp *pRsp);
+
+static FORCE_INLINE void tFreeSBatchRspMsg(void* p) {
if (NULL == p) {
return;
}
- SBatchRsp* pRsp = (SBatchRsp*)p;
+ SBatchRspMsg* pRsp = (SBatchRspMsg*)p;
taosMemoryFree(pRsp->msg);
}
+int32_t tSerializeSMqAskEpReq(void *buf, int32_t bufLen, SMqAskEpReq *pReq);
+int32_t tDeserializeSMqAskEpReq(void *buf, int32_t bufLen, SMqAskEpReq *pReq);
+int32_t tSerializeSMqHbReq(void *buf, int32_t bufLen, SMqHbReq *pReq);
+int32_t tDeserializeSMqHbReq(void *buf, int32_t bufLen, SMqHbReq *pReq);
+
+
#pragma pack(pop)
#ifdef __cplusplus
diff --git a/include/common/tvariant.h b/include/common/tvariant.h
index 0507934e6a..130945cce5 100644
--- a/include/common/tvariant.h
+++ b/include/common/tvariant.h
@@ -30,6 +30,7 @@ typedef struct SVariant {
int64_t i;
uint64_t u;
double d;
+ float f;
char *pz;
TdUcs4 *ucs4;
SArray *arr; // only for 'in' query to hold value list, not value for a field
@@ -47,7 +48,7 @@ void taosVariantAssign(SVariant *pDst, const SVariant *pSrc);
int32_t taosVariantCompare(const SVariant *p1, const SVariant *p2);
-char *taosVariantGet(SVariant *pVar, int32_t type);
+char *taosVariantGet(SVariant *pVar, int32_t type);
#ifdef __cplusplus
}
diff --git a/include/libs/nodes/querynodes.h b/include/libs/nodes/querynodes.h
index d0971b013f..5291130e4f 100644
--- a/include/libs/nodes/querynodes.h
+++ b/include/libs/nodes/querynodes.h
@@ -351,7 +351,7 @@ typedef struct SVgDataBlocks {
SVgroupInfo vg;
int32_t numOfTables; // number of tables in current submit block
uint32_t size;
- void* pData; // SMsgDesc + SSubmitReq + SSubmitBlk + ...
+ void* pData; // SSubmitReq + SSubmitBlk + ...
} SVgDataBlocks;
typedef void (*FFreeDataBlockHash)(SHashObj*);
diff --git a/include/libs/stream/streamState.h b/include/libs/stream/streamState.h
index 9443df5e14..7234d306a4 100644
--- a/include/libs/stream/streamState.h
+++ b/include/libs/stream/streamState.h
@@ -35,6 +35,7 @@ typedef struct {
TTB* pFuncStateDb;
TTB* pFillStateDb; // todo refactor
TTB* pSessionStateDb;
+ TTB* pParNameDb;
TXN txn;
int32_t number;
} SStreamState;
@@ -99,6 +100,9 @@ int32_t streamStateSeekLast(SStreamState* pState, SStreamStateCur* pCur);
int32_t streamStateCurNext(SStreamState* pState, SStreamStateCur* pCur);
int32_t streamStateCurPrev(SStreamState* pState, SStreamStateCur* pCur);
+int32_t streamStatePutParName(SStreamState* pState, int64_t groupId, const char* tbname);
+int32_t streamStateGetParName(SStreamState* pState, int64_t groupId, void** pVal);
+
#if 0
char* streamStateSessionDump(SStreamState* pState);
#endif
diff --git a/include/util/tdef.h b/include/util/tdef.h
index 556ad6b680..48dedd3e3e 100644
--- a/include/util/tdef.h
+++ b/include/util/tdef.h
@@ -489,6 +489,9 @@ enum {
#define MAX_META_MSG_IN_BATCH 1048576
#define MAX_META_BATCH_RSP_SIZE (1 * 1048576 * 1024)
+// sort page size by default
+#define DEFAULT_PAGESIZE 4096
+
#ifdef __cplusplus
}
#endif
diff --git a/packaging/cfg/taos.cfg b/packaging/cfg/taos.cfg
index eeb089d1ab..e22aa85c97 100644
--- a/packaging/cfg/taos.cfg
+++ b/packaging/cfg/taos.cfg
@@ -73,10 +73,10 @@
# compressColData -1
# system time zone
-# timezone Asia/Shanghai (CST, +0800)
+# timezone UTC-8
# system time zone (for windows 10)
-# timezone UTC-8
+# timezone Asia/Shanghai (CST, +0800)
# system locale
# locale en_US.UTF-8
@@ -179,4 +179,4 @@
# metaDebugFlag 131
# generate core file when service crash
-# enableCoreFile 1
\ No newline at end of file
+# enableCoreFile 1
diff --git a/packaging/tools/tdengine.iss b/packaging/tools/tdengine.iss
index 1c0c105179..2e9c46d06b 100644
--- a/packaging/tools/tdengine.iss
+++ b/packaging/tools/tdengine.iss
@@ -63,7 +63,7 @@ Source: {#MyAppSourceDir}{#MyAppTaosdemoExeName}; DestDir: "{app}"; Flags: igNor
[run]
Filename: {sys}\sc.exe; Parameters: "create taosd start= DEMAND binPath= ""C:\\TDengine\\taosd.exe --win_service""" ; Flags: runhidden
-Filename: {sys}\sc.exe; Parameters: "create taosadapter start= DEMAND binPath= ""C:\\TDengine\\taosadapter.exe --win_service""" ; Flags: runhidden
+Filename: {sys}\sc.exe; Parameters: "create taosadapter start= DEMAND binPath= ""C:\\TDengine\\taosadapter.exe""" ; Flags: runhidden
[UninstallRun]
RunOnceId: "stoptaosd"; Filename: {sys}\sc.exe; Parameters: "stop taosd" ; Flags: runhidden
diff --git a/source/client/src/clientTmq.c b/source/client/src/clientTmq.c
index ab44236d96..28b41b97c5 100644
--- a/source/client/src/clientTmq.c
+++ b/source/client/src/clientTmq.c
@@ -728,12 +728,26 @@ void tmqSendHbReq(void* param, void* tmrId) {
taosMemoryFree(param);
return;
}
- int64_t consumerId = tmq->consumerId;
- int32_t epoch = tmq->epoch;
- SMqHbReq* pReq = taosMemoryMalloc(sizeof(SMqHbReq));
- if (pReq == NULL) goto OVER;
- pReq->consumerId = htobe64(consumerId);
- pReq->epoch = epoch;
+
+ SMqHbReq req = {0};
+ req.consumerId = tmq->consumerId;
+ req.epoch = tmq->epoch;
+
+ int32_t tlen = tSerializeSMqHbReq(NULL, 0, &req);
+ if (tlen < 0) {
+ tscError("tSerializeSMqHbReq failed");
+ return;
+ }
+ void *pReq = taosMemoryCalloc(1, tlen);
+ if (tlen < 0) {
+ tscError("failed to malloc MqHbReq msg, size:%d", tlen);
+ return;
+ }
+ if (tSerializeSMqHbReq(pReq, tlen, &req) < 0) {
+ tscError("tSerializeSMqHbReq %d failed", tlen);
+ taosMemoryFree(pReq);
+ return;
+ }
SMsgSendInfo* sendInfo = taosMemoryCalloc(1, sizeof(SMsgSendInfo));
if (sendInfo == NULL) {
@@ -742,7 +756,7 @@ void tmqSendHbReq(void* param, void* tmrId) {
}
sendInfo->msgInfo = (SDataBuf){
.pData = pReq,
- .len = sizeof(SMqHbReq),
+ .len = tlen,
.handle = NULL,
};
@@ -1378,21 +1392,31 @@ int32_t tmqAskEp(tmq_t* tmq, bool async) {
}
atomic_store_32(&tmq->epSkipCnt, 0);
#endif
- int32_t tlen = sizeof(SMqAskEpReq);
- SMqAskEpReq* req = taosMemoryCalloc(1, tlen);
- if (req == NULL) {
- tscError("failed to malloc get subscribe ep buf");
- /*atomic_store_8(&tmq->epStatus, 0);*/
+ SMqAskEpReq req = {0};
+ req.consumerId = tmq->consumerId;
+ req.epoch = tmq->epoch;
+ strcpy(req.cgroup, tmq->groupId);
+
+ int32_t tlen = tSerializeSMqAskEpReq(NULL, 0, &req);
+ if (tlen < 0) {
+ tscError("tSerializeSMqAskEpReq failed");
+ return -1;
+ }
+ void *pReq = taosMemoryCalloc(1, tlen);
+ if (tlen < 0) {
+ tscError("failed to malloc askEpReq msg, size:%d", tlen);
+ return -1;
+ }
+ if (tSerializeSMqAskEpReq(pReq, tlen, &req) < 0) {
+ tscError("tSerializeSMqAskEpReq %d failed", tlen);
+ taosMemoryFree(pReq);
return -1;
}
- req->consumerId = htobe64(tmq->consumerId);
- req->epoch = htonl(tmq->epoch);
- strcpy(req->cgroup, tmq->groupId);
SMqAskEpCbParam* pParam = taosMemoryCalloc(1, sizeof(SMqAskEpCbParam));
if (pParam == NULL) {
tscError("failed to malloc subscribe param");
- taosMemoryFree(req);
+ taosMemoryFree(pReq);
/*atomic_store_8(&tmq->epStatus, 0);*/
return -1;
}
@@ -1405,13 +1429,13 @@ int32_t tmqAskEp(tmq_t* tmq, bool async) {
if (sendInfo == NULL) {
tsem_destroy(&pParam->rspSem);
taosMemoryFree(pParam);
- taosMemoryFree(req);
+ taosMemoryFree(pReq);
/*atomic_store_8(&tmq->epStatus, 0);*/
return -1;
}
sendInfo->msgInfo = (SDataBuf){
- .pData = req,
+ .pData = pReq,
.len = tlen,
.handle = NULL,
};
diff --git a/source/common/src/tdatablock.c b/source/common/src/tdatablock.c
index f7b1196248..3c2a5377e3 100644
--- a/source/common/src/tdatablock.c
+++ b/source/common/src/tdatablock.c
@@ -1403,6 +1403,7 @@ SSDataBlock* createOneDataBlock(const SSDataBlock* pDataBlock, bool copyData) {
pBlock->info = pDataBlock->info;
pBlock->info.rows = 0;
pBlock->info.capacity = 0;
+ pBlock->info.rowSize = 0;
size_t numOfCols = taosArrayGetSize(pDataBlock->pDataBlock);
for (int32_t i = 0; i < numOfCols; ++i) {
diff --git a/source/common/src/tmsg.c b/source/common/src/tmsg.c
index 4485e8df0c..52d9c5b199 100644
--- a/source/common/src/tmsg.c
+++ b/source/common/src/tmsg.c
@@ -4446,6 +4446,204 @@ void tFreeSExplainRsp(SExplainRsp *pRsp) {
taosMemoryFreeClear(pRsp->subplanInfo);
}
+int32_t tSerializeSBatchReq(void *buf, int32_t bufLen, SBatchReq *pReq) {
+ int32_t headLen = sizeof(SMsgHead);
+ if (buf != NULL) {
+ buf = (char *)buf + headLen;
+ bufLen -= headLen;
+ }
+
+ SEncoder encoder = {0};
+ tEncoderInit(&encoder, buf, bufLen);
+ if (tStartEncode(&encoder) < 0) return -1;
+
+ int32_t num = taosArrayGetSize(pReq->pMsgs);
+ if (tEncodeI32(&encoder, num) < 0) return -1;
+ for (int32_t i = 0; i < num; ++i) {
+ SBatchMsg *pMsg = taosArrayGet(pReq->pMsgs, i);
+ if (tEncodeI32(&encoder, pMsg->msgIdx) < 0) return -1;
+ if (tEncodeI32(&encoder, pMsg->msgType) < 0) return -1;
+ if (tEncodeI32(&encoder, pMsg->msgLen) < 0) return -1;
+ if (tEncodeBinary(&encoder, pMsg->msg, pMsg->msgLen) < 0) return -1;
+ }
+
+ tEndEncode(&encoder);
+
+ int32_t tlen = encoder.pos;
+ tEncoderClear(&encoder);
+
+ if (buf != NULL) {
+ SMsgHead *pHead = (SMsgHead *)((char *)buf - headLen);
+ pHead->vgId = htonl(pReq->header.vgId);
+ pHead->contLen = htonl(tlen + headLen);
+ }
+
+ return tlen + headLen;
+}
+
+int32_t tDeserializeSBatchReq(void *buf, int32_t bufLen, SBatchReq *pReq) {
+ int32_t headLen = sizeof(SMsgHead);
+
+ SMsgHead *pHead = buf;
+ pHead->vgId = pReq->header.vgId;
+ pHead->contLen = pReq->header.contLen;
+
+ SDecoder decoder = {0};
+ tDecoderInit(&decoder, (char *)buf + headLen, bufLen - headLen);
+
+ if (tStartDecode(&decoder) < 0) return -1;
+
+ int32_t num = 0;
+ if (tDecodeI32(&decoder, &num) < 0) return -1;
+ if (num <= 0) {
+ pReq->pMsgs = NULL;
+ tEndDecode(&decoder);
+
+ tDecoderClear(&decoder);
+ return 0;
+ }
+
+ pReq->pMsgs = taosArrayInit(num, sizeof(SBatchMsg));
+ if (NULL == pReq->pMsgs) return -1;
+ for (int32_t i = 0; i < num; ++i) {
+ SBatchMsg msg = {0};
+ if (tDecodeI32(&decoder, &msg.msgIdx) < 0) return -1;
+ if (tDecodeI32(&decoder, &msg.msgType) < 0) return -1;
+ if (tDecodeI32(&decoder, &msg.msgLen) < 0) return -1;
+ if (tDecodeBinaryAlloc(&decoder, &msg.msg, NULL) < 0) return -1;
+ if (NULL == taosArrayPush(pReq->pMsgs, &msg)) return -1;
+ }
+
+ tEndDecode(&decoder);
+
+ tDecoderClear(&decoder);
+ return 0;
+}
+
+int32_t tSerializeSBatchRsp(void *buf, int32_t bufLen, SBatchRsp *pRsp) {
+ SEncoder encoder = {0};
+ tEncoderInit(&encoder, buf, bufLen);
+ if (tStartEncode(&encoder) < 0) return -1;
+
+ int32_t num = taosArrayGetSize(pRsp->pRsps);
+ if (tEncodeI32(&encoder, num) < 0) return -1;
+ for (int32_t i = 0; i < num; ++i) {
+ SBatchRspMsg *pMsg = taosArrayGet(pRsp->pRsps, i);
+ if (tEncodeI32(&encoder, pMsg->reqType) < 0) return -1;
+ if (tEncodeI32(&encoder, pMsg->msgIdx) < 0) return -1;
+ if (tEncodeI32(&encoder, pMsg->msgLen) < 0) return -1;
+ if (tEncodeI32(&encoder, pMsg->rspCode) < 0) return -1;
+ if (tEncodeBinary(&encoder, pMsg->msg, pMsg->msgLen) < 0) return -1;
+ }
+
+ tEndEncode(&encoder);
+
+ int32_t tlen = encoder.pos;
+ tEncoderClear(&encoder);
+
+ return tlen;
+}
+
+int32_t tDeserializeSBatchRsp(void *buf, int32_t bufLen, SBatchRsp *pRsp) {
+ SDecoder decoder = {0};
+ tDecoderInit(&decoder, (char *)buf, bufLen);
+
+ if (tStartDecode(&decoder) < 0) return -1;
+
+ int32_t num = 0;
+ if (tDecodeI32(&decoder, &num) < 0) return -1;
+ if (num <= 0) {
+ pRsp->pRsps = NULL;
+ tEndDecode(&decoder);
+
+ tDecoderClear(&decoder);
+ return 0;
+ }
+
+ pRsp->pRsps = taosArrayInit(num, sizeof(SBatchRspMsg));
+ if (NULL == pRsp->pRsps) return -1;
+ for (int32_t i = 0; i < num; ++i) {
+ SBatchRspMsg msg = {0};
+ if (tDecodeI32(&decoder, &msg.reqType) < 0) return -1;
+ if (tDecodeI32(&decoder, &msg.msgIdx) < 0) return -1;
+ if (tDecodeI32(&decoder, &msg.msgLen) < 0) return -1;
+ if (tDecodeI32(&decoder, &msg.rspCode) < 0) return -1;
+ if (tDecodeBinaryAlloc(&decoder, &msg.msg, NULL) < 0) return -1;
+ if (NULL == taosArrayPush(pRsp->pRsps, &msg)) return -1;
+ }
+
+ tEndDecode(&decoder);
+
+ tDecoderClear(&decoder);
+ return 0;
+}
+
+
+int32_t tSerializeSMqAskEpReq(void *buf, int32_t bufLen, SMqAskEpReq *pReq) {
+ SEncoder encoder = {0};
+ tEncoderInit(&encoder, buf, bufLen);
+ if (tStartEncode(&encoder) < 0) return -1;
+
+ if (tEncodeI64(&encoder, pReq->consumerId) < 0) return -1;
+ if (tEncodeI32(&encoder, pReq->epoch) < 0) return -1;
+ if (tEncodeCStr(&encoder, pReq->cgroup) < 0) return -1;
+
+ tEndEncode(&encoder);
+
+ int32_t tlen = encoder.pos;
+ tEncoderClear(&encoder);
+
+ return tlen;
+}
+
+int32_t tDeserializeSMqAskEpReq(void *buf, int32_t bufLen, SMqAskEpReq *pReq) {
+ SDecoder decoder = {0};
+ tDecoderInit(&decoder, (char *)buf, bufLen);
+
+ if (tStartDecode(&decoder) < 0) return -1;
+
+ if (tDecodeI64(&decoder, &pReq->consumerId) < 0) return -1;
+ if (tDecodeI32(&decoder, &pReq->epoch) < 0) return -1;
+ if (tDecodeCStrTo(&decoder, pReq->cgroup) < 0) return -1;
+
+ tEndDecode(&decoder);
+
+ tDecoderClear(&decoder);
+ return 0;
+}
+
+int32_t tSerializeSMqHbReq(void *buf, int32_t bufLen, SMqHbReq *pReq) {
+ SEncoder encoder = {0};
+ tEncoderInit(&encoder, buf, bufLen);
+ if (tStartEncode(&encoder) < 0) return -1;
+
+ if (tEncodeI64(&encoder, pReq->consumerId) < 0) return -1;
+ if (tEncodeI32(&encoder, pReq->epoch) < 0) return -1;
+
+ tEndEncode(&encoder);
+
+ int32_t tlen = encoder.pos;
+ tEncoderClear(&encoder);
+
+ return tlen;
+}
+
+int32_t tDeserializeSMqHbReq(void *buf, int32_t bufLen, SMqHbReq *pReq) {
+ SDecoder decoder = {0};
+ tDecoderInit(&decoder, (char *)buf, bufLen);
+
+ if (tStartDecode(&decoder) < 0) return -1;
+
+ if (tDecodeI64(&decoder, &pReq->consumerId) < 0) return -1;
+ if (tDecodeI32(&decoder, &pReq->epoch) < 0) return -1;
+
+ tEndDecode(&decoder);
+
+ tDecoderClear(&decoder);
+ return 0;
+}
+
+
int32_t tSerializeSSchedulerHbReq(void *buf, int32_t bufLen, SSchedulerHbReq *pReq) {
int32_t headLen = sizeof(SMsgHead);
if (buf != NULL) {
diff --git a/source/common/src/tvariant.c b/source/common/src/tvariant.c
index 8d4c17a821..65e9a767f5 100644
--- a/source/common/src/tvariant.c
+++ b/source/common/src/tvariant.c
@@ -109,7 +109,7 @@ void taosVariantCreateFromBinary(SVariant *pVar, const char *pz, size_t len, uin
}
case TSDB_DATA_TYPE_FLOAT: {
pVar->nLen = tDataTypes[type].bytes;
- pVar->d = GET_FLOAT_VAL(pz);
+ pVar->f = GET_FLOAT_VAL(pz);
break;
}
case TSDB_DATA_TYPE_NCHAR: { // here we get the nchar length from raw binary bits length
@@ -223,12 +223,18 @@ int32_t taosVariantCompare(const SVariant *p1, const SVariant *p2) {
} else {
return p1->nLen > p2->nLen ? 1 : -1;
}
- } else if (p1->nType == TSDB_DATA_TYPE_FLOAT || p1->nType == TSDB_DATA_TYPE_DOUBLE) {
+ } else if (p1->nType == TSDB_DATA_TYPE_DOUBLE) {
if (p1->d == p2->d) {
return 0;
} else {
return p1->d > p2->d ? 1 : -1;
}
+ } else if (p1->nType == TSDB_DATA_TYPE_FLOAT) {
+ if (p1->f == p2->f) {
+ return 0;
+ } else {
+ return p1->f > p2->f ? 1 : -1;
+ }
} else if (IS_UNSIGNED_NUMERIC_TYPE(p1->nType)) {
if (p1->u == p2->u) {
return 0;
@@ -259,8 +265,9 @@ char *taosVariantGet(SVariant *pVar, int32_t type) {
case TSDB_DATA_TYPE_UBIGINT:
return (char *)&pVar->u;
case TSDB_DATA_TYPE_DOUBLE:
- case TSDB_DATA_TYPE_FLOAT:
return (char *)&pVar->d;
+ case TSDB_DATA_TYPE_FLOAT:
+ return (char *)&pVar->f;
case TSDB_DATA_TYPE_BINARY:
case TSDB_DATA_TYPE_JSON:
return (char *)pVar->pz;
diff --git a/source/dnode/mnode/impl/src/mndConsumer.c b/source/dnode/mnode/impl/src/mndConsumer.c
index 62ad5bae15..300251d64d 100644
--- a/source/dnode/mnode/impl/src/mndConsumer.c
+++ b/source/dnode/mnode/impl/src/mndConsumer.c
@@ -325,9 +325,14 @@ static int32_t mndProcessMqTimerMsg(SRpcMsg *pMsg) {
static int32_t mndProcessMqHbReq(SRpcMsg *pMsg) {
SMnode *pMnode = pMsg->info.node;
- SMqHbReq *pReq = (SMqHbReq *)pMsg->pCont;
- int64_t consumerId = be64toh(pReq->consumerId);
+ SMqHbReq req = {0};
+ if (tDeserializeSMqHbReq(pMsg->pCont, pMsg->contLen, &req) < 0) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ return -1;
+ }
+
+ int64_t consumerId = req.consumerId;
SMqConsumerObj *pConsumer = mndAcquireConsumer(pMnode, consumerId);
if (pConsumer == NULL) {
mError("consumer %" PRId64 " not exist", consumerId);
@@ -359,10 +364,16 @@ static int32_t mndProcessMqHbReq(SRpcMsg *pMsg) {
static int32_t mndProcessAskEpReq(SRpcMsg *pMsg) {
SMnode *pMnode = pMsg->info.node;
- SMqAskEpReq *pReq = (SMqAskEpReq *)pMsg->pCont;
+ SMqAskEpReq req = {0};
SMqAskEpRsp rsp = {0};
- int64_t consumerId = be64toh(pReq->consumerId);
- int32_t epoch = ntohl(pReq->epoch);
+
+ if (tDeserializeSMqAskEpReq(pMsg->pCont, pMsg->contLen, &req) < 0) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ return -1;
+ }
+
+ int64_t consumerId = req.consumerId;
+ int32_t epoch = req.epoch;
SMqConsumerObj *pConsumer = mndAcquireConsumer(pMnode, consumerId);
if (pConsumer == NULL) {
@@ -370,7 +381,7 @@ static int32_t mndProcessAskEpReq(SRpcMsg *pMsg) {
return -1;
}
- ASSERT(strcmp(pReq->cgroup, pConsumer->cgroup) == 0);
+ ASSERT(strcmp(req.cgroup, pConsumer->cgroup) == 0);
atomic_store_32(&pConsumer->hbStatus, 0);
diff --git a/source/dnode/mnode/impl/src/mndQuery.c b/source/dnode/mnode/impl/src/mndQuery.c
index 3a7c25f7f9..5278fc7761 100644
--- a/source/dnode/mnode/impl/src/mndQuery.c
+++ b/source/dnode/mnode/impl/src/mndQuery.c
@@ -63,81 +63,60 @@ int32_t mndProcessQueryMsg(SRpcMsg *pMsg) {
return code;
}
+
+static FORCE_INLINE void mnodeFreeSBatchRspMsg(void* p) {
+ if (NULL == p) {
+ return;
+ }
+
+ SBatchRspMsg* pRsp = (SBatchRspMsg*)p;
+ rpcFreeCont(pRsp->msg);
+}
+
int32_t mndProcessBatchMetaMsg(SRpcMsg *pMsg) {
int32_t code = 0;
- int32_t offset = 0;
int32_t rspSize = 0;
- SBatchReq *batchReq = (SBatchReq *)pMsg->pCont;
- int32_t msgNum = ntohl(batchReq->msgNum);
- offset += sizeof(SBatchReq);
+ SBatchReq batchReq = {0};
SBatchMsg req = {0};
- SBatchRsp rsp = {0};
+ SBatchRspMsg rsp = {0};
+ SBatchRsp batchRsp = {0};
SRpcMsg reqMsg = *pMsg;
- SRpcMsg rspMsg = {0};
void *pRsp = NULL;
SMnode *pMnode = pMsg->info.node;
+ if (tDeserializeSBatchReq(pMsg->pCont, pMsg->contLen, &batchReq)) {
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ mError("tDeserializeSBatchReq failed");
+ goto _exit;
+ }
+
+ int32_t msgNum = taosArrayGetSize(batchReq.pMsgs);
if (msgNum >= MAX_META_MSG_IN_BATCH) {
code = TSDB_CODE_INVALID_MSG;
mError("too many msgs %d in mnode batch meta req", msgNum);
goto _exit;
}
- SArray *batchRsp = taosArrayInit(msgNum, sizeof(SBatchRsp));
- if (NULL == batchRsp) {
+ batchRsp.pRsps = taosArrayInit(msgNum, sizeof(SBatchRspMsg));
+ if (NULL == batchRsp.pRsps) {
code = TSDB_CODE_OUT_OF_MEMORY;
goto _exit;
}
for (int32_t i = 0; i < msgNum; ++i) {
- if (offset >= pMsg->contLen) {
- mError("offset %d is bigger than contLen %d", offset, pMsg->contLen);
- terrno = TSDB_CODE_INVALID_MSG_LEN;
- taosArrayDestroy(batchRsp);
- return -1;
- }
+ SBatchMsg* req = taosArrayGet(batchReq.pMsgs, i);
- req.msgIdx = ntohl(*(int32_t *)((char *)pMsg->pCont + offset));
- offset += sizeof(req.msgIdx);
- if (offset >= pMsg->contLen) {
- mError("offset %d is bigger than contLen %d", offset, pMsg->contLen);
- terrno = TSDB_CODE_INVALID_MSG_LEN;
- taosArrayDestroy(batchRsp);
- return -1;
- }
-
- req.msgType = ntohl(*(int32_t *)((char *)pMsg->pCont + offset));
- offset += sizeof(req.msgType);
- if (offset >= pMsg->contLen) {
- mError("offset %d is bigger than contLen %d", offset, pMsg->contLen);
- terrno = TSDB_CODE_INVALID_MSG_LEN;
- taosArrayDestroy(batchRsp);
- return -1;
- }
-
- req.msgLen = ntohl(*(int32_t *)((char *)pMsg->pCont + offset));
- offset += sizeof(req.msgLen);
- if (offset >= pMsg->contLen) {
- mError("offset %d is bigger than contLen %d", offset, pMsg->contLen);
- terrno = TSDB_CODE_INVALID_MSG_LEN;
- taosArrayDestroy(batchRsp);
- return -1;
- }
-
- req.msg = (char *)pMsg->pCont + offset;
- offset += req.msgLen;
-
- reqMsg.msgType = req.msgType;
- reqMsg.pCont = req.msg;
- reqMsg.contLen = req.msgLen;
+ reqMsg.msgType = req->msgType;
+ reqMsg.pCont = req->msg;
+ reqMsg.contLen = req->msgLen;
reqMsg.info.rsp = NULL;
reqMsg.info.rspLen = 0;
- MndMsgFp fp = pMnode->msgFp[TMSG_INDEX(req.msgType)];
+ MndMsgFp fp = pMnode->msgFp[TMSG_INDEX(req->msgType)];
if (fp == NULL) {
mError("msg:%p, failed to get msg handle, app:%p type:%s", pMsg, pMsg->info.ahandle, TMSG_INFO(pMsg->msgType));
terrno = TSDB_CODE_MSG_NOT_PROCESSED;
- taosArrayDestroy(batchRsp);
+ taosArrayDestroy(batchRsp.pRsps);
return -1;
}
@@ -146,49 +125,29 @@ int32_t mndProcessBatchMetaMsg(SRpcMsg *pMsg) {
} else {
rsp.rspCode = 0;
}
- rsp.msgIdx = req.msgIdx;
+ rsp.msgIdx = req->msgIdx;
rsp.reqType = reqMsg.msgType;
rsp.msgLen = reqMsg.info.rspLen;
rsp.msg = reqMsg.info.rsp;
- taosArrayPush(batchRsp, &rsp);
-
- rspSize += sizeof(rsp) + rsp.msgLen - POINTER_BYTES;
+ taosArrayPush(batchRsp.pRsps, &rsp);
}
- rspSize += sizeof(int32_t);
- offset = 0;
-
+ rspSize = tSerializeSBatchRsp(NULL, 0, &batchRsp);
+ if (rspSize < 0) {
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ goto _exit;
+ }
pRsp = rpcMallocCont(rspSize);
if (pRsp == NULL) {
code = TSDB_CODE_OUT_OF_MEMORY;
goto _exit;
}
-
- *(int32_t *)((char *)pRsp + offset) = htonl(msgNum);
- offset += sizeof(msgNum);
- for (int32_t i = 0; i < msgNum; ++i) {
- SBatchRsp *p = taosArrayGet(batchRsp, i);
-
- *(int32_t *)((char *)pRsp + offset) = htonl(p->reqType);
- offset += sizeof(p->reqType);
- *(int32_t *)((char *)pRsp + offset) = htonl(p->msgIdx);
- offset += sizeof(p->msgIdx);
- *(int32_t *)((char *)pRsp + offset) = htonl(p->msgLen);
- offset += sizeof(p->msgLen);
- *(int32_t *)((char *)pRsp + offset) = htonl(p->rspCode);
- offset += sizeof(p->rspCode);
- if (p->msg != NULL) {
- memcpy((char *)pRsp + offset, p->msg, p->msgLen);
- offset += p->msgLen;
- }
-
- rpcFreeCont(p->msg);
+ if (tSerializeSBatchRsp(pRsp, rspSize, &batchRsp) < 0) {
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ goto _exit;
}
- taosArrayDestroy(batchRsp);
- batchRsp = NULL;
-
_exit:
pMsg->info.rsp = pRsp;
@@ -198,7 +157,8 @@ _exit:
mError("mnd get batch meta failed cause of %s", tstrerror(code));
}
- taosArrayDestroyEx(batchRsp, tFreeSBatchRsp);
+ taosArrayDestroyEx(batchReq.pMsgs, tFreeSBatchReqMsg);
+ taosArrayDestroyEx(batchRsp.pRsps, mnodeFreeSBatchRspMsg);
return code;
}
diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c
index db878d72b9..27c58dfba1 100644
--- a/source/dnode/mnode/impl/src/mndTrans.c
+++ b/source/dnode/mnode/impl/src/mndTrans.c
@@ -1277,9 +1277,11 @@ static int32_t mndTransExecuteRedoActionsSerial(SMnode *pMnode, STrans *pTrans)
pAction->id);
code = mndTransSync(pMnode, pTrans);
if (code != 0) {
+ pTrans->redoActionPos--;
pTrans->code = terrno;
mError("trans:%d, %s:%d is executed and failed to sync to other mnodes since %s", pTrans->id,
mndTransStr(pAction->stage), pAction->id, terrstr());
+ break;
}
} else if (code == TSDB_CODE_ACTION_IN_PROGRESS) {
mInfo("trans:%d, %s:%d is in progress and wait it finish", pTrans->id, mndTransStr(pAction->stage), pAction->id);
diff --git a/source/dnode/mnode/impl/src/mndVgroup.c b/source/dnode/mnode/impl/src/mndVgroup.c
index 9d3b86c79b..7901093315 100644
--- a/source/dnode/mnode/impl/src/mndVgroup.c
+++ b/source/dnode/mnode/impl/src/mndVgroup.c
@@ -1739,6 +1739,7 @@ static int32_t mndSplitVgroup(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SVgObj
code = 0;
_OVER:
+ taosArrayDestroy(pArray);
mndTransDrop(pTrans);
sdbFreeRaw(pRaw);
return code;
diff --git a/source/dnode/vnode/src/tq/tqRead.c b/source/dnode/vnode/src/tq/tqRead.c
index 45873f2744..5c5ba1205e 100644
--- a/source/dnode/vnode/src/tq/tqRead.c
+++ b/source/dnode/vnode/src/tq/tqRead.c
@@ -398,6 +398,35 @@ bool tqNextDataBlock(STqReader* pReader) {
return false;
}
+int32_t tqMaskBlock(SSchemaWrapper* pDst, SSDataBlock* pBlock, const SSchemaWrapper* pSrc, char* mask) {
+ int32_t code;
+
+ int32_t cnt = 0;
+ for (int32_t i = 0; i < pSrc->nCols; i++) {
+ cnt += mask[i];
+ }
+
+ pDst->nCols = cnt;
+ pDst->pSchema = taosMemoryCalloc(cnt, sizeof(SSchema));
+ if (pDst->pSchema == NULL) {
+ return -1;
+ }
+
+ int32_t j = 0;
+ for (int32_t i = 0; i < pSrc->nCols; i++) {
+ if (mask[i]) {
+ pDst->pSchema[j++] = pSrc->pSchema[i];
+ SColumnInfoData colInfo =
+ createColumnInfoData(pSrc->pSchema[i].type, pSrc->pSchema[i].bytes, pSrc->pSchema[i].colId);
+ code = blockDataAppendColInfo(pBlock, &colInfo);
+ if (code != 0) {
+ return -1;
+ }
+ }
+ }
+ return 0;
+}
+
bool tqNextDataBlockFilterOut(STqReader* pHandle, SHashObj* filterOutUids) {
while (1) {
if (tGetSubmitMsgNext(&pHandle->msgIter, &pHandle->pBlock) < 0) {
@@ -527,6 +556,119 @@ FAIL:
return -1;
}
+int32_t tqSplitRetrieveDataBlock(STqReader* pReader, SArray* blocks, SArray* schemas) {
+ int32_t sversion = htonl(pReader->pBlock->sversion);
+
+ if (pReader->cachedSchemaSuid == 0 || pReader->cachedSchemaVer != sversion ||
+ pReader->cachedSchemaSuid != pReader->msgIter.suid) {
+ if (pReader->pSchema) taosMemoryFree(pReader->pSchema);
+ pReader->pSchema = metaGetTbTSchema(pReader->pVnodeMeta, pReader->msgIter.uid, sversion, 1);
+ if (pReader->pSchema == NULL) {
+ tqWarn("cannot found tsschema for table: uid:%" PRId64 " (suid:%" PRId64 "), version %d, possibly dropped table",
+ pReader->msgIter.uid, pReader->msgIter.suid, pReader->cachedSchemaVer);
+ /*ASSERT(0);*/
+ pReader->cachedSchemaSuid = 0;
+ terrno = TSDB_CODE_TQ_TABLE_SCHEMA_NOT_FOUND;
+ return -1;
+ }
+
+ if (pReader->pSchemaWrapper) tDeleteSSchemaWrapper(pReader->pSchemaWrapper);
+ pReader->pSchemaWrapper = metaGetTableSchema(pReader->pVnodeMeta, pReader->msgIter.uid, sversion, 1);
+ if (pReader->pSchemaWrapper == NULL) {
+ tqWarn("cannot found schema wrapper for table: suid:%" PRId64 ", version %d, possibly dropped table",
+ pReader->msgIter.uid, pReader->cachedSchemaVer);
+ /*ASSERT(0);*/
+ pReader->cachedSchemaSuid = 0;
+ terrno = TSDB_CODE_TQ_TABLE_SCHEMA_NOT_FOUND;
+ return -1;
+ }
+ pReader->cachedSchemaVer = sversion;
+ pReader->cachedSchemaSuid = pReader->msgIter.suid;
+ }
+
+ STSchema* pTschema = pReader->pSchema;
+ SSchemaWrapper* pSchemaWrapper = pReader->pSchemaWrapper;
+
+ int32_t colAtMost = pSchemaWrapper->nCols;
+
+ int32_t curRow = 0;
+
+ char* assigned = taosMemoryCalloc(1, pSchemaWrapper->nCols);
+ if (assigned) return -1;
+
+ tInitSubmitBlkIter(&pReader->msgIter, pReader->pBlock, &pReader->blkIter);
+ STSRowIter iter = {0};
+ tdSTSRowIterInit(&iter, pTschema);
+ STSRow* row;
+
+ while ((row = tGetSubmitBlkNext(&pReader->blkIter)) != NULL) {
+ bool buildNew = false;
+ tdSTSRowIterReset(&iter, row);
+
+ for (int32_t i = 0; i < colAtMost; i++) {
+ SCellVal sVal = {0};
+ if (!tdSTSRowIterFetch(&iter, pSchemaWrapper->pSchema[i].colId, pSchemaWrapper->pSchema[i].type, &sVal)) {
+ break;
+ }
+ if (curRow == 0) {
+ assigned[i] = sVal.valType != TD_VTYPE_NONE;
+ buildNew = true;
+ } else {
+ bool currentRowAssigned = sVal.valType != TD_VTYPE_NONE;
+ if (currentRowAssigned != assigned[i]) {
+ assigned[i] = currentRowAssigned;
+ buildNew = true;
+ }
+ }
+ }
+
+ if (buildNew) {
+ SSDataBlock block;
+ SSchemaWrapper sw;
+ if (tqMaskBlock(&sw, &block, pSchemaWrapper, assigned) < 0) {
+ goto FAIL;
+ }
+
+ taosArrayPush(blocks, &block);
+ taosArrayPush(schemas, &sw);
+ }
+
+ SSDataBlock* pBlock = taosArrayGetLast(blocks);
+ pBlock->info.uid = pReader->msgIter.uid;
+ pBlock->info.rows = pReader->msgIter.numOfRows;
+ pBlock->info.version = pReader->pMsg->version;
+
+ if (blockDataEnsureCapacity(pBlock, pReader->msgIter.numOfRows - curRow) < 0) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ goto FAIL;
+ }
+
+ tdSTSRowIterInit(&iter, pTschema);
+ for (int32_t i = 0; i < taosArrayGetSize(pBlock->pDataBlock); i++) {
+ SColumnInfoData* pColData = taosArrayGet(pBlock->pDataBlock, i);
+ SCellVal sVal = {0};
+
+ if (!tdSTSRowIterFetch(&iter, pColData->info.colId, pColData->info.type, &sVal)) {
+ break;
+ }
+
+ ASSERT(sVal.valType != TD_VTYPE_NONE);
+
+ if (colDataAppend(pColData, curRow, sVal.val, sVal.valType != TD_VTYPE_NORM) < 0) {
+ goto FAIL;
+ }
+ }
+ curRow++;
+ }
+
+ taosMemoryFree(assigned);
+ return 0;
+
+FAIL:
+ taosMemoryFree(assigned);
+ return -1;
+}
+
void tqReaderSetColIdList(STqReader* pReader, SArray* pColIdList) { pReader->pColIdList = pColIdList; }
int tqReaderSetTbUidList(STqReader* pReader, const SArray* tbUidList) {
diff --git a/source/dnode/vnode/src/tsdb/tsdbOpen.c b/source/dnode/vnode/src/tsdb/tsdbOpen.c
index bb20a9b012..f71b5b6706 100644
--- a/source/dnode/vnode/src/tsdb/tsdbOpen.c
+++ b/source/dnode/vnode/src/tsdb/tsdbOpen.c
@@ -49,7 +49,7 @@ int tsdbOpen(SVnode *pVnode, STsdb **ppTsdb, const char *dir, STsdbKeepCfg *pKee
pTsdb->path = (char *)&pTsdb[1];
snprintf(pTsdb->path, TD_PATH_MAX, "%s%s%s", pVnode->path, TD_DIRSEP, dir);
- taosRealPath(pTsdb->path, NULL, slen);
+ // taosRealPath(pTsdb->path, NULL, slen);
pTsdb->pVnode = pVnode;
taosThreadRwlockInit(&pTsdb->rwLock, NULL);
if (!pKeepCfg) {
diff --git a/source/dnode/vnode/src/vnd/vnodeQuery.c b/source/dnode/vnode/src/vnd/vnodeQuery.c
index 15769ef4c9..8e9aab0afd 100644
--- a/source/dnode/vnode/src/vnd/vnodeQuery.c
+++ b/source/dnode/vnode/src/vnd/vnodeQuery.c
@@ -264,77 +264,55 @@ _exit:
return TSDB_CODE_SUCCESS;
}
+static FORCE_INLINE void vnodeFreeSBatchRspMsg(void* p) {
+ if (NULL == p) {
+ return;
+ }
+
+ SBatchRspMsg* pRsp = (SBatchRspMsg*)p;
+ rpcFreeCont(pRsp->msg);
+}
+
+
int32_t vnodeGetBatchMeta(SVnode *pVnode, SRpcMsg *pMsg) {
int32_t code = 0;
- int32_t offset = 0;
int32_t rspSize = 0;
- SBatchReq *batchReq = (SBatchReq *)pMsg->pCont;
- int32_t msgNum = ntohl(batchReq->msgNum);
- offset += sizeof(SBatchReq);
- SBatchMsg req = {0};
- SBatchRsp rsp = {0};
+ SBatchReq batchReq = {0};
+ SBatchMsg *req = NULL;
+ SBatchRspMsg rsp = {0};
+ SBatchRsp batchRsp = {0};
SRpcMsg reqMsg = *pMsg;
SRpcMsg rspMsg = {0};
void *pRsp = NULL;
+ if (tDeserializeSBatchReq(pMsg->pCont, pMsg->contLen, &batchReq)) {
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ qError("tDeserializeSBatchReq failed");
+ goto _exit;
+ }
+
+ int32_t msgNum = taosArrayGetSize(batchReq.pMsgs);
if (msgNum >= MAX_META_MSG_IN_BATCH) {
code = TSDB_CODE_INVALID_MSG;
qError("too many msgs %d in vnode batch meta req", msgNum);
goto _exit;
}
- SArray *batchRsp = taosArrayInit(msgNum, sizeof(SBatchRsp));
- if (NULL == batchRsp) {
+ batchRsp.pRsps = taosArrayInit(msgNum, sizeof(SBatchRspMsg));
+ if (NULL == batchRsp.pRsps) {
code = TSDB_CODE_OUT_OF_MEMORY;
+ qError("taosArrayInit %d SBatchRspMsg failed", msgNum);
goto _exit;
}
for (int32_t i = 0; i < msgNum; ++i) {
- if (offset >= pMsg->contLen) {
- qError("vnode offset %d is bigger than contLen %d", offset, pMsg->contLen);
- terrno = TSDB_CODE_INVALID_MSG_LEN;
- taosArrayDestroy(batchRsp);
- return -1;
- }
+ req = taosArrayGet(batchReq.pMsgs, i);
- req.msgIdx = ntohl(*(int32_t *)((char *)pMsg->pCont + offset));
- offset += sizeof(req.msgIdx);
+ reqMsg.msgType = req->msgType;
+ reqMsg.pCont = req->msg;
+ reqMsg.contLen = req->msgLen;
- if (offset >= pMsg->contLen) {
- qError("vnode offset %d is bigger than contLen %d", offset, pMsg->contLen);
- terrno = TSDB_CODE_INVALID_MSG_LEN;
- taosArrayDestroy(batchRsp);
- return -1;
- }
-
- req.msgType = ntohl(*(int32_t *)((char *)pMsg->pCont + offset));
- offset += sizeof(req.msgType);
-
- if (offset >= pMsg->contLen) {
- qError("vnode offset %d is bigger than contLen %d", offset, pMsg->contLen);
- terrno = TSDB_CODE_INVALID_MSG_LEN;
- taosArrayDestroy(batchRsp);
- return -1;
- }
-
- req.msgLen = ntohl(*(int32_t *)((char *)pMsg->pCont + offset));
- offset += sizeof(req.msgLen);
-
- if (offset >= pMsg->contLen) {
- qError("vnode offset %d is bigger than contLen %d", offset, pMsg->contLen);
- terrno = TSDB_CODE_INVALID_MSG_LEN;
- taosArrayDestroy(batchRsp);
- return -1;
- }
-
- req.msg = (char *)pMsg->pCont + offset;
- offset += req.msgLen;
-
- reqMsg.msgType = req.msgType;
- reqMsg.pCont = req.msg;
- reqMsg.contLen = req.msgLen;
-
- switch (req.msgType) {
+ switch (req->msgType) {
case TDMT_VND_TABLE_META:
vnodeGetTableMeta(pVnode, &reqMsg, false);
break;
@@ -342,62 +320,39 @@ int32_t vnodeGetBatchMeta(SVnode *pVnode, SRpcMsg *pMsg) {
vnodeGetTableCfg(pVnode, &reqMsg, false);
break;
default:
- qError("invalid req msgType %d", req.msgType);
+ qError("invalid req msgType %d", req->msgType);
reqMsg.code = TSDB_CODE_INVALID_MSG;
reqMsg.pCont = NULL;
reqMsg.contLen = 0;
break;
}
- rsp.msgIdx = req.msgIdx;
+ rsp.msgIdx = req->msgIdx;
rsp.reqType = reqMsg.msgType;
rsp.msgLen = reqMsg.contLen;
rsp.rspCode = reqMsg.code;
rsp.msg = reqMsg.pCont;
- taosArrayPush(batchRsp, &rsp);
-
- rspSize += sizeof(rsp) + rsp.msgLen - POINTER_BYTES;
+ taosArrayPush(batchRsp.pRsps, &rsp);
}
- rspSize += sizeof(int32_t);
- offset = 0;
-
- if (rspSize > MAX_META_BATCH_RSP_SIZE) {
- qError("rspSize:%d overload", rspSize);
- code = TSDB_CODE_INVALID_MSG_LEN;
- goto _exit;
- }
-
- pRsp = rpcMallocCont(rspSize);
- if (pRsp == NULL) {
+ rspSize = tSerializeSBatchRsp(NULL, 0, &batchRsp);
+ if (rspSize < 0) {
+ qError("tSerializeSBatchRsp failed");
code = TSDB_CODE_OUT_OF_MEMORY;
goto _exit;
}
-
- *(int32_t *)((char *)pRsp + offset) = htonl(msgNum);
- offset += sizeof(msgNum);
- for (int32_t i = 0; i < msgNum; ++i) {
- SBatchRsp *p = taosArrayGet(batchRsp, i);
-
- *(int32_t *)((char *)pRsp + offset) = htonl(p->reqType);
- offset += sizeof(p->reqType);
- *(int32_t *)((char *)pRsp + offset) = htonl(p->msgIdx);
- offset += sizeof(p->msgIdx);
- *(int32_t *)((char *)pRsp + offset) = htonl(p->msgLen);
- offset += sizeof(p->msgLen);
- *(int32_t *)((char *)pRsp + offset) = htonl(p->rspCode);
- offset += sizeof(p->rspCode);
- if (p->msg) {
- memcpy((char *)pRsp + offset, p->msg, p->msgLen);
- offset += p->msgLen;
- }
-
- taosMemoryFreeClear(p->msg);
+ pRsp = rpcMallocCont(rspSize);
+ if (pRsp == NULL) {
+ qError("rpcMallocCont %d failed", rspSize);
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ goto _exit;
+ }
+ if (tSerializeSBatchRsp(pRsp, rspSize, &batchRsp) < 0) {
+ qError("tSerializeSBatchRsp %d failed", rspSize);
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ goto _exit;
}
-
- taosArrayDestroy(batchRsp);
- batchRsp = NULL;
_exit:
@@ -411,7 +366,8 @@ _exit:
qError("vnd get batch meta failed cause of %s", tstrerror(code));
}
- taosArrayDestroyEx(batchRsp, tFreeSBatchRsp);
+ taosArrayDestroyEx(batchReq.pMsgs, tFreeSBatchReqMsg);
+ taosArrayDestroyEx(batchRsp.pRsps, tFreeSBatchRspMsg);
tmsgSendRsp(&rspMsg);
diff --git a/source/libs/catalog/inc/catalogInt.h b/source/libs/catalog/inc/catalogInt.h
index 4d3a3a1ab4..c95d0fe462 100644
--- a/source/libs/catalog/inc/catalogInt.h
+++ b/source/libs/catalog/inc/catalogInt.h
@@ -234,7 +234,6 @@ typedef struct SCatalog {
typedef struct SCtgBatch {
int32_t batchId;
int32_t msgType;
- int32_t msgSize;
SArray* pMsgs;
SRequestConnInfo conn;
char dbFName[TSDB_DB_FNAME_LEN];
diff --git a/source/libs/catalog/src/ctgRemote.c b/source/libs/catalog/src/ctgRemote.c
index 23bccb0835..753c4ce917 100644
--- a/source/libs/catalog/src/ctgRemote.c
+++ b/source/libs/catalog/src/ctgRemote.c
@@ -26,19 +26,29 @@ int32_t ctgHandleBatchRsp(SCtgJob* pJob, SCtgTaskCallbackParam* cbParam, SDataBu
SCatalog* pCtg = pJob->pCtg;
int32_t taskNum = taosArrayGetSize(cbParam->taskId);
SDataBuf taskMsg = *pMsg;
- int32_t offset = 0;
- int32_t msgNum = (TSDB_CODE_SUCCESS == rspCode && pMsg->pData && (pMsg->len > 0)) ? ntohl(*(int32_t*)pMsg->pData) : 0;
+ int32_t msgNum = 0;
+ SBatchRsp batchRsp = {0};
+ SBatchRspMsg rsp = {0};
+ SBatchRspMsg *pRsp = NULL;
+
+ if (TSDB_CODE_SUCCESS == rspCode && pMsg->pData && (pMsg->len > 0)) {
+ if (tDeserializeSBatchRsp(pMsg->pData, pMsg->len, &batchRsp) < 0) {
+ ctgError("tDeserializeSBatchRsp failed, msgLen:%d", pMsg->len);
+ CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
+ }
+
+ msgNum = taosArrayGetSize(batchRsp.pRsps);
+ }
+
ASSERT(taskNum == msgNum || 0 == msgNum);
ctgDebug("QID:0x%" PRIx64 " ctg got batch %d rsp %s", pJob->queryId, cbParam->batchId,
TMSG_INFO(cbParam->reqType + 1));
- offset += sizeof(msgNum);
- SBatchRsp rsp = {0};
SHashObj* pBatchs = taosHashInit(taskNum, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), false, HASH_NO_LOCK);
if (NULL == pBatchs) {
ctgError("taosHashInit %d batch failed", taskNum);
- CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
+ CTG_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);
}
for (int32_t i = 0; i < taskNum; ++i) {
@@ -46,25 +56,18 @@ int32_t ctgHandleBatchRsp(SCtgJob* pJob, SCtgTaskCallbackParam* cbParam, SDataBu
int32_t* msgIdx = taosArrayGet(cbParam->msgIdx, i);
SCtgTask* pTask = taosArrayGet(pJob->pTasks, *taskId);
if (msgNum > 0) {
- rsp.reqType = ntohl(*(int32_t*)((char*)pMsg->pData + offset));
- offset += sizeof(rsp.reqType);
- rsp.msgIdx = ntohl(*(int32_t*)((char*)pMsg->pData + offset));
- offset += sizeof(rsp.msgIdx);
- rsp.msgLen = ntohl(*(int32_t*)((char*)pMsg->pData + offset));
- offset += sizeof(rsp.msgLen);
- rsp.rspCode = ntohl(*(int32_t*)((char*)pMsg->pData + offset));
- offset += sizeof(rsp.rspCode);
- rsp.msg = ((char*)pMsg->pData) + offset;
- offset += rsp.msgLen;
+ pRsp = taosArrayGet(batchRsp.pRsps, i);
- taskMsg.msgType = rsp.reqType;
- taskMsg.pData = rsp.msg;
- taskMsg.len = rsp.msgLen;
+ taskMsg.msgType = pRsp->reqType;
+ taskMsg.pData = pRsp->msg;
+ taskMsg.len = pRsp->msgLen;
- ASSERT(rsp.msgIdx == *msgIdx);
+ ASSERT(pRsp->msgIdx == *msgIdx);
} else {
- rsp.msgIdx = *msgIdx;
- rsp.reqType = -1;
+ pRsp = &rsp;
+ pRsp->msgIdx = *msgIdx;
+ pRsp->reqType = -1;
+ pRsp->rspCode = 0;
taskMsg.msgType = -1;
taskMsg.pData = NULL;
taskMsg.len = 0;
@@ -72,20 +75,22 @@ int32_t ctgHandleBatchRsp(SCtgJob* pJob, SCtgTaskCallbackParam* cbParam, SDataBu
SCtgTaskReq tReq;
tReq.pTask = pTask;
- tReq.msgIdx = rsp.msgIdx;
+ tReq.msgIdx = pRsp->msgIdx;
SCtgMsgCtx* pMsgCtx = CTG_GET_TASK_MSGCTX(pTask, tReq.msgIdx);
pMsgCtx->pBatchs = pBatchs;
ctgDebug("QID:0x%" PRIx64 " ctg task %d idx %d start to handle rsp %s, pBatchs: %p", pJob->queryId, pTask->taskId,
- rsp.msgIdx, TMSG_INFO(taskMsg.msgType + 1), pBatchs);
+ pRsp->msgIdx, TMSG_INFO(taskMsg.msgType + 1), pBatchs);
- (*gCtgAsyncFps[pTask->type].handleRspFp)(&tReq, rsp.reqType, &taskMsg, (rsp.rspCode ? rsp.rspCode : rspCode));
+ (*gCtgAsyncFps[pTask->type].handleRspFp)(&tReq, pRsp->reqType, &taskMsg, (pRsp->rspCode ? pRsp->rspCode : rspCode));
}
CTG_ERR_JRET(ctgLaunchBatchs(pJob->pCtg, pJob, pBatchs));
_return:
+ taosArrayDestroyEx(batchRsp.pRsps, tFreeSBatchRspMsg);
+
ctgFreeBatchs(pBatchs);
CTG_RET(code);
}
@@ -481,7 +486,6 @@ int32_t ctgAddBatch(SCatalog* pCtg, int32_t vgId, SRequestConnInfo* pConn, SCtgT
if (NULL == taosArrayPush(newBatch.pMsgIdxs, &req.msgIdx)) {
CTG_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);
}
- newBatch.msgSize = sizeof(SBatchReq) + sizeof(req) + msgSize - POINTER_BYTES;
if (vgId > 0) {
SName* pName = NULL;
@@ -533,8 +537,6 @@ int32_t ctgAddBatch(SCatalog* pCtg, int32_t vgId, SRequestConnInfo* pConn, SCtgT
CTG_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);
}
- pBatch->msgSize += sizeof(req) + msgSize - POINTER_BYTES;
-
if (vgId > 0) {
SName* pName = NULL;
if (TDMT_VND_TABLE_CFG == msgType) {
@@ -570,38 +572,35 @@ _return:
return code;
}
-int32_t ctgBuildBatchReqMsg(SCtgBatch* pBatch, int32_t vgId, void** msg) {
- *msg = taosMemoryCalloc(1, pBatch->msgSize);
- if (NULL == (*msg)) {
- CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
- }
-
- int32_t offset = 0;
+int32_t ctgBuildBatchReqMsg(SCtgBatch* pBatch, int32_t vgId, void** msg, int32_t *pSize) {
int32_t num = taosArrayGetSize(pBatch->pMsgs);
- SBatchReq* pBatchReq = (SBatchReq*)(*msg);
-
if (num >= CTG_MAX_REQ_IN_BATCH) {
qError("too many msgs %d in one batch request", num);
CTG_ERR_RET(TSDB_CODE_CTG_INVALID_INPUT);
}
- pBatchReq->header.vgId = htonl(vgId);
- pBatchReq->msgNum = htonl(num);
- offset += sizeof(SBatchReq);
+ SBatchReq batchReq = {0};
- for (int32_t i = 0; i < num; ++i) {
- SBatchMsg* pReq = taosArrayGet(pBatch->pMsgs, i);
- *(int32_t*)((char*)(*msg) + offset) = htonl(pReq->msgIdx);
- offset += sizeof(pReq->msgIdx);
- *(int32_t*)((char*)(*msg) + offset) = htonl(pReq->msgType);
- offset += sizeof(pReq->msgType);
- *(int32_t*)((char*)(*msg) + offset) = htonl(pReq->msgLen);
- offset += sizeof(pReq->msgLen);
- memcpy((char*)(*msg) + offset, pReq->msg, pReq->msgLen);
- offset += pReq->msgLen;
+ batchReq.header.vgId = vgId;
+ batchReq.pMsgs = pBatch->pMsgs;
+
+ int32_t msgSize = tSerializeSBatchReq(NULL, 0, &batchReq);
+ if (msgSize < 0) {
+ qError("tSerializeSBatchReq failed");
+ CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
+ }
+
+ *msg = taosMemoryCalloc(1, msgSize);
+ if (NULL == (*msg)) {
+ qError("calloc batchReq msg failed, size:%d", msgSize);
+ CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
+ }
+ if (tSerializeSBatchReq(*msg, msgSize, &batchReq) < 0) {
+ qError("tSerializeSBatchReq failed");
+ CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
}
- ASSERT(pBatch->msgSize == offset);
+ *pSize = msgSize;
qDebug("batch req %d to vg %d msg built with %d meta reqs", pBatch->batchId, vgId, num);
@@ -616,12 +615,13 @@ int32_t ctgLaunchBatchs(SCatalog* pCtg, SCtgJob* pJob, SHashObj* pBatchs) {
size_t len = 0;
int32_t* vgId = taosHashGetKey(p, &len);
SCtgBatch* pBatch = (SCtgBatch*)p;
+ int32_t msgSize = 0;
ctgDebug("QID:0x%" PRIx64 " ctg start to launch batch %d", pJob->queryId, pBatch->batchId);
- CTG_ERR_JRET(ctgBuildBatchReqMsg(pBatch, *vgId, &msg));
+ CTG_ERR_JRET(ctgBuildBatchReqMsg(pBatch, *vgId, &msg, &msgSize));
code = ctgAsyncSendMsg(pCtg, &pBatch->conn, pJob, pBatch->pTaskIds, pBatch->batchId, pBatch->pMsgIdxs,
- pBatch->dbFName, *vgId, pBatch->msgType, msg, pBatch->msgSize);
+ pBatch->dbFName, *vgId, pBatch->msgType, msg, msgSize);
pBatch->pTaskIds = NULL;
CTG_ERR_JRET(code);
diff --git a/source/libs/executor/inc/executorimpl.h b/source/libs/executor/inc/executorimpl.h
index c330ee0596..a6bc4dfe97 100644
--- a/source/libs/executor/inc/executorimpl.h
+++ b/source/libs/executor/inc/executorimpl.h
@@ -484,7 +484,6 @@ typedef struct SStreamScanInfo {
STimeWindow updateWin;
STimeWindowAggSupp twAggSup;
SSDataBlock* pUpdateDataRes;
- SHashObj* pGroupIdTbNameMap;
// status for tmq
SNodeList* pGroupTags;
SNode* pTagCond;
@@ -592,7 +591,6 @@ typedef struct SStreamIntervalOperatorInfo {
SArray* pChildren;
SStreamState* pState;
SWinKey delKey;
- SHashObj* pGroupIdTbNameMap; // uint64_t -> char[TSDB_TABLE_NAME_LEN]
} SStreamIntervalOperatorInfo;
typedef struct SAggOperatorInfo {
@@ -725,7 +723,6 @@ typedef struct SStreamSessionAggOperatorInfo {
SPhysiNode* pPhyNode; // create new child
bool isFinal;
bool ignoreExpiredData;
- SHashObj* pGroupIdTbNameMap;
} SStreamSessionAggOperatorInfo;
typedef struct SStreamStateAggOperatorInfo {
@@ -741,7 +738,6 @@ typedef struct SStreamStateAggOperatorInfo {
void* pDelIterator;
SArray* pChildren; // cache for children's result;
bool ignoreExpiredData;
- SHashObj* pGroupIdTbNameMap;
} SStreamStateAggOperatorInfo;
typedef struct SStreamPartitionOperatorInfo {
diff --git a/source/libs/executor/inc/tsort.h b/source/libs/executor/inc/tsort.h
index 5591299d30..51440a7f59 100644
--- a/source/libs/executor/inc/tsort.h
+++ b/source/libs/executor/inc/tsort.h
@@ -163,9 +163,10 @@ SSortExecInfo tsortGetSortExecInfo(SSortHandle* pHandle);
/**
* get proper sort buffer pages according to the row size
* @param rowSize
+ * @param numOfCols columns count that be put into page
* @return
*/
-int32_t getProperSortPageSize(size_t rowSize);
+int32_t getProperSortPageSize(size_t rowSize, uint32_t numOfCols);
#ifdef __cplusplus
}
diff --git a/source/libs/executor/src/executorimpl.c b/source/libs/executor/src/executorimpl.c
index 2b4b274f97..0dd5765aa4 100644
--- a/source/libs/executor/src/executorimpl.c
+++ b/source/libs/executor/src/executorimpl.c
@@ -1048,7 +1048,7 @@ void doFilter(SSDataBlock* pBlock, SFilterInfo* pFilterInfo, SColMatchInfo* pCol
}
SFilterColumnParam param1 = {.numOfCols = taosArrayGetSize(pBlock->pDataBlock), .pDataBlock = pBlock->pDataBlock};
- int32_t code = filterSetDataFromSlotId(pFilterInfo, ¶m1);
+ int32_t code = filterSetDataFromSlotId(pFilterInfo, ¶m1);
SColumnInfoData* p = NULL;
int32_t status = 0;
@@ -1058,7 +1058,7 @@ void doFilter(SSDataBlock* pBlock, SFilterInfo* pFilterInfo, SColMatchInfo* pCol
extractQualifiedTupleByFilterResult(pBlock, p, keep, status);
if (pColMatchInfo != NULL) {
- size_t size = taosArrayGetSize(pColMatchInfo->pList);
+ size_t size = taosArrayGetSize(pColMatchInfo->pList);
for (int32_t i = 0; i < size; ++i) {
SColMatchItem* pInfo = taosArrayGet(pColMatchInfo->pList, i);
if (pInfo->colId == PRIMARYKEY_TIMESTAMP_COL_ID) {
@@ -1330,27 +1330,14 @@ void doBuildStreamResBlock(SOperatorInfo* pOperator, SOptrBasicInfo* pbInfo, SGr
pBlock->info.groupId = 0;
ASSERT(!pbInfo->mergeResultBlock);
doCopyToSDataBlock(pTaskInfo, pBlock, &pOperator->exprSupp, pBuf, pGroupResInfo);
- if (pOperator->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_STATE) {
- SStreamStateAggOperatorInfo* pInfo = pOperator->info;
- char* tbname = taosHashGet(pInfo->pGroupIdTbNameMap, &pBlock->info.groupId, sizeof(int64_t));
- if (tbname != NULL) {
- memcpy(pBlock->info.parTbName, tbname, TSDB_TABLE_NAME_LEN);
- } else {
- pBlock->info.parTbName[0] = 0;
- }
- } else if (pOperator->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_SESSION ||
- pOperator->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_SEMI_SESSION ||
- pOperator->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_SESSION) {
- SStreamSessionAggOperatorInfo* pInfo = pOperator->info;
-
- char* tbname = taosHashGet(pInfo->pGroupIdTbNameMap, &pBlock->info.groupId, sizeof(int64_t));
- if (tbname != NULL) {
- memcpy(pBlock->info.parTbName, tbname, TSDB_TABLE_NAME_LEN);
- } else {
- pBlock->info.parTbName[0] = 0;
- }
+ void* tbname = NULL;
+ if (streamStateGetParName(pTaskInfo->streamInfo.pState, pBlock->info.groupId, &tbname) < 0) {
+ pBlock->info.parTbName[0] = 0;
+ } else {
+ memcpy(pBlock->info.parTbName, tbname, TSDB_TABLE_NAME_LEN);
}
+ tdbFree(tbname);
}
void doBuildResultDatablock(SOperatorInfo* pOperator, SOptrBasicInfo* pbInfo, SGroupResInfo* pGroupResInfo,
@@ -2090,7 +2077,7 @@ static SSDataBlock* doFill(SOperatorInfo* pOperator) {
break;
}
- doFilter(fillResult, pOperator->exprSupp.pFilterInfo, &pInfo->matchInfo );
+ doFilter(fillResult, pOperator->exprSupp.pFilterInfo, &pInfo->matchInfo);
if (fillResult->info.rows > 0) {
break;
}
@@ -2317,9 +2304,9 @@ SOperatorInfo* createAggregateOperatorInfo(SOperatorInfo* downstream, SAggPhysiN
pInfo->binfo.mergeResultBlock = pAggNode->mergeDataBlock;
pInfo->groupId = UINT64_MAX;
- setOperatorInfo(pOperator, "TableAggregate", QUERY_NODE_PHYSICAL_PLAN_HASH_AGG, true, OP_NOT_OPENED, pInfo, pTaskInfo);
- pOperator->fpSet =
- createOperatorFpSet(doOpenAggregateOptr, getAggregateResult, NULL, destroyAggOperatorInfo, NULL);
+ setOperatorInfo(pOperator, "TableAggregate", QUERY_NODE_PHYSICAL_PLAN_HASH_AGG, true, OP_NOT_OPENED, pInfo,
+ pTaskInfo);
+ pOperator->fpSet = createOperatorFpSet(doOpenAggregateOptr, getAggregateResult, NULL, destroyAggOperatorInfo, NULL);
if (downstream->operatorType == QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN) {
STableScanInfo* pTableScanInfo = downstream->info;
@@ -3296,13 +3283,13 @@ int32_t buildDataBlockFromGroupRes(SOperatorInfo* pOperator, SStreamState* pStat
if (pBlock->info.groupId == 0) {
pBlock->info.groupId = pPos->groupId;
- SStreamIntervalOperatorInfo* pInfo = pOperator->info;
- char* tbname = taosHashGet(pInfo->pGroupIdTbNameMap, &pBlock->info.groupId, sizeof(int64_t));
- if (tbname != NULL) {
- memcpy(pBlock->info.parTbName, tbname, TSDB_TABLE_NAME_LEN);
- } else {
+ void* tbname = NULL;
+ if (streamStateGetParName(pTaskInfo->streamInfo.pState, pBlock->info.groupId, &tbname) < 0) {
pBlock->info.parTbName[0] = 0;
+ } else {
+ memcpy(pBlock->info.parTbName, tbname, TSDB_TABLE_NAME_LEN);
}
+ tdbFree(tbname);
} else {
// current value belongs to different group, it can't be packed into one datablock
if (pBlock->info.groupId != pPos->groupId) {
@@ -3388,30 +3375,13 @@ int32_t buildSessionResultDataBlock(SOperatorInfo* pOperator, SStreamState* pSta
if (pBlock->info.groupId == 0) {
pBlock->info.groupId = pKey->groupId;
- if (pOperator->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_STATE) {
- SStreamStateAggOperatorInfo* pInfo = pOperator->info;
-
- char* tbname = taosHashGet(pInfo->pGroupIdTbNameMap, &pBlock->info.groupId, sizeof(int64_t));
- if (tbname != NULL) {
- memcpy(pBlock->info.parTbName, tbname, TSDB_TABLE_NAME_LEN);
- } else {
- pBlock->info.parTbName[0] = 0;
- }
- } else if (pOperator->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_SESSION ||
- pOperator->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_SEMI_SESSION ||
- pOperator->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_SESSION) {
- SStreamSessionAggOperatorInfo* pInfo = pOperator->info;
-
- char* tbname = taosHashGet(pInfo->pGroupIdTbNameMap, &pBlock->info.groupId, sizeof(int64_t));
- if (tbname != NULL) {
- memcpy(pBlock->info.parTbName, tbname, TSDB_TABLE_NAME_LEN);
- } else {
- pBlock->info.parTbName[0] = 0;
- }
+ void* tbname = NULL;
+ if (streamStateGetParName(pTaskInfo->streamInfo.pState, pBlock->info.groupId, &tbname) < 0) {
+ pBlock->info.parTbName[0] = 0;
} else {
- ASSERT(0);
+ memcpy(pBlock->info.parTbName, tbname, TSDB_TABLE_NAME_LEN);
}
-
+ tdbFree(tbname);
} else {
// current value belongs to different group, it can't be packed into one datablock
if (pBlock->info.groupId != pKey->groupId) {
diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c
index 8e86cae4bd..5809a45ec5 100644
--- a/source/libs/executor/src/scanoperator.c
+++ b/source/libs/executor/src/scanoperator.c
@@ -521,7 +521,7 @@ static STableCachedVal* createTableCacheVal(const SMetaReader* pMetaReader) {
// only child table has tag value
if (pMetaReader->me.type == TSDB_CHILD_TABLE) {
- STag* pTag = (STag*) pMetaReader->me.ctbEntry.pTags;
+ STag* pTag = (STag*)pMetaReader->me.ctbEntry.pTags;
pVal->pTags = taosMemoryMalloc(pTag->len);
memcpy(pVal->pTags, pTag, pTag->len);
}
@@ -557,7 +557,8 @@ int32_t addTagPseudoColumnData(SReadHandle* pHandle, const SExprInfo* pExpr, int
code = metaGetTableEntryByUid(&mr, pBlock->info.uid);
if (code != TSDB_CODE_SUCCESS) {
if (terrno == TSDB_CODE_PAR_TABLE_NOT_EXIST) {
- qWarn("failed to get table meta, table may have been dropped, uid:0x%" PRIx64 ", code:%s, %s", pBlock->info.uid, tstrerror(terrno), idStr);
+ qWarn("failed to get table meta, table may have been dropped, uid:0x%" PRIx64 ", code:%s, %s", pBlock->info.uid,
+ tstrerror(terrno), idStr);
} else {
qError("failed to get table meta, uid:0x%" PRIx64 ", code:%s, %s", pBlock->info.uid, tstrerror(terrno), idStr);
}
@@ -580,9 +581,11 @@ int32_t addTagPseudoColumnData(SReadHandle* pHandle, const SExprInfo* pExpr, int
code = metaGetTableEntryByUid(&mr, pBlock->info.uid);
if (code != TSDB_CODE_SUCCESS) {
if (terrno == TSDB_CODE_PAR_TABLE_NOT_EXIST) {
- qWarn("failed to get table meta, table may have been dropped, uid:0x%" PRIx64 ", code:%s, %s", pBlock->info.uid, tstrerror(terrno), idStr);
+ qWarn("failed to get table meta, table may have been dropped, uid:0x%" PRIx64 ", code:%s, %s",
+ pBlock->info.uid, tstrerror(terrno), idStr);
} else {
- qError("failed to get table meta, uid:0x%" PRIx64 ", code:%s, %s", pBlock->info.uid, tstrerror(terrno), idStr);
+ qError("failed to get table meta, uid:0x%" PRIx64 ", code:%s, %s", pBlock->info.uid, tstrerror(terrno),
+ idStr);
}
metaReaderClear(&mr);
return terrno;
@@ -1537,7 +1540,9 @@ static int32_t generateDeleteResultBlock(SStreamScanInfo* pInfo, SSDataBlock* pS
groupId = getGroupIdByData(pInfo, srcUid, srcStartTsCol[i], version);
}
if (pInfo->tbnameCalSup.pExprInfo) {
- char* parTbname = taosHashGet(pInfo->pGroupIdTbNameMap, &groupId, sizeof(int64_t));
+ void* parTbname = NULL;
+ streamStateGetParName(pInfo->pStreamScanOp->pTaskInfo->streamInfo.pState, groupId, &parTbname);
+
memcpy(varDataVal(tbname), parTbname, TSDB_TABLE_NAME_LEN);
varDataSetLen(tbname, strlen(varDataVal(tbname)));
}
@@ -1587,15 +1592,18 @@ static void calBlockTag(SExprSupp* pTagCalSup, SSDataBlock* pBlock, SSDataBlock*
}
void calBlockTbName(SStreamScanInfo* pInfo, SSDataBlock* pBlock) {
- SExprSupp* pTbNameCalSup = &pInfo->tbnameCalSup;
+ SExprSupp* pTbNameCalSup = &pInfo->tbnameCalSup;
+ SStreamState* pState = pInfo->pStreamScanOp->pTaskInfo->streamInfo.pState;
if (pTbNameCalSup == NULL || pTbNameCalSup->numOfExprs == 0) return;
if (pBlock == NULL || pBlock->info.rows == 0) return;
- if (pBlock->info.groupId) {
- char* tbname = taosHashGet(pInfo->pGroupIdTbNameMap, &pBlock->info.groupId, sizeof(int64_t));
- if (tbname != NULL) {
- memcpy(pBlock->info.parTbName, tbname, TSDB_TABLE_NAME_LEN);
- }
+
+ void* tbname = NULL;
+ if (streamStateGetParName(pInfo->pStreamScanOp->pTaskInfo->streamInfo.pState, pBlock->info.groupId, &tbname) < 0) {
+ pBlock->info.parTbName[0] = 0;
+ } else {
+ memcpy(pBlock->info.parTbName, tbname, TSDB_TABLE_NAME_LEN);
}
+ tdbFree(tbname);
SSDataBlock* pSrcBlock = blockCopyOneRow(pBlock, 0);
ASSERT(pSrcBlock->info.rows == 1);
@@ -1623,9 +1631,8 @@ void calBlockTbName(SStreamScanInfo* pInfo, SSDataBlock* pBlock) {
pBlock->info.parTbName[0] = 0;
}
- if (pBlock->info.groupId) {
- taosHashPut(pInfo->pGroupIdTbNameMap, &pBlock->info.groupId, sizeof(int64_t), pBlock->info.parTbName,
- TSDB_TABLE_NAME_LEN);
+ if (pBlock->info.groupId && pBlock->info.parTbName[0]) {
+ streamStatePutParName(pState, pBlock->info.groupId, pBlock->info.parTbName);
}
blockDataDestroy(pSrcBlock);
@@ -2028,6 +2035,9 @@ FETCH_NEXT_BLOCK:
int32_t current = pInfo->validBlockIndex++;
SSDataBlock* pBlock = taosArrayGetP(pInfo->pBlockLists, current);
+ if (pBlock->info.groupId && pBlock->info.parTbName[0]) {
+ streamStatePutParName(pTaskInfo->streamInfo.pState, pBlock->info.groupId, pBlock->info.parTbName);
+ }
// TODO move into scan
pBlock->info.calWin.skey = INT64_MIN;
pBlock->info.calWin.ekey = INT64_MAX;
@@ -2426,7 +2436,6 @@ static void destroyStreamScanOperatorInfo(void* param) {
}
cleanupExprSupp(&pStreamScan->tbnameCalSup);
- taosHashCleanup(pStreamScan->pGroupIdTbNameMap);
updateInfoDestroy(pStreamScan->pUpdateInfo);
blockDataDestroy(pStreamScan->pRes);
@@ -2484,8 +2493,6 @@ SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhys
if (initExprSupp(&pInfo->tbnameCalSup, pSubTableExpr, 1) != 0) {
goto _error;
}
- pInfo->pGroupIdTbNameMap =
- taosHashInit(1024, taosGetDefaultHashFunction(TSDB_DATA_TYPE_UBIGINT), false, HASH_NO_LOCK);
}
if (pTableScanNode->pTags != NULL) {
@@ -4557,6 +4564,7 @@ int32_t stopGroupTableMergeScan(SOperatorInfo* pOperator) {
taosArrayClear(pInfo->sortSourceParams);
tsortDestroySortHandle(pInfo->pSortHandle);
+ pInfo->pSortHandle = NULL;
for (int32_t i = 0; i < taosArrayGetSize(pInfo->queryConds); i++) {
SQueryTableDataCond* cond = taosArrayGet(pInfo->queryConds, i);
@@ -4655,6 +4663,8 @@ void destroyTableMergeScanOperatorInfo(void* param) {
}
taosArrayDestroy(pTableScanInfo->sortSourceParams);
+ tsortDestroySortHandle(pTableScanInfo->pSortHandle);
+ pTableScanInfo->pSortHandle = NULL;
tsdbReaderClose(pTableScanInfo->base.dataReader);
pTableScanInfo->base.dataReader = NULL;
@@ -4753,8 +4763,9 @@ SOperatorInfo* createTableMergeScanOperatorInfo(STableScanPhysiNode* pTableScanN
pInfo->pSortInputBlock = createOneDataBlock(pInfo->pResBlock, false);
initLimitInfo(pTableScanNode->scan.node.pLimit, pTableScanNode->scan.node.pSlimit, &pInfo->limitInfo);
- int32_t rowSize = pInfo->pResBlock->info.rowSize;
- pInfo->bufPageSize = getProperSortPageSize(rowSize);
+ int32_t rowSize = pInfo->pResBlock->info.rowSize;
+ uint32_t nCols = taosArrayGetSize(pInfo->pResBlock->pDataBlock);
+ pInfo->bufPageSize = getProperSortPageSize(rowSize, nCols);
setOperatorInfo(pOperator, "TableMergeScanOperator", QUERY_NODE_PHYSICAL_PLAN_TABLE_MERGE_SCAN, false, OP_NOT_OPENED,
pInfo, pTaskInfo);
diff --git a/source/libs/executor/src/sortoperator.c b/source/libs/executor/src/sortoperator.c
index fc53623d44..add580ce7c 100644
--- a/source/libs/executor/src/sortoperator.c
+++ b/source/libs/executor/src/sortoperator.c
@@ -760,7 +760,8 @@ SOperatorInfo* createMultiwayMergeOperatorInfo(SOperatorInfo** downStreams, size
pInfo->groupSort = pMergePhyNode->groupSort;
pInfo->pSortInfo = createSortInfo(pMergePhyNode->pMergeKeys);
pInfo->pInputBlock = pInputBlock;
- pInfo->bufPageSize = getProperSortPageSize(rowSize);
+ size_t numOfCols = taosArrayGetSize(pInfo->binfo.pRes->pDataBlock);
+ pInfo->bufPageSize = getProperSortPageSize(rowSize, numOfCols);
pInfo->sortBufSize = pInfo->bufPageSize * (numStreams + 1); // one additional is reserved for merged result.
setOperatorInfo(pOperator, "MultiwayMergeOperator", QUERY_NODE_PHYSICAL_PLAN_MERGE, false, OP_NOT_OPENED, pInfo, pTaskInfo);
diff --git a/source/libs/executor/src/timewindowoperator.c b/source/libs/executor/src/timewindowoperator.c
index bf1d146b13..0573450be2 100644
--- a/source/libs/executor/src/timewindowoperator.c
+++ b/source/libs/executor/src/timewindowoperator.c
@@ -1450,7 +1450,6 @@ static int32_t closeStreamIntervalWindow(SSHashObj* pHashMap, STimeWindowAggSupp
}
}
tSimpleHashIterateRemove(pHashMap, pWinKey, sizeof(SWinKey), &pIte, &iter);
- /*taosHashRemove(pInfo->pGroupIdTbNameMap, &pWinKey->groupId, sizeof(int64_t));*/
}
}
return TSDB_CODE_SUCCESS;
@@ -1547,7 +1546,8 @@ static void doBuildDeleteResult(SStreamIntervalOperatorInfo* pInfo, SArray* pWin
uint64_t uid = 0;
for (int32_t i = *index; i < size; i++) {
SWinKey* pWin = taosArrayGet(pWins, i);
- char* tbname = taosHashGet(pInfo->pGroupIdTbNameMap, &pWin->groupId, sizeof(int64_t));
+ void* tbname = NULL;
+ streamStateGetParName(pInfo->pState, pWin->groupId, &tbname);
if (tbname == NULL) {
appendOneRowToStreamSpecialBlock(pBlock, &pWin->ts, &pWin->ts, &uid, &pWin->groupId, NULL);
} else {
@@ -1555,6 +1555,7 @@ static void doBuildDeleteResult(SStreamIntervalOperatorInfo* pInfo, SArray* pWin
STR_WITH_MAXSIZE_TO_VARSTR(parTbName, tbname, sizeof(parTbName));
appendOneRowToStreamSpecialBlock(pBlock, &pWin->ts, &pWin->ts, &uid, &pWin->groupId, parTbName);
}
+ tdbFree(tbname);
(*index)++;
}
}
@@ -1610,17 +1611,13 @@ void destroyStreamFinalIntervalOperatorInfo(void* param) {
int32_t size = taosArrayGetSize(pInfo->pChildren);
for (int32_t i = 0; i < size; i++) {
SOperatorInfo* pChildOp = taosArrayGetP(pInfo->pChildren, i);
- destroyStreamFinalIntervalOperatorInfo(pChildOp->info);
- taosMemoryFree(pChildOp->pDownstream);
- cleanupExprSupp(&pChildOp->exprSupp);
- taosMemoryFreeClear(pChildOp);
+ destroyOperatorInfo(pChildOp);
}
taosArrayDestroy(pInfo->pChildren);
}
nodesDestroyNode((SNode*)pInfo->pPhyNode);
colDataDestroy(&pInfo->twAggSup.timeWindowData);
cleanupGroupResInfo(&pInfo->groupResInfo);
- taosHashCleanup(pInfo->pGroupIdTbNameMap);
taosMemoryFreeClear(param);
}
@@ -2548,9 +2545,11 @@ SOperatorInfo* createTimeSliceOperatorInfo(SOperatorInfo* downstream, SPhysiNode
pInfo->interval.interval = pInterpPhyNode->interval;
pInfo->current = pInfo->win.skey;
- STableScanInfo* pScanInfo = (STableScanInfo*)downstream->info;
- pScanInfo->base.cond.twindows = pInfo->win;
- pScanInfo->base.cond.type = TIMEWINDOW_RANGE_EXTERNAL;
+ if (downstream->operatorType == QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN) {
+ STableScanInfo* pScanInfo = (STableScanInfo*)downstream->info;
+ pScanInfo->base.cond.twindows = pInfo->win;
+ pScanInfo->base.cond.type = TIMEWINDOW_RANGE_EXTERNAL;
+ }
setOperatorInfo(pOperator, "TimeSliceOperator", QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC, false, OP_NOT_OPENED, pInfo,
pTaskInfo);
@@ -3156,11 +3155,6 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) {
}
printDataBlock(pBlock, IS_FINAL_OP(pInfo) ? "interval final recv" : "interval semi recv");
- if (pBlock->info.parTbName[0]) {
- taosHashPut(pInfo->pGroupIdTbNameMap, &pBlock->info.groupId, sizeof(int64_t), &pBlock->info.parTbName,
- TSDB_TABLE_NAME_LEN);
- }
-
ASSERT(pBlock->info.type != STREAM_INVERT);
if (pBlock->info.type == STREAM_NORMAL || pBlock->info.type == STREAM_PULL_DATA) {
pInfo->binfo.pRes->info.type = pBlock->info.type;
@@ -3375,9 +3369,6 @@ SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream,
pInfo->delKey.ts = INT64_MAX;
pInfo->delKey.groupId = 0;
- pInfo->pGroupIdTbNameMap =
- taosHashInit(1024, taosGetDefaultHashFunction(TSDB_DATA_TYPE_UBIGINT), false, HASH_NO_LOCK);
-
pOperator->operatorType = pPhyNode->type;
pOperator->blocking = true;
pOperator->status = OP_NOT_OPENED;
@@ -3418,18 +3409,16 @@ void destroyStreamSessionAggOperatorInfo(void* param) {
if (pInfo->pChildren != NULL) {
int32_t size = taosArrayGetSize(pInfo->pChildren);
for (int32_t i = 0; i < size; i++) {
- SOperatorInfo* pChild = taosArrayGetP(pInfo->pChildren, i);
- SStreamSessionAggOperatorInfo* pChInfo = pChild->info;
- destroyStreamSessionAggOperatorInfo(pChInfo);
- taosMemoryFreeClear(pChild);
+ SOperatorInfo* pChild = taosArrayGetP(pInfo->pChildren, i);
+ destroyOperatorInfo(pChild);
}
+ taosArrayDestroy(pInfo->pChildren);
}
colDataDestroy(&pInfo->twAggSup.timeWindowData);
blockDataDestroy(pInfo->pDelRes);
blockDataDestroy(pInfo->pWinBlock);
blockDataDestroy(pInfo->pUpdateRes);
tSimpleHashCleanup(pInfo->pStDeleted);
- taosHashCleanup(pInfo->pGroupIdTbNameMap);
taosMemoryFreeClear(param);
}
@@ -3470,7 +3459,9 @@ void initDownStream(SOperatorInfo* downstream, SStreamAggSupporter* pAggSup, int
}
SStreamScanInfo* pScanInfo = downstream->info;
pScanInfo->windowSup = (SWindowSupporter){.pStreamAggSup = pAggSup, .gap = pAggSup->gap, .parentType = type};
- pScanInfo->pUpdateInfo = updateInfoInit(60000, TSDB_TIME_PRECISION_MILLI, waterMark);
+ if (!pScanInfo->pUpdateInfo) {
+ pScanInfo->pUpdateInfo = updateInfoInit(60000, TSDB_TIME_PRECISION_MILLI, waterMark);
+ }
}
int32_t initStreamAggSupporter(SStreamAggSupporter* pSup, SqlFunctionCtx* pCtx, int32_t numOfOutput, int64_t gap,
@@ -3859,30 +3850,18 @@ void doBuildDeleteDataBlock(SOperatorInfo* pOp, SSHashObj* pStDeleted, SSDataBlo
SColumnInfoData* pCalEdCol = taosArrayGet(pBlock->pDataBlock, CALCULATE_END_TS_COLUMN_INDEX);
colDataAppendNULL(pCalEdCol, pBlock->info.rows);
- SHashObj* pGroupIdTbNameMap = NULL;
- if (pOp->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_SESSION ||
- pOp->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_SEMI_SESSION ||
- pOp->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_SESSION) {
- SStreamSessionAggOperatorInfo* pInfo = pOp->info;
- pGroupIdTbNameMap = pInfo->pGroupIdTbNameMap;
- } else if (pOp->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_STATE) {
- SStreamStateAggOperatorInfo* pInfo = pOp->info;
- pGroupIdTbNameMap = pInfo->pGroupIdTbNameMap;
- } else {
- ASSERT(0);
- }
-
- char* tbname = taosHashGet(pGroupIdTbNameMap, &res->groupId, sizeof(int64_t));
SColumnInfoData* pTableCol = taosArrayGet(pBlock->pDataBlock, TABLE_NAME_COLUMN_INDEX);
+
+ void* tbname = NULL;
+ streamStateGetParName(pOp->pTaskInfo->streamInfo.pState, res->groupId, &tbname);
if (tbname == NULL) {
- /*printf("\n\n no tbname for group id %" PRId64 "%p %p\n\n", res->groupId, pOp->info, pGroupIdTbNameMap);*/
colDataAppendNULL(pTableCol, pBlock->info.rows);
} else {
char parTbName[VARSTR_HEADER_SIZE + TSDB_TABLE_NAME_LEN];
STR_WITH_MAXSIZE_TO_VARSTR(parTbName, tbname, sizeof(parTbName));
colDataAppend(pTableCol, pBlock->info.rows, (const char*)parTbName, false);
- /*printf("\n\n get tbname %s group id %" PRId64 "\n\n", tbname, res->groupId);*/
}
+ tdbFree(tbname);
pBlock->info.rows += 1;
}
if ((*Ite) == NULL) {
@@ -4055,19 +4034,6 @@ static SSDataBlock* doStreamSessionAgg(SOperatorInfo* pOperator) {
}
printDataBlock(pBlock, IS_FINAL_OP(pInfo) ? "final session recv" : "single session recv");
- if (pBlock->info.parTbName[0]) {
- taosHashPut(pInfo->pGroupIdTbNameMap, &pBlock->info.groupId, sizeof(int64_t), &pBlock->info.parTbName,
- TSDB_TABLE_NAME_LEN);
- /*printf("\n\n put tbname %s group id %" PRId64 "\n\n into %p %p", pBlock->info.parTbName, pBlock->info.groupId,*/
- /*pInfo, pInfo->pGroupIdTbNameMap);*/
- }
-
- if (pBlock->info.parTbName[0]) {
- taosHashPut(pInfo->pGroupIdTbNameMap, &pBlock->info.groupId, sizeof(int64_t), &pBlock->info.parTbName,
- TSDB_TABLE_NAME_LEN);
- /*printf("\n\n put tbname %s\n\n", pBlock->info.parTbName);*/
- }
-
if (pBlock->info.type == STREAM_DELETE_DATA || pBlock->info.type == STREAM_DELETE_RESULT ||
pBlock->info.type == STREAM_CLEAR) {
SArray* pWins = taosArrayInit(16, sizeof(SSessionKey));
@@ -4211,8 +4177,6 @@ SOperatorInfo* createStreamSessionAggOperatorInfo(SOperatorInfo* downstream, SPh
pInfo->isFinal = false;
pInfo->pPhyNode = pPhyNode;
pInfo->ignoreExpiredData = pSessionNode->window.igExpired;
- pInfo->pGroupIdTbNameMap =
- taosHashInit(1024, taosGetDefaultHashFunction(TSDB_DATA_TYPE_UBIGINT), false, HASH_NO_LOCK);
setOperatorInfo(pOperator, "StreamSessionWindowAggOperator", QUERY_NODE_PHYSICAL_PLAN_STREAM_SESSION, true,
OP_NOT_OPENED, pInfo, pTaskInfo);
@@ -4287,12 +4251,6 @@ static SSDataBlock* doStreamSessionSemiAgg(SOperatorInfo* pOperator) {
}
printDataBlock(pBlock, "semi session recv");
- if (pBlock->info.parTbName[0]) {
- taosHashPut(pInfo->pGroupIdTbNameMap, &pBlock->info.groupId, sizeof(int64_t), &pBlock->info.parTbName,
- TSDB_TABLE_NAME_LEN);
- /*printf("\n\n put tbname %s\n\n", pBlock->info.parTbName);*/
- }
-
if (pBlock->info.type == STREAM_DELETE_DATA || pBlock->info.type == STREAM_DELETE_RESULT ||
pBlock->info.type == STREAM_CLEAR) {
// gap must be 0
@@ -4374,9 +4332,6 @@ SOperatorInfo* createStreamFinalSessionAggOperatorInfo(SOperatorInfo* downstream
setOperatorInfo(pOperator, name, pPhyNode->type, false, OP_NOT_OPENED, pInfo, pTaskInfo);
- pInfo->pGroupIdTbNameMap =
- taosHashInit(1024, taosGetDefaultHashFunction(TSDB_DATA_TYPE_UBIGINT), false, HASH_NO_LOCK);
-
pOperator->operatorType = pPhyNode->type;
if (numOfChild > 0) {
pInfo->pChildren = taosArrayInit(numOfChild, sizeof(void*));
@@ -4415,16 +4370,14 @@ void destroyStreamStateOperatorInfo(void* param) {
if (pInfo->pChildren != NULL) {
int32_t size = taosArrayGetSize(pInfo->pChildren);
for (int32_t i = 0; i < size; i++) {
- SOperatorInfo* pChild = taosArrayGetP(pInfo->pChildren, i);
- SStreamSessionAggOperatorInfo* pChInfo = pChild->info;
- destroyStreamSessionAggOperatorInfo(pChInfo);
- taosMemoryFreeClear(pChild);
+ SOperatorInfo* pChild = taosArrayGetP(pInfo->pChildren, i);
+ destroyOperatorInfo(pChild);
}
+ taosArrayDestroy(pInfo->pChildren);
}
colDataDestroy(&pInfo->twAggSup.timeWindowData);
blockDataDestroy(pInfo->pDelRes);
tSimpleHashCleanup(pInfo->pSeDeleted);
- taosHashCleanup(pInfo->pGroupIdTbNameMap);
taosMemoryFreeClear(param);
}
@@ -4618,12 +4571,6 @@ static SSDataBlock* doStreamStateAgg(SOperatorInfo* pOperator) {
}
printDataBlock(pBlock, "single state recv");
- if (pBlock->info.parTbName[0]) {
- taosHashPut(pInfo->pGroupIdTbNameMap, &pBlock->info.groupId, sizeof(int64_t), &pBlock->info.parTbName,
- TSDB_TABLE_NAME_LEN);
- /*printf("\n\n put tbname %s\n\n", pBlock->info.parTbName);*/
- }
-
if (pBlock->info.type == STREAM_DELETE_DATA || pBlock->info.type == STREAM_DELETE_RESULT ||
pBlock->info.type == STREAM_CLEAR) {
SArray* pWins = taosArrayInit(16, sizeof(SSessionKey));
@@ -4737,9 +4684,6 @@ SOperatorInfo* createStreamStateAggOperatorInfo(SOperatorInfo* downstream, SPhys
pInfo->pChildren = NULL;
pInfo->ignoreExpiredData = pStateNode->window.igExpired;
- pInfo->pGroupIdTbNameMap =
- taosHashInit(1024, taosGetDefaultHashFunction(TSDB_DATA_TYPE_UBIGINT), false, HASH_NO_LOCK);
-
setOperatorInfo(pOperator, "StreamStateAggOperator", QUERY_NODE_PHYSICAL_PLAN_STREAM_STATE, true, OP_NOT_OPENED,
pInfo, pTaskInfo);
pOperator->fpSet =
@@ -5390,12 +5334,6 @@ static SSDataBlock* doStreamIntervalAgg(SOperatorInfo* pOperator) {
}
printDataBlock(pBlock, "single interval recv");
- if (pBlock->info.parTbName[0]) {
- taosHashPut(pInfo->pGroupIdTbNameMap, &pBlock->info.groupId, sizeof(int64_t), &pBlock->info.parTbName,
- TSDB_TABLE_NAME_LEN);
- /*printf("\n\n put tbname %s\n\n", pBlock->info.parTbName);*/
- }
-
if (pBlock->info.type == STREAM_DELETE_DATA || pBlock->info.type == STREAM_DELETE_RESULT ||
pBlock->info.type == STREAM_CLEAR) {
doDeleteWindows(pOperator, &pInfo->interval, pBlock, pInfo->pDelWins, pUpdatedMap);
@@ -5553,9 +5491,6 @@ SOperatorInfo* createStreamIntervalOperatorInfo(SOperatorInfo* downstream, SPhys
pInfo->delKey.ts = INT64_MAX;
pInfo->delKey.groupId = 0;
- pInfo->pGroupIdTbNameMap =
- taosHashInit(1024, taosGetDefaultHashFunction(TSDB_DATA_TYPE_UBIGINT), false, HASH_NO_LOCK);
-
setOperatorInfo(pOperator, "StreamIntervalOperator", QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERVAL, true, OP_NOT_OPENED,
pInfo, pTaskInfo);
pOperator->fpSet =
diff --git a/source/libs/executor/src/tsort.c b/source/libs/executor/src/tsort.c
index 71fad2e27c..9c10b51b1f 100644
--- a/source/libs/executor/src/tsort.c
+++ b/source/libs/executor/src/tsort.c
@@ -584,15 +584,11 @@ static int32_t doInternalMergeSort(SSortHandle* pHandle) {
return 0;
}
-// TODO consider the page meta size
-int32_t getProperSortPageSize(size_t rowSize) {
- uint32_t defaultPageSize = 4096;
-
- uint32_t pgSize = 0;
- if (rowSize * 4 > defaultPageSize) {
- pgSize = rowSize * 4;
- } else {
- pgSize = defaultPageSize;
+// get sort page size
+int32_t getProperSortPageSize(size_t rowSize, uint32_t numOfCols) {
+ uint32_t pgSize = rowSize * 4 + blockDataGetSerialMetaSize(numOfCols);
+ if (pgSize < DEFAULT_PAGESIZE) {
+ return DEFAULT_PAGESIZE;
}
return pgSize;
@@ -612,7 +608,8 @@ static int32_t createInitialSources(SSortHandle* pHandle) {
}
if (pHandle->pDataBlock == NULL) {
- pHandle->pageSize = getProperSortPageSize(blockDataGetRowSize(pBlock));
+ uint32_t numOfCols = taosArrayGetSize(pBlock->pDataBlock);
+ pHandle->pageSize = getProperSortPageSize(blockDataGetRowSize(pBlock), numOfCols);
// todo, number of pages are set according to the total available sort buffer
pHandle->numOfPages = 1024;
diff --git a/source/libs/function/src/builtinsimpl.c b/source/libs/function/src/builtinsimpl.c
index 23abf90b51..87e15370e4 100644
--- a/source/libs/function/src/builtinsimpl.c
+++ b/source/libs/function/src/builtinsimpl.c
@@ -48,8 +48,8 @@ typedef struct SSumRes {
double dsum;
};
int16_t type;
- int64_t prevTs; // used for csum only
- bool isPrevTsSet; //used for csum only
+ int64_t prevTs; // used for csum only
+ bool isPrevTsSet; // used for csum only
} SSumRes;
@@ -2220,8 +2220,8 @@ bool leastSQRFunctionSetup(SqlFunctionCtx* pCtx, SResultRowEntryInfo* pResultInf
SLeastSQRInfo* pInfo = GET_ROWCELL_INTERBUF(pResultInfo);
- pInfo->startVal = IS_FLOAT_TYPE(pCtx->param[1].param.nType) ? pCtx->param[1].param.d : (double)pCtx->param[1].param.i;
- pInfo->stepVal = IS_FLOAT_TYPE(pCtx->param[2].param.nType) ? pCtx->param[2].param.d : (double)pCtx->param[2].param.i;
+ GET_TYPED_DATA(pInfo->startVal, double, pCtx->param[1].param.nType, &pCtx->param[1].param.i);
+ GET_TYPED_DATA(pInfo->stepVal, double, pCtx->param[2].param.nType, &pCtx->param[2].param.i);
return true;
}
@@ -2565,8 +2565,8 @@ int32_t percentileFunction(SqlFunctionCtx* pCtx) {
int32_t percentileFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
SVariant* pVal = &pCtx->param[1].param;
- double v =
- (IS_SIGNED_NUMERIC_TYPE(pVal->nType) ? pVal->i : (IS_UNSIGNED_NUMERIC_TYPE(pVal->nType) ? pVal->u : pVal->d));
+ double v = 0;
+ GET_TYPED_DATA(v, double, pVal->nType, &pVal->i);
SResultRowEntryInfo* pResInfo = GET_RES_INFO(pCtx);
SPercentileInfo* ppInfo = (SPercentileInfo*)GET_ROWCELL_INTERBUF(pResInfo);
@@ -2625,8 +2625,8 @@ bool apercentileFunctionSetup(SqlFunctionCtx* pCtx, SResultRowEntryInfo* pResult
SAPercentileInfo* pInfo = GET_ROWCELL_INTERBUF(pResultInfo);
SVariant* pVal = &pCtx->param[1].param;
- pInfo->percent =
- (IS_SIGNED_NUMERIC_TYPE(pVal->nType) ? pVal->i : (IS_UNSIGNED_NUMERIC_TYPE(pVal->nType) ? pVal->u : pVal->d));
+ pInfo->percent = 0;
+ GET_TYPED_DATA(pInfo->percent, double, pVal->nType, &pVal->i);
if (pCtx->numOfParams == 2) {
pInfo->algo = APERCT_ALGO_DEFAULT;
@@ -3722,6 +3722,12 @@ static int32_t topBotResComparFn(const void* p1, const void* p2, const void* par
}
return (val1->v.u > val2->v.u) ? 1 : -1;
+ } else if (TSDB_DATA_TYPE_FLOAT == type) {
+ if (val1->v.f == val2->v.f) {
+ return 0;
+ }
+
+ return (val1->v.f > val2->v.f) ? 1 : -1;
}
if (val1->v.d == val2->v.d) {
@@ -3762,10 +3768,12 @@ void doAddIntoResult(SqlFunctionCtx* pCtx, void* pData, int32_t rowIndex, SSData
} else { // replace the minimum value in the result
if ((isTopQuery && ((IS_SIGNED_NUMERIC_TYPE(type) && val.i > pItems[0].v.i) ||
(IS_UNSIGNED_NUMERIC_TYPE(type) && val.u > pItems[0].v.u) ||
- (IS_FLOAT_TYPE(type) && val.d > pItems[0].v.d))) ||
+ (TSDB_DATA_TYPE_FLOAT == type && val.f > pItems[0].v.f) ||
+ (TSDB_DATA_TYPE_DOUBLE == type && val.d > pItems[0].v.d))) ||
(!isTopQuery && ((IS_SIGNED_NUMERIC_TYPE(type) && val.i < pItems[0].v.i) ||
(IS_UNSIGNED_NUMERIC_TYPE(type) && val.u < pItems[0].v.u) ||
- (IS_FLOAT_TYPE(type) && val.d < pItems[0].v.d)))) {
+ (TSDB_DATA_TYPE_FLOAT == type && val.f < pItems[0].v.f) ||
+ (TSDB_DATA_TYPE_DOUBLE == type && val.d < pItems[0].v.d)))) {
// replace the old data and the coresponding tuple data
STopBotResItem* pItem = &pItems[0];
pItem->v = val;
@@ -3928,12 +3936,7 @@ int32_t topBotFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
}
for (int32_t i = 0; i < pEntryInfo->numOfRes; ++i) {
STopBotResItem* pItem = &pRes->pItems[i];
- if (type == TSDB_DATA_TYPE_FLOAT) {
- float v = pItem->v.d;
- colDataAppend(pCol, currentRow, (const char*)&v, false);
- } else {
- colDataAppend(pCol, currentRow, (const char*)&pItem->v.i, false);
- }
+ colDataAppend(pCol, currentRow, (const char*)&pItem->v.i, false);
#ifdef BUF_PAGE_DEBUG
qDebug("page_finalize i:%d,item:%p,pageId:%d, offset:%d\n", i, pItem, pItem->tuplePos.pageId,
pItem->tuplePos.offset);
@@ -3964,10 +3967,12 @@ void addResult(SqlFunctionCtx* pCtx, STopBotResItem* pSourceItem, int16_t type,
} else { // replace the minimum value in the result
if ((isTopQuery && ((IS_SIGNED_NUMERIC_TYPE(type) && pSourceItem->v.i > pItems[0].v.i) ||
(IS_UNSIGNED_NUMERIC_TYPE(type) && pSourceItem->v.u > pItems[0].v.u) ||
- (IS_FLOAT_TYPE(type) && pSourceItem->v.d > pItems[0].v.d))) ||
+ (TSDB_DATA_TYPE_FLOAT == type && pSourceItem->v.f > pItems[0].v.f) ||
+ (TSDB_DATA_TYPE_DOUBLE == type && pSourceItem->v.d > pItems[0].v.d))) ||
(!isTopQuery && ((IS_SIGNED_NUMERIC_TYPE(type) && pSourceItem->v.i < pItems[0].v.i) ||
(IS_UNSIGNED_NUMERIC_TYPE(type) && pSourceItem->v.u < pItems[0].v.u) ||
- (IS_FLOAT_TYPE(type) && pSourceItem->v.d < pItems[0].v.d)))) {
+ (TSDB_DATA_TYPE_FLOAT == type && pSourceItem->v.f < pItems[0].v.f) ||
+ (TSDB_DATA_TYPE_DOUBLE == type && pSourceItem->v.d < pItems[0].v.d)))) {
// replace the old data and the coresponding tuple data
STopBotResItem* pItem = &pItems[0];
pItem->v = pSourceItem->v;
@@ -6038,7 +6043,7 @@ int32_t twaFinalize(struct SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
} else {
if (pInfo->win.ekey == pInfo->win.skey) {
pInfo->dOutput = pInfo->p.val;
- } else if (pInfo->win.ekey == INT64_MAX || pInfo->win.skey == INT64_MIN) { //no data in timewindow
+ } else if (pInfo->win.ekey == INT64_MAX || pInfo->win.skey == INT64_MIN) { // no data in timewindow
pInfo->dOutput = 0;
} else {
pInfo->dOutput = pInfo->dOutput / (pInfo->win.ekey - pInfo->win.skey);
diff --git a/source/libs/nodes/src/nodesUtilFuncs.c b/source/libs/nodes/src/nodesUtilFuncs.c
index cc1bae6a3c..8c1a85b101 100644
--- a/source/libs/nodes/src/nodesUtilFuncs.c
+++ b/source/libs/nodes/src/nodesUtilFuncs.c
@@ -2036,6 +2036,8 @@ void nodesValueNodeToVariant(const SValueNode* pNode, SVariant* pVal) {
pVal->u = pNode->datum.u;
break;
case TSDB_DATA_TYPE_FLOAT:
+ pVal->f = pNode->datum.d;
+ break;
case TSDB_DATA_TYPE_DOUBLE:
pVal->d = pNode->datum.d;
break;
diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c
index 9883c81819..54f450e971 100644
--- a/source/libs/parser/src/parTranslater.c
+++ b/source/libs/parser/src/parTranslater.c
@@ -2762,17 +2762,17 @@ static bool needFill(SNode* pNode) {
return hasFillFunc;
}
-static bool mismatchFillDataType(SDataType origDt, SDataType fillDt) {
- if (TSDB_DATA_TYPE_NULL == fillDt.type) {
- return false;
+static int32_t convertFillValue(STranslateContext* pCxt, SDataType dt, SNodeList* pValues, int32_t index) {
+ SListCell* pCell = nodesListGetCell(pValues, index);
+ if (dataTypeEqual(&dt, &((SExprNode*)pCell->pNode)->resType)) {
+ return TSDB_CODE_SUCCESS;
}
- if (IS_NUMERIC_TYPE(origDt.type) && !IS_NUMERIC_TYPE(fillDt.type)) {
- return true;
+ SNode* pCaseFunc = NULL;
+ int32_t code = createCastFunc(pCxt, pCell->pNode, dt, &pCaseFunc);
+ if (TSDB_CODE_SUCCESS == code) {
+ code = scalarCalculateConstants(pCaseFunc, &pCell->pNode);
}
- if (IS_VAR_DATA_TYPE(origDt.type) && !IS_VAR_DATA_TYPE(fillDt.type)) {
- return true;
- }
- return false;
+ return code;
}
static int32_t checkFillValues(STranslateContext* pCxt, SFillNode* pFill, SNodeList* pProjectionList) {
@@ -2788,8 +2788,8 @@ static int32_t checkFillValues(STranslateContext* pCxt, SFillNode* pFill, SNodeL
if (fillNo >= LIST_LENGTH(pFillValues->pNodeList)) {
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_WRONG_VALUE_TYPE, "Filled values number mismatch");
}
- if (mismatchFillDataType(((SExprNode*)pProject)->resType,
- ((SExprNode*)nodesListGetNode(pFillValues->pNodeList, fillNo))->resType)) {
+ if (TSDB_CODE_SUCCESS !=
+ convertFillValue(pCxt, ((SExprNode*)pProject)->resType, pFillValues->pNodeList, fillNo)) {
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_WRONG_VALUE_TYPE, "Filled data type mismatch");
}
++fillNo;
diff --git a/source/libs/planner/src/planOptimizer.c b/source/libs/planner/src/planOptimizer.c
index 40b70d7d3e..45fa67faef 100644
--- a/source/libs/planner/src/planOptimizer.c
+++ b/source/libs/planner/src/planOptimizer.c
@@ -348,7 +348,9 @@ static int32_t scanPathOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSub
int32_t code = scanPathOptMatch(pCxt, pLogicSubplan->pNode, &info);
if (TSDB_CODE_SUCCESS == code && info.pScan) {
scanPathOptSetScanWin(info.pScan);
- scanPathOptSetScanOrder(info.scanOrder, info.pScan);
+ if (!pCxt->pPlanCxt->streamQuery) {
+ scanPathOptSetScanOrder(info.scanOrder, info.pScan);
+ }
}
if (TSDB_CODE_SUCCESS == code && (NULL != info.pDsoFuncs || NULL != info.pSdrFuncs)) {
info.pScan->dataRequired = scanPathOptGetDataRequired(info.pSdrFuncs);
diff --git a/source/libs/scalar/src/filter.c b/source/libs/scalar/src/filter.c
index 4befe29e1d..45931c209c 100644
--- a/source/libs/scalar/src/filter.c
+++ b/source/libs/scalar/src/filter.c
@@ -1704,7 +1704,8 @@ void filterDumpInfoToString(SFilterInfo *info, const char *msg, int32_t options)
}
qDebug("GROUP Num:%u", info->groupNum);
- for (uint32_t i = 0; i < info->groupNum; ++i) {
+ uint32_t maxDbgGrpNum = TMIN(info->groupNum, 1000);
+ for (uint32_t i = 0; i < maxDbgGrpNum; ++i) {
SFilterGroup *group = &info->groups[i];
qDebug("Group%d : unit num[%u]", i, group->unitNum);
@@ -3248,14 +3249,18 @@ bool filterExecuteImpl(void *pinfo, int32_t numOfRows, SColumnInfoData *pRes, SC
for (uint32_t u = 0; u < group->unitNum; ++u) {
uint32_t uidx = group->unitIdxs[u];
SFilterComUnit *cunit = &info->cunits[uidx];
- void *colData = colDataGetData((SColumnInfoData *)(cunit->colData), i);
-
+ void *colData = NULL;
+ bool isNull = colDataIsNull((SColumnInfoData *)(cunit->colData), 0, i, NULL);
// if (FILTER_UNIT_GET_F(info, uidx)) {
// p[i] = FILTER_UNIT_GET_R(info, uidx);
// } else {
uint8_t optr = cunit->optr;
- if (colData == NULL || colDataIsNull((SColumnInfoData *)(cunit->colData), 0, i, NULL)) {
+ if (!isNull) {
+ colData = colDataGetData((SColumnInfoData *)(cunit->colData), i);
+ }
+
+ if (colData == NULL || isNull) {
p[i] = optr == OP_TYPE_IS_NULL ? true : false;
} else {
if (optr == OP_TYPE_IS_NOT_NULL) {
@@ -3916,6 +3921,10 @@ EDealRes fltReviseRewriter(SNode **pNode, void *pContext) {
} else {
SColumnNode *refNode = (SColumnNode *)node->pLeft;
SNodeListNode *listNode = (SNodeListNode *)node->pRight;
+ if (LIST_LENGTH(listNode->pNodeList) > 10) {
+ stat->scalarMode = true;
+ return DEAL_RES_CONTINUE;
+ }
int32_t type = vectorGetConvertType(refNode->node.resType.type, listNode->dataType.type);
if (0 != type && type != refNode->node.resType.type) {
stat->scalarMode = true;
diff --git a/source/libs/stream/src/streamState.c b/source/libs/stream/src/streamState.c
index aefe30116b..63ec0caa95 100644
--- a/source/libs/stream/src/streamState.c
+++ b/source/libs/stream/src/streamState.c
@@ -16,6 +16,7 @@
#include "executor.h"
#include "streamInc.h"
#include "tcommon.h"
+#include "tcompare.h"
#include "ttimer.h"
// todo refactor
@@ -144,6 +145,11 @@ SStreamState* streamStateOpen(char* path, SStreamTask* pTask, bool specPath, int
goto _err;
}
+ if (tdbTbOpen("parname.state.db", sizeof(int64_t), TSDB_TABLE_NAME_LEN, NULL, pState->db, &pState->pParNameDb, 0) <
+ 0) {
+ goto _err;
+ }
+
if (streamStateBegin(pState) < 0) {
goto _err;
}
@@ -157,6 +163,7 @@ _err:
tdbTbClose(pState->pFuncStateDb);
tdbTbClose(pState->pFillStateDb);
tdbTbClose(pState->pSessionStateDb);
+ tdbTbClose(pState->pParNameDb);
tdbClose(pState->db);
taosMemoryFree(pState);
return NULL;
@@ -169,6 +176,7 @@ void streamStateClose(SStreamState* pState) {
tdbTbClose(pState->pFuncStateDb);
tdbTbClose(pState->pFillStateDb);
tdbTbClose(pState->pSessionStateDb);
+ tdbTbClose(pState->pParNameDb);
tdbClose(pState->db);
taosMemoryFree(pState);
@@ -812,6 +820,16 @@ _end:
return res;
}
+int32_t streamStatePutParName(SStreamState* pState, int64_t groupId, const char tbname[TSDB_TABLE_NAME_LEN]) {
+ tdbTbUpsert(pState->pParNameDb, &groupId, sizeof(int64_t), tbname, TSDB_TABLE_NAME_LEN, &pState->txn);
+ return 0;
+}
+
+int32_t streamStateGetParName(SStreamState* pState, int64_t groupId, void** pVal) {
+ int32_t len;
+ return tdbTbGet(pState->pParNameDb, &groupId, sizeof(int64_t), pVal, &len);
+}
+
#if 0
char* streamStateSessionDump(SStreamState* pState) {
SStreamStateCur* pCur = taosMemoryCalloc(1, sizeof(SStreamStateCur));
diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c
index 369847b672..39c37a3860 100644
--- a/source/libs/sync/src/syncMain.c
+++ b/source/libs/sync/src/syncMain.c
@@ -944,6 +944,7 @@ SSyncNode* syncNodeOpen(SSyncInfo* pSyncInfo) {
SSyncSnapshotSender* pSender = snapshotSenderCreate(pSyncNode, i);
// ASSERT(pSender != NULL);
(pSyncNode->senders)[i] = pSender;
+ sSTrace(pSender, "snapshot sender create new while open, data:%p", pSender);
}
// snapshot receivers
@@ -971,7 +972,7 @@ SSyncNode* syncNodeOpen(SSyncInfo* pSyncInfo) {
atomic_store_64(&pSyncNode->snapshottingIndex, SYNC_INDEX_INVALID);
pSyncNode->isStart = true;
- sNTrace(pSyncNode, "sync open");
+ sNTrace(pSyncNode, "sync open, node:%p", pSyncNode);
return pSyncNode;
@@ -1041,14 +1042,10 @@ void syncNodePreClose(SSyncNode* pSyncNode) {
void syncHbTimerDataFree(SSyncHbTimerData* pData) { taosMemoryFree(pData); }
void syncNodeClose(SSyncNode* pSyncNode) {
- if (pSyncNode == NULL) {
- return;
- }
- int32_t ret;
+ if (pSyncNode == NULL) return;
+ sNTrace(pSyncNode, "sync close, data:%p", pSyncNode);
- sNTrace(pSyncNode, "sync close");
-
- ret = raftStoreClose(pSyncNode->pRaftStore);
+ int32_t ret = raftStoreClose(pSyncNode->pRaftStore);
ASSERT(ret == 0);
pSyncNode->pRaftStore = NULL;
@@ -1077,6 +1074,7 @@ void syncNodeClose(SSyncNode* pSyncNode) {
for (int32_t i = 0; i < TSDB_MAX_REPLICA; ++i) {
if ((pSyncNode->senders)[i] != NULL) {
+ sSTrace((pSyncNode->senders)[i], "snapshot sender destroy while close, data:%p", (pSyncNode->senders)[i]);
snapshotSenderDestroy((pSyncNode->senders)[i]);
(pSyncNode->senders)[i] = NULL;
}
@@ -1423,15 +1421,17 @@ void syncNodeDoConfigChange(SSyncNode* pSyncNode, SSyncCfg* pNewConfig, SyncInde
for (int32_t i = 0; i < TSDB_MAX_REPLICA; ++i) {
if ((pSyncNode->senders)[i] == NULL) {
(pSyncNode->senders)[i] = snapshotSenderCreate(pSyncNode, i);
- sSTrace((pSyncNode->senders)[i], "snapshot sender create new");
+ sSTrace((pSyncNode->senders)[i], "snapshot sender create new while reconfig, data:%p", (pSyncNode->senders)[i]);
+ } else {
+ sSTrace((pSyncNode->senders)[i], "snapshot sender already exist, data:%p", (pSyncNode->senders)[i]);
}
}
// free old
for (int32_t i = 0; i < TSDB_MAX_REPLICA; ++i) {
if (oldSenders[i] != NULL) {
+ sNTrace(pSyncNode, "snapshot sender destroy old, data:%p replica-index:%d", oldSenders[i], i);
snapshotSenderDestroy(oldSenders[i]);
- sNTrace(pSyncNode, "snapshot sender delete old %p replica-index:%d", oldSenders[i], i);
oldSenders[i] = NULL;
}
}
@@ -1946,12 +1946,14 @@ static void syncNodeEqPeerHeartbeatTimer(void* param, void* tmrId) {
SSyncHbTimerData* pData = syncHbTimerDataAcquire(hbDataRid);
if (pData == NULL) {
+ sError("hb timer get pData NULL, %" PRId64, hbDataRid);
return;
}
SSyncNode* pSyncNode = syncNodeAcquire(pData->syncNodeRid);
if (pSyncNode == NULL) {
syncHbTimerDataRelease(pData);
+ sError("hb timer get pSyncNode NULL");
return;
}
@@ -1960,28 +1962,39 @@ static void syncNodeEqPeerHeartbeatTimer(void* param, void* tmrId) {
if (!pSyncNode->isStart) {
syncNodeRelease(pSyncNode);
syncHbTimerDataRelease(pData);
+ sError("vgId:%d, hb timer sync node already stop", pSyncNode->vgId);
return;
}
if (pSyncNode->state != TAOS_SYNC_STATE_LEADER) {
syncNodeRelease(pSyncNode);
syncHbTimerDataRelease(pData);
+ sError("vgId:%d, hb timer sync node not leader", pSyncNode->vgId);
return;
}
if (pSyncNode->pRaftStore == NULL) {
syncNodeRelease(pSyncNode);
syncHbTimerDataRelease(pData);
+ sError("vgId:%d, hb timer raft store already stop", pSyncNode->vgId);
return;
}
- // sNTrace(pSyncNode, "eq peer hb timer");
-
- int64_t timerLogicClock = atomic_load_64(&pSyncTimer->logicClock);
- int64_t msgLogicClock = atomic_load_64(&pData->logicClock);
+ // sTrace("vgId:%d, eq peer hb timer", pSyncNode->vgId);
if (pSyncNode->replicaNum > 1) {
+ int64_t timerLogicClock = atomic_load_64(&pSyncTimer->logicClock);
+ int64_t msgLogicClock = atomic_load_64(&pData->logicClock);
+
if (timerLogicClock == msgLogicClock) {
+ if (syncIsInit()) {
+ // sTrace("vgId:%d, reset peer hb timer", pSyncNode->vgId);
+ taosTmrReset(syncNodeEqPeerHeartbeatTimer, pSyncTimer->timerMS, (void*)hbDataRid, syncEnv()->pTimerManager,
+ &pSyncTimer->pTimer);
+ } else {
+ sError("sync env is stop, reset peer hb timer error");
+ }
+
SRpcMsg rpcMsg = {0};
(void)syncBuildHeartbeat(&rpcMsg, pSyncNode->vgId);
@@ -1996,16 +2009,9 @@ static void syncNodeEqPeerHeartbeatTimer(void* param, void* tmrId) {
// send msg
syncNodeSendHeartbeat(pSyncNode, &pSyncMsg->destId, &rpcMsg);
- if (syncIsInit()) {
- taosTmrReset(syncNodeEqPeerHeartbeatTimer, pSyncTimer->timerMS, pData, syncEnv()->pTimerManager,
- &pSyncTimer->pTimer);
- } else {
- sError("sync env is stop, syncNodeEqHeartbeatTimer");
- }
-
} else {
- sTrace("==syncNodeEqPeerHeartbeatTimer== timerLogicClock:%" PRId64 ", msgLogicClock:%" PRId64 "", timerLogicClock,
- msgLogicClock);
+ sTrace("vgId:%d, do not send hb, timerLogicClock:%" PRId64 ", msgLogicClock:%" PRId64 "", pSyncNode->vgId,
+ timerLogicClock, msgLogicClock);
}
}
diff --git a/source/libs/sync/src/syncRaftLog.c b/source/libs/sync/src/syncRaftLog.c
index 2b1cee51d7..db0b6d1d02 100644
--- a/source/libs/sync/src/syncRaftLog.c
+++ b/source/libs/sync/src/syncRaftLog.c
@@ -38,7 +38,7 @@ SSyncLogStore* logStoreCreate(SSyncNode* pSyncNode) {
}
// pLogStore->pCache = taosLRUCacheInit(10 * 1024 * 1024, 1, .5);
- pLogStore->pCache = taosLRUCacheInit(100 * 1024 * 1024, 1, .5);
+ pLogStore->pCache = taosLRUCacheInit(30 * 1024 * 1024, 1, .5);
if (pLogStore->pCache == NULL) {
taosMemoryFree(pLogStore);
terrno = TSDB_CODE_WAL_OUT_OF_MEMORY;
diff --git a/source/os/src/osDir.c b/source/os/src/osDir.c
index 5e85e40594..421901184b 100644
--- a/source/os/src/osDir.c
+++ b/source/os/src/osDir.c
@@ -336,12 +336,14 @@ int32_t taosRealPath(char *dirname, char *realPath, int32_t maxlen) {
#else
if (realpath(dirname, tmp) != NULL) {
#endif
- if (realPath == NULL) {
- strncpy(dirname, tmp, maxlen);
- } else {
- strncpy(realPath, tmp, maxlen);
+ if (strlen(tmp) < maxlen) {
+ if (realPath == NULL) {
+ strncpy(dirname, tmp, maxlen);
+ } else {
+ strncpy(realPath, tmp, maxlen);
+ }
+ return 0;
}
- return 0;
}
return -1;
diff --git a/source/util/src/thash.c b/source/util/src/thash.c
index c3d4668e11..f27c4c9be1 100644
--- a/source/util/src/thash.c
+++ b/source/util/src/thash.c
@@ -147,7 +147,7 @@ static FORCE_INLINE SHashNode *doSearchInEntryList(SHashObj *pHashObj, SHashEntr
uint32_t hashVal) {
SHashNode *pNode = pe->next;
while (pNode) {
- atomic_add_fetch_64(&pHashObj->compTimes, 1);
+ //atomic_add_fetch_64(&pHashObj->compTimes, 1);
if ((pNode->keyLen == keyLen) && ((*(pHashObj->equalFp))(GET_HASH_NODE_KEY(pNode), key, keyLen) == 0) &&
pNode->removed == 0) {
assert(pNode->hashVal == hashVal);
diff --git a/tests/parallel_test/cases.task b/tests/parallel_test/cases.task
index 7115e12252..48103929dc 100644
--- a/tests/parallel_test/cases.task
+++ b/tests/parallel_test/cases.task
@@ -35,30 +35,30 @@
,,y,script,./test.sh -f tsim/db/show_create_table.sim
,,y,script,./test.sh -f tsim/db/tables.sim
,,y,script,./test.sh -f tsim/db/taosdlog.sim
-,,,script,./test.sh -f tsim/dnode/balance_replica1.sim
-,,,script,./test.sh -f tsim/dnode/balance_replica3.sim
-,,,script,./test.sh -f tsim/dnode/balance1.sim
-,,,script,./test.sh -f tsim/dnode/balance2.sim
-,,,script,./test.sh -f tsim/dnode/balance3.sim
-,,,script,./test.sh -f tsim/dnode/balancex.sim
+,,y,script,./test.sh -f tsim/dnode/balance_replica1.sim
+,,y,script,./test.sh -f tsim/dnode/balance_replica3.sim
+,,y,script,./test.sh -f tsim/dnode/balance1.sim
+,,y,script,./test.sh -f tsim/dnode/balance2.sim
+,,y,script,./test.sh -f tsim/dnode/balance3.sim
+,,y,script,./test.sh -f tsim/dnode/balancex.sim
,,y,script,./test.sh -f tsim/dnode/create_dnode.sim
,,y,script,./test.sh -f tsim/dnode/drop_dnode_has_mnode.sim
,,y,script,./test.sh -f tsim/dnode/drop_dnode_has_qnode_snode.sim
-,,,script,./test.sh -f tsim/dnode/drop_dnode_has_vnode_replica1.sim
-,,,script,./test.sh -f tsim/dnode/drop_dnode_has_vnode_replica3.sim
-,,,script,./test.sh -f tsim/dnode/drop_dnode_has_multi_vnode_replica1.sim
-,,,script,./test.sh -f tsim/dnode/drop_dnode_has_multi_vnode_replica3.sim
-,,,script,./test.sh -f tsim/dnode/drop_dnode_force.sim
+,,y,script,./test.sh -f tsim/dnode/drop_dnode_has_vnode_replica1.sim
+,,y,script,./test.sh -f tsim/dnode/drop_dnode_has_vnode_replica3.sim
+,,y,script,./test.sh -f tsim/dnode/drop_dnode_has_multi_vnode_replica1.sim
+,,y,script,./test.sh -f tsim/dnode/drop_dnode_has_multi_vnode_replica3.sim
+,,y,script,./test.sh -f tsim/dnode/drop_dnode_force.sim
,,y,script,./test.sh -f tsim/dnode/offline_reason.sim
-,,,script,./test.sh -f tsim/dnode/redistribute_vgroup_replica1.sim
-,,,script,./test.sh -f tsim/dnode/redistribute_vgroup_replica3_v1_leader.sim
-,,,script,./test.sh -f tsim/dnode/redistribute_vgroup_replica3_v1_follower.sim
-,,,script,./test.sh -f tsim/dnode/redistribute_vgroup_replica3_v2.sim
-,,,script,./test.sh -f tsim/dnode/redistribute_vgroup_replica3_v3.sim
-,,,script,./test.sh -f tsim/dnode/vnode_clean.sim
+,,y,script,./test.sh -f tsim/dnode/redistribute_vgroup_replica1.sim
+,,y,script,./test.sh -f tsim/dnode/redistribute_vgroup_replica3_v1_leader.sim
+,,y,script,./test.sh -f tsim/dnode/redistribute_vgroup_replica3_v1_follower.sim
+,,y,script,./test.sh -f tsim/dnode/redistribute_vgroup_replica3_v2.sim
+,,y,script,./test.sh -f tsim/dnode/redistribute_vgroup_replica3_v3.sim
+,,y,script,./test.sh -f tsim/dnode/vnode_clean.sim
,,,script,./test.sh -f tsim/dnode/use_dropped_dnode.sim
-,,,script,./test.sh -f tsim/dnode/split_vgroup_replica1.sim
-,,,script,./test.sh -f tsim/dnode/split_vgroup_replica3.sim
+,,y,script,./test.sh -f tsim/dnode/split_vgroup_replica1.sim
+,,y,script,./test.sh -f tsim/dnode/split_vgroup_replica3.sim
,,y,script,./test.sh -f tsim/import/basic.sim
,,y,script,./test.sh -f tsim/import/commit.sim
,,y,script,./test.sh -f tsim/import/large.sim
@@ -113,7 +113,7 @@
,,y,script,./test.sh -f tsim/parser/first_last.sim
,,y,script,./test.sh -f tsim/parser/fill_stb.sim
,,y,script,./test.sh -f tsim/parser/interp.sim
-#,,y,script,./test.sh -f tsim/parser/limit2.sim
+,,y,script,./test.sh -f tsim/parser/limit2.sim
,,y,script,./test.sh -f tsim/parser/fourArithmetic-basic.sim
,,y,script,./test.sh -f tsim/parser/function.sim
,,y,script,./test.sh -f tsim/parser/groupby-basic.sim
@@ -136,8 +136,8 @@
,,y,script,./test.sh -f tsim/parser/lastrow.sim
,,y,script,./test.sh -f tsim/parser/lastrow2.sim
,,y,script,./test.sh -f tsim/parser/like.sim
-,,,script,./test.sh -f tsim/parser/limit.sim
-,,,script,./test.sh -f tsim/parser/limit1.sim
+,,y,script,./test.sh -f tsim/parser/limit.sim
+,,y,script,./test.sh -f tsim/parser/limit1.sim
,,y,script,./test.sh -f tsim/parser/mixed_blocks.sim
,,y,script,./test.sh -f tsim/parser/nchar.sim
,,y,script,./test.sh -f tsim/parser/nestquery.sim
@@ -163,7 +163,7 @@
,,y,script,./test.sh -f tsim/parser/timestamp.sim
,,y,script,./test.sh -f tsim/parser/top_groupby.sim
,,y,script,./test.sh -f tsim/parser/topbot.sim
-,,,script,./test.sh -f tsim/parser/union.sim
+,,y,script,./test.sh -f tsim/parser/union.sim
,,y,script,./test.sh -f tsim/parser/union_sysinfo.sim
,,y,script,./test.sh -f tsim/parser/where.sim
,,y,script,./test.sh -f tsim/query/charScalarFunction.sim
@@ -213,7 +213,7 @@
,,n,script,./test.sh -f tsim/stream/basic0.sim -g
,,y,script,./test.sh -f tsim/stream/basic1.sim
,,y,script,./test.sh -f tsim/stream/basic2.sim
-,,,script,./test.sh -f tsim/stream/drop_stream.sim
+,,y,script,./test.sh -f tsim/stream/drop_stream.sim
,,y,script,./test.sh -f tsim/stream/fillHistoryBasic1.sim
,,y,script,./test.sh -f tsim/stream/fillHistoryBasic2.sim
,,y,script,./test.sh -f tsim/stream/fillHistoryBasic3.sim
@@ -228,7 +228,7 @@
,,y,script,./test.sh -f tsim/stream/partitionby.sim
,,y,script,./test.sh -f tsim/stream/partitionby1.sim
,,y,script,./test.sh -f tsim/stream/schedSnode.sim
-,,,script,./test.sh -f tsim/stream/windowClose.sim
+,,y,script,./test.sh -f tsim/stream/windowClose.sim
,,y,script,./test.sh -f tsim/stream/ignoreExpiredData.sim
,,y,script,./test.sh -f tsim/stream/sliding.sim
,,y,script,./test.sh -f tsim/stream/partitionbyColumnInterval.sim
@@ -279,7 +279,7 @@
,,y,script,./test.sh -f tsim/stable/vnode3.sim
,,y,script,./test.sh -f tsim/stable/metrics_idx.sim
,,,script,./test.sh -f tsim/sma/drop_sma.sim
-,,,script,./test.sh -f tsim/sma/tsmaCreateInsertQuery.sim
+,,y,script,./test.sh -f tsim/sma/tsmaCreateInsertQuery.sim
,,y,script,./test.sh -f tsim/sma/rsmaCreateInsertQuery.sim
,,y,script,./test.sh -f tsim/sma/rsmaPersistenceRecovery.sim
,,n,script,./test.sh -f tsim/valgrind/checkError1.sim
@@ -296,7 +296,7 @@
,,y,script,./test.sh -f tsim/vnode/replica3_vgroup.sim
,,y,script,./test.sh -f tsim/vnode/replica3_many.sim
,,y,script,./test.sh -f tsim/vnode/replica3_import.sim
-,,,script,./test.sh -f tsim/vnode/stable_balance_replica1.sim
+,,y,script,./test.sh -f tsim/vnode/stable_balance_replica1.sim
,,y,script,./test.sh -f tsim/vnode/stable_dnode2_stop.sim
,,y,script,./test.sh -f tsim/vnode/stable_dnode2.sim
,,y,script,./test.sh -f tsim/vnode/stable_dnode3.sim
@@ -424,6 +424,7 @@
,,,system-test,python3 ./test.py -f 1-insert/test_stmt_set_tbname_tag.py
,,,system-test,python3 ./test.py -f 1-insert/alter_stable.py
,,,system-test,python3 ./test.py -f 1-insert/alter_table.py
+,,,system-test,python3 ./test.py -f 1-insert/boundary.py
,,,system-test,python3 ./test.py -f 1-insert/insertWithMoreVgroup.py
,,,system-test,python3 ./test.py -f 1-insert/table_comment.py
,,,system-test,python3 ./test.py -f 1-insert/time_range_wise.py
@@ -607,6 +608,8 @@
,,,system-test,python3 ./test.py -f 2-query/upper.py -R
,,,system-test,python3 ./test.py -f 2-query/varchar.py
,,,system-test,python3 ./test.py -f 2-query/varchar.py -R
+,,,system-test,python3 ./test.py -f 2-query/case_when.py
+,,,system-test,python3 ./test.py -f 2-query/case_when.py -R
,,,system-test,python3 ./test.py -f 1-insert/update_data.py
,,,system-test,python3 ./test.py -f 1-insert/tb_100w_data_order.py
,,,system-test,python3 ./test.py -f 1-insert/delete_stable.py
@@ -813,6 +816,7 @@
,,,system-test,python3 ./test.py -f 2-query/last_row.py -Q 2
,,,system-test,python3 ./test.py -f 2-query/tsbsQuery.py -Q 2
,,,system-test,python3 ./test.py -f 2-query/sml.py -Q 2
+,,,system-test,python3 ./test.py -f 2-query/case_when.py -Q 2
,,,system-test,python3 ./test.py -f 2-query/between.py -Q 3
,,,system-test,python3 ./test.py -f 2-query/distinct.py -Q 3
,,,system-test,python3 ./test.py -f 2-query/varchar.py -Q 3
@@ -906,6 +910,7 @@
,,,system-test,python3 ./test.py -f 2-query/tsbsQuery.py -Q 3
,,,system-test,python3 ./test.py -f 2-query/sml.py -Q 3
,,,system-test,python3 ./test.py -f 2-query/interp.py -Q 3
+,,,system-test,python3 ./test.py -f 2-query/case_when.py -Q 3
,,,system-test,python3 ./test.py -f 2-query/between.py -Q 4
,,,system-test,python3 ./test.py -f 2-query/distinct.py -Q 4
,,,system-test,python3 ./test.py -f 2-query/varchar.py -Q 4
@@ -998,6 +1003,7 @@
,,,system-test,python3 ./test.py -f 2-query/tsbsQuery.py -Q 4
,,,system-test,python3 ./test.py -f 2-query/sml.py -Q 4
,,,system-test,python3 ./test.py -f 2-query/interp.py -Q 4
+,,,system-test,python3 ./test.py -f 2-query/case_when.py -Q 4
#develop test
,,,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/auto_create_table_json.py
diff --git a/tests/pytest/util/sql.py b/tests/pytest/util/sql.py
index b320cf5995..9cfd1d368e 100644
--- a/tests/pytest/util/sql.py
+++ b/tests/pytest/util/sql.py
@@ -73,8 +73,15 @@ class TDSql:
expectErrNotOccured = True
try:
self.cursor.execute(sql)
- except BaseException:
+ except BaseException as e:
expectErrNotOccured = False
+ caller = inspect.getframeinfo(inspect.stack()[1][0])
+ self.error_info = repr(e)
+ # print(error_info)
+ # self.error_info = error_info[error_info.index('(')+1:-1].split(",")[0].replace("'","")
+ # self.error_info = (','.join(error_info.split(",")[:-1]).split("(",1)[1:][0]).replace("'","")
+ # print("!!!!!!!!!!!!!!",self.error_info)
+
if expectErrNotOccured:
caller = inspect.getframeinfo(inspect.stack()[1][0])
tdLog.exit("%s(%d) failed: sql:%s, expect error not occured" % (caller.filename, caller.lineno, sql))
@@ -83,6 +90,8 @@ class TDSql:
self.queryCols = 0
self.queryResult = None
tdLog.info("sql:%s, expect error occured" % (sql))
+ return self.error_info
+
def query(self, sql, row_tag=None,queryTimes=10):
self.sql = sql
diff --git a/tests/script/tsim/dnode/drop_dnode_force.sim b/tests/script/tsim/dnode/drop_dnode_force.sim
index 10edacf3aa..26e48933be 100644
--- a/tests/script/tsim/dnode/drop_dnode_force.sim
+++ b/tests/script/tsim/dnode/drop_dnode_force.sim
@@ -192,7 +192,7 @@ if $data(5)[4] != ready then
goto step5
endi
-print =============== step5: drop dnode 2
+print =============== step5a: drop dnode 2
sql_error drop dnode 2
sql drop dnode 2 force
@@ -204,15 +204,23 @@ if $rows != 4 then
return -1
endi
+$x = 0
+step5a:
+ $ = $x + 1
+ sleep 1000
+ if $x == 10 then
+ print ====> dnode not online!
+ return -1
+ endi
print select * from information_schema.ins_mnodes;
sql select * from information_schema.ins_mnodes
print $data[0][0] $data[0][1] $data[0][2] $data[0][3] $data[0][4]
print $data[1][0] $data[1][1] $data[1][2] $data[1][3] $data[1][4]
if $rows != 2 then
- return -1
+ goto step5a
endi
if $data(1)[2] != leader then
- return -1
+ goto step5a
endi
sql select * from information_schema.ins_qnodes
diff --git a/tests/script/tsim/mnode/basic5.sim b/tests/script/tsim/mnode/basic5.sim
index e96b193b83..f0f0f18576 100644
--- a/tests/script/tsim/mnode/basic5.sim
+++ b/tests/script/tsim/mnode/basic5.sim
@@ -96,7 +96,7 @@ sql_error drop mnode on dnode 4
sql_error drop mnode on dnode 5
sql_error drop mnode on dnode 6
-system sh/exec.sh -n dnode2 -s stop -x SIGKILL
+system sh/exec.sh -n dnode2 -s stop
$x = 0
step5:
$x = $x + 1
@@ -151,7 +151,7 @@ if $data(4)[4] != ready then
endi
print =============== step6: stop mnode1
-system sh/exec.sh -n dnode1 -s stop -x SIGKILL
+system sh/exec.sh -n dnode1 -s stop
# sql_error drop mnode on dnode 1
$x = 0
@@ -205,8 +205,7 @@ if $data(4)[4] != ready then
endi
print =============== step8: stop mnode1 and drop it
-system sh/exec.sh -n dnode1 -s stop -x SIGKILL
-sql_error drop mnode on dnode 1
+system sh/exec.sh -n dnode1 -s stop
$x = 0
step81:
@@ -234,42 +233,15 @@ if $leaderNum != 1 then
endi
print =============== step9: start mnode1 and wait it dropped
-system sh/exec.sh -n dnode1 -s start
-sql drop mnode on dnode 1 -x step90
-step90:
-
+print check mnode has leader step9a
$x = 0
-step91:
+step9a:
$x = $x + 1
sleep 1000
if $x == 10 then
return -1
endi
-sql select * from information_schema.ins_dnodes
-print ===> $data00 $data01 $data02 $data03 $data04 $data05
-print ===> $data10 $data11 $data12 $data13 $data14 $data15
-print ===> $data20 $data21 $data22 $data23 $data24 $data25
-print ===> $data30 $data31 $data32 $data33 $data34 $data35
-if $data(1)[4] != ready then
- goto step91
-endi
-if $data(2)[4] != ready then
- goto step91
-endi
-if $data(3)[4] != ready then
- goto step91
-endi
-if $data(4)[4] != ready then
- goto step91
-endi
-
-$x = 0
-step92:
- $x = $x + 1
- sleep 1000
- if $x == 20 then
- return -1
- endi
+print check mnode leader
sql select * from information_schema.ins_mnodes
print ===> $data00 $data01 $data02 $data03 $data04 $data05
print ===> $data10 $data11 $data12 $data13 $data14 $data15
@@ -285,10 +257,95 @@ if $data(3)[2] == leader then
$leaderNum = 1
endi
if $leaderNum != 1 then
- goto step92
+ goto step9a
+endi
+
+print start dnode1 step9b
+system sh/exec.sh -n dnode1 -s start
+$x = 0
+step9b:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+print check dnode1 ready
+sql select * from information_schema.ins_dnodes
+print ===> $data00 $data01 $data02 $data03 $data04 $data05
+print ===> $data10 $data11 $data12 $data13 $data14 $data15
+print ===> $data20 $data21 $data22 $data23 $data24 $data25
+print ===> $data30 $data31 $data32 $data33 $data34 $data35
+if $data(1)[4] != ready then
+ goto step9b
+endi
+if $data(2)[4] != ready then
+ goto step9b
+endi
+if $data(3)[4] != ready then
+ goto step9b
+endi
+if $data(4)[4] != ready then
+ goto step9b
+endi
+
+sleep 4000
+print check mnode has leader step9c
+$x = 0
+step9c:
+ $x = $x + 1
+ sleep 1000
+ if $x == 10 then
+ return -1
+ endi
+print check mnode leader
+sql select * from information_schema.ins_mnodes
+print ===> $data00 $data01 $data02 $data03 $data04 $data05
+print ===> $data10 $data11 $data12 $data13 $data14 $data15
+print ===> $data20 $data21 $data22 $data23 $data24 $data25
+$leaderNum = 0
+if $data(1)[2] == leader then
+ $leaderNum = 1
+endi
+if $data(2)[2] == leader then
+ $leaderNum = 1
+endi
+if $data(3)[2] == leader then
+ $leaderNum = 1
+endi
+if $leaderNum != 1 then
+ goto step9c
+endi
+
+print drop mnode step9d
+sql drop mnode on dnode 1
+
+$x = 0
+step9d:
+ $x = $x + 1
+ sleep 1000
+ if $x == 20 then
+ return -1
+ endi
+print check mnode leader
+sql select * from information_schema.ins_mnodes
+print ===> $data00 $data01 $data02 $data03 $data04 $data05
+print ===> $data10 $data11 $data12 $data13 $data14 $data15
+print ===> $data20 $data21 $data22 $data23 $data24 $data25
+$leaderNum = 0
+if $data(1)[2] == leader then
+ $leaderNum = 1
+endi
+if $data(2)[2] == leader then
+ $leaderNum = 1
+endi
+if $data(3)[2] == leader then
+ $leaderNum = 1
+endi
+if $leaderNum != 1 then
+ goto step9d
endi
if $rows != 2 then
- goto step92
+ goto step9d
endi
print =============== stepa: create mnode1 again
diff --git a/tests/script/tsim/parser/fill.sim b/tests/script/tsim/parser/fill.sim
index 463328a019..b0841d6712 100644
--- a/tests/script/tsim/parser/fill.sim
+++ b/tests/script/tsim/parser/fill.sim
@@ -330,7 +330,7 @@ if $data11 != -1 then
endi
# fill_char_values_to_arithmetic_fields
-sql_error select sum(c1), avg(c2), max(c3), min(c4), avg(c4), count(c6), last(c7), last(c8) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c')
+sql select sum(c1), avg(c2), max(c3), min(c4), avg(c4), count(c6), last(c7), last(c8) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c')
# fill_multiple_columns
sql_error select sum(c1), avg(c2), min(c3), max(c4), count(c6), first(c7), last(c8) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 99, 99, 99, 99, 99, abc, abc)
@@ -355,25 +355,25 @@ endi
# fill_into_nonarithmetic_fieds
print select _wstart, first(c6), first(c7), first(c8) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 20000000, 20000000, 20000000)
-sql_error select _wstart, first(c6), first(c7), first(c8) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 20000000, 20000000, 20000000)
+sql select _wstart, first(c6), first(c7), first(c8) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 20000000, 20000000, 20000000)
-sql_error select first(c6), first(c7), first(c8) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 1, 1, 1)
-sql_error select first(c6), first(c7), first(c8) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 1.1, 1.1, 1.1)
-sql_error select first(c6), first(c7), first(c8) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 1e1, 1e1, 1e1)
+sql select first(c6), first(c7), first(c8) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 1, 1, 1)
+sql select first(c6), first(c7), first(c8) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 1.1, 1.1, 1.1)
+sql select first(c6), first(c7), first(c8) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 1e1, 1e1, 1e1)
sql select first(c7), first(c8) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, '1e', '1e1')
# fill quoted values into bool column will throw error unless the value is 'true' or 'false' Note:2018-10-24
# fill values into binary or nchar columns will be set to NULL automatically Note:2018-10-24
sql select first(c6), first(c7), first(c8) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, '1e', '1e1','1e1')
-sql_error select first(c6), first(c7), first(c8) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, true, true, true)
+sql select first(c6), first(c7), first(c8) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, true, true, true)
sql select first(c6), first(c7), first(c8) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 'true', 'true','true')
# fill nonarithmetic values into arithmetic fields
sql_error select count(*) where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, abc);
-sql_error select count(*) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 'true');
+sql select count(*) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 'true');
print select _wstart, count(*) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, '1e1');
-sql_error select _wstart, count(*) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, '1e1');
+sql select _wstart, count(*) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, '1e1');
sql select _wstart, count(*) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 1e1);
if $rows != 9 then
@@ -383,7 +383,7 @@ if $data01 != 1 then
return -1
endi
-sql_error select _wstart, count(*) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, '10');
+sql select _wstart, count(*) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, '10');
## linear fill
# feature currently switched off 2018/09/29
diff --git a/tests/script/tsim/parser/fill_stb.sim b/tests/script/tsim/parser/fill_stb.sim
index 66787b3606..e6a1d53ec7 100644
--- a/tests/script/tsim/parser/fill_stb.sim
+++ b/tests/script/tsim/parser/fill_stb.sim
@@ -170,7 +170,7 @@ endi
sql_error select max(c1), max(c2), max(c3), max(c4), max(c5) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill (6, 6, 6, 6, 6)
# fill_char_values_to_arithmetic_fields
-sql_error select sum(c1), avg(c2), max(c3), min(c4), avg(c4), count(c6), last(c7), last(c8) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c')
+sql select sum(c1), avg(c2), max(c3), min(c4), avg(c4), count(c6), last(c7), last(c8) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c')
# fill_multiple_columns
sql_error select sum(c1), avg(c2), min(c3), max(c4), count(c6), first(c7), last(c8) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 99, 99, 99, 99, 99, abc, abc)
@@ -240,10 +240,10 @@ sql select first(c7), first(c8), first(c9) from $stb where ts >= $ts0 and ts <=
sql select first(c7), first(c8), first(c9) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 'true', 'true','true')
# fill nonarithmetic values into arithmetic fields
-sql_error select count(*) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 'abc');
-sql_error select count(*) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 'true');
+sql select count(*) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 'abc');
+sql select count(*) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 'true');
-sql_error select _wstart, count(*) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, '2e1');
+sql select _wstart, count(*) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, '2e1');
sql select _wstart, count(*) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 20);
if $rows != $val then
@@ -354,7 +354,7 @@ endi
## NULL fill
print fill(NULL)
-print select _wstart, max(c1), min(c2), avg(c3), sum(c4), count(c5), first(c7), last(c8), first(c9) from $stb where ts >= $ts0 and ts <= $tsu and t1 > 4 partition by t1 interval(5m) fill(value, NULL) limit 5
+print select _wstart, max(c1), min(c2), avg(c3), sum(c4), count(c5), first(c7), last(c8), first(c9) from $stb where ts >= $ts0 and ts <= $tsu and t1 > 4 partition by t1 interval(5m) fill(value, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) limit 5
sql select _wstart, max(c1), min(c2), avg(c3), sum(c4), count(c5), first(c7), last(c8), first(c9) from $stb where ts >= $ts0 and ts <= $tsu and t1 > 4 partition by t1 interval(5m) fill(NULL) limit 5
if $rows != 25 then
return -1
diff --git a/tests/script/tsim/parser/fill_us.sim b/tests/script/tsim/parser/fill_us.sim
index f760ba3577..d7b4941c27 100644
--- a/tests/script/tsim/parser/fill_us.sim
+++ b/tests/script/tsim/parser/fill_us.sim
@@ -332,7 +332,7 @@ if $data11 != -1 then
endi
# fill_char_values_to_arithmetic_fields
-sql_error select sum(c1), avg(c2), max(c3), min(c4), avg(c4), count(c6), last(c7), last(c8) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c')
+sql select sum(c1), avg(c2), max(c3), min(c4), avg(c4), count(c6), last(c7), last(c8) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c')
# fill_multiple_columns
sql_error select _wstart, sum(c1), avg(c2), min(c3), max(c4), count(c6), first(c7), last(c8) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 99, 99, 99, 99, 99, abc, abc)
@@ -358,24 +358,24 @@ endi
# fill_into_nonarithmetic_fieds
-sql_error select _wstart, first(c6), first(c7), first(c8) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 20000000, 20000000, 20000000)
+sql select _wstart, first(c6), first(c7), first(c8) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 20000000, 20000000, 20000000)
-sql_error select first(c6), first(c7), first(c8) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 1, 1, 1)
-sql_error select first(c6), first(c7), first(c8) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 1.1, 1.1, 1.1)
-sql_error select first(c6), first(c7), first(c8) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 1e1, 1e1, 1e1)
+sql select first(c6), first(c7), first(c8) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 1, 1, 1)
+sql select first(c6), first(c7), first(c8) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 1.1, 1.1, 1.1)
+sql select first(c6), first(c7), first(c8) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 1e1, 1e1, 1e1)
sql select first(c7), first(c8) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, '1e', '1e1')
# fill quoted values into bool column will throw error unless the value is 'true' or 'false' Note:2018-10-24
# fill values into binary or nchar columns will be set to null automatically Note:2018-10-24
sql select first(c6), first(c7), first(c8) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, '1e', '1e1','1e1')
-sql_error select first(c6), first(c7), first(c8) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, true, true, true)
+sql select first(c6), first(c7), first(c8) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, true, true, true)
sql select first(c6), first(c7), first(c8) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 'true', 'true','true')
# fill nonarithmetic values into arithmetic fields
sql_error select count(*) where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, abc);
-sql_error select count(*) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 'true');
+sql select count(*) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 'true');
-sql_error select _wstart, count(*) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, '1e1');
+sql select _wstart, count(*) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, '1e1');
sql select _wstart, count(*) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 1e1);
if $rows != 9 then
@@ -385,7 +385,7 @@ if $data01 != 1 then
return -1
endi
-sql_error select _wstart, count(*) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, '10');
+sql select _wstart, count(*) from $tb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, '10');
## linear fill
# feature currently switched off 2018/09/29
diff --git a/tests/script/tsim/parser/limit2_query.sim b/tests/script/tsim/parser/limit2_query.sim
index 3c5002d591..64eb26429c 100644
--- a/tests/script/tsim/parser/limit2_query.sim
+++ b/tests/script/tsim/parser/limit2_query.sim
@@ -321,55 +321,41 @@ endi
### [TBASE-350]
## stb + interval + fill + group by + limit offset
-sql select max(c1), min(c2), sum(c3), avg(c4), first(c7), last(c8), first(c9) from $stb where ts >= $ts0 and ts <= $tsu partition by t1 interval(5m) fill(value, -1, -2, -3, -4 ,-7 ,'-8', '-9') limit 2 offset 10
+sql select max(c1), min(c2), sum(c3), avg(c4), first(c7), last(c8), first(c9) from lm2_tb0 where ts >= 1537146000000 and ts <= 1543145400000 partition by t1 interval(5m) fill(value, -1, -2, -3, -4 ,-7 ,'-8', '-9') limit 2 offset 10
if $rows != 2 then
return -1
endi
-#add one more test case
-sql select max(c1), last(c8) from lm2_db0.lm2_tb0 where ts >= 1537146000000 and ts <= 1543145400000 interval(5m) fill(linear) limit 10 offset 4089;"
-
$limit = 5
$offset = $rowNum * 2
$offset = $offset - 2
-sql select max(c1), min(c2), sum(c3), avg(c4), first(c7), last(c8), first(c9) from $stb where ts >= $ts0 and ts <= $tsu partition by t1 interval(5m) fill(value, -1, -2, -3, -4 ,-7 ,'-8', '-9') order by t1 limit $limit offset $offset
-if $rows != $tbNum then
+sql select max(c1), min(c2), sum(c3), avg(c4), first(c7), last(c8), first(c9) from lm2_tb0 where ts >= 1537146000000 and ts <= 1543145400000 partition by t1 interval(5m) fill(value, -1, -2, -3, -4 ,-7 ,'-8', '-9') order by t1 limit $limit offset $offset
+if $rows != 1 then
return -1
endi
-if $data00 != @18-11-25 19:30:00.000@ then
+if $data00 != 9 then
return -1
endi
if $data01 != 9 then
return -1
endi
-if $data12 != 9 then
+if $data02 != 9.000000000 then
return -1
endi
-if $data23 != 9.000000000 then
+if $data03 != 9.000000000 then
return -1
endi
-if $data34 != 9.000000000 then
+if $data04 != 1 then
return -1
endi
-if $data45 != 1 then
+if $data05 != binary9 then
return -1
endi
-if $data56 != binary9 then
- return -1
-endi
-if $data68 != 6 then
- return -1
-endi
-if $data72 != -2 then
- return -1
-endi
-if $data84 != -2.000000000 then
- return -1
-endi
-if $data98 != 9 then
+if $data06 != nchar9 then
return -1
endi
+
#add one more test case
sql select max(c1), last(c8) from lm2_db0.lm2_tb0 where ts >= 1537146000000 and ts <= 1543145400000 interval(5m) fill(linear) limit 10 offset 4089;"
diff --git a/tests/script/tsim/stream/basic1.sim b/tests/script/tsim/stream/basic1.sim
index bc076a194b..bb2ea42383 100644
--- a/tests/script/tsim/stream/basic1.sim
+++ b/tests/script/tsim/stream/basic1.sim
@@ -710,6 +710,11 @@ sleep 200
sql select * from streamt4;
+$loop_count = $loop_count + 1
+if $loop_count == 10 then
+ return -1
+endi
+
# row 0
if $rows != 0 then
print =====rows=$rows
diff --git a/tests/script/tsim/stream/basic3.sim b/tests/script/tsim/stream/basic3.sim
new file mode 100644
index 0000000000..48fb860a72
--- /dev/null
+++ b/tests/script/tsim/stream/basic3.sim
@@ -0,0 +1,55 @@
+system sh/stop_dnodes.sh
+system sh/deploy.sh -n dnode1 -i 1
+system sh/cfg.sh -n dnode1 -c debugflag -v 131
+system sh/exec.sh -n dnode1 -s start -v
+
+sleep 5000
+
+sql connect
+
+print ========== interval\session\state window
+
+sql CREATE DATABASE test1 BUFFER 96 CACHESIZE 1 CACHEMODEL 'none' COMP 2 DURATION 14400m WAL_FSYNC_PERIOD 3000 MAXROWS 4096 MINROWS 100 KEEP 5256000m,5256000m,5256000m PAGES 256 PAGESIZE 4 PRECISION 'ms' REPLICA 1 STRICT 'off' WAL_LEVEL 1 VGROUPS 2 SINGLE_STABLE 0;
+sql use test1;
+sql CREATE STABLE st (time TIMESTAMP, ca DOUBLE, cb DOUBLE, cc int) TAGS (ta VARCHAR(10) );
+
+print ========== create table before stream
+
+sql CREATE TABLE t1 using st TAGS ('aaa');
+sql CREATE TABLE t2 using st TAGS ('bbb');
+sql CREATE TABLE t3 using st TAGS ('ccc');
+sql CREATE TABLE t4 using st TAGS ('ddd');
+
+sql create stream streamd1 into streamt1 as select ca, _wstart,_wend, count(*) from st where time > "2022-01-01 00:00:00" and time < "2032-01-01 00:00:00" partition by ca interval(60m) fill(linear);
+sql create stream streamd2 into streamt2 as select tbname, _wstart,_wend, count(*) from st where time > "2022-01-01 00:00:00" and time < "2032-01-01 00:00:00" partition by tbname interval(60m) fill(linear);
+
+sql create stream streamd3 into streamt3 as select ca, _wstart,_wend, count(*), max(ca), min(cb), APERCENTILE(cc, 20) from st where time > "2022-01-01 00:00:00" and time < "2032-01-01 00:00:00" partition by ca session(time, 60m);
+sql create stream streamd4 into streamt4 as select tbname, _wstart,_wend, count(*), max(ca), min(cb), APERCENTILE(cc, 20) from st where time > "2022-01-01 00:00:00" and time < "2032-01-01 00:00:00" partition by tbname session(time, 60m);
+
+sql create stream streamd5 into streamt5 as select tbname, _wstart,_wend, count(*), max(ca), min(cb) from st where time > "2022-01-01 00:00:00" and time < "2032-01-01 00:00:00" partition by tbname state_window(cc);
+sql create stream streamd6 into streamt6 as select ca, _wstart,_wend, count(*), max(ca), min(cb) from t1 where time > "2022-01-01 00:00:00" and time < "2032-01-01 00:00:00" partition by ca state_window(cc);
+
+sleep 3000
+
+sql drop stream if exists streamd1;
+sql drop stream if exists streamd2;
+sql drop stream if exists streamd3;
+sql drop stream if exists streamd4;
+sql drop stream if exists streamd5;
+sql drop stream if exists streamd6;
+
+
+_OVER:
+system sh/exec.sh -n dnode1 -s stop -x SIGINT
+print =============== check
+$null=
+
+system_content sh/checkValgrind.sh -n dnode1
+print cmd return result ----> [ $system_content ]
+if $system_content > 0 then
+ return -1
+endi
+
+if $system_content == $null then
+ return -1
+endi
diff --git a/tests/script/tsim/stream/fillIntervalValue.sim b/tests/script/tsim/stream/fillIntervalValue.sim
index 49e68ae9f2..89590d1be0 100644
--- a/tests/script/tsim/stream/fillIntervalValue.sim
+++ b/tests/script/tsim/stream/fillIntervalValue.sim
@@ -4,7 +4,7 @@ looptest:
system sh/stop_dnodes.sh
system sh/deploy.sh -n dnode1 -i 1
system sh/exec.sh -n dnode1 -s start
-#==system sh/exec.sh -n dnode1 -s start -v
+
sleep 200
sql connect
diff --git a/tests/script/tsim/vnode/replica3_many.sim b/tests/script/tsim/vnode/replica3_many.sim
index fbce960b09..e3c73b2018 100644
--- a/tests/script/tsim/vnode/replica3_many.sim
+++ b/tests/script/tsim/vnode/replica3_many.sim
@@ -201,31 +201,39 @@ system sh/exec.sh -n dnode2 -s start
sleep 3000
print ======== step6
-sql select count(*) from db1.tb1
+$y = 0
+step6:
+ $y = $y + 1
+ sleep 1000
+ if $y == 50 then
+ return -1
+ endi
+
+sql select count(*) from db1.tb1 -x step6
print select count(*) from db1.tb1 ==> $data00 $lastRows1
if $data00 <= $lastRows1 then
- return -1
+ goto step6
endi
$lastRows1 = $data00
-sql select count(*) from db2.tb2
+sql select count(*) from db2.tb2 -x step6
print select count(*) from db2.tb2 ==> $data00 $lastRows2
if $data00 <= $lastRows2 then
- return -1
+ goto step6
endi
$lastRows2 = $data00
-sql select count(*) from db3.tb3
+sql select count(*) from db3.tb3 -x step6
print select count(*) from db3.tb3 ==> $data00 $lastRows3
if $data00 <= $lastRows3 then
- return -1
+ goto step6
endi
$lastRows3 = $data00
-sql select count(*) from db4.tb4
+sql select count(*) from db4.tb4 -x step6
print select count(*) from db4.tb4 ==> $data00 $lastRows4
if $data00 <= $lastRows4 then
- return -1
+ goto step6
endi
$lastRows4 = $data00
diff --git a/tests/system-test/1-insert/boundary.py b/tests/system-test/1-insert/boundary.py
new file mode 100644
index 0000000000..d3742ef5f9
--- /dev/null
+++ b/tests/system-test/1-insert/boundary.py
@@ -0,0 +1,183 @@
+###################################################################
+# Copyright (c) 2016 by TAOS Technologies, Inc.
+# All rights reserved.
+#
+# This file is proprietary and confidential to TAOS Technologies.
+# No part of this file may be reproduced, stored, transmitted,
+# disclosed or used in any form or by any means other than as
+# expressly provided by the written permission from Jianhui Tao
+#
+###################################################################
+
+# -*- coding: utf-8 -*-
+
+
+import math
+from random import randint
+from util.log import *
+from util.cases import *
+from util.sql import *
+from util.common import *
+from util.sqlset import *
+from util.boundary import *
+
+class TDTestCase:
+ def init(self, conn, logSql, replicaVar=1):
+ self.replicaVar = int(replicaVar)
+ tdLog.debug("start to execute %s" % __file__)
+ tdSql.init(conn.cursor())
+ self.boundary = DataBoundary()
+ self.dbname_length_boundary = self.boundary.DBNAME_MAX_LENGTH
+ self.tbname_length_boundary = self.boundary.TBNAME_MAX_LENGTH
+ self.stbname_length_boundary = self.boundary.STBNAME_MAX_LENGTH
+ self.colname_length_boundary = self.boundary.COL_KEY_MAX_LENGTH
+ self.tagname_length_boundary = self.boundary.TAG_KEY_MAX_LENGTH
+ self.username_length_boundary = 23
+ self.password_length_boundary = 128
+ def dbname_length_check(self):
+ dbname_length = randint(1,self.dbname_length_boundary-1)
+ for dbname in [tdCom.get_long_name(self.dbname_length_boundary),tdCom.get_long_name(dbname_length)]:
+ tdSql.execute(f'create database if not exists {dbname}')
+ tdSql.query(f'select name from information_schema.ins_databases where name = "{dbname}"')
+ tdSql.checkEqual(tdSql.queryResult[0][0],dbname)
+ tdSql.execute(f'drop database if exists {dbname}')
+ dbname = tdCom.get_long_name(self.dbname_length_boundary+1)
+ tdSql.error(f'create database if not exists {dbname}')
+ if "Invalid identifier name" in tdSql.error_info:
+ tdLog.info("error info is true!")
+ else:
+ tdLog.exit("error info is not true")
+
+ def tbname_length_check(self):
+ tdSql.prepare()
+ tdSql.execute('use db')
+ tbname_length = randint(1,self.tbname_length_boundary-1)
+ tdSql.execute(f'create table stb (ts timestamp,c0 int) tags(t0 int)')
+ for tbname in [tdCom.get_long_name(self.tbname_length_boundary),tdCom.get_long_name(tbname_length)]:
+ tdSql.execute(f'create table {tbname} using stb tags(1)')
+ tdSql.query(f'select table_name from information_schema.ins_tables where table_name = "{tbname}"')
+ tdSql.checkEqual(tdSql.queryResult[0][0],tbname)
+ tdSql.execute(f'drop table {tbname}')
+ tbname = tdCom.get_long_name(self.tbname_length_boundary+1)
+ tdSql.error(f'create table {tbname} using stb tags(1)')
+ if "Invalid identifier name" in tdSql.error_info:
+ tdLog.info("error info is true!")
+ else:
+ tdLog.exit("error info is not true")
+ stbname_length = randint(1,self.stbname_length_boundary-1)
+ for stbname in [tdCom.get_long_name(self.stbname_length_boundary),tdCom.get_long_name(stbname_length)]:
+ tdSql.execute(f'create table {stbname} (ts timestamp,c0 int) tags(t0 int)')
+ tdSql.query(f'select stable_name from information_schema.ins_stables where stable_name = "{stbname}"')
+ tdSql.checkEqual(tdSql.queryResult[0][0],stbname)
+ tdSql.execute(f'drop table {stbname}')
+ stbname = tdCom.get_long_name(self.stbname_length_boundary+1)
+ tdSql.error(f'create table {stbname} (ts timestamp,c0 int) tags(t0 int)')
+ print(tdSql.error_info)
+ if "Invalid identifier name" in tdSql.error_info:
+ tdLog.info("error info is true!")
+ else:
+ tdLog.exit("error info is not true")
+ tdSql.execute('drop database db')
+
+ def colname_length_check(self):
+ tdSql.prepare()
+ tdSql.execute('use db')
+ column_name_length = randint(1,self.colname_length_boundary-1)
+ for colname in [tdCom.get_long_name(column_name_length),tdCom.get_long_name(self.colname_length_boundary)]:
+ stbname = tdCom.get_long_name(3)
+ ntbname = tdCom.get_long_name(4)
+ tdSql.execute(f'create table {stbname} (ts timestamp,{colname} int) tags(t0 int)')
+ tdSql.query(f'describe {stbname}')
+ tdSql.checkEqual(tdSql.queryResult[1][0],colname)
+ tdSql.execute(f'create table {ntbname} (ts timestamp,{colname} int)')
+ tdSql.query(f'describe {ntbname}')
+ tdSql.checkEqual(tdSql.queryResult[1][0],colname)
+ colname = tdCom.get_long_name(self.colname_length_boundary+1)
+ tdSql.error(f'create table stb (ts timestamp,{colname} int) tags(t0 int)')
+ if "Invalid identifier name" in tdSql.error_info:
+ tdLog.info("error info is true!")
+ else:
+ tdLog.exit("error info is not true")
+ tdSql.execute('drop database db')
+
+ def tagname_length_check(self):
+ tdSql.prepare()
+ tdSql.execute('use db')
+ tag_name_length = randint(1,self.tagname_length_boundary-1)
+ for tagname in (tdCom.get_long_name(tag_name_length),tdCom.get_long_name(self.tagname_length_boundary)):
+ stbname = tdCom.get_long_name(3)
+ tdSql.execute(f'create table {stbname} (ts timestamp,c0 int) tags({tagname} int)')
+ tdSql.query(f'describe {stbname}')
+ tdSql.checkEqual(tdSql.queryResult[-1][0],tagname)
+ tagname = tdCom.get_long_name(self.tagname_length_boundary+1)
+ tdSql.error(f'create table {stbname} (ts timestamp,c0 int) tags({tagname} int)')
+ if "Invalid identifier name" in tdSql.error_info:
+ tdLog.info("error info is true!")
+ else:
+ tdLog.exit("error info is not true")
+ tdSql.execute('drop database db')
+
+ def username_length_check(self):
+ username_length = randint(1,self.username_length_boundary-1)
+ for username in [tdCom.get_long_name(username_length),tdCom.get_long_name(self.username_length_boundary)]:
+ tdSql.execute(f'create user {username} pass "123"')
+ tdSql.query('show users')
+ for user in tdSql.queryResult:
+ if user[0].lower() != 'root':
+ tdSql.checkEqual(user[0],username)
+ tdSql.execute(f'drop user {username}')
+ username = tdCom.get_long_name(self.username_length_boundary+1)
+ tdSql.error(f'create user {username} pass "123"')
+ if "Name or password too long" in tdSql.error_info:
+ tdLog.info("error info is true!")
+ else:
+ tdLog.exit("error info is not true")
+
+ def password_length_check(self):
+ password_length = randint(1,self.password_length_boundary-1)
+ for password in [tdCom.get_long_name(password_length),tdCom.get_long_name(self.password_length_boundary)]:
+ username = tdCom.get_long_name(3)
+ tdSql.execute(f'create user {username} pass "{password}"')
+ password = tdCom.get_long_name(self.password_length_boundary+1)
+ tdSql.error(f'create user {username} pass "{password}"')
+ if "Name or password too long" in tdSql.error_info:
+ tdLog.info("error info is true!")
+ else:
+ tdLog.exit("error info is not true")
+ def sql_length_check(self):
+ insert_rows = 1021
+ tdSql.prepare()
+ tdSql.execute('use db')
+ tdSql.execute('create table ntb (ts timestamp,c0 binary(1013))')
+ values_sql = ''
+ value = tdCom.get_long_name(1013)
+ for num in range(insert_rows):
+ values_sql += f' (now+{num}s,"{value}")'
+ value = tdCom.get_long_name(65)
+ values_sql += f"(now-1s,'{value}')"
+ tdSql.execute(f'insert into ntb values{values_sql}')
+ tdSql.query('select * from ntb')
+ tdSql.checkRows(insert_rows+1)
+ tdSql.execute('create table ntb1 (ts timestamp,c0 binary(1013))')
+ tdSql.error(f'insert into ntb1 values{values_sql};')
+ print(tdSql.error_info)
+ if "SQL statement too long" in tdSql.error_info:
+ tdLog.info("error info is true!")
+ else:
+ tdLog.exit("error info is not true")
+ tdSql.execute('drop database db')
+ def run(self):
+ self.dbname_length_check()
+ self.tbname_length_check()
+ self.colname_length_check()
+ self.tagname_length_check()
+ self.username_length_check()
+ self.password_length_check()
+ self.sql_length_check()
+
+ def stop(self):
+ tdSql.close()
+ tdLog.success("%s successfully executed" % __file__)
+
+tdCases.addWindows(__file__, TDTestCase())
+tdCases.addLinux(__file__, TDTestCase())
\ No newline at end of file
diff --git a/tests/system-test/1-insert/update_data.py b/tests/system-test/1-insert/update_data.py
index 6fcd987ea4..6a4d532ac6 100644
--- a/tests/system-test/1-insert/update_data.py
+++ b/tests/system-test/1-insert/update_data.py
@@ -23,7 +23,7 @@ class TDTestCase:
def init(self, conn, logSql, replicaVar=1):
self.replicaVar = int(replicaVar)
tdLog.debug("start to execute %s" % __file__)
- tdSql.init(conn.cursor(),logSql)
+ tdSql.init(conn.cursor())
self.setsql = TDSetSql()
self.dbname = 'db_test'
self.ntbname = 'ntb'
diff --git a/tests/system-test/2-query/case_when.py b/tests/system-test/2-query/case_when.py
new file mode 100755
index 0000000000..cfe0399553
--- /dev/null
+++ b/tests/system-test/2-query/case_when.py
@@ -0,0 +1,338 @@
+###################################################################
+# Copyright (c) 2016 by TAOS Technologies, Inc.
+# All rights reserved.
+#
+# This file is proprietary and confidential to TAOS Technologies.
+# No part of this file may be reproduced, stored, transmitted,
+# disclosed or used in any form or by any means other than as
+# expressly provided by the written permission from Jianhui Tao
+#
+###################################################################
+
+# -*- coding: utf-8 -*-
+
+import random
+import os
+import time
+import taos
+import subprocess
+from faker import Faker
+from util.log import tdLog
+from util.cases import tdCases
+from util.sql import tdSql
+from util.dnodes import tdDnodes
+from util.dnodes import *
+
+class TDTestCase:
+ updatecfgDict = {'maxSQLLength':1048576,'debugFlag': 143 ,"querySmaOptimize":1}
+
+ def init(self, conn, logSql, replicaVar):
+ tdLog.debug("start to execute %s" % __file__)
+ tdSql.init(conn.cursor(), logSql)
+
+ self.testcasePath = os.path.split(__file__)[0]
+ self.testcaseFilename = os.path.split(__file__)[-1]
+ os.system("rm -rf %s/%s.sql" % (self.testcasePath,self.testcaseFilename))
+
+ self.db = "case_when"
+
+ def dropandcreateDB_random(self,database,n):
+ ts = 1630000000000
+ num_random = 10
+ fake = Faker('zh_CN')
+ tdSql.execute('''drop database if exists %s ;''' %database)
+ tdSql.execute('''create database %s keep 36500 ;'''%(database))
+ tdSql.execute('''use %s;'''%database)
+
+ tdSql.execute('''create stable %s.stable_1 (ts timestamp , q_int int , q_bigint bigint , q_smallint smallint , q_tinyint tinyint , q_float float , q_double double , q_bool bool , q_binary binary(100) , q_nchar nchar(100) , q_ts timestamp , \
+ q_int_null int , q_bigint_null bigint , q_smallint_null smallint , q_tinyint_null tinyint, q_float_null float , q_double_null double , q_bool_null bool , q_binary_null binary(20) , q_nchar_null nchar(20) , q_ts_null timestamp) \
+ tags(loc nchar(100) , t_int int , t_bigint bigint , t_smallint smallint , t_tinyint tinyint, t_bool bool , t_binary binary(100) , t_nchar nchar(100) ,t_float float , t_double double , t_ts timestamp);'''%database)
+ tdSql.execute('''create stable %s.stable_2 (ts timestamp , q_int int , q_bigint bigint , q_smallint smallint , q_tinyint tinyint , q_float float , q_double double , q_bool bool , q_binary binary(100) , q_nchar nchar(100) , q_ts timestamp , \
+ q_int_null int , q_bigint_null bigint , q_smallint_null smallint , q_tinyint_null tinyint, q_float_null float , q_double_null double , q_bool_null bool , q_binary_null binary(20) , q_nchar_null nchar(20) , q_ts_null timestamp) \
+ tags(loc nchar(100) , t_int int , t_bigint bigint , t_smallint smallint , t_tinyint tinyint, t_bool bool , t_binary binary(100) , t_nchar nchar(100) ,t_float float , t_double double , t_ts timestamp);'''%database)
+
+ for i in range(num_random):
+ tdSql.execute('''create table %s.table_%d \
+ (ts timestamp , q_int int , q_bigint bigint , q_smallint smallint , q_tinyint tinyint , q_float float , q_double double , q_bool bool , q_binary binary(100) , q_nchar nchar(100) , q_ts timestamp ) ;'''%(database,i))
+ tdSql.execute('''create table %s.stable_1_%d using %s.stable_1 tags('stable_1_%d', '%d' , '%d', '%d' , '%d' , 1 , 'binary1.%s' , 'nchar1.%s' , '%f', '%f' ,'%d') ;'''
+ %(database,i,database,i,fake.random_int(min=-2147483647, max=2147483647, step=1), fake.random_int(min=-9223372036854775807, max=9223372036854775807, step=1),
+ fake.random_int(min=-32767, max=32767, step=1) , fake.random_int(min=-127, max=127, step=1) ,
+ fake.pystr() ,fake.pystr() ,fake.pyfloat(),fake.pyfloat(),fake.random_int(min=-2147483647, max=2147483647, step=1)))
+
+ tdSql.execute('''create table %s.stable_%d_a using %s.stable_2 tags('stable_2_%d', '%d' , '%d', '%d' , '%d' , 1 , 'binary1.%s' , 'nchar1.%s' , '%f', '%f' ,'%d') ;'''
+ %(database,i,database,i,fake.random_int(min=-2147483647, max=2147483647, step=1), fake.random_int(min=-9223372036854775807, max=9223372036854775807, step=1),
+ fake.random_int(min=-32767, max=32767, step=1) , fake.random_int(min=-127, max=127, step=1) ,
+ fake.pystr() ,fake.pystr() ,fake.pyfloat(),fake.pyfloat(),fake.random_int(min=-2147483647, max=2147483647, step=1)))
+ tdSql.execute('''create table %s.stable_%d_b using %s.stable_2 tags('stable_2_%d', '%d' , '%d', '%d' , '%d' , 1 , 'binary1.%s' , 'nchar1.%s' , '%f', '%f' ,'%d') ;'''
+ %(database,i,database,i,fake.random_int(min=-2147483647, max=2147483647, step=1), fake.random_int(min=-9223372036854775807, max=9223372036854775807, step=1),
+ fake.random_int(min=-32767, max=32767, step=1) , fake.random_int(min=-127, max=127, step=1) ,
+ fake.pystr() ,fake.pystr() ,fake.pyfloat(),fake.pyfloat(),fake.random_int(min=-2147483647, max=2147483647, step=1)))
+
+ # insert data
+ for i in range(num_random):
+ for j in range(n):
+ tdSql.execute('''insert into %s.stable_1_%d (ts , q_int , q_bigint , q_smallint , q_tinyint , q_float , q_double, q_bool , q_binary , q_nchar, q_ts)\
+ values(%d, %d, %d, %d, %d, %f, %f, 0, 'binary.%s', 'nchar.%s', %d) ;'''
+ % (database,i,ts + i*1000 + j, fake.random_int(min=-2147483647, max=2147483647, step=1),
+ fake.random_int(min=-9223372036854775807, max=9223372036854775807, step=1),
+ fake.random_int(min=-32767, max=32767, step=1) , fake.random_int(min=-127, max=127, step=1) ,
+ fake.pyfloat() , fake.pyfloat() , fake.pystr() , fake.pystr() , ts + i))
+
+ tdSql.execute('''insert into %s.table_%d (ts , q_int , q_bigint , q_smallint , q_tinyint , q_float , q_double , q_bool , q_binary , q_nchar, q_ts) \
+ values(%d, %d, %d, %d, %d, %f, %f, 0, 'binary.%s', 'nchar.%s', %d) ;'''
+ % (database,i,ts + i*1000 + j, fake.random_int(min=-2147483647, max=2147483647, step=1),
+ fake.random_int(min=-9223372036854775807, max=9223372036854775807, step=1),
+ fake.random_int(min=-32767, max=32767, step=1) , fake.random_int(min=-127, max=127, step=1) ,
+ fake.pyfloat() , fake.pyfloat() , fake.pystr() , fake.pystr() , ts + i ))
+
+ tdSql.execute('''insert into %s.stable_%d_a (ts , q_int , q_bigint , q_smallint , q_tinyint , q_float , q_double, q_bool , q_binary , q_nchar, q_ts)\
+ values(%d, %d, %d, %d, %d, %f, %f, 1, 'binary.%s', 'nchar.%s', %d) ;'''
+ % (database,i,ts + i*1000 + j, fake.random_int(min=0, max=2147483647, step=1),
+ fake.random_int(min=0, max=9223372036854775807, step=1),
+ fake.random_int(min=0, max=32767, step=1) , fake.random_int(min=0, max=127, step=1) ,
+ fake.pyfloat() , fake.pyfloat() , fake.pystr() , fake.pystr() , ts + i))
+
+ tdSql.query("select count(*) from %s.stable_1;" %database)
+ tdSql.checkData(0,0,num_random*n)
+ tdSql.query("select count(*) from %s.table_0;"%database)
+ tdSql.checkData(0,0,n)
+
+
+ def users_bug(self,database):
+ sql1 = "select (case when `q_smallint` >0 then 'many--' when `q_smallint`<0 then 'little' end),q_int,loc from %s.stable_1 where tbname = 'stable_1_1' limit 100;" %database
+ sql2 = "select (case when `q_smallint` >0 then 'many--' when `q_smallint`<0 then 'little' end),q_int,loc from %s.stable_1_1 limit 100;" %database
+ self.constant_check(database,sql1,sql2,0)
+
+ sql1 = "select (case when `q_smallint` >0 then 'many![;;][][]]' when `q_smallint`<0 then 'little' end),q_int,loc from %s.stable_1 where tbname = 'stable_1_1' limit 100;" %database
+ sql2 = "select (case when `q_smallint` >0 then 'many![;;][][]]' when `q_smallint`<0 then 'little' end),q_int,loc from %s.stable_1_1 limit 100;" %database
+ self.constant_check(database,sql1,sql2,0)
+
+ sql1 = "select (case when sum(q_smallint)=0 then null else sum(q_smallint) end) from %s.stable_1 where tbname = 'stable_1_1' limit 100;" %database
+ sql2 = "select (case when sum(q_smallint)=0 then null else sum(q_smallint) end) from %s.stable_1_1 limit 100;" %database
+ self.constant_check(database,sql1,sql2,0)
+
+ sql1 = "select _wstart,avg(q_int),min(q_smallint) from %s.stable_1 where tbname = 'stable_1_1' and ts < now state_window(case when q_smallint <0 then 1 else 0 end);" %database
+ sql2 = "select _wstart,avg(q_int),min(q_smallint) from %s.stable_1_1 where ts < now state_window(case when q_smallint <0 then 1 else 0 end);" %database
+ self.constant_check(database,sql1,sql2,0)
+ self.constant_check(database,sql1,sql2,1)
+ self.constant_check(database,sql1,sql2,2)
+
+ def casewhen_list(self):
+ a1,a2,a3 = random.randint(-2147483647,2147483647),random.randint(-2147483647,2147483647),random.randint(-2147483647,2147483647)
+ casewhen_lists = ['first case when %d then %d end last' %(a1,a2) , #'first case when 3 then 4 end last' ,
+ 'first case when 0 then %d end last' %(a1), #'first case when 0 then 4 end last' ,
+ 'first case when null then %d end last' %(a1) , #'first case when null then 4 end last' ,
+ 'first case when 1 then %d+(%d) end last' %(a1,a2) , #'first case when 1 then 4+1 end last' ,
+ 'first case when %d-(%d) then 0 end last' %(a1,a1) , #'first case when 1-1 then 0 end last' ,
+ 'first case when %d+(%d) then 0 end last' %(a1,a1), #'first case when 1+1 then 0 end last' ,
+ 'first case when 1 then %d-(%d)+(%d) end last' %(a1,a1,a2), #'first case when 1 then 1-1+2 end last' ,
+ 'first case when %d > 0 then %d < %d end last' %(a1,a1,a2), #'first case when 1 > 0 then 1 < 2 end last' ,
+ 'first case when %d > %d then %d < %d end last' %(a1,a2,a1,a2), #'first case when 1 > 2 then 1 < 2 end last' ,
+ 'first case when abs(%d) then abs(-(%d)) end last' %(a1,a2) ,#'first case when abs(3) then abs(-1) end last' ,
+ 'first case when abs(%d+(%d)) then abs(-(%d))+abs(%d) end last' %(a1,a2,a1,a2) , #'first case when abs(1+1) then abs(-1)+abs(3) end last' ,
+ 'first case when 0 then %d else %d end last' %(a1,a2), #'first case when 0 then 1 else 3 end last' ,
+ 'first case when 0 then %d when 1 then %d else %d end last' %(a1,a1,a3), #'first case when 0 then 1 when 1 then 0 else 3 end last' ,
+ 'first case when 0 then %d when 1 then %d when 2 then %d end last' %(a1,a1,a3), #'first case when 0 then 1 when 1 then 0 when 2 then 3 end last' ,
+ 'first case when \'a\' then \'b\' when null then 0 end last' , #'first case when \'a\' then \'b\' when null then 0 end last' ,
+ 'first case when \'%d\' then \'b\' when null then %d end last' %(a1,a2), #'first case when \'2\' then \'b\' when null then 0 end last' ,
+ 'first case when \'%d\' then \'b\' else null end last' %(a1), #'first case when \'0\' then \'b\' else null end last',
+ 'first case when \'%d\' then \'b\' else %d end last' %(a1,a2), #'first case when \'0\' then \'b\' else 2 end last',
+ 'first case when sum(%d) then sum(%d)-sum(%d) end last' %(a1,a1,a3), #'first case when sum(2) then sum(2)-sum(1) end last' ,
+ 'first case when sum(%d) then abs(-(%d)) end last' %(a1,a2), #'first case when sum(2) then abs(-2) end last' ,
+ 'first case when q_int then ts end last' ,
+ 'first case when q_int then q_int when q_int + (%d) then q_int + (%d) else q_int is null end last' %(a1,a2) , #'first case when q_int then q_int when q_int + 1 then q_int + 1 else q_int is null end last' ,
+ 'first case when q_int then %d when ts then ts end last' %(a1), #'first case when q_int then 3 when ts then ts end last' ,
+ 'first case when %d then q_int end last' %(a1), #'first case when 3 then q_int end last' ,
+ 'first case when q_int then %d when %d then %d end last' %(a1,a1,a3), #'first case when q_int then 3 when 1 then 2 end last' ,
+ 'first case when sum(q_int) then sum(q_int)-abs(-(%d)) end last' %(a1), #'first case when sum(q_int) then sum(q_int)-abs(-1) end last' ,
+ 'first case when q_int < %d then %d when q_int >= %d then %d else %d end last' %(a1,a2,a1,a2,a3), #'first case when q_int < 3 then 1 when q_int >= 3 then 2 else 3 end last' ,
+ 'first cast(case q_int when q_int then q_int + (%d) else q_int is null end as double) last' %(a1), #'first cast(case q_int when q_int then q_int + 1 else q_int is null end as double) last' ,
+ 'first sum(case q_int when q_int then q_int + (%d) else q_int is null end + (%d)) last' %(a1,a2), #'first sum(case q_int when q_int then q_int + 1 else q_int is null end + 1) last' ,
+ 'first case when q_int is not null then case when q_int <= %d then q_int else q_int * (%d) end else -(%d) end last' %(a1,a1,a3), #'first case when q_int is not null then case when q_int <= 0 then q_int else q_int * 10 end else -1 end last' ,
+ 'first case %d when %d then %d end last' %(a1,a2,a3), # 'first case 3 when 3 then 4 end last' ,
+ 'first case %d when %d then %d end last' %(a1,a2,a3), # 'first case 3 when 1 then 4 end last' ,
+ 'first case %d when %d then %d else %d end last' %(a1,a1,a2,a3), # 'first case 3 when 1 then 4 else 2 end last' ,
+ 'first case %d when null then %d when \'%d\' then %d end last' %(a1,a1,a2,a3) , # 'first case 3 when null then 4 when \'3\' then 1 end last' ,
+ 'first case \'%d\' when null then %d when %d then %d end last' %(a1,a1,a2,a3), # 'first case \'3\' when null then 4 when 3 then 1 end last' ,
+ 'first case null when null then %d when %d then %d end last' %(a1,a2,a3), # 'first case null when null then 4 when 3 then 1 end last' ,
+ 'first case %d.0 when null then %d when \'%d\' then %d end last' %(a1,a1,a2,a3) , # 'first case 3.0 when null then 4 when \'3\' then 1 end last' ,
+ 'first case q_double when \'a\' then %d when \'%d\' then %d end last' %(a1,a2,a3) , # 'first case q_double when \'a\' then 4 when \'0\' then 1 end last' ,
+ 'first case q_double when q_int then q_int when q_int - (%d) then q_int else %d end last' %(a1,a2), # 'first case q_double when q_int then q_int when q_int - 1 then q_int else 99 end last' ,
+ 'first case cast(q_double as int) when %d then q_double when q_int then %d else ts end last' %(a1,a2), #'first case cast(q_double as int) when 0 then q_double when q_int then 11 else ts end last' ,
+ 'first case q_int + (%d) when %d then %d when %d then %d else %d end last' %(a1,a2,a3,a1,a2,a3), #'first case q_int + 1 when 1 then 1 when 2 then 2 else 3 end last' ,
+ 'first case when \'a\' then \'b\' when null then %d end last' %(a1), # 'first case when \'a\' then \'b\' when null then 0 end last' ,
+ 'first case when \'%d\' then \'b\' when null then %d end last' %(a1,a2), # 'first case when \'2\' then \'b\' when null then 0 end last' ,
+ 'first case when %d then \'b\' else null end last' %(a1), # 'first case when 0 then \'b\' else null end last' ,
+ 'first case when %d then \'b\' else %d+abs(%d) end last' %(a1,a2,a3), # 'first case when 0 then \'b\' else 2+abs(-2) end last' ,
+ 'first case when %d then %d end last' %(a1,a2), # 'first case when 3 then 4 end last' ,
+ 'first case when %d then %d end last' %(a1,a2), # 'first case when 0 then 4 end last' ,
+ 'first case when null then %d end last' %(a1), # 'first case when null then 4 end last' ,
+ 'first case when %d then %d+(%d) end last' %(a1,a2,a3), # 'first case when 1 then 4+1 end last' ,
+ 'first case when %d-(%d) then %d end last' %(a1,a2,a3), # 'first case when 1-1 then 0 end last' ,
+ 'first case when %d+(%d) then %d end last' %(a1,a2,a3), # 'first case when 1+1 then 0 end last' ,
+ 'first case when abs(%d) then abs(%d) end last' %(a1,a2), # 'first case when abs(3) then abs(-1) end last' ,
+ 'first case when abs(%d+(%d)) then abs(%d)+abs(%d) end last' %(a1,a2,a3,a1), # 'first case when abs(1+1) then abs(-1)+abs(3) end last' ,
+ 'first case when %d then %d else %d end last' %(a1,a2,a3), # 'first case when 0 then 1 else 3 end last' ,
+ 'first case when %d then %d when %d then %d else %d end last' %(a1,a2,a3,a1,a2), # 'first case when 0 then 1 when 1 then 0 else 3 end last' ,
+ 'first case when %d then %d when %d then %d when %d then %d end last' %(a1,a2,a3,a1,a2,a3), # 'first case when 0 then 1 when 1 then 0 when 2 then 3 end last' ,
+ 'first case %d when %d then %d end last' %(a1,a1,a3), # 'first case 3 when 3 then 4 end last' ,
+ 'first case %d when %d then %d end last' %(a1,a2,a3), # 'first case 3 when 1 then 4 end last' ,
+ 'first case %d when %d then %d else %d end last' %(a1,a2,a3,a1), # 'first case 3 when 1 then 4 else 2 end last' ,
+ 'first case %d when null then %d when \'%d\' then %d end last' %(a1,a2,a1,a3), # 'first case 3 when null then 4 when \'3\' then 1 end last' ,
+ 'first case null when null then %d when %d then %d end last' %(a1,a2,a3), # 'first case null when null then 4 when 3 then 1 end last' ,
+ 'first case %d.0 when null then %d when \'%d\' then %d end last' %(a1,a2,a1,a3), # 'first case 3.0 when null then 4 when \'3\' then 1 end last' ,
+ 'first q_double,case q_double when \'a\' then %d when \'%d\' then %d end last' %(a1,a2,a3), #'first q_double,case q_double when \'a\' then 4 when \'0\' then 1 end last' ,
+ 'first case null when null then %d when %d then %d end last' %(a1,a2,a3), #'first case null when null then 4 when 3 then 1 end last' ,
+ 'first q_double,q_int,case q_double when q_int then q_int when q_int - (%d ) then q_int else %d end last' %(a1,a2), # 'first q_double,q_int,case q_double when q_int then q_int when q_int - 1 then q_int else 99 end last' ,
+ 'first case cast(q_double as int) when %d then q_double when q_int then %d else ts end last' %(a1,a2), # 'first case cast(q_double as int) when 0 then q_double when q_int then 11 else ts end last' ,
+ 'first q_int, case q_int + (%d) when %d then %d when %d then %d else %d end last' %(a1,a1,a1,a2,a2,a3), #'first q_int, case q_int + 1 when 1 then 1 when 2 then 2 else 3 end last' ,
+ 'first distinct loc, case t_int when t_bigint then t_ts else t_smallint + (%d) end last' %(a1), #'first distinct loc, case t_int when t_bigint then t_ts else t_smallint + 100 end last' ,
+ ]
+ #num = len(casewhen_lists)
+
+ casewhen_list = str(random.sample(casewhen_lists,50)).replace("[","").replace("]","").replace("'first","").replace("last'","").replace("\"first","").replace("last\"","")
+
+ return casewhen_list
+
+ def base_case(self,database):
+
+ for i in range(30):
+ cs = self.casewhen_list().split(',')[i]
+ sql1 = "select %s from %s.stable_1 where tbname = 'stable_1_1';" % (cs ,database)
+ sql2 = "select %s from %s.stable_1_1 ;" % (cs ,database)
+ self.constant_check(database,sql1,sql2,0)
+
+
+ def state_window_list(self):
+ a1,a2,a3 = random.randint(-2147483647,2147483647),random.randint(-2147483647,2147483647),random.randint(-2147483647,2147483647)
+ state_window_lists = ['first case when %d then %d end last' %(a1,a2) , #'first case when 3 then 4 end last' ,
+ 'first case when 0 then %d end last' %(a1), #'first case when 0 then 4 end last' ,
+ 'first case when null then %d end last' %(a1) , #'first case when null then 4 end last' ,
+ 'first case when %d-(%d) then 0 end last' %(a1,a1) , #'first case when 1-1 then 0 end last' ,
+ 'first case when %d+(%d) then 0 end last' %(a1,a1), #'first case when 1+1 then 0 end last' ,
+ 'first case when %d > 0 then %d < %d end last' %(a1,a1,a2), #'first case when 1 > 0 then 1 < 2 end last' ,
+ 'first case when %d > %d then %d < %d end last' %(a1,a2,a1,a2), #'first case when 1 > 2 then 1 < 2 end last' ,
+ 'first case when abs(%d) then abs(-(%d)) end last' %(a1,a2) ,#'first case when abs(3) then abs(-1) end last' ,
+ 'first case when 0 then %d else %d end last' %(a1,a2), #'first case when 0 then 1 else 3 end last' ,
+ 'first case when 0 then %d when 1 then %d else %d end last' %(a1,a1,a3), #'first case when 0 then 1 when 1 then 0 else 3 end last' ,
+ 'first case when 0 then %d when 1 then %d when 2 then %d end last' %(a1,a1,a3), #'first case when 0 then 1 when 1 then 0 when 2 then 3 end last' ,
+ 'first case when \'a\' then \'b\' when null then 0 end last' , #'first case when \'a\' then \'b\' when null then 0 end last' ,
+ 'first case when \'%d\' then \'b\' when null then %d end last' %(a1,a2) , #'first case when \'2\' then \'b\' when null then 0 end last' ,
+ 'first case when \'%d\' then \'b\' else null end last' %(a1), #'first case when \'0\' then \'b\' else null end last',
+ 'first case when \'%d\' then \'b\' else %d end last' %(a1,a2), #'first case when \'0\' then \'b\' else 2 end last',
+ 'first case when q_int then q_int when q_int + (%d) then q_int + (%d) else q_int is null end last' %(a1,a2) , #'first case when q_int then q_int when q_int + 1 then q_int + 1 else q_int is null end last' ,
+ 'first case when q_int then %d when ts then ts end last' %(a1), #'first case when q_int then 3 when ts then ts end last' ,
+ 'first case when %d then q_int end last' %(a1), #'first case when 3 then q_int end last' ,
+ 'first case when q_int then %d when %d then %d end last' %(a1,a1,a3), #'first case when q_int then 3 when 1 then 2 end last' ,
+ 'first case when q_int < %d then %d when q_int >= %d then %d else %d end last' %(a1,a2,a1,a2,a3), #'first case when q_int < 3 then 1 when q_int >= 3 then 2 else 3 end last' ,
+ 'first case when q_int is not null then case when q_int <= %d then q_int else q_int * (%d) end else -(%d) end last' %(a1,a1,a3), #'first case when q_int is not null then case when q_int <= 0 then q_int else q_int * 10 end else -1 end last' ,
+ 'first case %d when %d then %d end last' %(a1,a2,a3), # 'first case 3 when 3 then 4 end last' ,
+ 'first case %d when %d then %d end last' %(a1,a2,a3), # 'first case 3 when 1 then 4 end last' ,
+ 'first case %d when %d then %d else %d end last' %(a1,a1,a2,a3), # 'first case 3 when 1 then 4 else 2 end last' ,
+ 'first case %d when null then %d when \'%d\' then %d end last' %(a1,a1,a2,a3) , # 'first case 3 when null then 4 when \'3\' then 1 end last' ,
+ 'first case \'%d\' when null then %d when %d then %d end last' %(a1,a1,a2,a3), # 'first case \'3\' when null then 4 when 3 then 1 end last' ,
+ 'first case null when null then %d when %d then %d end last' %(a1,a2,a3), # 'first case null when null then 4 when 3 then 1 end last' ,
+ 'first case %d.0 when null then %d when \'%d\' then %d end last' %(a1,a1,a2,a3) , # 'first case 3.0 when null then 4 when \'3\' then 1 end last' ,
+ 'first case q_double when \'a\' then %d when \'%d\' then %d end last' %(a1,a2,a3) , # 'first case q_double when \'a\' then 4 when \'0\' then 1 end last' ,
+ 'first case q_double when q_int then q_int when q_int - (%d) then q_int else %d end last' %(a1,a2), # 'first case q_double when q_int then q_int when q_int - 1 then q_int else 99 end last' ,
+ 'first case q_int + (%d) when %d then %d when %d then %d else %d end last' %(a1,a2,a3,a1,a2,a3), #'first case q_int + 1 when 1 then 1 when 2 then 2 else 3 end last' ,
+ 'first case when \'a\' then \'b\' when null then %d end last' %(a1), # 'first case when \'a\' then \'b\' when null then 0 end last' ,
+ 'first case when \'%d\' then \'b\' when null then %d end last' %(a1,a2), # 'first case when \'2\' then \'b\' when null then 0 end last' ,
+ 'first case when %d then \'b\' else null end last' %(a1), # 'first case when 0 then \'b\' else null end last' ,
+ 'first case when %d then \'b\' else %d+abs(%d) end last' %(a1,a2,a3), # 'first case when 0 then \'b\' else 2+abs(-2) end last' ,
+ 'first case when %d then %d end last' %(a1,a2), # 'first case when 3 then 4 end last' ,
+ 'first case when %d then %d end last' %(a1,a2), # 'first case when 0 then 4 end last' ,
+ 'first case when null then %d end last' %(a1), # 'first case when null then 4 end last' ,
+ #'first case when %d then %d+(%d) end last' %(a1,a2,a3), # 'first case when 1 then 4+1 end last' ,
+ 'first case when %d-(%d) then %d end last' %(a1,a2,a3), # 'first case when 1-1 then 0 end last' ,
+ 'first case when %d+(%d) then %d end last' %(a1,a2,a3), # 'first case when 1+1 then 0 end last' ,
+ 'first case when abs(%d) then abs(%d) end last' %(a1,a2), # 'first case when abs(3) then abs(-1) end last' ,
+ #'first case when abs(%d+(%d)) then abs(%d)+abs(%d) end last' %(a1,a2,a3,a1), # 'first case when abs(1+1) then abs(-1)+abs(3) end last' ,
+ 'first case when %d then %d else %d end last' %(a1,a2,a3), # 'first case when 0 then 1 else 3 end last' ,
+ 'first case when %d then %d when %d then %d else %d end last' %(a1,a2,a3,a1,a2), # 'first case when 0 then 1 when 1 then 0 else 3 end last' ,
+ 'first case when %d then %d when %d then %d when %d then %d end last' %(a1,a2,a3,a1,a2,a3), # 'first case when 0 then 1 when 1 then 0 when 2 then 3 end last' ,
+ 'first case %d when %d then %d end last' %(a1,a1,a3), # 'first case 3 when 3 then 4 end last' ,
+ 'first case %d when %d then %d end last' %(a1,a2,a3), # 'first case 3 when 1 then 4 end last' ,
+ 'first case %d when %d then %d else %d end last' %(a1,a2,a3,a1), # 'first case 3 when 1 then 4 else 2 end last' ,
+ 'first case %d when null then %d when \'%d\' then %d end last' %(a1,a2,a1,a3), # 'first case 3 when null then 4 when \'3\' then 1 end last' ,
+ 'first case null when null then %d when %d then %d end last' %(a1,a2,a3), # 'first case null when null then 4 when 3 then 1 end last' ,
+ 'first case %d.0 when null then %d when \'%d\' then %d end last' %(a1,a2,a1,a3), # 'first case 3.0 when null then 4 when \'3\' then 1 end last' ,
+ 'first case null when null then %d when %d then %d end last' %(a1,a2,a3), #'first case null when null then 4 when 3 then 1 end last' ,
+ 'first q_int, case q_int + (%d) when %d then %d when %d then %d else %d end last' %(a1,a1,a1,a2,a2,a3), #'first q_int, case q_int + 1 when 1 then 1 when 2 then 2 else 3 end last' ,
+ ]
+
+ state_window_list = str(random.sample(state_window_lists,50)).replace("[","").replace("]","").replace("'first","").replace("last'","").replace("\"first","").replace("last\"","")
+
+ return state_window_list
+
+ def state_window_case(self,database):
+
+ for i in range(30):
+ cs = self.state_window_list().split(',')[i]
+ sql1 = "select _wstart,avg(q_int),min(q_smallint) from %s.stable_1 where tbname = 'stable_1_1' state_window(%s);" % (database,cs)
+ sql2 = "select _wstart,avg(q_int),min(q_smallint) from %s.stable_1_1 state_window(%s) ;" % (database,cs)
+ self.constant_check(database,sql1,sql2,0)
+ self.constant_check(database,sql1,sql2,1)
+ self.constant_check(database,sql1,sql2,2)
+
+
+
+ def constant_check(self,database,sql1,sql2,column):
+ #column =0 代表0列, column = n代表n-1列
+ tdLog.info("\n=============sql1:(%s)___sql2:(%s) ====================\n" %(sql1,sql2))
+ tdSql.query(sql1)
+ queryRows = len(tdSql.queryResult)
+
+ for i in range(queryRows):
+ tdSql.query(sql1)
+ sql1_value = tdSql.getData(i,column)
+ tdSql.execute(" flush database %s;" %database)
+ tdSql.query(sql2)
+ sql2_value = tdSql.getData(i,column)
+ self.value_check(sql1_value,sql2_value)
+
+ def value_check(self,base_value,check_value):
+ if base_value==check_value:
+ tdLog.info(f"checkEqual success, base_value={base_value},check_value={check_value}")
+ else :
+ tdLog.exit(f"checkEqual error, base_value=={base_value},check_value={check_value}")
+
+ def run(self):
+ fake = Faker('zh_CN')
+ fake_data = fake.random_int(min=-9223372036854775807, max=9223372036854775807, step=1)
+ fake_float = fake.pyfloat()
+ fake_str = fake.pystr()
+
+ startTime = time.time()
+
+ os.system("rm -rf %s/%s.sql" % (self.testcasePath,self.testcaseFilename))
+
+ self.dropandcreateDB_random("%s" %self.db, 10)
+
+ self.users_bug("%s" %self.db)
+
+ self.base_case("%s" %self.db)
+
+ self.state_window_case("%s" %self.db)
+
+
+
+ #taos -f sql
+ print("taos -f sql start!")
+ taos_cmd1 = "taos -f %s/%s.sql" % (self.testcasePath,self.testcaseFilename)
+ _ = subprocess.check_output(taos_cmd1, shell=True)
+ print("taos -f sql over!")
+
+
+ endTime = time.time()
+ print("total time %ds" % (endTime - startTime))
+
+
+
+ def stop(self):
+ tdSql.close()
+ tdLog.success("%s successfully executed" % __file__)
+
+
+tdCases.addWindows(__file__, TDTestCase())
+tdCases.addLinux(__file__, TDTestCase())