Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
慢慢CG
TDengine
提交
8ed28fd8
T
TDengine
项目概览
慢慢CG
/
TDengine
与 Fork 源项目一致
Fork自
taosdata / TDengine
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
8ed28fd8
编写于
7月 23, 2021
作者:
W
wpan
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
support range filter
上级
d77c190e
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
615 addition
and
304 deletion
+615
-304
src/query/inc/qFilter.h
src/query/inc/qFilter.h
+41
-13
src/query/src/qExecutor.c
src/query/src/qExecutor.c
+3
-66
src/query/src/qFilter.c
src/query/src/qFilter.c
+417
-142
src/query/tests/rangeMergeTest.cpp
src/query/tests/rangeMergeTest.cpp
+83
-83
tests/script/general/parser/condition.sim
tests/script/general/parser/condition.sim
+71
-0
未找到文件。
src/query/inc/qFilter.h
浏览文件 @
8ed28fd8
...
@@ -46,9 +46,13 @@ enum {
...
@@ -46,9 +46,13 @@ enum {
enum
{
enum
{
RA_EXCLUDE
=
1
,
RA_EXCLUDE
=
1
,
RA_NULL
=
2
,
RA_INCLUDE
=
2
,
RA_NULL
=
4
,
};
};
#define RA_EMPTY (RA_EXCLUDE|RA_INCLUDE)
#define RA_ALL (RA_EXCLUDE|RA_INCLUDE)
enum
{
enum
{
FI_OPTION_NO_REWRITE
=
1
,
FI_OPTION_NO_REWRITE
=
1
,
FI_OPTION_TIMESTAMP
=
2
,
FI_OPTION_TIMESTAMP
=
2
,
...
@@ -63,7 +67,7 @@ enum {
...
@@ -63,7 +67,7 @@ enum {
enum
{
enum
{
RANGE_TYPE_UNIT
=
1
,
RANGE_TYPE_UNIT
=
1
,
RANGE_TYPE_
COL_RANGE
=
2
,
RANGE_TYPE_
VAR_HASH
=
2
,
RANGE_TYPE_MR_CTX
=
3
,
RANGE_TYPE_MR_CTX
=
3
,
};
};
...
@@ -73,10 +77,10 @@ typedef struct OptrStr {
...
@@ -73,10 +77,10 @@ typedef struct OptrStr {
}
OptrStr
;
}
OptrStr
;
typedef
struct
SFilterRange
{
typedef
struct
SFilterRange
{
char
sflag
;
char
eflag
;
int64_t
s
;
int64_t
s
;
int64_t
e
;
int64_t
e
;
char
sflag
;
char
eflag
;
}
SFilterRange
;
}
SFilterRange
;
typedef
struct
SFilterColRange
{
typedef
struct
SFilterColRange
{
...
@@ -87,30 +91,51 @@ typedef struct SFilterColRange {
...
@@ -87,30 +91,51 @@ typedef struct SFilterColRange {
SFilterRange
ra
;
SFilterRange
ra
;
}
SFilterColRange
;
}
SFilterColRange
;
typedef
struct
SFilterRangeCompare
{
int64_t
s
;
int64_t
e
;
rangeCompFunc
func
;
}
SFilterRangeCompare
;
typedef
bool
(
*
rangeCompFunc
)
(
const
void
*
,
const
void
*
,
const
void
*
,
const
void
*
,
__compar_fn_t
);
typedef
struct
SFilterRangeNode
{
typedef
struct
SFilterRangeNode
{
struct
SFilterRangeNode
*
prev
;
struct
SFilterRangeNode
*
prev
;
struct
SFilterRangeNode
*
next
;
struct
SFilterRangeNode
*
next
;
SFilterRange
ra
;
union
{
SFilterRange
ra
;
SFilterRangeCompare
rc
;
};
}
SFilterRangeNode
;
}
SFilterRangeNode
;
typedef
struct
SFilterR
M
Ctx
{
typedef
struct
SFilterR
ange
Ctx
{
int32_t
type
;
int32_t
type
;
int32_t
options
;
int32_t
options
;
int8_t
status
;
int8_t
status
;
bool
isnull
;
bool
isnull
;
bool
notnull
;
bool
notnull
;
bool
isrange
;
bool
isrange
;
int16_t
colId
;
__compar_fn_t
pCompareFunc
;
__compar_fn_t
pCompareFunc
;
SFilterRangeNode
*
rf
;
//freed
SFilterRangeNode
*
rf
;
//freed
SFilterRangeNode
*
rs
;
SFilterRangeNode
*
rs
;
}
SFilterRMCtx
;
}
SFilterRangeCtx
;
typedef
struct
SFilterVarCtx
{
int32_t
type
;
int32_t
options
;
int8_t
status
;
bool
isnull
;
bool
notnull
;
bool
isrange
;
SHashObj
*
wild
;
SHashObj
*
value
;
}
SFilterVarCtx
;
typedef
struct
SFilterField
{
typedef
struct
SFilterField
{
uint16_t
flag
;
uint16_t
flag
;
void
*
desc
;
void
*
desc
;
void
*
data
;
void
*
data
;
int64_t
range
[];
}
SFilterField
;
}
SFilterField
;
typedef
struct
SFilterFields
{
typedef
struct
SFilterFields
{
...
@@ -172,11 +197,13 @@ typedef struct SFilterInfo {
...
@@ -172,11 +197,13 @@ typedef struct SFilterInfo {
uint16_t
unitSize
;
uint16_t
unitSize
;
uint16_t
unitNum
;
uint16_t
unitNum
;
uint16_t
groupNum
;
uint16_t
groupNum
;
uint16_t
colRangeNum
;
SFilterFields
fields
[
FLD_TYPE_MAX
];
SFilterFields
fields
[
FLD_TYPE_MAX
];
SFilterGroup
*
groups
;
SFilterGroup
*
groups
;
SFilterUnit
*
units
;
SFilterUnit
*
units
;
uint8_t
*
unitRes
;
// result
uint8_t
*
unitRes
;
// result
uint8_t
*
unitFlags
;
// got result
uint8_t
*
unitFlags
;
// got result
SFilterRangeCtx
**
colRange
;
SFilterPCtx
pctx
;
SFilterPCtx
pctx
;
}
SFilterInfo
;
}
SFilterInfo
;
...
@@ -245,7 +272,7 @@ typedef struct SFilterInfo {
...
@@ -245,7 +272,7 @@ typedef struct SFilterInfo {
#define FILTER_UNIT_SET_R(i, idx, v) (i)->unitRes[idx] = (v)
#define FILTER_UNIT_SET_R(i, idx, v) (i)->unitRes[idx] = (v)
#define FILTER_PUSH_UNIT(colInfo, u) do { (colInfo).type = RANGE_TYPE_UNIT; (colInfo).dataType = FILTER_UNIT_DATA_TYPE(u);taosArrayPush((SArray *)((colInfo).info), &u);} while (0)
#define FILTER_PUSH_UNIT(colInfo, u) do { (colInfo).type = RANGE_TYPE_UNIT; (colInfo).dataType = FILTER_UNIT_DATA_TYPE(u);taosArrayPush((SArray *)((colInfo).info), &u);} while (0)
#define FILTER_PUSH_
RANGE(colInfo, cra) do { SFilterColInfo* _info = malloc(sizeof(SFilterColInfo)); _info->type = RANGE_TYPE_COL_RANGE; _info->info = cra; taosArrayPush((SArray *)(colInfo), &_info)
;} while (0)
#define FILTER_PUSH_
VAR_HASH(colInfo, ha) do { (colInfo).type = RANGE_TYPE_VAR_HASH; (colInfo).info = ha
;} while (0)
#define FILTER_PUSH_CTX(colInfo, ctx) do { (colInfo).type = RANGE_TYPE_MR_CTX; (colInfo).info = ctx;} while (0)
#define FILTER_PUSH_CTX(colInfo, ctx) do { (colInfo).type = RANGE_TYPE_MR_CTX; (colInfo).info = ctx;} while (0)
#define FILTER_COPY_IDX(dst, src, n) do { *(dst) = malloc(sizeof(uint16_t) * n); memcpy(*(dst), src, sizeof(uint16_t) * n);} while (0)
#define FILTER_COPY_IDX(dst, src, n) do { *(dst) = malloc(sizeof(uint16_t) * n); memcpy(*(dst), src, sizeof(uint16_t) * n);} while (0)
...
@@ -258,14 +285,15 @@ typedef int32_t(*filter_desc_compare_func)(const void *, const void *);
...
@@ -258,14 +285,15 @@ typedef int32_t(*filter_desc_compare_func)(const void *, const void *);
extern
int32_t
filterInitFromTree
(
tExprNode
*
tree
,
SFilterInfo
**
pinfo
,
uint32_t
options
);
extern
int32_t
filterInitFromTree
(
tExprNode
*
tree
,
SFilterInfo
**
pinfo
,
uint32_t
options
);
extern
bool
filterExecute
(
SFilterInfo
*
info
,
int32_t
numOfRows
,
int8_t
*
p
);
extern
bool
filterExecute
(
SFilterInfo
*
info
,
int32_t
numOfRows
,
int8_t
*
p
);
extern
int32_t
filterSetColFieldData
(
SFilterInfo
*
info
,
int16_t
colId
,
void
*
data
);
extern
int32_t
filterSetColFieldData
(
SFilterInfo
*
info
,
int16_t
colId
,
void
*
data
);
extern
void
*
filterInit
MergeRange
(
int32_t
type
,
int32_t
options
);
extern
void
*
filterInit
RangeCtx
(
int32_t
type
,
int32_t
options
);
extern
int32_t
filterGet
Merge
RangeNum
(
void
*
h
,
int32_t
*
num
);
extern
int32_t
filterGetRangeNum
(
void
*
h
,
int32_t
*
num
);
extern
int32_t
filterGet
Merge
RangeRes
(
void
*
h
,
SFilterRange
*
ra
);
extern
int32_t
filterGetRangeRes
(
void
*
h
,
SFilterRange
*
ra
);
extern
int32_t
filterFree
MergeRange
(
void
*
h
);
extern
int32_t
filterFree
RangeCtx
(
void
*
h
);
extern
int32_t
filterGetTimeRange
(
SFilterInfo
*
info
,
STimeWindow
*
win
);
extern
int32_t
filterGetTimeRange
(
SFilterInfo
*
info
,
STimeWindow
*
win
);
extern
int32_t
filterConverNcharColumns
(
SFilterInfo
*
pFilterInfo
,
int32_t
rows
,
bool
*
gotNchar
);
extern
int32_t
filterConverNcharColumns
(
SFilterInfo
*
pFilterInfo
,
int32_t
rows
,
bool
*
gotNchar
);
extern
int32_t
filterFreeNcharColumns
(
SFilterInfo
*
pFilterInfo
);
extern
int32_t
filterFreeNcharColumns
(
SFilterInfo
*
pFilterInfo
);
extern
void
filterFreeInfo
(
SFilterInfo
*
info
);
extern
void
filterFreeInfo
(
SFilterInfo
*
info
);
extern
bool
filterIsEmptyRes
(
SFilterInfo
*
info
);
#ifdef __cplusplus
#ifdef __cplusplus
}
}
...
...
src/query/src/qExecutor.c
浏览文件 @
8ed28fd8
...
@@ -2395,77 +2395,14 @@ static void getIntermediateBufInfo(SQueryRuntimeEnv* pRuntimeEnv, int32_t* ps, i
...
@@ -2395,77 +2395,14 @@ static void getIntermediateBufInfo(SQueryRuntimeEnv* pRuntimeEnv, int32_t* ps, i
#define IS_PREFILTER_TYPE(_t) ((_t) != TSDB_DATA_TYPE_BINARY && (_t) != TSDB_DATA_TYPE_NCHAR)
#define IS_PREFILTER_TYPE(_t) ((_t) != TSDB_DATA_TYPE_BINARY && (_t) != TSDB_DATA_TYPE_NCHAR)
static
bool
doFilterByBlockStatistics
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SDataStatis
*
pDataStatis
,
SQLFunctionCtx
*
pCtx
,
int32_t
numOfRows
)
{
static
FORCE_INLINE
bool
doFilterByBlockStatistics
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SDataStatis
*
pDataStatis
,
SQLFunctionCtx
*
pCtx
,
int32_t
numOfRows
)
{
SQueryAttr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
SQueryAttr
*
pQueryAttr
=
pRuntimeEnv
->
pQueryAttr
;
if
(
pDataStatis
==
NULL
||
pQueryAttr
->
numOfFilterCols
==
0
)
{
if
(
pDataStatis
==
NULL
||
pQueryAttr
->
pFilters
==
NULL
)
{
return
true
;
return
true
;
}
}
bool
ret
=
true
;
for
(
int32_t
k
=
0
;
k
<
pQueryAttr
->
numOfFilterCols
;
++
k
)
{
SSingleColumnFilterInfo
*
pFilterInfo
=
&
pQueryAttr
->
pFilterInfo
[
k
];
int32_t
index
=
-
1
;
return
filterRangeExecute
(
pQueryAttr
->
pFilters
,
pDataStatis
,
numOfRows
);
for
(
int32_t
i
=
0
;
i
<
pQueryAttr
->
numOfCols
;
++
i
)
{
if
(
pDataStatis
[
i
].
colId
==
pFilterInfo
->
info
.
colId
)
{
index
=
i
;
break
;
}
}
// no statistics data, load the true data block
if
(
index
==
-
1
)
{
return
true
;
}
// not support pre-filter operation on binary/nchar data type
if
(
!
IS_PREFILTER_TYPE
(
pFilterInfo
->
info
.
type
))
{
return
true
;
}
// all data in current column are NULL, no need to check its boundary value
if
(
pDataStatis
[
index
].
numOfNull
==
numOfRows
)
{
// if isNULL query exists, load the null data column
for
(
int32_t
j
=
0
;
j
<
pFilterInfo
->
numOfFilters
;
++
j
)
{
SColumnFilterElem
*
pFilterElem
=
&
pFilterInfo
->
pFilters
[
j
];
if
(
pFilterElem
->
fp
==
isNullOperator
)
{
return
true
;
}
}
continue
;
}
SDataStatis
*
pDataBlockst
=
&
pDataStatis
[
index
];
if
(
pFilterInfo
->
info
.
type
==
TSDB_DATA_TYPE_FLOAT
)
{
float
minval
=
(
float
)(
*
(
double
*
)(
&
pDataBlockst
->
min
));
float
maxval
=
(
float
)(
*
(
double
*
)(
&
pDataBlockst
->
max
));
for
(
int32_t
i
=
0
;
i
<
pFilterInfo
->
numOfFilters
;
++
i
)
{
if
(
pFilterInfo
->
pFilters
[
i
].
filterInfo
.
lowerRelOptr
==
TSDB_RELATION_IN
)
{
continue
;
}
ret
&=
pFilterInfo
->
pFilters
[
i
].
fp
(
&
pFilterInfo
->
pFilters
[
i
],
(
char
*
)
&
minval
,
(
char
*
)
&
maxval
,
TSDB_DATA_TYPE_FLOAT
);
if
(
ret
==
false
)
{
return
false
;
}
}
}
else
{
for
(
int32_t
i
=
0
;
i
<
pFilterInfo
->
numOfFilters
;
++
i
)
{
if
(
pFilterInfo
->
pFilters
[
i
].
filterInfo
.
lowerRelOptr
==
TSDB_RELATION_IN
)
{
continue
;
}
ret
&=
pFilterInfo
->
pFilters
[
i
].
fp
(
&
pFilterInfo
->
pFilters
[
i
],
(
char
*
)
&
pDataBlockst
->
min
,
(
char
*
)
&
pDataBlockst
->
max
,
pFilterInfo
->
info
.
type
);
if
(
ret
==
false
)
{
return
false
;
}
}
}
}
return
ret
;
}
}
static
bool
overlapWithTimeWindow
(
SQueryAttr
*
pQueryAttr
,
SDataBlockInfo
*
pBlockInfo
)
{
static
bool
overlapWithTimeWindow
(
SQueryAttr
*
pQueryAttr
,
SDataBlockInfo
*
pBlockInfo
)
{
...
...
src/query/src/qFilter.c
浏览文件 @
8ed28fd8
...
@@ -57,6 +57,64 @@ filter_desc_compare_func gDescCompare [FLD_TYPE_MAX] = {
...
@@ -57,6 +57,64 @@ filter_desc_compare_func gDescCompare [FLD_TYPE_MAX] = {
filterFieldValDescCompare
filterFieldValDescCompare
};
};
bool
filterRangeCompGi
(
const
char
*
minv
,
const
void
*
maxv
,
const
void
*
minr
,
const
void
*
maxr
,
__compar_fn_t
cfunc
)
{
return
cfunc
(
maxv
,
minr
)
>=
0
;
}
bool
filterRangeCompGe
(
const
char
*
minv
,
const
void
*
maxv
,
const
void
*
minr
,
const
void
*
maxr
,
__compar_fn_t
cfunc
)
{
return
cfunc
(
maxv
,
minr
)
>
0
;
}
bool
filterRangeCompLi
(
const
char
*
minv
,
const
void
*
maxv
,
const
void
*
minr
,
const
void
*
maxr
,
__compar_fn_t
cfunc
)
{
return
cfunc
(
minv
,
maxr
)
<=
0
;
}
bool
filterRangeCompLe
(
const
char
*
minv
,
const
void
*
maxv
,
const
void
*
minr
,
const
void
*
maxr
,
__compar_fn_t
cfunc
)
{
return
cfunc
(
minv
,
maxr
)
<
0
;
}
bool
filterRangeCompii
(
const
char
*
minv
,
const
void
*
maxv
,
const
void
*
minr
,
const
void
*
maxr
,
__compar_fn_t
cfunc
)
{
return
cfunc
(
maxv
,
minr
)
>=
0
&&
cfunc
(
minv
,
maxr
)
<=
0
;
}
bool
filterRangeCompee
(
const
char
*
minv
,
const
void
*
maxv
,
const
void
*
minr
,
const
void
*
maxr
,
__compar_fn_t
cfunc
)
{
return
cfunc
(
maxv
,
minr
)
>
0
&&
cfunc
(
minv
,
maxr
)
<
0
;
}
bool
filterRangeCompei
(
const
char
*
minv
,
const
void
*
maxv
,
const
void
*
minr
,
const
void
*
maxr
,
__compar_fn_t
cfunc
)
{
return
cfunc
(
maxv
,
minr
)
>
0
&&
cfunc
(
minv
,
maxr
)
<=
0
;
}
bool
filterRangeCompie
(
const
char
*
minv
,
const
void
*
maxv
,
const
void
*
minr
,
const
void
*
maxr
,
__compar_fn_t
cfunc
)
{
return
cfunc
(
maxv
,
minr
)
>=
0
&&
cfunc
(
minv
,
maxr
)
<
0
;
}
rangeCompFunc
filterGetRangeCompFunc
(
char
sflag
,
char
eflag
)
{
if
(
FILTER_GET_FLAG
(
sflag
,
RA_NULL
))
{
if
(
FILTER_GET_FLAG
(
eflag
,
RA_EXCLUDE
))
{
return
filterRangeCompLe
;
}
return
filterRangeCompLi
;
}
if
(
FILTER_GET_FLAG
(
eflag
,
RA_NULL
))
{
if
(
FILTER_GET_FLAG
(
sflag
,
RA_EXCLUDE
))
{
return
filterRangeCompGe
;
}
return
filterRangeCompGi
;
}
if
(
FILTER_GET_FLAG
(
sflag
,
RA_EXCLUDE
))
{
if
(
FILTER_GET_FLAG
(
eflag
,
RA_EXCLUDE
))
{
return
filterRangeCompee
;
}
return
filterRangeCompei
;
}
if
(
FILTER_GET_FLAG
(
eflag
,
RA_EXCLUDE
))
{
return
filterRangeCompie
;
}
return
filterRangeCompii
;
}
static
FORCE_INLINE
int32_t
filterCompareGroupCtx
(
const
void
*
pLeft
,
const
void
*
pRight
)
{
static
FORCE_INLINE
int32_t
filterCompareGroupCtx
(
const
void
*
pLeft
,
const
void
*
pRight
)
{
SFilterGroupCtx
*
left
=
*
((
SFilterGroupCtx
**
)
pLeft
),
*
right
=
*
((
SFilterGroupCtx
**
)
pRight
);
SFilterGroupCtx
*
left
=
*
((
SFilterGroupCtx
**
)
pLeft
),
*
right
=
*
((
SFilterGroupCtx
**
)
pRight
);
...
@@ -80,7 +138,7 @@ int32_t filterInitUnitsFields(SFilterInfo *info) {
...
@@ -80,7 +138,7 @@ int32_t filterInitUnitsFields(SFilterInfo *info) {
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
static
FORCE_INLINE
SFilterRangeNode
*
filterNewRange
(
SFilterR
M
Ctx
*
ctx
,
SFilterRange
*
ra
)
{
static
FORCE_INLINE
SFilterRangeNode
*
filterNewRange
(
SFilterR
ange
Ctx
*
ctx
,
SFilterRange
*
ra
)
{
SFilterRangeNode
*
r
=
NULL
;
SFilterRangeNode
*
r
=
NULL
;
if
(
ctx
->
rf
)
{
if
(
ctx
->
rf
)
{
...
@@ -97,13 +155,13 @@ static FORCE_INLINE SFilterRangeNode* filterNewRange(SFilterRMCtx *ctx, SFilterR
...
@@ -97,13 +155,13 @@ static FORCE_INLINE SFilterRangeNode* filterNewRange(SFilterRMCtx *ctx, SFilterR
return
r
;
return
r
;
}
}
void
*
filterInit
MergeRange
(
int32_t
type
,
int32_t
options
)
{
void
*
filterInit
RangeCtx
(
int32_t
type
,
int32_t
options
)
{
if
(
type
>
TSDB_DATA_TYPE_UBIGINT
||
type
<
TSDB_DATA_TYPE_BOOL
||
type
==
TSDB_DATA_TYPE_BINARY
||
type
==
TSDB_DATA_TYPE_NCHAR
)
{
if
(
type
>
TSDB_DATA_TYPE_UBIGINT
||
type
<
TSDB_DATA_TYPE_BOOL
||
type
==
TSDB_DATA_TYPE_BINARY
||
type
==
TSDB_DATA_TYPE_NCHAR
)
{
qError
(
"not supported range type:%d"
,
type
);
qError
(
"not supported range type:%d"
,
type
);
return
NULL
;
return
NULL
;
}
}
SFilterR
MCtx
*
ctx
=
calloc
(
1
,
sizeof
(
SFilterRM
Ctx
));
SFilterR
angeCtx
*
ctx
=
calloc
(
1
,
sizeof
(
SFilterRange
Ctx
));
ctx
->
type
=
type
;
ctx
->
type
=
type
;
ctx
->
options
=
options
;
ctx
->
options
=
options
;
...
@@ -113,7 +171,7 @@ void* filterInitMergeRange(int32_t type, int32_t options) {
...
@@ -113,7 +171,7 @@ void* filterInitMergeRange(int32_t type, int32_t options) {
}
}
int32_t
filterReset
MergeRangeCtx
(
SFilterRM
Ctx
*
ctx
)
{
int32_t
filterReset
RangeCtx
(
SFilterRange
Ctx
*
ctx
)
{
ctx
->
status
=
0
;
ctx
->
status
=
0
;
if
(
ctx
->
rf
==
NULL
)
{
if
(
ctx
->
rf
==
NULL
)
{
...
@@ -137,8 +195,8 @@ int32_t filterResetMergeRangeCtx(SFilterRMCtx *ctx) {
...
@@ -137,8 +195,8 @@ int32_t filterResetMergeRangeCtx(SFilterRMCtx *ctx) {
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
int32_t
filterReuse
MergeRangeCtx
(
SFilterRM
Ctx
*
ctx
,
int32_t
type
,
int32_t
options
)
{
int32_t
filterReuse
RangeCtx
(
SFilterRange
Ctx
*
ctx
,
int32_t
type
,
int32_t
options
)
{
filterReset
Merge
RangeCtx
(
ctx
);
filterResetRangeCtx
(
ctx
);
ctx
->
type
=
type
;
ctx
->
type
=
type
;
ctx
->
options
=
options
;
ctx
->
options
=
options
;
...
@@ -148,7 +206,7 @@ int32_t filterReuseMergeRangeCtx(SFilterRMCtx *ctx, int32_t type, int32_t option
...
@@ -148,7 +206,7 @@ int32_t filterReuseMergeRangeCtx(SFilterRMCtx *ctx, int32_t type, int32_t option
}
}
int32_t
filter
PostProcessRange
(
SFilterRM
Ctx
*
cur
,
SFilterRange
*
ra
,
bool
*
notNull
)
{
int32_t
filter
ConvertRange
(
SFilterRange
Ctx
*
cur
,
SFilterRange
*
ra
,
bool
*
notNull
)
{
if
(
!
FILTER_GET_FLAG
(
ra
->
sflag
,
RA_NULL
))
{
if
(
!
FILTER_GET_FLAG
(
ra
->
sflag
,
RA_NULL
))
{
int32_t
sr
=
cur
->
pCompareFunc
(
&
ra
->
s
,
getDataMin
(
cur
->
type
));
int32_t
sr
=
cur
->
pCompareFunc
(
&
ra
->
s
,
getDataMin
(
cur
->
type
));
if
(
sr
==
0
)
{
if
(
sr
==
0
)
{
...
@@ -173,8 +231,8 @@ int32_t filterPostProcessRange(SFilterRMCtx *cur, SFilterRange *ra, bool *notNul
...
@@ -173,8 +231,8 @@ int32_t filterPostProcessRange(SFilterRMCtx *cur, SFilterRange *ra, bool *notNul
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
int32_t
filterAdd
Mer
geOptr
(
void
*
h
,
uint8_t
raOptr
,
int32_t
optr
,
bool
*
empty
,
bool
*
all
)
{
int32_t
filterAdd
Ran
geOptr
(
void
*
h
,
uint8_t
raOptr
,
int32_t
optr
,
bool
*
empty
,
bool
*
all
)
{
SFilterR
MCtx
*
ctx
=
(
SFilterRM
Ctx
*
)
h
;
SFilterR
angeCtx
*
ctx
=
(
SFilterRange
Ctx
*
)
h
;
if
(
optr
==
TSDB_RELATION_AND
)
{
if
(
optr
==
TSDB_RELATION_AND
)
{
SET_AND_OPTR
(
ctx
,
raOptr
);
SET_AND_OPTR
(
ctx
,
raOptr
);
...
@@ -195,8 +253,8 @@ int32_t filterAddMergeOptr(void* h, uint8_t raOptr, int32_t optr, bool *empty, b
...
@@ -195,8 +253,8 @@ int32_t filterAddMergeOptr(void* h, uint8_t raOptr, int32_t optr, bool *empty, b
int32_t
filterAdd
Merge
RangeImpl
(
void
*
h
,
SFilterRange
*
ra
,
int32_t
optr
)
{
int32_t
filterAddRangeImpl
(
void
*
h
,
SFilterRange
*
ra
,
int32_t
optr
)
{
SFilterR
MCtx
*
ctx
=
(
SFilterRM
Ctx
*
)
h
;
SFilterR
angeCtx
*
ctx
=
(
SFilterRange
Ctx
*
)
h
;
if
(
ctx
->
rs
==
NULL
)
{
if
(
ctx
->
rs
==
NULL
)
{
if
((
FILTER_GET_FLAG
(
ctx
->
status
,
MR_ST_START
)
==
0
)
if
((
FILTER_GET_FLAG
(
ctx
->
status
,
MR_ST_START
)
==
0
)
...
@@ -321,11 +379,11 @@ int32_t filterAddMergeRangeImpl(void* h, SFilterRange* ra, int32_t optr) {
...
@@ -321,11 +379,11 @@ int32_t filterAddMergeRangeImpl(void* h, SFilterRange* ra, int32_t optr) {
if
(
ctx
->
rs
&&
ctx
->
rs
->
next
==
NULL
)
{
if
(
ctx
->
rs
&&
ctx
->
rs
->
next
==
NULL
)
{
bool
notnull
;
bool
notnull
;
filter
PostProcess
Range
(
ctx
,
&
ctx
->
rs
->
ra
,
&
notnull
);
filter
Convert
Range
(
ctx
,
&
ctx
->
rs
->
ra
,
&
notnull
);
if
(
notnull
)
{
if
(
notnull
)
{
bool
all
=
false
;
bool
all
=
false
;
FREE_FROM_RANGE
(
ctx
,
ctx
->
rs
);
FREE_FROM_RANGE
(
ctx
,
ctx
->
rs
);
filterAdd
Mer
geOptr
(
h
,
TSDB_RELATION_NOTNULL
,
optr
,
NULL
,
&
all
);
filterAdd
Ran
geOptr
(
h
,
TSDB_RELATION_NOTNULL
,
optr
,
NULL
,
&
all
);
if
(
all
)
{
if
(
all
)
{
FILTER_SET_FLAG
(
ctx
->
status
,
MR_ST_ALL
);
FILTER_SET_FLAG
(
ctx
->
status
,
MR_ST_ALL
);
}
}
...
@@ -335,8 +393,8 @@ int32_t filterAddMergeRangeImpl(void* h, SFilterRange* ra, int32_t optr) {
...
@@ -335,8 +393,8 @@ int32_t filterAddMergeRangeImpl(void* h, SFilterRange* ra, int32_t optr) {
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
int32_t
filterAdd
Merge
Range
(
void
*
h
,
SFilterRange
*
ra
,
int32_t
optr
)
{
int32_t
filterAddRange
(
void
*
h
,
SFilterRange
*
ra
,
int32_t
optr
)
{
SFilterR
MCtx
*
ctx
=
(
SFilterRM
Ctx
*
)
h
;
SFilterR
angeCtx
*
ctx
=
(
SFilterRange
Ctx
*
)
h
;
if
(
FILTER_GET_FLAG
(
ra
->
sflag
,
RA_NULL
))
{
if
(
FILTER_GET_FLAG
(
ra
->
sflag
,
RA_NULL
))
{
SIMPLE_COPY_VALUES
(
&
ra
->
s
,
getDataMin
(
ctx
->
type
));
SIMPLE_COPY_VALUES
(
&
ra
->
s
,
getDataMin
(
ctx
->
type
));
...
@@ -348,23 +406,15 @@ int32_t filterAddMergeRange(void* h, SFilterRange* ra, int32_t optr) {
...
@@ -348,23 +406,15 @@ int32_t filterAddMergeRange(void* h, SFilterRange* ra, int32_t optr) {
//FILTER_CLR_FLAG(ra->eflag, RA_NULL);
//FILTER_CLR_FLAG(ra->eflag, RA_NULL);
}
}
return
filterAdd
Merge
RangeImpl
(
h
,
ra
,
optr
);
return
filterAddRangeImpl
(
h
,
ra
,
optr
);
}
}
int32_t
filterAdd
Merge
RangeCtx
(
void
*
dst
,
void
*
src
,
int32_t
optr
)
{
int32_t
filterAddRangeCtx
(
void
*
dst
,
void
*
src
,
int32_t
optr
)
{
SFilterR
MCtx
*
dctx
=
(
SFilterRM
Ctx
*
)
dst
;
SFilterR
angeCtx
*
dctx
=
(
SFilterRange
Ctx
*
)
dst
;
SFilterR
MCtx
*
sctx
=
(
SFilterRM
Ctx
*
)
src
;
SFilterR
angeCtx
*
sctx
=
(
SFilterRange
Ctx
*
)
src
;
if
(
optr
==
TSDB_RELATION_AND
)
{
assert
(
optr
==
TSDB_RELATION_OR
);
dctx
->
isnull
&=
sctx
->
isnull
;
dctx
->
notnull
&=
sctx
->
notnull
;
dctx
->
isrange
&=
sctx
->
isrange
;
}
else
{
dctx
->
isnull
|=
sctx
->
isnull
;
dctx
->
notnull
|=
sctx
->
notnull
;
dctx
->
isrange
|=
sctx
->
isrange
;
}
if
(
sctx
->
rs
==
NULL
)
{
if
(
sctx
->
rs
==
NULL
)
{
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
...
@@ -373,16 +423,16 @@ int32_t filterAddMergeRangeCtx(void *dst, void *src, int32_t optr) {
...
@@ -373,16 +423,16 @@ int32_t filterAddMergeRangeCtx(void *dst, void *src, int32_t optr) {
SFilterRangeNode
*
r
=
sctx
->
rs
;
SFilterRangeNode
*
r
=
sctx
->
rs
;
while
(
r
)
{
while
(
r
)
{
filterAdd
Merge
Range
(
dctx
,
&
r
->
ra
,
optr
);
filterAddRange
(
dctx
,
&
r
->
ra
,
optr
);
r
=
r
->
next
;
r
=
r
->
next
;
}
}
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
int32_t
filterCopy
Merge
RangeCtx
(
void
*
dst
,
void
*
src
)
{
int32_t
filterCopyRangeCtx
(
void
*
dst
,
void
*
src
)
{
SFilterR
MCtx
*
dctx
=
(
SFilterRM
Ctx
*
)
dst
;
SFilterR
angeCtx
*
dctx
=
(
SFilterRange
Ctx
*
)
dst
;
SFilterR
MCtx
*
sctx
=
(
SFilterRM
Ctx
*
)
src
;
SFilterR
angeCtx
*
sctx
=
(
SFilterRange
Ctx
*
)
src
;
dctx
->
status
=
sctx
->
status
;
dctx
->
status
=
sctx
->
status
;
...
@@ -408,8 +458,8 @@ int32_t filterCopyMergeRangeCtx(void *dst, void *src) {
...
@@ -408,8 +458,8 @@ int32_t filterCopyMergeRangeCtx(void *dst, void *src) {
int32_t
filterFin
Merge
Range
(
void
*
h
)
{
int32_t
filterFin
ish
Range
(
void
*
h
)
{
SFilterR
MCtx
*
ctx
=
(
SFilterRM
Ctx
*
)
h
;
SFilterR
angeCtx
*
ctx
=
(
SFilterRange
Ctx
*
)
h
;
if
(
FILTER_GET_FLAG
(
ctx
->
status
,
MR_ST_FIN
))
{
if
(
FILTER_GET_FLAG
(
ctx
->
status
,
MR_ST_FIN
))
{
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
...
@@ -440,10 +490,10 @@ int32_t filterFinMergeRange(void* h) {
...
@@ -440,10 +490,10 @@ int32_t filterFinMergeRange(void* h) {
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
int32_t
filterGet
Merge
RangeNum
(
void
*
h
,
int32_t
*
num
)
{
int32_t
filterGetRangeNum
(
void
*
h
,
int32_t
*
num
)
{
filterFin
Merge
Range
(
h
);
filterFin
ish
Range
(
h
);
SFilterR
MCtx
*
ctx
=
(
SFilterRM
Ctx
*
)
h
;
SFilterR
angeCtx
*
ctx
=
(
SFilterRange
Ctx
*
)
h
;
*
num
=
0
;
*
num
=
0
;
...
@@ -458,10 +508,10 @@ int32_t filterGetMergeRangeNum(void* h, int32_t* num) {
...
@@ -458,10 +508,10 @@ int32_t filterGetMergeRangeNum(void* h, int32_t* num) {
}
}
int32_t
filterGet
Merge
RangeRes
(
void
*
h
,
SFilterRange
*
ra
)
{
int32_t
filterGetRangeRes
(
void
*
h
,
SFilterRange
*
ra
)
{
filterFin
Merge
Range
(
h
);
filterFin
ish
Range
(
h
);
SFilterR
MCtx
*
ctx
=
(
SFilterRM
Ctx
*
)
h
;
SFilterR
angeCtx
*
ctx
=
(
SFilterRange
Ctx
*
)
h
;
uint32_t
num
=
0
;
uint32_t
num
=
0
;
SFilterRangeNode
*
r
=
ctx
->
rs
;
SFilterRangeNode
*
r
=
ctx
->
rs
;
...
@@ -482,28 +532,28 @@ int32_t filterGetMergeRangeRes(void* h, SFilterRange *ra) {
...
@@ -482,28 +532,28 @@ int32_t filterGetMergeRangeRes(void* h, SFilterRange *ra) {
}
}
int32_t
filterSourceRangeFromCtx
(
SFilterR
M
Ctx
*
ctx
,
void
*
sctx
,
int32_t
optr
,
bool
*
empty
,
bool
*
all
)
{
int32_t
filterSourceRangeFromCtx
(
SFilterR
ange
Ctx
*
ctx
,
void
*
sctx
,
int32_t
optr
,
bool
*
empty
,
bool
*
all
)
{
SFilterR
MCtx
*
src
=
(
SFilterRM
Ctx
*
)
sctx
;
SFilterR
angeCtx
*
src
=
(
SFilterRange
Ctx
*
)
sctx
;
if
(
src
->
isnull
){
if
(
src
->
isnull
){
filterAdd
Mer
geOptr
(
ctx
,
TSDB_RELATION_ISNULL
,
optr
,
empty
,
all
);
filterAdd
Ran
geOptr
(
ctx
,
TSDB_RELATION_ISNULL
,
optr
,
empty
,
all
);
if
(
FILTER_GET_FLAG
(
ctx
->
status
,
MR_ST_ALL
))
{
if
(
FILTER_GET_FLAG
(
ctx
->
status
,
MR_ST_ALL
))
{
*
all
=
true
;
*
all
=
true
;
}
}
}
}
if
(
src
->
notnull
)
{
if
(
src
->
notnull
)
{
filterAdd
Mer
geOptr
(
ctx
,
TSDB_RELATION_NOTNULL
,
optr
,
empty
,
all
);
filterAdd
Ran
geOptr
(
ctx
,
TSDB_RELATION_NOTNULL
,
optr
,
empty
,
all
);
if
(
FILTER_GET_FLAG
(
ctx
->
status
,
MR_ST_ALL
))
{
if
(
FILTER_GET_FLAG
(
ctx
->
status
,
MR_ST_ALL
))
{
*
all
=
true
;
*
all
=
true
;
}
}
}
}
if
(
src
->
isrange
)
{
if
(
src
->
isrange
)
{
filterAdd
Mer
geOptr
(
ctx
,
0
,
optr
,
empty
,
all
);
filterAdd
Ran
geOptr
(
ctx
,
0
,
optr
,
empty
,
all
);
if
(
!
(
optr
==
TSDB_RELATION_OR
&&
ctx
->
notnull
))
{
if
(
!
(
optr
==
TSDB_RELATION_OR
&&
ctx
->
notnull
))
{
filterAdd
Merge
RangeCtx
(
ctx
,
src
,
optr
);
filterAddRangeCtx
(
ctx
,
src
,
optr
);
}
}
if
(
FILTER_GET_FLAG
(
ctx
->
status
,
MR_ST_ALL
))
{
if
(
FILTER_GET_FLAG
(
ctx
->
status
,
MR_ST_ALL
))
{
...
@@ -516,12 +566,12 @@ int32_t filterSourceRangeFromCtx(SFilterRMCtx *ctx, void *sctx, int32_t optr, bo
...
@@ -516,12 +566,12 @@ int32_t filterSourceRangeFromCtx(SFilterRMCtx *ctx, void *sctx, int32_t optr, bo
int32_t
filterFree
MergeRange
(
void
*
h
)
{
int32_t
filterFree
RangeCtx
(
void
*
h
)
{
if
(
h
==
NULL
)
{
if
(
h
==
NULL
)
{
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
SFilterR
MCtx
*
ctx
=
(
SFilterRM
Ctx
*
)
h
;
SFilterR
angeCtx
*
ctx
=
(
SFilterRange
Ctx
*
)
h
;
SFilterRangeNode
*
r
=
ctx
->
rs
;
SFilterRangeNode
*
r
=
ctx
->
rs
;
SFilterRangeNode
*
rn
=
NULL
;
SFilterRangeNode
*
rn
=
NULL
;
...
@@ -657,7 +707,7 @@ static FORCE_INLINE int32_t filterAddColFieldFromField(SFilterInfo *info, SFilte
...
@@ -657,7 +707,7 @@ static FORCE_INLINE int32_t filterAddColFieldFromField(SFilterInfo *info, SFilte
int32_t
filterAddFieldFromNode
(
SFilterInfo
*
info
,
tExprNode
*
node
,
SFilterFieldId
*
fid
)
{
int32_t
filterAddFieldFromNode
(
SFilterInfo
*
info
,
tExprNode
*
node
,
SFilterFieldId
*
fid
)
{
CHK_LRET
(
node
==
NULL
,
TSDB_CODE_QRY_APP_ERROR
,
"empty node"
);
CHK_LRET
(
node
==
NULL
,
TSDB_CODE_QRY_APP_ERROR
,
"empty node"
);
CHK_
LRET
(
node
->
nodeType
!=
TSQL_NODE_COL
&&
node
->
nodeType
!=
TSQL_NODE_VALUE
,
TSDB_CODE_QRY_APP_ERROR
,
"invalid nodeType:%d"
,
node
->
nodeType
);
CHK_
RET
(
node
->
nodeType
!=
TSQL_NODE_COL
&&
node
->
nodeType
!=
TSQL_NODE_VALUE
,
TSDB_CODE_QRY_APP_ERROR
);
int32_t
type
;
int32_t
type
;
void
*
v
;
void
*
v
;
...
@@ -835,7 +885,7 @@ int32_t filterAddUnitFromUnit(SFilterInfo *dst, SFilterInfo *src, SFilterUnit* u
...
@@ -835,7 +885,7 @@ int32_t filterAddUnitFromUnit(SFilterInfo *dst, SFilterInfo *src, SFilterUnit* u
}
}
int32_t
filterAddGroupUnitFromCtx
(
SFilterInfo
*
dst
,
SFilterInfo
*
src
,
SFilterR
M
Ctx
*
ctx
,
uint16_t
cidx
,
SFilterGroup
*
g
,
int32_t
optr
,
SArray
*
res
)
{
int32_t
filterAddGroupUnitFromCtx
(
SFilterInfo
*
dst
,
SFilterInfo
*
src
,
SFilterR
ange
Ctx
*
ctx
,
uint16_t
cidx
,
SFilterGroup
*
g
,
int32_t
optr
,
SArray
*
res
)
{
SFilterFieldId
left
,
right
;
SFilterFieldId
left
,
right
;
uint16_t
uidx
=
0
;
uint16_t
uidx
=
0
;
...
@@ -1042,67 +1092,106 @@ int32_t filterInitUnitFunc(SFilterInfo *info) {
...
@@ -1042,67 +1092,106 @@ int32_t filterInitUnitFunc(SFilterInfo *info) {
void
filterDumpInfoToString
(
SFilterInfo
*
info
,
const
char
*
msg
)
{
void
filterDumpInfoToString
(
SFilterInfo
*
info
,
const
char
*
msg
,
int32_t
options
)
{
CHK_LRETV
(
info
==
NULL
,
"%s - FilterInfo: empty"
,
msg
);
if
(
qDebugFlag
&
DEBUG_DEBUG
)
{
CHK_LRETV
(
info
==
NULL
,
"%s - FilterInfo: EMPTY"
,
msg
);
qDebug
(
"%s - FilterInfo:"
,
msg
);
if
(
options
==
0
)
{
qDebug
(
"COLUMN Field Num:%u"
,
info
->
fields
[
FLD_TYPE_COLUMN
].
num
);
qDebug
(
"%s - FilterInfo:"
,
msg
);
for
(
uint16_t
i
=
0
;
i
<
info
->
fields
[
FLD_TYPE_COLUMN
].
num
;
++
i
)
{
qDebug
(
"COLUMN Field Num:%u"
,
info
->
fields
[
FLD_TYPE_COLUMN
].
num
);
SFilterField
*
field
=
&
info
->
fields
[
FLD_TYPE_COLUMN
].
fields
[
i
];
for
(
uint16_t
i
=
0
;
i
<
info
->
fields
[
FLD_TYPE_COLUMN
].
num
;
++
i
)
{
SSchema
*
sch
=
field
->
desc
;
SFilterField
*
field
=
&
info
->
fields
[
FLD_TYPE_COLUMN
].
fields
[
i
];
qDebug
(
"COL%d => [%d][%s]"
,
i
,
sch
->
colId
,
sch
->
name
);
SSchema
*
sch
=
field
->
desc
;
}
qDebug
(
"COL%d => [%d][%s]"
,
i
,
sch
->
colId
,
sch
->
name
);
qDebug
(
"VALUE Field Num:%u"
,
info
->
fields
[
FLD_TYPE_VALUE
].
num
);
for
(
uint16_t
i
=
0
;
i
<
info
->
fields
[
FLD_TYPE_VALUE
].
num
;
++
i
)
{
SFilterField
*
field
=
&
info
->
fields
[
FLD_TYPE_VALUE
].
fields
[
i
];
if
(
field
->
desc
)
{
tVariant
*
var
=
field
->
desc
;
if
(
var
->
nType
==
TSDB_DATA_TYPE_VALUE_ARRAY
)
{
qDebug
(
"VAL%d => [type:TS][val:[%"
PRIi64
"] - [%"
PRId64
"]]"
,
i
,
*
(
int64_t
*
)
field
->
data
,
*
(((
int64_t
*
)
field
->
data
)
+
1
));
}
else
{
qDebug
(
"VAL%d => [type:%d][val:%"
PRIi64
"]"
,
i
,
var
->
nType
,
var
->
i64
);
//TODO
}
}
}
else
{
qDebug
(
"VAL%d => [type:NIL][val:0x%"
PRIx64
"]"
,
i
,
*
(
int64_t
*
)
field
->
data
);
//TODO
}
}
qDebug
(
"Unit Num:%u"
,
info
->
unitNum
);
qDebug
(
"VALUE Field Num:%u"
,
info
->
fields
[
FLD_TYPE_VALUE
].
num
);
for
(
uint16_t
i
=
0
;
i
<
info
->
unitNum
;
++
i
)
{
for
(
uint16_t
i
=
0
;
i
<
info
->
fields
[
FLD_TYPE_VALUE
].
num
;
++
i
)
{
SFilterUnit
*
unit
=
&
info
->
units
[
i
];
SFilterField
*
field
=
&
info
->
fields
[
FLD_TYPE_VALUE
].
fields
[
i
];
int32_t
type
=
FILTER_UNIT_DATA_TYPE
(
unit
);
if
(
field
->
desc
)
{
int32_t
len
=
0
;
tVariant
*
var
=
field
->
desc
;
int32_t
tlen
=
0
;
if
(
var
->
nType
==
TSDB_DATA_TYPE_VALUE_ARRAY
)
{
char
str
[
128
]
=
{
0
};
qDebug
(
"VAL%d => [type:TS][val:[%"
PRIi64
"] - [%"
PRId64
"]]"
,
i
,
*
(
int64_t
*
)
field
->
data
,
*
(((
int64_t
*
)
field
->
data
)
+
1
));
}
else
{
SFilterField
*
left
=
FILTER_UNIT_LEFT_FIELD
(
info
,
unit
);
qDebug
(
"VAL%d => [type:%d][val:%"
PRIi64
"]"
,
i
,
var
->
nType
,
var
->
i64
);
//TODO
SSchema
*
sch
=
left
->
desc
;
}
len
=
sprintf
(
str
,
"UNIT[%d] => [%d][%s] %s ["
,
i
,
sch
->
colId
,
sch
->
name
,
gOptrStr
[
unit
->
compare
.
optr
].
str
);
}
else
{
qDebug
(
"VAL%d => [type:NIL][val:0x%"
PRIx64
"]"
,
i
,
*
(
int64_t
*
)
field
->
data
);
//TODO
}
}
if
(
unit
->
right
.
type
==
FLD_TYPE_VALUE
&&
FILTER_UNIT_OPTR
(
unit
)
!=
TSDB_RELATION_IN
)
{
qDebug
(
"UNIT Num:%u"
,
info
->
unitNum
);
SFilterField
*
right
=
FILTER_UNIT_RIGHT_FIELD
(
info
,
unit
);
for
(
uint16_t
i
=
0
;
i
<
info
->
unitNum
;
++
i
)
{
char
*
data
=
right
->
data
;
SFilterUnit
*
unit
=
&
info
->
units
[
i
];
if
(
IS_VAR_DATA_TYPE
(
type
))
{
int32_t
type
=
FILTER_UNIT_DATA_TYPE
(
unit
);
tlen
=
varDataLen
(
data
);
int32_t
len
=
0
;
data
+=
VARSTR_HEADER_SIZE
;
int32_t
tlen
=
0
;
char
str
[
128
]
=
{
0
};
SFilterField
*
left
=
FILTER_UNIT_LEFT_FIELD
(
info
,
unit
);
SSchema
*
sch
=
left
->
desc
;
len
=
sprintf
(
str
,
"UNIT[%d] => [%d][%s] %s ["
,
i
,
sch
->
colId
,
sch
->
name
,
gOptrStr
[
unit
->
compare
.
optr
].
str
);
if
(
unit
->
right
.
type
==
FLD_TYPE_VALUE
&&
FILTER_UNIT_OPTR
(
unit
)
!=
TSDB_RELATION_IN
)
{
SFilterField
*
right
=
FILTER_UNIT_RIGHT_FIELD
(
info
,
unit
);
char
*
data
=
right
->
data
;
if
(
IS_VAR_DATA_TYPE
(
type
))
{
tlen
=
varDataLen
(
data
);
data
+=
VARSTR_HEADER_SIZE
;
}
converToStr
(
str
+
len
,
type
,
data
,
tlen
,
&
tlen
);
}
else
{
strcat
(
str
,
"NULL"
);
}
strcat
(
str
,
"]"
);
qDebug
(
"%s"
,
str
);
//TODO
}
}
converToStr
(
str
+
len
,
type
,
data
,
tlen
,
&
tlen
);
}
else
{
qDebug
(
"GROUP Num:%u"
,
info
->
groupNum
);
strcat
(
str
,
"NULL"
);
for
(
uint16_t
i
=
0
;
i
<
info
->
groupNum
;
++
i
)
{
SFilterGroup
*
group
=
&
info
->
groups
[
i
];
qDebug
(
"Group%d : unit num[%u]"
,
i
,
group
->
unitNum
);
for
(
uint16_t
u
=
0
;
u
<
group
->
unitNum
;
++
u
)
{
qDebug
(
"unit id:%u"
,
group
->
unitIdxs
[
u
]);
}
}
return
;
}
}
strcat
(
str
,
"]"
);
qDebug
(
"%s"
,
str
);
//TODO
}
qDebug
(
"Group Num:%u"
,
info
->
groupNum
);
qDebug
(
"%s - RANGE info:"
,
msg
);
for
(
uint16_t
i
=
0
;
i
<
info
->
groupNum
;
++
i
)
{
SFilterGroup
*
group
=
&
info
->
groups
[
i
];
qDebug
(
"Group%d : unit num[%u]"
,
i
,
group
->
unitNum
);
for
(
uint16_t
u
=
0
;
u
<
group
->
unitNum
;
++
u
)
{
qDebug
(
"RANGE Num:%u"
,
info
->
colRangeNum
);
qDebug
(
"unit id:%u"
,
group
->
unitIdxs
[
u
]);
for
(
uint16_t
i
=
0
;
i
<
info
->
colRangeNum
;
++
i
)
{
SFilterRangeCtx
*
ctx
=
info
->
colRange
[
i
];
qDebug
(
"Column ID[%d] RANGE: isnull[%d],notnull[%d],range[%d]"
,
ctx
->
colId
,
ctx
->
isnull
,
ctx
->
notnull
,
ctx
->
isrange
);
if
(
ctx
->
isrange
)
{
SFilterRangeNode
*
r
=
ctx
->
rs
;
while
(
r
)
{
char
str
[
128
]
=
{
0
};
int32_t
tlen
=
0
;
if
(
FILTER_GET_FLAG
(
r
->
ra
.
sflag
,
RA_NULL
))
{
strcat
(
str
,
"(NULL)"
);
}
else
{
FILTER_GET_FLAG
(
r
->
ra
.
sflag
,
RA_EXCLUDE
)
?
strcat
(
str
,
"("
)
:
strcat
(
str
,
"["
);
converToStr
(
str
+
strlen
(
str
),
ctx
->
type
,
&
r
->
ra
.
s
,
tlen
,
&
tlen
);
FILTER_GET_FLAG
(
r
->
ra
.
sflag
,
RA_EXCLUDE
)
?
strcat
(
str
,
")"
)
:
strcat
(
str
,
"]"
);
}
strcat
(
str
,
" - "
);
if
(
FILTER_GET_FLAG
(
r
->
ra
.
eflag
,
RA_NULL
))
{
strcat
(
str
,
"(NULL)"
);
}
else
{
FILTER_GET_FLAG
(
r
->
ra
.
eflag
,
RA_EXCLUDE
)
?
strcat
(
str
,
"("
)
:
strcat
(
str
,
"["
);
converToStr
(
str
+
strlen
(
str
),
ctx
->
type
,
&
r
->
ra
.
e
,
tlen
,
&
tlen
);
FILTER_GET_FLAG
(
r
->
ra
.
eflag
,
RA_EXCLUDE
)
?
strcat
(
str
,
")"
)
:
strcat
(
str
,
"]"
);
}
qDebug
(
"range: %s"
,
str
);
r
=
r
->
next
;
}
}
}
}
}
}
}
}
...
@@ -1114,10 +1203,10 @@ void filterFreeColInfo(void *data) {
...
@@ -1114,10 +1203,10 @@ void filterFreeColInfo(void *data) {
return
;
return
;
}
}
if
(
info
->
type
==
RANGE_TYPE_
COL_RANGE
)
{
if
(
info
->
type
==
RANGE_TYPE_
VAR_HASH
)
{
tfree
(
info
->
info
);
//TODO
}
else
if
(
info
->
type
==
RANGE_TYPE_MR_CTX
)
{
}
else
if
(
info
->
type
==
RANGE_TYPE_MR_CTX
)
{
filterFree
MergeRange
(
info
->
info
);
filterFree
RangeCtx
(
info
->
info
);
}
else
if
(
info
->
type
==
RANGE_TYPE_UNIT
)
{
}
else
if
(
info
->
type
==
RANGE_TYPE_UNIT
)
{
taosArrayDestroy
((
SArray
*
)
info
->
info
);
taosArrayDestroy
((
SArray
*
)
info
->
info
);
}
}
...
@@ -1132,7 +1221,7 @@ void filterFreeColCtx(void *data) {
...
@@ -1132,7 +1221,7 @@ void filterFreeColCtx(void *data) {
SFilterColCtx
*
ctx
=
(
SFilterColCtx
*
)
data
;
SFilterColCtx
*
ctx
=
(
SFilterColCtx
*
)
data
;
if
(
ctx
->
ctx
)
{
if
(
ctx
->
ctx
)
{
filterFree
MergeRange
(
ctx
->
ctx
);
filterFree
RangeCtx
(
ctx
->
ctx
);
}
}
}
}
...
@@ -1259,7 +1348,7 @@ bool filterDoCompare(SFilterUnit *unit, void *left, void *right) {
...
@@ -1259,7 +1348,7 @@ bool filterDoCompare(SFilterUnit *unit, void *left, void *right) {
}
}
int32_t
filterAddUnitRange
(
SFilterInfo
*
info
,
SFilterUnit
*
u
,
SFilterR
M
Ctx
*
ctx
,
int32_t
optr
)
{
int32_t
filterAddUnitRange
(
SFilterInfo
*
info
,
SFilterUnit
*
u
,
SFilterR
ange
Ctx
*
ctx
,
int32_t
optr
)
{
int32_t
type
=
FILTER_UNIT_DATA_TYPE
(
u
);
int32_t
type
=
FILTER_UNIT_DATA_TYPE
(
u
);
uint8_t
uoptr
=
FILTER_UNIT_OPTR
(
u
);
uint8_t
uoptr
=
FILTER_UNIT_OPTR
(
u
);
void
*
val
=
FILTER_UNIT_VAL_DATA
(
info
,
u
);
void
*
val
=
FILTER_UNIT_VAL_DATA
(
info
,
u
);
...
@@ -1304,12 +1393,12 @@ int32_t filterAddUnitRange(SFilterInfo *info, SFilterUnit* u, SFilterRMCtx *ctx,
...
@@ -1304,12 +1393,12 @@ int32_t filterAddUnitRange(SFilterInfo *info, SFilterUnit* u, SFilterRMCtx *ctx,
assert
(
0
);
assert
(
0
);
}
}
filterAdd
Merge
Range
(
ctx
,
&
ra
,
optr
);
filterAddRange
(
ctx
,
&
ra
,
optr
);
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
int32_t
filterCompareR
MCtx
(
SFilterRMCtx
*
ctx1
,
SFilterRM
Ctx
*
ctx2
,
bool
*
equal
)
{
int32_t
filterCompareR
angeCtx
(
SFilterRangeCtx
*
ctx1
,
SFilterRange
Ctx
*
ctx2
,
bool
*
equal
)
{
CHK_JMP
(
ctx1
->
status
!=
ctx2
->
status
);
CHK_JMP
(
ctx1
->
status
!=
ctx2
->
status
);
CHK_JMP
(
ctx1
->
isnull
!=
ctx2
->
isnull
);
CHK_JMP
(
ctx1
->
isnull
!=
ctx2
->
isnull
);
CHK_JMP
(
ctx1
->
notnull
!=
ctx2
->
notnull
);
CHK_JMP
(
ctx1
->
notnull
!=
ctx2
->
notnull
);
...
@@ -1344,13 +1433,13 @@ int32_t filterMergeUnits(SFilterInfo *info, SFilterGroupCtx* gRes, uint16_t colI
...
@@ -1344,13 +1433,13 @@ int32_t filterMergeUnits(SFilterInfo *info, SFilterGroupCtx* gRes, uint16_t colI
SArray
*
colArray
=
(
SArray
*
)
gRes
->
colInfo
[
colIdx
].
info
;
SArray
*
colArray
=
(
SArray
*
)
gRes
->
colInfo
[
colIdx
].
info
;
int32_t
size
=
(
int32_t
)
taosArrayGetSize
(
colArray
);
int32_t
size
=
(
int32_t
)
taosArrayGetSize
(
colArray
);
int32_t
type
=
gRes
->
colInfo
[
colIdx
].
dataType
;
int32_t
type
=
gRes
->
colInfo
[
colIdx
].
dataType
;
SFilterR
MCtx
*
ctx
=
filterInitMergeRange
(
type
,
0
);
SFilterR
angeCtx
*
ctx
=
filterInitRangeCtx
(
type
,
0
);
for
(
uint32_t
i
=
0
;
i
<
size
;
++
i
)
{
for
(
uint32_t
i
=
0
;
i
<
size
;
++
i
)
{
SFilterUnit
*
u
=
taosArrayGetP
(
colArray
,
i
);
SFilterUnit
*
u
=
taosArrayGetP
(
colArray
,
i
);
uint8_t
optr
=
FILTER_UNIT_OPTR
(
u
);
uint8_t
optr
=
FILTER_UNIT_OPTR
(
u
);
filterAdd
Mer
geOptr
(
ctx
,
optr
,
TSDB_RELATION_AND
,
empty
,
NULL
);
filterAdd
Ran
geOptr
(
ctx
,
optr
,
TSDB_RELATION_AND
,
empty
,
NULL
);
CHK_JMP
(
*
empty
);
CHK_JMP
(
*
empty
);
if
(
!
FILTER_NO_MERGE_OPTR
(
optr
))
{
if
(
!
FILTER_NO_MERGE_OPTR
(
optr
))
{
...
@@ -1369,7 +1458,7 @@ _err_return:
...
@@ -1369,7 +1458,7 @@ _err_return:
*
empty
=
true
;
*
empty
=
true
;
filterFree
MergeRange
(
ctx
);
filterFree
RangeCtx
(
ctx
);
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
...
@@ -1446,7 +1535,7 @@ int32_t filterMergeGroupUnits(SFilterInfo *info, SFilterGroupCtx** gRes, int32_t
...
@@ -1446,7 +1535,7 @@ int32_t filterMergeGroupUnits(SFilterInfo *info, SFilterGroupCtx** gRes, int32_t
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
void
filterCheckCol
umns
(
SFilterGroupCtx
*
gRes1
,
SFilterGroupCtx
*
gRes2
,
bool
*
conflict
)
{
void
filterCheckCol
Conflict
(
SFilterGroupCtx
*
gRes1
,
SFilterGroupCtx
*
gRes2
,
bool
*
conflict
)
{
uint16_t
idx1
=
0
,
idx2
=
0
,
m
=
0
,
n
=
0
;
uint16_t
idx1
=
0
,
idx2
=
0
,
m
=
0
,
n
=
0
;
bool
equal
=
false
;
bool
equal
=
false
;
...
@@ -1487,20 +1576,20 @@ void filterCheckColumns(SFilterGroupCtx* gRes1, SFilterGroupCtx* gRes2, bool *co
...
@@ -1487,20 +1576,20 @@ void filterCheckColumns(SFilterGroupCtx* gRes1, SFilterGroupCtx* gRes2, bool *co
}
}
int32_t
filterMergeTwoGroupsImpl
(
SFilterInfo
*
info
,
SFilterR
M
Ctx
**
ctx
,
int32_t
optr
,
uint16_t
cidx
,
SFilterGroupCtx
*
gRes1
,
SFilterGroupCtx
*
gRes2
,
bool
*
empty
,
bool
*
all
)
{
int32_t
filterMergeTwoGroupsImpl
(
SFilterInfo
*
info
,
SFilterR
ange
Ctx
**
ctx
,
int32_t
optr
,
uint16_t
cidx
,
SFilterGroupCtx
*
gRes1
,
SFilterGroupCtx
*
gRes2
,
bool
*
empty
,
bool
*
all
)
{
SFilterField
*
fi
=
FILTER_GET_COL_FIELD
(
info
,
cidx
);
SFilterField
*
fi
=
FILTER_GET_COL_FIELD
(
info
,
cidx
);
int32_t
type
=
FILTER_GET_COL_FIELD_TYPE
(
fi
);
int32_t
type
=
FILTER_GET_COL_FIELD_TYPE
(
fi
);
if
((
*
ctx
)
==
NULL
)
{
if
((
*
ctx
)
==
NULL
)
{
*
ctx
=
filterInit
MergeRange
(
type
,
0
);
*
ctx
=
filterInit
RangeCtx
(
type
,
0
);
}
else
{
}
else
{
filterReuse
Merge
RangeCtx
(
*
ctx
,
type
,
0
);
filterReuseRangeCtx
(
*
ctx
,
type
,
0
);
}
}
assert
(
gRes2
->
colInfo
[
cidx
].
type
==
RANGE_TYPE_MR_CTX
);
assert
(
gRes2
->
colInfo
[
cidx
].
type
==
RANGE_TYPE_MR_CTX
);
assert
(
gRes1
->
colInfo
[
cidx
].
type
==
RANGE_TYPE_MR_CTX
);
assert
(
gRes1
->
colInfo
[
cidx
].
type
==
RANGE_TYPE_MR_CTX
);
filterCopy
Merge
RangeCtx
(
*
ctx
,
gRes2
->
colInfo
[
cidx
].
info
);
filterCopyRangeCtx
(
*
ctx
,
gRes2
->
colInfo
[
cidx
].
info
);
filterSourceRangeFromCtx
(
*
ctx
,
gRes1
->
colInfo
[
cidx
].
info
,
optr
,
empty
,
all
);
filterSourceRangeFromCtx
(
*
ctx
,
gRes1
->
colInfo
[
cidx
].
info
,
optr
,
empty
,
all
);
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
...
@@ -1510,7 +1599,7 @@ int32_t filterMergeTwoGroupsImpl(SFilterInfo *info, SFilterRMCtx **ctx, int32_t
...
@@ -1510,7 +1599,7 @@ int32_t filterMergeTwoGroupsImpl(SFilterInfo *info, SFilterRMCtx **ctx, int32_t
int32_t
filterMergeTwoGroups
(
SFilterInfo
*
info
,
SFilterGroupCtx
**
gRes1
,
SFilterGroupCtx
**
gRes2
,
bool
*
all
)
{
int32_t
filterMergeTwoGroups
(
SFilterInfo
*
info
,
SFilterGroupCtx
**
gRes1
,
SFilterGroupCtx
**
gRes2
,
bool
*
all
)
{
bool
conflict
=
false
;
bool
conflict
=
false
;
filterCheckCol
umns
(
*
gRes1
,
*
gRes2
,
&
conflict
);
filterCheckCol
Conflict
(
*
gRes1
,
*
gRes2
,
&
conflict
);
if
(
conflict
)
{
if
(
conflict
)
{
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
...
@@ -1521,7 +1610,7 @@ int32_t filterMergeTwoGroups(SFilterInfo *info, SFilterGroupCtx** gRes1, SFilter
...
@@ -1521,7 +1610,7 @@ int32_t filterMergeTwoGroups(SFilterInfo *info, SFilterGroupCtx** gRes1, SFilter
bool
numEqual
=
(
*
gRes1
)
->
colNum
==
(
*
gRes2
)
->
colNum
;
bool
numEqual
=
(
*
gRes1
)
->
colNum
==
(
*
gRes2
)
->
colNum
;
bool
equal
=
false
;
bool
equal
=
false
;
uint16_t
equal1
=
0
,
equal2
=
0
,
merNum
=
0
;
uint16_t
equal1
=
0
,
equal2
=
0
,
merNum
=
0
;
SFilterR
M
Ctx
*
ctx
=
NULL
;
SFilterR
ange
Ctx
*
ctx
=
NULL
;
SFilterColCtx
colCtx
=
{
0
};
SFilterColCtx
colCtx
=
{
0
};
SArray
*
colCtxs
=
taosArrayInit
((
*
gRes2
)
->
colNum
,
sizeof
(
SFilterColCtx
));
SArray
*
colCtxs
=
taosArrayInit
((
*
gRes2
)
->
colNum
,
sizeof
(
SFilterColCtx
));
...
@@ -1551,12 +1640,12 @@ int32_t filterMergeTwoGroups(SFilterInfo *info, SFilterGroupCtx** gRes1, SFilter
...
@@ -1551,12 +1640,12 @@ int32_t filterMergeTwoGroups(SFilterInfo *info, SFilterGroupCtx** gRes1, SFilter
taosArrayPush
(
colCtxs
,
&
colCtx
);
taosArrayPush
(
colCtxs
,
&
colCtx
);
break
;
break
;
}
else
{
}
else
{
filterCompareR
M
Ctx
(
ctx
,
(
*
gRes1
)
->
colInfo
[
idx1
].
info
,
&
equal
);
filterCompareR
ange
Ctx
(
ctx
,
(
*
gRes1
)
->
colInfo
[
idx1
].
info
,
&
equal
);
if
(
equal
)
{
if
(
equal
)
{
++
equal1
;
++
equal1
;
}
}
filterCompareR
M
Ctx
(
ctx
,
(
*
gRes2
)
->
colInfo
[
idx2
].
info
,
&
equal
);
filterCompareR
ange
Ctx
(
ctx
,
(
*
gRes2
)
->
colInfo
[
idx2
].
info
,
&
equal
);
if
(
equal
)
{
if
(
equal
)
{
++
equal2
;
++
equal2
;
}
}
...
@@ -1568,7 +1657,7 @@ int32_t filterMergeTwoGroups(SFilterInfo *info, SFilterGroupCtx** gRes1, SFilter
...
@@ -1568,7 +1657,7 @@ int32_t filterMergeTwoGroups(SFilterInfo *info, SFilterGroupCtx** gRes1, SFilter
taosArrayPush
(
colCtxs
,
&
colCtx
);
taosArrayPush
(
colCtxs
,
&
colCtx
);
}
}
}
else
{
}
else
{
filterCompareR
M
Ctx
(
ctx
,
(
*
gRes1
)
->
colInfo
[
idx1
].
info
,
&
equal
);
filterCompareR
ange
Ctx
(
ctx
,
(
*
gRes1
)
->
colInfo
[
idx1
].
info
,
&
equal
);
if
(
equal
)
{
if
(
equal
)
{
++
equal1
;
++
equal1
;
}
}
...
@@ -1616,7 +1705,7 @@ _err_return:
...
@@ -1616,7 +1705,7 @@ _err_return:
taosArrayDestroyEx
(
colCtxs
,
filterFreeColCtx
);
taosArrayDestroyEx
(
colCtxs
,
filterFreeColCtx
);
}
}
filterFree
MergeRange
(
ctx
);
filterFree
RangeCtx
(
ctx
);
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
...
@@ -1786,6 +1875,105 @@ int32_t filterRewrite(SFilterInfo *info, SFilterGroupCtx** gRes, int32_t gResNum
...
@@ -1786,6 +1875,105 @@ int32_t filterRewrite(SFilterInfo *info, SFilterGroupCtx** gRes, int32_t gResNum
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
int32_t
filterGenerateColRange
(
SFilterInfo
*
info
,
SFilterGroupCtx
**
gRes
,
int32_t
gResNum
)
{
uint16_t
*
idxs
=
NULL
;
uint16_t
colNum
=
0
;
SFilterGroupCtx
*
res
=
NULL
;
uint16_t
*
idxNum
=
calloc
(
info
->
fields
[
FLD_TYPE_COLUMN
].
num
,
sizeof
(
*
idxNum
));
for
(
int32_t
i
=
0
;
i
<
gResNum
;
++
i
)
{
for
(
uint16_t
m
=
0
;
m
<
gRes
[
i
]
->
colNum
;
++
m
)
{
SFilterColInfo
*
colInfo
=
&
gRes
[
i
]
->
colInfo
[
gRes
[
i
]
->
colIdx
[
m
]];
if
(
FILTER_NO_MERGE_DATA_TYPE
(
colInfo
->
dataType
))
{
continue
;
}
++
idxNum
[
gRes
[
i
]
->
colIdx
[
m
]];
}
}
for
(
uint16_t
i
=
0
;
i
<
info
->
fields
[
FLD_TYPE_COLUMN
].
num
;
++
i
)
{
if
(
idxNum
[
i
]
<
gResNum
)
{
continue
;
}
assert
(
idxNum
[
i
]
==
gResNum
);
if
(
idxs
==
NULL
)
{
idxs
=
calloc
(
info
->
fields
[
FLD_TYPE_COLUMN
].
num
,
sizeof
(
*
idxs
));
}
idxs
[
colNum
++
]
=
i
;
}
CHK_JMP
(
colNum
<=
0
);
info
->
colRangeNum
=
colNum
;
info
->
colRange
=
calloc
(
colNum
,
POINTER_BYTES
);
for
(
int32_t
i
=
0
;
i
<
gResNum
;
++
i
)
{
res
=
gRes
[
i
];
uint16_t
n
=
0
;
for
(
uint16_t
m
=
0
;
m
<
info
->
colRangeNum
;
++
m
)
{
for
(;
n
<
res
->
colNum
;
++
n
)
{
if
(
res
->
colIdx
[
n
]
<
idxs
[
m
])
{
continue
;
}
assert
(
res
->
colIdx
[
n
]
==
idxs
[
m
]);
SFilterColInfo
*
colInfo
=
&
res
->
colInfo
[
res
->
colIdx
[
n
]];
if
(
info
->
colRange
[
m
]
==
NULL
)
{
info
->
colRange
[
m
]
=
filterInitRangeCtx
(
colInfo
->
dataType
,
0
);
SFilterField
*
fi
=
FILTER_GET_COL_FIELD
(
info
,
res
->
colIdx
[
n
]);
info
->
colRange
[
m
]
->
colId
=
((
SSchema
*
)
fi
->
desc
)
->
colId
;
}
assert
(
colInfo
->
type
==
RANGE_TYPE_MR_CTX
);
bool
all
=
false
;
filterSourceRangeFromCtx
(
info
->
colRange
[
m
],
colInfo
->
info
,
TSDB_RELATION_OR
,
NULL
,
&
all
);
if
(
all
)
{
filterFreeRangeCtx
(
info
->
colRange
[
m
]);
info
->
colRange
[
m
]
=
NULL
;
if
(
m
<
(
info
->
colRangeNum
-
1
))
{
memmove
(
&
info
->
colRange
[
m
],
&
info
->
colRange
[
m
+
1
],
(
info
->
colRangeNum
-
m
-
1
)
*
POINTER_BYTES
);
memmove
(
&
idxs
[
m
],
&
idxs
[
m
+
1
],
(
info
->
colRangeNum
-
m
-
1
)
*
sizeof
(
*
idxs
));
}
--
info
->
colRangeNum
;
--
m
;
CHK_JMP
(
info
->
colRangeNum
<=
0
);
}
++
n
;
break
;
}
}
}
_err_return:
tfree
(
idxs
);
return
TSDB_CODE_SUCCESS
;
}
int32_t
filterPostProcessRange
(
SFilterInfo
*
info
)
{
for
(
uint16_t
i
=
0
;
i
<
info
->
colRangeNum
;
++
i
)
{
SFilterRangeCtx
*
ctx
=
info
->
colRange
[
i
];
SFilterRangeNode
*
r
=
ctx
->
rs
;
while
(
r
)
{
r
->
rc
.
func
=
filterGetRangeCompFunc
(
r
->
ra
.
sflag
,
r
->
ra
.
eflag
);
r
=
r
->
next
;
}
}
return
TSDB_CODE_SUCCESS
;
}
int32_t
filterPreprocess
(
SFilterInfo
*
info
)
{
int32_t
filterPreprocess
(
SFilterInfo
*
info
)
{
SFilterGroupCtx
**
gRes
=
calloc
(
info
->
groupNum
,
sizeof
(
SFilterGroupCtx
*
));
SFilterGroupCtx
**
gRes
=
calloc
(
info
->
groupNum
,
sizeof
(
SFilterGroupCtx
*
));
...
@@ -1805,9 +1993,13 @@ int32_t filterPreprocess(SFilterInfo *info) {
...
@@ -1805,9 +1993,13 @@ int32_t filterPreprocess(SFilterInfo *info) {
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
//TODO GET COLUMN RANGE
filterRewrite
(
info
,
gRes
,
gResNum
);
filterRewrite
(
info
,
gRes
,
gResNum
);
filterGenerateColRange
(
info
,
gRes
,
gResNum
);
filterDumpInfoToString
(
info
,
"Final"
,
1
);
filterPostProcessRange
(
info
);
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
...
@@ -1919,7 +2111,7 @@ int32_t filterInitFromTree(tExprNode* tree, SFilterInfo **pinfo, uint32_t option
...
@@ -1919,7 +2111,7 @@ int32_t filterInitFromTree(tExprNode* tree, SFilterInfo **pinfo, uint32_t option
ERR_JRET
(
filterInitValFieldData
(
info
));
ERR_JRET
(
filterInitValFieldData
(
info
));
if
(
!
FILTER_GET_FLAG
(
info
->
options
,
FI_OPTION_NO_REWRITE
))
{
if
(
!
FILTER_GET_FLAG
(
info
->
options
,
FI_OPTION_NO_REWRITE
))
{
filterDumpInfoToString
(
info
,
"Before preprocess"
);
filterDumpInfoToString
(
info
,
"Before preprocess"
,
0
);
ERR_JRET
(
filterPreprocess
(
info
));
ERR_JRET
(
filterPreprocess
(
info
));
...
@@ -1936,7 +2128,7 @@ int32_t filterInitFromTree(tExprNode* tree, SFilterInfo **pinfo, uint32_t option
...
@@ -1936,7 +2128,7 @@ int32_t filterInitFromTree(tExprNode* tree, SFilterInfo **pinfo, uint32_t option
info
->
unitRes
=
malloc
(
info
->
unitNum
*
sizeof
(
*
info
->
unitRes
));
info
->
unitRes
=
malloc
(
info
->
unitNum
*
sizeof
(
*
info
->
unitRes
));
info
->
unitFlags
=
malloc
(
info
->
unitNum
*
sizeof
(
*
info
->
unitFlags
));
info
->
unitFlags
=
malloc
(
info
->
unitNum
*
sizeof
(
*
info
->
unitFlags
));
filterDumpInfoToString
(
info
,
"Final"
);
filterDumpInfoToString
(
info
,
"Final"
,
0
);
taosArrayDestroy
(
group
);
taosArrayDestroy
(
group
);
...
@@ -1954,15 +2146,95 @@ _err_return:
...
@@ -1954,15 +2146,95 @@ _err_return:
return
code
;
return
code
;
}
}
FORCE_INLINE
bool
filterIsEmptyRes
(
SFilterInfo
*
info
)
{
if
(
info
==
NULL
)
{
return
false
;
}
return
FILTER_GET_FLAG
(
info
->
status
,
FI_STATUS_EMPTY
);
}
bool
filterRangeExecute
(
SFilterInfo
*
info
,
SDataStatis
*
pDataStatis
,
int32_t
numOfCols
,
int32_t
numOfRows
)
{
if
(
filterIsEmptyRes
(
info
))
{
return
false
;
}
bool
ret
=
true
;
void
*
minVal
,
*
maxVal
;
for
(
int32_t
k
=
0
;
k
<
info
->
colRangeNum
;
++
k
)
{
int32_t
index
=
-
1
;
SFilterRangeCtx
*
ctx
=
info
->
colRange
[
k
];
for
(
int32_t
i
=
0
;
i
<
numOfCols
;
++
i
)
{
if
(
pDataStatis
[
i
].
colId
==
ctx
->
colId
)
{
index
=
i
;
break
;
}
}
// no statistics data, load the true data block
if
(
index
==
-
1
)
{
return
true
;
}
// not support pre-filter operation on binary/nchar data type
if
(
!
IS_PREFILTER_TYPE
(
ctx
->
type
))
{
return
true
;
}
if
((
pDataStatis
[
index
].
numOfNull
<=
0
)
&&
(
ctx
->
isnull
&&
!
ctx
->
notnull
&&
!
ctx
->
isrange
))
{
return
false
;
}
// all data in current column are NULL, no need to check its boundary value
if
(
pDataStatis
[
index
].
numOfNull
==
numOfRows
)
{
// if isNULL query exists, load the null data column
if
((
ctx
->
notnull
||
ctx
->
isrange
)
&&
(
!
ctx
->
isnull
))
{
return
false
;
}
continue
;
}
SDataStatis
*
pDataBlockst
=
&
pDataStatis
[
index
];
SFilterRangeNode
r
=
ctx
->
rs
;
if
(
ctx
->
type
==
TSDB_DATA_TYPE_FLOAT
)
{
float
minv
=
(
float
)(
*
(
double
*
)(
&
pDataBlockst
->
min
));
float
maxv
=
(
float
)(
*
(
double
*
)(
&
pDataBlockst
->
max
));
minVal
=
&
minv
;
maxVal
=
&
maxv
;
}
else
{
minVal
=
&
pDataBlockst
->
min
;
maxVal
=
&
pDataBlockst
->
max
;
}
while
(
r
)
{
ret
=
r
->
rc
.
func
(
minVal
,
maxVal
,
&
r
->
rc
.
s
,
&
r
->
rc
.
e
,
ctx
->
pCompareFunc
);
CHK_RET
(
!
ret
,
ret
);
r
=
r
->
next
;
}
}
return
ret
;
}
int32_t
filterGetTimeRange
(
SFilterInfo
*
info
,
STimeWindow
*
win
)
{
int32_t
filterGetTimeRange
(
SFilterInfo
*
info
,
STimeWindow
*
win
)
{
SFilterRange
ra
=
{
0
};
SFilterRange
ra
=
{
0
};
SFilterR
MCtx
*
prev
=
filterInitMergeRange
(
TSDB_DATA_TYPE_TIMESTAMP
,
FI_OPTION_TIMESTAMP
);
SFilterR
angeCtx
*
prev
=
filterInitRangeCtx
(
TSDB_DATA_TYPE_TIMESTAMP
,
FI_OPTION_TIMESTAMP
);
SFilterR
MCtx
*
tmpc
=
filterInitMergeRange
(
TSDB_DATA_TYPE_TIMESTAMP
,
FI_OPTION_TIMESTAMP
);
SFilterR
angeCtx
*
tmpc
=
filterInitRangeCtx
(
TSDB_DATA_TYPE_TIMESTAMP
,
FI_OPTION_TIMESTAMP
);
SFilterR
M
Ctx
*
cur
=
NULL
;
SFilterR
ange
Ctx
*
cur
=
NULL
;
int32_t
num
=
0
;
int32_t
num
=
0
;
int32_t
optr
=
0
;
int32_t
optr
=
0
;
int32_t
code
=
TSDB_CODE_QRY_INVALID_TIME_CONDITION
;
int32_t
code
=
TSDB_CODE_QRY_INVALID_TIME_CONDITION
;
bool
empty
=
false
;
bool
empty
=
false
,
all
=
false
;
for
(
int32_t
i
=
0
;
i
<
info
->
groupNum
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
info
->
groupNum
;
++
i
)
{
SFilterGroup
*
group
=
&
info
->
groups
[
i
];
SFilterGroup
*
group
=
&
info
->
groups
[
i
];
...
@@ -1980,7 +2252,7 @@ int32_t filterGetTimeRange(SFilterInfo *info, STimeWindow *win) {
...
@@ -1980,7 +2252,7 @@ int32_t filterGetTimeRange(SFilterInfo *info, STimeWindow *win) {
uint8_t
raOptr
=
FILTER_UNIT_OPTR
(
unit
);
uint8_t
raOptr
=
FILTER_UNIT_OPTR
(
unit
);
filterAdd
Mer
geOptr
(
cur
,
raOptr
,
TSDB_RELATION_AND
,
&
empty
,
NULL
);
filterAdd
Ran
geOptr
(
cur
,
raOptr
,
TSDB_RELATION_AND
,
&
empty
,
NULL
);
CHK_JMP
(
empty
);
CHK_JMP
(
empty
);
if
(
FILTER_NO_MERGE_OPTR
(
raOptr
))
{
if
(
FILTER_NO_MERGE_OPTR
(
raOptr
))
{
...
@@ -1994,7 +2266,7 @@ int32_t filterGetTimeRange(SFilterInfo *info, STimeWindow *win) {
...
@@ -1994,7 +2266,7 @@ int32_t filterGetTimeRange(SFilterInfo *info, STimeWindow *win) {
SIMPLE_COPY_VALUES
(
&
ra
.
s
,
s
);
SIMPLE_COPY_VALUES
(
&
ra
.
s
,
s
);
SIMPLE_COPY_VALUES
(
&
ra
.
e
,
e
);
SIMPLE_COPY_VALUES
(
&
ra
.
e
,
e
);
filterAdd
Merge
Range
(
cur
,
&
ra
,
optr
);
filterAddRange
(
cur
,
&
ra
,
optr
);
}
}
if
(
cur
->
notnull
)
{
if
(
cur
->
notnull
)
{
...
@@ -2003,28 +2275,31 @@ int32_t filterGetTimeRange(SFilterInfo *info, STimeWindow *win) {
...
@@ -2003,28 +2275,31 @@ int32_t filterGetTimeRange(SFilterInfo *info, STimeWindow *win) {
}
}
if
(
group
->
unitNum
>
1
)
{
if
(
group
->
unitNum
>
1
)
{
filterAddMergeRangeCtx
(
prev
,
cur
,
TSDB_RELATION_OR
);
filterSourceRangeFromCtx
(
prev
,
cur
,
TSDB_RELATION_OR
,
&
empty
,
&
all
);
filterResetMergeRangeCtx
(
cur
);
filterResetRangeCtx
(
cur
);
if
(
all
)
{
break
;
}
}
}
}
}
if
(
prev
->
notnull
)
{
if
(
prev
->
notnull
)
{
*
win
=
TSWINDOW_INITIALIZER
;
*
win
=
TSWINDOW_INITIALIZER
;
}
else
{
}
else
{
filterGet
Merge
RangeNum
(
prev
,
&
num
);
filterGetRangeNum
(
prev
,
&
num
);
if
(
num
!=
1
)
{
if
(
num
!=
1
)
{
qError
(
"only one time range accepted, num:%d"
,
num
);
qError
(
"only one time range accepted, num:%d"
,
num
);
ERR_JRET
(
TSDB_CODE_QRY_INVALID_TIME_CONDITION
);
ERR_JRET
(
TSDB_CODE_QRY_INVALID_TIME_CONDITION
);
}
}
SFilterRange
tra
;
SFilterRange
tra
;
filterGet
Merge
RangeRes
(
prev
,
&
tra
);
filterGetRangeRes
(
prev
,
&
tra
);
win
->
skey
=
tra
.
s
;
win
->
skey
=
tra
.
s
;
win
->
ekey
=
tra
.
e
;
win
->
ekey
=
tra
.
e
;
}
}
filterFree
MergeRange
(
prev
);
filterFree
RangeCtx
(
prev
);
filterFree
MergeRange
(
tmpc
);
filterFree
RangeCtx
(
tmpc
);
qDebug
(
"qFilter time range:[%"
PRId64
"]-[%"
PRId64
"]"
,
win
->
skey
,
win
->
ekey
);
qDebug
(
"qFilter time range:[%"
PRId64
"]-[%"
PRId64
"]"
,
win
->
skey
,
win
->
ekey
);
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
...
@@ -2033,8 +2308,8 @@ _err_return:
...
@@ -2033,8 +2308,8 @@ _err_return:
*
win
=
TSWINDOW_DESC_INITIALIZER
;
*
win
=
TSWINDOW_DESC_INITIALIZER
;
filterFree
MergeRange
(
prev
);
filterFree
RangeCtx
(
prev
);
filterFree
MergeRange
(
tmpc
);
filterFree
RangeCtx
(
tmpc
);
qDebug
(
"qFilter time range:[%"
PRId64
"]-[%"
PRId64
"]"
,
win
->
skey
,
win
->
ekey
);
qDebug
(
"qFilter time range:[%"
PRId64
"]-[%"
PRId64
"]"
,
win
->
skey
,
win
->
ekey
);
...
...
src/query/tests/rangeMergeTest.cpp
浏览文件 @
8ed28fd8
...
@@ -11,7 +11,7 @@
...
@@ -11,7 +11,7 @@
#pragma GCC diagnostic ignored "-Wunused-variable"
#pragma GCC diagnostic ignored "-Wunused-variable"
extern
"C"
{
extern
"C"
{
extern
int32_t
filterAdd
Merge
Range
(
void
*
h
,
SFilterRange
*
ra
,
int32_t
optr
);
extern
int32_t
filterAddRange
(
void
*
h
,
SFilterRange
*
ra
,
int32_t
optr
);
}
}
namespace
{
namespace
{
...
@@ -46,86 +46,86 @@ void intDataTest() {
...
@@ -46,86 +46,86 @@ void intDataTest() {
e
=
e0
;
e
=
e0
;
asize
=
sizeof
(
s0
)
/
sizeof
(
s
[
0
]);
asize
=
sizeof
(
s0
)
/
sizeof
(
s
[
0
]);
memset
(
ra
,
0
,
sizeof
(
ra
));
memset
(
ra
,
0
,
sizeof
(
ra
));
h
=
filterInit
MergeRange
(
TSDB_DATA_TYPE_BIGINT
,
0
);
h
=
filterInit
RangeCtx
(
TSDB_DATA_TYPE_BIGINT
,
0
);
for
(
int32_t
i
=
0
;
i
<
asize
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
asize
;
++
i
)
{
ra
[
0
].
s
=
s
[
i
];
ra
[
0
].
s
=
s
[
i
];
ra
[
0
].
e
=
e
[
i
];
ra
[
0
].
e
=
e
[
i
];
filterAdd
Merge
Range
(
h
,
ra
,
TSDB_RELATION_AND
);
filterAddRange
(
h
,
ra
,
TSDB_RELATION_AND
);
}
}
filterGet
Merge
RangeNum
(
h
,
&
num
);
filterGetRangeNum
(
h
,
&
num
);
ASSERT_EQ
(
num
,
0
);
ASSERT_EQ
(
num
,
0
);
filterFree
MergeRange
(
h
);
filterFree
RangeCtx
(
h
);
memset
(
ra
,
0
,
sizeof
(
ra
));
memset
(
ra
,
0
,
sizeof
(
ra
));
h
=
filterInit
MergeRange
(
TSDB_DATA_TYPE_BIGINT
,
0
);
h
=
filterInit
RangeCtx
(
TSDB_DATA_TYPE_BIGINT
,
0
);
for
(
int32_t
i
=
0
;
i
<
asize
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
asize
;
++
i
)
{
ra
[
0
].
s
=
s
[
i
];
ra
[
0
].
s
=
s
[
i
];
ra
[
0
].
e
=
e
[
i
];
ra
[
0
].
e
=
e
[
i
];
filterAdd
Merge
Range
(
h
,
ra
,
TSDB_RELATION_OR
);
filterAddRange
(
h
,
ra
,
TSDB_RELATION_OR
);
}
}
filterGet
Merge
RangeNum
(
h
,
&
num
);
filterGetRangeNum
(
h
,
&
num
);
ASSERT_EQ
(
num
,
3
);
ASSERT_EQ
(
num
,
3
);
filterGet
Merge
RangeRes
(
h
,
ra
);
filterGetRangeRes
(
h
,
ra
);
ASSERT_EQ
(
ra
[
0
].
s
,
-
100
);
ASSERT_EQ
(
ra
[
0
].
s
,
-
100
);
ASSERT_EQ
(
ra
[
0
].
e
,
0
);
ASSERT_EQ
(
ra
[
0
].
e
,
0
);
ASSERT_EQ
(
ra
[
1
].
s
,
1
);
ASSERT_EQ
(
ra
[
1
].
s
,
1
);
ASSERT_EQ
(
ra
[
1
].
e
,
2
);
ASSERT_EQ
(
ra
[
1
].
e
,
2
);
ASSERT_EQ
(
ra
[
2
].
s
,
3
);
ASSERT_EQ
(
ra
[
2
].
s
,
3
);
ASSERT_EQ
(
ra
[
2
].
e
,
4
);
ASSERT_EQ
(
ra
[
2
].
e
,
4
);
filterFree
MergeRange
(
h
);
filterFree
RangeCtx
(
h
);
memset
(
ra
,
0
,
sizeof
(
ra
));
memset
(
ra
,
0
,
sizeof
(
ra
));
h
=
filterInit
MergeRange
(
TSDB_DATA_TYPE_BIGINT
,
FI_OPTION_TIMESTAMP
);
h
=
filterInit
RangeCtx
(
TSDB_DATA_TYPE_BIGINT
,
FI_OPTION_TIMESTAMP
);
for
(
int32_t
i
=
0
;
i
<
asize
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
asize
;
++
i
)
{
ra
[
0
].
s
=
s
[
i
];
ra
[
0
].
s
=
s
[
i
];
ra
[
0
].
e
=
e
[
i
];
ra
[
0
].
e
=
e
[
i
];
filterAdd
Merge
Range
(
h
,
ra
,
TSDB_RELATION_OR
);
filterAddRange
(
h
,
ra
,
TSDB_RELATION_OR
);
}
}
filterGet
Merge
RangeNum
(
h
,
&
num
);
filterGetRangeNum
(
h
,
&
num
);
ASSERT_EQ
(
num
,
1
);
ASSERT_EQ
(
num
,
1
);
filterGet
Merge
RangeRes
(
h
,
ra
);
filterGetRangeRes
(
h
,
ra
);
ASSERT_EQ
(
ra
[
0
].
s
,
-
100
);
ASSERT_EQ
(
ra
[
0
].
s
,
-
100
);
ASSERT_EQ
(
ra
[
0
].
e
,
4
);
ASSERT_EQ
(
ra
[
0
].
e
,
4
);
filterFree
MergeRange
(
h
);
filterFree
RangeCtx
(
h
);
s
=
s1
;
s
=
s1
;
e
=
e1
;
e
=
e1
;
asize
=
sizeof
(
s1
)
/
sizeof
(
s
[
0
]);
asize
=
sizeof
(
s1
)
/
sizeof
(
s
[
0
]);
memset
(
ra
,
0
,
sizeof
(
ra
));
memset
(
ra
,
0
,
sizeof
(
ra
));
h
=
filterInit
MergeRange
(
TSDB_DATA_TYPE_BIGINT
,
0
);
h
=
filterInit
RangeCtx
(
TSDB_DATA_TYPE_BIGINT
,
0
);
for
(
int32_t
i
=
0
;
i
<
asize
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
asize
;
++
i
)
{
ra
[
0
].
s
=
s
[
i
];
ra
[
0
].
s
=
s
[
i
];
ra
[
0
].
e
=
e
[
i
];
ra
[
0
].
e
=
e
[
i
];
filterAdd
Merge
Range
(
h
,
ra
,
TSDB_RELATION_AND
);
filterAddRange
(
h
,
ra
,
TSDB_RELATION_AND
);
}
}
filterGet
Merge
RangeNum
(
h
,
&
num
);
filterGetRangeNum
(
h
,
&
num
);
ASSERT_EQ
(
num
,
1
);
ASSERT_EQ
(
num
,
1
);
filterGet
Merge
RangeRes
(
h
,
ra
);
filterGetRangeRes
(
h
,
ra
);
ASSERT_EQ
(
ra
[
0
].
s
,
3
);
ASSERT_EQ
(
ra
[
0
].
s
,
3
);
ASSERT_EQ
(
ra
[
0
].
e
,
4
);
ASSERT_EQ
(
ra
[
0
].
e
,
4
);
filterFree
MergeRange
(
h
);
filterFree
RangeCtx
(
h
);
memset
(
ra
,
0
,
sizeof
(
ra
));
memset
(
ra
,
0
,
sizeof
(
ra
));
h
=
filterInit
MergeRange
(
TSDB_DATA_TYPE_BIGINT
,
0
);
h
=
filterInit
RangeCtx
(
TSDB_DATA_TYPE_BIGINT
,
0
);
for
(
int32_t
i
=
0
;
i
<
asize
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
asize
;
++
i
)
{
ra
[
0
].
s
=
s
[
i
];
ra
[
0
].
s
=
s
[
i
];
ra
[
0
].
e
=
e
[
i
];
ra
[
0
].
e
=
e
[
i
];
filterAdd
Merge
Range
(
h
,
ra
,
TSDB_RELATION_OR
);
filterAddRange
(
h
,
ra
,
TSDB_RELATION_OR
);
}
}
filterGet
Merge
RangeNum
(
h
,
&
num
);
filterGetRangeNum
(
h
,
&
num
);
ASSERT_EQ
(
num
,
1
);
ASSERT_EQ
(
num
,
1
);
filterGet
Merge
RangeRes
(
h
,
ra
);
filterGetRangeRes
(
h
,
ra
);
ASSERT_EQ
(
ra
[
0
].
s
,
INT64_MIN
);
ASSERT_EQ
(
ra
[
0
].
s
,
INT64_MIN
);
ASSERT_EQ
(
ra
[
0
].
e
,
100
);
ASSERT_EQ
(
ra
[
0
].
e
,
100
);
filterFree
MergeRange
(
h
);
filterFree
RangeCtx
(
h
);
...
@@ -133,93 +133,93 @@ void intDataTest() {
...
@@ -133,93 +133,93 @@ void intDataTest() {
e
=
e2
;
e
=
e2
;
asize
=
sizeof
(
s2
)
/
sizeof
(
s
[
0
]);
asize
=
sizeof
(
s2
)
/
sizeof
(
s
[
0
]);
memset
(
ra
,
0
,
sizeof
(
ra
));
memset
(
ra
,
0
,
sizeof
(
ra
));
h
=
filterInit
MergeRange
(
TSDB_DATA_TYPE_BIGINT
,
0
);
h
=
filterInit
RangeCtx
(
TSDB_DATA_TYPE_BIGINT
,
0
);
for
(
int32_t
i
=
0
;
i
<
asize
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
asize
;
++
i
)
{
ra
[
0
].
s
=
s
[
i
];
ra
[
0
].
s
=
s
[
i
];
ra
[
0
].
e
=
e
[
i
];
ra
[
0
].
e
=
e
[
i
];
filterAdd
Merge
Range
(
h
,
ra
,
TSDB_RELATION_AND
);
filterAddRange
(
h
,
ra
,
TSDB_RELATION_AND
);
}
}
filterGet
Merge
RangeNum
(
h
,
&
num
);
filterGetRangeNum
(
h
,
&
num
);
ASSERT_EQ
(
num
,
0
);
ASSERT_EQ
(
num
,
0
);
filterFree
MergeRange
(
h
);
filterFree
RangeCtx
(
h
);
memset
(
ra
,
0
,
sizeof
(
ra
));
memset
(
ra
,
0
,
sizeof
(
ra
));
h
=
filterInit
MergeRange
(
TSDB_DATA_TYPE_BIGINT
,
0
);
h
=
filterInit
RangeCtx
(
TSDB_DATA_TYPE_BIGINT
,
0
);
for
(
int32_t
i
=
0
;
i
<
asize
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
asize
;
++
i
)
{
ra
[
0
].
s
=
s
[
i
];
ra
[
0
].
s
=
s
[
i
];
ra
[
0
].
e
=
e
[
i
];
ra
[
0
].
e
=
e
[
i
];
filterAdd
Merge
Range
(
h
,
ra
,
TSDB_RELATION_OR
);
filterAddRange
(
h
,
ra
,
TSDB_RELATION_OR
);
}
}
filterGet
Merge
RangeNum
(
h
,
&
num
);
filterGetRangeNum
(
h
,
&
num
);
ASSERT_EQ
(
num
,
1
);
ASSERT_EQ
(
num
,
1
);
filterGet
Merge
RangeRes
(
h
,
ra
);
filterGetRangeRes
(
h
,
ra
);
ASSERT_EQ
(
ra
[
0
].
s
,
1
);
ASSERT_EQ
(
ra
[
0
].
s
,
1
);
ASSERT_EQ
(
ra
[
0
].
e
,
120
);
ASSERT_EQ
(
ra
[
0
].
e
,
120
);
filterFree
MergeRange
(
h
);
filterFree
RangeCtx
(
h
);
memset
(
ra
,
0
,
sizeof
(
ra
));
memset
(
ra
,
0
,
sizeof
(
ra
));
h
=
filterInit
MergeRange
(
TSDB_DATA_TYPE_BIGINT
,
0
);
h
=
filterInit
RangeCtx
(
TSDB_DATA_TYPE_BIGINT
,
0
);
for
(
int32_t
i
=
0
;
i
<
asize
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
asize
;
++
i
)
{
ra
[
0
].
s
=
s
[
i
];
ra
[
0
].
s
=
s
[
i
];
ra
[
0
].
e
=
e
[
i
];
ra
[
0
].
e
=
e
[
i
];
filterAdd
Merge
Range
(
h
,
ra
,
i
%
2
?
TSDB_RELATION_OR
:
TSDB_RELATION_AND
);
filterAddRange
(
h
,
ra
,
i
%
2
?
TSDB_RELATION_OR
:
TSDB_RELATION_AND
);
}
}
filterGet
Merge
RangeNum
(
h
,
&
num
);
filterGetRangeNum
(
h
,
&
num
);
ASSERT_EQ
(
num
,
0
);
ASSERT_EQ
(
num
,
0
);
filterFree
MergeRange
(
h
);
filterFree
RangeCtx
(
h
);
memset
(
ra
,
0
,
sizeof
(
ra
));
memset
(
ra
,
0
,
sizeof
(
ra
));
h
=
filterInit
MergeRange
(
TSDB_DATA_TYPE_BIGINT
,
0
);
h
=
filterInit
RangeCtx
(
TSDB_DATA_TYPE_BIGINT
,
0
);
for
(
int32_t
i
=
0
;
i
<
asize
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
asize
;
++
i
)
{
ra
[
0
].
s
=
s
[
i
];
ra
[
0
].
s
=
s
[
i
];
ra
[
0
].
e
=
e
[
i
];
ra
[
0
].
e
=
e
[
i
];
filterAdd
Merge
Range
(
h
,
ra
,
i
%
2
?
TSDB_RELATION_AND
:
TSDB_RELATION_OR
);
filterAddRange
(
h
,
ra
,
i
%
2
?
TSDB_RELATION_AND
:
TSDB_RELATION_OR
);
}
}
filterGet
Merge
RangeNum
(
h
,
&
num
);
filterGetRangeNum
(
h
,
&
num
);
ASSERT_EQ
(
num
,
1
);
ASSERT_EQ
(
num
,
1
);
filterGet
Merge
RangeRes
(
h
,
ra
);
filterGetRangeRes
(
h
,
ra
);
ASSERT_EQ
(
ra
[
0
].
s
,
70
);
ASSERT_EQ
(
ra
[
0
].
s
,
70
);
ASSERT_EQ
(
ra
[
0
].
e
,
120
);
ASSERT_EQ
(
ra
[
0
].
e
,
120
);
filterFree
MergeRange
(
h
);
filterFree
RangeCtx
(
h
);
s
=
s3
;
s
=
s3
;
e
=
e3
;
e
=
e3
;
asize
=
sizeof
(
s3
)
/
sizeof
(
s
[
0
]);
asize
=
sizeof
(
s3
)
/
sizeof
(
s
[
0
]);
memset
(
ra
,
0
,
sizeof
(
ra
));
memset
(
ra
,
0
,
sizeof
(
ra
));
h
=
filterInit
MergeRange
(
TSDB_DATA_TYPE_BIGINT
,
0
);
h
=
filterInit
RangeCtx
(
TSDB_DATA_TYPE_BIGINT
,
0
);
for
(
int32_t
i
=
0
;
i
<
asize
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
asize
;
++
i
)
{
ra
[
0
].
s
=
s
[
i
];
ra
[
0
].
s
=
s
[
i
];
ra
[
0
].
e
=
e
[
i
];
ra
[
0
].
e
=
e
[
i
];
filterAdd
Merge
Range
(
h
,
ra
,
TSDB_RELATION_AND
);
filterAddRange
(
h
,
ra
,
TSDB_RELATION_AND
);
}
}
filterGet
Merge
RangeNum
(
h
,
&
num
);
filterGetRangeNum
(
h
,
&
num
);
ASSERT_EQ
(
num
,
0
);
ASSERT_EQ
(
num
,
0
);
filterFree
MergeRange
(
h
);
filterFree
RangeCtx
(
h
);
memset
(
ra
,
0
,
sizeof
(
ra
));
memset
(
ra
,
0
,
sizeof
(
ra
));
h
=
filterInit
MergeRange
(
TSDB_DATA_TYPE_BIGINT
,
0
);
h
=
filterInit
RangeCtx
(
TSDB_DATA_TYPE_BIGINT
,
0
);
for
(
int32_t
i
=
0
;
i
<
asize
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
asize
;
++
i
)
{
ra
[
0
].
s
=
s
[
i
];
ra
[
0
].
s
=
s
[
i
];
ra
[
0
].
e
=
e
[
i
];
ra
[
0
].
e
=
e
[
i
];
filterAdd
Merge
Range
(
h
,
ra
,
TSDB_RELATION_OR
);
filterAddRange
(
h
,
ra
,
TSDB_RELATION_OR
);
}
}
filterGet
Merge
RangeNum
(
h
,
&
num
);
filterGetRangeNum
(
h
,
&
num
);
ASSERT_EQ
(
num
,
1
);
ASSERT_EQ
(
num
,
1
);
filterGet
Merge
RangeRes
(
h
,
ra
);
filterGetRangeRes
(
h
,
ra
);
ASSERT_EQ
(
ra
[
0
].
s
,
1
);
ASSERT_EQ
(
ra
[
0
].
s
,
1
);
ASSERT_EQ
(
ra
[
0
].
e
,
100
);
ASSERT_EQ
(
ra
[
0
].
e
,
100
);
filterFree
MergeRange
(
h
);
filterFree
RangeCtx
(
h
);
...
@@ -228,84 +228,84 @@ void intDataTest() {
...
@@ -228,84 +228,84 @@ void intDataTest() {
e
=
e4
;
e
=
e4
;
asize
=
sizeof
(
s4
)
/
sizeof
(
s
[
0
]);
asize
=
sizeof
(
s4
)
/
sizeof
(
s
[
0
]);
memset
(
ra
,
0
,
sizeof
(
ra
));
memset
(
ra
,
0
,
sizeof
(
ra
));
h
=
filterInit
MergeRange
(
TSDB_DATA_TYPE_BIGINT
,
0
);
h
=
filterInit
RangeCtx
(
TSDB_DATA_TYPE_BIGINT
,
0
);
for
(
int32_t
i
=
0
;
i
<
asize
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
asize
;
++
i
)
{
ra
[
0
].
s
=
s
[
i
];
ra
[
0
].
s
=
s
[
i
];
ra
[
0
].
e
=
e
[
i
];
ra
[
0
].
e
=
e
[
i
];
filterAdd
Merge
Range
(
h
,
ra
,
TSDB_RELATION_AND
);
filterAddRange
(
h
,
ra
,
TSDB_RELATION_AND
);
}
}
filterGet
Merge
RangeNum
(
h
,
&
num
);
filterGetRangeNum
(
h
,
&
num
);
ASSERT_EQ
(
num
,
0
);
ASSERT_EQ
(
num
,
0
);
filterFree
MergeRange
(
h
);
filterFree
RangeCtx
(
h
);
memset
(
ra
,
0
,
sizeof
(
ra
));
memset
(
ra
,
0
,
sizeof
(
ra
));
h
=
filterInit
MergeRange
(
TSDB_DATA_TYPE_BIGINT
,
0
);
h
=
filterInit
RangeCtx
(
TSDB_DATA_TYPE_BIGINT
,
0
);
for
(
int32_t
i
=
0
;
i
<
asize
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
asize
;
++
i
)
{
ra
[
0
].
s
=
s
[
i
];
ra
[
0
].
s
=
s
[
i
];
ra
[
0
].
e
=
e
[
i
];
ra
[
0
].
e
=
e
[
i
];
filterAdd
Merge
Range
(
h
,
ra
,
TSDB_RELATION_OR
);
filterAddRange
(
h
,
ra
,
TSDB_RELATION_OR
);
}
}
filterGet
Merge
RangeNum
(
h
,
&
num
);
filterGetRangeNum
(
h
,
&
num
);
ASSERT_EQ
(
num
,
2
);
ASSERT_EQ
(
num
,
2
);
filterGet
Merge
RangeRes
(
h
,
ra
);
filterGetRangeRes
(
h
,
ra
);
ASSERT_EQ
(
ra
[
0
].
s
,
0
);
ASSERT_EQ
(
ra
[
0
].
s
,
0
);
ASSERT_EQ
(
ra
[
0
].
e
,
5
);
ASSERT_EQ
(
ra
[
0
].
e
,
5
);
ASSERT_EQ
(
ra
[
1
].
s
,
10
);
ASSERT_EQ
(
ra
[
1
].
s
,
10
);
ASSERT_EQ
(
ra
[
1
].
e
,
20
);
ASSERT_EQ
(
ra
[
1
].
e
,
20
);
filterFree
MergeRange
(
h
);
filterFree
RangeCtx
(
h
);
s
=
s5
;
s
=
s5
;
e
=
e5
;
e
=
e5
;
asize
=
sizeof
(
s5
)
/
sizeof
(
s
[
0
]);
asize
=
sizeof
(
s5
)
/
sizeof
(
s
[
0
]);
memset
(
ra
,
0
,
sizeof
(
ra
));
memset
(
ra
,
0
,
sizeof
(
ra
));
h
=
filterInit
MergeRange
(
TSDB_DATA_TYPE_BIGINT
,
0
);
h
=
filterInit
RangeCtx
(
TSDB_DATA_TYPE_BIGINT
,
0
);
for
(
int32_t
i
=
0
;
i
<
asize
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
asize
;
++
i
)
{
ra
[
0
].
s
=
s
[
i
];
ra
[
0
].
s
=
s
[
i
];
ra
[
0
].
e
=
e
[
i
];
ra
[
0
].
e
=
e
[
i
];
filterAdd
Merge
Range
(
h
,
ra
,
TSDB_RELATION_AND
);
filterAddRange
(
h
,
ra
,
TSDB_RELATION_AND
);
}
}
filterGet
Merge
RangeNum
(
h
,
&
num
);
filterGetRangeNum
(
h
,
&
num
);
ASSERT_EQ
(
num
,
0
);
ASSERT_EQ
(
num
,
0
);
filterFree
MergeRange
(
h
);
filterFree
RangeCtx
(
h
);
memset
(
ra
,
0
,
sizeof
(
ra
));
memset
(
ra
,
0
,
sizeof
(
ra
));
h
=
filterInit
MergeRange
(
TSDB_DATA_TYPE_BIGINT
,
0
);
h
=
filterInit
RangeCtx
(
TSDB_DATA_TYPE_BIGINT
,
0
);
for
(
int32_t
i
=
0
;
i
<
asize
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
asize
;
++
i
)
{
ra
[
0
].
s
=
s
[
i
];
ra
[
0
].
s
=
s
[
i
];
ra
[
0
].
e
=
e
[
i
];
ra
[
0
].
e
=
e
[
i
];
filterAdd
Merge
Range
(
h
,
ra
,
TSDB_RELATION_OR
);
filterAddRange
(
h
,
ra
,
TSDB_RELATION_OR
);
}
}
filterGet
Merge
RangeNum
(
h
,
&
num
);
filterGetRangeNum
(
h
,
&
num
);
ASSERT_EQ
(
num
,
2
);
ASSERT_EQ
(
num
,
2
);
filterGet
Merge
RangeRes
(
h
,
ra
);
filterGetRangeRes
(
h
,
ra
);
ASSERT_EQ
(
ra
[
0
].
s
,
0
);
ASSERT_EQ
(
ra
[
0
].
s
,
0
);
ASSERT_EQ
(
ra
[
0
].
e
,
4
);
ASSERT_EQ
(
ra
[
0
].
e
,
4
);
ASSERT_EQ
(
ra
[
1
].
s
,
6
);
ASSERT_EQ
(
ra
[
1
].
s
,
6
);
ASSERT_EQ
(
ra
[
1
].
e
,
20
);
ASSERT_EQ
(
ra
[
1
].
e
,
20
);
filterFree
MergeRange
(
h
);
filterFree
RangeCtx
(
h
);
memset
(
ra
,
0
,
sizeof
(
ra
));
memset
(
ra
,
0
,
sizeof
(
ra
));
h
=
filterInit
MergeRange
(
TSDB_DATA_TYPE_BIGINT
,
0
);
h
=
filterInit
RangeCtx
(
TSDB_DATA_TYPE_BIGINT
,
0
);
for
(
int32_t
i
=
0
;
i
<
asize
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
asize
;
++
i
)
{
ra
[
0
].
s
=
s
[
i
];
ra
[
0
].
s
=
s
[
i
];
ra
[
0
].
e
=
e
[
i
];
ra
[
0
].
e
=
e
[
i
];
filterAdd
Merge
Range
(
h
,
ra
,
(
i
==
(
asize
-
1
))
?
TSDB_RELATION_AND
:
TSDB_RELATION_OR
);
filterAddRange
(
h
,
ra
,
(
i
==
(
asize
-
1
))
?
TSDB_RELATION_AND
:
TSDB_RELATION_OR
);
}
}
filterGet
Merge
RangeNum
(
h
,
&
num
);
filterGetRangeNum
(
h
,
&
num
);
ASSERT_EQ
(
num
,
1
);
ASSERT_EQ
(
num
,
1
);
filterGet
Merge
RangeRes
(
h
,
ra
);
filterGetRangeRes
(
h
,
ra
);
ASSERT_EQ
(
ra
[
0
].
s
,
7
);
ASSERT_EQ
(
ra
[
0
].
s
,
7
);
ASSERT_EQ
(
ra
[
0
].
e
,
10
);
ASSERT_EQ
(
ra
[
0
].
e
,
10
);
filterFree
MergeRange
(
h
);
filterFree
RangeCtx
(
h
);
...
@@ -315,7 +315,7 @@ void intDataTest() {
...
@@ -315,7 +315,7 @@ void intDataTest() {
e
=
e6
;
e
=
e6
;
asize
=
sizeof
(
s6
)
/
sizeof
(
s
[
0
]);
asize
=
sizeof
(
s6
)
/
sizeof
(
s
[
0
]);
memset
(
ra
,
0
,
sizeof
(
ra
));
memset
(
ra
,
0
,
sizeof
(
ra
));
h
=
filterInit
MergeRange
(
TSDB_DATA_TYPE_BIGINT
,
0
);
h
=
filterInit
RangeCtx
(
TSDB_DATA_TYPE_BIGINT
,
0
);
for
(
int32_t
i
=
0
;
i
<
asize
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
asize
;
++
i
)
{
ra
[
0
].
eflag
=
1
;
ra
[
0
].
eflag
=
1
;
ra
[
1
].
sflag
=
4
;
ra
[
1
].
sflag
=
4
;
...
@@ -323,16 +323,16 @@ void intDataTest() {
...
@@ -323,16 +323,16 @@ void intDataTest() {
ra
[
i
].
s
=
s
[
i
];
ra
[
i
].
s
=
s
[
i
];
ra
[
i
].
e
=
e
[
i
];
ra
[
i
].
e
=
e
[
i
];
filterAdd
Merge
Range
(
h
,
ra
+
i
,
TSDB_RELATION_AND
);
filterAddRange
(
h
,
ra
+
i
,
TSDB_RELATION_AND
);
}
}
filterGet
Merge
RangeNum
(
h
,
&
num
);
filterGetRangeNum
(
h
,
&
num
);
ASSERT_EQ
(
num
,
0
);
ASSERT_EQ
(
num
,
0
);
filterFree
MergeRange
(
h
);
filterFree
RangeCtx
(
h
);
memset
(
ra
,
0
,
sizeof
(
ra
));
memset
(
ra
,
0
,
sizeof
(
ra
));
h
=
filterInit
MergeRange
(
TSDB_DATA_TYPE_BIGINT
,
0
);
h
=
filterInit
RangeCtx
(
TSDB_DATA_TYPE_BIGINT
,
0
);
for
(
int32_t
i
=
0
;
i
<
asize
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
asize
;
++
i
)
{
ra
[
0
].
eflag
=
1
;
ra
[
0
].
eflag
=
1
;
ra
[
1
].
sflag
=
1
;
ra
[
1
].
sflag
=
1
;
...
@@ -340,9 +340,9 @@ void intDataTest() {
...
@@ -340,9 +340,9 @@ void intDataTest() {
ra
[
i
].
s
=
s
[
i
];
ra
[
i
].
s
=
s
[
i
];
ra
[
i
].
e
=
e
[
i
];
ra
[
i
].
e
=
e
[
i
];
filterAdd
Merge
Range
(
h
,
ra
+
i
,
TSDB_RELATION_OR
);
filterAddRange
(
h
,
ra
+
i
,
TSDB_RELATION_OR
);
}
}
filterGet
Merge
RangeNum
(
h
,
&
num
);
filterGetRangeNum
(
h
,
&
num
);
ASSERT_EQ
(
num
,
2
);
ASSERT_EQ
(
num
,
2
);
ASSERT_EQ
(
ra
[
0
].
s
,
0
);
ASSERT_EQ
(
ra
[
0
].
s
,
0
);
ASSERT_EQ
(
ra
[
0
].
e
,
4
);
ASSERT_EQ
(
ra
[
0
].
e
,
4
);
...
@@ -350,7 +350,7 @@ void intDataTest() {
...
@@ -350,7 +350,7 @@ void intDataTest() {
ASSERT_EQ
(
ra
[
1
].
s
,
4
);
ASSERT_EQ
(
ra
[
1
].
s
,
4
);
ASSERT_EQ
(
ra
[
1
].
e
,
6
);
ASSERT_EQ
(
ra
[
1
].
e
,
6
);
ASSERT_EQ
(
ra
[
1
].
sflag
,
1
);
ASSERT_EQ
(
ra
[
1
].
sflag
,
1
);
filterFree
MergeRange
(
h
);
filterFree
RangeCtx
(
h
);
}
}
...
...
tests/script/general/parser/condition.sim
浏览文件 @
8ed28fd8
...
@@ -174,6 +174,7 @@ if $rows != 0 then
...
@@ -174,6 +174,7 @@ if $rows != 0 then
return -1
return -1
endi
endi
#xxx
sql select * from stb1 where c8 = '51' or c8 != '51';
sql select * from stb1 where c8 = '51' or c8 != '51';
if $rows != 28 then
if $rows != 28 then
return -1
return -1
...
@@ -1072,6 +1073,34 @@ endi
...
@@ -1072,6 +1073,34 @@ endi
if $data01 != NULL then
if $data01 != NULL then
return -1
return -1
endi
endi
#xxx
sql select * from stb1 where c8 like '1';
if $rows != 1 then
return -1
endi
if $data00 != @21-05-05 18:19:00.000@ then
return -1
endi
#xxx
sql select * from stb1 where c8 like '1%' and c8 like '%1';
if $rows != 2 then
return -1
endi
if $data00 != @21-05-05 18:19:00.000@ then
return -1
endi
if $data10 != @21-05-05 18:19:04.000@ then
return -1
endi
#xxx
sql select * from stb1 where c8 like '1' and c8 like '2';
if $rows != 0 then
return -1
endi
sql select * from stb1 where c9 is null;
sql select * from stb1 where c9 is null;
if $rows != 1 then
if $rows != 1 then
return -1
return -1
...
@@ -1817,6 +1846,48 @@ if $data20 != @21-05-05 18:19:12.000@ then
...
@@ -1817,6 +1846,48 @@ if $data20 != @21-05-05 18:19:12.000@ then
return -1
return -1
endi
endi
sql select * from stb1 where c1 > 40 and c2 > 50 and c3 > 62 or c1 < 2 and c2 < 3;
if $rows != 3 then
return -1
endi
if $data00 != @21-05-05 18:19:00.000@ then
return -1
endi
if $data10 != @21-05-05 18:19:26.000@ then
return -1
endi
if $data20 != @21-05-05 18:19:27.000@ then
return -1
endi
sql select * from stb1 where (c1 > 3 and c2 > 4) or (c1 < 60 and c2 < 30);
if $rows != 28 then
return -1
endi
sql select * from stb1 where (c1 > 3 and c2 > 4) or (c1 < 60 and c2 < 30) or (c1 is null and c2 is null);
if $rows != 29 then
return -1
endi
sql select * from stb1 where (c1 > 3 and c2 > 4) or (c1 < 60 and c3 < 30) or (c1 is null and c2 is null);
if $rows != 29 then
return -1
endi
sql select * from stb1 where (c1 > 60 and c2 < 63) or (c1 >62 and c3 < 30) or (c1 is null and c2 is null);
if $rows != 3 then
return -1
endi
if $data00 != @21-05-05 18:19:24.000@ then
return -1
endi
if $data10 != @21-05-05 18:19:25.000@ then
return -1
endi
if $data20 != @21-05-05 18:19:28.000@ then
return -1
endi
print "ts test"
print "ts test"
sql_error select ts,c1,c7 from stb1 where ts != '2021-05-05 18:19:27'
sql_error select ts,c1,c7 from stb1 where ts != '2021-05-05 18:19:27'
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录