Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
慢慢CG
TDengine
提交
56177e18
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看板
提交
56177e18
编写于
7月 27, 2021
作者:
W
wpan
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix mem leak
上级
82a7d7b9
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
203 addition
and
84 deletion
+203
-84
src/client/src/tscSQLParser.c
src/client/src/tscSQLParser.c
+24
-21
src/common/src/texpr.c
src/common/src/texpr.c
+13
-17
src/query/inc/qFilter.h
src/query/inc/qFilter.h
+3
-2
src/query/src/qExecutor.c
src/query/src/qExecutor.c
+8
-1
src/query/src/qFilter.c
src/query/src/qFilter.c
+149
-39
src/query/src/qSqlParser.c
src/query/src/qSqlParser.c
+1
-3
src/query/src/queryMain.c
src/query/src/queryMain.c
+3
-0
src/util/src/hash.c
src/util/src/hash.c
+2
-1
未找到文件。
src/client/src/tscSQLParser.c
浏览文件 @
56177e18
...
@@ -3424,8 +3424,8 @@ static int32_t doExtractColumnFilterInfo(SSqlCmd* pCmd, SQueryInfo* pQueryInfo,
...
@@ -3424,8 +3424,8 @@ static int32_t doExtractColumnFilterInfo(SSqlCmd* pCmd, SQueryInfo* pQueryInfo,
retVal
=
tVariantDump
(
&
pRight
->
value
,
(
char
*
)
pColumnFilter
->
pz
,
colType
,
false
);
retVal
=
tVariantDump
(
&
pRight
->
value
,
(
char
*
)
pColumnFilter
->
pz
,
colType
,
false
);
}
else
if
(
colType
==
TSDB_DATA_TYPE_NCHAR
)
{
}
else
if
(
colType
==
TSDB_DATA_TYPE_NCHAR
)
{
//
pRight->value.n
Len + 1 is larger than the actual nchar string length
//
buf
Len + 1 is larger than the actual nchar string length
pColumnFilter
->
pz
=
(
int64_t
)
calloc
(
1
,
bufLen
*
TSDB_NCHAR_SIZE
);
pColumnFilter
->
pz
=
(
int64_t
)
calloc
(
1
,
(
bufLen
+
1
)
*
TSDB_NCHAR_SIZE
);
retVal
=
tVariantDump
(
&
pRight
->
value
,
(
char
*
)
pColumnFilter
->
pz
,
colType
,
false
);
retVal
=
tVariantDump
(
&
pRight
->
value
,
(
char
*
)
pColumnFilter
->
pz
,
colType
,
false
);
size_t
len
=
twcslen
((
wchar_t
*
)
pColumnFilter
->
pz
);
size_t
len
=
twcslen
((
wchar_t
*
)
pColumnFilter
->
pz
);
pColumnFilter
->
len
=
len
*
TSDB_NCHAR_SIZE
;
pColumnFilter
->
len
=
len
*
TSDB_NCHAR_SIZE
;
...
@@ -3652,14 +3652,10 @@ static int32_t getColQueryCondExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSqlEx
...
@@ -3652,14 +3652,10 @@ static int32_t getColQueryCondExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSqlEx
}
}
tExprNode
*
p
=
NULL
;
tExprNode
*
p
=
NULL
;
//SFilterInfo colFilter = {0};
SArray
*
colList
=
taosArrayInit
(
10
,
sizeof
(
SColIndex
));
ret
=
exprTreeFromSqlExpr
(
pCmd
,
&
p
,
p1
,
pQueryInfo
,
colList
,
NULL
);
//if (ret == TSDB_CODE_SUCCESS) {
// ret = filterInitFromTree(p, &colFilter, (int32_t)taosArrayGetSize(colList));
//}
SArray
*
colList
=
taosArrayInit
(
10
,
sizeof
(
SColIndex
));
ret
=
exprTreeFromSqlExpr
(
pCmd
,
&
p
,
p1
,
pQueryInfo
,
colList
,
NULL
);
taosArrayDestroy
(
colList
);
SBufferWriter
bw
=
tbufInitWriter
(
NULL
,
false
);
SBufferWriter
bw
=
tbufInitWriter
(
NULL
,
false
);
...
@@ -5045,8 +5041,10 @@ static int32_t getQueryTimeRange(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSqlExpr
...
@@ -5045,8 +5041,10 @@ static int32_t getQueryTimeRange(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSqlExpr
tExprNode
*
p
=
NULL
;
tExprNode
*
p
=
NULL
;
SFilterInfo
*
filter
=
NULL
;
SFilterInfo
*
filter
=
NULL
;
SArray
*
colList
=
taosArrayInit
(
10
,
sizeof
(
SColIndex
));
SArray
*
colList
=
taosArrayInit
(
10
,
sizeof
(
SColIndex
));
ret
=
exprTreeFromSqlExpr
(
pCmd
,
&
p
,
*
pExpr
,
pQueryInfo
,
colList
,
NULL
);
ret
=
exprTreeFromSqlExpr
(
pCmd
,
&
p
,
*
pExpr
,
pQueryInfo
,
colList
,
NULL
);
taosArrayDestroy
(
colList
);
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
goto
_ret
;
goto
_ret
;
}
}
...
@@ -5058,6 +5056,8 @@ static int32_t getQueryTimeRange(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSqlExpr
...
@@ -5058,6 +5056,8 @@ static int32_t getQueryTimeRange(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSqlExpr
ret
=
filterGetTimeRange
(
filter
,
&
pQueryInfo
->
window
);
ret
=
filterGetTimeRange
(
filter
,
&
pQueryInfo
->
window
);
filterFreeInfo
(
filter
);
_ret:
_ret:
tExprTreeDestroy
(
p
,
NULL
);
tExprTreeDestroy
(
p
,
NULL
);
...
@@ -5100,7 +5100,7 @@ int32_t validateWhereNode(SQueryInfo* pQueryInfo, tSqlExpr** pExpr, SSqlObj* pSq
...
@@ -5100,7 +5100,7 @@ int32_t validateWhereNode(SQueryInfo* pQueryInfo, tSqlExpr** pExpr, SSqlObj* pSq
#endif
#endif
if
((
ret
=
getQueryCondExpr
(
&
pSql
->
cmd
,
pQueryInfo
,
pExpr
,
&
condExpr
,
etype
,
&
tbIdx
,
(
*
pExpr
)
->
tokenId
,
&
condExpr
.
pColumnCond
,
&
condExpr
.
pTimewindow
))
!=
TSDB_CODE_SUCCESS
)
{
if
((
ret
=
getQueryCondExpr
(
&
pSql
->
cmd
,
pQueryInfo
,
pExpr
,
&
condExpr
,
etype
,
&
tbIdx
,
(
*
pExpr
)
->
tokenId
,
&
condExpr
.
pColumnCond
,
&
condExpr
.
pTimewindow
))
!=
TSDB_CODE_SUCCESS
)
{
return
ret
;
goto
PARSE_WHERE_EXIT
;
}
}
if
(
taosArrayGetSize
(
pQueryInfo
->
pUpstream
)
>
0
&&
condExpr
.
pTimewindow
!=
NULL
)
{
if
(
taosArrayGetSize
(
pQueryInfo
->
pUpstream
)
>
0
&&
condExpr
.
pTimewindow
!=
NULL
)
{
...
@@ -5115,21 +5115,21 @@ int32_t validateWhereNode(SQueryInfo* pQueryInfo, tSqlExpr** pExpr, SSqlObj* pSq
...
@@ -5115,21 +5115,21 @@ int32_t validateWhereNode(SQueryInfo* pQueryInfo, tSqlExpr** pExpr, SSqlObj* pSq
// 1. check if it is a join query
// 1. check if it is a join query
if
((
ret
=
validateJoinExpr
(
&
pSql
->
cmd
,
pQueryInfo
,
&
condExpr
))
!=
TSDB_CODE_SUCCESS
)
{
if
((
ret
=
validateJoinExpr
(
&
pSql
->
cmd
,
pQueryInfo
,
&
condExpr
))
!=
TSDB_CODE_SUCCESS
)
{
return
ret
;
goto
PARSE_WHERE_EXIT
;
}
}
// 2. get the query time range
// 2. get the query time range
if
((
ret
=
convertTimeRangeFromExpr
(
&
pSql
->
cmd
,
pQueryInfo
,
condExpr
.
pTimewindow
))
!=
TSDB_CODE_SUCCESS
)
{
if
((
ret
=
convertTimeRangeFromExpr
(
&
pSql
->
cmd
,
pQueryInfo
,
condExpr
.
pTimewindow
))
!=
TSDB_CODE_SUCCESS
)
{
return
ret
;
goto
PARSE_WHERE_EXIT
;
}
}
if
((
ret
=
getQueryTimeRange
(
&
pSql
->
cmd
,
pQueryInfo
,
&
condExpr
.
pTimewindow
))
!=
TSDB_CODE_SUCCESS
)
{
if
((
ret
=
getQueryTimeRange
(
&
pSql
->
cmd
,
pQueryInfo
,
&
condExpr
.
pTimewindow
))
!=
TSDB_CODE_SUCCESS
)
{
return
ret
;
goto
PARSE_WHERE_EXIT
;
}
}
// 3. get the tag query condition
// 3. get the tag query condition
if
((
ret
=
getTagQueryCondExpr
(
&
pSql
->
cmd
,
pQueryInfo
,
&
condExpr
,
pExpr
))
!=
TSDB_CODE_SUCCESS
)
{
if
((
ret
=
getTagQueryCondExpr
(
&
pSql
->
cmd
,
pQueryInfo
,
&
condExpr
,
pExpr
))
!=
TSDB_CODE_SUCCESS
)
{
return
ret
;
goto
PARSE_WHERE_EXIT
;
}
}
// 4. get the table name query condition
// 4. get the table name query condition
...
@@ -8613,12 +8613,15 @@ int32_t exprTreeFromSqlExpr(SSqlCmd* pCmd, tExprNode **pExpr, const tSqlExpr* pS
...
@@ -8613,12 +8613,15 @@ int32_t exprTreeFromSqlExpr(SSqlCmd* pCmd, tExprNode **pExpr, const tSqlExpr* pS
}
else
if
(
pSqlExpr
->
tokenId
==
TK_SET
)
{
}
else
if
(
pSqlExpr
->
tokenId
==
TK_SET
)
{
int32_t
colType
=
-
1
;
int32_t
colType
=
-
1
;
STableMeta
*
pTableMeta
=
tscGetMetaInfo
(
pQueryInfo
,
pQueryInfo
->
curTableIdx
)
->
pTableMeta
;
STableMeta
*
pTableMeta
=
tscGetMetaInfo
(
pQueryInfo
,
pQueryInfo
->
curTableIdx
)
->
pTableMeta
;
size_t
colSize
=
taosArrayGetSize
(
pCols
);
if
(
pCols
!=
NULL
)
{
if
(
pCols
!=
NULL
&&
colSize
>
0
)
{
size_t
colSize
=
taosArrayGetSize
(
pCols
);
SColIndex
*
idx
=
taosArrayGet
(
pCols
,
colSize
-
1
);
SSchema
*
pSchema
=
tscGetTableColumnSchema
(
pTableMeta
,
idx
->
colIndex
);
if
(
colSize
>
0
)
{
if
(
pSchema
!=
NULL
)
{
SColIndex
*
idx
=
taosArrayGet
(
pCols
,
colSize
-
1
);
colType
=
pSchema
->
type
;
SSchema
*
pSchema
=
tscGetTableColumnSchema
(
pTableMeta
,
idx
->
colIndex
);
if
(
pSchema
!=
NULL
)
{
colType
=
pSchema
->
type
;
}
}
}
}
}
tVariant
*
pVal
;
tVariant
*
pVal
;
...
...
src/common/src/texpr.c
浏览文件 @
56177e18
...
@@ -513,7 +513,8 @@ void convertFilterSetFromBinary(void **q, const char *buf, int32_t len, uint32_t
...
@@ -513,7 +513,8 @@ void convertFilterSetFromBinary(void **q, const char *buf, int32_t len, uint32_t
tVariant
tmpVar
=
{
0
};
tVariant
tmpVar
=
{
0
};
size_t
t
=
0
;
size_t
t
=
0
;
int32_t
sz
=
tbufReadInt32
(
&
br
);
int32_t
sz
=
tbufReadInt32
(
&
br
);
void
*
pvar
=
NULL
;
void
*
pvar
=
NULL
;
int64_t
val
=
0
;
int32_t
bufLen
=
0
;
int32_t
bufLen
=
0
;
if
(
IS_NUMERIC_TYPE
(
sType
))
{
if
(
IS_NUMERIC_TYPE
(
sType
))
{
bufLen
=
60
;
// The maximum length of string that a number is converted to.
bufLen
=
60
;
// The maximum length of string that a number is converted to.
...
@@ -528,21 +529,21 @@ void convertFilterSetFromBinary(void **q, const char *buf, int32_t len, uint32_t
...
@@ -528,21 +529,21 @@ void convertFilterSetFromBinary(void **q, const char *buf, int32_t len, uint32_t
case
TSDB_DATA_TYPE_BOOL
:
case
TSDB_DATA_TYPE_BOOL
:
case
TSDB_DATA_TYPE_UTINYINT
:
case
TSDB_DATA_TYPE_UTINYINT
:
case
TSDB_DATA_TYPE_TINYINT
:
{
case
TSDB_DATA_TYPE_TINYINT
:
{
uint8_t
val
=
(
uint8_t
)
tbufReadInt64
(
&
br
);
*
(
uint8_t
*
)
&
val
=
(
uint8_t
)
tbufReadInt64
(
&
br
);
t
=
sizeof
(
val
);
t
=
sizeof
(
val
);
pvar
=
&
val
;
pvar
=
&
val
;
break
;
break
;
}
}
case
TSDB_DATA_TYPE_USMALLINT
:
case
TSDB_DATA_TYPE_USMALLINT
:
case
TSDB_DATA_TYPE_SMALLINT
:
{
case
TSDB_DATA_TYPE_SMALLINT
:
{
uint16_t
val
=
(
uint16_t
)
tbufReadInt64
(
&
br
);
*
(
uint16_t
*
)
&
val
=
(
uint16_t
)
tbufReadInt64
(
&
br
);
t
=
sizeof
(
val
);
t
=
sizeof
(
val
);
pvar
=
&
val
;
pvar
=
&
val
;
break
;
break
;
}
}
case
TSDB_DATA_TYPE_UINT
:
case
TSDB_DATA_TYPE_UINT
:
case
TSDB_DATA_TYPE_INT
:
{
case
TSDB_DATA_TYPE_INT
:
{
uint32_t
val
=
(
uint32_t
)
tbufReadInt64
(
&
br
);
*
(
uint32_t
*
)
&
val
=
(
uint32_t
)
tbufReadInt64
(
&
br
);
t
=
sizeof
(
val
);
t
=
sizeof
(
val
);
pvar
=
&
val
;
pvar
=
&
val
;
break
;
break
;
...
@@ -550,31 +551,29 @@ void convertFilterSetFromBinary(void **q, const char *buf, int32_t len, uint32_t
...
@@ -550,31 +551,29 @@ void convertFilterSetFromBinary(void **q, const char *buf, int32_t len, uint32_t
case
TSDB_DATA_TYPE_TIMESTAMP
:
case
TSDB_DATA_TYPE_TIMESTAMP
:
case
TSDB_DATA_TYPE_UBIGINT
:
case
TSDB_DATA_TYPE_UBIGINT
:
case
TSDB_DATA_TYPE_BIGINT
:
{
case
TSDB_DATA_TYPE_BIGINT
:
{
uint64_t
val
=
(
uint64_t
)
tbufReadInt64
(
&
br
);
*
(
uint64_t
*
)
&
val
=
(
uint64_t
)
tbufReadInt64
(
&
br
);
t
=
sizeof
(
val
);
t
=
sizeof
(
val
);
pvar
=
&
val
;
pvar
=
&
val
;
break
;
break
;
}
}
case
TSDB_DATA_TYPE_DOUBLE
:
{
case
TSDB_DATA_TYPE_DOUBLE
:
{
double
val
=
tbufReadDouble
(
&
br
);
*
(
double
*
)
&
val
=
tbufReadDouble
(
&
br
);
t
=
sizeof
(
val
);
t
=
sizeof
(
val
);
pvar
=
&
val
;
pvar
=
&
val
;
break
;
break
;
}
}
case
TSDB_DATA_TYPE_FLOAT
:
{
case
TSDB_DATA_TYPE_FLOAT
:
{
float
val
=
(
float
)
tbufReadDouble
(
&
br
);
*
(
float
*
)
&
val
=
(
float
)
tbufReadDouble
(
&
br
);
t
=
sizeof
(
val
);
t
=
sizeof
(
val
);
pvar
=
&
val
;
pvar
=
&
val
;
break
;
break
;
}
}
case
TSDB_DATA_TYPE_BINARY
:
{
case
TSDB_DATA_TYPE_BINARY
:
{
char
*
val
=
(
char
*
)
tbufReadBinary
(
&
br
,
&
t
);
pvar
=
(
char
*
)
tbufReadBinary
(
&
br
,
&
t
);
pvar
=
val
;
break
;
break
;
}
}
case
TSDB_DATA_TYPE_NCHAR
:
{
case
TSDB_DATA_TYPE_NCHAR
:
{
char
*
val
=
(
char
*
)
tbufReadBinary
(
&
br
,
&
t
);
pvar
=
(
char
*
)
tbufReadBinary
(
&
br
,
&
t
);
pvar
=
val
;
break
;
break
;
}
}
default:
default:
...
@@ -594,7 +593,6 @@ void convertFilterSetFromBinary(void **q, const char *buf, int32_t len, uint32_t
...
@@ -594,7 +593,6 @@ void convertFilterSetFromBinary(void **q, const char *buf, int32_t len, uint32_t
case
TSDB_DATA_TYPE_BOOL
:
case
TSDB_DATA_TYPE_BOOL
:
case
TSDB_DATA_TYPE_UTINYINT
:
case
TSDB_DATA_TYPE_UTINYINT
:
case
TSDB_DATA_TYPE_TINYINT
:
{
case
TSDB_DATA_TYPE_TINYINT
:
{
int8_t
val
=
0
;
if
(
tVariantDump
(
&
tmpVar
,
(
char
*
)
&
val
,
tType
,
false
))
{
if
(
tVariantDump
(
&
tmpVar
,
(
char
*
)
&
val
,
tType
,
false
))
{
goto
err_ret
;
goto
err_ret
;
}
}
...
@@ -604,7 +602,6 @@ void convertFilterSetFromBinary(void **q, const char *buf, int32_t len, uint32_t
...
@@ -604,7 +602,6 @@ void convertFilterSetFromBinary(void **q, const char *buf, int32_t len, uint32_t
}
}
case
TSDB_DATA_TYPE_USMALLINT
:
case
TSDB_DATA_TYPE_USMALLINT
:
case
TSDB_DATA_TYPE_SMALLINT
:
{
case
TSDB_DATA_TYPE_SMALLINT
:
{
int16_t
val
=
0
;
if
(
tVariantDump
(
&
tmpVar
,
(
char
*
)
&
val
,
tType
,
false
))
{
if
(
tVariantDump
(
&
tmpVar
,
(
char
*
)
&
val
,
tType
,
false
))
{
goto
err_ret
;
goto
err_ret
;
}
}
...
@@ -614,7 +611,6 @@ void convertFilterSetFromBinary(void **q, const char *buf, int32_t len, uint32_t
...
@@ -614,7 +611,6 @@ void convertFilterSetFromBinary(void **q, const char *buf, int32_t len, uint32_t
}
}
case
TSDB_DATA_TYPE_UINT
:
case
TSDB_DATA_TYPE_UINT
:
case
TSDB_DATA_TYPE_INT
:
{
case
TSDB_DATA_TYPE_INT
:
{
int32_t
val
=
0
;
if
(
tVariantDump
(
&
tmpVar
,
(
char
*
)
&
val
,
tType
,
false
))
{
if
(
tVariantDump
(
&
tmpVar
,
(
char
*
)
&
val
,
tType
,
false
))
{
goto
err_ret
;
goto
err_ret
;
}
}
...
@@ -625,7 +621,6 @@ void convertFilterSetFromBinary(void **q, const char *buf, int32_t len, uint32_t
...
@@ -625,7 +621,6 @@ void convertFilterSetFromBinary(void **q, const char *buf, int32_t len, uint32_t
case
TSDB_DATA_TYPE_TIMESTAMP
:
case
TSDB_DATA_TYPE_TIMESTAMP
:
case
TSDB_DATA_TYPE_UBIGINT
:
case
TSDB_DATA_TYPE_UBIGINT
:
case
TSDB_DATA_TYPE_BIGINT
:
{
case
TSDB_DATA_TYPE_BIGINT
:
{
int64_t
val
=
0
;
if
(
tVariantDump
(
&
tmpVar
,
(
char
*
)
&
val
,
tType
,
false
))
{
if
(
tVariantDump
(
&
tmpVar
,
(
char
*
)
&
val
,
tType
,
false
))
{
goto
err_ret
;
goto
err_ret
;
}
}
...
@@ -634,7 +629,6 @@ void convertFilterSetFromBinary(void **q, const char *buf, int32_t len, uint32_t
...
@@ -634,7 +629,6 @@ void convertFilterSetFromBinary(void **q, const char *buf, int32_t len, uint32_t
break
;
break
;
}
}
case
TSDB_DATA_TYPE_DOUBLE
:
{
case
TSDB_DATA_TYPE_DOUBLE
:
{
double
val
=
0
;
if
(
tVariantDump
(
&
tmpVar
,
(
char
*
)
&
val
,
tType
,
false
))
{
if
(
tVariantDump
(
&
tmpVar
,
(
char
*
)
&
val
,
tType
,
false
))
{
goto
err_ret
;
goto
err_ret
;
}
}
...
@@ -643,7 +637,6 @@ void convertFilterSetFromBinary(void **q, const char *buf, int32_t len, uint32_t
...
@@ -643,7 +637,6 @@ void convertFilterSetFromBinary(void **q, const char *buf, int32_t len, uint32_t
break
;
break
;
}
}
case
TSDB_DATA_TYPE_FLOAT
:
{
case
TSDB_DATA_TYPE_FLOAT
:
{
float
val
=
0
;
if
(
tVariantDump
(
&
tmpVar
,
(
char
*
)
&
val
,
tType
,
false
))
{
if
(
tVariantDump
(
&
tmpVar
,
(
char
*
)
&
val
,
tType
,
false
))
{
goto
err_ret
;
goto
err_ret
;
}
}
...
@@ -672,12 +665,15 @@ void convertFilterSetFromBinary(void **q, const char *buf, int32_t len, uint32_t
...
@@ -672,12 +665,15 @@ void convertFilterSetFromBinary(void **q, const char *buf, int32_t len, uint32_t
}
}
taosHashPut
(
pObj
,
(
char
*
)
pvar
,
t
,
&
dummy
,
sizeof
(
dummy
));
taosHashPut
(
pObj
,
(
char
*
)
pvar
,
t
,
&
dummy
,
sizeof
(
dummy
));
tVariantDestroy
(
&
tmpVar
);
memset
(
&
tmpVar
,
0
,
sizeof
(
tmpVar
));
}
}
*
q
=
(
void
*
)
pObj
;
*
q
=
(
void
*
)
pObj
;
pObj
=
NULL
;
pObj
=
NULL
;
err_ret:
err_ret:
tVariantDestroy
(
&
tmpVar
);
taosHashCleanup
(
pObj
);
taosHashCleanup
(
pObj
);
tfree
(
tmp
);
tfree
(
tmp
);
}
}
...
...
src/query/inc/qFilter.h
浏览文件 @
56177e18
...
@@ -36,6 +36,7 @@ enum {
...
@@ -36,6 +36,7 @@ enum {
FLD_TYPE_MAX
=
3
,
FLD_TYPE_MAX
=
3
,
FLD_DESC_NO_FREE
=
4
,
FLD_DESC_NO_FREE
=
4
,
FLD_DATA_NO_FREE
=
8
,
FLD_DATA_NO_FREE
=
8
,
FLD_DATA_IS_HASH
=
16
,
};
};
enum
{
enum
{
...
@@ -64,6 +65,7 @@ enum {
...
@@ -64,6 +65,7 @@ enum {
FI_STATUS_ALL
=
1
,
FI_STATUS_ALL
=
1
,
FI_STATUS_EMPTY
=
2
,
FI_STATUS_EMPTY
=
2
,
FI_STATUS_REWRITE
=
4
,
FI_STATUS_REWRITE
=
4
,
FI_STATUS_CLONED
=
8
,
};
};
enum
{
enum
{
...
@@ -187,7 +189,6 @@ typedef struct SFilterUnit {
...
@@ -187,7 +189,6 @@ typedef struct SFilterUnit {
}
SFilterUnit
;
}
SFilterUnit
;
typedef
struct
SFilterPCtx
{
typedef
struct
SFilterPCtx
{
SHashObj
*
colHash
;
SHashObj
*
valHash
;
SHashObj
*
valHash
;
SHashObj
*
unitHash
;
SHashObj
*
unitHash
;
}
SFilterPCtx
;
}
SFilterPCtx
;
...
@@ -232,7 +233,7 @@ typedef struct SFilterInfo {
...
@@ -232,7 +233,7 @@ typedef struct SFilterInfo {
#define RESET_RANGE(ctx, r) do { (r)->next = (ctx)->rf; (ctx)->rf = r; } while (0)
#define RESET_RANGE(ctx, r) do { (r)->next = (ctx)->rf; (ctx)->rf = r; } while (0)
#define FREE_RANGE(ctx, r) do { if ((r)->prev) { (r)->prev->next = (r)->next; } else { (ctx)->rs = (r)->next;} if ((r)->next) { (r)->next->prev = (r)->prev; } RESET_RANGE(ctx, r); } while (0)
#define FREE_RANGE(ctx, r) do { if ((r)->prev) { (r)->prev->next = (r)->next; } else { (ctx)->rs = (r)->next;} if ((r)->next) { (r)->next->prev = (r)->prev; } RESET_RANGE(ctx, r); } while (0)
#define FREE_FROM_RANGE(ctx, r) do {
if ((r)->prev) { (r)->prev->next = NULL; } else { (ctx)->rs = NULL;} while (r) {SFilterRangeNode *n = (r)->next; RESET_RANGE(ctx, r);
r = n; } } while (0)
#define FREE_FROM_RANGE(ctx, r) do {
SFilterRangeNode *_r = r; if ((_r)->prev) { (_r)->prev->next = NULL; } else { (ctx)->rs = NULL;} while (_r) {SFilterRangeNode *n = (_r)->next; RESET_RANGE(ctx, _r); _
r = n; } } while (0)
#define INSERT_RANGE(ctx, r, ra) do { SFilterRangeNode *n = filterNewRange(ctx, ra); n->prev = (r)->prev; if ((r)->prev) { (r)->prev->next = n; } else { (ctx)->rs = n; } (r)->prev = n; n->next = r; } while (0)
#define INSERT_RANGE(ctx, r, ra) do { SFilterRangeNode *n = filterNewRange(ctx, ra); n->prev = (r)->prev; if ((r)->prev) { (r)->prev->next = n; } else { (ctx)->rs = n; } (r)->prev = n; n->next = r; } while (0)
#define APPEND_RANGE(ctx, r, ra) do { SFilterRangeNode *n = filterNewRange(ctx, ra); n->prev = (r); if (r) { (r)->next = n; } else { (ctx)->rs = n; } } while (0)
#define APPEND_RANGE(ctx, r, ra) do { SFilterRangeNode *n = filterNewRange(ctx, ra); n->prev = (r); if (r) { (r)->next = n; } else { (ctx)->rs = n; } } while (0)
...
...
src/query/src/qExecutor.c
浏览文件 @
56177e18
...
@@ -2847,7 +2847,10 @@ int32_t loadDataBlockOnDemand(SQueryRuntimeEnv* pRuntimeEnv, STableScanInfo* pTa
...
@@ -2847,7 +2847,10 @@ int32_t loadDataBlockOnDemand(SQueryRuntimeEnv* pRuntimeEnv, STableScanInfo* pTa
return
terrno
;
return
terrno
;
}
}
doSetFilterColInfo
(
pQueryAttr
->
pFilters
,
pBlock
);
if
(
pQueryAttr
->
pFilters
!=
NULL
)
{
doSetFilterColInfo
(
pQueryAttr
->
pFilters
,
pBlock
);
}
if
(
pQueryAttr
->
pFilters
!=
NULL
||
pRuntimeEnv
->
pTsBuf
!=
NULL
)
{
if
(
pQueryAttr
->
pFilters
!=
NULL
||
pRuntimeEnv
->
pTsBuf
!=
NULL
)
{
filterColRowsInDataBlock
(
pRuntimeEnv
,
pBlock
,
ascQuery
);
filterColRowsInDataBlock
(
pRuntimeEnv
,
pBlock
,
ascQuery
);
}
}
...
@@ -7575,6 +7578,8 @@ _cleanup_qinfo:
...
@@ -7575,6 +7578,8 @@ _cleanup_qinfo:
tfree
(
pExprs
);
tfree
(
pExprs
);
filterFreeInfo
(
pFilters
);
_cleanup:
_cleanup:
freeQInfo
(
pQInfo
);
freeQInfo
(
pQInfo
);
return
NULL
;
return
NULL
;
...
@@ -7930,6 +7935,8 @@ void freeQueryAttr(SQueryAttr* pQueryAttr) {
...
@@ -7930,6 +7935,8 @@ void freeQueryAttr(SQueryAttr* pQueryAttr) {
taosArrayDestroy
(
pQueryAttr
->
pGroupbyExpr
->
columnInfo
);
taosArrayDestroy
(
pQueryAttr
->
pGroupbyExpr
->
columnInfo
);
tfree
(
pQueryAttr
->
pGroupbyExpr
);
tfree
(
pQueryAttr
->
pGroupbyExpr
);
}
}
filterFreeInfo
(
pQueryAttr
->
pFilters
);
}
}
}
}
src/query/src/qFilter.c
浏览文件 @
56177e18
...
@@ -581,6 +581,13 @@ int32_t filterFreeRangeCtx(void* h) {
...
@@ -581,6 +581,13 @@ int32_t filterFreeRangeCtx(void* h) {
r
=
rn
;
r
=
rn
;
}
}
r
=
ctx
->
rf
;
while
(
r
)
{
rn
=
r
->
next
;
free
(
r
);
r
=
rn
;
}
free
(
ctx
);
free
(
ctx
);
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
...
@@ -654,7 +661,7 @@ int32_t filterGetFiledByData(SFilterInfo *info, int32_t type, void *v, int32_t d
...
@@ -654,7 +661,7 @@ int32_t filterGetFiledByData(SFilterInfo *info, int32_t type, void *v, int32_t d
}
}
int32_t
filterAddField
(
SFilterInfo
*
info
,
void
*
desc
,
void
*
data
,
int32_t
type
,
SFilterFieldId
*
fid
,
int32_t
dataLen
)
{
int32_t
filterAddField
(
SFilterInfo
*
info
,
void
*
desc
,
void
*
*
data
,
int32_t
type
,
SFilterFieldId
*
fid
,
int32_t
dataLen
,
bool
freeIfExists
)
{
int32_t
idx
=
-
1
;
int32_t
idx
=
-
1
;
uint16_t
*
num
;
uint16_t
*
num
;
...
@@ -663,8 +670,8 @@ int32_t filterAddField(SFilterInfo *info, void *desc, void *data, int32_t type,
...
@@ -663,8 +670,8 @@ int32_t filterAddField(SFilterInfo *info, void *desc, void *data, int32_t type,
if
(
*
num
>
0
)
{
if
(
*
num
>
0
)
{
if
(
type
==
FLD_TYPE_COLUMN
)
{
if
(
type
==
FLD_TYPE_COLUMN
)
{
idx
=
filterGetFiledByDesc
(
&
info
->
fields
[
type
],
type
,
desc
);
idx
=
filterGetFiledByDesc
(
&
info
->
fields
[
type
],
type
,
desc
);
}
else
if
(
dataLen
>
0
&&
FILTER_GET_FLAG
(
info
->
options
,
FI_OPTION_NEED_UNIQE
))
{
}
else
if
(
data
&&
(
*
data
)
&&
data
Len
>
0
&&
FILTER_GET_FLAG
(
info
->
options
,
FI_OPTION_NEED_UNIQE
))
{
idx
=
filterGetFiledByData
(
info
,
type
,
data
,
dataLen
);
idx
=
filterGetFiledByData
(
info
,
type
,
*
data
,
dataLen
);
}
}
}
}
...
@@ -677,15 +684,28 @@ int32_t filterAddField(SFilterInfo *info, void *desc, void *data, int32_t type,
...
@@ -677,15 +684,28 @@ int32_t filterAddField(SFilterInfo *info, void *desc, void *data, int32_t type,
info
->
fields
[
type
].
fields
[
idx
].
flag
=
type
;
info
->
fields
[
type
].
fields
[
idx
].
flag
=
type
;
info
->
fields
[
type
].
fields
[
idx
].
desc
=
desc
;
info
->
fields
[
type
].
fields
[
idx
].
desc
=
desc
;
info
->
fields
[
type
].
fields
[
idx
].
data
=
data
;
info
->
fields
[
type
].
fields
[
idx
].
data
=
data
?
*
data
:
NULL
;
if
(
type
==
FLD_TYPE_COLUMN
)
{
FILTER_SET_FLAG
(
info
->
fields
[
type
].
fields
[
idx
].
flag
,
FLD_DATA_NO_FREE
);
}
++
(
*
num
);
++
(
*
num
);
if
(
data
&&
dataLen
>
0
&&
FILTER_GET_FLAG
(
info
->
options
,
FI_OPTION_NEED_UNIQE
))
{
if
(
data
&&
(
*
data
)
&&
dataLen
>
0
&&
FILTER_GET_FLAG
(
info
->
options
,
FI_OPTION_NEED_UNIQE
))
{
if
(
info
->
pctx
.
valHash
==
NULL
)
{
if
(
info
->
pctx
.
valHash
==
NULL
)
{
info
->
pctx
.
valHash
=
taosHashInit
(
FILTER_DEFAULT_GROUP_SIZE
*
FILTER_DEFAULT_VALUE_SIZE
,
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_BINARY
),
false
,
false
);
info
->
pctx
.
valHash
=
taosHashInit
(
FILTER_DEFAULT_GROUP_SIZE
*
FILTER_DEFAULT_VALUE_SIZE
,
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_BINARY
),
false
,
false
);
}
}
taosHashPut
(
info
->
pctx
.
valHash
,
data
,
dataLen
,
&
idx
,
sizeof
(
idx
));
taosHashPut
(
info
->
pctx
.
valHash
,
*
data
,
dataLen
,
&
idx
,
sizeof
(
idx
));
}
}
else
{
if
(
freeIfExists
)
{
tfree
(
desc
);
}
if
(
data
&&
freeIfExists
)
{
tfree
(
*
data
);
}
}
}
}
...
@@ -696,7 +716,7 @@ int32_t filterAddField(SFilterInfo *info, void *desc, void *data, int32_t type,
...
@@ -696,7 +716,7 @@ int32_t filterAddField(SFilterInfo *info, void *desc, void *data, int32_t type,
}
}
static
FORCE_INLINE
int32_t
filterAddColFieldFromField
(
SFilterInfo
*
info
,
SFilterField
*
field
,
SFilterFieldId
*
fid
)
{
static
FORCE_INLINE
int32_t
filterAddColFieldFromField
(
SFilterInfo
*
info
,
SFilterField
*
field
,
SFilterFieldId
*
fid
)
{
filterAddField
(
info
,
field
->
desc
,
field
->
data
,
FILTER_GET_TYPE
(
field
->
flag
),
fid
,
0
);
filterAddField
(
info
,
field
->
desc
,
&
field
->
data
,
FILTER_GET_TYPE
(
field
->
flag
),
fid
,
0
,
false
);
FILTER_SET_FLAG
(
field
->
flag
,
FLD_DESC_NO_FREE
);
FILTER_SET_FLAG
(
field
->
flag
,
FLD_DESC_NO_FREE
);
FILTER_SET_FLAG
(
field
->
flag
,
FLD_DATA_NO_FREE
);
FILTER_SET_FLAG
(
field
->
flag
,
FLD_DATA_NO_FREE
);
...
@@ -722,7 +742,7 @@ int32_t filterAddFieldFromNode(SFilterInfo *info, tExprNode *node, SFilterFieldI
...
@@ -722,7 +742,7 @@ int32_t filterAddFieldFromNode(SFilterInfo *info, tExprNode *node, SFilterFieldI
node
->
pVal
=
NULL
;
node
->
pVal
=
NULL
;
}
}
filterAddField
(
info
,
v
,
NULL
,
type
,
fid
,
0
);
filterAddField
(
info
,
v
,
NULL
,
type
,
fid
,
0
,
true
);
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
...
@@ -829,7 +849,7 @@ int32_t filterAddGroupUnitFromNode(SFilterInfo *info, tExprNode* tree, SArray *g
...
@@ -829,7 +849,7 @@ int32_t filterAddGroupUnitFromNode(SFilterInfo *info, tExprNode* tree, SArray *g
len
=
tDataTypes
[
type
].
bytes
;
len
=
tDataTypes
[
type
].
bytes
;
}
}
filterAddField
(
info
,
NULL
,
fdata
,
FLD_TYPE_VALUE
,
&
right
,
len
);
filterAddField
(
info
,
NULL
,
&
fdata
,
FLD_TYPE_VALUE
,
&
right
,
len
,
true
);
filterAddUnit
(
info
,
TSDB_RELATION_EQUAL
,
&
left
,
&
right
,
&
uidx
);
filterAddUnit
(
info
,
TSDB_RELATION_EQUAL
,
&
left
,
&
right
,
&
uidx
);
...
@@ -840,6 +860,8 @@ int32_t filterAddGroupUnitFromNode(SFilterInfo *info, tExprNode* tree, SArray *g
...
@@ -840,6 +860,8 @@ int32_t filterAddGroupUnitFromNode(SFilterInfo *info, tExprNode* tree, SArray *g
p
=
taosHashIterate
((
SHashObj
*
)
data
,
p
);
p
=
taosHashIterate
((
SHashObj
*
)
data
,
p
);
}
}
taosHashCleanup
(
data
);
}
else
{
}
else
{
filterAddFieldFromNode
(
info
,
tree
->
_node
.
pRight
,
&
right
);
filterAddFieldFromNode
(
info
,
tree
->
_node
.
pRight
,
&
right
);
...
@@ -858,28 +880,34 @@ int32_t filterAddGroupUnitFromNode(SFilterInfo *info, tExprNode* tree, SArray *g
...
@@ -858,28 +880,34 @@ int32_t filterAddGroupUnitFromNode(SFilterInfo *info, tExprNode* tree, SArray *g
int32_t
filterAddUnitFromUnit
(
SFilterInfo
*
dst
,
SFilterInfo
*
src
,
SFilterUnit
*
u
,
uint16_t
*
uidx
)
{
int32_t
filterAddUnitFromUnit
(
SFilterInfo
*
dst
,
SFilterInfo
*
src
,
SFilterUnit
*
u
,
uint16_t
*
uidx
)
{
SFilterFieldId
left
,
right
,
*
pright
=
&
right
;
SFilterFieldId
left
,
right
,
*
pright
=
&
right
;
int32_t
type
=
FILTER_UNIT_DATA_TYPE
(
u
);
int32_t
type
=
FILTER_UNIT_DATA_TYPE
(
u
);
uint16_t
flag
=
FLD_DESC_NO_FREE
;
filterAddField
(
dst
,
FILTER_UNIT_COL_DESC
(
src
,
u
),
NULL
,
FLD_TYPE_COLUMN
,
&
left
,
0
);
filterAddField
(
dst
,
FILTER_UNIT_COL_DESC
(
src
,
u
),
NULL
,
FLD_TYPE_COLUMN
,
&
left
,
0
,
false
);
SFilterField
*
t
=
FILTER_UNIT_LEFT_FIELD
(
src
,
u
);
SFilterField
*
t
=
FILTER_UNIT_LEFT_FIELD
(
src
,
u
);
FILTER_SET_FLAG
(
t
->
flag
,
FLD_DESC_NO_FREE
);
FILTER_SET_FLAG
(
t
->
flag
,
flag
);
if
(
u
->
right
.
type
==
FLD_TYPE_VALUE
)
{
if
(
u
->
right
.
type
==
FLD_TYPE_VALUE
)
{
void
*
data
=
FILTER_UNIT_VAL_DATA
(
src
,
u
);
void
*
data
=
FILTER_UNIT_VAL_DATA
(
src
,
u
);
if
(
IS_VAR_DATA_TYPE
(
type
))
{
if
(
IS_VAR_DATA_TYPE
(
type
))
{
if
(
FILTER_UNIT_OPTR
(
u
)
==
TSDB_RELATION_IN
)
{
if
(
FILTER_UNIT_OPTR
(
u
)
==
TSDB_RELATION_IN
)
{
filterAddField
(
dst
,
NULL
,
data
,
FLD_TYPE_VALUE
,
&
right
,
0
);
filterAddField
(
dst
,
NULL
,
&
data
,
FLD_TYPE_VALUE
,
&
right
,
0
,
false
);
t
=
FILTER_GET_FIELD
(
dst
,
right
);
FILTER_SET_FLAG
(
t
->
flag
,
FLD_DATA_IS_HASH
);
}
else
{
}
else
{
filterAddField
(
dst
,
NULL
,
data
,
FLD_TYPE_VALUE
,
&
right
,
varDataTLen
(
data
)
);
filterAddField
(
dst
,
NULL
,
&
data
,
FLD_TYPE_VALUE
,
&
right
,
varDataTLen
(
data
),
false
);
}
}
}
else
{
}
else
{
filterAddField
(
dst
,
NULL
,
data
,
FLD_TYPE_VALUE
,
&
right
,
tDataTypes
[
type
].
bytes
);
filterAddField
(
dst
,
NULL
,
&
data
,
FLD_TYPE_VALUE
,
&
right
,
tDataTypes
[
type
].
bytes
,
false
);
}
}
flag
=
FLD_DATA_NO_FREE
;
t
=
FILTER_UNIT_RIGHT_FIELD
(
src
,
u
);
t
=
FILTER_UNIT_RIGHT_FIELD
(
src
,
u
);
FILTER_SET_FLAG
(
t
->
flag
,
FLD_DATA_NO_FREE
);
FILTER_SET_FLAG
(
t
->
flag
,
flag
);
}
else
{
}
else
{
pright
=
NULL
;
pright
=
NULL
;
}
}
return
filterAddUnit
(
dst
,
FILTER_UNIT_OPTR
(
u
),
&
left
,
pright
,
uidx
);
return
filterAddUnit
(
dst
,
FILTER_UNIT_OPTR
(
u
),
&
left
,
pright
,
uidx
);
}
}
...
@@ -926,7 +954,7 @@ int32_t filterAddGroupUnitFromCtx(SFilterInfo *dst, SFilterInfo *src, SFilterRan
...
@@ -926,7 +954,7 @@ int32_t filterAddGroupUnitFromCtx(SFilterInfo *dst, SFilterInfo *src, SFilterRan
if
(
func
(
&
ra
->
s
,
&
ra
->
e
)
==
0
)
{
if
(
func
(
&
ra
->
s
,
&
ra
->
e
)
==
0
)
{
void
*
data
=
malloc
(
sizeof
(
int64_t
));
void
*
data
=
malloc
(
sizeof
(
int64_t
));
SIMPLE_COPY_VALUES
(
data
,
&
ra
->
s
);
SIMPLE_COPY_VALUES
(
data
,
&
ra
->
s
);
filterAddField
(
dst
,
NULL
,
data
,
FLD_TYPE_VALUE
,
&
right
,
tDataTypes
[
type
].
bytes
);
filterAddField
(
dst
,
NULL
,
&
data
,
FLD_TYPE_VALUE
,
&
right
,
tDataTypes
[
type
].
bytes
,
true
);
filterAddUnit
(
dst
,
TSDB_RELATION_EQUAL
,
&
left
,
&
right
,
&
uidx
);
filterAddUnit
(
dst
,
TSDB_RELATION_EQUAL
,
&
left
,
&
right
,
&
uidx
);
filterAddUnitToGroup
(
g
,
uidx
);
filterAddUnitToGroup
(
g
,
uidx
);
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
...
@@ -936,7 +964,7 @@ int32_t filterAddGroupUnitFromCtx(SFilterInfo *dst, SFilterInfo *src, SFilterRan
...
@@ -936,7 +964,7 @@ int32_t filterAddGroupUnitFromCtx(SFilterInfo *dst, SFilterInfo *src, SFilterRan
if
(
!
FILTER_GET_FLAG
(
ra
->
sflag
,
RA_NULL
))
{
if
(
!
FILTER_GET_FLAG
(
ra
->
sflag
,
RA_NULL
))
{
void
*
data
=
malloc
(
sizeof
(
int64_t
));
void
*
data
=
malloc
(
sizeof
(
int64_t
));
SIMPLE_COPY_VALUES
(
data
,
&
ra
->
s
);
SIMPLE_COPY_VALUES
(
data
,
&
ra
->
s
);
filterAddField
(
dst
,
NULL
,
data
,
FLD_TYPE_VALUE
,
&
right
,
tDataTypes
[
type
].
bytes
);
filterAddField
(
dst
,
NULL
,
&
data
,
FLD_TYPE_VALUE
,
&
right
,
tDataTypes
[
type
].
bytes
,
true
);
filterAddUnit
(
dst
,
FILTER_GET_FLAG
(
ra
->
sflag
,
RA_EXCLUDE
)
?
TSDB_RELATION_GREATER
:
TSDB_RELATION_GREATER_EQUAL
,
&
left
,
&
right
,
&
uidx
);
filterAddUnit
(
dst
,
FILTER_GET_FLAG
(
ra
->
sflag
,
RA_EXCLUDE
)
?
TSDB_RELATION_GREATER
:
TSDB_RELATION_GREATER_EQUAL
,
&
left
,
&
right
,
&
uidx
);
filterAddUnitToGroup
(
g
,
uidx
);
filterAddUnitToGroup
(
g
,
uidx
);
}
}
...
@@ -944,7 +972,7 @@ int32_t filterAddGroupUnitFromCtx(SFilterInfo *dst, SFilterInfo *src, SFilterRan
...
@@ -944,7 +972,7 @@ int32_t filterAddGroupUnitFromCtx(SFilterInfo *dst, SFilterInfo *src, SFilterRan
if
(
!
FILTER_GET_FLAG
(
ra
->
eflag
,
RA_NULL
))
{
if
(
!
FILTER_GET_FLAG
(
ra
->
eflag
,
RA_NULL
))
{
void
*
data
=
malloc
(
sizeof
(
int64_t
));
void
*
data
=
malloc
(
sizeof
(
int64_t
));
SIMPLE_COPY_VALUES
(
data
,
&
ra
->
e
);
SIMPLE_COPY_VALUES
(
data
,
&
ra
->
e
);
filterAddField
(
dst
,
NULL
,
data
,
FLD_TYPE_VALUE
,
&
right
,
tDataTypes
[
type
].
bytes
);
filterAddField
(
dst
,
NULL
,
&
data
,
FLD_TYPE_VALUE
,
&
right
,
tDataTypes
[
type
].
bytes
,
true
);
filterAddUnit
(
dst
,
FILTER_GET_FLAG
(
ra
->
eflag
,
RA_EXCLUDE
)
?
TSDB_RELATION_LESS
:
TSDB_RELATION_LESS_EQUAL
,
&
left
,
&
right
,
&
uidx
);
filterAddUnit
(
dst
,
FILTER_GET_FLAG
(
ra
->
eflag
,
RA_EXCLUDE
)
?
TSDB_RELATION_LESS
:
TSDB_RELATION_LESS_EQUAL
,
&
left
,
&
right
,
&
uidx
);
filterAddUnitToGroup
(
g
,
uidx
);
filterAddUnitToGroup
(
g
,
uidx
);
}
}
...
@@ -990,7 +1018,7 @@ int32_t filterAddGroupUnitFromCtx(SFilterInfo *dst, SFilterInfo *src, SFilterRan
...
@@ -990,7 +1018,7 @@ int32_t filterAddGroupUnitFromCtx(SFilterInfo *dst, SFilterInfo *src, SFilterRan
if
(
func
(
&
r
->
ra
.
s
,
&
r
->
ra
.
e
)
==
0
)
{
if
(
func
(
&
r
->
ra
.
s
,
&
r
->
ra
.
e
)
==
0
)
{
void
*
data
=
malloc
(
sizeof
(
int64_t
));
void
*
data
=
malloc
(
sizeof
(
int64_t
));
SIMPLE_COPY_VALUES
(
data
,
&
r
->
ra
.
s
);
SIMPLE_COPY_VALUES
(
data
,
&
r
->
ra
.
s
);
filterAddField
(
dst
,
NULL
,
data
,
FLD_TYPE_VALUE
,
&
right
,
tDataTypes
[
type
].
bytes
);
filterAddField
(
dst
,
NULL
,
&
data
,
FLD_TYPE_VALUE
,
&
right
,
tDataTypes
[
type
].
bytes
,
true
);
filterAddUnit
(
dst
,
TSDB_RELATION_EQUAL
,
&
left
,
&
right
,
&
uidx
);
filterAddUnit
(
dst
,
TSDB_RELATION_EQUAL
,
&
left
,
&
right
,
&
uidx
);
filterAddUnitToGroup
(
g
,
uidx
);
filterAddUnitToGroup
(
g
,
uidx
);
...
@@ -1004,7 +1032,7 @@ int32_t filterAddGroupUnitFromCtx(SFilterInfo *dst, SFilterInfo *src, SFilterRan
...
@@ -1004,7 +1032,7 @@ int32_t filterAddGroupUnitFromCtx(SFilterInfo *dst, SFilterInfo *src, SFilterRan
if
(
!
FILTER_GET_FLAG
(
r
->
ra
.
sflag
,
RA_NULL
))
{
if
(
!
FILTER_GET_FLAG
(
r
->
ra
.
sflag
,
RA_NULL
))
{
void
*
data
=
malloc
(
sizeof
(
int64_t
));
void
*
data
=
malloc
(
sizeof
(
int64_t
));
SIMPLE_COPY_VALUES
(
data
,
&
r
->
ra
.
s
);
SIMPLE_COPY_VALUES
(
data
,
&
r
->
ra
.
s
);
filterAddField
(
dst
,
NULL
,
data
,
FLD_TYPE_VALUE
,
&
right
,
tDataTypes
[
type
].
bytes
);
filterAddField
(
dst
,
NULL
,
&
data
,
FLD_TYPE_VALUE
,
&
right
,
tDataTypes
[
type
].
bytes
,
true
);
filterAddUnit
(
dst
,
FILTER_GET_FLAG
(
r
->
ra
.
sflag
,
RA_EXCLUDE
)
?
TSDB_RELATION_GREATER
:
TSDB_RELATION_GREATER_EQUAL
,
&
left
,
&
right
,
&
uidx
);
filterAddUnit
(
dst
,
FILTER_GET_FLAG
(
r
->
ra
.
sflag
,
RA_EXCLUDE
)
?
TSDB_RELATION_GREATER
:
TSDB_RELATION_GREATER_EQUAL
,
&
left
,
&
right
,
&
uidx
);
filterAddUnitToGroup
(
g
,
uidx
);
filterAddUnitToGroup
(
g
,
uidx
);
}
}
...
@@ -1012,7 +1040,7 @@ int32_t filterAddGroupUnitFromCtx(SFilterInfo *dst, SFilterInfo *src, SFilterRan
...
@@ -1012,7 +1040,7 @@ int32_t filterAddGroupUnitFromCtx(SFilterInfo *dst, SFilterInfo *src, SFilterRan
if
(
!
FILTER_GET_FLAG
(
r
->
ra
.
eflag
,
RA_NULL
))
{
if
(
!
FILTER_GET_FLAG
(
r
->
ra
.
eflag
,
RA_NULL
))
{
void
*
data
=
malloc
(
sizeof
(
int64_t
));
void
*
data
=
malloc
(
sizeof
(
int64_t
));
SIMPLE_COPY_VALUES
(
data
,
&
r
->
ra
.
e
);
SIMPLE_COPY_VALUES
(
data
,
&
r
->
ra
.
e
);
filterAddField
(
dst
,
NULL
,
data
,
FLD_TYPE_VALUE
,
&
right
,
tDataTypes
[
type
].
bytes
);
filterAddField
(
dst
,
NULL
,
&
data
,
FLD_TYPE_VALUE
,
&
right
,
tDataTypes
[
type
].
bytes
,
true
);
filterAddUnit
(
dst
,
FILTER_GET_FLAG
(
r
->
ra
.
eflag
,
RA_EXCLUDE
)
?
TSDB_RELATION_LESS
:
TSDB_RELATION_LESS_EQUAL
,
&
left
,
&
right
,
&
uidx
);
filterAddUnit
(
dst
,
FILTER_GET_FLAG
(
r
->
ra
.
eflag
,
RA_EXCLUDE
)
?
TSDB_RELATION_LESS
:
TSDB_RELATION_LESS_EQUAL
,
&
left
,
&
right
,
&
uidx
);
filterAddUnitToGroup
(
g
,
uidx
);
filterAddUnitToGroup
(
g
,
uidx
);
}
}
...
@@ -1031,11 +1059,13 @@ int32_t filterAddGroupUnitFromCtx(SFilterInfo *dst, SFilterInfo *src, SFilterRan
...
@@ -1031,11 +1059,13 @@ int32_t filterAddGroupUnitFromCtx(SFilterInfo *dst, SFilterInfo *src, SFilterRan
static
void
filterFreeGroup
(
void
*
pItem
)
{
static
void
filterFreeGroup
(
void
*
pItem
)
{
SFilterGroup
*
p
=
(
SFilterGroup
*
)
pItem
;
if
(
pItem
==
NULL
)
{
if
(
p
)
{
return
;
tfree
(
p
->
unitIdxs
);
tfree
(
p
->
unitFlags
);
}
}
SFilterGroup
*
p
=
(
SFilterGroup
*
)
pItem
;
tfree
(
p
->
unitIdxs
);
tfree
(
p
->
unitFlags
);
}
}
...
@@ -1113,10 +1143,10 @@ void filterDumpInfoToString(SFilterInfo *info, const char *msg, int32_t options)
...
@@ -1113,10 +1143,10 @@ void filterDumpInfoToString(SFilterInfo *info, const char *msg, int32_t options)
if
(
var
->
nType
==
TSDB_DATA_TYPE_VALUE_ARRAY
)
{
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
));
qDebug
(
"VAL%d => [type:TS][val:[%"
PRIi64
"] - [%"
PRId64
"]]"
,
i
,
*
(
int64_t
*
)
field
->
data
,
*
(((
int64_t
*
)
field
->
data
)
+
1
));
}
else
{
}
else
{
qDebug
(
"VAL%d => [type:%d][val:%"
PRI
i
64
"]"
,
i
,
var
->
nType
,
var
->
i64
);
//TODO
qDebug
(
"VAL%d => [type:%d][val:%"
PRI
x
64
"]"
,
i
,
var
->
nType
,
var
->
i64
);
//TODO
}
}
}
else
{
}
else
if
(
field
->
data
)
{
qDebug
(
"VAL%d => [type:NIL][val:
0x%"
PRIx64
"]"
,
i
,
*
(
int64_t
*
)
field
->
data
);
//TODO
qDebug
(
"VAL%d => [type:NIL][val:
NIL]"
,
i
);
//TODO
}
}
}
}
...
@@ -1248,10 +1278,67 @@ void filterFreeGroupCtx(SFilterGroupCtx* gRes) {
...
@@ -1248,10 +1278,67 @@ void filterFreeGroupCtx(SFilterGroupCtx* gRes) {
tfree
(
gRes
);
tfree
(
gRes
);
}
}
void
filterFreeField
(
SFilterField
*
field
,
int32_t
type
)
{
if
(
field
==
NULL
)
{
return
;
}
if
(
!
FILTER_GET_FLAG
(
field
->
flag
,
FLD_DESC_NO_FREE
))
{
if
(
type
==
FLD_TYPE_VALUE
)
{
tVariantDestroy
(
field
->
desc
);
}
tfree
(
field
->
desc
);
}
if
(
!
FILTER_GET_FLAG
(
field
->
flag
,
FLD_DATA_NO_FREE
))
{
if
(
FILTER_GET_FLAG
(
field
->
flag
,
FLD_DATA_IS_HASH
))
{
taosHashCleanup
(
field
->
data
);
}
else
{
tfree
(
field
->
data
);
}
}
}
void
filterFreePCtx
(
SFilterPCtx
*
pctx
)
{
taosHashCleanup
(
pctx
->
valHash
);
taosHashCleanup
(
pctx
->
unitHash
);
}
void
filterFreeInfo
(
SFilterInfo
*
info
)
{
void
filterFreeInfo
(
SFilterInfo
*
info
)
{
CHK_RETV
(
info
==
NULL
);
CHK_RETV
(
info
==
NULL
);
//TODO
for
(
int32_t
i
=
0
;
i
<
FLD_TYPE_MAX
;
++
i
)
{
for
(
uint16_t
f
=
0
;
f
<
info
->
fields
[
i
].
num
;
++
f
)
{
filterFreeField
(
&
info
->
fields
[
i
].
fields
[
f
],
i
);
}
tfree
(
info
->
fields
[
i
].
fields
);
}
for
(
int32_t
i
=
0
;
i
<
info
->
groupNum
;
++
i
)
{
filterFreeGroup
(
&
info
->
groups
[
i
]);
}
tfree
(
info
->
groups
);
tfree
(
info
->
units
);
tfree
(
info
->
unitRes
);
tfree
(
info
->
unitFlags
);
for
(
uint16_t
i
=
0
;
i
<
info
->
colRangeNum
;
++
i
)
{
filterFreeRangeCtx
(
info
->
colRange
[
i
]);
}
tfree
(
info
->
colRange
);
filterFreePCtx
(
&
info
->
pctx
);
if
(
!
FILTER_GET_FLAG
(
info
->
status
,
FI_STATUS_CLONED
))
{
tfree
(
info
);
}
}
}
...
@@ -1281,14 +1368,16 @@ int32_t filterInitValFieldData(SFilterInfo *info) {
...
@@ -1281,14 +1368,16 @@ int32_t filterInitValFieldData(SFilterInfo *info) {
if
(
unit
->
compare
.
optr
==
TSDB_RELATION_IN
)
{
if
(
unit
->
compare
.
optr
==
TSDB_RELATION_IN
)
{
convertFilterSetFromBinary
((
void
**
)
&
fi
->
data
,
var
->
pz
,
var
->
nLen
,
type
);
convertFilterSetFromBinary
((
void
**
)
&
fi
->
data
,
var
->
pz
,
var
->
nLen
,
type
);
CHK_LRET
(
fi
->
data
==
NULL
,
TSDB_CODE_QRY_APP_ERROR
,
"failed to convert in param"
);
CHK_LRET
(
fi
->
data
==
NULL
,
TSDB_CODE_QRY_APP_ERROR
,
"failed to convert in param"
);
FILTER_SET_FLAG
(
fi
->
flag
,
FLD_DATA_IS_HASH
);
continue
;
continue
;
}
}
if
(
type
==
TSDB_DATA_TYPE_BINARY
)
{
if
(
type
==
TSDB_DATA_TYPE_BINARY
)
{
fi
->
data
=
calloc
(
1
,
(
var
->
nLen
+
1
)
*
TSDB_NCHA
R_SIZE
);
fi
->
data
=
calloc
(
1
,
var
->
nLen
+
VARSTR_HEADE
R_SIZE
);
}
else
if
(
type
==
TSDB_DATA_TYPE_NCHAR
)
{
}
else
if
(
type
==
TSDB_DATA_TYPE_NCHAR
)
{
fi
->
data
=
calloc
(
1
,
(
var
->
nLen
+
1
)
*
TSDB_NCHAR_SIZE
);
fi
->
data
=
calloc
(
1
,
(
var
->
nLen
+
VARSTR_HEADER_SIZE
)
*
TSDB_NCHAR_SIZE
);
}
else
{
}
else
{
if
(
var
->
nType
==
TSDB_DATA_TYPE_VALUE_ARRAY
)
{
//TIME RANGE
if
(
var
->
nType
==
TSDB_DATA_TYPE_VALUE_ARRAY
)
{
//TIME RANGE
fi
->
data
=
calloc
(
var
->
nLen
,
tDataTypes
[
type
].
bytes
);
fi
->
data
=
calloc
(
var
->
nLen
,
tDataTypes
[
type
].
bytes
);
...
@@ -1488,7 +1577,9 @@ int32_t filterMergeGroupUnits(SFilterInfo *info, SFilterGroupCtx** gRes, int32_t
...
@@ -1488,7 +1577,9 @@ int32_t filterMergeGroupUnits(SFilterInfo *info, SFilterGroupCtx** gRes, int32_t
colIdx
[
colIdxi
++
]
=
cidx
;
colIdx
[
colIdxi
++
]
=
cidx
;
++
gRes
[
gResIdx
]
->
colNum
;
++
gRes
[
gResIdx
]
->
colNum
;
}
else
{
}
else
{
FILTER_SET_FLAG
(
info
->
status
,
FI_STATUS_REWRITE
);
if
(
!
FILTER_NO_MERGE_DATA_TYPE
(
FILTER_UNIT_DATA_TYPE
(
u
)))
{
FILTER_SET_FLAG
(
info
->
status
,
FI_STATUS_REWRITE
);
}
}
}
FILTER_PUSH_UNIT
(
gRes
[
gResIdx
]
->
colInfo
[
cidx
],
u
);
FILTER_PUSH_UNIT
(
gRes
[
gResIdx
]
->
colInfo
[
cidx
],
u
);
...
@@ -1701,8 +1792,12 @@ int32_t filterMergeTwoGroups(SFilterInfo *info, SFilterGroupCtx** gRes1, SFilter
...
@@ -1701,8 +1792,12 @@ int32_t filterMergeTwoGroups(SFilterInfo *info, SFilterGroupCtx** gRes1, SFilter
_err_return:
_err_return:
if
(
colCtxs
&&
taosArrayGetSize
(
colCtxs
)
>
0
)
{
if
(
colCtxs
)
{
taosArrayDestroyEx
(
colCtxs
,
filterFreeColCtx
);
if
(
taosArrayGetSize
(
colCtxs
)
>
0
)
{
taosArrayDestroyEx
(
colCtxs
,
filterFreeColCtx
);
}
else
{
taosArrayDestroy
(
colCtxs
);
}
}
}
filterFreeRangeCtx
(
ctx
);
filterFreeRangeCtx
(
ctx
);
...
@@ -1823,6 +1918,8 @@ int32_t filterRewrite(SFilterInfo *info, SFilterGroupCtx** gRes, int32_t gResNum
...
@@ -1823,6 +1918,8 @@ int32_t filterRewrite(SFilterInfo *info, SFilterGroupCtx** gRes, int32_t gResNum
}
}
SFilterInfo
oinfo
=
*
info
;
SFilterInfo
oinfo
=
*
info
;
FILTER_SET_FLAG
(
oinfo
.
status
,
FI_STATUS_CLONED
);
SArray
*
group
=
taosArrayInit
(
FILTER_DEFAULT_GROUP_SIZE
,
sizeof
(
SFilterGroup
));
SArray
*
group
=
taosArrayInit
(
FILTER_DEFAULT_GROUP_SIZE
,
sizeof
(
SFilterGroup
));
SFilterGroupCtx
*
res
=
NULL
;
SFilterGroupCtx
*
res
=
NULL
;
...
@@ -1831,6 +1928,7 @@ int32_t filterRewrite(SFilterInfo *info, SFilterGroupCtx** gRes, int32_t gResNum
...
@@ -1831,6 +1928,7 @@ int32_t filterRewrite(SFilterInfo *info, SFilterGroupCtx** gRes, int32_t gResNum
uint16_t
uidx
=
0
;
uint16_t
uidx
=
0
;
memset
(
info
,
0
,
sizeof
(
*
info
));
memset
(
info
,
0
,
sizeof
(
*
info
));
info
->
colRangeNum
=
oinfo
.
colRangeNum
;
info
->
colRangeNum
=
oinfo
.
colRangeNum
;
info
->
colRange
=
oinfo
.
colRange
;
info
->
colRange
=
oinfo
.
colRange
;
oinfo
.
colRangeNum
=
0
;
oinfo
.
colRangeNum
=
0
;
...
@@ -1877,6 +1975,8 @@ int32_t filterRewrite(SFilterInfo *info, SFilterGroupCtx** gRes, int32_t gResNum
...
@@ -1877,6 +1975,8 @@ int32_t filterRewrite(SFilterInfo *info, SFilterGroupCtx** gRes, int32_t gResNum
taosArrayDestroy
(
group
);
taosArrayDestroy
(
group
);
filterFreeInfo
(
&
oinfo
);
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
...
@@ -1961,6 +2061,7 @@ int32_t filterGenerateColRange(SFilterInfo *info, SFilterGroupCtx** gRes, int32_
...
@@ -1961,6 +2061,7 @@ int32_t filterGenerateColRange(SFilterInfo *info, SFilterGroupCtx** gRes, int32_
}
}
_err_return:
_err_return:
tfree
(
idxNum
);
tfree
(
idxs
);
tfree
(
idxs
);
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
...
@@ -1990,12 +2091,13 @@ int32_t filterPreprocess(SFilterInfo *info) {
...
@@ -1990,12 +2091,13 @@ int32_t filterPreprocess(SFilterInfo *info) {
if
(
FILTER_GET_FLAG
(
info
->
status
,
FI_STATUS_ALL
))
{
if
(
FILTER_GET_FLAG
(
info
->
status
,
FI_STATUS_ALL
))
{
qInfo
(
"Final - FilterInfo: [ALL]"
);
qInfo
(
"Final - FilterInfo: [ALL]"
);
return
TSDB_CODE_SUCCESS
;
goto
_return
;
}
}
if
(
FILTER_GET_FLAG
(
info
->
status
,
FI_STATUS_EMPTY
))
{
if
(
FILTER_GET_FLAG
(
info
->
status
,
FI_STATUS_EMPTY
))
{
qInfo
(
"Final - FilterInfo: [EMPTY]"
);
qInfo
(
"Final - FilterInfo: [EMPTY]"
);
return
TSDB_CODE_SUCCESS
;
goto
_return
;
}
}
filterGenerateColRange
(
info
,
gRes
,
gResNum
);
filterGenerateColRange
(
info
,
gRes
,
gResNum
);
...
@@ -2005,6 +2107,14 @@ int32_t filterPreprocess(SFilterInfo *info) {
...
@@ -2005,6 +2107,14 @@ int32_t filterPreprocess(SFilterInfo *info) {
filterPostProcessRange
(
info
);
filterPostProcessRange
(
info
);
filterRewrite
(
info
,
gRes
,
gResNum
);
filterRewrite
(
info
,
gRes
,
gResNum
);
_return:
for
(
int32_t
i
=
0
;
i
<
gResNum
;
++
i
)
{
filterFreeGroupCtx
(
gRes
[
i
]);
}
tfree
(
gRes
);
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
...
...
src/query/src/qSqlParser.c
浏览文件 @
56177e18
...
@@ -459,9 +459,7 @@ static void doDestroySqlExprNode(tSqlExpr *pExpr) {
...
@@ -459,9 +459,7 @@ static void doDestroySqlExprNode(tSqlExpr *pExpr) {
return
;
return
;
}
}
if
(
pExpr
->
tokenId
==
TK_STRING
)
{
tVariantDestroy
(
&
pExpr
->
value
);
tVariantDestroy
(
&
pExpr
->
value
);
}
tSqlExprListDestroy
(
pExpr
->
Expr
.
paramList
);
tSqlExprListDestroy
(
pExpr
->
Expr
.
paramList
);
free
(
pExpr
);
free
(
pExpr
);
...
...
src/query/src/queryMain.c
浏览文件 @
56177e18
...
@@ -175,6 +175,7 @@ int32_t qCreateQueryInfo(void* tsdb, int32_t vgId, SQueryTableMsg* pQueryMsg, qi
...
@@ -175,6 +175,7 @@ int32_t qCreateQueryInfo(void* tsdb, int32_t vgId, SQueryTableMsg* pQueryMsg, qi
param
.
pSecExprs
=
NULL
;
param
.
pSecExprs
=
NULL
;
param
.
pGroupbyExpr
=
NULL
;
param
.
pGroupbyExpr
=
NULL
;
param
.
pTagColumnInfo
=
NULL
;
param
.
pTagColumnInfo
=
NULL
;
param
.
pFilters
=
NULL
;
if
((
*
pQInfo
)
==
NULL
)
{
if
((
*
pQInfo
)
==
NULL
)
{
code
=
TSDB_CODE_QRY_OUT_OF_MEMORY
;
code
=
TSDB_CODE_QRY_OUT_OF_MEMORY
;
...
@@ -200,6 +201,8 @@ int32_t qCreateQueryInfo(void* tsdb, int32_t vgId, SQueryTableMsg* pQueryMsg, qi
...
@@ -200,6 +201,8 @@ int32_t qCreateQueryInfo(void* tsdb, int32_t vgId, SQueryTableMsg* pQueryMsg, qi
freeColumnFilterInfo
(
column
->
flist
.
filterInfo
,
column
->
flist
.
numOfFilters
);
freeColumnFilterInfo
(
column
->
flist
.
filterInfo
,
column
->
flist
.
numOfFilters
);
}
}
filterFreeInfo
(
param
.
pFilters
);
//pQInfo already freed in initQInfo, but *pQInfo may not pointer to null;
//pQInfo already freed in initQInfo, but *pQInfo may not pointer to null;
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
*
pQInfo
=
NULL
;
*
pQInfo
=
NULL
;
...
...
src/util/src/hash.c
浏览文件 @
56177e18
...
@@ -713,7 +713,8 @@ size_t taosHashGetMemSize(const SHashObj *pHashObj) {
...
@@ -713,7 +713,8 @@ size_t taosHashGetMemSize(const SHashObj *pHashObj) {
}
}
FORCE_INLINE
void
*
taosHashGetDataKey
(
SHashObj
*
pHashObj
,
void
*
data
)
{
FORCE_INLINE
void
*
taosHashGetDataKey
(
SHashObj
*
pHashObj
,
void
*
data
)
{
return
GET_HASH_NODE_KEY
(
GET_HASH_PNODE
(
data
));
SHashNode
*
node
=
GET_HASH_PNODE
(
data
);
return
GET_HASH_NODE_KEY
(
node
);
}
}
FORCE_INLINE
uint32_t
taosHashGetDataKeyLen
(
SHashObj
*
pHashObj
,
void
*
data
)
{
FORCE_INLINE
uint32_t
taosHashGetDataKeyLen
(
SHashObj
*
pHashObj
,
void
*
data
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录