diff --git a/include/libs/function/tudf.h b/include/libs/function/tudf.h
index 0000972f5e..d59a7c23f7 100644
--- a/include/libs/function/tudf.h
+++ b/include/libs/function/tudf.h
@@ -29,7 +29,11 @@ extern "C" {
#endif
#define UDF_LISTEN_PIPE_NAME_LEN 32
-#define UDF_LISTEN_PIPE_NAME_PREFIX "udfd.sock."
+#ifdef _WIN32
+#define UDF_LISTEN_PIPE_NAME_PREFIX "\\\\?\\pipe\\udfd.sock"
+#else
+#define UDF_LISTEN_PIPE_NAME_PREFIX ".udfd.sock."
+#endif
#define UDF_DNODE_ID_ENV_NAME "DNODE_ID"
//======================================================================================
@@ -129,8 +133,8 @@ int32_t udfAggFinalize(struct SqlFunctionCtx *pCtx, SSDataBlock* pBlock);
// begin API to UDF writer.
// dynamic lib init and destroy
-typedef int32_t (*TUdfSetupFunc)();
-typedef int32_t (*TUdfTeardownFunc)();
+typedef int32_t (*TUdfInitFunc)();
+typedef int32_t (*TUdfDestroyFunc)();
//TODO: add API to check function arguments type, number etc.
@@ -242,7 +246,6 @@ static FORCE_INLINE int32_t udfColSetRow(SUdfColumn* pColumn, uint32_t currentRo
return 0;
}
-typedef int32_t (*TUdfFreeUdfColumnFunc)(SUdfColumn* column);
typedef int32_t (*TUdfScalarProcFunc)(SUdfDataBlock* block, SUdfColumn *resultCol);
typedef int32_t (*TUdfAggStartFunc)(SUdfInterBuf *buf);
diff --git a/include/libs/scalar/scalar.h b/include/libs/scalar/scalar.h
index 0c7db45c4b..555274599a 100644
--- a/include/libs/scalar/scalar.h
+++ b/include/libs/scalar/scalar.h
@@ -91,6 +91,8 @@ int32_t winDurFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOu
int32_t qStartTsFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
int32_t qEndTsFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
+int32_t qTbnameFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
+
#ifdef __cplusplus
}
#endif
diff --git a/source/client/test/clientTests.cpp b/source/client/test/clientTests.cpp
index 2874220121..fc5781cb4d 100644
--- a/source/client/test/clientTests.cpp
+++ b/source/client/test/clientTests.cpp
@@ -587,15 +587,34 @@ TEST(testCase, projection_query_tables) {
}
taos_free_result(pRes);
+ pRes = taos_query(pConn, "create stable st2 (ts timestamp, k int) tags(a int)");
+ if (taos_errno(pRes) != 0) {
+ printf("failed to create table tu, reason:%s\n", taos_errstr(pRes));
+ }
+ taos_free_result(pRes);
+
pRes = taos_query(pConn, "create table tu using st1 tags(1)");
if (taos_errno(pRes) != 0) {
printf("failed to create table tu, reason:%s\n", taos_errstr(pRes));
}
taos_free_result(pRes);
- for(int32_t i = 0; i < 10000; ++i) {
- char sql[512] = {0};
- sprintf(sql, "insert into tu values(now+%da, %d)", i, i);
+ pRes = taos_query(pConn, "create table tu2 using st2 tags(1)");
+ if (taos_errno(pRes) != 0) {
+ printf("failed to create table tu, reason:%s\n", taos_errstr(pRes));
+ }
+ taos_free_result(pRes);
+
+ for(int32_t i = 0; i < 10000000; i += 20) {
+ char sql[1024] = {0};
+ sprintf(sql,
+ "insert into tu values(now+%da, %d)(now+%da, %d)(now+%da, %d)(now+%da, %d)"
+ "(now+%da, %d)(now+%da, %d)(now+%da, %d)(now+%da, %d)(now+%da, %d)(now+%da, %d)"
+ "(now+%da, %d)(now+%da, %d)(now+%da, %d)(now+%da, %d)"
+ "(now+%da, %d)(now+%da, %d)(now+%da, %d)(now+%da, %d)(now+%da, %d)(now+%da, %d)",
+ i, i, i + 1, i + 1, i + 2, i + 2, i + 3, i + 3, i + 4, i + 4, i + 5, i + 5, i + 6, i + 6, i + 7, i + 7,
+ i + 8, i + 8, i + 9, i + 9, i + 10, i + 10, i + 11, i + 11, i + 12, i + 12, i + 13, i + 13, i + 14, i + 14,
+ i + 15, i + 15, i + 16, i + 16, i + 17, i + 17, i + 18, i + 18, i + 19, i + 19);
TAOS_RES* p = taos_query(pConn, sql);
if (taos_errno(p) != 0) {
printf("failed to insert data, reason:%s\n", taos_errstr(p));
@@ -604,24 +623,44 @@ TEST(testCase, projection_query_tables) {
taos_free_result(p);
}
- pRes = taos_query(pConn, "select * from tu");
- if (taos_errno(pRes) != 0) {
- printf("failed to select from table, reason:%s\n", taos_errstr(pRes));
- taos_free_result(pRes);
- ASSERT_TRUE(false);
+ printf("start to insert next table\n");
+
+ for(int32_t i = 0; i < 10000000; i += 20) {
+ char sql[1024] = {0};
+ sprintf(sql,
+ "insert into tu2 values(now+%da, %d)(now+%da, %d)(now+%da, %d)(now+%da, %d)"
+ "(now+%da, %d)(now+%da, %d)(now+%da, %d)(now+%da, %d)(now+%da, %d)(now+%da, %d)"
+ "(now+%da, %d)(now+%da, %d)(now+%da, %d)(now+%da, %d)"
+ "(now+%da, %d)(now+%da, %d)(now+%da, %d)(now+%da, %d)(now+%da, %d)(now+%da, %d)",
+ i, i, i + 1, i + 1, i + 2, i + 2, i + 3, i + 3, i + 4, i + 4, i + 5, i + 5, i + 6, i + 6, i + 7, i + 7,
+ i + 8, i + 8, i + 9, i + 9, i + 10, i + 10, i + 11, i + 11, i + 12, i + 12, i + 13, i + 13, i + 14, i + 14,
+ i + 15, i + 15, i + 16, i + 16, i + 17, i + 17, i + 18, i + 18, i + 19, i + 19);
+ TAOS_RES* p = taos_query(pConn, sql);
+ if (taos_errno(p) != 0) {
+ printf("failed to insert data, reason:%s\n", taos_errstr(p));
+ }
+
+ taos_free_result(p);
}
- TAOS_ROW pRow = NULL;
- TAOS_FIELD* pFields = taos_fetch_fields(pRes);
- int32_t numOfFields = taos_num_fields(pRes);
+// pRes = taos_query(pConn, "select * from tu");
+// if (taos_errno(pRes) != 0) {
+// printf("failed to select from table, reason:%s\n", taos_errstr(pRes));
+// taos_free_result(pRes);
+// ASSERT_TRUE(false);
+// }
- char str[512] = {0};
- while ((pRow = taos_fetch_row(pRes)) != NULL) {
- int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
- printf("%s\n", str);
- }
+// TAOS_ROW pRow = NULL;
+// TAOS_FIELD* pFields = taos_fetch_fields(pRes);
+// int32_t numOfFields = taos_num_fields(pRes);
+//
+// char str[512] = {0};
+// while ((pRow = taos_fetch_row(pRes)) != NULL) {
+// int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
+// printf("%s\n", str);
+// }
- taos_free_result(pRes);
+// taos_free_result(pRes);
taos_close(pConn);
}
@@ -659,7 +698,7 @@ TEST(testCase, agg_query_tables) {
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
ASSERT_NE(pConn, nullptr);
- TAOS_RES* pRes = taos_query(pConn, "use db");
+ TAOS_RES* pRes = taos_query(pConn, "use abc1");
if (taos_errno(pRes) != 0) {
printf("failed to use db, reason:%s\n", taos_errstr(pRes));
taos_free_result(pRes);
diff --git a/source/common/src/tdatablock.c b/source/common/src/tdatablock.c
index 4f4b8b196f..a4b36dcb67 100644
--- a/source/common/src/tdatablock.c
+++ b/source/common/src/tdatablock.c
@@ -363,9 +363,9 @@ int32_t blockDataMerge(SSDataBlock* pDest, const SSDataBlock* pSrc, SArray* pInd
for (int32_t i = 0; i < pDest->info.numOfCols; ++i) {
int32_t mapIndex = i;
- if (pIndexMap) {
- mapIndex = *(int32_t*)taosArrayGet(pIndexMap, i);
- }
+// if (pIndexMap) {
+// mapIndex = *(int32_t*)taosArrayGet(pIndexMap, i);
+// }
SColumnInfoData* pCol2 = taosArrayGet(pDest->pDataBlock, i);
SColumnInfoData* pCol1 = taosArrayGet(pSrc->pDataBlock, mapIndex);
@@ -493,12 +493,12 @@ SSDataBlock* blockDataExtractBlock(SSDataBlock* pBlock, int32_t startIndex, int3
for (int32_t j = startIndex; j < (startIndex + rowCount); ++j) {
bool isNull = false;
if (pBlock->pBlockAgg == NULL) {
- isNull = colDataIsNull(pColData, pBlock->info.rows, j, NULL);
+ isNull = colDataIsNull_s(pColData, pBlock->info.rows);
} else {
isNull = colDataIsNull(pColData, pBlock->info.rows, j, pBlock->pBlockAgg[i]);
}
- char* p = colDataGetData(pColData, j);
+ char* p = colDataGetData(pColData, j);
colDataAppend(pDstCol, j - startIndex, p, isNull);
}
}
diff --git a/source/libs/executor/inc/executorimpl.h b/source/libs/executor/inc/executorimpl.h
index bc6139c304..3b5d0c209f 100644
--- a/source/libs/executor/inc/executorimpl.h
+++ b/source/libs/executor/inc/executorimpl.h
@@ -87,9 +87,7 @@ typedef struct SResultInfo { // TODO refactor
typedef struct STableQueryInfo {
TSKEY lastKey; // last check ts, todo remove it later
SResultRowPosition pos; // current active time window
-// int32_t groupIndex; // group id in table list
// SVariant tag;
-// SResultRowInfo resInfo; // result info
} STableQueryInfo;
typedef enum {
@@ -363,11 +361,12 @@ typedef struct STableScanInfo {
} STableScanInfo;
typedef struct STagScanInfo {
- SColumnInfo *pCols;
- SSDataBlock *pRes;
- int32_t totalTables;
- int32_t curPos;
- void *pReader;
+ SColumnInfo *pCols;
+ SSDataBlock *pRes;
+ SArray *pColMatchInfo;
+ int32_t curPos;
+ SReadHandle readHandle;
+ STableGroupInfo *pTableGroups;
} STagScanInfo;
typedef struct SStreamBlockScanInfo {
@@ -579,9 +578,8 @@ typedef struct SSortOperatorInfo {
uint32_t sortBufSize; // max buffer size for in-memory sort
SArray* pSortInfo;
SSortHandle* pSortHandle;
- SArray* inputSlotMap; // for index map from table scan output
+ SArray* pColMatchInfo; // for index map from table scan output
int32_t bufPageSize;
-// int32_t numOfRowsInRes;
// TODO extact struct
int64_t startTs; // sort start time
@@ -646,7 +644,7 @@ void cleanupAggSup(SAggSupporter* pAggSup);
void destroyBasicOperatorInfo(void* param, int32_t numOfOutput);
void appendOneRowToDataBlock(SSDataBlock* pBlock, STupleHandle* pTupleHandle);
-SSDataBlock* getSortedBlockData(SSortHandle* pHandle, SSDataBlock* pDataBlock, int32_t capacity);
+SSDataBlock* getSortedBlockData(SSortHandle* pHandle, SSDataBlock* pDataBlock, int32_t capacity, SArray* pColMatchInfo);
SSDataBlock* loadNextDataBlock(void* param);
void setResultRowInitCtx(SResultRow* pResult, SqlFunctionCtx* pCtx, int32_t numOfOutput, int32_t* rowCellInfoOffset);
@@ -704,7 +702,7 @@ SOperatorInfo* createTimeSliceOperatorInfo(SOperatorInfo* downstream, SExprInfo*
SSDataBlock* pResultBlock, SExecTaskInfo* pTaskInfo);
SOperatorInfo* createJoinOperatorInfo(SOperatorInfo** pDownstream, int32_t numOfDownstream, SExprInfo* pExprInfo, int32_t numOfCols, SSDataBlock* pResBlock, SNode* pOnCondition, SExecTaskInfo* pTaskInfo);
-SOperatorInfo* createTagScanOperatorInfo(void* pReaderHandle, SExprInfo* pExpr, int32_t numOfOutput, SExecTaskInfo* pTaskInfo);
+SOperatorInfo* createTagScanOperatorInfo(SReadHandle* pReadHandle, SExprInfo* pExpr, int32_t numOfOutput, SSDataBlock* pResBlock, SArray* pColMatchInfo, STableGroupInfo* pTableGroupInfo, SExecTaskInfo* pTaskInfo);
#if 0
SOperatorInfo* createTableSeqScanOperatorInfo(void* pTsdbReadHandle, STaskRuntimeEnv* pRuntimeEnv);
@@ -717,7 +715,6 @@ int32_t projectApplyFunctions(SExprInfo* pExpr, SSDataBlock* pResult, SSDataBloc
void setInputDataBlock(SOperatorInfo* pOperator, SqlFunctionCtx* pCtx, SSDataBlock* pBlock, int32_t order, bool createDummyCol);
-void finalizeQueryResult(SqlFunctionCtx* pCtx, int32_t numOfOutput);
void copyTsColoum(SSDataBlock* pRes, SqlFunctionCtx* pCtx, int32_t numOfOutput);
STableQueryInfo* createTableQueryInfo(void* buf, STimeWindow win);
diff --git a/source/libs/executor/inc/tsort.h b/source/libs/executor/inc/tsort.h
index 2072707b30..d74628a72f 100644
--- a/source/libs/executor/inc/tsort.h
+++ b/source/libs/executor/inc/tsort.h
@@ -117,18 +117,25 @@ STupleHandle* tsortNextTuple(SSortHandle* pHandle);
/**
*
* @param pHandle
- * @param colIndex
+ * @param colId
* @return
*/
-bool tsortIsNullVal(STupleHandle* pVHandle, int32_t colIndex);
+bool tsortIsNullVal(STupleHandle* pVHandle, int32_t colId);
/**
*
* @param pHandle
- * @param colIndex
+ * @param colId
* @return
*/
-void* tsortGetValue(STupleHandle* pVHandle, int32_t colIndex);
+void* tsortGetValue(STupleHandle* pVHandle, int32_t colId);
+
+/**
+ *
+ * @param pSortHandle
+ * @return
+ */
+SSDataBlock* tsortGetSortedDataBlock(const SSortHandle* pSortHandle);
#ifdef __cplusplus
}
diff --git a/source/libs/executor/src/executorimpl.c b/source/libs/executor/src/executorimpl.c
index a237eb0e7d..943d4b2783 100644
--- a/source/libs/executor/src/executorimpl.c
+++ b/source/libs/executor/src/executorimpl.c
@@ -3520,7 +3520,7 @@ static SSDataBlock* doSortedMerge(SOperatorInfo* pOperator) {
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
SSortedMergeOperatorInfo* pInfo = pOperator->info;
if (pOperator->status == OP_RES_TO_RETURN) {
- return getSortedBlockData(pInfo->pSortHandle, pInfo->binfo.pRes, pOperator->resultInfo.capacity);
+ return getSortedBlockData(pInfo->pSortHandle, pInfo->binfo.pRes, pOperator->resultInfo.capacity, NULL);
}
int32_t numOfBufPage = pInfo->sortBufSize / pInfo->bufPageSize;
@@ -4701,7 +4701,7 @@ static SArray* extractTableIdList(const STableGroupInfo* pTableGroupInfo);
static SArray* extractColumnInfo(SNodeList* pNodeList);
static SArray* extractColMatchInfo(SNodeList* pNodeList, SDataBlockDescNode* pOutputNodeList, int32_t* numOfOutputCols);
-static SArray* createSortInfo(SNodeList* pNodeList, SNodeList* pNodeListTarget);
+static SArray* createSortInfo(SNodeList* pNodeList);
static SArray* createIndexMap(SNodeList* pNodeList);
static SArray* extractPartitionColInfo(SNodeList* pNodeList);
static int32_t initQueryTableDataCond(SQueryTableDataCond* pCond, const STableScanPhysiNode* pTableScanNode);
@@ -4739,7 +4739,6 @@ SOperatorInfo* createOperatorTree(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo
SSDataBlock* pResBlock = createResDataBlock(pScanPhyNode->node.pOutputDataBlockDesc);
SQueryTableDataCond cond = {0};
-
int32_t code = initQueryTableDataCond(&cond, pTableScanNode);
if (code != TSDB_CODE_SUCCESS) {
return NULL;
@@ -4783,6 +4782,25 @@ SOperatorInfo* createOperatorTree(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo
pHandle, pResBlock, &pScanNode->tableName, pScanNode->node.pConditions, pSysScanPhyNode->mgmtEpSet, colList,
pTaskInfo, pSysScanPhyNode->showRewrite, pSysScanPhyNode->accountId);
return pOperator;
+ } else if (QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN == type) {
+ STagScanPhysiNode* pScanPhyNode = (STagScanPhysiNode*) pPhyNode;
+ SSDataBlock* pResBlock = createResDataBlock(pScanPhyNode->node.pOutputDataBlockDesc);
+
+ int32_t code =
+ doCreateTableGroup(pHandle->meta, pScanPhyNode->tableType, pScanPhyNode->uid, pTableGroupInfo, queryId, taskId);
+ if (code != TSDB_CODE_SUCCESS) {
+ return NULL;
+ }
+
+ int32_t num = 0;
+ SExprInfo* pExprInfo = createExprInfo(pScanPhyNode->pScanPseudoCols, NULL, &num);
+
+ int32_t numOfOutputCols = 0;
+ SArray* colList =
+ extractColMatchInfo(pScanPhyNode->pScanPseudoCols, pScanPhyNode->node.pOutputDataBlockDesc, &numOfOutputCols);
+
+ SOperatorInfo* pOperator = createTagScanOperatorInfo(pHandle, pExprInfo, num, pResBlock, colList, pTableGroupInfo, pTaskInfo);
+ return pOperator;
} else {
ASSERT(0);
}
@@ -4852,16 +4870,16 @@ SOperatorInfo* createOperatorTree(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo
SSortPhysiNode* pSortPhyNode = (SSortPhysiNode*)pPhyNode;
SSDataBlock* pResBlock = createResDataBlock(pPhyNode->pOutputDataBlockDesc);
- SArray* info = createSortInfo(pSortPhyNode->pSortKeys, pSortPhyNode->pTargets);
- SArray* slotMap = createIndexMap(pSortPhyNode->pTargets);
+ SArray* info = createSortInfo(pSortPhyNode->pSortKeys);
int32_t numOfCols = 0;
- SExprInfo* pExprInfo = NULL;
- if (pSortPhyNode->pExprs != NULL) {
- pExprInfo = createExprInfo(pSortPhyNode->pExprs, NULL, &numOfCols);
- }
+ SExprInfo* pExprInfo = createExprInfo(pSortPhyNode->pExprs, NULL, &numOfCols);
- pOptr = createSortOperatorInfo(ops[0], pResBlock, info, pExprInfo, numOfCols, slotMap, pTaskInfo);
+ int32_t numOfOutputCols = 0;
+ SArray* pColList =
+ extractColMatchInfo(pSortPhyNode->pTargets, pSortPhyNode->node.pOutputDataBlockDesc, &numOfOutputCols);
+
+ pOptr = createSortOperatorInfo(ops[0], pResBlock, info, pExprInfo, numOfCols, pColList, pTaskInfo);
} else if (QUERY_NODE_PHYSICAL_PLAN_SESSION_WINDOW == type) {
SSessionWinodwPhysiNode* pSessionNode = (SSessionWinodwPhysiNode*)pPhyNode;
@@ -5019,7 +5037,7 @@ SArray* extractPartitionColInfo(SNodeList* pNodeList) {
return pList;
}
-SArray* createSortInfo(SNodeList* pNodeList, SNodeList* pNodeListTarget) {
+SArray* createSortInfo(SNodeList* pNodeList) {
size_t numOfCols = LIST_LENGTH(pNodeList);
SArray* pList = taosArrayInit(numOfCols, sizeof(SBlockOrderInfo));
if (pList == NULL) {
@@ -5034,22 +5052,7 @@ SArray* createSortInfo(SNodeList* pNodeList, SNodeList* pNodeListTarget) {
bi.nullFirst = (pSortKey->nullOrder == NULL_ORDER_FIRST);
SColumnNode* pColNode = (SColumnNode*)pSortKey->pExpr;
-
- bool found = false;
- for (int32_t j = 0; j < LIST_LENGTH(pNodeListTarget); ++j) {
- STargetNode* pTarget = (STargetNode*)nodesListGetNode(pNodeListTarget, j);
-
- SColumnNode* pColNodeT = (SColumnNode*)pTarget->pExpr;
- if (pColNode->slotId == pColNodeT->slotId) { // to find slotId in PhysiSort OutputDataBlockDesc
- bi.slotId = pTarget->slotId;
- found = true;
- break;
- }
- }
-
- if (!found) {
- qError("sort slot id does not found");
- }
+ bi.slotId = pColNode->slotId;
taosArrayPush(pList, &bi);
}
@@ -5088,7 +5091,7 @@ SArray* extractColMatchInfo(SNodeList* pNodeList, SDataBlockDescNode* pOutputNod
SColMatchInfo c = {0};
c.output = true;
- c.colId = pColNode->colId;
+ c.colId = pColNode->colId;
c.targetSlotId = pNode->slotId;
taosArrayPush(pList, &c);
}
@@ -5166,9 +5169,7 @@ tsdbReaderT doCreateDataReader(STableScanPhysiNode* pTableScanNode, SReadHandle*
if (code != TSDB_CODE_SUCCESS) {
goto _error;
}
-#if 0
- return tsdbQueryTables(pHandle->reader, &cond, pTableGroupInfo, queryId, taskId);
-#endif
+
return tsdbQueryTables(pHandle->vnode, &cond, pTableGroupInfo, queryId, taskId);
_error:
diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c
index 8c9fdfe4e6..b728daa3bb 100644
--- a/source/libs/executor/src/scanoperator.c
+++ b/source/libs/executor/src/scanoperator.c
@@ -13,15 +13,16 @@
* along with this program. If not, see .
*/
-#include "ttime.h"
+#include
#include "filter.h"
#include "function.h"
#include "functionMgt.h"
#include "os.h"
#include "querynodes.h"
+#include "systable.h"
#include "tglobal.h"
#include "tname.h"
-#include "systable.h"
+#include "ttime.h"
#include "tdatablock.h"
#include "tmsg.h"
@@ -1159,16 +1160,17 @@ SOperatorInfo* createSysTableScanOperatorInfo(void* readHandle, SSDataBlock* pRe
}
static SSDataBlock* doTagScan(SOperatorInfo* pOperator) {
-#if 0
if (pOperator->status == OP_EXEC_DONE) {
return NULL;
}
+ SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
+
+#if 0
int32_t maxNumOfTables = (int32_t)pResultInfo->capacity;
STagScanInfo *pInfo = pOperator->info;
SSDataBlock *pRes = pInfo->pRes;
- *newgroup = false;
int32_t count = 0;
SArray* pa = GET_TABLEGROUP(pRuntimeEnv, 0);
@@ -1237,55 +1239,54 @@ static SSDataBlock* doTagScan(SOperatorInfo* pOperator) {
pOperator->status = OP_EXEC_DONE;
//qDebug("QInfo:0x%"PRIx64" create count(tbname) query, res:%d rows:1", GET_TASKID(pRuntimeEnv), count);
} else { // return only the tags|table name etc.
- SExprInfo* pExprInfo = &pOperator->pExpr[0]; // todo use the column list instead of exprinfo
+#endif
- count = 0;
- while(pInfo->curPos < pInfo->totalTables && count < maxNumOfTables) {
- int32_t i = pInfo->curPos++;
+ STagScanInfo* pInfo = pOperator->info;
+ SExprInfo* pExprInfo = &pOperator->pExpr[0];
+ SSDataBlock* pRes = pInfo->pRes;
- STableQueryInfo* item = taosArrayGetP(pa, i);
+ SArray* pa = taosArrayGetP(pInfo->pTableGroups->pGroupList, 0);
- char *data = NULL, *dst = NULL;
- int16_t type = 0, bytes = 0;
- for(int32_t j = 0; j < pOperator->numOfExprs; ++j) {
- // not assign value in case of user defined constant output column
- if (TSDB_COL_IS_UD_COL(pExprInfo[j].base.pColumns->flag)) {
- continue;
- }
+ char str[512] = {0};
+ int32_t count = 0;
+ SMetaReader mr = {0};
- SColumnInfoData* pColInfo = taosArrayGet(pRes->pDataBlock, j);
- type = pExprInfo[j].base.resSchema.type;
- bytes = pExprInfo[j].base.resSchema.bytes;
+ while (pInfo->curPos < pInfo->pTableGroups->numOfTables && count < pOperator->resultInfo.capacity) {
+ STableKeyInfo* item = taosArrayGet(pa, pInfo->curPos);
- if (pExprInfo[j].base.pColumns->info.colId == TSDB_TBNAME_COLUMN_INDEX) {
- data = tsdbGetTableName(item->pTable);
- } else {
- data = tsdbGetTableTagVal(item->pTable, pExprInfo[j].base.pColumns->info.colId, type, bytes);
- }
+ for (int32_t j = 0; j < pOperator->numOfExprs; ++j) {
+ SColumnInfoData* pDst = taosArrayGet(pRes->pDataBlock, pExprInfo[j].base.resSchema.slotId);
- dst = pColInfo->pData + count * pExprInfo[j].base.resSchema.bytes;
- doSetTagValueToResultBuf(dst, data, type, bytes);
+ // refactor later
+ if (fmIsScanPseudoColumnFunc(pExprInfo[j].pExpr->_function.functionId)) {
+ metaReaderInit(&mr, pInfo->readHandle.meta, 0);
+ metaGetTableEntryByUid(&mr, item->uid);
+
+ STR_TO_VARSTR(str, mr.me.name);
+ metaReaderClear(&mr);
+
+ colDataAppend(pDst, count, str, false);
+
+ // data = tsdbGetTableTagVal(item->pTable, pExprInfo[j].base.pColumns->info.colId, type, bytes);
+ // dst = pColInfo->pData + count * pExprInfo[j].base.resSchema.bytes;
+ // doSetTagValueToResultBuf(dst, data, type, bytes);
}
count += 1;
}
- if (pInfo->curPos >= pInfo->totalTables) {
+ if (++pInfo->curPos >= pInfo->pTableGroups->numOfTables) {
pOperator->status = OP_EXEC_DONE;
}
-
- //qDebug("QInfo:0x%"PRIx64" create tag values results completed, rows:%d", GET_TASKID(pRuntimeEnv), count);
}
+ // qDebug("QInfo:0x%"PRIx64" create tag values results completed, rows:%d", GET_TASKID(pRuntimeEnv), count);
if (pOperator->status == OP_EXEC_DONE) {
- setTaskStatus(pOperator->pRuntimeEnv, TASK_COMPLETED);
+ setTaskStatus(pTaskInfo, TASK_COMPLETED);
}
pRes->info.rows = count;
- return (pRes->info.rows == 0)? NULL:pInfo->pRes;
-
-#endif
- return TSDB_CODE_SUCCESS;
+ return (pRes->info.rows == 0) ? NULL : pInfo->pRes;
}
static void destroyTagScanOperatorInfo(void* param, int32_t numOfOutput) {
@@ -1293,14 +1294,18 @@ static void destroyTagScanOperatorInfo(void* param, int32_t numOfOutput) {
pInfo->pRes = blockDataDestroy(pInfo->pRes);
}
-SOperatorInfo* createTagScanOperatorInfo(void* readHandle, SExprInfo* pExpr, int32_t numOfOutput, SExecTaskInfo* pTaskInfo) {
+SOperatorInfo* createTagScanOperatorInfo(SReadHandle* pReadHandle, SExprInfo* pExpr, int32_t numOfOutput,
+ SSDataBlock* pResBlock, SArray* pColMatchInfo, STableGroupInfo* pTableGroupInfo, SExecTaskInfo* pTaskInfo) {
STagScanInfo* pInfo = taosMemoryCalloc(1, sizeof(STagScanInfo));
SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
if (pInfo == NULL || pOperator == NULL) {
goto _error;
}
- pInfo->pReader = readHandle;
+ pInfo->pTableGroups = pTableGroupInfo;
+ pInfo->pColMatchInfo = pColMatchInfo;
+ pInfo->pRes = pResBlock;
+ pInfo->readHandle = *pReadHandle;
pInfo->curPos = 0;
pOperator->name = "TagScanOperator";
pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN;
@@ -1308,9 +1313,12 @@ SOperatorInfo* createTagScanOperatorInfo(void* readHandle, SExprInfo* pExpr, int
pOperator->status = OP_NOT_OPENED;
pOperator->info = pInfo;
pOperator->pExpr = pExpr;
- pOperator->numOfExprs = numOfOutput;
+ pOperator->numOfExprs = numOfOutput;
pOperator->pTaskInfo = pTaskInfo;
+ initResultSizeInfo(pOperator, 4096);
+ blockDataEnsureCapacity(pInfo->pRes, pOperator->resultInfo.capacity);
+
pOperator->fpSet =
createOperatorFpSet(operatorDummyOpenFn, doTagScan, NULL, NULL, destroyTagScanOperatorInfo, NULL, NULL, NULL);
diff --git a/source/libs/executor/src/sortoperator.c b/source/libs/executor/src/sortoperator.c
index 0f973b0cf0..619651f11f 100644
--- a/source/libs/executor/src/sortoperator.c
+++ b/source/libs/executor/src/sortoperator.c
@@ -5,7 +5,7 @@ static SSDataBlock* doSort(SOperatorInfo* pOperator);
static void destroyOrderOperatorInfo(void* param, int32_t numOfOutput);
SOperatorInfo* createSortOperatorInfo(SOperatorInfo* downstream, SSDataBlock* pResBlock, SArray* pSortInfo, SExprInfo* pExprInfo, int32_t numOfCols,
- SArray* pIndexMap, SExecTaskInfo* pTaskInfo) {
+ SArray* pColMatchColInfo, SExecTaskInfo* pTaskInfo) {
SSortOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SSortOperatorInfo));
SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
int32_t rowSize = pResBlock->info.rowSize;
@@ -20,17 +20,19 @@ SOperatorInfo* createSortOperatorInfo(SOperatorInfo* downstream, SSDataBlock* pR
pInfo->binfo.pRes = pResBlock;
initResultSizeInfo(pOperator, 1024);
- pInfo->bufPageSize = rowSize < 1024 ? 1024 * 2 : rowSize * 2; // there are headers, so pageSize = rowSize + header
- pInfo->sortBufSize = pInfo->bufPageSize * 16; // TODO dynamic set the available sort buffer
pInfo->pSortInfo = pSortInfo;
- pInfo->inputSlotMap = pIndexMap;
+ pInfo->pColMatchInfo= pColMatchColInfo;
pOperator->name = "SortOperator";
pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_SORT;
pOperator->blocking = true;
pOperator->status = OP_NOT_OPENED;
pOperator->info = pInfo;
+ // lazy evaluation for the following parameter since the input datablock is not known till now.
+// pInfo->bufPageSize = rowSize < 1024 ? 1024 * 2 : rowSize * 2; // there are headers, so pageSize = rowSize + header
+// pInfo->sortBufSize = pInfo->bufPageSize * 16; // TODO dynamic set the available sort buffer
+
pOperator->pTaskInfo = pTaskInfo;
pOperator->fpSet =
createOperatorFpSet(operatorDummyOpenFn, doSort, NULL, NULL, destroyOrderOperatorInfo, NULL, NULL, NULL);
@@ -45,14 +47,12 @@ SOperatorInfo* createSortOperatorInfo(SOperatorInfo* downstream, SSDataBlock* pR
return NULL;
}
-// TODO merge aggregate super table
void appendOneRowToDataBlock(SSDataBlock* pBlock, STupleHandle* pTupleHandle) {
for (int32_t i = 0; i < pBlock->info.numOfCols; ++i) {
SColumnInfoData* pColInfo = taosArrayGet(pBlock->pDataBlock, i);
-
bool isNull = tsortIsNullVal(pTupleHandle, i);
if (isNull) {
- colDataAppend(pColInfo, pBlock->info.rows, NULL, true);
+ colDataAppendNULL(pColInfo, pBlock->info.rows);
} else {
char* pData = tsortGetValue(pTupleHandle, i);
colDataAppend(pColInfo, pBlock->info.rows, pData, false);
@@ -62,11 +62,12 @@ void appendOneRowToDataBlock(SSDataBlock* pBlock, STupleHandle* pTupleHandle) {
pBlock->info.rows += 1;
}
-SSDataBlock* getSortedBlockData(SSortHandle* pHandle, SSDataBlock* pDataBlock, int32_t capacity) {
+SSDataBlock* getSortedBlockData(SSortHandle* pHandle, SSDataBlock* pDataBlock, int32_t capacity, SArray* pColMatchInfo) {
blockDataCleanup(pDataBlock);
- blockDataEnsureCapacity(pDataBlock, capacity);
+ ASSERT(taosArrayGetSize(pColMatchInfo) == pDataBlock->info.numOfCols);
- blockDataEnsureCapacity(pDataBlock, capacity);
+ SSDataBlock* p = tsortGetSortedDataBlock(pHandle);
+ blockDataEnsureCapacity(p, capacity);
while (1) {
STupleHandle* pTupleHandle = tsortNextTuple(pHandle);
@@ -74,12 +75,32 @@ SSDataBlock* getSortedBlockData(SSortHandle* pHandle, SSDataBlock* pDataBlock, i
break;
}
- appendOneRowToDataBlock(pDataBlock, pTupleHandle);
- if (pDataBlock->info.rows >= capacity) {
+ appendOneRowToDataBlock(p, pTupleHandle);
+ if (p->info.rows >= capacity) {
return pDataBlock;
}
}
+ if (p->info.rows > 0) {
+ int32_t numOfCols = taosArrayGetSize(pColMatchInfo);
+ for(int32_t i = 0; i < numOfCols; ++i) {
+ SColMatchInfo* pmInfo = taosArrayGet(pColMatchInfo, i);
+
+ for(int32_t j = 0; j < p->info.numOfCols; ++j) {
+ SColumnInfoData* pSrc = taosArrayGet(p->pDataBlock, j);
+ if (pSrc->info.colId == pmInfo->colId) {
+ SColumnInfoData* pDst = taosArrayGet(pDataBlock->pDataBlock, pmInfo->targetSlotId);
+ colDataAssign(pDst, pSrc, p->info.rows);
+ break;
+ }
+ }
+ }
+
+ pDataBlock->info.rows = p->info.rows;
+ pDataBlock->info.capacity = p->info.rows;
+ }
+
+ blockDataDestroy(p);
return (pDataBlock->info.rows > 0) ? pDataBlock : NULL;
}
@@ -106,16 +127,16 @@ SSDataBlock* doSort(SOperatorInfo* pOperator) {
SSortOperatorInfo* pInfo = pOperator->info;
if (pOperator->status == OP_RES_TO_RETURN) {
- return getSortedBlockData(pInfo->pSortHandle, pInfo->binfo.pRes, pOperator->resultInfo.capacity);
+ return getSortedBlockData(pInfo->pSortHandle, pInfo->binfo.pRes, pOperator->resultInfo.capacity, pInfo->pColMatchInfo);
}
- int32_t numOfBufPage = pInfo->sortBufSize / pInfo->bufPageSize;
- pInfo->pSortHandle = tsortCreateSortHandle(pInfo->pSortInfo, pInfo->inputSlotMap, SORT_SINGLESOURCE_SORT,
- pInfo->bufPageSize, numOfBufPage, pInfo->binfo.pRes, pTaskInfo->id.str);
+// pInfo->binfo.pRes is not equalled to the input datablock.
+// int32_t numOfBufPage = pInfo->sortBufSize / pInfo->bufPageSize;
+ pInfo->pSortHandle = tsortCreateSortHandle(pInfo->pSortInfo, pInfo->pColMatchInfo, SORT_SINGLESOURCE_SORT,
+ -1, -1, NULL, pTaskInfo->id.str);
tsortSetFetchRawDataFp(pInfo->pSortHandle, loadNextDataBlock, applyScalarFunction, pOperator);
-
SSortSource* ps = taosMemoryCalloc(1, sizeof(SSortSource));
ps->param = pOperator->pDownstream[0];
tsortAddSource(pInfo->pSortHandle, ps);
@@ -127,7 +148,7 @@ SSDataBlock* doSort(SOperatorInfo* pOperator) {
}
pOperator->status = OP_RES_TO_RETURN;
- return getSortedBlockData(pInfo->pSortHandle, pInfo->binfo.pRes, pOperator->resultInfo.capacity);
+ return getSortedBlockData(pInfo->pSortHandle, pInfo->binfo.pRes, pOperator->resultInfo.capacity, pInfo->pColMatchInfo);
}
void destroyOrderOperatorInfo(void* param, int32_t numOfOutput) {
@@ -135,5 +156,5 @@ void destroyOrderOperatorInfo(void* param, int32_t numOfOutput) {
pInfo->binfo.pRes = blockDataDestroy(pInfo->binfo.pRes);
taosArrayDestroy(pInfo->pSortInfo);
- taosArrayDestroy(pInfo->inputSlotMap);
+ taosArrayDestroy(pInfo->pColMatchInfo);
}
diff --git a/source/libs/executor/src/tsort.c b/source/libs/executor/src/tsort.c
index 50aa4cfc01..040ee8c7f5 100644
--- a/source/libs/executor/src/tsort.c
+++ b/source/libs/executor/src/tsort.c
@@ -64,25 +64,8 @@ struct SSortHandle {
static int32_t msortComparFn(const void *pLeft, const void *pRight, void *param);
-static SSDataBlock* createDataBlock_rv(SSchema* pSchema, int32_t numOfCols) {
- SSDataBlock* pBlock = taosMemoryCalloc(1, sizeof(SSDataBlock));
- pBlock->pDataBlock = taosArrayInit(numOfCols, sizeof(SColumnInfoData));
- pBlock->info.numOfCols = numOfCols;
-
- for(int32_t i = 0; i < numOfCols; ++i) {
- SColumnInfoData colInfo = {0};
-
- colInfo.info.type = pSchema[i].type;
- colInfo.info.bytes = pSchema[i].bytes;
- colInfo.info.colId = pSchema[i].colId;
- taosArrayPush(pBlock->pDataBlock, &colInfo);
-
- if (IS_VAR_DATA_TYPE(colInfo.info.type)) {
- pBlock->info.hasVarCol = true;
- }
- }
-
- return pBlock;
+SSDataBlock* tsortGetSortedDataBlock(const SSortHandle* pSortHandle) {
+ return createOneDataBlock(pSortHandle->pDataBlock, false);
}
/**
@@ -98,7 +81,10 @@ SSortHandle* tsortCreateSortHandle(SArray* pSortInfo, SArray* pIndexMap, int32_t
pSortHandle->numOfPages = numOfPages;
pSortHandle->pSortInfo = pSortInfo;
pSortHandle->pIndexMap = pIndexMap;
- pSortHandle->pDataBlock = createOneDataBlock(pBlock, false);
+
+ if (pBlock != NULL) {
+ pSortHandle->pDataBlock = createOneDataBlock(pBlock, false);
+ }
pSortHandle->pOrderedSource = taosArrayInit(4, POINTER_BYTES);
pSortHandle->cmpParam.orderInfo = pSortInfo;
@@ -530,6 +516,17 @@ static int32_t createInitialSortedMultiSources(SSortHandle* pHandle) {
if (pHandle->pDataBlock == NULL) {
pHandle->pDataBlock = createOneDataBlock(pBlock, false);
+
+ // calculate the buffer pages according to the total available buffers.
+ int32_t rowSize = blockDataGetRowSize(pBlock);
+ if (rowSize * 4 > 4096) {
+ pHandle->pageSize = rowSize * 4;
+ } else {
+ pHandle->pageSize = 4096;
+ }
+ // todo!!
+ pHandle->numOfPages = 1024;
+ sortBufSize = pHandle->numOfPages * pHandle->pageSize;
}
// perform the scalar function calculation before apply the sort
@@ -538,7 +535,6 @@ static int32_t createInitialSortedMultiSources(SSortHandle* pHandle) {
}
// todo relocate the columns
-
int32_t code = blockDataMerge(pHandle->pDataBlock, pBlock, pHandle->pIndexMap);
if (code != 0) {
return code;
@@ -689,7 +685,7 @@ STupleHandle* tsortNextTuple(SSortHandle* pHandle) {
bool tsortIsNullVal(STupleHandle* pVHandle, int32_t colIndex) {
SColumnInfoData* pColInfoSrc = taosArrayGet(pVHandle->pBlock->pDataBlock, colIndex);
- return colDataIsNull(pColInfoSrc, 0, pVHandle->rowIndex, NULL);
+ return colDataIsNull_s(pColInfoSrc, pVHandle->rowIndex);
}
void* tsortGetValue(STupleHandle* pVHandle, int32_t colIndex) {
diff --git a/source/libs/function/src/builtins.c b/source/libs/function/src/builtins.c
index 38922833f9..734136b296 100644
--- a/source/libs/function/src/builtins.c
+++ b/source/libs/function/src/builtins.c
@@ -242,8 +242,7 @@ static int32_t translateFirstLast(SFunctionNode* pFunc, char* pErrBuf, int32_t l
"The parameters of first/last can only be columns");
}
- uint8_t paraType = ((SExprNode*)pPara)->resType.type;
- pFunc->node.resType = (SDataType){.bytes = tDataTypes[paraType].bytes, .type = paraType};
+ pFunc->node.resType = ((SExprNode*)pPara)->resType;
return TSDB_CODE_SUCCESS;
}
@@ -917,7 +916,7 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
.translateFunc = translateTbnameColumn,
.getEnvFunc = NULL,
.initFunc = NULL,
- .sprocessFunc = NULL,
+ .sprocessFunc = qTbnameFunction,
.finalizeFunc = NULL
},
{
diff --git a/source/libs/function/src/tudf.c b/source/libs/function/src/tudf.c
index 5b1573c88f..0a99ef61ce 100644
--- a/source/libs/function/src/tudf.c
+++ b/source/libs/function/src/tudf.c
@@ -594,7 +594,9 @@ int32_t convertScalarParamToDataBlock(SScalarParam *input, int32_t numOfCols, SS
//TODO: free the array output->pDataBlock
output->pDataBlock = taosArrayInit(numOfCols, sizeof(SColumnInfoData));
- taosArrayPush(output->pDataBlock, input->columnData);
+ for (int32_t i = 0; i < numOfCols; ++i) {
+ taosArrayPush(output->pDataBlock, (input + i)->columnData);
+ }
return 0;
}
diff --git a/source/libs/function/src/udfd.c b/source/libs/function/src/udfd.c
index ba9fca2969..f5e4a9c6e6 100644
--- a/source/libs/function/src/udfd.c
+++ b/source/libs/function/src/udfd.c
@@ -81,6 +81,9 @@ typedef struct SUdf {
TUdfAggStartFunc aggStartFunc;
TUdfAggProcessFunc aggProcFunc;
TUdfAggFinishFunc aggFinishFunc;
+
+ TUdfInitFunc initFunc;
+ TUdfDestroyFunc destroyFunc;
} SUdf;
// TODO: low priority: change name onxxx to xxxCb, and udfc or udfd as prefix
@@ -101,7 +104,19 @@ int32_t udfdLoadUdf(char *udfName, SUdf *udf) {
fnError("can not load library %s. error: %s", udf->path, uv_strerror(err));
return UDFC_CODE_LOAD_UDF_FAILURE;
}
- //TODO: init and destroy function
+
+ char initFuncName[TSDB_FUNC_NAME_LEN+5] = {0};
+ char *initSuffix = "_init";
+ strcpy(initFuncName, udfName);
+ strncat(initFuncName, initSuffix, strlen(initSuffix));
+ uv_dlsym(&udf->lib, initFuncName, (void**)(&udf->initFunc));
+
+ char destroyFuncName[TSDB_FUNC_NAME_LEN+5] = {0};
+ char *destroySuffix = "_destroy";
+ strcpy(destroyFuncName, udfName);
+ strncat(destroyFuncName, destroySuffix, strlen(destroySuffix));
+ uv_dlsym(&udf->lib, destroyFuncName, (void**)(&udf->destroyFunc));
+
if (udf->funcType == TSDB_FUNC_TYPE_SCALAR) {
char processFuncName[TSDB_FUNC_NAME_LEN] = {0};
strcpy(processFuncName, udfName);
@@ -159,6 +174,9 @@ void udfdProcessRequest(uv_work_t *req) {
if (udf->state == UDF_STATE_INIT) {
udf->state = UDF_STATE_LOADING;
udfdLoadUdf(setup->udfName, udf);
+ if (udf->initFunc) {
+ udf->initFunc();
+ }
udf->state = UDF_STATE_READY;
uv_cond_broadcast(&udf->condReady);
uv_mutex_unlock(&udf->lock);
@@ -170,7 +188,6 @@ void udfdProcessRequest(uv_work_t *req) {
}
SUdfcFuncHandle *handle = taosMemoryMalloc(sizeof(SUdfcFuncHandle));
handle->udf = udf;
- // TODO: allocate private structure and call init function and set it to handle
SUdfResponse rsp;
rsp.seqNum = request.seqNum;
rsp.type = request.type;
@@ -275,10 +292,12 @@ void udfdProcessRequest(uv_work_t *req) {
if (unloadUdf) {
uv_cond_destroy(&udf->condReady);
uv_mutex_destroy(&udf->lock);
+ if (udf->destroyFunc) {
+ (udf->destroyFunc)();
+ }
uv_dlclose(&udf->lib);
taosMemoryFree(udf);
}
- // TODO: call destroy and free udf private
taosMemoryFree(handle);
SUdfResponse response;
diff --git a/source/libs/scalar/src/sclfunc.c b/source/libs/scalar/src/sclfunc.c
index 51ac48adaf..77caf67a2b 100644
--- a/source/libs/scalar/src/sclfunc.c
+++ b/source/libs/scalar/src/sclfunc.c
@@ -1513,3 +1513,9 @@ int32_t winEndTsFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *p
colDataAppendInt64(pOutput->columnData, pOutput->numOfRows, (int64_t*) colDataGetData(pInput->columnData, 4));
return TSDB_CODE_SUCCESS;
}
+
+int32_t qTbnameFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput) {
+ ASSERT(inputNum == 1);
+ colDataAppend(pOutput->columnData, pOutput->numOfRows, colDataGetData(pInput->columnData, 0), false);
+ return TSDB_CODE_SUCCESS;
+}
diff --git a/source/libs/scalar/src/sclvector.c b/source/libs/scalar/src/sclvector.c
index 84aa5559d0..1e37533f2c 100644
--- a/source/libs/scalar/src/sclvector.c
+++ b/source/libs/scalar/src/sclvector.c
@@ -1023,8 +1023,7 @@ static void vectorMathMultiplyHelper(SColumnInfoData* pLeftCol, SColumnInfoData*
colDataAppendNULL(pOutputCol, i);
continue; // TODO set null or ignore
}
- *output = getVectorDoubleValueFnLeft(LEFT_COL, i)
- * getVectorDoubleValueFnRight(RIGHT_COL, 0);
+ *output = getVectorDoubleValueFnLeft(LEFT_COL, i) * getVectorDoubleValueFnRight(RIGHT_COL, 0);
}
}
}
@@ -1050,8 +1049,7 @@ void vectorMathMultiply(SScalarParam* pLeft, SScalarParam* pRight, SScalarParam
colDataAppendNULL(pOutputCol, i);
continue; // TODO set null or ignore
}
- *output = getVectorDoubleValueFnLeft(LEFT_COL, i)
- * getVectorDoubleValueFnRight(RIGHT_COL, i);
+ *output = getVectorDoubleValueFnLeft(LEFT_COL, i) * getVectorDoubleValueFnRight(RIGHT_COL, i);
}
} else if (pLeft->numOfRows == 1) {
vectorMathMultiplyHelper(pRightCol, pLeftCol, pOutputCol, pRight->numOfRows, step, i);
diff --git a/tests/requirements.txt b/tests/requirements.txt
new file mode 100644
index 0000000000..ce459414c4
--- /dev/null
+++ b/tests/requirements.txt
@@ -0,0 +1,5 @@
+taospy
+numpy
+fabric2
+psutil
+pandas
diff --git a/tests/script/tsim/query/udf.sim b/tests/script/tsim/query/udf.sim
index 8acd07cfe4..c76569b40f 100644
--- a/tests/script/tsim/query/udf.sim
+++ b/tests/script/tsim/query/udf.sim
@@ -43,6 +43,27 @@ if $data00 != 2.236067977 then
return -1
endi
+sql create table t2 (ts timestamp, f1 int, f2 int);
+sql insert into t2 values(now, 0, 0)(now+1s, 1, 1);
+sql select udf1(f1, f2) from t2;
+if $rows != 2 then
+ return -1
+endi
+if $data00 != 88 then
+ return -1
+endi
+if $data10 != 88 then
+ return -1
+endi
+
+sql select udf2(f1, f2) from t2;
+if $rows != 1 then
+ return -1
+endi
+if $data00 != 1.414213562 then
+ return -1
+endi
+
#sql drop function udf1;
#sql drop function udf2;
system sh/exec.sh -n dnode1 -s stop -x SIGKILL
diff --git a/tests/system-test/2-query/sqrt.py b/tests/system-test/2-query/sqrt.py
new file mode 100644
index 0000000000..28e869e044
--- /dev/null
+++ b/tests/system-test/2-query/sqrt.py
@@ -0,0 +1,551 @@
+import taos
+import sys
+import datetime
+import inspect
+import math
+from util.log import *
+from util.sql import *
+from util.cases import *
+
+
+class TDTestCase:
+ updatecfgDict = {'debugFlag': 143 ,"cDebugFlag":143,"uDebugFlag":143 ,"rpcDebugFlag":143 , "tmrDebugFlag":143 ,
+ "jniDebugFlag":143 ,"simDebugFlag":143,"dDebugFlag":143, "dDebugFlag":143,"vDebugFlag":143,"mDebugFlag":143,"qDebugFlag":143,
+ "wDebugFlag":143,"sDebugFlag":143,"tsdbDebugFlag":143,"tqDebugFlag":143 ,"fsDebugFlag":143 ,"fnDebugFlag":143}
+ def init(self, conn, powSql):
+ tdLog.debug(f"start to excute {__file__}")
+ tdSql.init(conn.cursor())
+
+ def prepare_datas(self):
+ tdSql.execute(
+ '''create table stb1
+ (ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(16),c9 nchar(32), c10 timestamp)
+ tags (t1 int)
+ '''
+ )
+
+ tdSql.execute(
+ '''
+ create table t1
+ (ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(16),c9 nchar(32), c10 timestamp)
+ '''
+ )
+ for i in range(4):
+ tdSql.execute(f'create table ct{i+1} using stb1 tags ( {i+1} )')
+
+ for i in range(9):
+ tdSql.execute(
+ f"insert into ct1 values ( now()-{i*10}s, {1*i}, {11111*i}, {111*i}, {11*i}, {1.11*i}, {11.11*i}, {i%2}, 'binary{i}', 'nchar{i}', now()+{1*i}a )"
+ )
+ tdSql.execute(
+ f"insert into ct4 values ( now()-{i*90}d, {1*i}, {11111*i}, {111*i}, {11*i}, {1.11*i}, {11.11*i}, {i%2}, 'binary{i}', 'nchar{i}', now()+{1*i}a )"
+ )
+ tdSql.execute("insert into ct1 values (now()-45s, 0, 0, 0, 0, 0, 0, 0, 'binary0', 'nchar0', now()+8a )")
+ tdSql.execute("insert into ct1 values (now()+10s, 9, -99999, -999, -99, -9.99, -99.99, 1, 'binary9', 'nchar9', now()+9a )")
+ tdSql.execute("insert into ct1 values (now()+15s, 9, -99999, -999, -99, -9.99, NULL, 1, 'binary9', 'nchar9', now()+9a )")
+ tdSql.execute("insert into ct1 values (now()+20s, 9, -99999, -999, NULL, -9.99, -99.99, 1, 'binary9', 'nchar9', now()+9a )")
+
+ tdSql.execute("insert into ct4 values (now()-810d, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL ) ")
+ tdSql.execute("insert into ct4 values (now()-400d, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL ) ")
+ tdSql.execute("insert into ct4 values (now()+90d, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL ) ")
+
+ tdSql.execute(
+ f'''insert into t1 values
+ ( '2020-04-21 01:01:01.000', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL )
+ ( '2020-10-21 01:01:01.000', 1, 11111, 111, 11, 1.11, 11.11, 1, "binary1", "nchar1", now()+1a )
+ ( '2020-12-31 01:01:01.000', 2, 22222, 222, 22, 2.22, 22.22, 0, "binary2", "nchar2", now()+2a )
+ ( '2021-01-01 01:01:06.000', 3, 33333, 333, 33, 3.33, 33.33, 0, "binary3", "nchar3", now()+3a )
+ ( '2021-05-07 01:01:10.000', 4, 44444, 444, 44, 4.44, 44.44, 1, "binary4", "nchar4", now()+4a )
+ ( '2021-07-21 01:01:01.000', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL )
+ ( '2021-09-30 01:01:16.000', 5, 55555, 555, 55, 5.55, 55.55, 0, "binary5", "nchar5", now()+5a )
+ ( '2022-02-01 01:01:20.000', 6, 66666, 666, 66, 6.66, 66.66, 1, "binary6", "nchar6", now()+6a )
+ ( '2022-10-28 01:01:26.000', 7, 00000, 000, 00, 0.00, 00.00, 1, "binary7", "nchar7", "1970-01-01 08:00:00.000" )
+ ( '2022-12-01 01:01:30.000', 8, -88888, -888, -88, -8.88, -88.88, 0, "binary8", "nchar8", "1969-01-01 01:00:00.000" )
+ ( '2022-12-31 01:01:36.000', 9, -99999999999999999, -999, -99, -9.99, -999999999999999999999.99, 1, "binary9", "nchar9", "1900-01-01 00:00:00.000" )
+ ( '2023-02-21 01:01:01.000', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL )
+ '''
+ )
+
+ def check_result_auto_sqrt(self ,origin_query , pow_query):
+
+ pow_result = tdSql.getResult(pow_query)
+ origin_result = tdSql.getResult(origin_query)
+
+ auto_result =[]
+
+ for row in origin_result:
+ row_check = []
+ for elem in row:
+ if elem == None:
+ elem = None
+ elif elem < 0:
+ elem = None
+ else:
+ elem = math.sqrt(elem)
+ row_check.append(elem)
+ auto_result.append(row_check)
+
+ check_status = True
+
+ for row_index , row in enumerate(pow_result):
+ for col_index , elem in enumerate(row):
+ if auto_result[row_index][col_index] == None and not (auto_result[row_index][col_index] == None and elem == None):
+ check_status = False
+ elif auto_result[row_index][col_index] != None and (auto_result[row_index][col_index] - elem > 0.00000001):
+ check_status = False
+ else:
+ pass
+ if not check_status:
+ tdLog.notice("sqrt function value has not as expected , sql is \"%s\" "%pow_query )
+ sys.exit(1)
+ else:
+ tdLog.info("sqrt value check pass , it work as expected ,sql is \"%s\" "%pow_query )
+
+ def test_errors(self):
+ error_sql_lists = [
+ "select sqrt from t1",
+ # "select sqrt(-+--+c1 ) from t1",
+ # "select +-sqrt(c1) from t1",
+ # "select ++-sqrt(c1) from t1",
+ # "select ++--sqrt(c1) from t1",
+ # "select - -sqrt(c1)*0 from t1",
+ # "select sqrt(tbname+1) from t1 ",
+ "select sqrt(123--123)==1 from t1",
+ "select sqrt(c1) as 'd1' from t1",
+ "select sqrt(c1 ,c2) from t1",
+ "select sqrt(c1 ,NULL ) from t1",
+ "select sqrt(,) from t1;",
+ "select sqrt(sqrt(c1) ab from t1)",
+ "select sqrt(c1 ) as int from t1",
+ "select sqrt from stb1",
+ # "select sqrt(-+--+c1) from stb1",
+ # "select +-sqrt(c1) from stb1",
+ # "select ++-sqrt(c1) from stb1",
+ # "select ++--sqrt(c1) from stb1",
+ # "select - -sqrt(c1)*0 from stb1",
+ # "select sqrt(tbname+1) from stb1 ",
+ "select sqrt(123--123)==1 from stb1",
+ "select sqrt(c1) as 'd1' from stb1",
+ "select sqrt(c1 ,c2 ) from stb1",
+ "select sqrt(c1 ,NULL) from stb1",
+ "select sqrt(,) from stb1;",
+ "select sqrt(sqrt(c1) ab from stb1)",
+ "select sqrt(c1) as int from stb1"
+ ]
+ for error_sql in error_sql_lists:
+ tdSql.error(error_sql)
+
+ def support_types(self):
+ type_error_sql_lists = [
+ "select sqrt(ts) from t1" ,
+ "select sqrt(c7) from t1",
+ "select sqrt(c8) from t1",
+ "select sqrt(c9) from t1",
+ "select sqrt(ts) from ct1" ,
+ "select sqrt(c7) from ct1",
+ "select sqrt(c8) from ct1",
+ "select sqrt(c9) from ct1",
+ "select sqrt(ts) from ct3" ,
+ "select sqrt(c7) from ct3",
+ "select sqrt(c8) from ct3",
+ "select sqrt(c9) from ct3",
+ "select sqrt(ts) from ct4" ,
+ "select sqrt(c7) from ct4",
+ "select sqrt(c8) from ct4",
+ "select sqrt(c9) from ct4",
+ "select sqrt(ts) from stb1" ,
+ "select sqrt(c7) from stb1",
+ "select sqrt(c8) from stb1",
+ "select sqrt(c9) from stb1" ,
+
+ "select sqrt(ts) from stbbb1" ,
+ "select sqrt(c7) from stbbb1",
+
+ "select sqrt(ts) from tbname",
+ "select sqrt(c9) from tbname"
+
+ ]
+
+ for type_sql in type_error_sql_lists:
+ tdSql.error(type_sql)
+
+
+ type_sql_lists = [
+ "select sqrt(c1) from t1",
+ "select sqrt(c2) from t1",
+ "select sqrt(c3) from t1",
+ "select sqrt(c4) from t1",
+ "select sqrt(c5) from t1",
+ "select sqrt(c6) from t1",
+
+ "select sqrt(c1) from ct1",
+ "select sqrt(c2) from ct1",
+ "select sqrt(c3) from ct1",
+ "select sqrt(c4) from ct1",
+ "select sqrt(c5) from ct1",
+ "select sqrt(c6) from ct1",
+
+ "select sqrt(c1) from ct3",
+ "select sqrt(c2) from ct3",
+ "select sqrt(c3) from ct3",
+ "select sqrt(c4) from ct3",
+ "select sqrt(c5) from ct3",
+ "select sqrt(c6) from ct3",
+
+ "select sqrt(c1) from stb1",
+ "select sqrt(c2) from stb1",
+ "select sqrt(c3) from stb1",
+ "select sqrt(c4) from stb1",
+ "select sqrt(c5) from stb1",
+ "select sqrt(c6) from stb1",
+
+ "select sqrt(c6) as alisb from stb1",
+ "select sqrt(c6) alisb from stb1",
+ ]
+
+ for type_sql in type_sql_lists:
+ tdSql.query(type_sql)
+
+ def basic_sqrt_function(self):
+
+ # basic query
+ tdSql.query("select c1 from ct3")
+ tdSql.checkRows(0)
+ tdSql.query("select c1 from t1")
+ tdSql.checkRows(12)
+ tdSql.query("select c1 from stb1")
+ tdSql.checkRows(25)
+
+ # used for empty table , ct3 is empty
+ tdSql.query("select sqrt(c1) from ct3")
+ tdSql.checkRows(0)
+ tdSql.query("select sqrt(c2) from ct3")
+ tdSql.checkRows(0)
+ tdSql.query("select sqrt(c3) from ct3")
+ tdSql.checkRows(0)
+ tdSql.query("select sqrt(c4) from ct3")
+ tdSql.checkRows(0)
+ tdSql.query("select sqrt(c5) from ct3")
+ tdSql.checkRows(0)
+ tdSql.query("select sqrt(c6) from ct3")
+ tdSql.checkRows(0)
+
+
+ # # used for regular table
+ tdSql.query("select sqrt(c1) from t1")
+ tdSql.checkData(0, 0, None)
+ tdSql.checkData(1 , 0, 1.000000000)
+ tdSql.checkData(3 , 0, 1.732050808)
+ tdSql.checkData(5 , 0, None)
+
+ tdSql.query("select c1, c2, c3 , c4, c5 from t1")
+ tdSql.checkData(1, 4, 1.11000)
+ tdSql.checkData(3, 3, 33)
+ tdSql.checkData(5, 4, None)
+
+ tdSql.query("select ts,c1, c2, c3 , c4, c5 from t1")
+ tdSql.checkData(1, 5, 1.11000)
+ tdSql.checkData(3, 4, 33)
+ tdSql.checkData(5, 5, None)
+
+ self.check_result_auto_sqrt( "select abs(c1), abs(c2), abs(c3) , abs(c4), abs(c5) from t1", "select sqrt(abs(c1)), sqrt(abs(c2)) ,sqrt(abs(c3)), sqrt(abs(c4)), sqrt(abs(c5)) from t1")
+
+ # used for sub table
+ tdSql.query("select c2 ,sqrt(c2) from ct1")
+ tdSql.checkData(0, 1, 298.140906284)
+ tdSql.checkData(1 , 1, 278.885281074)
+ tdSql.checkData(3 , 1, 235.701081881)
+ tdSql.checkData(4 , 1, 0.000000000)
+
+ tdSql.query("select c1, c5 ,sqrt(c5) from ct4")
+ tdSql.checkData(0 , 2, None)
+ tdSql.checkData(1 , 2, 2.979932904)
+ tdSql.checkData(2 , 2, 2.787471970)
+ tdSql.checkData(3 , 2, 2.580697551)
+ tdSql.checkData(5 , 2, None)
+
+ self.check_result_auto_sqrt( "select c1, c2, c3 , c4, c5 from ct1", "select sqrt(c1), sqrt(c2) ,sqrt(c3), sqrt(c4), sqrt(c5) from ct1")
+
+ # nest query for sqrt functions
+ tdSql.query("select c4 , sqrt(c4) ,sqrt(sqrt(c4)) , sqrt(sqrt(sqrt(c4))) from ct1;")
+ tdSql.checkData(0 , 0 , 88)
+ tdSql.checkData(0 , 1 , 9.380831520)
+ tdSql.checkData(0 , 2 , 3.062814314)
+ tdSql.checkData(0 , 3 , 1.750089802)
+
+ tdSql.checkData(1 , 0 , 77)
+ tdSql.checkData(1 , 1 , 8.774964387)
+ tdSql.checkData(1 , 2 , 2.962256638)
+ tdSql.checkData(1 , 3 , 1.721120750)
+
+ tdSql.checkData(11 , 0 , -99)
+ tdSql.checkData(11 , 1 , None)
+ tdSql.checkData(11 , 2 , None)
+ tdSql.checkData(11 , 3 , None)
+
+ # used for stable table
+
+ tdSql.query("select sqrt(c1) from stb1")
+ tdSql.checkRows(25)
+
+
+ # used for not exists table
+ tdSql.error("select sqrt(c1) from stbbb1")
+ tdSql.error("select sqrt(c1) from tbname")
+ tdSql.error("select sqrt(c1) from ct5")
+
+ # mix with common col
+ tdSql.query("select c1, sqrt(c1) from ct1")
+ tdSql.checkData(0 , 0 ,8)
+ tdSql.checkData(0 , 1 ,2.828427125)
+ tdSql.checkData(4 , 0 ,0)
+ tdSql.checkData(4 , 1 ,0.000000000)
+ tdSql.query("select c2, sqrt(c2) from ct4")
+ tdSql.checkData(0 , 0 , None)
+ tdSql.checkData(0 , 1 ,None)
+ tdSql.checkData(4 , 0 ,55555)
+ tdSql.checkData(4 , 1 ,235.701081881)
+ tdSql.checkData(5 , 0 ,None)
+ tdSql.checkData(5 , 1 ,None)
+
+ # mix with common functions
+ tdSql.query("select c1, sqrt(c1),sqrt(c1), sqrt(sqrt(c1)) from ct4 ")
+ tdSql.checkData(0 , 0 ,None)
+ tdSql.checkData(0 , 1 ,None)
+ tdSql.checkData(0 , 2 ,None)
+ tdSql.checkData(0 , 3 ,None)
+
+ tdSql.checkData(3 , 0 , 6)
+ tdSql.checkData(3 , 1 ,2.449489743)
+ tdSql.checkData(3 , 2 ,2.449489743)
+ tdSql.checkData(3 , 3 ,1.565084580)
+
+ tdSql.query("select c1, sqrt(c1),c5, floor(c5) from stb1 ")
+
+ # # mix with agg functions , not support
+ tdSql.error("select c1, sqrt(c1),c5, count(c5) from stb1 ")
+ tdSql.error("select c1, sqrt(c1),c5, count(c5) from ct1 ")
+ tdSql.error("select sqrt(c1), count(c5) from stb1 ")
+ tdSql.error("select sqrt(c1), count(c5) from ct1 ")
+ tdSql.error("select c1, count(c5) from ct1 ")
+ tdSql.error("select c1, count(c5) from stb1 ")
+
+ # agg functions mix with agg functions
+
+ tdSql.query("select max(c5), count(c5) from stb1")
+ tdSql.query("select max(c5), count(c5) from ct1")
+
+
+ # bug fix for count
+ tdSql.query("select count(c1) from ct4 ")
+ tdSql.checkData(0,0,9)
+ tdSql.query("select count(*) from ct4 ")
+ tdSql.checkData(0,0,12)
+ tdSql.query("select count(c1) from stb1 ")
+ tdSql.checkData(0,0,22)
+ tdSql.query("select count(*) from stb1 ")
+ tdSql.checkData(0,0,25)
+
+ # # bug fix for compute
+ tdSql.query("select c1, sqrt(c1) -0 ,sqrt(c1-4)-0 from ct4 ")
+ tdSql.checkData(0, 0, None)
+ tdSql.checkData(0, 1, None)
+ tdSql.checkData(0, 2, None)
+ tdSql.checkData(1, 0, 8)
+ tdSql.checkData(1, 1, 2.828427125)
+ tdSql.checkData(1, 2, 2.000000000)
+
+ tdSql.query(" select c1, sqrt(c1) -0 ,sqrt(c1-0.1)-0.1 from ct4")
+ tdSql.checkData(0, 0, None)
+ tdSql.checkData(0, 1, None)
+ tdSql.checkData(0, 2, None)
+ tdSql.checkData(1, 0, 8)
+ tdSql.checkData(1, 1, 2.828427125)
+ tdSql.checkData(1, 2, 2.710693865)
+
+ tdSql.query("select c1, sqrt(c1), c2, sqrt(c2), c3, sqrt(c3) from ct1")
+
+ def test_big_number(self):
+
+ tdSql.query("select c1, sqrt(100000000) from ct1") # bigint to double data overflow
+ tdSql.checkData(4, 1, 10000.000000000)
+
+
+ tdSql.query("select c1, sqrt(10000000000000) from ct1") # bigint to double data overflow
+ tdSql.checkData(4, 1, 3162277.660168380)
+
+ tdSql.query("select c1, sqrt(c1) + sqrt(10000000000000000000000000) from ct1") # bigint to double data overflow
+ tdSql.query("select c1, sqrt(c1) + sqrt(10000000000000000000000000.0) from ct1") # 10000000000000000000000000.0 is a double value
+ tdSql.checkData(1, 1, 3162277660171.025390625)
+
+ tdSql.query("select c1, sqrt(10000000000000000000000000000000000) from ct1") # bigint to double data overflow
+ tdSql.query("select c1, sqrt(10000000000000000000000000000000000.0) from ct1") # 10000000000000000000000000.0 is a double value
+ tdSql.checkData(4, 1, 100000000000000000.000000000)
+
+ tdSql.query("select c1, sqrt(10000000000000000000000000000000000000000) from ct1") # bigint to double data overflow
+ tdSql.query("select c1, sqrt(10000000000000000000000000000000000000000.0) from ct1") # 10000000000000000000000000.0 is a double value
+
+ tdSql.checkData(4, 1, 100000000000000000000.000000000)
+
+ tdSql.query("select c1, sqrt(10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000) from ct1") # bigint to double data overflow
+
+ def pow_base_test(self):
+
+ # base is an regular number ,int or double
+ tdSql.query("select c1, sqrt(c1) from ct1")
+ tdSql.checkData(0, 1,2.828427125)
+ tdSql.checkRows(13)
+
+ # # bug for compute in functions
+ # tdSql.query("select c1, abs(1/0) from ct1")
+ # tdSql.checkData(0, 0, 8)
+ # tdSql.checkData(0, 1, 1)
+
+ tdSql.query("select c1, sqrt(1) from ct1")
+ tdSql.checkData(0, 1, 1.000000000)
+ tdSql.checkRows(13)
+
+ # two cols start sqrt(x,y)
+ tdSql.query("select c1,c2, sqrt(c2) from ct1")
+ tdSql.checkData(0, 2, 298.140906284)
+ tdSql.checkData(1, 2, 278.885281074)
+ tdSql.checkData(4, 2, 0.000000000)
+
+ def abs_func_filter(self):
+ tdSql.execute("use db")
+ tdSql.query("select c1, abs(c1) -0 ,ceil(c1-0.1)-0 ,floor(c1+0.1)-0.1 ,ceil(sqrt(c1)-0.5) from ct4 where c1>5 ")
+ tdSql.checkRows(3)
+ tdSql.checkData(0,0,8)
+ tdSql.checkData(0,1,8.000000000)
+ tdSql.checkData(0,2,8.000000000)
+ tdSql.checkData(0,3,7.900000000)
+ tdSql.checkData(0,4,3.000000000)
+
+ tdSql.query("select c1, abs(c1) -0 ,ceil(c1-0.1)-0 ,floor(c1+0.1)-0.1 ,ceil(sqrt(c1)-0.5) from ct4 where c1=5 ")
+ tdSql.checkRows(1)
+ tdSql.checkData(0,0,5)
+ tdSql.checkData(0,1,5.000000000)
+ tdSql.checkData(0,2,5.000000000)
+ tdSql.checkData(0,3,4.900000000)
+ tdSql.checkData(0,4,2.000000000)
+
+ tdSql.query("select c1, abs(c1) -0 ,ceil(c1-0.1)-0 ,floor(c1+0.1)-0.1 ,ceil(sqrt(c1)-0.5) from ct4 where c1=5 ")
+ tdSql.checkRows(1)
+ tdSql.checkData(0,0,5)
+ tdSql.checkData(0,1,5.000000000)
+ tdSql.checkData(0,2,5.000000000)
+ tdSql.checkData(0,3,4.900000000)
+ tdSql.checkData(0,4,2.000000000)
+
+ tdSql.query("select c1,c2 , abs(c1) -0 ,ceil(c1-0.1)-0 ,floor(c1+0.1)-0.1 ,ceil(sqrt(c1)-0.5) from ct4 where c1=sqrt(c1) limit 1 ")
+ tdSql.checkRows(1)
+ tdSql.checkData(0,0,1)
+ tdSql.checkData(0,1,11111)
+ tdSql.checkData(0,2,1.000000000)
+ tdSql.checkData(0,3,1.000000000)
+ tdSql.checkData(0,4,0.900000000)
+ tdSql.checkData(0,5,1.000000000)
+
+ def pow_Arithmetic(self):
+ pass
+
+ def check_boundary_values(self):
+
+ tdSql.execute("drop database if exists bound_test")
+ tdSql.execute("create database if not exists bound_test")
+ time.sleep(3)
+ tdSql.execute("use bound_test")
+ tdSql.execute(
+ "create table stb_bound (ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(32),c9 nchar(32), c10 timestamp) tags (t1 int);"
+ )
+ tdSql.execute(f'create table sub1_bound using stb_bound tags ( 1 )')
+ tdSql.execute(
+ f"insert into sub1_bound values ( now()-1s, 2147483647, 9223372036854775807, 32767, 127, 3.40E+38, 1.7e+308, True, 'binary_tb1', 'nchar_tb1', now() )"
+ )
+ tdSql.execute(
+ f"insert into sub1_bound values ( now()-1s, -2147483647, -9223372036854775807, -32767, -127, -3.40E+38, -1.7e+308, True, 'binary_tb1', 'nchar_tb1', now() )"
+ )
+ tdSql.execute(
+ f"insert into sub1_bound values ( now(), 2147483646, 9223372036854775806, 32766, 126, 3.40E+38, 1.7e+308, True, 'binary_tb1', 'nchar_tb1', now() )"
+ )
+ tdSql.execute(
+ f"insert into sub1_bound values ( now(), -2147483646, -9223372036854775806, -32766, -126, -3.40E+38, -1.7e+308, True, 'binary_tb1', 'nchar_tb1', now() )"
+ )
+ tdSql.error(
+ f"insert into sub1_bound values ( now()+1s, 2147483648, 9223372036854775808, 32768, 128, 3.40E+38, 1.7e+308, True, 'binary_tb1', 'nchar_tb1', now() )"
+ )
+ self.check_result_auto_sqrt( "select abs(c1), abs(c2), abs(c3) , abs(c4), abs(c5) from sub1_bound ", "select sqrt(abs(c1)), sqrt(abs(c2)) ,sqrt(abs(c3)), sqrt(abs(c4)), sqrt(abs(c5)) from sub1_bound")
+
+ self.check_result_auto_sqrt( "select c1, c2, c3 , c3, c2 ,c1 from sub1_bound ", "select sqrt(c1), sqrt(c2) ,sqrt(c3), sqrt(c3), sqrt(c2) ,sqrt(c1) from sub1_bound")
+
+ self.check_result_auto_sqrt("select abs(abs(abs(abs(abs(abs(abs(abs(abs(c1))))))))) nest_col_func from sub1_bound" , "select sqrt(abs(c1)) from sub1_bound" )
+
+ # check basic elem for table per row
+ tdSql.query("select sqrt(abs(c1)) ,sqrt(abs(c2)) , sqrt(abs(c3)) , sqrt(abs(c4)), sqrt(abs(c5)), sqrt(abs(c6)) from sub1_bound ")
+ tdSql.checkData(0,0,math.sqrt(2147483647))
+ tdSql.checkData(0,1,math.sqrt(9223372036854775807))
+ tdSql.checkData(0,2,math.sqrt(32767))
+ tdSql.checkData(0,3,math.sqrt(127))
+ tdSql.checkData(0,4,math.sqrt(339999995214436424907732413799364296704.00000))
+ tdSql.checkData(1,0,math.sqrt(2147483647))
+ tdSql.checkData(1,1,math.sqrt(9223372036854775807))
+ tdSql.checkData(1,2,math.sqrt(32767))
+ tdSql.checkData(1,3,math.sqrt(127))
+ tdSql.checkData(1,4,math.sqrt(339999995214436424907732413799364296704.00000))
+ tdSql.checkData(3,0,math.sqrt(2147483646))
+ tdSql.checkData(3,1,math.sqrt(9223372036854775806))
+ tdSql.checkData(3,2,math.sqrt(32766))
+ tdSql.checkData(3,3,math.sqrt(126))
+ tdSql.checkData(3,4,math.sqrt(339999995214436424907732413799364296704.00000))
+
+ # check + - * / in functions
+ tdSql.query("select sqrt(abs(c1+1)) ,sqrt(abs(c2)) , sqrt(abs(c3*1)) , sqrt(abs(c4/2)), sqrt(abs(c5))/2, sqrt(abs(c6)) from sub1_bound ")
+ tdSql.checkData(0,0,math.sqrt(2147483648.000000000))
+ tdSql.checkData(0,1,math.sqrt(9223372036854775807))
+ tdSql.checkData(0,2,math.sqrt(32767.000000000))
+ tdSql.checkData(0,3,math.sqrt(63.500000000))
+
+
+ def run(self): # sourcery skip: extract-duplicate-method, remove-redundant-fstring
+ tdSql.prepare()
+
+ tdLog.printNoPrefix("==========step1:create table ==============")
+
+ self.prepare_datas()
+
+ tdLog.printNoPrefix("==========step2:test errors ==============")
+
+ self.test_errors()
+
+ tdLog.printNoPrefix("==========step3:support types ============")
+
+ self.support_types()
+
+ tdLog.printNoPrefix("==========step4: sqrt basic query ============")
+
+ self.basic_sqrt_function()
+
+ tdLog.printNoPrefix("==========step5: big number sqrt query ============")
+
+ self.test_big_number()
+
+ tdLog.printNoPrefix("==========step6: base number for sqrt query ============")
+
+ self.pow_base_test()
+
+ tdLog.printNoPrefix("==========step7: sqrt boundary query ============")
+
+ self.check_boundary_values()
+
+ tdLog.printNoPrefix("==========step8: sqrt filter query ============")
+
+ self.abs_func_filter()
+
+
+
+ def stop(self):
+ tdSql.close()
+ tdLog.success(f"{__file__} successfully executed")
+
+tdCases.addLinux(__file__, TDTestCase())
+tdCases.addWindows(__file__, TDTestCase())
diff --git a/tests/system-test/fulltest.sh b/tests/system-test/fulltest.sh
index 1dfb160987..51f1649cc8 100755
--- a/tests/system-test/fulltest.sh
+++ b/tests/system-test/fulltest.sh
@@ -24,3 +24,4 @@ python3 ./test.py -f 2-query/floor.py
python3 ./test.py -f 2-query/round.py
python3 ./test.py -f 2-query/log.py
python3 ./test.py -f 2-query/pow.py
+python3 ./test.py -f 2-query/sqrt.py
diff --git a/tools/taos-tools b/tools/taos-tools
index 2f3dfddd4d..59e0ebaf49 160000
--- a/tools/taos-tools
+++ b/tools/taos-tools
@@ -1 +1 @@
-Subproject commit 2f3dfddd4d9a869e706ba3cf98fb6d769404cd7c
+Subproject commit 59e0ebaf4905e4cb6d95a01c58b3fa507abc5a20