From ea497d386cc38af603a187e85abe1e201c1ee847 Mon Sep 17 00:00:00 2001 From: dapan1121 <89396746@qq.com> Date: Thu, 17 Jun 2021 18:38:34 +0800 Subject: [PATCH] fix value convert issue --- src/query/inc/qFilter.h | 6 +- src/query/src/qExecutor.c | 2 +- src/query/src/qFilter.c | 160 ++++++++++++++-------- tests/script/general/parser/condition.sim | 56 ++++++++ 4 files changed, 163 insertions(+), 61 deletions(-) diff --git a/src/query/inc/qFilter.h b/src/query/inc/qFilter.h index 6db81bd242..5fd25e40a9 100644 --- a/src/query/inc/qFilter.h +++ b/src/query/inc/qFilter.h @@ -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 } diff --git a/src/query/src/qExecutor.c b/src/query/src/qExecutor.c index 9e5fec813a..4b38b8c031 100644 --- a/src/query/src/qExecutor.c +++ b/src/query/src/qExecutor.c @@ -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); } } diff --git a/src/query/src/qFilter.c b/src/query/src/qFilter.c index e495bded03..ed3a3d5057 100644 --- a/src/query/src/qFilter.c +++ b/src/query/src/qFilter.c @@ -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; +} + + + diff --git a/tests/script/general/parser/condition.sim b/tests/script/general/parser/condition.sim index 4b4750d0be..9ef9da44c3 100644 --- a/tests/script/general/parser/condition.sim +++ b/tests/script/general/parser/condition.sim @@ -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"