fix value convert issue

This commit is contained in:
dapan1121 2021-06-17 18:38:34 +08:00
parent bc65d9eba7
commit ea497d386c
4 changed files with 163 additions and 61 deletions

View File

@ -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
}

View File

@ -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);
}
}

View File

@ -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;
}

View File

@ -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"