Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
8ed28fd8
T
TDengine
项目概览
taosdata
/
TDengine
11 个月 前同步成功
通知
1178
Star
22014
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
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 {
enum
{
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
{
FI_OPTION_NO_REWRITE
=
1
,
FI_OPTION_TIMESTAMP
=
2
,
...
...
@@ -63,7 +67,7 @@ enum {
enum
{
RANGE_TYPE_UNIT
=
1
,
RANGE_TYPE_
COL_RANGE
=
2
,
RANGE_TYPE_
VAR_HASH
=
2
,
RANGE_TYPE_MR_CTX
=
3
,
};
...
...
@@ -73,10 +77,10 @@ typedef struct OptrStr {
}
OptrStr
;
typedef
struct
SFilterRange
{
char
sflag
;
char
eflag
;
int64_t
s
;
int64_t
e
;
char
sflag
;
char
eflag
;
}
SFilterRange
;
typedef
struct
SFilterColRange
{
...
...
@@ -87,30 +91,51 @@ typedef struct SFilterColRange {
SFilterRange
ra
;
}
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
{
struct
SFilterRangeNode
*
prev
;
struct
SFilterRangeNode
*
next
;
SFilterRange
ra
;
union
{
SFilterRange
ra
;
SFilterRangeCompare
rc
;
};
}
SFilterRangeNode
;
typedef
struct
SFilterR
M
Ctx
{
typedef
struct
SFilterR
ange
Ctx
{
int32_t
type
;
int32_t
options
;
int8_t
status
;
bool
isnull
;
bool
notnull
;
bool
isrange
;
int16_t
colId
;
__compar_fn_t
pCompareFunc
;
SFilterRangeNode
*
rf
;
//freed
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
{
uint16_t
flag
;
void
*
desc
;
void
*
data
;
int64_t
range
[];
}
SFilterField
;
typedef
struct
SFilterFields
{
...
...
@@ -172,11 +197,13 @@ typedef struct SFilterInfo {
uint16_t
unitSize
;
uint16_t
unitNum
;
uint16_t
groupNum
;
uint16_t
colRangeNum
;
SFilterFields
fields
[
FLD_TYPE_MAX
];
SFilterGroup
*
groups
;
SFilterUnit
*
units
;
uint8_t
*
unitRes
;
// result
uint8_t
*
unitFlags
;
// got result
SFilterRangeCtx
**
colRange
;
SFilterPCtx
pctx
;
}
SFilterInfo
;
...
...
@@ -245,7 +272,7 @@ typedef struct SFilterInfo {
#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_
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_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 *);
extern
int32_t
filterInitFromTree
(
tExprNode
*
tree
,
SFilterInfo
**
pinfo
,
uint32_t
options
);
extern
bool
filterExecute
(
SFilterInfo
*
info
,
int32_t
numOfRows
,
int8_t
*
p
);
extern
int32_t
filterSetColFieldData
(
SFilterInfo
*
info
,
int16_t
colId
,
void
*
data
);
extern
void
*
filterInit
MergeRange
(
int32_t
type
,
int32_t
options
);
extern
int32_t
filterGet
Merge
RangeNum
(
void
*
h
,
int32_t
*
num
);
extern
int32_t
filterGet
Merge
RangeRes
(
void
*
h
,
SFilterRange
*
ra
);
extern
int32_t
filterFree
MergeRange
(
void
*
h
);
extern
void
*
filterInit
RangeCtx
(
int32_t
type
,
int32_t
options
);
extern
int32_t
filterGetRangeNum
(
void
*
h
,
int32_t
*
num
);
extern
int32_t
filterGetRangeRes
(
void
*
h
,
SFilterRange
*
ra
);
extern
int32_t
filterFree
RangeCtx
(
void
*
h
);
extern
int32_t
filterGetTimeRange
(
SFilterInfo
*
info
,
STimeWindow
*
win
);
extern
int32_t
filterConverNcharColumns
(
SFilterInfo
*
pFilterInfo
,
int32_t
rows
,
bool
*
gotNchar
);
extern
int32_t
filterFreeNcharColumns
(
SFilterInfo
*
pFilterInfo
);
extern
void
filterFreeInfo
(
SFilterInfo
*
info
);
extern
bool
filterIsEmptyRes
(
SFilterInfo
*
info
);
#ifdef __cplusplus
}
...
...
src/query/src/qExecutor.c
浏览文件 @
8ed28fd8
...
...
@@ -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)
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
;
if
(
pDataStatis
==
NULL
||
pQueryAttr
->
numOfFilterCols
==
0
)
{
if
(
pDataStatis
==
NULL
||
pQueryAttr
->
pFilters
==
NULL
)
{
return
true
;
}
bool
ret
=
true
;
for
(
int32_t
k
=
0
;
k
<
pQueryAttr
->
numOfFilterCols
;
++
k
)
{
SSingleColumnFilterInfo
*
pFilterInfo
=
&
pQueryAttr
->
pFilterInfo
[
k
];
int32_t
index
=
-
1
;
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
;
return
filterRangeExecute
(
pQueryAttr
->
pFilters
,
pDataStatis
,
numOfRows
);
}
static
bool
overlapWithTimeWindow
(
SQueryAttr
*
pQueryAttr
,
SDataBlockInfo
*
pBlockInfo
)
{
...
...
src/query/src/qFilter.c
浏览文件 @
8ed28fd8
此差异已折叠。
点击以展开。
src/query/tests/rangeMergeTest.cpp
浏览文件 @
8ed28fd8
...
...
@@ -11,7 +11,7 @@
#pragma GCC diagnostic ignored "-Wunused-variable"
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
{
...
...
@@ -46,86 +46,86 @@ void intDataTest() {
e
=
e0
;
asize
=
sizeof
(
s0
)
/
sizeof
(
s
[
0
]);
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
)
{
ra
[
0
].
s
=
s
[
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
);
filterFree
MergeRange
(
h
);
filterFree
RangeCtx
(
h
);
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
)
{
ra
[
0
].
s
=
s
[
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
);
filterGet
Merge
RangeRes
(
h
,
ra
);
filterGetRangeRes
(
h
,
ra
);
ASSERT_EQ
(
ra
[
0
].
s
,
-
100
);
ASSERT_EQ
(
ra
[
0
].
e
,
0
);
ASSERT_EQ
(
ra
[
1
].
s
,
1
);
ASSERT_EQ
(
ra
[
1
].
e
,
2
);
ASSERT_EQ
(
ra
[
2
].
s
,
3
);
ASSERT_EQ
(
ra
[
2
].
e
,
4
);
filterFree
MergeRange
(
h
);
filterFree
RangeCtx
(
h
);
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
)
{
ra
[
0
].
s
=
s
[
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
);
filterGet
Merge
RangeRes
(
h
,
ra
);
filterGetRangeRes
(
h
,
ra
);
ASSERT_EQ
(
ra
[
0
].
s
,
-
100
);
ASSERT_EQ
(
ra
[
0
].
e
,
4
);
filterFree
MergeRange
(
h
);
filterFree
RangeCtx
(
h
);
s
=
s1
;
e
=
e1
;
asize
=
sizeof
(
s1
)
/
sizeof
(
s
[
0
]);
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
)
{
ra
[
0
].
s
=
s
[
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
);
filterGet
Merge
RangeRes
(
h
,
ra
);
filterGetRangeRes
(
h
,
ra
);
ASSERT_EQ
(
ra
[
0
].
s
,
3
);
ASSERT_EQ
(
ra
[
0
].
e
,
4
);
filterFree
MergeRange
(
h
);
filterFree
RangeCtx
(
h
);
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
)
{
ra
[
0
].
s
=
s
[
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
);
filterGet
Merge
RangeRes
(
h
,
ra
);
filterGetRangeRes
(
h
,
ra
);
ASSERT_EQ
(
ra
[
0
].
s
,
INT64_MIN
);
ASSERT_EQ
(
ra
[
0
].
e
,
100
);
filterFree
MergeRange
(
h
);
filterFree
RangeCtx
(
h
);
...
...
@@ -133,93 +133,93 @@ void intDataTest() {
e
=
e2
;
asize
=
sizeof
(
s2
)
/
sizeof
(
s
[
0
]);
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
)
{
ra
[
0
].
s
=
s
[
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
);
filterFree
MergeRange
(
h
);
filterFree
RangeCtx
(
h
);
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
)
{
ra
[
0
].
s
=
s
[
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
);
filterGet
Merge
RangeRes
(
h
,
ra
);
filterGetRangeRes
(
h
,
ra
);
ASSERT_EQ
(
ra
[
0
].
s
,
1
);
ASSERT_EQ
(
ra
[
0
].
e
,
120
);
filterFree
MergeRange
(
h
);
filterFree
RangeCtx
(
h
);
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
)
{
ra
[
0
].
s
=
s
[
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
);
filterFree
MergeRange
(
h
);
filterFree
RangeCtx
(
h
);
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
)
{
ra
[
0
].
s
=
s
[
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
);
filterGet
Merge
RangeRes
(
h
,
ra
);
filterGetRangeRes
(
h
,
ra
);
ASSERT_EQ
(
ra
[
0
].
s
,
70
);
ASSERT_EQ
(
ra
[
0
].
e
,
120
);
filterFree
MergeRange
(
h
);
filterFree
RangeCtx
(
h
);
s
=
s3
;
e
=
e3
;
asize
=
sizeof
(
s3
)
/
sizeof
(
s
[
0
]);
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
)
{
ra
[
0
].
s
=
s
[
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
);
filterFree
MergeRange
(
h
);
filterFree
RangeCtx
(
h
);
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
)
{
ra
[
0
].
s
=
s
[
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
);
filterGet
Merge
RangeRes
(
h
,
ra
);
filterGetRangeRes
(
h
,
ra
);
ASSERT_EQ
(
ra
[
0
].
s
,
1
);
ASSERT_EQ
(
ra
[
0
].
e
,
100
);
filterFree
MergeRange
(
h
);
filterFree
RangeCtx
(
h
);
...
...
@@ -228,84 +228,84 @@ void intDataTest() {
e
=
e4
;
asize
=
sizeof
(
s4
)
/
sizeof
(
s
[
0
]);
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
)
{
ra
[
0
].
s
=
s
[
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
);
filterFree
MergeRange
(
h
);
filterFree
RangeCtx
(
h
);
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
)
{
ra
[
0
].
s
=
s
[
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
);
filterGet
Merge
RangeRes
(
h
,
ra
);
filterGetRangeRes
(
h
,
ra
);
ASSERT_EQ
(
ra
[
0
].
s
,
0
);
ASSERT_EQ
(
ra
[
0
].
e
,
5
);
ASSERT_EQ
(
ra
[
1
].
s
,
10
);
ASSERT_EQ
(
ra
[
1
].
e
,
20
);
filterFree
MergeRange
(
h
);
filterFree
RangeCtx
(
h
);
s
=
s5
;
e
=
e5
;
asize
=
sizeof
(
s5
)
/
sizeof
(
s
[
0
]);
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
)
{
ra
[
0
].
s
=
s
[
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
);
filterFree
MergeRange
(
h
);
filterFree
RangeCtx
(
h
);
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
)
{
ra
[
0
].
s
=
s
[
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
);
filterGet
Merge
RangeRes
(
h
,
ra
);
filterGetRangeRes
(
h
,
ra
);
ASSERT_EQ
(
ra
[
0
].
s
,
0
);
ASSERT_EQ
(
ra
[
0
].
e
,
4
);
ASSERT_EQ
(
ra
[
1
].
s
,
6
);
ASSERT_EQ
(
ra
[
1
].
e
,
20
);
filterFree
MergeRange
(
h
);
filterFree
RangeCtx
(
h
);
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
)
{
ra
[
0
].
s
=
s
[
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
);
filterGet
Merge
RangeRes
(
h
,
ra
);
filterGetRangeRes
(
h
,
ra
);
ASSERT_EQ
(
ra
[
0
].
s
,
7
);
ASSERT_EQ
(
ra
[
0
].
e
,
10
);
filterFree
MergeRange
(
h
);
filterFree
RangeCtx
(
h
);
...
...
@@ -315,7 +315,7 @@ void intDataTest() {
e
=
e6
;
asize
=
sizeof
(
s6
)
/
sizeof
(
s
[
0
]);
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
)
{
ra
[
0
].
eflag
=
1
;
ra
[
1
].
sflag
=
4
;
...
...
@@ -323,16 +323,16 @@ void intDataTest() {
ra
[
i
].
s
=
s
[
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
);
filterFree
MergeRange
(
h
);
filterFree
RangeCtx
(
h
);
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
)
{
ra
[
0
].
eflag
=
1
;
ra
[
1
].
sflag
=
1
;
...
...
@@ -340,9 +340,9 @@ void intDataTest() {
ra
[
i
].
s
=
s
[
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
(
ra
[
0
].
s
,
0
);
ASSERT_EQ
(
ra
[
0
].
e
,
4
);
...
...
@@ -350,7 +350,7 @@ void intDataTest() {
ASSERT_EQ
(
ra
[
1
].
s
,
4
);
ASSERT_EQ
(
ra
[
1
].
e
,
6
);
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
return -1
endi
#xxx
sql select * from stb1 where c8 = '51' or c8 != '51';
if $rows != 28 then
return -1
...
...
@@ -1072,6 +1073,34 @@ endi
if $data01 != NULL then
return -1
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;
if $rows != 1 then
return -1
...
...
@@ -1817,6 +1846,48 @@ if $data20 != @21-05-05 18:19:12.000@ then
return -1
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"
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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录