[td-10564] fix memory leak in unit test and refactor some codes.
This commit is contained in:
parent
d12503e6dc
commit
aa06470943
|
@ -308,7 +308,7 @@ static FORCE_INLINE void tdCopyColOfRowBySchema(SDataRow dst, STSchema *pDstSche
|
|||
SET_DOUBLE_PTR(pData, value);
|
||||
break;
|
||||
case TSDB_DATA_TYPE_TIMESTAMP:
|
||||
if (pSrcSchema->columns[srcIdx].colId == PRIMARYKEY_TIMESTAMP_COL_INDEX) {
|
||||
if (pSrcSchema->columns[srcIdx].colId == PRIMARYKEY_TIMESTAMP_COL_ID) {
|
||||
*(TSKEY *)pData = tdGetKey(*(TKEY *)value);
|
||||
} else {
|
||||
*(TSKEY *)pData = *(TSKEY *)value;
|
||||
|
|
|
@ -23,6 +23,8 @@ extern "C" {
|
|||
#include "taosdef.h"
|
||||
#include "taosmsg.h"
|
||||
|
||||
#define TIME_IS_VAR_DURATION(_t) ((_t) == 'n' || (_t) == 'y' || (_t) == 'N' || (_t) == 'Y')
|
||||
|
||||
/*
|
||||
* @return timestamp decided by global conf variable, tsTimePrecision
|
||||
* if precision == TSDB_TIME_PRECISION_MICRO, it returns timestamp in microsecond.
|
||||
|
@ -50,7 +52,6 @@ void deltaToUtcInitOnce();
|
|||
|
||||
int64_t convertTimePrecision(int64_t time, int32_t fromPrecision, int32_t toPrecision);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -13,8 +13,8 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef TDENGINE_TFUNCTION_H
|
||||
#define TDENGINE_TFUNCTION_H
|
||||
#ifndef TDENGINE_FUNCTION_H
|
||||
#define TDENGINE_FUNCTION_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
|
@ -24,6 +24,8 @@ extern "C" {
|
|||
#include "tvariant.h"
|
||||
#include "tbuffer.h"
|
||||
|
||||
#define MAX_INTERVAL_TIME_WINDOW 1000000 // maximum allowed time windows in final results
|
||||
|
||||
#define FUNCTION_SCALAR 1
|
||||
#define FUNCTION_AGG 2
|
||||
|
||||
|
@ -184,6 +186,25 @@ typedef struct SResultDataInfo {
|
|||
int32_t intermediateBytes;
|
||||
} SResultDataInfo;
|
||||
|
||||
|
||||
typedef struct SMultiFunctionsDesc {
|
||||
bool stableQuery;
|
||||
bool groupbyColumn;
|
||||
bool simpleAgg;
|
||||
bool arithmeticOnAgg;
|
||||
bool projectionQuery;
|
||||
bool hasFilter;
|
||||
bool onlyTagQuery;
|
||||
bool orderProjectQuery;
|
||||
bool stateWindow;
|
||||
bool globalMerge;
|
||||
bool multigroupResult;
|
||||
bool blockDistribution;
|
||||
bool timewindow;
|
||||
bool topbotQuery;
|
||||
bool interpQuery;
|
||||
} SMultiFunctionsDesc;
|
||||
|
||||
int32_t getResultDataInfo(int32_t dataType, int32_t dataBytes, int32_t functionId, int32_t param, SResultDataInfo* pInfo, int16_t extLength,
|
||||
bool isSuperTable);
|
||||
|
||||
|
@ -199,8 +220,10 @@ bool qIsValidUdf(SArray* pUdfInfo, const char* name, int32_t len, int32_t* funct
|
|||
|
||||
const char* qGetFunctionName(int32_t functionId);
|
||||
|
||||
void extractFunctionDesc(SArray* pFunctionIdList, SMultiFunctionsDesc* pDesc);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // TDENGINE_TFUNCTION_H
|
||||
#endif // TDENGINE_FUNCTION_H
|
||||
|
|
|
@ -24,6 +24,7 @@ extern "C" {
|
|||
#include "common.h"
|
||||
#include "tname.h"
|
||||
#include "tvariant.h"
|
||||
#include "function.h"
|
||||
|
||||
typedef struct SColumn {
|
||||
uint64_t tableUid;
|
||||
|
@ -130,20 +131,6 @@ typedef struct STableMetaInfo {
|
|||
SArray *tagColList; // SArray<SColumn*>, involved tag columns
|
||||
} STableMetaInfo;
|
||||
|
||||
typedef struct SQueryAttrInfo {
|
||||
bool stableQuery;
|
||||
bool groupbyColumn;
|
||||
bool simpleAgg;
|
||||
bool arithmeticOnAgg;
|
||||
bool projectionQuery;
|
||||
bool hasFilter;
|
||||
bool onlyTagQuery;
|
||||
bool orderProjectQuery;
|
||||
bool stateWindow;
|
||||
bool globalMerge;
|
||||
bool multigroupResult;
|
||||
} SQueryAttrInfo;
|
||||
|
||||
typedef struct SQueryStmtInfo {
|
||||
int16_t command; // the command may be different for each subclause, so keep it seperately.
|
||||
uint32_t type; // query/insert type
|
||||
|
@ -177,7 +164,6 @@ typedef struct SQueryStmtInfo {
|
|||
|
||||
int32_t udColumnId; // current user-defined constant output field column id, monotonically decreases from TSDB_UD_COLUMN_INDEX
|
||||
bool distinct; // distinct tag or not
|
||||
bool onlyHasTagCond;
|
||||
int32_t bufLen;
|
||||
char* buf;
|
||||
SArray *pUdfInfo;
|
||||
|
@ -186,7 +172,7 @@ typedef struct SQueryStmtInfo {
|
|||
SArray *pUpstream; // SArray<struct SQueryStmtInfo>
|
||||
struct SQueryStmtInfo *pDownstream;
|
||||
int32_t havingFieldNum;
|
||||
SQueryAttrInfo info;
|
||||
SMultiFunctionsDesc info;
|
||||
} SQueryStmtInfo;
|
||||
|
||||
typedef struct SColumnIndex {
|
||||
|
|
|
@ -303,7 +303,7 @@ do { \
|
|||
#define TSDB_MAX_FIELD_LEN 16384
|
||||
#define TSDB_MAX_BINARY_LEN (TSDB_MAX_FIELD_LEN-TSDB_KEYSIZE) // keep 16384
|
||||
#define TSDB_MAX_NCHAR_LEN (TSDB_MAX_FIELD_LEN-TSDB_KEYSIZE) // keep 16384
|
||||
#define PRIMARYKEY_TIMESTAMP_COL_INDEX 0
|
||||
#define PRIMARYKEY_TIMESTAMP_COL_ID 0
|
||||
|
||||
#define TSDB_MAX_RPC_THREADS 5
|
||||
|
||||
|
|
|
@ -48,7 +48,7 @@
|
|||
* An encoding of midnight at the end of the day as 24:00:00 - ie. midnight
|
||||
* tomorrow - (allowable under ISO 8601) is supported.
|
||||
*/
|
||||
int64_t user_mktime64(const unsigned int year0, const unsigned int mon0,
|
||||
static int64_t user_mktime64(const unsigned int year0, const unsigned int mon0,
|
||||
const unsigned int day, const unsigned int hour,
|
||||
const unsigned int min, const unsigned int sec, int64_t time_zone)
|
||||
{
|
||||
|
@ -79,19 +79,18 @@ void deltaToUtcInitOnce() {
|
|||
(void)strptime("1970-01-01 00:00:00", (const char *)("%Y-%m-%d %H:%M:%S"), &tm);
|
||||
m_deltaUtc = (int64_t)mktime(&tm);
|
||||
//printf("====delta:%lld\n\n", seconds);
|
||||
return;
|
||||
}
|
||||
|
||||
static int64_t parseFraction(char* str, char** end, int32_t timePrec);
|
||||
static int32_t parseTimeWithTz(char* timestr, int64_t* time, int32_t timePrec, char delim);
|
||||
static int32_t parseLocaltime(char* timestr, int64_t* time, int32_t timePrec);
|
||||
static int32_t parseLocaltimeWithDst(char* timestr, int64_t* time, int32_t timePrec);
|
||||
static int32_t parseLocaltimeDst(char* timestr, int64_t* time, int32_t timePrec);
|
||||
static char* forwardToTimeStringEnd(char* str);
|
||||
static bool checkTzPresent(char *str, int32_t len);
|
||||
|
||||
static int32_t (*parseLocaltimeFp[]) (char* timestr, int64_t* time, int32_t timePrec) = {
|
||||
parseLocaltime,
|
||||
parseLocaltimeWithDst
|
||||
parseLocaltimeDst
|
||||
};
|
||||
|
||||
int32_t taosParseTime(char* timestr, int64_t* time, int32_t len, int32_t timePrec, int8_t day_light) {
|
||||
|
@ -116,8 +115,8 @@ bool checkTzPresent(char *str, int32_t len) {
|
|||
}
|
||||
c--;
|
||||
}
|
||||
return false;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
char* forwardToTimeStringEnd(char* str) {
|
||||
|
@ -344,7 +343,7 @@ int32_t parseLocaltime(char* timestr, int64_t* time, int32_t timePrec) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
int32_t parseLocaltimeWithDst(char* timestr, int64_t* time, int32_t timePrec) {
|
||||
int32_t parseLocaltimeDst(char* timestr, int64_t* time, int32_t timePrec) {
|
||||
*time = 0;
|
||||
struct tm tm = {0};
|
||||
tm.tm_isdst = -1;
|
||||
|
|
|
@ -7,6 +7,6 @@ target_include_directories(
|
|||
)
|
||||
|
||||
target_link_libraries(
|
||||
function
|
||||
PRIVATE os util common
|
||||
function
|
||||
PRIVATE os util common
|
||||
)
|
|
@ -56,8 +56,6 @@ typedef struct SResultRowCellInfo {
|
|||
#define QUERY_DESC_FORWARD_STEP -1
|
||||
|
||||
#define GET_FORWARD_DIRECTION_FACTOR(ord) (((ord) == TSDB_ORDER_ASC) ? QUERY_ASC_FORWARD_STEP : QUERY_DESC_FORWARD_STEP)
|
||||
|
||||
#define MAX_INTERVAL_TIME_WINDOW 1000000 // maximum allowed time windows in final results
|
||||
#define TOP_BOTTOM_QUERY_LIMIT 100
|
||||
|
||||
enum {
|
||||
|
|
|
@ -513,7 +513,7 @@ static void count_func_merge(SQLFunctionCtx *pCtx) {
|
|||
* @return
|
||||
*/
|
||||
int32_t countRequired(SQLFunctionCtx *pCtx, STimeWindow* w, int32_t colId) {
|
||||
if (colId == PRIMARYKEY_TIMESTAMP_COL_INDEX) {
|
||||
if (colId == PRIMARYKEY_TIMESTAMP_COL_ID) {
|
||||
return BLK_DATA_NO_NEEDED;
|
||||
} else {
|
||||
return BLK_DATA_STATIS_NEEDED;
|
||||
|
@ -2303,10 +2303,10 @@ static void top_bottom_func_finalizer(SQLFunctionCtx *pCtx) {
|
|||
tValuePair **tvp = pRes->res;
|
||||
|
||||
// user specify the order of output by sort the result according to timestamp
|
||||
if (pCtx->param[1].i64 == PRIMARYKEY_TIMESTAMP_COL_INDEX) {
|
||||
if (pCtx->param[1].i64 == PRIMARYKEY_TIMESTAMP_COL_ID) {
|
||||
__compar_fn_t comparator = (pCtx->param[2].i64 == TSDB_ORDER_ASC) ? resAscComparFn : resDescComparFn;
|
||||
qsort(tvp, (size_t)pResInfo->numOfRes, POINTER_BYTES, comparator);
|
||||
} else /*if (pCtx->param[1].i64 > PRIMARYKEY_TIMESTAMP_COL_INDEX)*/ {
|
||||
} else /*if (pCtx->param[1].i64 > PRIMARYKEY_TIMESTAMP_COL_ID)*/ {
|
||||
__compar_fn_t comparator = (pCtx->param[2].i64 == TSDB_ORDER_ASC) ? resDataAscComparFn : resDataDescComparFn;
|
||||
qsort(tvp, (size_t)pResInfo->numOfRes, POINTER_BYTES, comparator);
|
||||
}
|
||||
|
|
|
@ -128,18 +128,26 @@ static void doExprTreeDestroy(tExprNode **pExpr, void (*fp)(void *)) {
|
|||
if (*pExpr == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ((*pExpr)->nodeType == TEXPR_BINARYEXPR_NODE) {
|
||||
|
||||
int32_t type = (*pExpr)->nodeType;
|
||||
if (type == TEXPR_BINARYEXPR_NODE) {
|
||||
doExprTreeDestroy(&(*pExpr)->_node.pLeft, fp);
|
||||
doExprTreeDestroy(&(*pExpr)->_node.pRight, fp);
|
||||
|
||||
if (fp != NULL) {
|
||||
fp((*pExpr)->_node.info);
|
||||
}
|
||||
} else if ((*pExpr)->nodeType == TEXPR_VALUE_NODE) {
|
||||
} else if (type == TEXPR_UNARYEXPR_NODE) {
|
||||
doExprTreeDestroy(&(*pExpr)->_node.pLeft, fp);
|
||||
if (fp != NULL) {
|
||||
fp((*pExpr)->_node.info);
|
||||
}
|
||||
|
||||
assert((*pExpr)->_node.pRight == NULL);
|
||||
} else if (type == TEXPR_VALUE_NODE) {
|
||||
taosVariantDestroy((*pExpr)->pVal);
|
||||
free((*pExpr)->pVal);
|
||||
} else if ((*pExpr)->nodeType == TEXPR_COL_NODE) {
|
||||
} else if (type == TEXPR_COL_NODE) {
|
||||
free((*pExpr)->pSchema);
|
||||
}
|
||||
|
||||
|
|
|
@ -52,7 +52,7 @@ bool isTagsQuery(SArray* pFunctionIdList) {
|
|||
int16_t f = *(int16_t*) taosArrayGet(pFunctionIdList, i);
|
||||
|
||||
// "select count(tbname)" query
|
||||
// if (functId == FUNCTION_COUNT && pExpr->base.colInfo.colId == TSDB_TBNAME_COLUMN_INDEX) {
|
||||
// if (functId == FUNCTION_COUNT && pExpr->base.colpDesc->colId == TSDB_TBNAME_COLUMN_INDEX) {
|
||||
// continue;
|
||||
// }
|
||||
|
||||
|
@ -80,19 +80,6 @@ bool isTagsQuery(SArray* pFunctionIdList) {
|
|||
// return false;
|
||||
//}
|
||||
|
||||
bool isBlockInfoQuery(SArray* pFunctionIdList) {
|
||||
int32_t num = (int32_t) taosArrayGetSize(pFunctionIdList);
|
||||
for (int32_t i = 0; i < num; ++i) {
|
||||
int32_t f = *(int16_t*) taosArrayGet(pFunctionIdList, i);
|
||||
|
||||
if (f == FUNCTION_BLKINFO) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool isProjectionQuery(SArray* pFunctionIdList) {
|
||||
int32_t num = (int32_t) taosArrayGetSize(pFunctionIdList);
|
||||
for (int32_t i = 0; i < num; ++i) {
|
||||
|
@ -101,8 +88,12 @@ bool isProjectionQuery(SArray* pFunctionIdList) {
|
|||
continue;
|
||||
}
|
||||
|
||||
if (f != FUNCTION_PRJ && f != FUNCTION_TAGPRJ && f != FUNCTION_TAG &&
|
||||
f != FUNCTION_TS && f != FUNCTION_ARITHM && f != FUNCTION_DIFF &&
|
||||
if (f != FUNCTION_PRJ &&
|
||||
f != FUNCTION_TAGPRJ &&
|
||||
f != FUNCTION_TAG &&
|
||||
f != FUNCTION_TS &&
|
||||
f != FUNCTION_ARITHM &&
|
||||
f != FUNCTION_DIFF &&
|
||||
f != FUNCTION_DERIVATIVE) {
|
||||
return false;
|
||||
}
|
||||
|
@ -111,7 +102,7 @@ bool isProjectionQuery(SArray* pFunctionIdList) {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool isDiffDerivQuery(SArray* pFunctionIdList) {
|
||||
bool isDiffDerivativeQuery(SArray* pFunctionIdList) {
|
||||
int32_t num = (int32_t) taosArrayGetSize(pFunctionIdList);
|
||||
for (int32_t i = 0; i < num; ++i) {
|
||||
int32_t f = *(int16_t*) taosArrayGet(pFunctionIdList, i);
|
||||
|
@ -127,7 +118,7 @@ bool isDiffDerivQuery(SArray* pFunctionIdList) {
|
|||
return false;
|
||||
}
|
||||
|
||||
bool isPointInterpQuery(SArray* pFunctionIdList) {
|
||||
bool isInterpQuery(SArray* pFunctionIdList) {
|
||||
int32_t num = (int32_t) taosArrayGetSize(pFunctionIdList);
|
||||
for (int32_t i = 0; i < num; ++i) {
|
||||
int32_t f = *(int16_t*) taosArrayGet(pFunctionIdList, i);
|
||||
|
@ -264,8 +255,6 @@ bool needReverseScan(SArray* pFunctionIdList) {
|
|||
}
|
||||
|
||||
bool isSimpleAggregateRv(SArray* pFunctionIdList) {
|
||||
assert(0);
|
||||
|
||||
// if (pQueryInfo->interval.interval > 0 || pQueryInfo->sessionWindow.gap > 0) {
|
||||
// return false;
|
||||
// }
|
||||
|
@ -380,33 +369,17 @@ bool isProjectionQueryOnSTable(SArray* pFunctionIdList, int32_t tableIndex) {
|
|||
}
|
||||
|
||||
bool hasTagValOutput(SArray* pFunctionIdList) {
|
||||
// size_t numOfExprs = getNumOfExprs(pQueryInfo);
|
||||
// SExprInfo* pExpr1 = getExprInfo(pQueryInfo, 0);
|
||||
//
|
||||
// if (numOfExprs == 1 && pExpr1->base.functionId == FUNCTION_TS_COMP) {
|
||||
size_t size = taosArrayGetSize(pFunctionIdList);
|
||||
|
||||
// if (numOfExprs == 1 && pExpr1->base.functionId == FUNCTION_TS_COMP) {
|
||||
// return true;
|
||||
// }
|
||||
//
|
||||
// for (int32_t i = 0; i < numOfExprs; ++i) {
|
||||
// SExprInfo* pExpr = getExprInfo(pQueryInfo, i);
|
||||
// if (pExpr == NULL) {
|
||||
// continue;
|
||||
// }
|
||||
//
|
||||
// // ts_comp column required the tag value for join filter
|
||||
// if (TSDB_COL_IS_TAG(pExpr->base.colInfo.flag)) {
|
||||
// return true;
|
||||
// }
|
||||
// }
|
||||
|
||||
return false;
|
||||
}
|
||||
for (int32_t i = 0; i < size; ++i) {
|
||||
int32_t functionId = *(int16_t*) taosArrayGet(pFunctionIdList, i);
|
||||
|
||||
bool timeWindowInterpoRequired(SArray* pFunctionIdList) {
|
||||
int32_t num = (int32_t) taosArrayGetSize(pFunctionIdList);
|
||||
for (int32_t i = 0; i < num; ++i) {
|
||||
int32_t f = *(int16_t*) taosArrayGet(pFunctionIdList, i);
|
||||
if (f == FUNCTION_TWA || f == FUNCTION_INTERP) {
|
||||
// ts_comp column required the tag value for join filter
|
||||
if (functionId == FUNCTION_TAG || functionId == FUNCTION_TAGPRJ) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -414,8 +387,28 @@ bool timeWindowInterpoRequired(SArray* pFunctionIdList) {
|
|||
return false;
|
||||
}
|
||||
|
||||
//SQueryAttrInfo setQueryType(SArray* pFunctionIdList) {
|
||||
// assert(pFunctionIdList != NULL);
|
||||
//bool timeWindowInterpoRequired(SArray* pFunctionIdList) {
|
||||
// int32_t num = (int32_t) taosArrayGetSize(pFunctionIdList);
|
||||
// for (int32_t i = 0; i < num; ++i) {
|
||||
// int32_t f = *(int16_t*) taosArrayGet(pFunctionIdList, i);
|
||||
// if (f == FUNCTION_TWA || f == FUNCTION_INTERP) {
|
||||
// return true;
|
||||
// }
|
||||
// }
|
||||
//
|
||||
//
|
||||
//}
|
||||
// return false;
|
||||
//}
|
||||
|
||||
void extractFunctionDesc(SArray* pFunctionIdList, SMultiFunctionsDesc* pDesc) {
|
||||
assert(pFunctionIdList != NULL);
|
||||
|
||||
|
||||
pDesc->blockDistribution = isBlockDistQuery(pFunctionIdList);
|
||||
if (pDesc->blockDistribution) {
|
||||
return;
|
||||
}
|
||||
|
||||
pDesc->projectionQuery = isProjectionQuery(pFunctionIdList);
|
||||
pDesc->onlyTagQuery = isTagsQuery(pFunctionIdList);
|
||||
pDesc->interpQuery = isInterpQuery(pFunctionIdList);
|
||||
}
|
||||
|
|
|
@ -298,7 +298,7 @@ void* destroyCreateTableSql(SCreateTableSql* pCreate);
|
|||
void setDropFuncInfo(SSqlInfo *pInfo, int32_t type, SToken* pToken);
|
||||
void setCreateFuncInfo(SSqlInfo *pInfo, int32_t type, SToken *pName, SToken *pPath, SField *output, SToken* bufSize, int32_t funcType);
|
||||
|
||||
void SqlInfoDestroy(SSqlInfo *pInfo);
|
||||
void destroySqlInfo(SSqlInfo *pInfo);
|
||||
|
||||
void setDCLSqlElems(SSqlInfo *pInfo, int32_t type, int32_t nParams, ...);
|
||||
void setDropDbTableInfo(SSqlInfo *pInfo, int32_t type, SToken* pToken, SToken* existsCheck,int16_t dbType,int16_t tableType);
|
||||
|
|
|
@ -73,7 +73,9 @@ int32_t evaluateSqlNode(SSqlNode* pNode, int32_t tsPrecision, SMsgBuf* pMsgBuf);
|
|||
|
||||
int32_t validateSqlNode(SSqlNode* pSqlNode, SQueryStmtInfo* pQueryInfo, SMsgBuf* pMsgBuf);
|
||||
|
||||
void initQueryInfo(SQueryStmtInfo* pQueryInfo);
|
||||
SQueryStmtInfo* createQueryInfo();
|
||||
|
||||
void destroyQueryInfo(SQueryStmtInfo* pQueryInfo);
|
||||
|
||||
int32_t checkForInvalidExpr(SQueryStmtInfo* pQueryInfo, SMsgBuf* pMsgBuf);
|
||||
|
||||
|
@ -87,6 +89,12 @@ int32_t checkForInvalidExpr(SQueryStmtInfo* pQueryInfo, SMsgBuf* pMsgBuf);
|
|||
*/
|
||||
int32_t qParserExtractRequestedMetaInfo(const SSqlInfo* pSqlInfo, SMetaReq* pMetaInfo, char* msg, int32_t msgBufLen);
|
||||
|
||||
/**
|
||||
* Destroy the meta data request structure.
|
||||
* @param pMetaInfo
|
||||
*/
|
||||
void qParserClearupMetaRequestInfo(SMetaReq* pMetaInfo);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -30,9 +30,7 @@ SSchema *getTableTagSchema(const STableMeta* pTableMeta);
|
|||
SSchema *getOneColumnSchema(const STableMeta* pTableMeta, int32_t colIndex);
|
||||
|
||||
size_t getNumOfExprs(SQueryStmtInfo* pQueryInfo);
|
||||
//SExprInfo* createExprInfo(STableMetaInfo* pTableMetaInfo, int16_t functionId, SColumnIndex* pColIndex, struct tExprNode* pParamExpr, SSchema* pResSchema, int16_t interSize);
|
||||
SExprInfo* createBinaryExprInfo(struct tExprNode* pNode, SSchema* pResSchema);
|
||||
void destroyExprInfoList();
|
||||
|
||||
void addExprInfo(SQueryStmtInfo* pQueryInfo, int32_t index, SExprInfo* pExprInfo);
|
||||
void updateExprInfo(SExprInfo* pExprInfo, int16_t functionId, int32_t colId, int16_t srcColumnIndex, int16_t resType, int16_t resSize);
|
||||
|
@ -42,9 +40,11 @@ int32_t copyAllExprInfo(SArray* dst, const SArray* src, bool deepcopy);
|
|||
|
||||
void addExprInfoParam(SSqlExpr* pExpr, char* argument, int32_t type, int32_t bytes);
|
||||
|
||||
int32_t getExprFunctionId(SExprInfo *pExprInfo);
|
||||
void cleanupFieldInfo(SFieldInfo* pFieldInfo);
|
||||
|
||||
STableComInfo getTableInfo(const STableMeta* pTableMeta);
|
||||
SArray* extractFunctionIdList(SArray* pExprInfoList);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -242,7 +242,6 @@ tSqlExpr *tSqlExprClone(tSqlExpr *pSrc) {
|
|||
}
|
||||
|
||||
void tSqlExprCompact(tSqlExpr **pExpr) {
|
||||
|
||||
if (*pExpr == NULL || tSqlExprIsParentOfLeaf(*pExpr)) {
|
||||
return;
|
||||
}
|
||||
|
@ -770,8 +769,11 @@ void setCreateFuncInfo(SSqlInfo *pInfo, int32_t type, SToken *pName, SToken *pPa
|
|||
}
|
||||
}
|
||||
|
||||
void SqlInfoDestroy(SSqlInfo *pInfo) {
|
||||
if (pInfo == NULL) return;;
|
||||
void destroySqlInfo(SSqlInfo *pInfo) {
|
||||
if (pInfo == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
taosArrayDestroy(pInfo->funcs);
|
||||
if (pInfo->type == TSDB_SQL_SELECT) {
|
||||
destroyAllSqlNode(pInfo->list);
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -185,4 +185,13 @@ int32_t qParserExtractRequestedMetaInfo(const SSqlInfo* pSqlInfo, SMetaReq* pMet
|
|||
}
|
||||
|
||||
return code;
|
||||
}
|
||||
}
|
||||
|
||||
void qParserClearupMetaRequestInfo(SMetaReq* pMetaReq) {
|
||||
if (pMetaReq == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
taosArrayDestroy(pMetaReq->pTableName);
|
||||
taosArrayDestroy(pMetaReq->pUdf);
|
||||
}
|
||||
|
|
|
@ -576,13 +576,6 @@ TAOS_FIELD* getFieldInfo(SFieldInfo* pFieldInfo, int32_t index) {
|
|||
return &((SInternalField*)TARRAY_GET_ELEM(pFieldInfo->internalField, index))->field;
|
||||
}
|
||||
|
||||
int16_t getFieldInfoOffset(SQueryStmtInfo* pQueryInfo, int32_t index) {
|
||||
SInternalField* pInfo = getInternalField(&pQueryInfo->fieldsInfo, index);
|
||||
assert(pInfo != NULL && pInfo->pExpr->pExpr == NULL);
|
||||
return 0;
|
||||
// return pInfo->pExpr->base.offset;
|
||||
}
|
||||
|
||||
int32_t fieldInfoCompare(const SFieldInfo* pFieldInfo1, const SFieldInfo* pFieldInfo2, int32_t *diffSize) {
|
||||
assert(pFieldInfo1 != NULL && pFieldInfo2 != NULL);
|
||||
|
||||
|
@ -780,8 +773,8 @@ SColumn* columnListInsert(SArray* pColumnList, int32_t columnIndex, uint64_t uid
|
|||
}
|
||||
|
||||
SColumn* insertPrimaryTsColumn(SArray* pColumnList, uint64_t tableUid) {
|
||||
SSchema s = {.type = TSDB_DATA_TYPE_TIMESTAMP, .bytes = TSDB_KEYSIZE, .colId = PRIMARYKEY_TIMESTAMP_COL_INDEX};
|
||||
return columnListInsert(pColumnList, PRIMARYKEY_TIMESTAMP_COL_INDEX, tableUid, &s);
|
||||
SSchema s = {.type = TSDB_DATA_TYPE_TIMESTAMP, .bytes = TSDB_KEYSIZE, .colId = PRIMARYKEY_TIMESTAMP_COL_ID};
|
||||
return columnListInsert(pColumnList, PRIMARYKEY_TIMESTAMP_COL_ID, tableUid, &s);
|
||||
}
|
||||
|
||||
void columnCopy(SColumn* pDest, const SColumn* pSrc);
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
#include "queryInfoUtil.h"
|
||||
#include <function.h>
|
||||
#include "astGenerator.h"
|
||||
#include "function.h"
|
||||
#include "os.h"
|
||||
|
@ -55,7 +56,6 @@ SSchema* getTableTagSchema(const STableMeta* pTableMeta) {
|
|||
}
|
||||
|
||||
static tExprNode* createUnaryFunctionExprNode(int32_t functionId, SSchema* pSchema, tExprNode* pColumnNode) {
|
||||
|
||||
if (pColumnNode == NULL) {
|
||||
pColumnNode = calloc(1, sizeof(tExprNode));
|
||||
pColumnNode->nodeType = TEXPR_COL_NODE;
|
||||
|
@ -167,6 +167,10 @@ SExprInfo* getExprInfo(SQueryStmtInfo* pQueryInfo, int32_t index) {
|
|||
|
||||
void destroyExprInfo(SExprInfo* pExprInfo) {
|
||||
tExprTreeDestroy(pExprInfo->pExpr, NULL);
|
||||
|
||||
for(int32_t i = 0; i < pExprInfo->base.numOfParams; ++i) {
|
||||
taosVariantDestroy(&pExprInfo->base.param[i]);
|
||||
}
|
||||
tfree(pExprInfo);
|
||||
}
|
||||
|
||||
|
@ -192,6 +196,11 @@ void addExprInfoParam(SSqlExpr* pExpr, char* argument, int32_t type, int32_t byt
|
|||
assert(pExpr->numOfParams <= 3);
|
||||
}
|
||||
|
||||
int32_t getExprFunctionId(SExprInfo *pExprInfo) {
|
||||
assert(pExprInfo != NULL && pExprInfo->pExpr != NULL && pExprInfo->pExpr->nodeType == TEXPR_UNARYEXPR_NODE);
|
||||
return pExprInfo->pExpr->_node.functionId;
|
||||
}
|
||||
|
||||
void assignExprInfo(SExprInfo* dst, const SExprInfo* src) {
|
||||
assert(dst != NULL && src != NULL);
|
||||
|
||||
|
@ -284,62 +293,11 @@ int32_t getResRowLength(SArray* pExprList) {
|
|||
return size;
|
||||
}
|
||||
|
||||
static void freeQueryInfoImpl(SQueryStmtInfo* pQueryInfo) {
|
||||
cleanupTagCond(&pQueryInfo->tagCond);
|
||||
cleanupColumnCond(&pQueryInfo->colCond);
|
||||
cleanupFieldInfo(&pQueryInfo->fieldsInfo);
|
||||
|
||||
dropAllExprInfo(pQueryInfo->exprList);
|
||||
pQueryInfo->exprList = NULL;
|
||||
|
||||
if (pQueryInfo->exprList1 != NULL) {
|
||||
dropAllExprInfo(pQueryInfo->exprList1);
|
||||
pQueryInfo->exprList1 = NULL;
|
||||
}
|
||||
|
||||
columnListDestroy(pQueryInfo->colList);
|
||||
pQueryInfo->colList = NULL;
|
||||
|
||||
if (pQueryInfo->groupbyExpr.columnInfo != NULL) {
|
||||
taosArrayDestroy(pQueryInfo->groupbyExpr.columnInfo);
|
||||
pQueryInfo->groupbyExpr.columnInfo = NULL;
|
||||
}
|
||||
|
||||
pQueryInfo->fillType = 0;
|
||||
|
||||
tfree(pQueryInfo->fillVal);
|
||||
tfree(pQueryInfo->buf);
|
||||
|
||||
taosArrayDestroy(pQueryInfo->pUpstream);
|
||||
pQueryInfo->pUpstream = NULL;
|
||||
pQueryInfo->bufLen = 0;
|
||||
}
|
||||
|
||||
void freeQueryInfo(SQueryStmtInfo* pQueryInfo, bool removeCachedMeta, uint64_t id) {
|
||||
while(pQueryInfo != NULL) {
|
||||
SQueryStmtInfo* p = pQueryInfo->sibling;
|
||||
|
||||
size_t numOfUpstream = taosArrayGetSize(pQueryInfo->pUpstream);
|
||||
for(int32_t i = 0; i < numOfUpstream; ++i) {
|
||||
SQueryStmtInfo* pUpQueryInfo = taosArrayGetP(pQueryInfo->pUpstream, i);
|
||||
freeQueryInfoImpl(pUpQueryInfo);
|
||||
clearAllTableMetaInfo(pUpQueryInfo, removeCachedMeta, id);
|
||||
tfree(pUpQueryInfo);
|
||||
}
|
||||
|
||||
freeQueryInfoImpl(pQueryInfo);
|
||||
clearAllTableMetaInfo(pQueryInfo, removeCachedMeta, id);
|
||||
|
||||
tfree(pQueryInfo);
|
||||
pQueryInfo = p;
|
||||
}
|
||||
}
|
||||
|
||||
SArray* extractFunctionIdList(SArray* pExprInfoList) {
|
||||
assert(pExprInfoList != NULL);
|
||||
|
||||
size_t len = taosArrayGetSize(pExprInfoList);
|
||||
SArray* p = taosArrayInit(len, sizeof(int16_t));
|
||||
SArray* p = taosArrayInit(len, sizeof(int32_t));
|
||||
for(int32_t i = 0; i < len; ++i) {
|
||||
SExprInfo* pExprInfo = taosArrayGetP(pExprInfoList, i);
|
||||
taosArrayPush(p, &pExprInfo->pExpr->_node.functionId);
|
||||
|
|
|
@ -5,14 +5,14 @@ MESSAGE(STATUS "build parser unit test")
|
|||
SET(CMAKE_CXX_STANDARD 11)
|
||||
AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} SOURCE_LIST)
|
||||
|
||||
ADD_EXECUTABLE(astTest ${SOURCE_LIST})
|
||||
ADD_EXECUTABLE(parserTest ${SOURCE_LIST})
|
||||
TARGET_LINK_LIBRARIES(
|
||||
astTest
|
||||
PUBLIC os util common parser catalog transport gtest
|
||||
parserTest
|
||||
PUBLIC os util common parser catalog transport gtest function
|
||||
)
|
||||
|
||||
TARGET_INCLUDE_DIRECTORIES(
|
||||
astTest
|
||||
parserTest
|
||||
PUBLIC "${CMAKE_SOURCE_DIR}/include/libs/parser/"
|
||||
PRIVATE "${CMAKE_SOURCE_DIR}/source/libs/parser/inc"
|
||||
)
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <function.h>
|
||||
#include <gtest/gtest.h>
|
||||
#include <iostream>
|
||||
#pragma GCC diagnostic ignored "-Wwrite-strings"
|
||||
|
@ -65,61 +66,64 @@ void setTableMetaInfo(SQueryStmtInfo* pQueryInfo, SMetaReq *req) {
|
|||
}
|
||||
}
|
||||
|
||||
//TEST(testCase, validateAST_test) {
|
||||
// SSqlInfo info1 = doGenerateAST("select a a1111, a+b + 22, tbname from `t.1abc` where ts<now+2h and `col` < 20 + 99");
|
||||
// ASSERT_EQ(info1.valid, true);
|
||||
//
|
||||
// char msg[128] = {0};
|
||||
// SMsgBuf buf;
|
||||
// buf.len = 128;
|
||||
// buf.buf = msg;
|
||||
//
|
||||
// SSqlNode* pNode = (SSqlNode*) taosArrayGetP(((SArray*)info1.list), 0);
|
||||
// int32_t code = evaluateSqlNode(pNode, TSDB_TIME_PRECISION_NANO, &buf);
|
||||
// ASSERT_EQ(code, 0);
|
||||
//
|
||||
// SMetaReq req = {0};
|
||||
// int32_t ret = qParserExtractRequestedMetaInfo(&info1, &req, msg, 128);
|
||||
// ASSERT_EQ(ret, 0);
|
||||
// ASSERT_EQ(taosArrayGetSize(req.pTableName), 1);
|
||||
//
|
||||
// SQueryStmtInfo* pQueryInfo = (SQueryStmtInfo*)calloc(1, sizeof(SQueryStmtInfo));
|
||||
// initQueryInfo(pQueryInfo);
|
||||
// setTableMetaInfo(pQueryInfo, &req);
|
||||
//
|
||||
// SSqlNode* pSqlNode = (SSqlNode*)taosArrayGetP(info1.list, 0);
|
||||
// ret = validateSqlNode(pSqlNode, pQueryInfo, &buf);
|
||||
//
|
||||
// SArray* pExprList = pQueryInfo->exprList;
|
||||
// ASSERT_EQ(taosArrayGetSize(pExprList), 3);
|
||||
//
|
||||
// SExprInfo* p1 = (SExprInfo*) taosArrayGetP(pExprList, 0);
|
||||
// ASSERT_EQ(p1->base.uid, 110);
|
||||
// ASSERT_EQ(p1->base.numOfParams, 0);
|
||||
// ASSERT_EQ(p1->base.resSchema.type, TSDB_DATA_TYPE_INT);
|
||||
// ASSERT_STRCASEEQ(p1->base.resSchema.name, "a1111");
|
||||
// ASSERT_STRCASEEQ(p1->base.colInfo.name, "t.1abc.a");
|
||||
TEST(testCase, validateAST_test) {
|
||||
SSqlInfo info1 = doGenerateAST("select a a1111, a+b + 22, tbname from `t.1abc` where ts<now+2h and `col` < 20 + 99");
|
||||
ASSERT_EQ(info1.valid, true);
|
||||
|
||||
char msg[128] = {0};
|
||||
SMsgBuf buf;
|
||||
buf.len = 128;
|
||||
buf.buf = msg;
|
||||
|
||||
SSqlNode* pNode = (SSqlNode*) taosArrayGetP(((SArray*)info1.list), 0);
|
||||
int32_t code = evaluateSqlNode(pNode, TSDB_TIME_PRECISION_NANO, &buf);
|
||||
ASSERT_EQ(code, 0);
|
||||
|
||||
SMetaReq req = {0};
|
||||
int32_t ret = qParserExtractRequestedMetaInfo(&info1, &req, msg, 128);
|
||||
ASSERT_EQ(ret, 0);
|
||||
ASSERT_EQ(taosArrayGetSize(req.pTableName), 1);
|
||||
|
||||
SQueryStmtInfo* pQueryInfo = createQueryInfo();
|
||||
setTableMetaInfo(pQueryInfo, &req);
|
||||
|
||||
SSqlNode* pSqlNode = (SSqlNode*)taosArrayGetP(info1.list, 0);
|
||||
ret = validateSqlNode(pSqlNode, pQueryInfo, &buf);
|
||||
|
||||
SArray* pExprList = pQueryInfo->exprList;
|
||||
ASSERT_EQ(taosArrayGetSize(pExprList), 3);
|
||||
|
||||
SExprInfo* p1 = (SExprInfo*) taosArrayGetP(pExprList, 0);
|
||||
ASSERT_EQ(p1->base.uid, 110);
|
||||
ASSERT_EQ(p1->base.numOfParams, 0);
|
||||
ASSERT_EQ(p1->base.resSchema.type, TSDB_DATA_TYPE_INT);
|
||||
ASSERT_STRCASEEQ(p1->base.resSchema.name, "a1111");
|
||||
ASSERT_STRCASEEQ(p1->base.colInfo.name, "t.1abc.a");
|
||||
ASSERT_EQ(p1->base.colInfo.colId, 1);
|
||||
ASSERT_EQ(p1->base.colInfo.flag, TSDB_COL_NORMAL);
|
||||
ASSERT_STRCASEEQ(p1->base.token, "a");
|
||||
|
||||
ASSERT_EQ(taosArrayGetSize(pExprList), 3);
|
||||
|
||||
SExprInfo* p2 = (SExprInfo*) taosArrayGetP(pExprList, 1);
|
||||
ASSERT_EQ(p2->base.uid, 0);
|
||||
ASSERT_EQ(p2->base.numOfParams, 1); // it is the serialized binary string of expression.
|
||||
ASSERT_EQ(p2->base.resSchema.type, TSDB_DATA_TYPE_DOUBLE);
|
||||
ASSERT_STRCASEEQ(p2->base.resSchema.name, "a+b + 22");
|
||||
|
||||
// ASSERT_STRCASEEQ(p2->base.colInfo.name, "t.1abc.a");
|
||||
// ASSERT_EQ(p1->base.colInfo.colId, 1);
|
||||
// ASSERT_EQ(p1->base.colInfo.flag, TSDB_COL_NORMAL);
|
||||
// ASSERT_STRCASEEQ(p1->base.token, "a");
|
||||
//
|
||||
// ASSERT_EQ(taosArrayGetSize(pExprList), 3);
|
||||
//
|
||||
// SExprInfo* p2 = (SExprInfo*) taosArrayGetP(pExprList, 1);
|
||||
// ASSERT_EQ(p2->base.uid, 0);
|
||||
// ASSERT_EQ(p2->base.numOfParams, 1); // it is the serialized binary string of expression.
|
||||
// ASSERT_EQ(p2->base.resSchema.type, TSDB_DATA_TYPE_DOUBLE);
|
||||
// ASSERT_STRCASEEQ(p2->base.resSchema.name, "a+b + 22");
|
||||
//
|
||||
//// ASSERT_STRCASEEQ(p2->base.colInfo.name, "t.1abc.a");
|
||||
//// ASSERT_EQ(p1->base.colInfo.colId, 1);
|
||||
//// ASSERT_EQ(p1->base.colInfo.flag, TSDB_COL_NORMAL);
|
||||
// ASSERT_STRCASEEQ(p2->base.token, "a+b + 22");
|
||||
//
|
||||
// ASSERT_EQ(taosArrayGetSize(pQueryInfo->colList), 3);
|
||||
// ASSERT_EQ(pQueryInfo->fieldsInfo.numOfOutput, 3);
|
||||
//}
|
||||
//
|
||||
ASSERT_STRCASEEQ(p2->base.token, "a+b + 22");
|
||||
|
||||
ASSERT_EQ(taosArrayGetSize(pQueryInfo->colList), 3);
|
||||
ASSERT_EQ(pQueryInfo->fieldsInfo.numOfOutput, 3);
|
||||
|
||||
destroyQueryInfo(pQueryInfo);
|
||||
qParserClearupMetaRequestInfo(&req);
|
||||
destroySqlInfo(&info1);
|
||||
}
|
||||
|
||||
//TEST(testCase, function_Test) {
|
||||
// SSqlInfo info1 = doGenerateAST("select count(a) from `t.1abc`");
|
||||
// ASSERT_EQ(info1.valid, true);
|
||||
|
@ -138,8 +142,7 @@ void setTableMetaInfo(SQueryStmtInfo* pQueryInfo, SMetaReq *req) {
|
|||
// ASSERT_EQ(ret, 0);
|
||||
// ASSERT_EQ(taosArrayGetSize(req.pTableName), 1);
|
||||
//
|
||||
// SQueryStmtInfo* pQueryInfo = (SQueryStmtInfo*)calloc(1, sizeof(SQueryStmtInfo));
|
||||
// initQueryInfo(pQueryInfo);
|
||||
// SQueryStmtInfo* pQueryInfo = createQueryInfo();
|
||||
// setTableMetaInfo(pQueryInfo, &req);
|
||||
//
|
||||
// SSqlNode* pSqlNode = (SSqlNode*)taosArrayGetP(info1.list, 0);
|
||||
|
@ -161,6 +164,10 @@ void setTableMetaInfo(SQueryStmtInfo* pQueryInfo, SMetaReq *req) {
|
|||
//
|
||||
// ASSERT_EQ(taosArrayGetSize(pQueryInfo->colList), 2);
|
||||
// ASSERT_EQ(pQueryInfo->fieldsInfo.numOfOutput, 1);
|
||||
//
|
||||
// destroyQueryInfo(pQueryInfo);
|
||||
// qParserClearupMetaRequestInfo(&req);
|
||||
// destroySqlInfo(&info1);
|
||||
//}
|
||||
//
|
||||
//TEST(testCase, function_Test2) {
|
||||
|
@ -181,8 +188,7 @@ void setTableMetaInfo(SQueryStmtInfo* pQueryInfo, SMetaReq *req) {
|
|||
// ASSERT_EQ(ret, 0);
|
||||
// ASSERT_EQ(taosArrayGetSize(req.pTableName), 1);
|
||||
//
|
||||
// SQueryStmtInfo* pQueryInfo = (SQueryStmtInfo*)calloc(1, sizeof(SQueryStmtInfo));
|
||||
// initQueryInfo(pQueryInfo);
|
||||
// SQueryStmtInfo* pQueryInfo = createQueryInfo();
|
||||
// setTableMetaInfo(pQueryInfo, &req);
|
||||
//
|
||||
// SSqlNode* pSqlNode = (SSqlNode*)taosArrayGetP(info1.list, 0);
|
||||
|
@ -204,6 +210,10 @@ void setTableMetaInfo(SQueryStmtInfo* pQueryInfo, SMetaReq *req) {
|
|||
//
|
||||
// ASSERT_EQ(taosArrayGetSize(pQueryInfo->colList), 2);
|
||||
// ASSERT_EQ(pQueryInfo->fieldsInfo.numOfOutput, 1);
|
||||
//
|
||||
// destroyQueryInfo(pQueryInfo);
|
||||
// qParserClearupMetaRequestInfo(&req);
|
||||
// destroySqlInfo(&info1);
|
||||
//}
|
||||
//
|
||||
//TEST(testCase, function_Test3) {
|
||||
|
@ -224,8 +234,7 @@ void setTableMetaInfo(SQueryStmtInfo* pQueryInfo, SMetaReq *req) {
|
|||
// ASSERT_EQ(ret, 0);
|
||||
// ASSERT_EQ(taosArrayGetSize(req.pTableName), 1);
|
||||
//
|
||||
// SQueryStmtInfo* pQueryInfo = (SQueryStmtInfo*)calloc(1, sizeof(SQueryStmtInfo));
|
||||
// initQueryInfo(pQueryInfo);
|
||||
// SQueryStmtInfo* pQueryInfo = createQueryInfo();
|
||||
// setTableMetaInfo(pQueryInfo, &req);
|
||||
//
|
||||
// SSqlNode* pSqlNode = (SSqlNode*)taosArrayGetP(info1.list, 0);
|
||||
|
@ -246,6 +255,10 @@ void setTableMetaInfo(SQueryStmtInfo* pQueryInfo, SMetaReq *req) {
|
|||
// ASSERT_EQ(p1->base.interBytes, 24);
|
||||
//
|
||||
// ASSERT_EQ(pQueryInfo->fieldsInfo.numOfOutput, 4);
|
||||
//
|
||||
// destroyQueryInfo(pQueryInfo);
|
||||
// qParserClearupMetaRequestInfo(&req);
|
||||
// destroySqlInfo(&info1);
|
||||
//}
|
||||
//
|
||||
//TEST(testCase, function_Test4) {
|
||||
|
@ -266,8 +279,7 @@ void setTableMetaInfo(SQueryStmtInfo* pQueryInfo, SMetaReq *req) {
|
|||
// ASSERT_EQ(ret, 0);
|
||||
// ASSERT_EQ(taosArrayGetSize(req.pTableName), 1);
|
||||
//
|
||||
// SQueryStmtInfo* pQueryInfo = (SQueryStmtInfo*)calloc(1, sizeof(SQueryStmtInfo));
|
||||
// initQueryInfo(pQueryInfo);
|
||||
// SQueryStmtInfo* pQueryInfo = createQueryInfo();
|
||||
// setTableMetaInfo(pQueryInfo, &req);
|
||||
//
|
||||
// SSqlNode* pSqlNode = (SSqlNode*)taosArrayGetP(info1.list, 0);
|
||||
|
@ -289,6 +301,10 @@ void setTableMetaInfo(SQueryStmtInfo* pQueryInfo, SMetaReq *req) {
|
|||
//
|
||||
// ASSERT_EQ(taosArrayGetSize(pQueryInfo->colList), 1);
|
||||
// ASSERT_EQ(pQueryInfo->fieldsInfo.numOfOutput, 1);
|
||||
//
|
||||
// destroyQueryInfo(pQueryInfo);
|
||||
// qParserClearupMetaRequestInfo(&req);
|
||||
// destroySqlInfo(&info1);
|
||||
//}
|
||||
//
|
||||
//TEST(testCase, function_Test5) {
|
||||
|
@ -309,8 +325,7 @@ void setTableMetaInfo(SQueryStmtInfo* pQueryInfo, SMetaReq *req) {
|
|||
// ASSERT_EQ(ret, 0);
|
||||
// ASSERT_EQ(taosArrayGetSize(req.pTableName), 1);
|
||||
//
|
||||
// SQueryStmtInfo* pQueryInfo = (SQueryStmtInfo*)calloc(1, sizeof(SQueryStmtInfo));
|
||||
// initQueryInfo(pQueryInfo);
|
||||
// SQueryStmtInfo* pQueryInfo = createQueryInfo();
|
||||
// setTableMetaInfo(pQueryInfo, &req);
|
||||
//
|
||||
// SSqlNode* pSqlNode = (SSqlNode*)taosArrayGetP(info1.list, 0);
|
||||
|
@ -333,46 +348,63 @@ void setTableMetaInfo(SQueryStmtInfo* pQueryInfo, SMetaReq *req) {
|
|||
//
|
||||
// ASSERT_EQ(taosArrayGetSize(pQueryInfo->colList), 3);
|
||||
// ASSERT_EQ(pQueryInfo->fieldsInfo.numOfOutput, 1);
|
||||
//
|
||||
// destroyQueryInfo(pQueryInfo);
|
||||
// qParserClearupMetaRequestInfo(&req);
|
||||
// destroySqlInfo(&info1);
|
||||
//}
|
||||
|
||||
TEST(testCase, function_Test6) {
|
||||
SSqlInfo info1 = doGenerateAST("select sum(a+b) as a1, first(b*a) from `t.1abc`");
|
||||
ASSERT_EQ(info1.valid, true);
|
||||
|
||||
char msg[128] = {0};
|
||||
SMsgBuf buf;
|
||||
buf.len = 128;
|
||||
buf.buf = msg;
|
||||
|
||||
SSqlNode* pNode = (SSqlNode*) taosArrayGetP(((SArray*)info1.list), 0);
|
||||
int32_t code = evaluateSqlNode(pNode, TSDB_TIME_PRECISION_NANO, &buf);
|
||||
ASSERT_EQ(code, 0);
|
||||
|
||||
SMetaReq req = {0};
|
||||
int32_t ret = qParserExtractRequestedMetaInfo(&info1, &req, msg, 128);
|
||||
ASSERT_EQ(ret, 0);
|
||||
ASSERT_EQ(taosArrayGetSize(req.pTableName), 1);
|
||||
|
||||
SQueryStmtInfo* pQueryInfo = (SQueryStmtInfo*)calloc(1, sizeof(SQueryStmtInfo));
|
||||
initQueryInfo(pQueryInfo);
|
||||
setTableMetaInfo(pQueryInfo, &req);
|
||||
|
||||
SSqlNode* pSqlNode = (SSqlNode*)taosArrayGetP(info1.list, 0);
|
||||
ret = validateSqlNode(pSqlNode, pQueryInfo, &buf);
|
||||
ASSERT_EQ(ret, 0);
|
||||
|
||||
SArray* pExprList = pQueryInfo->exprList;
|
||||
ASSERT_EQ(taosArrayGetSize(pExprList), 2);
|
||||
|
||||
SExprInfo* p1 = (SExprInfo*) taosArrayGetP(pExprList, 0);
|
||||
ASSERT_EQ(p1->base.uid, 110);
|
||||
ASSERT_EQ(p1->base.numOfParams, 0);
|
||||
ASSERT_EQ(p1->base.resSchema.type, TSDB_DATA_TYPE_DOUBLE);
|
||||
ASSERT_STRCASEEQ(p1->base.resSchema.name, "a1");
|
||||
ASSERT_EQ(p1->base.colInfo.flag, TSDB_COL_NORMAL);
|
||||
ASSERT_STRCASEEQ(p1->base.token, "sum(a+b)");
|
||||
ASSERT_EQ(p1->base.interBytes, 16);
|
||||
|
||||
ASSERT_EQ(taosArrayGetSize(pQueryInfo->colList), 3);
|
||||
ASSERT_EQ(pQueryInfo->fieldsInfo.numOfOutput, 2);
|
||||
}
|
||||
//
|
||||
//TEST(testCase, function_Test6) {
|
||||
// SSqlInfo info1 = doGenerateAST("select sum(a+b) as a1, first(b*a) from `t.1abc` interval(10s, 1s)");
|
||||
// ASSERT_EQ(info1.valid, true);
|
||||
//
|
||||
// char msg[128] = {0};
|
||||
// SMsgBuf buf;
|
||||
// buf.len = 128;
|
||||
// buf.buf = msg;
|
||||
//
|
||||
// SSqlNode* pNode = (SSqlNode*) taosArrayGetP(((SArray*)info1.list), 0);
|
||||
// int32_t code = evaluateSqlNode(pNode, TSDB_TIME_PRECISION_NANO, &buf);
|
||||
// ASSERT_EQ(code, 0);
|
||||
//
|
||||
// SMetaReq req = {0};
|
||||
// int32_t ret = qParserExtractRequestedMetaInfo(&info1, &req, msg, 128);
|
||||
// ASSERT_EQ(ret, 0);
|
||||
// ASSERT_EQ(taosArrayGetSize(req.pTableName), 1);
|
||||
//
|
||||
// SQueryStmtInfo* pQueryInfo = createQueryInfo();
|
||||
// setTableMetaInfo(pQueryInfo, &req);
|
||||
//
|
||||
// SSqlNode* pSqlNode = (SSqlNode*)taosArrayGetP(info1.list, 0);
|
||||
// ret = validateSqlNode(pSqlNode, pQueryInfo, &buf);
|
||||
// ASSERT_EQ(ret, 0);
|
||||
//
|
||||
// SArray* pExprList = pQueryInfo->exprList;
|
||||
// ASSERT_EQ(taosArrayGetSize(pExprList), 2);
|
||||
//
|
||||
// SExprInfo* p1 = (SExprInfo*) taosArrayGetP(pExprList, 0);
|
||||
// ASSERT_EQ(p1->base.uid, 110);
|
||||
// ASSERT_EQ(p1->base.numOfParams, 0);
|
||||
// ASSERT_EQ(p1->base.resSchema.type, TSDB_DATA_TYPE_DOUBLE);
|
||||
// ASSERT_STRCASEEQ(p1->base.resSchema.name, "a1");
|
||||
// ASSERT_EQ(p1->base.colInfo.flag, TSDB_COL_NORMAL);
|
||||
// ASSERT_STRCASEEQ(p1->base.token, "sum(a+b)");
|
||||
// ASSERT_EQ(p1->base.interBytes, 16);
|
||||
// ASSERT_EQ(p1->pExpr->nodeType, TEXPR_UNARYEXPR_NODE);
|
||||
// ASSERT_EQ(p1->pExpr->_node.functionId, FUNCTION_SUM);
|
||||
// ASSERT_TRUE(p1->pExpr->_node.pRight == NULL);
|
||||
//
|
||||
// tExprNode* pParam = p1->pExpr->_node.pLeft;
|
||||
//
|
||||
// ASSERT_EQ(pParam->nodeType, TEXPR_BINARYEXPR_NODE);
|
||||
// ASSERT_EQ(pParam->_node.optr, TSDB_BINARY_OP_ADD);
|
||||
// ASSERT_EQ(pParam->_node.pLeft->nodeType, TEXPR_COL_NODE);
|
||||
// ASSERT_EQ(pParam->_node.pRight->nodeType, TEXPR_COL_NODE);
|
||||
//
|
||||
// ASSERT_EQ(taosArrayGetSize(pQueryInfo->colList), 3);
|
||||
// ASSERT_EQ(pQueryInfo->fieldsInfo.numOfOutput, 2);
|
||||
//
|
||||
// destroyQueryInfo(pQueryInfo);
|
||||
// qParserClearupMetaRequestInfo(&req);
|
||||
// destroySqlInfo(&info1);
|
||||
//}
|
|
@ -667,51 +667,59 @@ TEST(testCase, isValidNumber_test) {
|
|||
EXPECT_EQ(tGetNumericStringType(&t1), TK_FLOAT);
|
||||
}
|
||||
|
||||
TEST(testCase, generateAST_test) {
|
||||
SSqlInfo info = doGenerateAST("select * from t1 where ts < now");
|
||||
ASSERT_EQ(info.valid, true);
|
||||
|
||||
SSqlInfo info1 = doGenerateAST("select * from `t.1abc` where ts<now+2h and col < 20+99");
|
||||
ASSERT_EQ(info1.valid, true);
|
||||
|
||||
char msg[128] = {0};
|
||||
|
||||
SMsgBuf msgBuf = {0};
|
||||
msgBuf.buf = msg;
|
||||
msgBuf.len = 128;
|
||||
|
||||
SSqlNode* pNode = (SSqlNode*) taosArrayGetP(((SArray*)info1.list), 0);
|
||||
int32_t code = evaluateSqlNode(pNode, TSDB_TIME_PRECISION_NANO, &msgBuf);
|
||||
ASSERT_EQ(code, 0);
|
||||
|
||||
SSqlInfo info2 = doGenerateAST("select * from abc where ts<now+2");
|
||||
SSqlNode* pNode2 = (SSqlNode*) taosArrayGetP(((SArray*)info2.list), 0);
|
||||
code = evaluateSqlNode(pNode2, TSDB_TIME_PRECISION_MILLI, &msgBuf);
|
||||
ASSERT_NE(code, 0);
|
||||
}
|
||||
|
||||
TEST(testCase, evaluateAST_test) {
|
||||
SSqlInfo info1 = doGenerateAST("select a, b+22 from `t.1abc` where ts<now+2h and `col` < 20 + 99");
|
||||
ASSERT_EQ(info1.valid, true);
|
||||
|
||||
char msg[128] = {0};
|
||||
SMsgBuf msgBuf = {0};
|
||||
msgBuf.buf = msg;
|
||||
msgBuf.len = 128;
|
||||
|
||||
SSqlNode* pNode = (SSqlNode*) taosArrayGetP(((SArray*)info1.list), 0);
|
||||
int32_t code = evaluateSqlNode(pNode, TSDB_TIME_PRECISION_NANO, &msgBuf);
|
||||
ASSERT_EQ(code, 0);
|
||||
}
|
||||
|
||||
TEST(testCase, extractMeta_test) {
|
||||
SSqlInfo info1 = doGenerateAST("select a, b+22 from `t.1abc` where ts<now+2h and `col` < 20 + 99");
|
||||
ASSERT_EQ(info1.valid, true);
|
||||
|
||||
char msg[128] = {0};
|
||||
SMetaReq req = {0};
|
||||
int32_t ret = qParserExtractRequestedMetaInfo(&info1, &req, msg, 128);
|
||||
ASSERT_EQ(ret, 0);
|
||||
ASSERT_EQ(taosArrayGetSize(req.pTableName), 1);
|
||||
}
|
||||
//TEST(testCase, generateAST_test) {
|
||||
// SSqlInfo info = doGenerateAST("select * from t1 where ts < now");
|
||||
// ASSERT_EQ(info.valid, true);
|
||||
//
|
||||
// SSqlInfo info1 = doGenerateAST("select * from `t.1abc` where ts<now+2h and col < 20+99");
|
||||
// ASSERT_EQ(info1.valid, true);
|
||||
//
|
||||
// char msg[128] = {0};
|
||||
//
|
||||
// SMsgBuf msgBuf = {0};
|
||||
// msgBuf.buf = msg;
|
||||
// msgBuf.len = 128;
|
||||
//
|
||||
// SSqlNode* pNode = (SSqlNode*) taosArrayGetP(((SArray*)info1.list), 0);
|
||||
// int32_t code = evaluateSqlNode(pNode, TSDB_TIME_PRECISION_NANO, &msgBuf);
|
||||
// ASSERT_EQ(code, 0);
|
||||
//
|
||||
// SSqlInfo info2 = doGenerateAST("select * from abc where ts<now+2");
|
||||
// SSqlNode* pNode2 = (SSqlNode*) taosArrayGetP(((SArray*)info2.list), 0);
|
||||
// code = evaluateSqlNode(pNode2, TSDB_TIME_PRECISION_MILLI, &msgBuf);
|
||||
// ASSERT_NE(code, 0);
|
||||
//
|
||||
// destroySqlInfo(&info);
|
||||
// destroySqlInfo(&info1);
|
||||
// destroySqlInfo(&info2);
|
||||
//}
|
||||
//
|
||||
//TEST(testCase, evaluateAST_test) {
|
||||
// SSqlInfo info1 = doGenerateAST("select a, b+22 from `t.1abc` where ts<now+2h and `col` < 20 + 99");
|
||||
// ASSERT_EQ(info1.valid, true);
|
||||
//
|
||||
// char msg[128] = {0};
|
||||
// SMsgBuf msgBuf = {0};
|
||||
// msgBuf.buf = msg;
|
||||
// msgBuf.len = 128;
|
||||
//
|
||||
// SSqlNode* pNode = (SSqlNode*) taosArrayGetP(((SArray*)info1.list), 0);
|
||||
// int32_t code = evaluateSqlNode(pNode, TSDB_TIME_PRECISION_NANO, &msgBuf);
|
||||
// ASSERT_EQ(code, 0);
|
||||
// destroySqlInfo(&info1);
|
||||
//}
|
||||
//
|
||||
//TEST(testCase, extractMeta_test) {
|
||||
// SSqlInfo info1 = doGenerateAST("select a, b+22 from `t.1abc` where ts<now+2h and `col` < 20 + 99");
|
||||
// ASSERT_EQ(info1.valid, true);
|
||||
//
|
||||
// char msg[128] = {0};
|
||||
// SMetaReq req = {0};
|
||||
// int32_t ret = qParserExtractRequestedMetaInfo(&info1, &req, msg, 128);
|
||||
// ASSERT_EQ(ret, 0);
|
||||
// ASSERT_EQ(taosArrayGetSize(req.pTableName), 1);
|
||||
//
|
||||
// qParserClearupMetaRequestInfo(&req);
|
||||
// destroySqlInfo(&info1);
|
||||
//}
|
||||
|
||||
|
|
Loading…
Reference in New Issue