commit
f6edfd755b
|
@ -91,6 +91,8 @@ typedef struct {
|
||||||
do { \
|
do { \
|
||||||
switch (_type) { \
|
switch (_type) { \
|
||||||
case TSDB_DATA_TYPE_BOOL: \
|
case TSDB_DATA_TYPE_BOOL: \
|
||||||
|
*(bool *)(_v) = (bool)(_data); \
|
||||||
|
break; \
|
||||||
case TSDB_DATA_TYPE_TINYINT: \
|
case TSDB_DATA_TYPE_TINYINT: \
|
||||||
*(int8_t *)(_v) = (int8_t)(_data); \
|
*(int8_t *)(_v) = (int8_t)(_data); \
|
||||||
break; \
|
break; \
|
||||||
|
@ -104,6 +106,7 @@ typedef struct {
|
||||||
*(uint16_t *)(_v) = (uint16_t)(_data); \
|
*(uint16_t *)(_v) = (uint16_t)(_data); \
|
||||||
break; \
|
break; \
|
||||||
case TSDB_DATA_TYPE_BIGINT: \
|
case TSDB_DATA_TYPE_BIGINT: \
|
||||||
|
case TSDB_DATA_TYPE_TIMESTAMP: \
|
||||||
*(int64_t *)(_v) = (int64_t)(_data); \
|
*(int64_t *)(_v) = (int64_t)(_data); \
|
||||||
break; \
|
break; \
|
||||||
case TSDB_DATA_TYPE_UBIGINT: \
|
case TSDB_DATA_TYPE_UBIGINT: \
|
||||||
|
|
|
@ -228,6 +228,7 @@ typedef struct SAggFunctionInfo {
|
||||||
|
|
||||||
typedef struct SScalarParam {
|
typedef struct SScalarParam {
|
||||||
void* data;
|
void* data;
|
||||||
|
bool colData;
|
||||||
int32_t num;
|
int32_t num;
|
||||||
int32_t type;
|
int32_t type;
|
||||||
int32_t bytes;
|
int32_t bytes;
|
||||||
|
|
|
@ -88,45 +88,6 @@ typedef struct SValueNode {
|
||||||
} datum;
|
} datum;
|
||||||
} SValueNode;
|
} SValueNode;
|
||||||
|
|
||||||
typedef enum EOperatorType {
|
|
||||||
// arithmetic operator
|
|
||||||
OP_TYPE_ADD = 1,
|
|
||||||
OP_TYPE_SUB,
|
|
||||||
OP_TYPE_MULTI,
|
|
||||||
OP_TYPE_DIV,
|
|
||||||
OP_TYPE_MOD,
|
|
||||||
|
|
||||||
// bit operator
|
|
||||||
OP_TYPE_BIT_AND,
|
|
||||||
OP_TYPE_BIT_OR,
|
|
||||||
|
|
||||||
// comparison operator
|
|
||||||
OP_TYPE_GREATER_THAN,
|
|
||||||
OP_TYPE_GREATER_EQUAL,
|
|
||||||
OP_TYPE_LOWER_THAN,
|
|
||||||
OP_TYPE_LOWER_EQUAL,
|
|
||||||
OP_TYPE_EQUAL,
|
|
||||||
OP_TYPE_NOT_EQUAL,
|
|
||||||
OP_TYPE_IN,
|
|
||||||
OP_TYPE_NOT_IN,
|
|
||||||
OP_TYPE_LIKE,
|
|
||||||
OP_TYPE_NOT_LIKE,
|
|
||||||
OP_TYPE_MATCH,
|
|
||||||
OP_TYPE_NMATCH,
|
|
||||||
OP_TYPE_IS_NULL,
|
|
||||||
OP_TYPE_IS_NOT_NULL,
|
|
||||||
OP_TYPE_IS_TRUE,
|
|
||||||
OP_TYPE_IS_FALSE,
|
|
||||||
OP_TYPE_IS_UNKNOWN,
|
|
||||||
OP_TYPE_IS_NOT_TRUE,
|
|
||||||
OP_TYPE_IS_NOT_FALSE,
|
|
||||||
OP_TYPE_IS_NOT_UNKNOWN,
|
|
||||||
|
|
||||||
// json operator
|
|
||||||
OP_TYPE_JSON_GET_VALUE,
|
|
||||||
OP_TYPE_JSON_CONTAINS
|
|
||||||
} EOperatorType;
|
|
||||||
|
|
||||||
typedef struct SOperatorNode {
|
typedef struct SOperatorNode {
|
||||||
SExprNode node; // QUERY_NODE_OPERATOR
|
SExprNode node; // QUERY_NODE_OPERATOR
|
||||||
EOperatorType opType;
|
EOperatorType opType;
|
||||||
|
@ -134,11 +95,6 @@ typedef struct SOperatorNode {
|
||||||
SNode* pRight;
|
SNode* pRight;
|
||||||
} SOperatorNode;
|
} SOperatorNode;
|
||||||
|
|
||||||
typedef enum ELogicConditionType {
|
|
||||||
LOGIC_COND_TYPE_AND,
|
|
||||||
LOGIC_COND_TYPE_OR,
|
|
||||||
LOGIC_COND_TYPE_NOT,
|
|
||||||
} ELogicConditionType;
|
|
||||||
|
|
||||||
typedef struct SLogicConditionNode {
|
typedef struct SLogicConditionNode {
|
||||||
SExprNode node; // QUERY_NODE_LOGIC_CONDITION
|
SExprNode node; // QUERY_NODE_LOGIC_CONDITION
|
||||||
|
|
|
@ -20,6 +20,14 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct SFilterInfo SFilterInfo;
|
typedef struct SFilterInfo SFilterInfo;
|
||||||
|
typedef int32_t (*filer_get_col_from_id)(void *, int32_t, void **);
|
||||||
|
|
||||||
|
|
||||||
|
enum {
|
||||||
|
FLT_OPTION_NO_REWRITE = 1,
|
||||||
|
FLT_OPTION_TIMESTAMP = 2,
|
||||||
|
FLT_OPTION_NEED_UNIQE = 4,
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct SFilterColumnParam{
|
typedef struct SFilterColumnParam{
|
||||||
int32_t numOfCols;
|
int32_t numOfCols;
|
||||||
|
@ -27,8 +35,18 @@ typedef struct SFilterColumnParam{
|
||||||
} SFilterColumnParam;
|
} SFilterColumnParam;
|
||||||
|
|
||||||
|
|
||||||
|
extern int32_t filterInitFromNode(SNode *pNode, SFilterInfo **pinfo, uint32_t options);
|
||||||
|
extern bool filterExecute(SFilterInfo *info, SSDataBlock *pSrc, int8_t** p, SColumnDataAgg *statis, int16_t numOfCols);
|
||||||
|
extern int32_t filterSetDataFromSlotId(SFilterInfo *info, void *param, filer_get_col_from_id fp);
|
||||||
|
extern int32_t filterSetDataFromColId(SFilterInfo *info, void *param, filer_get_col_from_id fp);
|
||||||
|
extern int32_t filterGetTimeRange(SFilterInfo *info, STimeWindow *win);
|
||||||
|
extern int32_t filterConverNcharColumns(SFilterInfo* pFilterInfo, int32_t rows, bool *gotNchar);
|
||||||
|
extern int32_t filterFreeNcharColumns(SFilterInfo* pFilterInfo);
|
||||||
|
extern void filterFreeInfo(SFilterInfo *info);
|
||||||
|
extern bool filterRangeExecute(SFilterInfo *info, SColumnDataAgg *pDataStatis, int32_t numOfCols, int32_t numOfRows);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // TDENGINE_FILTER_H
|
#endif // TDENGINE_FILTER_H
|
||||||
|
|
|
@ -29,6 +29,7 @@ typedef struct SFilterInfo SFilterInfo;
|
||||||
int32_t scalarCalculateConstants(SNode *pNode, SNode **pRes);
|
int32_t scalarCalculateConstants(SNode *pNode, SNode **pRes);
|
||||||
int32_t scalarCalculate(SNode *pNode, SSDataBlock *pSrc, SScalarParam *pDst);
|
int32_t scalarCalculate(SNode *pNode, SSDataBlock *pSrc, SScalarParam *pDst);
|
||||||
int32_t scalarGetOperatorParamNum(EOperatorType type);
|
int32_t scalarGetOperatorParamNum(EOperatorType type);
|
||||||
|
int32_t scalarGenerateSetFromList(void **data, void *pNode, uint32_t type);
|
||||||
|
|
||||||
int32_t vectorGetConvertType(int32_t type1, int32_t type2);
|
int32_t vectorGetConvertType(int32_t type1, int32_t type2);
|
||||||
int32_t vectorConvertImpl(SScalarParam* pIn, SScalarParam* pOut);
|
int32_t vectorConvertImpl(SScalarParam* pIn, SScalarParam* pOut);
|
||||||
|
|
|
@ -108,35 +108,52 @@ do { \
|
||||||
(src) = (void *)((char *)src + sizeof(type));\
|
(src) = (void *)((char *)src + sizeof(type));\
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
|
typedef enum EOperatorType {
|
||||||
|
// arithmetic operator
|
||||||
|
OP_TYPE_ADD = 1,
|
||||||
|
OP_TYPE_SUB,
|
||||||
|
OP_TYPE_MULTI,
|
||||||
|
OP_TYPE_DIV,
|
||||||
|
OP_TYPE_MOD,
|
||||||
|
|
||||||
// TODO: check if below is necessary
|
// bit operator
|
||||||
#define TSDB_RELATION_INVALID 0
|
OP_TYPE_BIT_AND,
|
||||||
#define TSDB_RELATION_LESS 1
|
OP_TYPE_BIT_OR,
|
||||||
#define TSDB_RELATION_GREATER 2
|
|
||||||
#define TSDB_RELATION_EQUAL 3
|
|
||||||
#define TSDB_RELATION_LESS_EQUAL 4
|
|
||||||
#define TSDB_RELATION_GREATER_EQUAL 5
|
|
||||||
#define TSDB_RELATION_NOT_EQUAL 6
|
|
||||||
#define TSDB_RELATION_LIKE 7
|
|
||||||
#define TSDB_RELATION_NOT_LIKE 8
|
|
||||||
#define TSDB_RELATION_ISNULL 9
|
|
||||||
#define TSDB_RELATION_NOTNULL 10
|
|
||||||
#define TSDB_RELATION_IN 11
|
|
||||||
#define TSDB_RELATION_NOT_IN 12
|
|
||||||
|
|
||||||
#define TSDB_RELATION_AND 13
|
// comparison operator
|
||||||
#define TSDB_RELATION_OR 14
|
OP_TYPE_GREATER_THAN,
|
||||||
#define TSDB_RELATION_NOT 15
|
OP_TYPE_GREATER_EQUAL,
|
||||||
|
OP_TYPE_LOWER_THAN,
|
||||||
|
OP_TYPE_LOWER_EQUAL,
|
||||||
|
OP_TYPE_EQUAL,
|
||||||
|
OP_TYPE_NOT_EQUAL,
|
||||||
|
OP_TYPE_IN,
|
||||||
|
OP_TYPE_NOT_IN,
|
||||||
|
OP_TYPE_LIKE,
|
||||||
|
OP_TYPE_NOT_LIKE,
|
||||||
|
OP_TYPE_MATCH,
|
||||||
|
OP_TYPE_NMATCH,
|
||||||
|
OP_TYPE_IS_NULL,
|
||||||
|
OP_TYPE_IS_NOT_NULL,
|
||||||
|
OP_TYPE_IS_TRUE,
|
||||||
|
OP_TYPE_IS_FALSE,
|
||||||
|
OP_TYPE_IS_UNKNOWN,
|
||||||
|
OP_TYPE_IS_NOT_TRUE,
|
||||||
|
OP_TYPE_IS_NOT_FALSE,
|
||||||
|
OP_TYPE_IS_NOT_UNKNOWN,
|
||||||
|
|
||||||
#define TSDB_RELATION_MATCH 16
|
// json operator
|
||||||
#define TSDB_RELATION_NMATCH 17
|
OP_TYPE_JSON_GET_VALUE,
|
||||||
|
OP_TYPE_JSON_CONTAINS
|
||||||
|
} EOperatorType;
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum ELogicConditionType {
|
||||||
|
LOGIC_COND_TYPE_AND,
|
||||||
|
LOGIC_COND_TYPE_OR,
|
||||||
|
LOGIC_COND_TYPE_NOT,
|
||||||
|
} ELogicConditionType;
|
||||||
|
|
||||||
#define TSDB_BINARY_OP_ADD 4000
|
|
||||||
#define TSDB_BINARY_OP_SUBTRACT 4001
|
|
||||||
#define TSDB_BINARY_OP_MULTIPLY 4002
|
|
||||||
#define TSDB_BINARY_OP_DIVIDE 4003
|
|
||||||
#define TSDB_BINARY_OP_REMAINDER 4004
|
|
||||||
#define TSDB_BINARY_OP_CONCAT 4005
|
|
||||||
|
|
||||||
#define FUNCTION_CEIL 4500
|
#define FUNCTION_CEIL 4500
|
||||||
#define FUNCTION_FLOOR 4501
|
#define FUNCTION_FLOOR 4501
|
||||||
|
@ -148,9 +165,6 @@ do { \
|
||||||
#define FUNCTION_LTRIM 4802
|
#define FUNCTION_LTRIM 4802
|
||||||
#define FUNCTION_RTRIM 4803
|
#define FUNCTION_RTRIM 4803
|
||||||
|
|
||||||
#define IS_RELATION_OPTR(op) (((op) >= TSDB_RELATION_LESS) && ((op) < TSDB_RELATION_IN))
|
|
||||||
#define IS_ARITHMETIC_OPTR(op) (((op) >= TSDB_BINARY_OP_ADD) && ((op) <= TSDB_BINARY_OP_REMAINDER))
|
|
||||||
|
|
||||||
#define TSDB_NAME_DELIMITER_LEN 1
|
#define TSDB_NAME_DELIMITER_LEN 1
|
||||||
|
|
||||||
#define TSDB_UNI_LEN 24
|
#define TSDB_UNI_LEN 24
|
||||||
|
|
|
@ -31,7 +31,7 @@ SColumnFilterInfo* tFilterInfoDup(const SColumnFilterInfo* src, int32_t numOfFil
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(src->filterstr == 0 || src->filterstr == 1);
|
assert(src->filterstr == 0 || src->filterstr == 1);
|
||||||
assert(!(src->lowerRelOptr == TSDB_RELATION_INVALID && src->upperRelOptr == TSDB_RELATION_INVALID));
|
assert(!(src->lowerRelOptr == 0 && src->upperRelOptr == 0));
|
||||||
|
|
||||||
return pFilter;
|
return pFilter;
|
||||||
}
|
}
|
||||||
|
|
|
@ -585,7 +585,7 @@ void assignVal(char *val, const char *src, int32_t len, int32_t type) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void operateVal(void *dst, void *s1, void *s2, int32_t optr, int32_t type) {
|
void operateVal(void *dst, void *s1, void *s2, int32_t optr, int32_t type) {
|
||||||
if (optr == TSDB_BINARY_OP_ADD) {
|
if (optr == OP_TYPE_ADD) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case TSDB_DATA_TYPE_TINYINT:
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
*((int8_t *)dst) = GET_INT8_VAL(s1) + GET_INT8_VAL(s2);
|
*((int8_t *)dst) = GET_INT8_VAL(s1) + GET_INT8_VAL(s2);
|
||||||
|
|
|
@ -546,7 +546,7 @@ int32_t ctgGetTableMetaFromCache(SCatalog* pCtg, const SName* pTableName, STable
|
||||||
|
|
||||||
if (tbMeta->tableType != TSDB_CHILD_TABLE) {
|
if (tbMeta->tableType != TSDB_CHILD_TABLE) {
|
||||||
ctgReleaseDBCache(pCtg, dbCache);
|
ctgReleaseDBCache(pCtg, dbCache);
|
||||||
ctgDebug("Got tbl from cache, type:%d, dbFName:%s, tbName:%s", tbMeta->tableType, dbFName, pTableName->tname);
|
ctgDebug("Got meta from cache, type:%d, dbFName:%s, tbName:%s", tbMeta->tableType, dbFName, pTableName->tname);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -46,6 +46,7 @@ typedef struct SBuiltinFuncDefinition {
|
||||||
FExecGetEnv getEnvFunc;
|
FExecGetEnv getEnvFunc;
|
||||||
FExecInit initFunc;
|
FExecInit initFunc;
|
||||||
FExecProcess processFunc;
|
FExecProcess processFunc;
|
||||||
|
FScalarExecProcess sprocessFunc;
|
||||||
FExecFinalize finalizeFunc;
|
FExecFinalize finalizeFunc;
|
||||||
} SBuiltinFuncDefinition;
|
} SBuiltinFuncDefinition;
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,7 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
|
||||||
.checkFunc = stubCheckAndGetResultType,
|
.checkFunc = stubCheckAndGetResultType,
|
||||||
.getEnvFunc = NULL,
|
.getEnvFunc = NULL,
|
||||||
.initFunc = NULL,
|
.initFunc = NULL,
|
||||||
.processFunc = NULL,
|
.sprocessFunc = NULL,
|
||||||
.finalizeFunc = NULL
|
.finalizeFunc = NULL
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -71,6 +71,14 @@ int32_t fmGetFuncExecFuncs(int32_t funcId, SFuncExecFuncs* pFpSet) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t fmGetScalarFuncExecFuncs(int32_t funcId, SScalarFuncExecFuncs* pFpSet) {
|
||||||
|
if (funcId < 0 || funcId >= funcMgtBuiltinsNum) {
|
||||||
|
return TSDB_CODE_FAILED;
|
||||||
|
}
|
||||||
|
pFpSet->process = funcMgtBuiltins[funcId].sprocessFunc;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
bool fmIsAggFunc(int32_t funcId) {
|
bool fmIsAggFunc(int32_t funcId) {
|
||||||
if (funcId < 0 || funcId >= funcMgtBuiltinsNum) {
|
if (funcId < 0 || funcId >= funcMgtBuiltinsNum) {
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#include "thash.h"
|
#include "thash.h"
|
||||||
#include "texpr.h"
|
#include "texpr.h"
|
||||||
#include "tvariant.h"
|
#include "tvariant.h"
|
||||||
|
#include "tdef.h"
|
||||||
|
|
||||||
//static uint8_t UNUSED_FUNC isQueryOnPrimaryKey(const char *primaryColumnName, const tExprNode *pLeft, const tExprNode *pRight) {
|
//static uint8_t UNUSED_FUNC isQueryOnPrimaryKey(const char *primaryColumnName, const tExprNode *pLeft, const tExprNode *pRight) {
|
||||||
// if (pLeft->nodeType == TEXPR_COL_NODE) {
|
// if (pLeft->nodeType == TEXPR_COL_NODE) {
|
||||||
|
@ -94,7 +95,7 @@ bool exprTreeApplyFilter(tExprNode *pExpr, const void *pItem, SExprTraverseSupp
|
||||||
|
|
||||||
//non-leaf nodes, recursively traverse the expression tree in the post-root order
|
//non-leaf nodes, recursively traverse the expression tree in the post-root order
|
||||||
if (pLeft->nodeType == TEXPR_BINARYEXPR_NODE && pRight->nodeType == TEXPR_BINARYEXPR_NODE) {
|
if (pLeft->nodeType == TEXPR_BINARYEXPR_NODE && pRight->nodeType == TEXPR_BINARYEXPR_NODE) {
|
||||||
if (pExpr->_node.optr == TSDB_RELATION_OR) { // or
|
if (pExpr->_node.optr == LOGIC_COND_TYPE_OR) { // or
|
||||||
if (exprTreeApplyFilter(pLeft, pItem, param)) {
|
if (exprTreeApplyFilter(pLeft, pItem, param)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -255,7 +256,7 @@ tExprNode* exprTreeFromTableName(const char* tbnameCond) {
|
||||||
|
|
||||||
if (strncmp(tbnameCond, QUERY_COND_REL_PREFIX_LIKE, QUERY_COND_REL_PREFIX_LIKE_LEN) == 0) {
|
if (strncmp(tbnameCond, QUERY_COND_REL_PREFIX_LIKE, QUERY_COND_REL_PREFIX_LIKE_LEN) == 0) {
|
||||||
right->nodeType = TEXPR_VALUE_NODE;
|
right->nodeType = TEXPR_VALUE_NODE;
|
||||||
expr->_node.optr = TSDB_RELATION_LIKE;
|
expr->_node.optr = OP_TYPE_LIKE;
|
||||||
SVariant* pVal = exception_calloc(1, sizeof(SVariant));
|
SVariant* pVal = exception_calloc(1, sizeof(SVariant));
|
||||||
right->pVal = pVal;
|
right->pVal = pVal;
|
||||||
size_t len = strlen(tbnameCond + QUERY_COND_REL_PREFIX_LIKE_LEN) + 1;
|
size_t len = strlen(tbnameCond + QUERY_COND_REL_PREFIX_LIKE_LEN) + 1;
|
||||||
|
@ -266,7 +267,7 @@ tExprNode* exprTreeFromTableName(const char* tbnameCond) {
|
||||||
|
|
||||||
} else if (strncmp(tbnameCond, QUERY_COND_REL_PREFIX_MATCH, QUERY_COND_REL_PREFIX_MATCH_LEN) == 0) {
|
} else if (strncmp(tbnameCond, QUERY_COND_REL_PREFIX_MATCH, QUERY_COND_REL_PREFIX_MATCH_LEN) == 0) {
|
||||||
right->nodeType = TEXPR_VALUE_NODE;
|
right->nodeType = TEXPR_VALUE_NODE;
|
||||||
expr->_node.optr = TSDB_RELATION_MATCH;
|
expr->_node.optr = OP_TYPE_MATCH;
|
||||||
SVariant* pVal = exception_calloc(1, sizeof(SVariant));
|
SVariant* pVal = exception_calloc(1, sizeof(SVariant));
|
||||||
right->pVal = pVal;
|
right->pVal = pVal;
|
||||||
size_t len = strlen(tbnameCond + QUERY_COND_REL_PREFIX_MATCH_LEN) + 1;
|
size_t len = strlen(tbnameCond + QUERY_COND_REL_PREFIX_MATCH_LEN) + 1;
|
||||||
|
@ -276,7 +277,7 @@ tExprNode* exprTreeFromTableName(const char* tbnameCond) {
|
||||||
pVal->nLen = (int32_t)len;
|
pVal->nLen = (int32_t)len;
|
||||||
} else if (strncmp(tbnameCond, QUERY_COND_REL_PREFIX_NMATCH, QUERY_COND_REL_PREFIX_NMATCH_LEN) == 0) {
|
} else if (strncmp(tbnameCond, QUERY_COND_REL_PREFIX_NMATCH, QUERY_COND_REL_PREFIX_NMATCH_LEN) == 0) {
|
||||||
right->nodeType = TEXPR_VALUE_NODE;
|
right->nodeType = TEXPR_VALUE_NODE;
|
||||||
expr->_node.optr = TSDB_RELATION_NMATCH;
|
expr->_node.optr = OP_TYPE_NMATCH;
|
||||||
SVariant* pVal = exception_calloc(1, sizeof(SVariant));
|
SVariant* pVal = exception_calloc(1, sizeof(SVariant));
|
||||||
right->pVal = pVal;
|
right->pVal = pVal;
|
||||||
size_t len = strlen(tbnameCond + QUERY_COND_REL_PREFIX_NMATCH_LEN) + 1;
|
size_t len = strlen(tbnameCond + QUERY_COND_REL_PREFIX_NMATCH_LEN) + 1;
|
||||||
|
@ -286,7 +287,7 @@ tExprNode* exprTreeFromTableName(const char* tbnameCond) {
|
||||||
pVal->nLen = (int32_t)len;
|
pVal->nLen = (int32_t)len;
|
||||||
} else if (strncmp(tbnameCond, QUERY_COND_REL_PREFIX_IN, QUERY_COND_REL_PREFIX_IN_LEN) == 0) {
|
} else if (strncmp(tbnameCond, QUERY_COND_REL_PREFIX_IN, QUERY_COND_REL_PREFIX_IN_LEN) == 0) {
|
||||||
right->nodeType = TEXPR_VALUE_NODE;
|
right->nodeType = TEXPR_VALUE_NODE;
|
||||||
expr->_node.optr = TSDB_RELATION_IN;
|
expr->_node.optr = OP_TYPE_IN;
|
||||||
SVariant* pVal = exception_calloc(1, sizeof(SVariant));
|
SVariant* pVal = exception_calloc(1, sizeof(SVariant));
|
||||||
right->pVal = pVal;
|
right->pVal = pVal;
|
||||||
pVal->nType = TSDB_DATA_TYPE_POINTER_ARRAY;
|
pVal->nType = TSDB_DATA_TYPE_POINTER_ARRAY;
|
||||||
|
|
|
@ -63,6 +63,8 @@ SNode* nodesMakeNode(ENodeType type) {
|
||||||
return makeNode(type, sizeof(SNodeListNode));
|
return makeNode(type, sizeof(SNodeListNode));
|
||||||
case QUERY_NODE_FILL:
|
case QUERY_NODE_FILL:
|
||||||
return makeNode(type, sizeof(SFillNode));
|
return makeNode(type, sizeof(SFillNode));
|
||||||
|
case QUERY_NODE_COLUMN_REF:
|
||||||
|
return makeNode(type, sizeof(SColumnRefNode));
|
||||||
case QUERY_NODE_RAW_EXPR:
|
case QUERY_NODE_RAW_EXPR:
|
||||||
return makeNode(type, sizeof(SRawExprNode));
|
return makeNode(type, sizeof(SRawExprNode));
|
||||||
case QUERY_NODE_SET_OPERATOR:
|
case QUERY_NODE_SET_OPERATOR:
|
||||||
|
@ -79,8 +81,6 @@ SNode* nodesMakeNode(ENodeType type) {
|
||||||
return makeNode(type, sizeof(SAggLogicNode));
|
return makeNode(type, sizeof(SAggLogicNode));
|
||||||
case QUERY_NODE_LOGIC_PLAN_PROJECT:
|
case QUERY_NODE_LOGIC_PLAN_PROJECT:
|
||||||
return makeNode(type, sizeof(SProjectLogicNode));
|
return makeNode(type, sizeof(SProjectLogicNode));
|
||||||
case QUERY_NODE_COLUMN_REF:
|
|
||||||
return makeNode(type, sizeof(SColumnRefNode));
|
|
||||||
case QUERY_NODE_TARGET:
|
case QUERY_NODE_TARGET:
|
||||||
return makeNode(type, sizeof(STargetNode));
|
return makeNode(type, sizeof(STargetNode));
|
||||||
case QUERY_NODE_TUPLE_DESC:
|
case QUERY_NODE_TUPLE_DESC:
|
||||||
|
|
|
@ -884,7 +884,7 @@ SColumnFilterInfo* tFilterInfoDup(const SColumnFilterInfo* src, int32_t numOfFil
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(src->filterstr == 0 || src->filterstr == 1);
|
assert(src->filterstr == 0 || src->filterstr == 1);
|
||||||
assert(!(src->lowerRelOptr == TSDB_RELATION_INVALID && src->upperRelOptr == TSDB_RELATION_INVALID));
|
assert(!(src->lowerRelOptr == 0 && src->upperRelOptr == 0));
|
||||||
|
|
||||||
return pFilter;
|
return pFilter;
|
||||||
}
|
}
|
||||||
|
@ -1507,45 +1507,45 @@ int32_t getTagFilterSerializeLen(SQueryStmtInfo* pQueryInfo) {
|
||||||
uint32_t convertRelationalOperator(SToken *pToken) {
|
uint32_t convertRelationalOperator(SToken *pToken) {
|
||||||
switch (pToken->type) {
|
switch (pToken->type) {
|
||||||
case TK_LT:
|
case TK_LT:
|
||||||
return TSDB_RELATION_LESS;
|
return OP_TYPE_LOWER_THAN;
|
||||||
case TK_LE:
|
case TK_LE:
|
||||||
return TSDB_RELATION_LESS_EQUAL;
|
return OP_TYPE_LOWER_EQUAL;
|
||||||
case TK_GT:
|
case TK_GT:
|
||||||
return TSDB_RELATION_GREATER;
|
return OP_TYPE_GREATER_THAN;
|
||||||
case TK_GE:
|
case TK_GE:
|
||||||
return TSDB_RELATION_GREATER_EQUAL;
|
return OP_TYPE_GREATER_EQUAL;
|
||||||
case TK_NE:
|
case TK_NE:
|
||||||
return TSDB_RELATION_NOT_EQUAL;
|
return OP_TYPE_NOT_EQUAL;
|
||||||
case TK_AND:
|
case TK_AND:
|
||||||
return TSDB_RELATION_AND;
|
return LOGIC_COND_TYPE_AND;
|
||||||
case TK_OR:
|
case TK_OR:
|
||||||
return TSDB_RELATION_OR;
|
return LOGIC_COND_TYPE_OR;
|
||||||
case TK_EQ:
|
case TK_EQ:
|
||||||
return TSDB_RELATION_EQUAL;
|
return OP_TYPE_EQUAL;
|
||||||
|
|
||||||
case TK_PLUS:
|
case TK_PLUS:
|
||||||
return TSDB_BINARY_OP_ADD;
|
return OP_TYPE_ADD;
|
||||||
case TK_MINUS:
|
case TK_MINUS:
|
||||||
return TSDB_BINARY_OP_SUBTRACT;
|
return OP_TYPE_SUB;
|
||||||
case TK_STAR:
|
case TK_STAR:
|
||||||
return TSDB_BINARY_OP_MULTIPLY;
|
return OP_TYPE_MULTI;
|
||||||
case TK_SLASH:
|
case TK_SLASH:
|
||||||
case TK_DIVIDE:
|
case TK_DIVIDE:
|
||||||
return TSDB_BINARY_OP_DIVIDE;
|
return OP_TYPE_DIV;
|
||||||
case TK_REM:
|
case TK_REM:
|
||||||
return TSDB_BINARY_OP_REMAINDER;
|
return OP_TYPE_MOD;
|
||||||
case TK_LIKE:
|
case TK_LIKE:
|
||||||
return TSDB_RELATION_LIKE;
|
return OP_TYPE_LIKE;
|
||||||
case TK_MATCH:
|
case TK_MATCH:
|
||||||
return TSDB_RELATION_MATCH;
|
return OP_TYPE_MATCH;
|
||||||
case TK_NMATCH:
|
case TK_NMATCH:
|
||||||
return TSDB_RELATION_NMATCH;
|
return OP_TYPE_NMATCH;
|
||||||
case TK_ISNULL:
|
case TK_ISNULL:
|
||||||
return TSDB_RELATION_ISNULL;
|
return OP_TYPE_IS_NULL;
|
||||||
case TK_NOTNULL:
|
case TK_NOTNULL:
|
||||||
return TSDB_RELATION_NOTNULL;
|
return OP_TYPE_IS_NOT_NULL;
|
||||||
case TK_IN:
|
case TK_IN:
|
||||||
return TSDB_RELATION_IN;
|
return OP_TYPE_IN;
|
||||||
default: { return 0; }
|
default: { return 0; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -593,7 +593,7 @@ TEST(testCase, function_Test6) {
|
||||||
SExprInfo* p2 = (SExprInfo*) taosArrayGetP(pQueryInfo->exprList[1], 0);
|
SExprInfo* p2 = (SExprInfo*) taosArrayGetP(pQueryInfo->exprList[1], 0);
|
||||||
ASSERT_EQ(p2->pExpr->nodeType, TEXPR_BINARYEXPR_NODE);
|
ASSERT_EQ(p2->pExpr->nodeType, TEXPR_BINARYEXPR_NODE);
|
||||||
|
|
||||||
ASSERT_EQ(p2->pExpr->_node.optr, TSDB_BINARY_OP_ADD);
|
ASSERT_EQ(p2->pExpr->_node.optr, OP_TYPE_ADD);
|
||||||
ASSERT_EQ(p2->pExpr->_node.pLeft->nodeType, TEXPR_COL_NODE);
|
ASSERT_EQ(p2->pExpr->_node.pLeft->nodeType, TEXPR_COL_NODE);
|
||||||
ASSERT_EQ(p2->pExpr->_node.pRight->nodeType, TEXPR_COL_NODE);
|
ASSERT_EQ(p2->pExpr->_node.pRight->nodeType, TEXPR_COL_NODE);
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,6 @@ enum {
|
||||||
FLD_TYPE_COLUMN = 1,
|
FLD_TYPE_COLUMN = 1,
|
||||||
FLD_TYPE_VALUE = 2,
|
FLD_TYPE_VALUE = 2,
|
||||||
FLD_TYPE_MAX = 3,
|
FLD_TYPE_MAX = 3,
|
||||||
FLD_DESC_NO_FREE = 4,
|
|
||||||
FLD_DATA_NO_FREE = 8,
|
FLD_DATA_NO_FREE = 8,
|
||||||
FLD_DATA_IS_HASH = 16,
|
FLD_DATA_IS_HASH = 16,
|
||||||
};
|
};
|
||||||
|
@ -61,11 +60,6 @@ enum {
|
||||||
RANGE_FLG_NULL = 4,
|
RANGE_FLG_NULL = 4,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
|
||||||
FI_OPTION_NO_REWRITE = 1,
|
|
||||||
FI_OPTION_TIMESTAMP = 2,
|
|
||||||
FI_OPTION_NEED_UNIQE = 4,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
FI_STATUS_ALL = 1,
|
FI_STATUS_ALL = 1,
|
||||||
|
@ -107,7 +101,6 @@ typedef struct SFilterRange {
|
||||||
typedef bool (*rangeCompFunc) (const void *, const void *, const void *, const void *, __compar_fn_t);
|
typedef bool (*rangeCompFunc) (const void *, const void *, const void *, const void *, __compar_fn_t);
|
||||||
typedef int32_t(*filter_desc_compare_func)(const void *, const void *);
|
typedef int32_t(*filter_desc_compare_func)(const void *, const void *);
|
||||||
typedef bool(*filter_exec_func)(void *, int32_t, int8_t**, SColumnDataAgg *, int16_t);
|
typedef bool(*filter_exec_func)(void *, int32_t, int8_t**, SColumnDataAgg *, int16_t);
|
||||||
typedef int32_t (*filer_get_col_from_id)(void *, int32_t, void **);
|
|
||||||
typedef int32_t (*filer_get_col_from_name)(void *, int32_t, char*, void **);
|
typedef int32_t (*filer_get_col_from_name)(void *, int32_t, char*, void **);
|
||||||
|
|
||||||
typedef struct SFilterRangeCompare {
|
typedef struct SFilterRangeCompare {
|
||||||
|
@ -264,12 +257,12 @@ typedef struct SFilterInfo {
|
||||||
} SFilterInfo;
|
} SFilterInfo;
|
||||||
|
|
||||||
#define FILTER_NO_MERGE_DATA_TYPE(t) ((t) == TSDB_DATA_TYPE_BINARY || (t) == TSDB_DATA_TYPE_NCHAR || (t) == TSDB_DATA_TYPE_JSON)
|
#define FILTER_NO_MERGE_DATA_TYPE(t) ((t) == TSDB_DATA_TYPE_BINARY || (t) == TSDB_DATA_TYPE_NCHAR || (t) == TSDB_DATA_TYPE_JSON)
|
||||||
#define FILTER_NO_MERGE_OPTR(o) ((o) == TSDB_RELATION_ISNULL || (o) == TSDB_RELATION_NOTNULL || (o) == FILTER_DUMMY_EMPTY_OPTR)
|
#define FILTER_NO_MERGE_OPTR(o) ((o) == OP_TYPE_IS_NULL || (o) == OP_TYPE_IS_NOT_NULL || (o) == FILTER_DUMMY_EMPTY_OPTR)
|
||||||
|
|
||||||
#define MR_EMPTY_RES(ctx) (ctx->rs == NULL)
|
#define MR_EMPTY_RES(ctx) (ctx->rs == NULL)
|
||||||
|
|
||||||
#define SET_AND_OPTR(ctx, o) do {if (o == TSDB_RELATION_ISNULL) { (ctx)->isnull = true; } else if (o == TSDB_RELATION_NOTNULL) { if (!(ctx)->isrange) { (ctx)->notnull = true; } } else if (o != FILTER_DUMMY_EMPTY_OPTR) { (ctx)->isrange = true; (ctx)->notnull = false; } } while (0)
|
#define SET_AND_OPTR(ctx, o) do {if (o == OP_TYPE_IS_NULL) { (ctx)->isnull = true; } else if (o == OP_TYPE_IS_NOT_NULL) { if (!(ctx)->isrange) { (ctx)->notnull = true; } } else if (o != FILTER_DUMMY_EMPTY_OPTR) { (ctx)->isrange = true; (ctx)->notnull = false; } } while (0)
|
||||||
#define SET_OR_OPTR(ctx,o) do {if (o == TSDB_RELATION_ISNULL) { (ctx)->isnull = true; } else if (o == TSDB_RELATION_NOTNULL) { (ctx)->notnull = true; (ctx)->isrange = false; } else if (o != FILTER_DUMMY_EMPTY_OPTR) { if (!(ctx)->notnull) { (ctx)->isrange = true; } } } while (0)
|
#define SET_OR_OPTR(ctx,o) do {if (o == OP_TYPE_IS_NULL) { (ctx)->isnull = true; } else if (o == OP_TYPE_IS_NOT_NULL) { (ctx)->notnull = true; (ctx)->isrange = false; } else if (o != FILTER_DUMMY_EMPTY_OPTR) { if (!(ctx)->notnull) { (ctx)->isrange = true; } } } while (0)
|
||||||
#define CHK_OR_OPTR(ctx) ((ctx)->isnull == true && (ctx)->notnull == true)
|
#define CHK_OR_OPTR(ctx) ((ctx)->isnull == true && (ctx)->notnull == true)
|
||||||
#define CHK_AND_OPTR(ctx) ((ctx)->isnull == true && (((ctx)->notnull == true) || ((ctx)->isrange == true)))
|
#define CHK_AND_OPTR(ctx) ((ctx)->isnull == true && (((ctx)->notnull == true) || ((ctx)->isrange == true)))
|
||||||
|
|
||||||
|
@ -351,23 +344,10 @@ typedef struct SFilterInfo {
|
||||||
#define FILTER_ALL_RES(i) FILTER_GET_FLAG((i)->status, FI_STATUS_ALL)
|
#define FILTER_ALL_RES(i) FILTER_GET_FLAG((i)->status, FI_STATUS_ALL)
|
||||||
#define FILTER_EMPTY_RES(i) FILTER_GET_FLAG((i)->status, FI_STATUS_EMPTY)
|
#define FILTER_EMPTY_RES(i) FILTER_GET_FLAG((i)->status, FI_STATUS_EMPTY)
|
||||||
|
|
||||||
#if 0
|
|
||||||
extern int32_t filterInitFromTree(tExprNode* tree, void **pinfo, uint32_t options);
|
|
||||||
extern bool filterExecute(SFilterInfo *info, int32_t numOfRows, int8_t** p, SColumnDataAgg *statis, int16_t numOfCols);
|
|
||||||
extern int32_t filterSetColFieldData(SFilterInfo *info, void *param, filer_get_col_from_id fp);
|
|
||||||
extern int32_t filterSetJsonColFieldData(SFilterInfo *info, void *param, filer_get_col_from_name fp);
|
|
||||||
extern int32_t filterGetTimeRange(SFilterInfo *info, STimeWindow *win);
|
|
||||||
extern int32_t filterConverNcharColumns(SFilterInfo* pFilterInfo, int32_t rows, bool *gotNchar);
|
|
||||||
extern int32_t filterFreeNcharColumns(SFilterInfo* pFilterInfo);
|
|
||||||
extern void filterFreeInfo(SFilterInfo *info);
|
|
||||||
extern bool filterRangeExecute(SFilterInfo *info, SColumnDataAgg *pDataStatis, int32_t numOfCols, int32_t numOfRows);
|
|
||||||
#else
|
|
||||||
//REMOVE THESE!!!!!!!!!!!!!!!!!!!!
|
|
||||||
#include "function.h"
|
|
||||||
#endif
|
|
||||||
extern bool filterDoCompare(__compar_fn_t func, uint8_t optr, void *left, void *right);
|
extern bool filterDoCompare(__compar_fn_t func, uint8_t optr, void *left, void *right);
|
||||||
extern __compar_fn_t filterGetCompFunc(int32_t type, int32_t optr);
|
extern __compar_fn_t filterGetCompFunc(int32_t type, int32_t optr);
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -28,6 +28,8 @@ typedef struct SScalarCtx {
|
||||||
SHashObj *pRes; /* element is SScalarParam */
|
SHashObj *pRes; /* element is SScalarParam */
|
||||||
} SScalarCtx;
|
} SScalarCtx;
|
||||||
|
|
||||||
|
|
||||||
|
#define SCL_DATA_TYPE_DUMMY_HASH 9000
|
||||||
#define SCL_DEFAULT_OP_NUM 10
|
#define SCL_DEFAULT_OP_NUM 10
|
||||||
|
|
||||||
#define sclFatal(...) qFatal(__VA_ARGS__)
|
#define sclFatal(...) qFatal(__VA_ARGS__)
|
||||||
|
|
|
@ -24,7 +24,6 @@ extern "C" {
|
||||||
|
|
||||||
typedef void (*_bin_scalar_fn_t)(SScalarParam* pLeft, SScalarParam* pRight, void *output, int32_t order);
|
typedef void (*_bin_scalar_fn_t)(SScalarParam* pLeft, SScalarParam* pRight, void *output, int32_t order);
|
||||||
_bin_scalar_fn_t getBinScalarOperatorFn(int32_t binOperator);
|
_bin_scalar_fn_t getBinScalarOperatorFn(int32_t binOperator);
|
||||||
bool isBinaryStringOp(int32_t op);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -7,13 +7,87 @@
|
||||||
#include "sclInt.h"
|
#include "sclInt.h"
|
||||||
|
|
||||||
int32_t scalarGetOperatorParamNum(EOperatorType type) {
|
int32_t scalarGetOperatorParamNum(EOperatorType type) {
|
||||||
if (OP_TYPE_IS_NULL == type || OP_TYPE_IS_NOT_NULL == type) {
|
if (OP_TYPE_IS_NULL == type || OP_TYPE_IS_NOT_NULL == type || OP_TYPE_IS_TRUE == type || OP_TYPE_IS_NOT_TRUE == type
|
||||||
|
|| OP_TYPE_IS_FALSE == type || OP_TYPE_IS_NOT_FALSE == type || OP_TYPE_IS_UNKNOWN == type || OP_TYPE_IS_NOT_UNKNOWN == type) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t scalarGenerateSetFromList(void **data, void *pNode, uint32_t type) {
|
||||||
|
SHashObj *pObj = taosHashInit(256, taosGetDefaultHashFunction(type), true, false);
|
||||||
|
if (NULL == pObj) {
|
||||||
|
sclError("taosHashInit failed, size:%d", 256);
|
||||||
|
SCL_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY);
|
||||||
|
}
|
||||||
|
|
||||||
|
taosHashSetEqualFp(pObj, taosGetDefaultEqualFunction(type));
|
||||||
|
|
||||||
|
int32_t code = 0;
|
||||||
|
SNodeListNode *nodeList = (SNodeListNode *)pNode;
|
||||||
|
SListCell *cell = nodeList->pNodeList->pHead;
|
||||||
|
SScalarParam in = {.num = 1}, out = {.num = 1, .type = type};
|
||||||
|
int8_t dummy = 0;
|
||||||
|
int32_t bufLen = 60;
|
||||||
|
out.data = malloc(bufLen);
|
||||||
|
int32_t len = 0;
|
||||||
|
void *buf = NULL;
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < nodeList->pNodeList->length; ++i) {
|
||||||
|
SValueNode *valueNode = (SValueNode *)cell->pNode;
|
||||||
|
|
||||||
|
if (valueNode->node.resType.type != type) {
|
||||||
|
in.type = valueNode->node.resType.type;
|
||||||
|
in.bytes = valueNode->node.resType.bytes;
|
||||||
|
in.data = nodesGetValueFromNode(valueNode);
|
||||||
|
|
||||||
|
code = vectorConvertImpl(&in, &out);
|
||||||
|
if (code) {
|
||||||
|
sclError("convert from %d to %d failed", in.type, out.type);
|
||||||
|
SCL_ERR_JRET(code);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IS_VAR_DATA_TYPE(type)) {
|
||||||
|
len = varDataLen(out.data);
|
||||||
|
buf = varDataVal(out.data);
|
||||||
|
} else {
|
||||||
|
len = tDataTypes[type].bytes;
|
||||||
|
buf = out.data;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
buf = nodesGetValueFromNode(valueNode);
|
||||||
|
if (IS_VAR_DATA_TYPE(type)) {
|
||||||
|
len = varDataLen(buf);
|
||||||
|
buf = varDataVal(buf);
|
||||||
|
} else {
|
||||||
|
len = valueNode->node.resType.bytes;
|
||||||
|
buf = out.data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (taosHashPut(pObj, buf, (size_t)len, &dummy, sizeof(dummy))) {
|
||||||
|
sclError("taosHashPut failed");
|
||||||
|
SCL_ERR_JRET(TSDB_CODE_QRY_OUT_OF_MEMORY);
|
||||||
|
}
|
||||||
|
|
||||||
|
cell = cell->pNext;
|
||||||
|
}
|
||||||
|
|
||||||
|
tfree(out.data);
|
||||||
|
*data = pObj;
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
|
_return:
|
||||||
|
|
||||||
|
tfree(out.data);
|
||||||
|
taosHashCleanup(pObj);
|
||||||
|
|
||||||
|
SCL_RET(code);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void sclFreeRes(SHashObj *res) {
|
void sclFreeRes(SHashObj *res) {
|
||||||
SScalarParam *p = NULL;
|
SScalarParam *p = NULL;
|
||||||
void *pIter = taosHashIterate(res, NULL);
|
void *pIter = taosHashIterate(res, NULL);
|
||||||
|
@ -42,12 +116,22 @@ int32_t sclInitParam(SNode* node, SScalarParam *param, SScalarCtx *ctx, int32_t
|
||||||
param->num = 1;
|
param->num = 1;
|
||||||
param->type = valueNode->node.resType.type;
|
param->type = valueNode->node.resType.type;
|
||||||
param->bytes = valueNode->node.resType.bytes;
|
param->bytes = valueNode->node.resType.bytes;
|
||||||
|
param->colData = false;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case QUERY_NODE_NODE_LIST: {
|
case QUERY_NODE_NODE_LIST: {
|
||||||
SNodeListNode *nodeList = (SNodeListNode *)node;
|
SNodeListNode *nodeList = (SNodeListNode *)node;
|
||||||
//TODO BUILD HASH
|
if (nodeList->pNodeList->length <= 0) {
|
||||||
|
sclError("invalid length in nodeList, length:%d", nodeList->pNodeList->length);
|
||||||
|
SCL_RET(TSDB_CODE_QRY_INVALID_INPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
SCL_ERR_RET(scalarGenerateSetFromList(¶m->data, node, nodeList->dataType.type));
|
||||||
|
param->num = 1;
|
||||||
|
param->type = SCL_DATA_TYPE_DUMMY_HASH;
|
||||||
|
param->colData = false;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case QUERY_NODE_COLUMN_REF: {
|
case QUERY_NODE_COLUMN_REF: {
|
||||||
|
@ -63,7 +147,14 @@ int32_t sclInitParam(SNode* node, SScalarParam *param, SScalarCtx *ctx, int32_t
|
||||||
}
|
}
|
||||||
|
|
||||||
SColumnInfoData *columnData = (SColumnInfoData *)taosArrayGet(ctx->pSrc->pDataBlock, ref->slotId);
|
SColumnInfoData *columnData = (SColumnInfoData *)taosArrayGet(ctx->pSrc->pDataBlock, ref->slotId);
|
||||||
param->data = columnData->pData;
|
if (IS_VAR_DATA_TYPE(columnData->info.type)) {
|
||||||
|
param->data = columnData;
|
||||||
|
param->colData = true;
|
||||||
|
} else {
|
||||||
|
param->data = columnData->pData;
|
||||||
|
param->colData = false;
|
||||||
|
}
|
||||||
|
|
||||||
param->num = ctx->pSrc->info.rows;
|
param->num = ctx->pSrc->info.rows;
|
||||||
param->type = columnData->info.type;
|
param->type = columnData->info.type;
|
||||||
param->bytes = columnData->info.bytes;
|
param->bytes = columnData->info.bytes;
|
||||||
|
@ -248,11 +339,15 @@ int32_t sclExecLogic(SLogicConditionNode *node, SScalarCtx *ctx, SScalarParam *o
|
||||||
SCL_ERR_RET(sclInitParamList(¶ms, node->pParameterList, ctx, &rowNum));
|
SCL_ERR_RET(sclInitParamList(¶ms, node->pParameterList, ctx, &rowNum));
|
||||||
|
|
||||||
output->type = node->node.resType.type;
|
output->type = node->node.resType.type;
|
||||||
|
output->bytes = sizeof(bool);
|
||||||
|
output->num = rowNum;
|
||||||
output->data = calloc(rowNum, sizeof(bool));
|
output->data = calloc(rowNum, sizeof(bool));
|
||||||
if (NULL == output->data) {
|
if (NULL == output->data) {
|
||||||
sclError("calloc %d failed", (int32_t)(rowNum * sizeof(bool)));
|
sclError("calloc %d failed", (int32_t)(rowNum * sizeof(bool)));
|
||||||
SCL_ERR_JRET(TSDB_CODE_QRY_OUT_OF_MEMORY);
|
SCL_ERR_JRET(TSDB_CODE_QRY_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void *data = output->data;
|
||||||
|
|
||||||
bool value = false;
|
bool value = false;
|
||||||
|
|
||||||
|
@ -275,6 +370,8 @@ int32_t sclExecLogic(SLogicConditionNode *node, SScalarCtx *ctx, SScalarParam *o
|
||||||
sclParamMoveNext(params, node->pParameterList->length);
|
sclParamMoveNext(params, node->pParameterList->length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
output->data = data;
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
_return:
|
_return:
|
||||||
|
@ -291,6 +388,8 @@ int32_t sclExecOperator(SOperatorNode *node, SScalarCtx *ctx, SScalarParam *outp
|
||||||
SCL_ERR_RET(sclInitOperatorParams(¶ms, node, ctx, &rowNum));
|
SCL_ERR_RET(sclInitOperatorParams(¶ms, node, ctx, &rowNum));
|
||||||
|
|
||||||
output->type = node->node.resType.type;
|
output->type = node->node.resType.type;
|
||||||
|
output->num = rowNum;
|
||||||
|
output->bytes = tDataTypes[output->type].bytes;
|
||||||
output->data = calloc(rowNum, tDataTypes[output->type].bytes);
|
output->data = calloc(rowNum, tDataTypes[output->type].bytes);
|
||||||
if (NULL == output->data) {
|
if (NULL == output->data) {
|
||||||
sclError("calloc %d failed", (int32_t)rowNum * tDataTypes[output->type].bytes);
|
sclError("calloc %d failed", (int32_t)rowNum * tDataTypes[output->type].bytes);
|
||||||
|
@ -302,17 +401,8 @@ int32_t sclExecOperator(SOperatorNode *node, SScalarCtx *ctx, SScalarParam *outp
|
||||||
int32_t paramNum = scalarGetOperatorParamNum(node->opType);
|
int32_t paramNum = scalarGetOperatorParamNum(node->opType);
|
||||||
SScalarParam* pLeft = ¶ms[0];
|
SScalarParam* pLeft = ¶ms[0];
|
||||||
SScalarParam* pRight = paramNum > 1 ? ¶ms[1] : NULL;
|
SScalarParam* pRight = paramNum > 1 ? ¶ms[1] : NULL;
|
||||||
|
|
||||||
for (int32_t i = 0; i < rowNum; ++i) {
|
OperatorFn(pLeft, pRight, output->data, TSDB_ORDER_ASC);
|
||||||
|
|
||||||
OperatorFn(pLeft, pRight, output->data, TSDB_ORDER_ASC);
|
|
||||||
|
|
||||||
sclParamMoveNext(output, 1);
|
|
||||||
sclParamMoveNext(pLeft, 1);
|
|
||||||
if (pRight) {
|
|
||||||
sclParamMoveNext(pRight, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
|
@ -427,7 +517,7 @@ EDealRes sclRewriteOperator(SNode** pNode, void* pContext) {
|
||||||
|
|
||||||
|
|
||||||
EDealRes sclConstantsRewriter(SNode** pNode, void* pContext) {
|
EDealRes sclConstantsRewriter(SNode** pNode, void* pContext) {
|
||||||
if (QUERY_NODE_VALUE == nodeType(*pNode)) {
|
if (QUERY_NODE_VALUE == nodeType(*pNode) || QUERY_NODE_NODE_LIST == nodeType(*pNode)) {
|
||||||
return DEAL_RES_CONTINUE;
|
return DEAL_RES_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -509,10 +599,10 @@ EDealRes sclWalkOperator(SNode* pNode, void* pContext) {
|
||||||
|
|
||||||
|
|
||||||
EDealRes sclCalcWalker(SNode* pNode, void* pContext) {
|
EDealRes sclCalcWalker(SNode* pNode, void* pContext) {
|
||||||
if (QUERY_NODE_VALUE == nodeType(pNode)) {
|
if (QUERY_NODE_VALUE == nodeType(pNode) || QUERY_NODE_NODE_LIST == nodeType(pNode) || QUERY_NODE_COLUMN_REF == nodeType(pNode)) {
|
||||||
return DEAL_RES_CONTINUE;
|
return DEAL_RES_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (QUERY_NODE_FUNCTION == nodeType(pNode)) {
|
if (QUERY_NODE_FUNCTION == nodeType(pNode)) {
|
||||||
return sclWalkFunction(pNode, pContext);
|
return sclWalkFunction(pNode, pContext);
|
||||||
}
|
}
|
||||||
|
@ -525,7 +615,7 @@ EDealRes sclCalcWalker(SNode* pNode, void* pContext) {
|
||||||
return sclWalkOperator(pNode, pContext);
|
return sclWalkOperator(pNode, pContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
sclError("invalid node type for calculating constants, type:%d", nodeType(pNode));
|
sclError("invalid node type for scalar calculating, type:%d", nodeType(pNode));
|
||||||
|
|
||||||
SScalarCtx *ctx = (SScalarCtx *)pContext;
|
SScalarCtx *ctx = (SScalarCtx *)pContext;
|
||||||
|
|
||||||
|
|
|
@ -268,9 +268,6 @@ static void setScalarFuncParam(SScalarParam* param, int32_t type, int32_t bytes,
|
||||||
param->data = pInput;
|
param->data = pInput;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isStringOp(int32_t op) {
|
|
||||||
return op == TSDB_BINARY_OP_CONCAT;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
int32_t evaluateExprNodeTree(tExprNode* pExprs, int32_t numOfRows, SScalarFuncParam* pOutput, void* param,
|
int32_t evaluateExprNodeTree(tExprNode* pExprs, int32_t numOfRows, SScalarFuncParam* pOutput, void* param,
|
||||||
|
|
|
@ -21,6 +21,9 @@
|
||||||
#include "querynodes.h"
|
#include "querynodes.h"
|
||||||
#include "filterInt.h"
|
#include "filterInt.h"
|
||||||
#include "query.h"
|
#include "query.h"
|
||||||
|
#include "sclInt.h"
|
||||||
|
#include "tep.h"
|
||||||
|
#include "filter.h"
|
||||||
|
|
||||||
//GET_TYPED_DATA(v, double, pRight->type, (char *)&((right)[i]));
|
//GET_TYPED_DATA(v, double, pRight->type, (char *)&((right)[i]));
|
||||||
|
|
||||||
|
@ -93,6 +96,7 @@ double getVectorDoubleValue_FLOAT(void *src, int32_t index) {
|
||||||
double getVectorDoubleValue_DOUBLE(void *src, int32_t index) {
|
double getVectorDoubleValue_DOUBLE(void *src, int32_t index) {
|
||||||
return (double)*((double *)src + index);
|
return (double)*((double *)src + index);
|
||||||
}
|
}
|
||||||
|
|
||||||
_getDoubleValue_fn_t getVectorDoubleValueFn(int32_t srcType) {
|
_getDoubleValue_fn_t getVectorDoubleValueFn(int32_t srcType) {
|
||||||
_getDoubleValue_fn_t p = NULL;
|
_getDoubleValue_fn_t p = NULL;
|
||||||
if(srcType==TSDB_DATA_TYPE_TINYINT) {
|
if(srcType==TSDB_DATA_TYPE_TINYINT) {
|
||||||
|
@ -218,6 +222,12 @@ void* getVectorValueAddr_FLOAT(void *src, int32_t index) {
|
||||||
void* getVectorValueAddr_DOUBLE(void *src, int32_t index) {
|
void* getVectorValueAddr_DOUBLE(void *src, int32_t index) {
|
||||||
return (void*)((double *)src + index);
|
return (void*)((double *)src + index);
|
||||||
}
|
}
|
||||||
|
void* getVectorValueAddr_default(void *src, int32_t index) {
|
||||||
|
return src;
|
||||||
|
}
|
||||||
|
void* getVectorValueAddr_VAR(void *src, int32_t index) {
|
||||||
|
return colDataGet((SColumnInfoData *)src, index);
|
||||||
|
}
|
||||||
|
|
||||||
_getValueAddr_fn_t getVectorValueAddrFn(int32_t srcType) {
|
_getValueAddr_fn_t getVectorValueAddrFn(int32_t srcType) {
|
||||||
_getValueAddr_fn_t p = NULL;
|
_getValueAddr_fn_t p = NULL;
|
||||||
|
@ -241,8 +251,12 @@ _getValueAddr_fn_t getVectorValueAddrFn(int32_t srcType) {
|
||||||
p = getVectorValueAddr_FLOAT;
|
p = getVectorValueAddr_FLOAT;
|
||||||
}else if(srcType==TSDB_DATA_TYPE_DOUBLE) {
|
}else if(srcType==TSDB_DATA_TYPE_DOUBLE) {
|
||||||
p = getVectorValueAddr_DOUBLE;
|
p = getVectorValueAddr_DOUBLE;
|
||||||
|
}else if(srcType==TSDB_DATA_TYPE_BINARY) {
|
||||||
|
p = getVectorValueAddr_VAR;
|
||||||
|
}else if(srcType==TSDB_DATA_TYPE_NCHAR) {
|
||||||
|
p = getVectorValueAddr_VAR;
|
||||||
}else {
|
}else {
|
||||||
assert(0);
|
p = getVectorValueAddr_default;
|
||||||
}
|
}
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
@ -258,31 +272,7 @@ int32_t vectorConvertImpl(SScalarParam* pIn, SScalarParam* pOut) {
|
||||||
|
|
||||||
switch (outType) {
|
switch (outType) {
|
||||||
case TSDB_DATA_TYPE_BOOL:
|
case TSDB_DATA_TYPE_BOOL:
|
||||||
if (inType == TSDB_DATA_TYPE_BINARY) {
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
for (int32_t i = 0; i < pIn->num; ++i) {
|
|
||||||
GET_TYPED_DATA(*(bool *)output, bool, TSDB_DATA_TYPE_USMALLINT, &varDataLen(input));
|
|
||||||
|
|
||||||
input += varDataLen(input) + VARSTR_HEADER_SIZE;
|
|
||||||
output += sizeof(bool);
|
|
||||||
}
|
|
||||||
} else if (inType == TSDB_DATA_TYPE_NCHAR) {
|
|
||||||
for (int32_t i = 0; i < pIn->num; ++i) {
|
|
||||||
GET_TYPED_DATA(*(bool *)output, bool, TSDB_DATA_TYPE_USMALLINT, &varDataLen(input));
|
|
||||||
|
|
||||||
input += varDataLen(input) + VARSTR_HEADER_SIZE;
|
|
||||||
output += tDataTypes[outType].bytes;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (int32_t i = 0; i < pIn->num; ++i) {
|
|
||||||
uint64_t value = 0;
|
|
||||||
GET_TYPED_DATA(value, uint64_t, inType, input);
|
|
||||||
SET_TYPED_DATA(output, outType, value);
|
|
||||||
|
|
||||||
input += tDataTypes[inType].bytes;
|
|
||||||
output += tDataTypes[outType].bytes;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_SMALLINT:
|
case TSDB_DATA_TYPE_SMALLINT:
|
||||||
case TSDB_DATA_TYPE_INT:
|
case TSDB_DATA_TYPE_INT:
|
||||||
case TSDB_DATA_TYPE_BIGINT:
|
case TSDB_DATA_TYPE_BIGINT:
|
||||||
|
@ -291,21 +281,26 @@ int32_t vectorConvertImpl(SScalarParam* pIn, SScalarParam* pOut) {
|
||||||
int32_t bufSize = varDataLen(input) + 1;
|
int32_t bufSize = varDataLen(input) + 1;
|
||||||
char *tmp = malloc(bufSize);
|
char *tmp = malloc(bufSize);
|
||||||
if (NULL == tmp) {
|
if (NULL == tmp) {
|
||||||
|
sclError("malloc %d failed", bufSize);
|
||||||
return TSDB_CODE_QRY_OUT_OF_MEMORY;
|
return TSDB_CODE_QRY_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < pIn->num; ++i) {
|
for (int32_t i = 0; i < pIn->num; ++i) {
|
||||||
if (varDataLen(input) >= bufSize) {
|
if (isNull(input, inType)) {
|
||||||
bufSize = varDataLen(input) + 1;
|
assignVal(output, getNullValue(outType), 0, outType);
|
||||||
tmp = realloc(tmp, bufSize);
|
} else {
|
||||||
|
if (varDataLen(input) >= bufSize) {
|
||||||
|
bufSize = varDataLen(input) + 1;
|
||||||
|
tmp = realloc(tmp, bufSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(tmp, varDataVal(input), varDataLen(input));
|
||||||
|
tmp[varDataLen(input)] = 0;
|
||||||
|
|
||||||
|
int64_t value = strtoll(tmp, NULL, 10);
|
||||||
|
SET_TYPED_DATA(output, outType, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(tmp, varDataVal(input), varDataLen(input));
|
|
||||||
tmp[varDataLen(input)] = 0;
|
|
||||||
|
|
||||||
int64_t value = strtoll(tmp, NULL, 10);
|
|
||||||
SET_TYPED_DATA(output, outType, value);
|
|
||||||
|
|
||||||
input += varDataLen(input) + VARSTR_HEADER_SIZE;
|
input += varDataLen(input) + VARSTR_HEADER_SIZE;
|
||||||
output += tDataTypes[outType].bytes;
|
output += tDataTypes[outType].bytes;
|
||||||
}
|
}
|
||||||
|
@ -315,25 +310,30 @@ int32_t vectorConvertImpl(SScalarParam* pIn, SScalarParam* pOut) {
|
||||||
int32_t bufSize = varDataLen(input) * TSDB_NCHAR_SIZE + 1;
|
int32_t bufSize = varDataLen(input) * TSDB_NCHAR_SIZE + 1;
|
||||||
char *tmp = calloc(1, bufSize);
|
char *tmp = calloc(1, bufSize);
|
||||||
if (NULL == tmp) {
|
if (NULL == tmp) {
|
||||||
|
sclError("calloc %d failed", bufSize);
|
||||||
return TSDB_CODE_QRY_OUT_OF_MEMORY;
|
return TSDB_CODE_QRY_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < pIn->num; ++i) {
|
for (int32_t i = 0; i < pIn->num; ++i) {
|
||||||
if (varDataLen(input)* TSDB_NCHAR_SIZE >= bufSize) {
|
if (isNull(input, inType)) {
|
||||||
bufSize = varDataLen(input) * TSDB_NCHAR_SIZE + 1;
|
assignVal(output, getNullValue(outType), 0, outType);
|
||||||
tmp = realloc(tmp, bufSize);
|
} else {
|
||||||
}
|
if (varDataLen(input)* TSDB_NCHAR_SIZE >= bufSize) {
|
||||||
|
bufSize = varDataLen(input) * TSDB_NCHAR_SIZE + 1;
|
||||||
int len = taosUcs4ToMbs(varDataVal(input), varDataLen(input), tmp);
|
tmp = realloc(tmp, bufSize);
|
||||||
if (len < 0){
|
}
|
||||||
qError("castConvert taosUcs4ToMbs error 1");
|
|
||||||
tfree(tmp);
|
|
||||||
return TSDB_CODE_QRY_APP_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
tmp[len] = 0;
|
int len = taosUcs4ToMbs(varDataVal(input), varDataLen(input), tmp);
|
||||||
int64_t value = strtoll(tmp, NULL, 10);
|
if (len < 0){
|
||||||
SET_TYPED_DATA(output, outType, value);
|
sclError("castConvert taosUcs4ToMbs error 1");
|
||||||
|
tfree(tmp);
|
||||||
|
return TSDB_CODE_QRY_APP_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp[len] = 0;
|
||||||
|
int64_t value = strtoll(tmp, NULL, 10);
|
||||||
|
SET_TYPED_DATA(output, outType, value);
|
||||||
|
}
|
||||||
|
|
||||||
input += varDataLen(input) + VARSTR_HEADER_SIZE;
|
input += varDataLen(input) + VARSTR_HEADER_SIZE;
|
||||||
output += tDataTypes[outType].bytes;
|
output += tDataTypes[outType].bytes;
|
||||||
|
@ -351,6 +351,7 @@ int32_t vectorConvertImpl(SScalarParam* pIn, SScalarParam* pOut) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case TSDB_DATA_TYPE_UTINYINT:
|
||||||
case TSDB_DATA_TYPE_USMALLINT:
|
case TSDB_DATA_TYPE_USMALLINT:
|
||||||
case TSDB_DATA_TYPE_UINT:
|
case TSDB_DATA_TYPE_UINT:
|
||||||
case TSDB_DATA_TYPE_UBIGINT:
|
case TSDB_DATA_TYPE_UBIGINT:
|
||||||
|
@ -358,20 +359,25 @@ int32_t vectorConvertImpl(SScalarParam* pIn, SScalarParam* pOut) {
|
||||||
int32_t bufSize = varDataLen(input) + 1;
|
int32_t bufSize = varDataLen(input) + 1;
|
||||||
char *tmp = malloc(bufSize);
|
char *tmp = malloc(bufSize);
|
||||||
if (NULL == tmp) {
|
if (NULL == tmp) {
|
||||||
|
sclError("malloc %d failed", bufSize);
|
||||||
return TSDB_CODE_QRY_OUT_OF_MEMORY;
|
return TSDB_CODE_QRY_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < pIn->num; ++i) {
|
for (int32_t i = 0; i < pIn->num; ++i) {
|
||||||
if (varDataLen(input) >= bufSize) {
|
if (isNull(input, inType)) {
|
||||||
bufSize = varDataLen(input) + 1;
|
assignVal(output, getNullValue(outType), 0, outType);
|
||||||
tmp = realloc(tmp, bufSize);
|
} else {
|
||||||
|
if (varDataLen(input) >= bufSize) {
|
||||||
|
bufSize = varDataLen(input) + 1;
|
||||||
|
tmp = realloc(tmp, bufSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(tmp, varDataVal(input), varDataLen(input));
|
||||||
|
tmp[varDataLen(input)] = 0;
|
||||||
|
uint64_t value = strtoull(tmp, NULL, 10);
|
||||||
|
SET_TYPED_DATA(output, outType, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(tmp, varDataVal(input), varDataLen(input));
|
|
||||||
tmp[varDataLen(input)] = 0;
|
|
||||||
uint64_t value = strtoull(tmp, NULL, 10);
|
|
||||||
SET_TYPED_DATA(output, outType, value);
|
|
||||||
|
|
||||||
input += varDataLen(input) + VARSTR_HEADER_SIZE;
|
input += varDataLen(input) + VARSTR_HEADER_SIZE;
|
||||||
output += tDataTypes[outType].bytes;
|
output += tDataTypes[outType].bytes;
|
||||||
}
|
}
|
||||||
|
@ -381,25 +387,30 @@ int32_t vectorConvertImpl(SScalarParam* pIn, SScalarParam* pOut) {
|
||||||
int32_t bufSize = varDataLen(input) * TSDB_NCHAR_SIZE + 1;
|
int32_t bufSize = varDataLen(input) * TSDB_NCHAR_SIZE + 1;
|
||||||
char *tmp = calloc(1, bufSize);
|
char *tmp = calloc(1, bufSize);
|
||||||
if (NULL == tmp) {
|
if (NULL == tmp) {
|
||||||
|
sclError("calloc %d failed", bufSize);
|
||||||
return TSDB_CODE_QRY_OUT_OF_MEMORY;
|
return TSDB_CODE_QRY_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < pIn->num; ++i) {
|
for (int32_t i = 0; i < pIn->num; ++i) {
|
||||||
if (varDataLen(input)* TSDB_NCHAR_SIZE >= bufSize) {
|
if (isNull(input, inType)) {
|
||||||
bufSize = varDataLen(input) * TSDB_NCHAR_SIZE + 1;
|
assignVal(output, getNullValue(outType), 0, outType);
|
||||||
tmp = realloc(tmp, bufSize);
|
} else {
|
||||||
}
|
if (varDataLen(input)* TSDB_NCHAR_SIZE >= bufSize) {
|
||||||
|
bufSize = varDataLen(input) * TSDB_NCHAR_SIZE + 1;
|
||||||
int len = taosUcs4ToMbs(varDataVal(input), varDataLen(input), tmp);
|
tmp = realloc(tmp, bufSize);
|
||||||
if (len < 0){
|
}
|
||||||
qError("castConvert taosUcs4ToMbs error 1");
|
|
||||||
tfree(tmp);
|
|
||||||
return TSDB_CODE_QRY_APP_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
tmp[len] = 0;
|
int len = taosUcs4ToMbs(varDataVal(input), varDataLen(input), tmp);
|
||||||
uint64_t value = strtoull(tmp, NULL, 10);
|
if (len < 0){
|
||||||
SET_TYPED_DATA(output, outType, value);
|
sclError("castConvert taosUcs4ToMbs error 1");
|
||||||
|
tfree(tmp);
|
||||||
|
return TSDB_CODE_QRY_APP_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp[len] = 0;
|
||||||
|
uint64_t value = strtoull(tmp, NULL, 10);
|
||||||
|
SET_TYPED_DATA(output, outType, value);
|
||||||
|
}
|
||||||
|
|
||||||
input += varDataLen(input) + VARSTR_HEADER_SIZE;
|
input += varDataLen(input) + VARSTR_HEADER_SIZE;
|
||||||
output += tDataTypes[outType].bytes;
|
output += tDataTypes[outType].bytes;
|
||||||
|
@ -408,9 +419,13 @@ int32_t vectorConvertImpl(SScalarParam* pIn, SScalarParam* pOut) {
|
||||||
tfree(tmp);
|
tfree(tmp);
|
||||||
} else {
|
} else {
|
||||||
for (int32_t i = 0; i < pIn->num; ++i) {
|
for (int32_t i = 0; i < pIn->num; ++i) {
|
||||||
uint64_t value = 0;
|
if (isNull(input, inType)) {
|
||||||
GET_TYPED_DATA(value, uint64_t, inType, input);
|
assignVal(output, getNullValue(outType), 0, outType);
|
||||||
SET_TYPED_DATA(output, outType, value);
|
} else {
|
||||||
|
uint64_t value = 0;
|
||||||
|
GET_TYPED_DATA(value, uint64_t, inType, input);
|
||||||
|
SET_TYPED_DATA(output, outType, value);
|
||||||
|
}
|
||||||
|
|
||||||
input += tDataTypes[inType].bytes;
|
input += tDataTypes[inType].bytes;
|
||||||
output += tDataTypes[outType].bytes;
|
output += tDataTypes[outType].bytes;
|
||||||
|
@ -423,21 +438,26 @@ int32_t vectorConvertImpl(SScalarParam* pIn, SScalarParam* pOut) {
|
||||||
int32_t bufSize = varDataLen(input) + 1;
|
int32_t bufSize = varDataLen(input) + 1;
|
||||||
char *tmp = malloc(bufSize);
|
char *tmp = malloc(bufSize);
|
||||||
if (NULL == tmp) {
|
if (NULL == tmp) {
|
||||||
|
sclError("malloc %d failed", bufSize);
|
||||||
return TSDB_CODE_QRY_OUT_OF_MEMORY;
|
return TSDB_CODE_QRY_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < pIn->num; ++i) {
|
for (int32_t i = 0; i < pIn->num; ++i) {
|
||||||
if (varDataLen(input) >= bufSize) {
|
if (isNull(input, inType)) {
|
||||||
bufSize = varDataLen(input) + 1;
|
assignVal(output, getNullValue(outType), 0, outType);
|
||||||
tmp = realloc(tmp, bufSize);
|
} else {
|
||||||
|
if (varDataLen(input) >= bufSize) {
|
||||||
|
bufSize = varDataLen(input) + 1;
|
||||||
|
tmp = realloc(tmp, bufSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(tmp, varDataVal(input), varDataLen(input));
|
||||||
|
tmp[varDataLen(input)] = 0;
|
||||||
|
|
||||||
|
double value = strtod(tmp, NULL);
|
||||||
|
SET_TYPED_DATA(output, outType, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(tmp, varDataVal(input), varDataLen(input));
|
|
||||||
tmp[varDataLen(input)] = 0;
|
|
||||||
|
|
||||||
double value = strtod(tmp, NULL);
|
|
||||||
SET_TYPED_DATA(output, outType, value);
|
|
||||||
|
|
||||||
input += varDataLen(input) + VARSTR_HEADER_SIZE;
|
input += varDataLen(input) + VARSTR_HEADER_SIZE;
|
||||||
output += tDataTypes[outType].bytes;
|
output += tDataTypes[outType].bytes;
|
||||||
}
|
}
|
||||||
|
@ -447,25 +467,30 @@ int32_t vectorConvertImpl(SScalarParam* pIn, SScalarParam* pOut) {
|
||||||
int32_t bufSize = varDataLen(input) * TSDB_NCHAR_SIZE + 1;
|
int32_t bufSize = varDataLen(input) * TSDB_NCHAR_SIZE + 1;
|
||||||
char *tmp = calloc(1, bufSize);
|
char *tmp = calloc(1, bufSize);
|
||||||
if (NULL == tmp) {
|
if (NULL == tmp) {
|
||||||
|
sclError("calloc %d failed", bufSize);
|
||||||
return TSDB_CODE_QRY_OUT_OF_MEMORY;
|
return TSDB_CODE_QRY_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < pIn->num; ++i) {
|
for (int32_t i = 0; i < pIn->num; ++i) {
|
||||||
if (varDataLen(input)* TSDB_NCHAR_SIZE >= bufSize) {
|
if (isNull(input, inType)) {
|
||||||
bufSize = varDataLen(input) * TSDB_NCHAR_SIZE + 1;
|
assignVal(output, getNullValue(outType), 0, outType);
|
||||||
tmp = realloc(tmp, bufSize);
|
} else {
|
||||||
}
|
if (varDataLen(input)* TSDB_NCHAR_SIZE >= bufSize) {
|
||||||
|
bufSize = varDataLen(input) * TSDB_NCHAR_SIZE + 1;
|
||||||
int len = taosUcs4ToMbs(varDataVal(input), varDataLen(input), tmp);
|
tmp = realloc(tmp, bufSize);
|
||||||
if (len < 0){
|
}
|
||||||
qError("castConvert taosUcs4ToMbs error 1");
|
|
||||||
tfree(tmp);
|
|
||||||
return TSDB_CODE_QRY_APP_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
tmp[len] = 0;
|
int len = taosUcs4ToMbs(varDataVal(input), varDataLen(input), tmp);
|
||||||
double value = strtod(tmp, NULL);
|
if (len < 0){
|
||||||
SET_TYPED_DATA(output, outType, value);
|
sclError("castConvert taosUcs4ToMbs error 1");
|
||||||
|
tfree(tmp);
|
||||||
|
return TSDB_CODE_QRY_APP_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp[len] = 0;
|
||||||
|
double value = strtod(tmp, NULL);
|
||||||
|
SET_TYPED_DATA(output, outType, value);
|
||||||
|
}
|
||||||
|
|
||||||
input += varDataLen(input) + VARSTR_HEADER_SIZE;
|
input += varDataLen(input) + VARSTR_HEADER_SIZE;
|
||||||
output += tDataTypes[outType].bytes;
|
output += tDataTypes[outType].bytes;
|
||||||
|
@ -474,9 +499,13 @@ int32_t vectorConvertImpl(SScalarParam* pIn, SScalarParam* pOut) {
|
||||||
tfree(tmp);
|
tfree(tmp);
|
||||||
} else {
|
} else {
|
||||||
for (int32_t i = 0; i < pIn->num; ++i) {
|
for (int32_t i = 0; i < pIn->num; ++i) {
|
||||||
int64_t value = 0;
|
if (isNull(input, inType)) {
|
||||||
GET_TYPED_DATA(value, int64_t, inType, input);
|
assignVal(output, getNullValue(outType), 0, outType);
|
||||||
SET_TYPED_DATA(output, outType, value);
|
} else {
|
||||||
|
int64_t value = 0;
|
||||||
|
GET_TYPED_DATA(value, int64_t, inType, input);
|
||||||
|
SET_TYPED_DATA(output, outType, value);
|
||||||
|
}
|
||||||
|
|
||||||
input += tDataTypes[inType].bytes;
|
input += tDataTypes[inType].bytes;
|
||||||
output += tDataTypes[outType].bytes;
|
output += tDataTypes[outType].bytes;
|
||||||
|
@ -484,7 +513,7 @@ int32_t vectorConvertImpl(SScalarParam* pIn, SScalarParam* pOut) {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
qError("invalid convert output type:%d", outType);
|
sclError("invalid convert output type:%d", outType);
|
||||||
return TSDB_CODE_QRY_APP_ERROR;
|
return TSDB_CODE_QRY_APP_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -532,6 +561,10 @@ int32_t vectorConvert(SScalarParam* pLeft, SScalarParam* pRight, SScalarParam* p
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (SCL_DATA_TYPE_DUMMY_HASH == pLeft->type || SCL_DATA_TYPE_DUMMY_HASH == pRight->type) {
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
SScalarParam *param1 = NULL, *paramOut1 = NULL;
|
SScalarParam *param1 = NULL, *paramOut1 = NULL;
|
||||||
SScalarParam *param2 = NULL, *paramOut2 = NULL;
|
SScalarParam *param2 = NULL, *paramOut2 = NULL;
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
@ -595,6 +628,46 @@ void vectorAdd(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _or
|
||||||
int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->num, pRight->num) - 1;
|
int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->num, pRight->num) - 1;
|
||||||
int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
|
int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
|
||||||
|
|
||||||
|
SScalarParam leftParam = {.type = TSDB_DATA_TYPE_DOUBLE, .num = pLeft->num};
|
||||||
|
SScalarParam rightParam = {.type = TSDB_DATA_TYPE_DOUBLE, .num = pRight->num};
|
||||||
|
if (IS_VAR_DATA_TYPE(pLeft->type)) {
|
||||||
|
leftParam.data = calloc(leftParam.num, sizeof(double));
|
||||||
|
if (NULL == leftParam.data) {
|
||||||
|
sclError("malloc %d failed", (int32_t)(leftParam.num * sizeof(double)));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pLeft->colData) {
|
||||||
|
SColumnInfoData *colInfo = (SColumnInfoData *)pLeft->data;
|
||||||
|
pLeft->data = colInfo->pData;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vectorConvertImpl(pLeft, &leftParam)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pLeft = &leftParam;
|
||||||
|
}
|
||||||
|
if (IS_VAR_DATA_TYPE(pRight->type)) {
|
||||||
|
rightParam.data = calloc(rightParam.num, sizeof(double));
|
||||||
|
if (NULL == rightParam.data) {
|
||||||
|
sclError("malloc %d failed", (int32_t)(rightParam.num * sizeof(double)));
|
||||||
|
tfree(leftParam.data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pRight->colData) {
|
||||||
|
SColumnInfoData *colInfo = (SColumnInfoData *)pRight->data;
|
||||||
|
pRight->data = colInfo->pData;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vectorConvertImpl(pRight, &rightParam)) {
|
||||||
|
tfree(leftParam.data);
|
||||||
|
tfree(rightParam.data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pRight = &rightParam;
|
||||||
|
}
|
||||||
|
|
||||||
double *output=(double*)out;
|
double *output=(double*)out;
|
||||||
_getValueAddr_fn_t getVectorValueAddrFnLeft = getVectorValueAddrFn(pLeft->type);
|
_getValueAddr_fn_t getVectorValueAddrFnLeft = getVectorValueAddrFn(pLeft->type);
|
||||||
_getValueAddr_fn_t getVectorValueAddrFnRight = getVectorValueAddrFn(pRight->type);
|
_getValueAddr_fn_t getVectorValueAddrFnRight = getVectorValueAddrFn(pRight->type);
|
||||||
|
@ -628,12 +701,55 @@ void vectorAdd(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _or
|
||||||
SET_DOUBLE_VAL(output,getVectorDoubleValueFnLeft(pLeft->data,i) + getVectorDoubleValueFnRight(pRight->data,0));
|
SET_DOUBLE_VAL(output,getVectorDoubleValueFnLeft(pLeft->data,i) + getVectorDoubleValueFnRight(pRight->data,0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tfree(leftParam.data);
|
||||||
|
tfree(rightParam.data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vectorSub(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
void vectorSub(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
||||||
int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->num, pRight->num) - 1;
|
int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->num, pRight->num) - 1;
|
||||||
int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
|
int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
|
||||||
|
|
||||||
|
SScalarParam leftParam = {.type = TSDB_DATA_TYPE_DOUBLE, .num = pLeft->num};
|
||||||
|
SScalarParam rightParam = {.type = TSDB_DATA_TYPE_DOUBLE, .num = pRight->num};
|
||||||
|
if (IS_VAR_DATA_TYPE(pLeft->type)) {
|
||||||
|
leftParam.data = calloc(leftParam.num, sizeof(double));
|
||||||
|
if (NULL == leftParam.data) {
|
||||||
|
sclError("malloc %d failed", (int32_t)(leftParam.num * sizeof(double)));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pLeft->colData) {
|
||||||
|
SColumnInfoData *colInfo = (SColumnInfoData *)pLeft->data;
|
||||||
|
pLeft->data = colInfo->pData;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vectorConvertImpl(pLeft, &leftParam)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pLeft = &leftParam;
|
||||||
|
}
|
||||||
|
if (IS_VAR_DATA_TYPE(pRight->type)) {
|
||||||
|
rightParam.data = calloc(rightParam.num, sizeof(double));
|
||||||
|
if (NULL == rightParam.data) {
|
||||||
|
sclError("malloc %d failed", (int32_t)(rightParam.num * sizeof(double)));
|
||||||
|
tfree(leftParam.data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pRight->colData) {
|
||||||
|
SColumnInfoData *colInfo = (SColumnInfoData *)pRight->data;
|
||||||
|
pRight->data = colInfo->pData;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vectorConvertImpl(pRight, &rightParam)) {
|
||||||
|
tfree(leftParam.data);
|
||||||
|
tfree(rightParam.data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pRight = &rightParam;
|
||||||
|
}
|
||||||
|
|
||||||
double *output=(double*)out;
|
double *output=(double*)out;
|
||||||
_getValueAddr_fn_t getVectorValueAddrFnLeft = getVectorValueAddrFn(pLeft->type);
|
_getValueAddr_fn_t getVectorValueAddrFnLeft = getVectorValueAddrFn(pLeft->type);
|
||||||
_getValueAddr_fn_t getVectorValueAddrFnRight = getVectorValueAddrFn(pRight->type);
|
_getValueAddr_fn_t getVectorValueAddrFnRight = getVectorValueAddrFn(pRight->type);
|
||||||
|
@ -666,11 +782,54 @@ void vectorSub(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _or
|
||||||
SET_DOUBLE_VAL(output,getVectorDoubleValueFnLeft(pLeft->data,i) - getVectorDoubleValueFnRight(pRight->data,0));
|
SET_DOUBLE_VAL(output,getVectorDoubleValueFnLeft(pLeft->data,i) - getVectorDoubleValueFnRight(pRight->data,0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tfree(leftParam.data);
|
||||||
|
tfree(rightParam.data);
|
||||||
}
|
}
|
||||||
void vectorMultiply(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
void vectorMultiply(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
||||||
int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->num, pRight->num) - 1;
|
int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->num, pRight->num) - 1;
|
||||||
int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
|
int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
|
||||||
|
|
||||||
|
SScalarParam leftParam = {.type = TSDB_DATA_TYPE_DOUBLE, .num = pLeft->num};
|
||||||
|
SScalarParam rightParam = {.type = TSDB_DATA_TYPE_DOUBLE, .num = pRight->num};
|
||||||
|
if (IS_VAR_DATA_TYPE(pLeft->type)) {
|
||||||
|
leftParam.data = calloc(leftParam.num, sizeof(double));
|
||||||
|
if (NULL == leftParam.data) {
|
||||||
|
sclError("malloc %d failed", (int32_t)(leftParam.num * sizeof(double)));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pLeft->colData) {
|
||||||
|
SColumnInfoData *colInfo = (SColumnInfoData *)pLeft->data;
|
||||||
|
pLeft->data = colInfo->pData;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vectorConvertImpl(pLeft, &leftParam)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pLeft = &leftParam;
|
||||||
|
}
|
||||||
|
if (IS_VAR_DATA_TYPE(pRight->type)) {
|
||||||
|
rightParam.data = calloc(rightParam.num, sizeof(double));
|
||||||
|
if (NULL == rightParam.data) {
|
||||||
|
sclError("malloc %d failed", (int32_t)(rightParam.num * sizeof(double)));
|
||||||
|
tfree(leftParam.data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pRight->colData) {
|
||||||
|
SColumnInfoData *colInfo = (SColumnInfoData *)pRight->data;
|
||||||
|
pRight->data = colInfo->pData;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vectorConvertImpl(pRight, &rightParam)) {
|
||||||
|
tfree(leftParam.data);
|
||||||
|
tfree(rightParam.data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pRight = &rightParam;
|
||||||
|
}
|
||||||
|
|
||||||
double *output=(double*)out;
|
double *output=(double*)out;
|
||||||
_getValueAddr_fn_t getVectorValueAddrFnLeft = getVectorValueAddrFn(pLeft->type);
|
_getValueAddr_fn_t getVectorValueAddrFnLeft = getVectorValueAddrFn(pLeft->type);
|
||||||
_getValueAddr_fn_t getVectorValueAddrFnRight = getVectorValueAddrFn(pRight->type);
|
_getValueAddr_fn_t getVectorValueAddrFnRight = getVectorValueAddrFn(pRight->type);
|
||||||
|
@ -704,12 +863,55 @@ void vectorMultiply(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_
|
||||||
SET_DOUBLE_VAL(output,getVectorDoubleValueFnLeft(pLeft->data,i) * getVectorDoubleValueFnRight(pRight->data,0));
|
SET_DOUBLE_VAL(output,getVectorDoubleValueFnLeft(pLeft->data,i) * getVectorDoubleValueFnRight(pRight->data,0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tfree(leftParam.data);
|
||||||
|
tfree(rightParam.data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vectorDivide(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
void vectorDivide(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
||||||
int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->num, pRight->num) - 1;
|
int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->num, pRight->num) - 1;
|
||||||
int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
|
int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
|
||||||
|
|
||||||
|
SScalarParam leftParam = {.type = TSDB_DATA_TYPE_DOUBLE, .num = pLeft->num};
|
||||||
|
SScalarParam rightParam = {.type = TSDB_DATA_TYPE_DOUBLE, .num = pRight->num};
|
||||||
|
if (IS_VAR_DATA_TYPE(pLeft->type)) {
|
||||||
|
leftParam.data = calloc(leftParam.num, sizeof(double));
|
||||||
|
if (NULL == leftParam.data) {
|
||||||
|
sclError("malloc %d failed", (int32_t)(leftParam.num * sizeof(double)));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pLeft->colData) {
|
||||||
|
SColumnInfoData *colInfo = (SColumnInfoData *)pLeft->data;
|
||||||
|
pLeft->data = colInfo->pData;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vectorConvertImpl(pLeft, &leftParam)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pLeft = &leftParam;
|
||||||
|
}
|
||||||
|
if (IS_VAR_DATA_TYPE(pRight->type)) {
|
||||||
|
rightParam.data = calloc(rightParam.num, sizeof(double));
|
||||||
|
if (NULL == rightParam.data) {
|
||||||
|
sclError("malloc %d failed", (int32_t)(rightParam.num * sizeof(double)));
|
||||||
|
tfree(leftParam.data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pRight->colData) {
|
||||||
|
SColumnInfoData *colInfo = (SColumnInfoData *)pRight->data;
|
||||||
|
pRight->data = colInfo->pData;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vectorConvertImpl(pRight, &rightParam)) {
|
||||||
|
tfree(leftParam.data);
|
||||||
|
tfree(rightParam.data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pRight = &rightParam;
|
||||||
|
}
|
||||||
|
|
||||||
double *output=(double*)out;
|
double *output=(double*)out;
|
||||||
_getValueAddr_fn_t getVectorValueAddrFnLeft = getVectorValueAddrFn(pLeft->type);
|
_getValueAddr_fn_t getVectorValueAddrFnLeft = getVectorValueAddrFn(pLeft->type);
|
||||||
_getValueAddr_fn_t getVectorValueAddrFnRight = getVectorValueAddrFn(pRight->type);
|
_getValueAddr_fn_t getVectorValueAddrFnRight = getVectorValueAddrFn(pRight->type);
|
||||||
|
@ -750,12 +952,55 @@ void vectorDivide(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t
|
||||||
SET_DOUBLE_VAL(output, getVectorDoubleValueFnLeft(pLeft->data, i) / right);
|
SET_DOUBLE_VAL(output, getVectorDoubleValueFnLeft(pLeft->data, i) / right);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tfree(leftParam.data);
|
||||||
|
tfree(rightParam.data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vectorRemainder(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
void vectorRemainder(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
||||||
int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->num, pRight->num) - 1;
|
int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->num, pRight->num) - 1;
|
||||||
int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
|
int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
|
||||||
|
|
||||||
|
SScalarParam leftParam = {.type = TSDB_DATA_TYPE_DOUBLE, .num = pLeft->num};
|
||||||
|
SScalarParam rightParam = {.type = TSDB_DATA_TYPE_DOUBLE, .num = pRight->num};
|
||||||
|
if (IS_VAR_DATA_TYPE(pLeft->type)) {
|
||||||
|
leftParam.data = calloc(leftParam.num, sizeof(double));
|
||||||
|
if (NULL == leftParam.data) {
|
||||||
|
sclError("malloc %d failed", (int32_t)(leftParam.num * sizeof(double)));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pLeft->colData) {
|
||||||
|
SColumnInfoData *colInfo = (SColumnInfoData *)pLeft->data;
|
||||||
|
pLeft->data = colInfo->pData;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vectorConvertImpl(pLeft, &leftParam)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pLeft = &leftParam;
|
||||||
|
}
|
||||||
|
if (IS_VAR_DATA_TYPE(pRight->type)) {
|
||||||
|
rightParam.data = calloc(rightParam.num, sizeof(double));
|
||||||
|
if (NULL == rightParam.data) {
|
||||||
|
sclError("malloc %d failed", (int32_t)(rightParam.num * sizeof(double)));
|
||||||
|
tfree(leftParam.data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pRight->colData) {
|
||||||
|
SColumnInfoData *colInfo = (SColumnInfoData *)pRight->data;
|
||||||
|
pRight->data = colInfo->pData;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vectorConvertImpl(pRight, &rightParam)) {
|
||||||
|
tfree(leftParam.data);
|
||||||
|
tfree(rightParam.data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pRight = &rightParam;
|
||||||
|
}
|
||||||
|
|
||||||
double * output = (double *)out;
|
double * output = (double *)out;
|
||||||
_getValueAddr_fn_t getVectorValueAddrFnLeft = getVectorValueAddrFn(pLeft->type);
|
_getValueAddr_fn_t getVectorValueAddrFnLeft = getVectorValueAddrFn(pLeft->type);
|
||||||
_getValueAddr_fn_t getVectorValueAddrFnRight = getVectorValueAddrFn(pRight->type);
|
_getValueAddr_fn_t getVectorValueAddrFnRight = getVectorValueAddrFn(pRight->type);
|
||||||
|
@ -822,6 +1067,9 @@ void vectorRemainder(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32
|
||||||
SET_DOUBLE_VAL(output, left - ((int64_t)(left / right)) * right);
|
SET_DOUBLE_VAL(output, left - ((int64_t)(left / right)) * right);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tfree(leftParam.data);
|
||||||
|
tfree(rightParam.data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vectorConcat(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
void vectorConcat(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
||||||
|
@ -879,6 +1127,46 @@ void vectorBitAnd(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t
|
||||||
int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->num, pRight->num) - 1;
|
int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->num, pRight->num) - 1;
|
||||||
int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
|
int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
|
||||||
|
|
||||||
|
SScalarParam leftParam = {.type = TSDB_DATA_TYPE_BIGINT, .num = pLeft->num};
|
||||||
|
SScalarParam rightParam = {.type = TSDB_DATA_TYPE_BIGINT, .num = pRight->num};
|
||||||
|
if (IS_VAR_DATA_TYPE(pLeft->type)) {
|
||||||
|
leftParam.data = calloc(leftParam.num, sizeof(int64_t));
|
||||||
|
if (NULL == leftParam.data) {
|
||||||
|
sclError("malloc %d failed", (int32_t)(leftParam.num * sizeof(int64_t)));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pLeft->colData) {
|
||||||
|
SColumnInfoData *colInfo = (SColumnInfoData *)pLeft->data;
|
||||||
|
pLeft->data = colInfo->pData;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vectorConvertImpl(pLeft, &leftParam)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pLeft = &leftParam;
|
||||||
|
}
|
||||||
|
if (IS_VAR_DATA_TYPE(pRight->type)) {
|
||||||
|
rightParam.data = calloc(rightParam.num, sizeof(int64_t));
|
||||||
|
if (NULL == rightParam.data) {
|
||||||
|
sclError("malloc %d failed", (int32_t)(rightParam.num * sizeof(int64_t)));
|
||||||
|
tfree(leftParam.data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pRight->colData) {
|
||||||
|
SColumnInfoData *colInfo = (SColumnInfoData *)pRight->data;
|
||||||
|
pRight->data = colInfo->pData;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vectorConvertImpl(pRight, &rightParam)) {
|
||||||
|
tfree(leftParam.data);
|
||||||
|
tfree(rightParam.data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pRight = &rightParam;
|
||||||
|
}
|
||||||
|
|
||||||
int64_t *output=(int64_t *)out;
|
int64_t *output=(int64_t *)out;
|
||||||
_getValueAddr_fn_t getVectorValueAddrFnLeft = getVectorValueAddrFn(pLeft->type);
|
_getValueAddr_fn_t getVectorValueAddrFnLeft = getVectorValueAddrFn(pLeft->type);
|
||||||
_getValueAddr_fn_t getVectorValueAddrFnRight = getVectorValueAddrFn(pRight->type);
|
_getValueAddr_fn_t getVectorValueAddrFnRight = getVectorValueAddrFn(pRight->type);
|
||||||
|
@ -912,12 +1200,55 @@ void vectorBitAnd(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t
|
||||||
SET_BIGINT_VAL(output,getVectorBigintValueFnLeft(pLeft->data,i) & getVectorBigintValueFnRight(pRight->data,0));
|
SET_BIGINT_VAL(output,getVectorBigintValueFnLeft(pLeft->data,i) & getVectorBigintValueFnRight(pRight->data,0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tfree(leftParam.data);
|
||||||
|
tfree(rightParam.data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vectorBitOr(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
void vectorBitOr(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
||||||
int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->num, pRight->num) - 1;
|
int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->num, pRight->num) - 1;
|
||||||
int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
|
int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
|
||||||
|
|
||||||
|
SScalarParam leftParam = {.type = TSDB_DATA_TYPE_BIGINT, .num = pLeft->num};
|
||||||
|
SScalarParam rightParam = {.type = TSDB_DATA_TYPE_BIGINT, .num = pRight->num};
|
||||||
|
if (IS_VAR_DATA_TYPE(pLeft->type)) {
|
||||||
|
leftParam.data = calloc(leftParam.num, sizeof(int64_t));
|
||||||
|
if (NULL == leftParam.data) {
|
||||||
|
sclError("malloc %d failed", (int32_t)(leftParam.num * sizeof(int64_t)));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pLeft->colData) {
|
||||||
|
SColumnInfoData *colInfo = (SColumnInfoData *)pLeft->data;
|
||||||
|
pLeft->data = colInfo->pData;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vectorConvertImpl(pLeft, &leftParam)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pLeft = &leftParam;
|
||||||
|
}
|
||||||
|
if (IS_VAR_DATA_TYPE(pRight->type)) {
|
||||||
|
rightParam.data = calloc(rightParam.num, sizeof(int64_t));
|
||||||
|
if (NULL == rightParam.data) {
|
||||||
|
sclError("malloc %d failed", (int32_t)(rightParam.num * sizeof(int64_t)));
|
||||||
|
tfree(leftParam.data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pRight->colData) {
|
||||||
|
SColumnInfoData *colInfo = (SColumnInfoData *)pRight->data;
|
||||||
|
pRight->data = colInfo->pData;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vectorConvertImpl(pRight, &rightParam)) {
|
||||||
|
tfree(leftParam.data);
|
||||||
|
tfree(rightParam.data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pRight = &rightParam;
|
||||||
|
}
|
||||||
|
|
||||||
int64_t *output=(int64_t *)out;
|
int64_t *output=(int64_t *)out;
|
||||||
_getValueAddr_fn_t getVectorValueAddrFnLeft = getVectorValueAddrFn(pLeft->type);
|
_getValueAddr_fn_t getVectorValueAddrFnLeft = getVectorValueAddrFn(pLeft->type);
|
||||||
_getValueAddr_fn_t getVectorValueAddrFnRight = getVectorValueAddrFn(pRight->type);
|
_getValueAddr_fn_t getVectorValueAddrFnRight = getVectorValueAddrFn(pRight->type);
|
||||||
|
@ -951,6 +1282,9 @@ void vectorBitOr(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _
|
||||||
SET_BIGINT_VAL(output,getVectorBigintValueFnLeft(pLeft->data,i) | getVectorBigintValueFnRight(pRight->data,0));
|
SET_BIGINT_VAL(output,getVectorBigintValueFnLeft(pLeft->data,i) | getVectorBigintValueFnRight(pRight->data,0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tfree(leftParam.data);
|
||||||
|
tfree(rightParam.data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -961,10 +1295,23 @@ void vectorCompareImpl(SScalarParam* pLeft, SScalarParam* pRight, void *out, int
|
||||||
bool res = false;
|
bool res = false;
|
||||||
|
|
||||||
bool *output=(bool *)out;
|
bool *output=(bool *)out;
|
||||||
_getValueAddr_fn_t getVectorValueAddrFnLeft = getVectorValueAddrFn(pLeft->type);
|
_getValueAddr_fn_t getVectorValueAddrFnLeft = NULL;
|
||||||
_getValueAddr_fn_t getVectorValueAddrFnRight = getVectorValueAddrFn(pRight->type);
|
_getValueAddr_fn_t getVectorValueAddrFnRight = NULL;
|
||||||
|
|
||||||
if (pLeft->num == pRight->num) {
|
if (IS_VAR_DATA_TYPE(pLeft->type) && !pLeft->colData) {
|
||||||
|
getVectorValueAddrFnLeft = getVectorValueAddr_default;
|
||||||
|
} else {
|
||||||
|
getVectorValueAddrFnLeft = getVectorValueAddrFn(pLeft->type);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IS_VAR_DATA_TYPE(pRight->type) && !pRight->colData) {
|
||||||
|
getVectorValueAddrFnRight = getVectorValueAddr_default;
|
||||||
|
} else {
|
||||||
|
getVectorValueAddrFnRight = getVectorValueAddrFn(pRight->type);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (pLeft->num == pRight->num) {
|
||||||
for (; i < pRight->num && i >= 0; i += step, output += 1) {
|
for (; i < pRight->num && i >= 0; i += step, output += 1) {
|
||||||
if (isNull(getVectorValueAddrFnLeft(pLeft->data, i), pLeft->type) ||
|
if (isNull(getVectorValueAddrFnLeft(pLeft->data, i), pLeft->type) ||
|
||||||
isNull(getVectorValueAddrFnRight(pRight->data, i), pRight->type)) {
|
isNull(getVectorValueAddrFnRight(pRight->data, i), pRight->type)) {
|
||||||
|
@ -992,7 +1339,7 @@ void vectorCompareImpl(SScalarParam* pLeft, SScalarParam* pRight, void *out, int
|
||||||
SET_TYPED_DATA(output, TSDB_DATA_TYPE_BOOL, res);
|
SET_TYPED_DATA(output, TSDB_DATA_TYPE_BOOL, res);
|
||||||
}
|
}
|
||||||
} else if (pRight->num == 1) {
|
} else if (pRight->num == 1) {
|
||||||
void *rightData = getVectorValueAddrFnRight(pRight->data, 0);
|
void *rightData = getVectorValueAddrFnRight(pRight->data, 0);
|
||||||
|
|
||||||
for (; i >= 0 && i < pLeft->num; i += step, output += 1) {
|
for (; i >= 0 && i < pLeft->num; i += step, output += 1) {
|
||||||
if (isNull(getVectorValueAddrFnLeft(pLeft->data,i), pLeft->type) || isNull(rightData, pRight->type)) {
|
if (isNull(getVectorValueAddrFnLeft(pLeft->data,i), pLeft->type) || isNull(rightData, pRight->type)) {
|
||||||
|
@ -1030,55 +1377,55 @@ void vectorCompare(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t
|
||||||
param2 = pRight;
|
param2 = pRight;
|
||||||
}
|
}
|
||||||
|
|
||||||
vectorCompareImpl(param1, param2, out, _ord, TSDB_RELATION_GREATER);
|
vectorCompareImpl(param1, param2, out, _ord, optr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vectorGreater(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
void vectorGreater(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
||||||
vectorCompare(pLeft, pRight, out, _ord, TSDB_RELATION_GREATER);
|
vectorCompare(pLeft, pRight, out, _ord, OP_TYPE_GREATER_THAN);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vectorGreaterEqual(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
void vectorGreaterEqual(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
||||||
vectorCompare(pLeft, pRight, out, _ord, TSDB_RELATION_GREATER_EQUAL);
|
vectorCompare(pLeft, pRight, out, _ord, OP_TYPE_GREATER_EQUAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vectorLower(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
void vectorLower(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
||||||
vectorCompare(pLeft, pRight, out, _ord, TSDB_RELATION_LESS);
|
vectorCompare(pLeft, pRight, out, _ord, OP_TYPE_LOWER_THAN);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vectorLowerEqual(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
void vectorLowerEqual(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
||||||
vectorCompare(pLeft, pRight, out, _ord, TSDB_RELATION_LESS_EQUAL);
|
vectorCompare(pLeft, pRight, out, _ord, OP_TYPE_LOWER_EQUAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vectorEqual(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
void vectorEqual(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
||||||
vectorCompare(pLeft, pRight, out, _ord, TSDB_RELATION_EQUAL);
|
vectorCompare(pLeft, pRight, out, _ord, OP_TYPE_EQUAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vectorNotEqual(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
void vectorNotEqual(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
||||||
vectorCompare(pLeft, pRight, out, _ord, TSDB_RELATION_NOT_EQUAL);
|
vectorCompare(pLeft, pRight, out, _ord, OP_TYPE_NOT_EQUAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vectorIn(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
void vectorIn(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
||||||
vectorCompare(pLeft, pRight, out, _ord, TSDB_RELATION_IN);
|
vectorCompare(pLeft, pRight, out, _ord, OP_TYPE_IN);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vectorNotIn(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
void vectorNotIn(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
||||||
vectorCompare(pLeft, pRight, out, _ord, TSDB_RELATION_NOT_IN);
|
vectorCompare(pLeft, pRight, out, _ord, OP_TYPE_NOT_IN);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vectorLike(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
void vectorLike(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
||||||
vectorCompare(pLeft, pRight, out, _ord, TSDB_RELATION_LIKE);
|
vectorCompare(pLeft, pRight, out, _ord, OP_TYPE_LIKE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vectorNotLike(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
void vectorNotLike(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
||||||
vectorCompare(pLeft, pRight, out, _ord, TSDB_RELATION_NOT_LIKE);
|
vectorCompare(pLeft, pRight, out, _ord, OP_TYPE_NOT_LIKE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vectorMatch(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
void vectorMatch(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
||||||
vectorCompare(pLeft, pRight, out, _ord, TSDB_RELATION_MATCH);
|
vectorCompare(pLeft, pRight, out, _ord, OP_TYPE_MATCH);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vectorNotMatch(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
void vectorNotMatch(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
||||||
vectorCompare(pLeft, pRight, out, _ord, TSDB_RELATION_NMATCH);
|
vectorCompare(pLeft, pRight, out, _ord, OP_TYPE_NMATCH);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vectorIsNull(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
void vectorIsNull(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
||||||
|
@ -1087,7 +1434,13 @@ void vectorIsNull(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t
|
||||||
bool res = false;
|
bool res = false;
|
||||||
|
|
||||||
bool *output=(bool *)out;
|
bool *output=(bool *)out;
|
||||||
_getValueAddr_fn_t getVectorValueAddrFnLeft = getVectorValueAddrFn(pLeft->type);
|
_getValueAddr_fn_t getVectorValueAddrFnLeft = NULL;
|
||||||
|
|
||||||
|
if (IS_VAR_DATA_TYPE(pLeft->type) && !pLeft->colData) {
|
||||||
|
getVectorValueAddrFnLeft = getVectorValueAddr_default;
|
||||||
|
} else {
|
||||||
|
getVectorValueAddrFnLeft = getVectorValueAddrFn(pLeft->type);
|
||||||
|
}
|
||||||
|
|
||||||
for (; i >= 0 && i < pLeft->num; i += step, output += 1) {
|
for (; i >= 0 && i < pLeft->num; i += step, output += 1) {
|
||||||
if (isNull(getVectorValueAddrFnLeft(pLeft->data,i), pLeft->type)) {
|
if (isNull(getVectorValueAddrFnLeft(pLeft->data,i), pLeft->type)) {
|
||||||
|
@ -1107,7 +1460,13 @@ void vectorNotNull(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t
|
||||||
bool res = false;
|
bool res = false;
|
||||||
|
|
||||||
bool *output = (bool *)out;
|
bool *output = (bool *)out;
|
||||||
_getValueAddr_fn_t getVectorValueAddrFnLeft = getVectorValueAddrFn(pLeft->type);
|
_getValueAddr_fn_t getVectorValueAddrFnLeft = NULL;
|
||||||
|
|
||||||
|
if (IS_VAR_DATA_TYPE(pLeft->type) && !pLeft->colData) {
|
||||||
|
getVectorValueAddrFnLeft = getVectorValueAddr_default;
|
||||||
|
} else {
|
||||||
|
getVectorValueAddrFnLeft = getVectorValueAddrFn(pLeft->type);
|
||||||
|
}
|
||||||
|
|
||||||
for (; i >= 0 && i < pLeft->num; i += step, output += 1) {
|
for (; i >= 0 && i < pLeft->num; i += step, output += 1) {
|
||||||
if (isNull(getVectorValueAddrFnLeft(pLeft->data,i), pLeft->type)) {
|
if (isNull(getVectorValueAddrFnLeft(pLeft->data,i), pLeft->type)) {
|
||||||
|
@ -1121,6 +1480,17 @@ void vectorNotNull(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void vectorIsTrue(SScalarParam* pLeft, SScalarParam* pRight, void *out, int32_t _ord) {
|
||||||
|
SScalarParam output = {.data = out, .num = pLeft->num, .type = TSDB_DATA_TYPE_BOOL};
|
||||||
|
|
||||||
|
if (pLeft->colData) {
|
||||||
|
SColumnInfoData *colInfo = (SColumnInfoData *)pLeft->data;
|
||||||
|
pLeft->data = colInfo->pData;
|
||||||
|
}
|
||||||
|
|
||||||
|
vectorConvertImpl(pLeft, &output);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
_bin_scalar_fn_t getBinScalarOperatorFn(int32_t binFunctionId) {
|
_bin_scalar_fn_t getBinScalarOperatorFn(int32_t binFunctionId) {
|
||||||
switch (binFunctionId) {
|
switch (binFunctionId) {
|
||||||
|
@ -1166,12 +1536,12 @@ _bin_scalar_fn_t getBinScalarOperatorFn(int32_t binFunctionId) {
|
||||||
return vectorBitAnd;
|
return vectorBitAnd;
|
||||||
case OP_TYPE_BIT_OR:
|
case OP_TYPE_BIT_OR:
|
||||||
return vectorBitOr;
|
return vectorBitOr;
|
||||||
|
case OP_TYPE_IS_TRUE:
|
||||||
|
return vectorIsTrue;
|
||||||
default:
|
default:
|
||||||
assert(0);
|
assert(0);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isBinaryStringOp(int32_t op) {
|
|
||||||
return op == TSDB_BINARY_OP_CONCAT;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,18 +1,4 @@
|
||||||
|
enable_testing()
|
||||||
|
|
||||||
MESSAGE(STATUS "build scalar unit test")
|
add_subdirectory(filter)
|
||||||
|
add_subdirectory(scalar)
|
||||||
# GoogleTest requires at least C++11
|
|
||||||
SET(CMAKE_CXX_STANDARD 11)
|
|
||||||
AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} SOURCE_LIST)
|
|
||||||
|
|
||||||
ADD_EXECUTABLE(scalarTest ${SOURCE_LIST})
|
|
||||||
TARGET_LINK_LIBRARIES(
|
|
||||||
scalarTest
|
|
||||||
PUBLIC os util common gtest qcom function nodes
|
|
||||||
)
|
|
||||||
|
|
||||||
TARGET_INCLUDE_DIRECTORIES(
|
|
||||||
scalarTest
|
|
||||||
PUBLIC "${CMAKE_SOURCE_DIR}/include/libs/scalar/"
|
|
||||||
PRIVATE "${CMAKE_SOURCE_DIR}/source/libs/scalar/inc"
|
|
||||||
)
|
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
|
||||||
|
MESSAGE(STATUS "build filter unit test")
|
||||||
|
|
||||||
|
# GoogleTest requires at least C++11
|
||||||
|
SET(CMAKE_CXX_STANDARD 11)
|
||||||
|
AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} SOURCE_LIST)
|
||||||
|
|
||||||
|
ADD_EXECUTABLE(filterTest ${SOURCE_LIST})
|
||||||
|
TARGET_LINK_LIBRARIES(
|
||||||
|
filterTest
|
||||||
|
PUBLIC os util common gtest qcom function nodes scalar
|
||||||
|
)
|
||||||
|
|
||||||
|
TARGET_INCLUDE_DIRECTORIES(
|
||||||
|
filterTest
|
||||||
|
PUBLIC "${CMAKE_SOURCE_DIR}/include/libs/scalar/"
|
||||||
|
PRIVATE "${CMAKE_SOURCE_DIR}/source/libs/scalar/inc"
|
||||||
|
)
|
|
@ -0,0 +1,581 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
#include <tglobal.h>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Wwrite-strings"
|
||||||
|
#pragma GCC diagnostic ignored "-Wunused-function"
|
||||||
|
#pragma GCC diagnostic ignored "-Wunused-variable"
|
||||||
|
#pragma GCC diagnostic ignored "-Wsign-compare"
|
||||||
|
#pragma GCC diagnostic ignored "-Wsign-compare"
|
||||||
|
#pragma GCC diagnostic ignored "-Wformat"
|
||||||
|
#pragma GCC diagnostic ignored "-Wint-to-pointer-cast"
|
||||||
|
#pragma GCC diagnostic ignored "-Wpointer-arith"
|
||||||
|
|
||||||
|
#include "os.h"
|
||||||
|
|
||||||
|
#include "taos.h"
|
||||||
|
#include "tdef.h"
|
||||||
|
#include "tvariant.h"
|
||||||
|
#include "tep.h"
|
||||||
|
#include "stub.h"
|
||||||
|
#include "addr_any.h"
|
||||||
|
#include "scalar.h"
|
||||||
|
#include "nodes.h"
|
||||||
|
#include "tlog.h"
|
||||||
|
#include "filter.h"
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
int64_t flttLeftV = 21, flttRightV = 10;
|
||||||
|
double flttLeftVd = 21.0, flttRightVd = 10.0;
|
||||||
|
|
||||||
|
void flttInitLogFile() {
|
||||||
|
const char *defaultLogFileNamePrefix = "taoslog";
|
||||||
|
const int32_t maxLogFileNum = 10;
|
||||||
|
|
||||||
|
tsAsyncLog = 0;
|
||||||
|
qDebugFlag = 159;
|
||||||
|
|
||||||
|
char temp[128] = {0};
|
||||||
|
sprintf(temp, "%s/%s", tsLogDir, defaultLogFileNamePrefix);
|
||||||
|
if (taosInitLog(temp, tsNumOfLogLines, maxLogFileNum) < 0) {
|
||||||
|
printf("failed to open log file in directory:%s\n", tsLogDir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void flttMakeValueNode(SNode **pNode, int32_t dataType, void *value) {
|
||||||
|
SNode *node = nodesMakeNode(QUERY_NODE_VALUE);
|
||||||
|
SValueNode *vnode = (SValueNode *)node;
|
||||||
|
vnode->node.resType.type = dataType;
|
||||||
|
|
||||||
|
if (IS_VAR_DATA_TYPE(dataType)) {
|
||||||
|
vnode->datum.p = (char *)malloc(varDataTLen(value));
|
||||||
|
varDataCopy(vnode->datum.p, value);
|
||||||
|
vnode->node.resType.bytes = varDataLen(value);
|
||||||
|
} else {
|
||||||
|
vnode->node.resType.bytes = tDataTypes[dataType].bytes;
|
||||||
|
assignVal((char *)nodesGetValueFromNode(vnode), (const char *)value, 0, dataType);
|
||||||
|
}
|
||||||
|
|
||||||
|
*pNode = (SNode *)vnode;
|
||||||
|
}
|
||||||
|
|
||||||
|
void flttMakeColRefNode(SNode **pNode, SSDataBlock **block, int32_t dataType, int32_t dataBytes, int32_t rowNum, void *value) {
|
||||||
|
SNode *node = nodesMakeNode(QUERY_NODE_COLUMN_REF);
|
||||||
|
SColumnRefNode *rnode = (SColumnRefNode *)node;
|
||||||
|
rnode->dataType.type = dataType;
|
||||||
|
rnode->dataType.bytes = dataBytes;
|
||||||
|
rnode->tupleId = 0;
|
||||||
|
|
||||||
|
if (NULL == block) {
|
||||||
|
rnode->slotId = 2;
|
||||||
|
rnode->columnId = 55;
|
||||||
|
*pNode = (SNode *)rnode;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NULL == *block) {
|
||||||
|
SSDataBlock *res = (SSDataBlock *)calloc(1, sizeof(SSDataBlock));
|
||||||
|
res->info.numOfCols = 3;
|
||||||
|
res->info.rows = rowNum;
|
||||||
|
res->pDataBlock = taosArrayInit(3, sizeof(SColumnInfoData));
|
||||||
|
for (int32_t i = 0; i < 2; ++i) {
|
||||||
|
SColumnInfoData idata = {{0}};
|
||||||
|
idata.info.type = TSDB_DATA_TYPE_NULL;
|
||||||
|
idata.info.bytes = 10;
|
||||||
|
idata.info.colId = 0;
|
||||||
|
|
||||||
|
int32_t size = idata.info.bytes * rowNum;
|
||||||
|
idata.pData = (char *)calloc(1, size);
|
||||||
|
taosArrayPush(res->pDataBlock, &idata);
|
||||||
|
}
|
||||||
|
|
||||||
|
SColumnInfoData idata = {{0}};
|
||||||
|
idata.info.type = dataType;
|
||||||
|
idata.info.bytes = dataBytes;
|
||||||
|
idata.info.colId = 55;
|
||||||
|
idata.pData = (char *)value;
|
||||||
|
if (IS_VAR_DATA_TYPE(dataType)) {
|
||||||
|
idata.varmeta.offset = (int32_t *)calloc(rowNum, sizeof(int32_t));
|
||||||
|
for (int32_t i = 0; i < rowNum; ++i) {
|
||||||
|
idata.varmeta.offset[i] = (dataBytes + VARSTR_HEADER_SIZE) * i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
taosArrayPush(res->pDataBlock, &idata);
|
||||||
|
|
||||||
|
rnode->slotId = 2;
|
||||||
|
rnode->columnId = 55;
|
||||||
|
|
||||||
|
*block = res;
|
||||||
|
} else {
|
||||||
|
SSDataBlock *res = *block;
|
||||||
|
|
||||||
|
int32_t idx = taosArrayGetSize(res->pDataBlock);
|
||||||
|
SColumnInfoData idata = {{0}};
|
||||||
|
idata.info.type = dataType;
|
||||||
|
idata.info.bytes = dataBytes;
|
||||||
|
idata.info.colId = 55 + idx;
|
||||||
|
idata.pData = (char *)value;
|
||||||
|
taosArrayPush(res->pDataBlock, &idata);
|
||||||
|
|
||||||
|
rnode->slotId = idx;
|
||||||
|
rnode->columnId = 55 + idx;
|
||||||
|
}
|
||||||
|
|
||||||
|
*pNode = (SNode *)rnode;
|
||||||
|
}
|
||||||
|
|
||||||
|
void flttMakeOpNode(SNode **pNode, EOperatorType opType, int32_t resType, SNode *pLeft, SNode *pRight) {
|
||||||
|
SNode *node = nodesMakeNode(QUERY_NODE_OPERATOR);
|
||||||
|
SOperatorNode *onode = (SOperatorNode *)node;
|
||||||
|
onode->node.resType.type = resType;
|
||||||
|
onode->node.resType.bytes = tDataTypes[resType].bytes;
|
||||||
|
|
||||||
|
onode->opType = opType;
|
||||||
|
onode->pLeft = pLeft;
|
||||||
|
onode->pRight = pRight;
|
||||||
|
|
||||||
|
*pNode = (SNode *)onode;
|
||||||
|
}
|
||||||
|
|
||||||
|
void flttMakeLogicNode(SNode **pNode, ELogicConditionType opType, SNode **nodeList, int32_t nodeNum) {
|
||||||
|
SNode *node = nodesMakeNode(QUERY_NODE_LOGIC_CONDITION);
|
||||||
|
SLogicConditionNode *onode = (SLogicConditionNode *)node;
|
||||||
|
onode->condType = opType;
|
||||||
|
onode->node.resType.type = TSDB_DATA_TYPE_BOOL;
|
||||||
|
onode->node.resType.bytes = sizeof(bool);
|
||||||
|
|
||||||
|
onode->pParameterList = nodesMakeList();
|
||||||
|
for (int32_t i = 0; i < nodeNum; ++i) {
|
||||||
|
nodesListAppend(onode->pParameterList, nodeList[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
*pNode = (SNode *)onode;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void flttMakeListNode(SNode **pNode, SNodeList *list, int32_t resType) {
|
||||||
|
SNode *node = nodesMakeNode(QUERY_NODE_NODE_LIST);
|
||||||
|
SNodeListNode *lnode = (SNodeListNode *)node;
|
||||||
|
lnode->dataType.type = resType;
|
||||||
|
lnode->pNodeList = list;
|
||||||
|
|
||||||
|
*pNode = (SNode *)lnode;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(timerangeTest, greater_and_lower) {
|
||||||
|
flttInitLogFile();
|
||||||
|
|
||||||
|
SNode *pcol = NULL, *pval = NULL, *opNode1 = NULL, *opNode2 = NULL, *logicNode = NULL;
|
||||||
|
bool eRes[5] = {false, false, true, true, true};
|
||||||
|
SScalarParam res = {0};
|
||||||
|
int64_t tsmall = 222, tbig = 333;
|
||||||
|
flttMakeColRefNode(&pcol, NULL, TSDB_DATA_TYPE_TIMESTAMP, sizeof(int64_t), 0, NULL);
|
||||||
|
flttMakeValueNode(&pval, TSDB_DATA_TYPE_TIMESTAMP, &tsmall);
|
||||||
|
flttMakeOpNode(&opNode1, OP_TYPE_GREATER_THAN, TSDB_DATA_TYPE_BOOL, pcol, pval);
|
||||||
|
flttMakeColRefNode(&pcol, NULL, TSDB_DATA_TYPE_TIMESTAMP, sizeof(int64_t), 0, NULL);
|
||||||
|
flttMakeValueNode(&pval, TSDB_DATA_TYPE_TIMESTAMP, &tbig);
|
||||||
|
flttMakeOpNode(&opNode2, OP_TYPE_LOWER_THAN, TSDB_DATA_TYPE_BOOL, pcol, pval);
|
||||||
|
SNode *list[2] = {0};
|
||||||
|
list[0] = opNode1;
|
||||||
|
list[1] = opNode2;
|
||||||
|
|
||||||
|
flttMakeLogicNode(&logicNode, LOGIC_COND_TYPE_AND, list, 2);
|
||||||
|
|
||||||
|
SFilterInfo *filter = NULL;
|
||||||
|
int32_t code = filterInitFromNode(logicNode, &filter, FLT_OPTION_NO_REWRITE|FLT_OPTION_TIMESTAMP);
|
||||||
|
ASSERT_EQ(code, 0);
|
||||||
|
STimeWindow win = {0};
|
||||||
|
code = filterGetTimeRange(filter, &win);
|
||||||
|
ASSERT_EQ(code, 0);
|
||||||
|
ASSERT_EQ(win.skey, tsmall);
|
||||||
|
ASSERT_EQ(win.ekey, tbig);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
TEST(columnTest, smallint_column_greater_double_value) {
|
||||||
|
SNode *pLeft = NULL, *pRight = NULL, *opNode = NULL;
|
||||||
|
int16_t leftv[5]= {1, 2, 3, 4, 5};
|
||||||
|
double rightv= 2.5;
|
||||||
|
bool eRes[5] = {false, false, true, true, true};
|
||||||
|
SSDataBlock *src = NULL;
|
||||||
|
SScalarParam res = {0};
|
||||||
|
int32_t rowNum = sizeof(leftv)/sizeof(leftv[0]);
|
||||||
|
flttMakeColRefNode(&pLeft, &src, TSDB_DATA_TYPE_SMALLINT, sizeof(int16_t), rowNum, leftv);
|
||||||
|
flttMakeValueNode(&pRight, TSDB_DATA_TYPE_DOUBLE, &rightv);
|
||||||
|
flttMakeOpNode(&opNode, OP_TYPE_GREATER_THAN, TSDB_DATA_TYPE_BOOL, pLeft, pRight);
|
||||||
|
|
||||||
|
int32_t code = scalarCalculate(opNode, src, &res);
|
||||||
|
ASSERT_EQ(code, 0);
|
||||||
|
ASSERT_EQ(res.num, rowNum);
|
||||||
|
ASSERT_EQ(res.type, TSDB_DATA_TYPE_BOOL);
|
||||||
|
ASSERT_EQ(res.bytes, tDataTypes[TSDB_DATA_TYPE_BOOL].bytes);
|
||||||
|
for (int32_t i = 0; i < rowNum; ++i) {
|
||||||
|
ASSERT_EQ(*((bool *)res.data + i), eRes[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(columnTest, int_column_in_double_list) {
|
||||||
|
SNode *pLeft = NULL, *pRight = NULL, *listNode = NULL, *opNode = NULL;
|
||||||
|
int32_t leftv[5] = {1, 2, 3, 4, 5};
|
||||||
|
double rightv1 = 1.1,rightv2 = 2.2,rightv3 = 3.3;
|
||||||
|
bool eRes[5] = {true, true, true, false, false};
|
||||||
|
SSDataBlock *src = NULL;
|
||||||
|
SScalarParam res = {0};
|
||||||
|
int32_t rowNum = sizeof(leftv)/sizeof(leftv[0]);
|
||||||
|
flttMakeColRefNode(&pLeft, &src, TSDB_DATA_TYPE_INT, sizeof(int32_t), rowNum, leftv);
|
||||||
|
SNodeList* list = nodesMakeList();
|
||||||
|
flttMakeValueNode(&pRight, TSDB_DATA_TYPE_DOUBLE, &rightv1);
|
||||||
|
nodesListAppend(list, pRight);
|
||||||
|
flttMakeValueNode(&pRight, TSDB_DATA_TYPE_DOUBLE, &rightv2);
|
||||||
|
nodesListAppend(list, pRight);
|
||||||
|
flttMakeValueNode(&pRight, TSDB_DATA_TYPE_DOUBLE, &rightv3);
|
||||||
|
nodesListAppend(list, pRight);
|
||||||
|
flttMakeListNode(&listNode,list, TSDB_DATA_TYPE_INT);
|
||||||
|
flttMakeOpNode(&opNode, OP_TYPE_IN, TSDB_DATA_TYPE_BOOL, pLeft, listNode);
|
||||||
|
|
||||||
|
int32_t code = scalarCalculate(opNode, src, &res);
|
||||||
|
ASSERT_EQ(code, 0);
|
||||||
|
ASSERT_EQ(res.num, rowNum);
|
||||||
|
ASSERT_EQ(res.type, TSDB_DATA_TYPE_BOOL);
|
||||||
|
ASSERT_EQ(res.bytes, tDataTypes[TSDB_DATA_TYPE_BOOL].bytes);
|
||||||
|
for (int32_t i = 0; i < rowNum; ++i) {
|
||||||
|
ASSERT_EQ(*((bool *)res.data + i), eRes[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(columnTest, binary_column_in_binary_list) {
|
||||||
|
SNode *pLeft = NULL, *pRight = NULL, *listNode = NULL, *opNode = NULL;
|
||||||
|
bool eRes[5] = {true, true, false, false, false};
|
||||||
|
SSDataBlock *src = NULL;
|
||||||
|
SScalarParam res = {0};
|
||||||
|
char leftv[5][5]= {0};
|
||||||
|
char rightv[3][5]= {0};
|
||||||
|
for (int32_t i = 0; i < 5; ++i) {
|
||||||
|
leftv[i][2] = 'a' + i;
|
||||||
|
leftv[i][3] = 'b' + i;
|
||||||
|
leftv[i][4] = '0' + i;
|
||||||
|
varDataSetLen(leftv[i], 3);
|
||||||
|
}
|
||||||
|
for (int32_t i = 0; i < 2; ++i) {
|
||||||
|
rightv[i][2] = 'a' + i;
|
||||||
|
rightv[i][3] = 'b' + i;
|
||||||
|
rightv[i][4] = '0' + i;
|
||||||
|
varDataSetLen(rightv[i], 3);
|
||||||
|
}
|
||||||
|
for (int32_t i = 2; i < 3; ++i) {
|
||||||
|
rightv[i][2] = 'a' + i;
|
||||||
|
rightv[i][3] = 'a' + i;
|
||||||
|
rightv[i][4] = 'a' + i;
|
||||||
|
varDataSetLen(rightv[i], 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t rowNum = sizeof(leftv)/sizeof(leftv[0]);
|
||||||
|
flttMakeColRefNode(&pLeft, &src, TSDB_DATA_TYPE_BINARY, 3, rowNum, leftv);
|
||||||
|
SNodeList* list = nodesMakeList();
|
||||||
|
flttMakeValueNode(&pRight, TSDB_DATA_TYPE_BINARY, rightv[0]);
|
||||||
|
nodesListAppend(list, pRight);
|
||||||
|
flttMakeValueNode(&pRight, TSDB_DATA_TYPE_BINARY, rightv[1]);
|
||||||
|
nodesListAppend(list, pRight);
|
||||||
|
flttMakeValueNode(&pRight, TSDB_DATA_TYPE_BINARY, rightv[2]);
|
||||||
|
nodesListAppend(list, pRight);
|
||||||
|
flttMakeListNode(&listNode,list, TSDB_DATA_TYPE_BINARY);
|
||||||
|
flttMakeOpNode(&opNode, OP_TYPE_IN, TSDB_DATA_TYPE_BOOL, pLeft, listNode);
|
||||||
|
|
||||||
|
int32_t code = scalarCalculate(opNode, src, &res);
|
||||||
|
ASSERT_EQ(code, 0);
|
||||||
|
ASSERT_EQ(res.num, rowNum);
|
||||||
|
ASSERT_EQ(res.type, TSDB_DATA_TYPE_BOOL);
|
||||||
|
ASSERT_EQ(res.bytes, tDataTypes[TSDB_DATA_TYPE_BOOL].bytes);
|
||||||
|
for (int32_t i = 0; i < rowNum; ++i) {
|
||||||
|
ASSERT_EQ(*((bool *)res.data + i), eRes[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(columnTest, binary_column_like_binary) {
|
||||||
|
SNode *pLeft = NULL, *pRight = NULL, *opNode = NULL;
|
||||||
|
char rightv[64] = {0};
|
||||||
|
char leftv[5][5]= {0};
|
||||||
|
SSDataBlock *src = NULL;
|
||||||
|
SScalarParam res = {0};
|
||||||
|
bool eRes[5] = {true, false, true, false, true};
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < 5; ++i) {
|
||||||
|
leftv[i][2] = 'a';
|
||||||
|
leftv[i][3] = 'a';
|
||||||
|
leftv[i][4] = '0' + i % 2;
|
||||||
|
varDataSetLen(leftv[i], 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t rowNum = sizeof(leftv)/sizeof(leftv[0]);
|
||||||
|
flttMakeColRefNode(&pLeft, &src, TSDB_DATA_TYPE_BINARY, 3, rowNum, leftv);
|
||||||
|
|
||||||
|
sprintf(&rightv[2], "%s", "__0");
|
||||||
|
varDataSetLen(rightv, strlen(&rightv[2]));
|
||||||
|
flttMakeValueNode(&pRight, TSDB_DATA_TYPE_BINARY, rightv);
|
||||||
|
flttMakeOpNode(&opNode, OP_TYPE_LIKE, TSDB_DATA_TYPE_BOOL, pLeft, pRight);
|
||||||
|
|
||||||
|
int32_t code = scalarCalculate(opNode, src, &res);
|
||||||
|
ASSERT_EQ(code, 0);
|
||||||
|
ASSERT_EQ(res.num, rowNum);
|
||||||
|
ASSERT_EQ(res.type, TSDB_DATA_TYPE_BOOL);
|
||||||
|
ASSERT_EQ(res.bytes, tDataTypes[TSDB_DATA_TYPE_BOOL].bytes);
|
||||||
|
for (int32_t i = 0; i < rowNum; ++i) {
|
||||||
|
ASSERT_EQ(*((bool *)res.data + i), eRes[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TEST(columnTest, binary_column_is_null) {
|
||||||
|
SNode *pLeft = NULL, *opNode = NULL;
|
||||||
|
char leftv[5][5]= {0};
|
||||||
|
SSDataBlock *src = NULL;
|
||||||
|
SScalarParam res = {0};
|
||||||
|
bool eRes[5] = {false, false, false, false, true};
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < 4; ++i) {
|
||||||
|
leftv[i][2] = '0' + i % 2;
|
||||||
|
leftv[i][3] = 'a';
|
||||||
|
leftv[i][4] = '0' + i % 2;
|
||||||
|
varDataSetLen(leftv[i], 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
setVardataNull(leftv[4], TSDB_DATA_TYPE_BINARY);
|
||||||
|
|
||||||
|
int32_t rowNum = sizeof(leftv)/sizeof(leftv[0]);
|
||||||
|
flttMakeColRefNode(&pLeft, &src, TSDB_DATA_TYPE_BINARY, 3, rowNum, leftv);
|
||||||
|
|
||||||
|
flttMakeOpNode(&opNode, OP_TYPE_IS_NULL, TSDB_DATA_TYPE_BOOL, pLeft, NULL);
|
||||||
|
|
||||||
|
int32_t code = scalarCalculate(opNode, src, &res);
|
||||||
|
ASSERT_EQ(code, 0);
|
||||||
|
ASSERT_EQ(res.num, rowNum);
|
||||||
|
ASSERT_EQ(res.type, TSDB_DATA_TYPE_BOOL);
|
||||||
|
ASSERT_EQ(res.bytes, tDataTypes[TSDB_DATA_TYPE_BOOL].bytes);
|
||||||
|
for (int32_t i = 0; i < rowNum; ++i) {
|
||||||
|
ASSERT_EQ(*((bool *)res.data + i), eRes[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(columnTest, binary_column_is_not_null) {
|
||||||
|
SNode *pLeft = NULL, *opNode = NULL;
|
||||||
|
char leftv[5][5]= {0};
|
||||||
|
SSDataBlock *src = NULL;
|
||||||
|
SScalarParam res = {0};
|
||||||
|
bool eRes[5] = {true, true, true, true, false};
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < 4; ++i) {
|
||||||
|
leftv[i][2] = '0' + i % 2;
|
||||||
|
leftv[i][3] = 'a';
|
||||||
|
leftv[i][4] = '0' + i % 2;
|
||||||
|
varDataSetLen(leftv[i], 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
setVardataNull(leftv[4], TSDB_DATA_TYPE_BINARY);
|
||||||
|
|
||||||
|
int32_t rowNum = sizeof(leftv)/sizeof(leftv[0]);
|
||||||
|
flttMakeColRefNode(&pLeft, &src, TSDB_DATA_TYPE_BINARY, 3, rowNum, leftv);
|
||||||
|
|
||||||
|
flttMakeOpNode(&opNode, OP_TYPE_IS_NOT_NULL, TSDB_DATA_TYPE_BOOL, pLeft, NULL);
|
||||||
|
|
||||||
|
int32_t code = scalarCalculate(opNode, src, &res);
|
||||||
|
ASSERT_EQ(code, 0);
|
||||||
|
ASSERT_EQ(res.num, rowNum);
|
||||||
|
ASSERT_EQ(res.type, TSDB_DATA_TYPE_BOOL);
|
||||||
|
ASSERT_EQ(res.bytes, tDataTypes[TSDB_DATA_TYPE_BOOL].bytes);
|
||||||
|
for (int32_t i = 0; i < rowNum; ++i) {
|
||||||
|
ASSERT_EQ(*((bool *)res.data + i), eRes[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(logicTest, and_or_and) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(logicTest, or_and_or) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TEST(opTest, smallint_column_greater_int_column) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(opTest, smallint_value_add_int_column) {
|
||||||
|
SNode *pLeft = NULL, *pRight = NULL, *opNode = NULL;
|
||||||
|
int32_t leftv = 1;
|
||||||
|
int16_t rightv[5]= {0, -5, -4, 23, 100};
|
||||||
|
double eRes[5] = {1.0, -4, -3, 24, 101};
|
||||||
|
SSDataBlock *src = NULL;
|
||||||
|
SScalarParam res = {0};
|
||||||
|
int32_t rowNum = sizeof(rightv)/sizeof(rightv[0]);
|
||||||
|
flttMakeValueNode(&pLeft, TSDB_DATA_TYPE_INT, &leftv);
|
||||||
|
flttMakeColRefNode(&pRight, &src, TSDB_DATA_TYPE_SMALLINT, sizeof(int16_t), rowNum, rightv);
|
||||||
|
flttMakeOpNode(&opNode, OP_TYPE_ADD, TSDB_DATA_TYPE_DOUBLE, pLeft, pRight);
|
||||||
|
|
||||||
|
int32_t code = scalarCalculate(opNode, src, &res);
|
||||||
|
ASSERT_EQ(code, 0);
|
||||||
|
ASSERT_EQ(res.num, rowNum);
|
||||||
|
ASSERT_EQ(res.type, TSDB_DATA_TYPE_DOUBLE);
|
||||||
|
ASSERT_EQ(res.bytes, tDataTypes[TSDB_DATA_TYPE_DOUBLE].bytes);
|
||||||
|
for (int32_t i = 0; i < rowNum; ++i) {
|
||||||
|
ASSERT_EQ(*((double *)res.data + i), eRes[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(opTest, bigint_column_multi_binary_column) {
|
||||||
|
SNode *pLeft = NULL, *pRight = NULL, *opNode = NULL;
|
||||||
|
int64_t leftv[5]= {1, 2, 3, 4, 5};
|
||||||
|
char rightv[5][5]= {0};
|
||||||
|
for (int32_t i = 0; i < 5; ++i) {
|
||||||
|
rightv[i][2] = rightv[i][3] = '0';
|
||||||
|
rightv[i][4] = '0' + i;
|
||||||
|
varDataSetLen(rightv[i], 3);
|
||||||
|
}
|
||||||
|
double eRes[5] = {0, 2, 6, 12, 20};
|
||||||
|
SSDataBlock *src = NULL;
|
||||||
|
SScalarParam res = {0};
|
||||||
|
int32_t rowNum = sizeof(rightv)/sizeof(rightv[0]);
|
||||||
|
flttMakeColRefNode(&pLeft, &src, TSDB_DATA_TYPE_BIGINT, sizeof(int64_t), rowNum, leftv);
|
||||||
|
flttMakeColRefNode(&pRight, &src, TSDB_DATA_TYPE_BINARY, 5, rowNum, rightv);
|
||||||
|
flttMakeOpNode(&opNode, OP_TYPE_MULTI, TSDB_DATA_TYPE_DOUBLE, pLeft, pRight);
|
||||||
|
|
||||||
|
int32_t code = scalarCalculate(opNode, src, &res);
|
||||||
|
ASSERT_EQ(code, 0);
|
||||||
|
ASSERT_EQ(res.num, rowNum);
|
||||||
|
ASSERT_EQ(res.type, TSDB_DATA_TYPE_DOUBLE);
|
||||||
|
ASSERT_EQ(res.bytes, tDataTypes[TSDB_DATA_TYPE_DOUBLE].bytes);
|
||||||
|
for (int32_t i = 0; i < rowNum; ++i) {
|
||||||
|
ASSERT_EQ(*((double *)res.data + i), eRes[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(opTest, smallint_column_and_binary_column) {
|
||||||
|
SNode *pLeft = NULL, *pRight = NULL, *opNode = NULL;
|
||||||
|
int16_t leftv[5]= {1, 2, 3, 4, 5};
|
||||||
|
char rightv[5][5]= {0};
|
||||||
|
for (int32_t i = 0; i < 5; ++i) {
|
||||||
|
rightv[i][2] = rightv[i][3] = '0';
|
||||||
|
rightv[i][4] = '0' + i;
|
||||||
|
varDataSetLen(rightv[i], 3);
|
||||||
|
}
|
||||||
|
int64_t eRes[5] = {0, 0, 2, 0, 4};
|
||||||
|
SSDataBlock *src = NULL;
|
||||||
|
SScalarParam res = {0};
|
||||||
|
int32_t rowNum = sizeof(rightv)/sizeof(rightv[0]);
|
||||||
|
flttMakeColRefNode(&pLeft, &src, TSDB_DATA_TYPE_SMALLINT, sizeof(int16_t), rowNum, leftv);
|
||||||
|
flttMakeColRefNode(&pRight, &src, TSDB_DATA_TYPE_BINARY, 5, rowNum, rightv);
|
||||||
|
flttMakeOpNode(&opNode, OP_TYPE_BIT_AND, TSDB_DATA_TYPE_BIGINT, pLeft, pRight);
|
||||||
|
|
||||||
|
int32_t code = scalarCalculate(opNode, src, &res);
|
||||||
|
ASSERT_EQ(code, 0);
|
||||||
|
ASSERT_EQ(res.num, rowNum);
|
||||||
|
ASSERT_EQ(res.type, TSDB_DATA_TYPE_BIGINT);
|
||||||
|
ASSERT_EQ(res.bytes, tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes);
|
||||||
|
for (int32_t i = 0; i < rowNum; ++i) {
|
||||||
|
ASSERT_EQ(*((int64_t *)res.data + i), eRes[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(opTest, smallint_column_or_float_column) {
|
||||||
|
SNode *pLeft = NULL, *pRight = NULL, *opNode = NULL;
|
||||||
|
int16_t leftv[5]= {1, 2, 3, 4, 5};
|
||||||
|
float rightv[5]= {2.0, 3.0, 4.1, 5.2, 6.0};
|
||||||
|
int64_t eRes[5] = {3, 3, 7, 5, 7};
|
||||||
|
SSDataBlock *src = NULL;
|
||||||
|
SScalarParam res = {0};
|
||||||
|
int32_t rowNum = sizeof(rightv)/sizeof(rightv[0]);
|
||||||
|
flttMakeColRefNode(&pLeft, &src, TSDB_DATA_TYPE_SMALLINT, sizeof(int16_t), rowNum, leftv);
|
||||||
|
flttMakeColRefNode(&pRight, &src, TSDB_DATA_TYPE_FLOAT, sizeof(float), rowNum, rightv);
|
||||||
|
flttMakeOpNode(&opNode, OP_TYPE_BIT_OR, TSDB_DATA_TYPE_BIGINT, pLeft, pRight);
|
||||||
|
|
||||||
|
int32_t code = scalarCalculate(opNode, src, &res);
|
||||||
|
ASSERT_EQ(code, 0);
|
||||||
|
ASSERT_EQ(res.num, rowNum);
|
||||||
|
ASSERT_EQ(res.type, TSDB_DATA_TYPE_BIGINT);
|
||||||
|
ASSERT_EQ(res.bytes, tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes);
|
||||||
|
for (int32_t i = 0; i < rowNum; ++i) {
|
||||||
|
ASSERT_EQ(*((int64_t *)res.data + i), eRes[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(opTest, smallint_column_or_double_value) {
|
||||||
|
SNode *pLeft = NULL, *pRight = NULL, *opNode = NULL;
|
||||||
|
int16_t leftv[5]= {1, 2, 3, 4, 5};
|
||||||
|
double rightv= 10.2;
|
||||||
|
int64_t eRes[5] = {11, 10, 11, 14, 15};
|
||||||
|
SSDataBlock *src = NULL;
|
||||||
|
SScalarParam res = {0};
|
||||||
|
int32_t rowNum = sizeof(leftv)/sizeof(leftv[0]);
|
||||||
|
flttMakeColRefNode(&pLeft, &src, TSDB_DATA_TYPE_SMALLINT, sizeof(int16_t), rowNum, leftv);
|
||||||
|
flttMakeValueNode(&pRight, TSDB_DATA_TYPE_DOUBLE, &rightv);
|
||||||
|
flttMakeOpNode(&opNode, OP_TYPE_BIT_OR, TSDB_DATA_TYPE_BIGINT, pLeft, pRight);
|
||||||
|
|
||||||
|
int32_t code = scalarCalculate(opNode, src, &res);
|
||||||
|
ASSERT_EQ(code, 0);
|
||||||
|
ASSERT_EQ(res.num, rowNum);
|
||||||
|
ASSERT_EQ(res.type, TSDB_DATA_TYPE_BIGINT);
|
||||||
|
ASSERT_EQ(res.bytes, tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes);
|
||||||
|
for (int32_t i = 0; i < rowNum; ++i) {
|
||||||
|
ASSERT_EQ(*((int64_t *)res.data + i), eRes[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(opTest, binary_column_is_true) {
|
||||||
|
SNode *pLeft = NULL, *opNode = NULL;
|
||||||
|
char leftv[5][5]= {0};
|
||||||
|
SSDataBlock *src = NULL;
|
||||||
|
SScalarParam res = {0};
|
||||||
|
bool eRes[5] = {false, true, false, true, false};
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < 5; ++i) {
|
||||||
|
leftv[i][2] = '0' + i % 2;
|
||||||
|
leftv[i][3] = 'a';
|
||||||
|
leftv[i][4] = '0' + i % 2;
|
||||||
|
varDataSetLen(leftv[i], 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t rowNum = sizeof(leftv)/sizeof(leftv[0]);
|
||||||
|
flttMakeColRefNode(&pLeft, &src, TSDB_DATA_TYPE_BINARY, 3, rowNum, leftv);
|
||||||
|
|
||||||
|
flttMakeOpNode(&opNode, OP_TYPE_IS_TRUE, TSDB_DATA_TYPE_BOOL, pLeft, NULL);
|
||||||
|
|
||||||
|
int32_t code = scalarCalculate(opNode, src, &res);
|
||||||
|
ASSERT_EQ(code, 0);
|
||||||
|
ASSERT_EQ(res.num, rowNum);
|
||||||
|
ASSERT_EQ(res.type, TSDB_DATA_TYPE_BOOL);
|
||||||
|
ASSERT_EQ(res.bytes, tDataTypes[TSDB_DATA_TYPE_BOOL].bytes);
|
||||||
|
for (int32_t i = 0; i < rowNum; ++i) {
|
||||||
|
ASSERT_EQ(*((bool *)res.data + i), eRes[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int main(int argc, char** argv) {
|
||||||
|
srand(time(NULL));
|
||||||
|
testing::InitGoogleTest(&argc, argv);
|
||||||
|
return RUN_ALL_TESTS();
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma GCC diagnostic pop
|
|
@ -0,0 +1,18 @@
|
||||||
|
|
||||||
|
MESSAGE(STATUS "build scalar unit test")
|
||||||
|
|
||||||
|
# GoogleTest requires at least C++11
|
||||||
|
SET(CMAKE_CXX_STANDARD 11)
|
||||||
|
AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} SOURCE_LIST)
|
||||||
|
|
||||||
|
ADD_EXECUTABLE(scalarTest ${SOURCE_LIST})
|
||||||
|
TARGET_LINK_LIBRARIES(
|
||||||
|
scalarTest
|
||||||
|
PUBLIC os util common gtest qcom function nodes scalar
|
||||||
|
)
|
||||||
|
|
||||||
|
TARGET_INCLUDE_DIRECTORIES(
|
||||||
|
scalarTest
|
||||||
|
PUBLIC "${CMAKE_SOURCE_DIR}/include/libs/scalar/"
|
||||||
|
PRIVATE "${CMAKE_SOURCE_DIR}/source/libs/scalar/inc"
|
||||||
|
)
|
File diff suppressed because it is too large
Load Diff
|
@ -1,55 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
|
||||||
*
|
|
||||||
* This program is free software: you can use, redistribute, and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3
|
|
||||||
* or later ("AGPL"), as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <gtest/gtest.h>
|
|
||||||
#include <tglobal.h>
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
#pragma GCC diagnostic push
|
|
||||||
#pragma GCC diagnostic ignored "-Wwrite-strings"
|
|
||||||
#pragma GCC diagnostic ignored "-Wunused-function"
|
|
||||||
#pragma GCC diagnostic ignored "-Wunused-variable"
|
|
||||||
#pragma GCC diagnostic ignored "-Wsign-compare"
|
|
||||||
#pragma GCC diagnostic ignored "-Wsign-compare"
|
|
||||||
#pragma GCC diagnostic ignored "-Wformat"
|
|
||||||
#pragma GCC diagnostic ignored "-Wint-to-pointer-cast"
|
|
||||||
#pragma GCC diagnostic ignored "-Wpointer-arith"
|
|
||||||
|
|
||||||
#include "os.h"
|
|
||||||
|
|
||||||
#include "taos.h"
|
|
||||||
#include "tdef.h"
|
|
||||||
#include "tvariant.h"
|
|
||||||
#include "tep.h"
|
|
||||||
#include "stub.h"
|
|
||||||
#include "addr_any.h"
|
|
||||||
#include "scalar.h"
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(scalarTest, func) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
|
||||||
srand(time(NULL));
|
|
||||||
testing::InitGoogleTest(&argc, argv);
|
|
||||||
return RUN_ALL_TESTS();
|
|
||||||
}
|
|
||||||
|
|
||||||
#pragma GCC diagnostic pop
|
|
|
@ -466,7 +466,7 @@ int32_t compareWStrPatternNotMatch(const void* pLeft, const void* pRight) {
|
||||||
__compar_fn_t getComparFunc(int32_t type, int32_t optr) {
|
__compar_fn_t getComparFunc(int32_t type, int32_t optr) {
|
||||||
__compar_fn_t comparFn = NULL;
|
__compar_fn_t comparFn = NULL;
|
||||||
|
|
||||||
if (optr == TSDB_RELATION_IN && (type != TSDB_DATA_TYPE_BINARY && type != TSDB_DATA_TYPE_NCHAR)) {
|
if (optr == OP_TYPE_IN && (type != TSDB_DATA_TYPE_BINARY && type != TSDB_DATA_TYPE_NCHAR)) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case TSDB_DATA_TYPE_BOOL:
|
case TSDB_DATA_TYPE_BOOL:
|
||||||
case TSDB_DATA_TYPE_TINYINT:
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
|
@ -489,7 +489,7 @@ __compar_fn_t getComparFunc(int32_t type, int32_t optr) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (optr == TSDB_RELATION_NOT_IN && (type != TSDB_DATA_TYPE_BINARY && type != TSDB_DATA_TYPE_NCHAR)) {
|
if (optr == OP_TYPE_NOT_IN && (type != TSDB_DATA_TYPE_BINARY && type != TSDB_DATA_TYPE_NCHAR)) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case TSDB_DATA_TYPE_BOOL:
|
case TSDB_DATA_TYPE_BOOL:
|
||||||
case TSDB_DATA_TYPE_TINYINT:
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
|
@ -522,17 +522,17 @@ __compar_fn_t getComparFunc(int32_t type, int32_t optr) {
|
||||||
case TSDB_DATA_TYPE_FLOAT: comparFn = compareFloatVal; break;
|
case TSDB_DATA_TYPE_FLOAT: comparFn = compareFloatVal; break;
|
||||||
case TSDB_DATA_TYPE_DOUBLE: comparFn = compareDoubleVal; break;
|
case TSDB_DATA_TYPE_DOUBLE: comparFn = compareDoubleVal; break;
|
||||||
case TSDB_DATA_TYPE_BINARY: {
|
case TSDB_DATA_TYPE_BINARY: {
|
||||||
if (optr == TSDB_RELATION_MATCH) {
|
if (optr == OP_TYPE_MATCH) {
|
||||||
comparFn = compareStrRegexCompMatch;
|
comparFn = compareStrRegexCompMatch;
|
||||||
} else if (optr == TSDB_RELATION_NMATCH) {
|
} else if (optr == OP_TYPE_NMATCH) {
|
||||||
comparFn = compareStrRegexCompNMatch;
|
comparFn = compareStrRegexCompNMatch;
|
||||||
} else if (optr == TSDB_RELATION_LIKE) { /* wildcard query using like operator */
|
} else if (optr == OP_TYPE_LIKE) { /* wildcard query using like operator */
|
||||||
comparFn = compareStrPatternMatch;
|
comparFn = compareStrPatternMatch;
|
||||||
} else if (optr == TSDB_RELATION_NOT_LIKE) { /* wildcard query using like operator */
|
} else if (optr == OP_TYPE_NOT_LIKE) { /* wildcard query using like operator */
|
||||||
comparFn = compareStrPatternNotMatch;
|
comparFn = compareStrPatternNotMatch;
|
||||||
} else if (optr == TSDB_RELATION_IN) {
|
} else if (optr == OP_TYPE_IN) {
|
||||||
comparFn = compareChkInString;
|
comparFn = compareChkInString;
|
||||||
} else if (optr == TSDB_RELATION_NOT_IN) {
|
} else if (optr == OP_TYPE_NOT_IN) {
|
||||||
comparFn = compareChkNotInString;
|
comparFn = compareChkNotInString;
|
||||||
} else { /* normal relational comparFn */
|
} else { /* normal relational comparFn */
|
||||||
comparFn = compareLenPrefixedStr;
|
comparFn = compareLenPrefixedStr;
|
||||||
|
@ -542,17 +542,17 @@ __compar_fn_t getComparFunc(int32_t type, int32_t optr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_NCHAR: {
|
case TSDB_DATA_TYPE_NCHAR: {
|
||||||
if (optr == TSDB_RELATION_MATCH) {
|
if (optr == OP_TYPE_MATCH) {
|
||||||
comparFn = compareStrRegexCompMatch;
|
comparFn = compareStrRegexCompMatch;
|
||||||
} else if (optr == TSDB_RELATION_NMATCH) {
|
} else if (optr == OP_TYPE_NMATCH) {
|
||||||
comparFn = compareStrRegexCompNMatch;
|
comparFn = compareStrRegexCompNMatch;
|
||||||
} else if (optr == TSDB_RELATION_LIKE) {
|
} else if (optr == OP_TYPE_LIKE) {
|
||||||
comparFn = compareWStrPatternMatch;
|
comparFn = compareWStrPatternMatch;
|
||||||
} else if (optr == TSDB_RELATION_NOT_LIKE) {
|
} else if (optr == OP_TYPE_NOT_LIKE) {
|
||||||
comparFn = compareWStrPatternNotMatch;
|
comparFn = compareWStrPatternNotMatch;
|
||||||
} else if (optr == TSDB_RELATION_IN) {
|
} else if (optr == OP_TYPE_IN) {
|
||||||
comparFn = compareChkInString;
|
comparFn = compareChkInString;
|
||||||
} else if (optr == TSDB_RELATION_NOT_IN) {
|
} else if (optr == OP_TYPE_NOT_IN) {
|
||||||
comparFn = compareChkNotInString;
|
comparFn = compareChkNotInString;
|
||||||
} else {
|
} else {
|
||||||
comparFn = compareLenPrefixedWStr;
|
comparFn = compareLenPrefixedWStr;
|
||||||
|
|
Loading…
Reference in New Issue