fix value convert issue
This commit is contained in:
parent
bc65d9eba7
commit
ea497d386c
|
@ -93,8 +93,10 @@ typedef struct SFilterInfo {
|
|||
#define CHK_LRET(c, r,...) do { if (c) { qError(__VA_ARGS__); return r; } } while (0)
|
||||
|
||||
#define FILTER_GET_FIELD(i, id) (&((i)->fields[(id).type].fields[(id).idx]))
|
||||
#define FILTER_GET_COL_FIELD_TYPE(fi) (((SSchema *)((fi)->desc))->type)
|
||||
#define FILTER_GET_COL_FIELD_DATA(fi, ri) ((fi)->data + ((SSchema *)((fi)->desc))->bytes * (ri))
|
||||
#define FILTER_GET_VAL_FIELD_DATA(fi) (&((tVariant *)((fi)->desc))->i64)
|
||||
#define FILTER_GET_VAL_FIELD_TYPE(fi) (((tVariant *)((fi)->desc))->nType)
|
||||
#define FILTER_GET_VAL_FIELD_DATA(fi) ((fi)->data)
|
||||
|
||||
|
||||
|
||||
|
@ -109,7 +111,7 @@ typedef int32_t(*filter_desc_compare_func)(const void *, const void *);
|
|||
|
||||
extern int32_t filterInitFromTree(tExprNode* tree, SFilterInfo **pinfo);
|
||||
extern bool filterExecute(SFilterInfo *info, int32_t numOfRows, int8_t* p);
|
||||
extern int32_t filterSetColData(SFilterInfo *info, int16_t colId, void *data);
|
||||
extern int32_t filterSetColFieldData(SFilterInfo *info, int16_t colId, void *data);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -2645,7 +2645,7 @@ void doSetFilterColInfo(SFilterInfo * pFilters, SSDataBlock* pBlock) {
|
|||
for (int32_t j = 0; j < pBlock->info.numOfCols; ++j) {
|
||||
SColumnInfoData* pColInfo = taosArrayGet(pBlock->pDataBlock, j);
|
||||
|
||||
filterSetColData(pFilters, pColInfo->info.colId, pColInfo->pData);
|
||||
filterSetColFieldData(pFilters, pColInfo->info.colId, pColInfo->pData);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -122,7 +122,7 @@ int32_t filterAddField(SFilterInfo *info, tExprNode *node, SFilterFieldId *fid)
|
|||
|
||||
num = &info->fields[type].num;
|
||||
|
||||
if (*num > 0) {
|
||||
if (*num > 0 && type != F_FIELD_VALUE) {
|
||||
idx = filterGetFiled(&info->fields[type], type, v);
|
||||
}
|
||||
|
||||
|
@ -231,7 +231,7 @@ int32_t filterInitUnitFunc(SFilterInfo *info) {
|
|||
SFilterUnit* unit = &info->units[i];
|
||||
SFilterField *left = FILTER_GET_FIELD(info, unit->left);
|
||||
|
||||
unit->compare.pCompareFunc = getComparFunc(left->type, unit->compare.optr);
|
||||
unit->compare.pCompareFunc = getComparFunc(FILTER_GET_COL_FIELD_TYPE(left), unit->compare.optr);
|
||||
}
|
||||
|
||||
return TSDB_CODE_SUCCESS;
|
||||
|
@ -279,68 +279,13 @@ void filterDumpInfoToString(SFilterInfo *info) {
|
|||
}
|
||||
}
|
||||
|
||||
int32_t filterInitFromTree(tExprNode* tree, SFilterInfo **pinfo) {
|
||||
int32_t code = TSDB_CODE_SUCCESS;
|
||||
SFilterInfo *info = NULL;
|
||||
|
||||
CHK_LRET(tree == NULL || pinfo == NULL, TSDB_CODE_QRY_APP_ERROR, "invalid param");
|
||||
|
||||
if (*pinfo == NULL) {
|
||||
*pinfo = calloc(1, sizeof(SFilterInfo));
|
||||
}
|
||||
|
||||
info = *pinfo;
|
||||
|
||||
SArray* group = taosArrayInit(4, sizeof(SFilterGroup));
|
||||
|
||||
info->unitSize = FILTER_DEFAULT_UNIT_SIZE;
|
||||
info->units = calloc(info->unitSize, sizeof(SFilterUnit));
|
||||
|
||||
info->fields[F_FIELD_COLUMN].num = 0;
|
||||
info->fields[F_FIELD_COLUMN].size = FILTER_DEFAULT_FIELD_SIZE;
|
||||
info->fields[F_FIELD_COLUMN].fields = calloc(info->fields[F_FIELD_COLUMN].size, sizeof(SFilterField));
|
||||
info->fields[F_FIELD_VALUE].num = 0;
|
||||
info->fields[F_FIELD_VALUE].size = FILTER_DEFAULT_FIELD_SIZE;
|
||||
info->fields[F_FIELD_VALUE].fields = calloc(info->fields[F_FIELD_VALUE].size, sizeof(SFilterField));
|
||||
|
||||
code = filterTreeToGroup(tree, info, group);
|
||||
|
||||
ERR_JRET(code);
|
||||
|
||||
size_t groupSize = taosArrayGetSize(group);
|
||||
|
||||
info->groupNum = (uint16_t)groupSize;
|
||||
|
||||
if (info->groupNum > 0) {
|
||||
info->groups = calloc(info->groupNum, sizeof(*info->groups));
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < groupSize; ++i) {
|
||||
SFilterGroup *pg = taosArrayGet(group, i);
|
||||
info->groups[i] = *pg;
|
||||
}
|
||||
|
||||
ERR_JRET(filterInitUnitFunc(info));
|
||||
|
||||
info->unitRes = malloc(info->unitNum * sizeof(*info->unitRes));
|
||||
info->unitFlags = malloc(info->unitNum * sizeof(*info->unitFlags));
|
||||
|
||||
filterDumpInfoToString(info);
|
||||
|
||||
_err_return:
|
||||
|
||||
taosArrayDestroy(group);
|
||||
|
||||
return code;
|
||||
}
|
||||
|
||||
void filterFreeInfo(SFilterInfo *info) {
|
||||
CHK_RETV(info == NULL);
|
||||
|
||||
//TODO
|
||||
}
|
||||
|
||||
int32_t filterSetColData(SFilterInfo *info, int16_t colId, void *data) {
|
||||
int32_t filterSetColFieldData(SFilterInfo *info, int16_t colId, void *data) {
|
||||
CHK_LRET(info == NULL, TSDB_CODE_QRY_APP_ERROR, "info NULL");
|
||||
CHK_LRET(info->fields[F_FIELD_COLUMN].num <= 0, TSDB_CODE_QRY_APP_ERROR, "no column fileds");
|
||||
|
||||
|
@ -356,6 +301,46 @@ int32_t filterSetColData(SFilterInfo *info, int16_t colId, void *data) {
|
|||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
int32_t filterInitValFieldData(SFilterInfo *info) {
|
||||
for (uint16_t i = 0; i < info->unitNum; ++i) {
|
||||
SFilterUnit* unit = &info->units[i];
|
||||
SFilterField* left = FILTER_GET_FIELD(info, unit->left);
|
||||
SFilterField* right = FILTER_GET_FIELD(info, unit->right);
|
||||
|
||||
if (left->type != F_FIELD_VALUE && right->type != F_FIELD_VALUE) {
|
||||
continue;
|
||||
}
|
||||
|
||||
uint32_t type = 0;
|
||||
SFilterField* fi = NULL;
|
||||
if (left->type == F_FIELD_COLUMN) {
|
||||
type = FILTER_GET_COL_FIELD_TYPE(left);
|
||||
fi = right;
|
||||
} else if (right->type == F_FIELD_COLUMN) {
|
||||
type = FILTER_GET_COL_FIELD_TYPE(right);
|
||||
fi = left;
|
||||
} else {
|
||||
type = FILTER_GET_VAL_FIELD_TYPE(left);
|
||||
fi = right;
|
||||
}
|
||||
|
||||
tVariant* var = fi->desc;
|
||||
|
||||
if (type == TSDB_DATA_TYPE_BINARY) {
|
||||
fi->data = calloc(1, (var->nLen + 1) * TSDB_NCHAR_SIZE);
|
||||
} else if (type == TSDB_DATA_TYPE_NCHAR) {
|
||||
fi->data = calloc(1, (var->nLen + 1) * TSDB_NCHAR_SIZE);
|
||||
} else {
|
||||
fi->data = calloc(1, sizeof(int64_t));
|
||||
}
|
||||
|
||||
ERR_LRET(tVariantDump(var, (char*)fi->data, type, false), "dump type[%d] failed", type);
|
||||
}
|
||||
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool filterDoCompare(SFilterUnit *unit, void *left, void *right) {
|
||||
int32_t ret = unit->compare.pCompareFunc(left, right);
|
||||
|
@ -445,4 +430,63 @@ bool filterExecute(SFilterInfo *info, int32_t numOfRows, int8_t* p) {
|
|||
|
||||
|
||||
|
||||
int32_t filterInitFromTree(tExprNode* tree, SFilterInfo **pinfo) {
|
||||
int32_t code = TSDB_CODE_SUCCESS;
|
||||
SFilterInfo *info = NULL;
|
||||
|
||||
CHK_LRET(tree == NULL || pinfo == NULL, TSDB_CODE_QRY_APP_ERROR, "invalid param");
|
||||
|
||||
if (*pinfo == NULL) {
|
||||
*pinfo = calloc(1, sizeof(SFilterInfo));
|
||||
}
|
||||
|
||||
info = *pinfo;
|
||||
|
||||
SArray* group = taosArrayInit(4, sizeof(SFilterGroup));
|
||||
|
||||
info->unitSize = FILTER_DEFAULT_UNIT_SIZE;
|
||||
info->units = calloc(info->unitSize, sizeof(SFilterUnit));
|
||||
|
||||
info->fields[F_FIELD_COLUMN].num = 0;
|
||||
info->fields[F_FIELD_COLUMN].size = FILTER_DEFAULT_FIELD_SIZE;
|
||||
info->fields[F_FIELD_COLUMN].fields = calloc(info->fields[F_FIELD_COLUMN].size, sizeof(SFilterField));
|
||||
info->fields[F_FIELD_VALUE].num = 0;
|
||||
info->fields[F_FIELD_VALUE].size = FILTER_DEFAULT_FIELD_SIZE;
|
||||
info->fields[F_FIELD_VALUE].fields = calloc(info->fields[F_FIELD_VALUE].size, sizeof(SFilterField));
|
||||
|
||||
code = filterTreeToGroup(tree, info, group);
|
||||
|
||||
ERR_JRET(code);
|
||||
|
||||
size_t groupSize = taosArrayGetSize(group);
|
||||
|
||||
info->groupNum = (uint16_t)groupSize;
|
||||
|
||||
if (info->groupNum > 0) {
|
||||
info->groups = calloc(info->groupNum, sizeof(*info->groups));
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < groupSize; ++i) {
|
||||
SFilterGroup *pg = taosArrayGet(group, i);
|
||||
info->groups[i] = *pg;
|
||||
}
|
||||
|
||||
ERR_JRET(filterInitUnitFunc(info));
|
||||
|
||||
ERR_JRET(filterInitValFieldData(info));
|
||||
|
||||
info->unitRes = malloc(info->unitNum * sizeof(*info->unitRes));
|
||||
info->unitFlags = malloc(info->unitNum * sizeof(*info->unitFlags));
|
||||
|
||||
filterDumpInfoToString(info);
|
||||
|
||||
_err_return:
|
||||
|
||||
taosArrayDestroy(group);
|
||||
|
||||
return code;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -109,6 +109,62 @@ endi
|
|||
#sql select * from stb1 where c1 > 0 or (c1 > 3 or c1 < 1) or c1 > 4
|
||||
|
||||
sql select * from stb1 where (c1 > 40 or c1 < 20) and (c2 < 53 or c2 >= 63) and c3 > 1 and c3 < 5
|
||||
if $rows != 3 then
|
||||
return -1
|
||||
endi
|
||||
if $data00 != @21-05-05 18:19:01.000@ then
|
||||
return -1
|
||||
endi
|
||||
if $data01 != 2 then
|
||||
return -1
|
||||
endi
|
||||
if $data10 != @21-05-05 18:19:02.000@ then
|
||||
return -1
|
||||
endi
|
||||
if $data11 != 3 then
|
||||
return -1
|
||||
endi
|
||||
if $data20 != @21-05-05 18:19:03.000@ then
|
||||
return -1
|
||||
endi
|
||||
if $data21 != 4 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql select * from stb1 where (c1 > 52 or c1 < 10) and (c2 > 1 and c2 < 61)
|
||||
if $rows != 5 then
|
||||
return -1
|
||||
endi
|
||||
if $data00 != @21-05-05 18:19:01.000@ then
|
||||
return -1
|
||||
endi
|
||||
if $data01 != 2 then
|
||||
return -1
|
||||
endi
|
||||
if $data10 != @21-05-05 18:19:02.000@ then
|
||||
return -1
|
||||
endi
|
||||
if $data11 != 3 then
|
||||
return -1
|
||||
endi
|
||||
if $data20 != @21-05-05 18:19:03.000@ then
|
||||
return -1
|
||||
endi
|
||||
if $data21 != 4 then
|
||||
return -1
|
||||
endi
|
||||
if $data30 != @21-05-05 18:19:22.000@ then
|
||||
return -1
|
||||
endi
|
||||
if $data31 != 53 then
|
||||
return -1
|
||||
endi
|
||||
if $data40 != @21-05-05 18:19:23.000@ then
|
||||
return -1
|
||||
endi
|
||||
if $data41 != 54 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
|
||||
print "ts test"
|
||||
|
|
Loading…
Reference in New Issue