Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
ea497d38
T
TDengine
项目概览
taosdata
/
TDengine
大约 2 年 前同步成功
通知
1192
Star
22018
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看板
提交
ea497d38
编写于
6月 17, 2021
作者:
D
dapan1121
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix value convert issue
上级
bc65d9eb
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
163 addition
and
61 deletion
+163
-61
src/query/inc/qFilter.h
src/query/inc/qFilter.h
+4
-2
src/query/src/qExecutor.c
src/query/src/qExecutor.c
+1
-1
src/query/src/qFilter.c
src/query/src/qFilter.c
+102
-58
tests/script/general/parser/condition.sim
tests/script/general/parser/condition.sim
+56
-0
未找到文件。
src/query/inc/qFilter.h
浏览文件 @
ea497d38
...
...
@@ -93,8 +93,10 @@ typedef struct SFilterInfo {
#define CHK_LRET(c, r,...) do { if (c) { qError(__VA_ARGS__); return r; } } while (0)
#define FILTER_GET_FIELD(i, id) (&((i)->fields[(id).type].fields[(id).idx]))
#define FILTER_GET_COL_FIELD_TYPE(fi) (((SSchema *)((fi)->desc))->type)
#define FILTER_GET_COL_FIELD_DATA(fi, ri) ((fi)->data + ((SSchema *)((fi)->desc))->bytes * (ri))
#define FILTER_GET_VAL_FIELD_DATA(fi) (&((tVariant *)((fi)->desc))->i64)
#define FILTER_GET_VAL_FIELD_TYPE(fi) (((tVariant *)((fi)->desc))->nType)
#define FILTER_GET_VAL_FIELD_DATA(fi) ((fi)->data)
...
...
@@ -109,7 +111,7 @@ typedef int32_t(*filter_desc_compare_func)(const void *, const void *);
extern
int32_t
filterInitFromTree
(
tExprNode
*
tree
,
SFilterInfo
**
pinfo
);
extern
bool
filterExecute
(
SFilterInfo
*
info
,
int32_t
numOfRows
,
int8_t
*
p
);
extern
int32_t
filterSetColData
(
SFilterInfo
*
info
,
int16_t
colId
,
void
*
data
);
extern
int32_t
filterSetCol
Field
Data
(
SFilterInfo
*
info
,
int16_t
colId
,
void
*
data
);
#ifdef __cplusplus
}
...
...
src/query/src/qExecutor.c
浏览文件 @
ea497d38
...
...
@@ -2645,7 +2645,7 @@ void doSetFilterColInfo(SFilterInfo * pFilters, SSDataBlock* pBlock) {
for
(
int32_t
j
=
0
;
j
<
pBlock
->
info
.
numOfCols
;
++
j
)
{
SColumnInfoData
*
pColInfo
=
taosArrayGet
(
pBlock
->
pDataBlock
,
j
);
filterSetColData
(
pFilters
,
pColInfo
->
info
.
colId
,
pColInfo
->
pData
);
filterSetCol
Field
Data
(
pFilters
,
pColInfo
->
info
.
colId
,
pColInfo
->
pData
);
}
}
...
...
src/query/src/qFilter.c
浏览文件 @
ea497d38
...
...
@@ -122,7 +122,7 @@ int32_t filterAddField(SFilterInfo *info, tExprNode *node, SFilterFieldId *fid)
num
=
&
info
->
fields
[
type
].
num
;
if
(
*
num
>
0
)
{
if
(
*
num
>
0
&&
type
!=
F_FIELD_VALUE
)
{
idx
=
filterGetFiled
(
&
info
->
fields
[
type
],
type
,
v
);
}
...
...
@@ -231,7 +231,7 @@ int32_t filterInitUnitFunc(SFilterInfo *info) {
SFilterUnit
*
unit
=
&
info
->
units
[
i
];
SFilterField
*
left
=
FILTER_GET_FIELD
(
info
,
unit
->
left
);
unit
->
compare
.
pCompareFunc
=
getComparFunc
(
left
->
type
,
unit
->
compare
.
optr
);
unit
->
compare
.
pCompareFunc
=
getComparFunc
(
FILTER_GET_COL_FIELD_TYPE
(
left
)
,
unit
->
compare
.
optr
);
}
return
TSDB_CODE_SUCCESS
;
...
...
@@ -279,68 +279,13 @@ void filterDumpInfoToString(SFilterInfo *info) {
}
}
int32_t
filterInitFromTree
(
tExprNode
*
tree
,
SFilterInfo
**
pinfo
)
{
int32_t
code
=
TSDB_CODE_SUCCESS
;
SFilterInfo
*
info
=
NULL
;
CHK_LRET
(
tree
==
NULL
||
pinfo
==
NULL
,
TSDB_CODE_QRY_APP_ERROR
,
"invalid param"
);
if
(
*
pinfo
==
NULL
)
{
*
pinfo
=
calloc
(
1
,
sizeof
(
SFilterInfo
));
}
info
=
*
pinfo
;
SArray
*
group
=
taosArrayInit
(
4
,
sizeof
(
SFilterGroup
));
info
->
unitSize
=
FILTER_DEFAULT_UNIT_SIZE
;
info
->
units
=
calloc
(
info
->
unitSize
,
sizeof
(
SFilterUnit
));
info
->
fields
[
F_FIELD_COLUMN
].
num
=
0
;
info
->
fields
[
F_FIELD_COLUMN
].
size
=
FILTER_DEFAULT_FIELD_SIZE
;
info
->
fields
[
F_FIELD_COLUMN
].
fields
=
calloc
(
info
->
fields
[
F_FIELD_COLUMN
].
size
,
sizeof
(
SFilterField
));
info
->
fields
[
F_FIELD_VALUE
].
num
=
0
;
info
->
fields
[
F_FIELD_VALUE
].
size
=
FILTER_DEFAULT_FIELD_SIZE
;
info
->
fields
[
F_FIELD_VALUE
].
fields
=
calloc
(
info
->
fields
[
F_FIELD_VALUE
].
size
,
sizeof
(
SFilterField
));
code
=
filterTreeToGroup
(
tree
,
info
,
group
);
ERR_JRET
(
code
);
size_t
groupSize
=
taosArrayGetSize
(
group
);
info
->
groupNum
=
(
uint16_t
)
groupSize
;
if
(
info
->
groupNum
>
0
)
{
info
->
groups
=
calloc
(
info
->
groupNum
,
sizeof
(
*
info
->
groups
));
}
for
(
size_t
i
=
0
;
i
<
groupSize
;
++
i
)
{
SFilterGroup
*
pg
=
taosArrayGet
(
group
,
i
);
info
->
groups
[
i
]
=
*
pg
;
}
ERR_JRET
(
filterInitUnitFunc
(
info
));
info
->
unitRes
=
malloc
(
info
->
unitNum
*
sizeof
(
*
info
->
unitRes
));
info
->
unitFlags
=
malloc
(
info
->
unitNum
*
sizeof
(
*
info
->
unitFlags
));
filterDumpInfoToString
(
info
);
_err_return:
taosArrayDestroy
(
group
);
return
code
;
}
void
filterFreeInfo
(
SFilterInfo
*
info
)
{
CHK_RETV
(
info
==
NULL
);
//TODO
}
int32_t
filterSetColData
(
SFilterInfo
*
info
,
int16_t
colId
,
void
*
data
)
{
int32_t
filterSetCol
Field
Data
(
SFilterInfo
*
info
,
int16_t
colId
,
void
*
data
)
{
CHK_LRET
(
info
==
NULL
,
TSDB_CODE_QRY_APP_ERROR
,
"info NULL"
);
CHK_LRET
(
info
->
fields
[
F_FIELD_COLUMN
].
num
<=
0
,
TSDB_CODE_QRY_APP_ERROR
,
"no column fileds"
);
...
...
@@ -356,6 +301,46 @@ int32_t filterSetColData(SFilterInfo *info, int16_t colId, void *data) {
return
TSDB_CODE_SUCCESS
;
}
int32_t
filterInitValFieldData
(
SFilterInfo
*
info
)
{
for
(
uint16_t
i
=
0
;
i
<
info
->
unitNum
;
++
i
)
{
SFilterUnit
*
unit
=
&
info
->
units
[
i
];
SFilterField
*
left
=
FILTER_GET_FIELD
(
info
,
unit
->
left
);
SFilterField
*
right
=
FILTER_GET_FIELD
(
info
,
unit
->
right
);
if
(
left
->
type
!=
F_FIELD_VALUE
&&
right
->
type
!=
F_FIELD_VALUE
)
{
continue
;
}
uint32_t
type
=
0
;
SFilterField
*
fi
=
NULL
;
if
(
left
->
type
==
F_FIELD_COLUMN
)
{
type
=
FILTER_GET_COL_FIELD_TYPE
(
left
);
fi
=
right
;
}
else
if
(
right
->
type
==
F_FIELD_COLUMN
)
{
type
=
FILTER_GET_COL_FIELD_TYPE
(
right
);
fi
=
left
;
}
else
{
type
=
FILTER_GET_VAL_FIELD_TYPE
(
left
);
fi
=
right
;
}
tVariant
*
var
=
fi
->
desc
;
if
(
type
==
TSDB_DATA_TYPE_BINARY
)
{
fi
->
data
=
calloc
(
1
,
(
var
->
nLen
+
1
)
*
TSDB_NCHAR_SIZE
);
}
else
if
(
type
==
TSDB_DATA_TYPE_NCHAR
)
{
fi
->
data
=
calloc
(
1
,
(
var
->
nLen
+
1
)
*
TSDB_NCHAR_SIZE
);
}
else
{
fi
->
data
=
calloc
(
1
,
sizeof
(
int64_t
));
}
ERR_LRET
(
tVariantDump
(
var
,
(
char
*
)
fi
->
data
,
type
,
false
),
"dump type[%d] failed"
,
type
);
}
return
TSDB_CODE_SUCCESS
;
}
bool
filterDoCompare
(
SFilterUnit
*
unit
,
void
*
left
,
void
*
right
)
{
int32_t
ret
=
unit
->
compare
.
pCompareFunc
(
left
,
right
);
...
...
@@ -445,4 +430,63 @@ bool filterExecute(SFilterInfo *info, int32_t numOfRows, int8_t* p) {
int32_t
filterInitFromTree
(
tExprNode
*
tree
,
SFilterInfo
**
pinfo
)
{
int32_t
code
=
TSDB_CODE_SUCCESS
;
SFilterInfo
*
info
=
NULL
;
CHK_LRET
(
tree
==
NULL
||
pinfo
==
NULL
,
TSDB_CODE_QRY_APP_ERROR
,
"invalid param"
);
if
(
*
pinfo
==
NULL
)
{
*
pinfo
=
calloc
(
1
,
sizeof
(
SFilterInfo
));
}
info
=
*
pinfo
;
SArray
*
group
=
taosArrayInit
(
4
,
sizeof
(
SFilterGroup
));
info
->
unitSize
=
FILTER_DEFAULT_UNIT_SIZE
;
info
->
units
=
calloc
(
info
->
unitSize
,
sizeof
(
SFilterUnit
));
info
->
fields
[
F_FIELD_COLUMN
].
num
=
0
;
info
->
fields
[
F_FIELD_COLUMN
].
size
=
FILTER_DEFAULT_FIELD_SIZE
;
info
->
fields
[
F_FIELD_COLUMN
].
fields
=
calloc
(
info
->
fields
[
F_FIELD_COLUMN
].
size
,
sizeof
(
SFilterField
));
info
->
fields
[
F_FIELD_VALUE
].
num
=
0
;
info
->
fields
[
F_FIELD_VALUE
].
size
=
FILTER_DEFAULT_FIELD_SIZE
;
info
->
fields
[
F_FIELD_VALUE
].
fields
=
calloc
(
info
->
fields
[
F_FIELD_VALUE
].
size
,
sizeof
(
SFilterField
));
code
=
filterTreeToGroup
(
tree
,
info
,
group
);
ERR_JRET
(
code
);
size_t
groupSize
=
taosArrayGetSize
(
group
);
info
->
groupNum
=
(
uint16_t
)
groupSize
;
if
(
info
->
groupNum
>
0
)
{
info
->
groups
=
calloc
(
info
->
groupNum
,
sizeof
(
*
info
->
groups
));
}
for
(
size_t
i
=
0
;
i
<
groupSize
;
++
i
)
{
SFilterGroup
*
pg
=
taosArrayGet
(
group
,
i
);
info
->
groups
[
i
]
=
*
pg
;
}
ERR_JRET
(
filterInitUnitFunc
(
info
));
ERR_JRET
(
filterInitValFieldData
(
info
));
info
->
unitRes
=
malloc
(
info
->
unitNum
*
sizeof
(
*
info
->
unitRes
));
info
->
unitFlags
=
malloc
(
info
->
unitNum
*
sizeof
(
*
info
->
unitFlags
));
filterDumpInfoToString
(
info
);
_err_return:
taosArrayDestroy
(
group
);
return
code
;
}
tests/script/general/parser/condition.sim
浏览文件 @
ea497d38
...
...
@@ -109,6 +109,62 @@ endi
#sql select * from stb1 where c1 > 0 or (c1 > 3 or c1 < 1) or c1 > 4
sql select * from stb1 where (c1 > 40 or c1 < 20) and (c2 < 53 or c2 >= 63) and c3 > 1 and c3 < 5
if $rows != 3 then
return -1
endi
if $data00 != @21-05-05 18:19:01.000@ then
return -1
endi
if $data01 != 2 then
return -1
endi
if $data10 != @21-05-05 18:19:02.000@ then
return -1
endi
if $data11 != 3 then
return -1
endi
if $data20 != @21-05-05 18:19:03.000@ then
return -1
endi
if $data21 != 4 then
return -1
endi
sql select * from stb1 where (c1 > 52 or c1 < 10) and (c2 > 1 and c2 < 61)
if $rows != 5 then
return -1
endi
if $data00 != @21-05-05 18:19:01.000@ then
return -1
endi
if $data01 != 2 then
return -1
endi
if $data10 != @21-05-05 18:19:02.000@ then
return -1
endi
if $data11 != 3 then
return -1
endi
if $data20 != @21-05-05 18:19:03.000@ then
return -1
endi
if $data21 != 4 then
return -1
endi
if $data30 != @21-05-05 18:19:22.000@ then
return -1
endi
if $data31 != 53 then
return -1
endi
if $data40 != @21-05-05 18:19:23.000@ then
return -1
endi
if $data41 != 54 then
return -1
endi
print "ts test"
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录