From c75aa54a3d279e398d0a8f79a2de3adbefcaa142 Mon Sep 17 00:00:00 2001
From: kailixu <klxu@taosdata.com>
Date: Mon, 22 May 2023 20:33:29 +0800
Subject: [PATCH] fix: tsdb read and append _wstart for tsma

---
 source/dnode/vnode/src/tsdb/tsdbRead.c        |  2 +-
 source/libs/planner/src/planOptimizer.c       | 14 +++-
 .../script/tsim/sma/tsmaCreateInsertQuery.sim | 77 ++++++++++++++++++-
 3 files changed, 85 insertions(+), 8 deletions(-)

diff --git a/source/dnode/vnode/src/tsdb/tsdbRead.c b/source/dnode/vnode/src/tsdb/tsdbRead.c
index b66fc42f74..fffebcd83b 100644
--- a/source/dnode/vnode/src/tsdb/tsdbRead.c
+++ b/source/dnode/vnode/src/tsdb/tsdbRead.c
@@ -765,7 +765,7 @@ static int32_t tsdbReaderCreate(SVnode* pVnode, SQueryTableDataCond* pCond, STsd
   }
 
   if (VND_IS_TSMA(pVnode)) {
-    tsdbDebug("vgId:%d, tsma is selected to query, %s", TD_VID(pVnode), idstr);
+    tsdbInfo("vgId:%d, tsma is selected to query, %s", TD_VID(pVnode), idstr);
   }
 
   initReaderStatus(&pReader->status);
diff --git a/source/libs/planner/src/planOptimizer.c b/source/libs/planner/src/planOptimizer.c
index 874caa0313..7f3435a84d 100644
--- a/source/libs/planner/src/planOptimizer.c
+++ b/source/libs/planner/src/planOptimizer.c
@@ -1311,8 +1311,13 @@ static int32_t smaIndexOptCreateSmaCols(SNodeList* pFuncs, uint64_t tableId, SNo
       }
       if (!hasWStart) {
         SColumnNode* pTail = (SColumnNode*)pCols->pTail->pNode;
-        if (pTail->colId == PRIMARYKEY_TIMESTAMP_COL_ID && pTail->colType == TSDB_DATA_TYPE_TIMESTAMP) {
-          hasWStart = true;
+        if (pTail->colId == PRIMARYKEY_TIMESTAMP_COL_ID) {
+          if (pTail->node.resType.type == TSDB_DATA_TYPE_TIMESTAMP) {
+            hasWStart = true;
+          } else {
+            nodesDestroyList(pCols);
+            return TSDB_CODE_APP_ERROR;
+          }
         }
       }
     }
@@ -1324,9 +1329,10 @@ static int32_t smaIndexOptCreateSmaCols(SNodeList* pFuncs, uint64_t tableId, SNo
       SExprNode exprNode;
       exprNode.resType = ((SExprNode*)pSmaFuncs->pHead->pNode)->resType;
       sprintf(exprNode.aliasName, "#expr_%d", index + 1);
-      code = nodesListMakeStrictAppend(
-          &pCols, smaIndexOptCreateSmaCol((SNode*)&exprNode, tableId, PRIMARYKEY_TIMESTAMP_COL_ID));
+      SNode* pkNode = smaIndexOptCreateSmaCol((SNode*)&exprNode, tableId, PRIMARYKEY_TIMESTAMP_COL_ID);
+      code = nodesListPushFront(pCols, pkNode);
       if (TSDB_CODE_SUCCESS != code) {
+        nodesDestroyNode(pkNode);
         nodesDestroyList(pCols);
         return code;
       }
diff --git a/tests/script/tsim/sma/tsmaCreateInsertQuery.sim b/tests/script/tsim/sma/tsmaCreateInsertQuery.sim
index 9b6fc96bc0..242231e408 100644
--- a/tests/script/tsim/sma/tsmaCreateInsertQuery.sim
+++ b/tests/script/tsim/sma/tsmaCreateInsertQuery.sim
@@ -78,7 +78,7 @@ if $rows != 5 then
   return -1
 endi
 
-print =============== select * from stb from memory in designated vgroup
+print =============== select with _wstart from stb from memory in designated vgroup
 sql select _wstart, _wend, min(c1),max(c2),max(c1) from stb interval(5m,10s) sliding(5m);
 print $data00 $data01 $data02 $data03 $data04
 print $data10 $data11 $data12 $data13 $data14
@@ -102,6 +102,30 @@ if $data04 != 20 then
   return -1
 endi
 
+print =============== select without _wstart from stb from memory in designated vgroup
+sql select min(c1),max(c2),max(c1) from stb interval(5m,10s) sliding(5m);
+print $data00 $data01 $data02
+print $data10 $data11 $data12
+if $rows != 1 then
+  print rows $rows != 1
+  return -1
+endi
+
+if $data00 != -13 then
+  print data00 $data00 != -13
+  return -1
+endi
+
+if $data01 != 20.00000 then
+  print data01 $data01 != 20.00000
+  return -1
+endi
+
+if $data02 != 20 then
+  print data02 $data02 != 20
+  return -1
+endi
+
 print =============== select * from stb from memory in common vgroups
 sql select _wstart, _wend, min(c1),max(c2),max(c1),max(c3) from stb interval(5m,10s) sliding(5m);
 print $data00 $data01 $data02 $data03 $data04 $data05
@@ -148,7 +172,7 @@ if $rows != 5 then
   return -1
 endi
 
-print =============== select * from stb from memory in designated vgroup after reboot
+print =============== select with _wstart from stb from memory in designated vgroup after reboot
 sql select _wstart, _wend, min(c1),max(c2),max(c1) from stb interval(5m,10s) sliding(5m);
 print $data00 $data01 $data02 $data03 $data04
 print $data10 $data11 $data12 $data13 $data14
@@ -172,6 +196,30 @@ if $data04 != 20 then
   return -1
 endi
 
+print =============== select without _wstart from stb from memory in designated vgroup after reboot
+sql select min(c1),max(c2),max(c1) from stb interval(5m,10s) sliding(5m);
+print $data00 $data01 $data02
+print $data10 $data11 $data12
+if $rows != 1 then
+  print rows $rows != 1
+  return -1
+endi
+
+if $data00 != -13 then
+  print data00 $data00 != -13
+  return -1
+endi
+
+if $data01 != 20.00000 then
+  print data01 $data01 != 20.00000
+  return -1
+endi
+
+if $data02 != 20 then
+  print data02 $data02 != 20
+  return -1
+endi
+
 print =============== select * from stb from memory in common vgroups after reboot
 sql select _wstart, _wend, min(c1),max(c2),max(c1),max(c3) from stb interval(5m,10s) sliding(5m);
 print $data00 $data01 $data02 $data03 $data04 $data05
@@ -218,7 +266,7 @@ if $rows != 5 then
   return -1
 endi
 
-print =============== select * from stb from file in designated vgroup
+print =============== select with _wstart from stb from file in designated vgroup
 sql select _wstart, _wend, min(c1),max(c2),max(c1) from stb interval(5m,10s) sliding(5m);
 print $data00 $data01 $data02 $data03 $data04
 if $rows != 1 then
@@ -241,6 +289,29 @@ if $data04 != 20 then
   return -1
 endi
 
+print =============== select without _wstart from stb from file in designated vgroup
+sql select _wend, min(c1),max(c2),max(c1) from stb interval(5m,10s) sliding(5m);
+print $data00 $data01 $data02 $data03
+if $rows != 1 then
+  print rows $rows != 1
+  return -1
+endi
+
+if $data01 != -13 then
+  print data01 $data01 != -13
+  return -1
+endi
+
+if $data02 != 20.00000 then
+  print data02 $data02 != 20.00000
+  return -1
+endi
+
+if $data03 != 20 then
+  print data03 $data03 != 20
+  return -1
+endi
+
 print =============== select * from stb from file in common vgroups
 sql select _wstart, _wend, min(c1),max(c2),max(c1),max(c3) from stb interval(5m,10s) sliding(5m);
 print $data00 $data01 $data02 $data03 $data04 $data05
-- 
GitLab