Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
dgr6878
TDengine
提交
58258bc9
T
TDengine
项目概览
dgr6878
/
TDengine
与 Fork 源项目一致
Fork自
taosdata / TDengine
通知
8
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看板
体验新版 GitCode,发现更多精彩内容 >>
提交
58258bc9
编写于
4月 03, 2020
作者:
H
hjxilinx
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[td-97] add express tree serialize and deserilize function and the corresponding unit test cases.
上级
ce88438b
变更
10
隐藏空白更改
内联
并排
Showing
10 changed file
with
808 addition
and
66 deletion
+808
-66
.gitignore
.gitignore
+1
-0
src/client/src/tscSQLParser.c
src/client/src/tscSQLParser.c
+6
-6
src/client/src/tscUtil.c
src/client/src/tscUtil.c
+1
-1
src/query/inc/qast.h
src/query/inc/qast.h
+9
-4
src/query/src/qast.c
src/query/src/qast.c
+115
-11
src/query/src/queryExecutor.c
src/query/src/queryExecutor.c
+1
-1
src/query/tests/astTest.cpp
src/query/tests/astTest.cpp
+630
-0
src/util/inc/tbuffer.h
src/util/inc/tbuffer.h
+35
-34
src/util/src/tbuffer.c
src/util/src/tbuffer.c
+9
-8
src/vnode/tsdb/src/tsdbRead.c
src/vnode/tsdb/src/tsdbRead.c
+1
-1
未找到文件。
.gitignore
浏览文件 @
58258bc9
...
...
@@ -12,6 +12,7 @@ rpms/
mac/
*.pyc
*.tmp
*.swp
src/connector/nodejs/node_modules/
src/connector/nodejs/out/
tests/test/
...
...
src/client/src/tscSQLParser.c
浏览文件 @
58258bc9
...
...
@@ -117,7 +117,7 @@ static int32_t doCheckForCreateFromStable(SSqlObj* pSql, SSqlInfo* pInfo);
static
int32_t
doCheckForStream
(
SSqlObj
*
pSql
,
SSqlInfo
*
pInfo
);
static
int32_t
doCheckForQuery
(
SSqlObj
*
pSql
,
SQuerySQL
*
pQuerySql
,
int32_t
index
);
static
int32_t
tSQLBinaryExprCreateFromSqlExpr
(
tExprNode
**
pExpr
,
tSQLExpr
*
pAst
,
int32_t
*
num
,
static
int32_t
convertSyntaxTreeToExprTree
(
tExprNode
**
pExpr
,
tSQLExpr
*
pAst
,
int32_t
*
num
,
SColIndexEx
**
pColIndex
,
SSqlExprInfo
*
pExprInfo
);
/*
...
...
@@ -1211,9 +1211,9 @@ int32_t parseSelectClause(SSqlCmd* pCmd, int32_t clauseIndex, tSQLExprList* pSel
tExprNode
*
pNode
=
NULL
;
SColIndexEx
*
pColIndex
=
NULL
;
int32_t
ret
=
tSQLBinaryExprCreateFromSqlExpr
(
&
pNode
,
pItem
->
pNode
,
&
pBinExprInfo
->
numOfCols
,
&
pColIndex
,
&
pQueryInfo
->
exprsInfo
);
int32_t
ret
=
convertSyntaxTreeToExprTree
(
&
pNode
,
pItem
->
pNode
,
&
pBinExprInfo
->
numOfCols
,
&
pColIndex
,
&
pQueryInfo
->
exprsInfo
);
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
t
SQLBinaryExpr
Destroy
(
&
pNode
,
NULL
);
t
ExprTree
Destroy
(
&
pNode
,
NULL
);
return
invalidSqlErrMsg
(
pQueryInfo
->
msg
,
"invalid expression in select clause"
);
}
...
...
@@ -5807,20 +5807,20 @@ int32_t doCheckForQuery(SSqlObj* pSql, SQuerySQL* pQuerySql, int32_t index) {
return
TSDB_CODE_SUCCESS
;
// Does not build query message here
}
static
int32_t
tSQLBinaryExprCreateFromSqlExpr
(
tExprNode
**
pExpr
,
tSQLExpr
*
pAst
,
int32_t
*
num
,
static
int32_t
convertSyntaxTreeToExprTree
(
tExprNode
**
pExpr
,
tSQLExpr
*
pAst
,
int32_t
*
num
,
SColIndexEx
**
pColIndex
,
SSqlExprInfo
*
pExprInfo
)
{
tExprNode
*
pLeft
=
NULL
;
tExprNode
*
pRight
=
NULL
;
if
(
pAst
->
pLeft
!=
NULL
)
{
int32_t
ret
=
tSQLBinaryExprCreateFromSqlExpr
(
&
pLeft
,
pAst
->
pLeft
,
num
,
pColIndex
,
pExprInfo
);
int32_t
ret
=
convertSyntaxTreeToExprTree
(
&
pLeft
,
pAst
->
pLeft
,
num
,
pColIndex
,
pExprInfo
);
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
return
ret
;
}
}
if
(
pAst
->
pRight
!=
NULL
)
{
int32_t
ret
=
tSQLBinaryExprCreateFromSqlExpr
(
&
pRight
,
pAst
->
pRight
,
num
,
pColIndex
,
pExprInfo
);
int32_t
ret
=
convertSyntaxTreeToExprTree
(
&
pRight
,
pAst
->
pRight
,
num
,
pColIndex
,
pExprInfo
);
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
return
ret
;
}
...
...
src/client/src/tscUtil.c
浏览文件 @
58258bc9
...
...
@@ -1105,7 +1105,7 @@ void tscClearFieldInfo(SFieldInfo* pFieldInfo) {
for
(
int32_t
i
=
0
;
i
<
pFieldInfo
->
numOfOutputCols
;
++
i
)
{
if
(
pFieldInfo
->
pExpr
[
i
]
!=
NULL
)
{
t
SQLBinaryExpr
Destroy
(
&
pFieldInfo
->
pExpr
[
i
]
->
binExprInfo
.
pBinExpr
,
NULL
);
t
ExprTree
Destroy
(
&
pFieldInfo
->
pExpr
[
i
]
->
binExprInfo
.
pBinExpr
,
NULL
);
tfree
(
pFieldInfo
->
pExpr
[
i
]
->
binExprInfo
.
pReqColumns
);
tfree
(
pFieldInfo
->
pExpr
[
i
]);
}
...
...
src/query/inc/qast.h
浏览文件 @
58258bc9
...
...
@@ -16,6 +16,7 @@
#ifndef TDENGINE_TAST_H
#define TDENGINE_TAST_H
#include <tbuffer.h>
#ifdef __cplusplus
extern
"C"
{
#endif
...
...
@@ -64,9 +65,9 @@ typedef struct tExprNode {
uint8_t
nodeType
;
union
{
struct
{
uint8_t
optr
;
// filter operator
uint8_t
hasPK
;
// 0: do not contain primary filter, 1: contain
void
*
info
;
// support filter operation on this expression only available for leaf node
uint8_t
optr
;
// filter operator
uint8_t
hasPK
;
// 0: do not contain primary filter, 1: contain
void
*
info
;
// support filter operation on this expression only available for leaf node
struct
tExprNode
*
pLeft
;
// left child pointer
struct
tExprNode
*
pRight
;
// right child pointer
...
...
@@ -80,7 +81,7 @@ void tSQLBinaryExprFromString(tExprNode **pExpr, SSchema *pSchema, int32_t numOf
void
tSQLBinaryExprToString
(
tExprNode
*
pExpr
,
char
*
dst
,
int32_t
*
len
);
void
t
SQLBinaryExpr
Destroy
(
tExprNode
**
pExprs
,
void
(
*
fp
)(
void
*
));
void
t
ExprTree
Destroy
(
tExprNode
**
pExprs
,
void
(
*
fp
)(
void
*
));
void
tSQLBinaryExprTraverse
(
tExprNode
*
pExpr
,
SSkipList
*
pSkipList
,
SArray
*
result
,
SBinaryFilterSupp
*
param
);
...
...
@@ -91,6 +92,10 @@ void tSQLBinaryExprTrv(tExprNode *pExprs, int32_t *val, int16_t *ids);
uint8_t
getBinaryExprOptr
(
SSQLToken
*
pToken
);
SBuffer
exprTreeToBinary
(
tExprNode
*
pExprTree
);
tExprNode
*
exprTreeFromBinary
(
const
void
*
pBuf
,
size_t
size
);
#ifdef __cplusplus
}
#endif
...
...
src/query/src/qast.c
浏览文件 @
58258bc9
...
...
@@ -13,10 +13,11 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "os.h"
#include "tutil.h"
#include "tbuffer.h"
#include "qast.h"
#include "qsqlparser.h"
#include "qsyntaxtreefunction.h"
#include "taosdef.h"
...
...
@@ -26,9 +27,7 @@
#include "tstoken.h"
#include "ttokendef.h"
#include "../../client/inc/tschemautil.h"
#include "qast.h"
#include "tarray.h"
#include "tskiplist.h"
...
...
@@ -246,6 +245,7 @@ static tExprNode *createSyntaxTree(SSchema *pSchema, int32_t numOfCols, char *st
if
(
t0
.
type
==
TK_RP
)
{
return
NULL
;
}
pLeft
=
tExprNodeCreate
(
pSchema
,
numOfCols
,
&
t0
);
}
...
...
@@ -433,24 +433,33 @@ static void tExprNodeDestroy(tExprNode *pNode, void (*fp)(void *)) {
}
if
(
pNode
->
nodeType
==
TSQL_NODE_EXPR
)
{
t
SQLBinaryExpr
Destroy
(
&
pNode
,
fp
);
t
ExprTree
Destroy
(
&
pNode
,
fp
);
}
else
if
(
pNode
->
nodeType
==
TSQL_NODE_VALUE
)
{
tVariantDestroy
(
pNode
->
pVal
);
}
else
if
(
pNode
->
nodeType
==
TSQL_NODE_COL
)
{
free
(
pNode
->
pSchema
);
}
free
(
pNode
);
}
void
t
SQLBinaryExpr
Destroy
(
tExprNode
**
pExpr
,
void
(
*
fp
)(
void
*
))
{
void
t
ExprTree
Destroy
(
tExprNode
**
pExpr
,
void
(
*
fp
)(
void
*
))
{
if
(
*
pExpr
==
NULL
)
{
return
;
}
tExprNodeDestroy
((
*
pExpr
)
->
_node
.
pLeft
,
fp
);
tExprNodeDestroy
((
*
pExpr
)
->
_node
.
pRight
,
fp
);
if
(
fp
!=
NULL
)
{
fp
((
*
pExpr
)
->
_node
.
info
);
if
((
*
pExpr
)
->
nodeType
==
TSQL_NODE_EXPR
)
{
tExprTreeDestroy
(
&
(
*
pExpr
)
->
_node
.
pLeft
,
fp
);
tExprTreeDestroy
(
&
(
*
pExpr
)
->
_node
.
pRight
,
fp
);
if
(
fp
!=
NULL
)
{
fp
((
*
pExpr
)
->
_node
.
info
);
}
}
else
if
((
*
pExpr
)
->
nodeType
==
TSQL_NODE_VALUE
)
{
tVariantDestroy
((
*
pExpr
)
->
pVal
);
free
((
*
pExpr
)
->
pVal
);
}
else
if
((
*
pExpr
)
->
nodeType
==
TSQL_NODE_COL
)
{
free
((
*
pExpr
)
->
pSchema
);
}
free
(
*
pExpr
);
...
...
@@ -916,3 +925,98 @@ void tSQLBinaryExprTrv(tExprNode *pExprs, int32_t *val, int16_t *ids) {
(
*
val
)
+=
1
;
}
}
static
int32_t
exprTreeToBinaryImpl
(
tExprNode
*
pExprTree
,
SBuffer
*
pBuf
)
{
tbufWrite
(
pBuf
,
&
pExprTree
->
nodeType
,
sizeof
(
pExprTree
->
nodeType
));
if
(
pExprTree
->
nodeType
==
TSQL_NODE_VALUE
)
{
tVariant
*
pVal
=
pExprTree
->
pVal
;
tbufWrite
(
pBuf
,
&
pVal
->
nType
,
sizeof
(
pVal
->
nType
));
if
(
pVal
->
nType
==
TSDB_DATA_TYPE_BINARY
)
{
tbufWrite
(
pBuf
,
&
pVal
->
nLen
,
sizeof
(
pVal
->
nLen
));
tbufWrite
(
pBuf
,
pVal
->
pz
,
pVal
->
nLen
);
}
else
{
tbufWrite
(
pBuf
,
&
pVal
->
pz
,
sizeof
(
pVal
->
i64Key
));
}
}
else
if
(
pExprTree
->
nodeType
==
TSQL_NODE_COL
)
{
SSchema
*
pSchema
=
pExprTree
->
pSchema
;
tbufWrite
(
pBuf
,
&
pSchema
->
colId
,
sizeof
(
pSchema
->
colId
));
tbufWrite
(
pBuf
,
&
pSchema
->
bytes
,
sizeof
(
pSchema
->
bytes
));
tbufWrite
(
pBuf
,
&
pSchema
->
type
,
sizeof
(
pSchema
->
type
));
int32_t
len
=
strlen
(
pSchema
->
name
);
tbufWriteStringLen
(
pBuf
,
pSchema
->
name
,
len
);
}
else
if
(
pExprTree
->
nodeType
==
TSQL_NODE_EXPR
)
{
tbufWrite
(
pBuf
,
&
pExprTree
->
_node
.
optr
,
sizeof
(
pExprTree
->
_node
.
optr
));
tbufWrite
(
pBuf
,
&
pExprTree
->
_node
.
hasPK
,
sizeof
(
pExprTree
->
_node
.
hasPK
));
exprTreeToBinaryImpl
(
pExprTree
->
_node
.
pLeft
,
pBuf
);
exprTreeToBinaryImpl
(
pExprTree
->
_node
.
pRight
,
pBuf
);
}
}
SBuffer
exprTreeToBinary
(
tExprNode
*
pExprTree
)
{
SBuffer
buf
=
{
0
};
if
(
pExprTree
==
NULL
)
{
return
buf
;
}
int32_t
code
=
tbufBeginWrite
(
&
buf
);
if
(
code
!=
0
)
{
return
buf
;
}
exprTreeToBinaryImpl
(
pExprTree
,
&
buf
);
return
buf
;
}
static
tExprNode
*
exprTreeFromBinaryImpl
(
tExprNode
**
pExprTree
,
SBuffer
*
pBuf
)
{
tExprNode
*
pExpr
=
calloc
(
1
,
sizeof
(
tExprNode
));
tbufReadToBuffer
(
pBuf
,
&
pExpr
->
nodeType
,
sizeof
(
pExpr
->
nodeType
));
if
(
pExpr
->
nodeType
==
TSQL_NODE_VALUE
)
{
tVariant
*
pVal
=
calloc
(
1
,
sizeof
(
tVariant
));
tbufReadToBuffer
(
pBuf
,
&
pVal
->
nType
,
sizeof
(
pVal
->
nType
));
if
(
pVal
->
nType
==
TSDB_DATA_TYPE_BINARY
)
{
tbufReadToBuffer
(
pBuf
,
&
pVal
->
nLen
,
sizeof
(
pVal
->
nLen
));
pVal
->
pz
=
calloc
(
1
,
pVal
->
nLen
+
1
);
tbufReadToBuffer
(
pBuf
,
pVal
->
pz
,
pVal
->
nLen
);
}
else
{
tbufReadToBuffer
(
pBuf
,
&
pVal
->
pz
,
sizeof
(
pVal
->
i64Key
));
}
pExpr
->
pVal
=
pVal
;
}
else
if
(
pExpr
->
nodeType
==
TSQL_NODE_COL
)
{
SSchema
*
pSchema
=
calloc
(
1
,
sizeof
(
SSchema
));
tbufReadToBuffer
(
pBuf
,
&
pSchema
->
colId
,
sizeof
(
pSchema
->
colId
));
tbufReadToBuffer
(
pBuf
,
&
pSchema
->
bytes
,
sizeof
(
pSchema
->
bytes
));
tbufReadToBuffer
(
pBuf
,
&
pSchema
->
type
,
sizeof
(
pSchema
->
type
));
tbufReadToString
(
pBuf
,
pSchema
->
name
,
TSDB_COL_NAME_LEN
);
pExpr
->
pSchema
=
pSchema
;
}
else
if
(
pExpr
->
nodeType
==
TSQL_NODE_EXPR
)
{
tbufReadToBuffer
(
pBuf
,
&
pExpr
->
_node
.
optr
,
sizeof
(
pExpr
->
_node
.
optr
));
tbufReadToBuffer
(
pBuf
,
&
pExpr
->
_node
.
hasPK
,
sizeof
(
pExpr
->
_node
.
hasPK
));
exprTreeFromBinaryImpl
(
&
pExpr
->
_node
.
pLeft
,
pBuf
);
exprTreeFromBinaryImpl
(
&
pExpr
->
_node
.
pRight
,
pBuf
);
assert
(
pExpr
->
_node
.
pLeft
!=
NULL
&&
pExpr
->
_node
.
pRight
!=
NULL
);
}
*
pExprTree
=
pExpr
;
}
tExprNode
*
exprTreeFromBinary
(
const
void
*
pBuf
,
size_t
size
)
{
SBuffer
rbuf
=
{
0
};
int32_t
code
=
tbufBeginRead
(
&
rbuf
,
pBuf
,
size
);
tExprNode
*
pExprNode
=
NULL
;
exprTreeFromBinaryImpl
(
&
pExprNode
,
&
rbuf
);
return
pExprNode
;
}
\ No newline at end of file
src/query/src/queryExecutor.c
浏览文件 @
58258bc9
...
...
@@ -5961,7 +5961,7 @@ static void freeQInfo(SQInfo *pQInfo) {
if
(
pBinExprInfo
->
numOfCols
>
0
)
{
tfree
(
pBinExprInfo
->
pReqColumns
);
t
SQLBinaryExpr
Destroy
(
&
pBinExprInfo
->
pBinExpr
,
NULL
);
t
ExprTree
Destroy
(
&
pBinExprInfo
->
pBinExpr
,
NULL
);
}
}
...
...
src/query/tests/astTest.cpp
0 → 100644
浏览文件 @
58258bc9
#include <gtest/gtest.h>
#include <qast.h>
#include <sys/time.h>
#include <cassert>
#include <iostream>
#include "qast.h"
#include "taosmsg.h"
#include "tsdb.h"
#include "tskiplist.h"
typedef
struct
ResultObj
{
int32_t
numOfResult
;
char
*
resultName
[
64
];
}
ResultObj
;
static
void
initSchema
(
SSchema
*
pSchema
,
int32_t
numOfCols
);
static
void
initSchema_binary
(
SSchema
*
schema
,
int32_t
numOfCols
);
static
tSkipList
*
createSkipList
(
SSchema
*
pSchema
,
int32_t
numOfTags
);
static
tSkipList
*
createSkipList_binary
(
SSchema
*
pSchema
,
int32_t
numOfTags
);
static
void
testQueryStr
(
SSchema
*
schema
,
int32_t
numOfCols
,
char
*
sql
,
tSkipList
*
pSkipList
,
ResultObj
*
expectedVal
);
static
void
dropMeter
(
tSkipList
*
pSkipList
);
static
void
Right2LeftTest
(
SSchema
*
schema
,
int32_t
numOfCols
,
tSkipList
*
pSkipList
);
static
void
Left2RightTest
(
SSchema
*
schema
,
int32_t
numOfCols
,
tSkipList
*
pSkipList
);
static
void
IllegalExprTest
(
SSchema
*
schema
,
int32_t
numOfCols
,
tSkipList
*
pSkipList
);
static
void
Left2RightTest_binary
(
SSchema
*
schema
,
int32_t
numOfCols
,
tSkipList
*
pSkipList
);
static
void
Right2LeftTest_binary
(
SSchema
*
schema
,
int32_t
numOfCols
,
tSkipList
*
pSkipList
);
void
setValue
(
ResultObj
*
pResult
,
int32_t
num
,
char
**
val
)
{
pResult
->
numOfResult
=
num
;
for
(
int32_t
i
=
0
;
i
<
num
;
++
i
)
{
pResult
->
resultName
[
i
]
=
val
[
i
];
}
}
static
void
initSchema_binary
(
SSchema
*
schema
,
int32_t
numOfCols
)
{
schema
[
0
].
type
=
TSDB_DATA_TYPE_BINARY
;
schema
[
0
].
bytes
=
8
;
strcpy
(
schema
[
0
].
name
,
"a"
);
schema
[
1
].
type
=
TSDB_DATA_TYPE_DOUBLE
;
schema
[
1
].
bytes
=
8
;
strcpy
(
schema
[
1
].
name
,
"b"
);
schema
[
2
].
type
=
TSDB_DATA_TYPE_INT
;
schema
[
2
].
bytes
=
20
;
strcpy
(
schema
[
2
].
name
,
"c"
);
schema
[
3
].
type
=
TSDB_DATA_TYPE_BIGINT
;
schema
[
3
].
bytes
=
8
;
strcpy
(
schema
[
3
].
name
,
"d"
);
schema
[
4
].
type
=
TSDB_DATA_TYPE_SMALLINT
;
schema
[
4
].
bytes
=
2
;
strcpy
(
schema
[
4
].
name
,
"e"
);
schema
[
5
].
type
=
TSDB_DATA_TYPE_TINYINT
;
schema
[
5
].
bytes
=
1
;
strcpy
(
schema
[
5
].
name
,
"f"
);
schema
[
6
].
type
=
TSDB_DATA_TYPE_FLOAT
;
schema
[
6
].
bytes
=
4
;
strcpy
(
schema
[
6
].
name
,
"g"
);
schema
[
7
].
type
=
TSDB_DATA_TYPE_BOOL
;
schema
[
7
].
bytes
=
1
;
strcpy
(
schema
[
7
].
name
,
"h"
);
}
static
void
initSchema
(
SSchema
*
schema
,
int32_t
numOfCols
)
{
schema
[
0
].
type
=
TSDB_DATA_TYPE_INT
;
schema
[
0
].
bytes
=
8
;
strcpy
(
schema
[
0
].
name
,
"a"
);
schema
[
1
].
type
=
TSDB_DATA_TYPE_DOUBLE
;
schema
[
1
].
bytes
=
8
;
strcpy
(
schema
[
1
].
name
,
"b"
);
schema
[
2
].
type
=
TSDB_DATA_TYPE_BINARY
;
schema
[
2
].
bytes
=
20
;
strcpy
(
schema
[
2
].
name
,
"c"
);
schema
[
3
].
type
=
TSDB_DATA_TYPE_BIGINT
;
schema
[
3
].
bytes
=
8
;
strcpy
(
schema
[
3
].
name
,
"d"
);
schema
[
4
].
type
=
TSDB_DATA_TYPE_SMALLINT
;
schema
[
4
].
bytes
=
2
;
strcpy
(
schema
[
4
].
name
,
"e"
);
schema
[
5
].
type
=
TSDB_DATA_TYPE_TINYINT
;
schema
[
5
].
bytes
=
1
;
strcpy
(
schema
[
5
].
name
,
"f"
);
schema
[
6
].
type
=
TSDB_DATA_TYPE_FLOAT
;
schema
[
6
].
bytes
=
4
;
strcpy
(
schema
[
6
].
name
,
"g"
);
schema
[
7
].
type
=
TSDB_DATA_TYPE_BOOL
;
schema
[
7
].
bytes
=
1
;
strcpy
(
schema
[
7
].
name
,
"h"
);
}
// static void addOneNode(SSchema *pSchema, int32_t tagsLen, tSkipList *pSkipList,
// char *meterId, int32_t a, double b, char *c, int64_t d, int16_t e, int8_t f, float g,
// bool h, int32_t numOfTags) {
// STabObj *pMeter = calloc(1, sizeof(STabObj));
// pMeter->numOfTags = numOfTags;
// pMeter->pTagData = calloc(1, tagsLen + TSDB_METER_ID_LEN);
// strcpy(pMeter->meterId, meterId);
//
// char *tags = pMeter->pTagData + TSDB_METER_ID_LEN;
// int32_t offset = 0;
//
// *(int32_t *) tags = a;
//
// offset += pSchema[0].bytes;
// *(double *) (tags + offset) = b;
//
// offset += pSchema[1].bytes;
// memcpy(tags + offset, c, 3);
//
// offset += pSchema[2].bytes;
// *(int64_t *) (tags + offset) = d;
//
// offset += pSchema[3].bytes;
// *(int16_t *) (tags + offset) = e;
//
// offset += pSchema[4].bytes;
// *(int8_t *) (tags + offset) = f;
//
// offset += pSchema[5].bytes;
// *(float *) (tags + offset) = g;
//
// offset += pSchema[6].bytes;
// *(int8_t *) (tags + offset) = h ? 1 : 0;
//
// tSkipListKey pKey = tSkipListCreateKey(pSchema[0].type, tags, pSchema[0].bytes);
// tSkipListPut(pSkipList, pMeter, &pKey, 1);
//}
//
// static void addOneNode_binary(SSchema *pSchema, int32_t tagsLen, tSkipList *pSkipList,
// char *meterId, int32_t a, double b, char *c, int64_t d, int16_t e, int8_t f, float g,
// bool h, int32_t numOfTags) {
// STabObj *pMeter = calloc(1, sizeof(STabObj));
// pMeter->numOfTags = numOfTags;
// pMeter->pTagData = calloc(1, tagsLen + TSDB_METER_ID_LEN);
// strcpy(pMeter->meterId, meterId);
//
// char *tags = pMeter->pTagData + TSDB_METER_ID_LEN;
// int32_t offset = 0;
// memcpy(tags, c, pSchema[0].bytes);
//
// offset += pSchema[0].bytes;
// *(double *) (tags + offset) = b;
//
// offset += pSchema[1].bytes;
// *(int32_t *) (tags + offset) = a;
//
// offset += pSchema[2].bytes;
// *(int64_t *) (tags + offset) = d;
//
// offset += pSchema[3].bytes;
// *(int16_t *) (tags + offset) = e;
//
// offset += pSchema[4].bytes;
// *(int8_t *) (tags + offset) = f;
//
// offset += pSchema[5].bytes;
// *(float *) (tags + offset) = g;
//
// offset += pSchema[6].bytes;
// *(int8_t *) (tags + offset) = h ? 1 : 0;
//
// tSkipListKey pKey = tSkipListCreateKey(pSchema[0].type, tags, pSchema[0].bytes);
// tSkipListPut(pSkipList, pMeter, &pKey, 1);
// tSkipListDestroyKey(&pKey);
//}
// static void dropMeter(tSkipList *pSkipList) {
// tSkipListNode **pRes = NULL;
// int32_t num = tSkipListIterateList(pSkipList, &pRes, NULL, NULL);
// for (int32_t i = 0; i < num; ++i) {
// tSkipListNode *pNode = pRes[i];
// STabObj *pMeter = (STabObj *) pNode->pData;
// free(pMeter->pTagData);
// free(pMeter);
// pNode->pData = NULL;
// }
// free(pRes);
//}
// static tSkipList *createSkipList(SSchema *pSchema, int32_t numOfTags) {
// int32_t tagsLen = 0;
// for (int32_t i = 0; i < numOfTags; ++i) {
// tagsLen += pSchema[i].bytes;
// }
//
// tSkipList *pSkipList = tSkipListCreate(10, pSchema[0].type, 4);
//
// addOneNode(pSchema, tagsLen, pSkipList, "tm0\0", 0, 10.5, "abc", 1000, -10000, -20, 1.0, true, 8);
// addOneNode(pSchema, tagsLen, pSkipList, "tm1\0", 1, 20.5, "def", 1100, -10500, -30, 2.0, false, 8);
// addOneNode(pSchema, tagsLen, pSkipList, "tm2\0", 2, 30.5, "ghi", 1200, -11000, -40, 3.0, true, 8);
// addOneNode(pSchema, tagsLen, pSkipList, "tm3\0", 3, 40.5, "jkl", 1300, -11500, -50, 4.0, false, 8);
// addOneNode(pSchema, tagsLen, pSkipList, "tm4\0", 4, 50.5, "mno", 1400, -12000, -60, 5.0, true, 8);
// addOneNode(pSchema, tagsLen, pSkipList, "tm5\0", 5, 60.5, "pqr", 1500, -12500, -70, 6.0, false, 8);
// addOneNode(pSchema, tagsLen, pSkipList, "tm6\0", 6, 70.5, "stu", 1600, -13000, -80, 7.0, true, 8);
//
// return pSkipList;
//}
//
// static tSkipList *createSkipList_binary(SSchema *pSchema, int32_t numOfTags) {
// int32_t tagsLen = 0;
// for (int32_t i = 0; i < numOfTags; ++i) {
// tagsLen += pSchema[i].bytes;
// }
//
// tSkipList *pSkipList = tSkipListCreate(10, pSchema[0].type, 4);
//
// addOneNode_binary(pSchema, tagsLen, pSkipList, "tm0\0", 0, 10.5, "abc", 1000, -10000, -20, 1.0, true, 8);
// addOneNode_binary(pSchema, tagsLen, pSkipList, "tm1\0", 1, 20.5, "def", 1100, -10500, -30, 2.0, false, 8);
// addOneNode_binary(pSchema, tagsLen, pSkipList, "tm2\0", 2, 30.5, "ghi", 1200, -11000, -40, 3.0, true, 8);
// addOneNode_binary(pSchema, tagsLen, pSkipList, "tm3\0", 3, 40.5, "jkl", 1300, -11500, -50, 4.0, false, 8);
// addOneNode_binary(pSchema, tagsLen, pSkipList, "tm4\0", 4, 50.5, "mno", 1400, -12000, -60, 5.0, true, 8);
// addOneNode_binary(pSchema, tagsLen, pSkipList, "tm5\0", 5, 60.5, "pqr", 1500, -12500, -70, 6.0, false, 8);
// addOneNode_binary(pSchema, tagsLen, pSkipList, "tm6\0", 6, 70.5, "stu", 1600, -13000, -80, 7.0, true, 8);
//
// return pSkipList;
//}
static
void
testQueryStr
(
SSchema
*
schema
,
int32_t
numOfCols
,
char
*
sql
,
tSkipList
*
pSkipList
,
ResultObj
*
pResult
)
{
tExprNode
*
pExpr
=
NULL
;
tSQLBinaryExprFromString
(
&
pExpr
,
schema
,
numOfCols
,
sql
,
strlen
(
sql
));
char
str
[
512
]
=
{
0
};
int32_t
len
=
0
;
if
(
pExpr
==
NULL
)
{
printf
(
"-----error in parse syntax:%s
\n\n
"
,
sql
);
assert
(
pResult
==
NULL
);
return
;
}
tSQLBinaryExprToString
(
pExpr
,
str
,
&
len
);
printf
(
"expr is: %s
\n
"
,
str
);
SArray
*
result
=
NULL
;
// tSQLBinaryExprTraverse(pExpr, pSkipList, result, tSkipListNodeFilterCallback, &result);
// printf("the result is:%lld\n", result.num);
//
// bool findResult = false;
// for (int32_t i = 0; i < result.num; ++i) {
// STabObj *pm = (STabObj *)result.pRes[i];
// printf("meterid:%s,\t", pm->meterId);
//
// for (int32_t j = 0; j < pResult->numOfResult; ++j) {
// if (strcmp(pm->meterId, pResult->resultName[j]) == 0) {
// findResult = true;
// break;
// }
// }
// assert(findResult == true);
// findResult = false;
// }
printf
(
"
\n\n
"
);
tExprTreeDestroy
(
&
pExpr
,
NULL
);
}
static
void
Left2RightTest
(
SSchema
*
schema
,
int32_t
numOfCols
,
tSkipList
*
pSkipList
)
{
char
str
[
256
]
=
{
0
};
char
*
t0
[
1
]
=
{
"tm0"
};
char
*
t1
[
1
]
=
{
"tm1"
};
char
*
sql
=
NULL
;
ResultObj
res
=
{
1
,
{
"tm1"
}};
testQueryStr
(
schema
,
numOfCols
,
"a=1"
,
pSkipList
,
&
res
);
char
*
tt
[
1
]
=
{
"tm6"
};
setValue
(
&
res
,
1
,
tt
);
testQueryStr
(
schema
,
numOfCols
,
"a>=6"
,
pSkipList
,
&
res
);
setValue
(
&
res
,
1
,
t0
);
testQueryStr
(
schema
,
numOfCols
,
"b<=10.6"
,
pSkipList
,
&
res
);
strcpy
(
str
,
"c<>'pqr'"
);
char
*
t2
[
6
]
=
{
"tm0"
,
"tm1"
,
"tm2"
,
"tm3"
,
"tm4"
,
"tm6"
};
setValue
(
&
res
,
6
,
t2
);
testQueryStr
(
schema
,
numOfCols
,
str
,
pSkipList
,
&
res
);
strcpy
(
str
,
"c='abc'"
);
setValue
(
&
res
,
1
,
t0
);
testQueryStr
(
schema
,
numOfCols
,
str
,
pSkipList
,
&
res
);
char
*
t3
[
6
]
=
{
"tm1"
,
"tm2"
,
"tm3"
,
"tm4"
,
"tm5"
,
"tm6"
};
setValue
(
&
res
,
6
,
t3
);
testQueryStr
(
schema
,
numOfCols
,
"d>1050"
,
pSkipList
,
&
res
);
char
*
t4
[
3
]
=
{
"tm4"
,
"tm5"
,
"tm6"
};
setValue
(
&
res
,
3
,
t4
);
testQueryStr
(
schema
,
numOfCols
,
"g>4.5980765"
,
pSkipList
,
&
res
);
char
*
t5
[
4
]
=
{
"tm0"
,
"tm2"
,
"tm4"
,
"tm6"
};
setValue
(
&
res
,
4
,
t5
);
testQueryStr
(
schema
,
numOfCols
,
"h=true"
,
pSkipList
,
&
res
);
char
*
t6
[
3
]
=
{
"tm1"
,
"tm3"
,
"tm5"
};
setValue
(
&
res
,
3
,
t6
);
testQueryStr
(
schema
,
numOfCols
,
"h=0"
,
pSkipList
,
&
res
);
sql
=
"(((b<40)))
\0
"
;
char
*
t7
[
3
]
=
{
"tm0"
,
"tm1"
,
"tm2"
};
setValue
(
&
res
,
3
,
t7
);
testQueryStr
(
schema
,
numOfCols
,
sql
,
pSkipList
,
&
res
);
sql
=
"((a=1) or (a=10)) or ((b=12))"
;
setValue
(
&
res
,
1
,
t1
);
testQueryStr
(
schema
,
numOfCols
,
sql
,
pSkipList
,
&
res
);
sql
=
"((((((a>0 and a<2))) or a=6) or a=3) or (b=50.5)) and h=0"
;
char
*
t8
[
2
]
=
{
"tm1"
,
"tm3"
};
setValue
(
&
res
,
2
,
t8
);
testQueryStr
(
schema
,
numOfCols
,
sql
,
pSkipList
,
&
res
);
char
*
tf
[
1
]
=
{
"tm6"
};
setValue
(
&
res
,
1
,
tf
);
testQueryStr
(
schema
,
numOfCols
,
"e = -13000"
,
pSkipList
,
&
res
);
char
*
ft
[
5
]
=
{
"tm0"
,
"tm1"
,
"tm2"
,
"tm3"
,
"tm4"
};
setValue
(
&
res
,
5
,
ft
);
testQueryStr
(
schema
,
numOfCols
,
"f > -65"
,
pSkipList
,
&
res
);
}
void
Right2LeftTest
(
SSchema
*
schema
,
int32_t
numOfCols
,
tSkipList
*
pSkipList
)
{
ResultObj
res
=
{
1
,
{
"tm1"
}};
testQueryStr
(
schema
,
numOfCols
,
"((1=a))"
,
pSkipList
,
&
res
);
char
*
t9
[
2
]
=
{
"tm0"
,
"tm1"
};
setValue
(
&
res
,
2
,
t9
);
testQueryStr
(
schema
,
numOfCols
,
"1>=a"
,
pSkipList
,
&
res
);
char
*
t0
[
1
]
=
{
"tm0"
};
setValue
(
&
res
,
1
,
t0
);
testQueryStr
(
schema
,
numOfCols
,
"10.6>=b"
,
pSkipList
,
&
res
);
char
*
t10
[
3
]
=
{
"tm1"
,
"tm3"
,
"tm5"
};
setValue
(
&
res
,
3
,
t10
);
testQueryStr
(
schema
,
numOfCols
,
"0=h"
,
pSkipList
,
&
res
);
}
static
void
IllegalExprTest
(
SSchema
*
schema
,
int32_t
numOfCols
,
tSkipList
*
pSkipList
)
{
testQueryStr
(
schema
,
numOfCols
,
"h="
,
pSkipList
,
NULL
);
testQueryStr
(
schema
,
numOfCols
,
"h<"
,
pSkipList
,
NULL
);
testQueryStr
(
schema
,
numOfCols
,
"a=1 and "
,
pSkipList
,
NULL
);
testQueryStr
(
schema
,
numOfCols
,
"and or"
,
pSkipList
,
NULL
);
testQueryStr
(
schema
,
numOfCols
,
"and a = 1 or"
,
pSkipList
,
NULL
);
testQueryStr
(
schema
,
numOfCols
,
"(())"
,
pSkipList
,
NULL
);
testQueryStr
(
schema
,
numOfCols
,
"("
,
pSkipList
,
NULL
);
testQueryStr
(
schema
,
numOfCols
,
"(a"
,
pSkipList
,
NULL
);
testQueryStr
(
schema
,
numOfCols
,
"(a)"
,
pSkipList
,
NULL
);
testQueryStr
(
schema
,
numOfCols
,
"())"
,
pSkipList
,
NULL
);
testQueryStr
(
schema
,
numOfCols
,
"a===1"
,
pSkipList
,
NULL
);
testQueryStr
(
schema
,
numOfCols
,
"a=1 and "
,
pSkipList
,
NULL
);
}
static
void
Left2RightTest_binary
(
SSchema
*
schema
,
int32_t
numOfCols
,
tSkipList
*
pSkipList
)
{
char
str
[
256
]
=
{
0
};
char
*
sql
=
NULL
;
char
*
t0
[
1
]
=
{
"tm0"
};
char
*
t1
[
1
]
=
{
"tm1"
};
ResultObj
res
=
{
1
,
{
"tm0"
}};
strcpy
(
str
,
"a='abc'"
);
testQueryStr
(
schema
,
numOfCols
,
str
,
pSkipList
,
&
res
);
char
*
tt
[
1
]
=
{
"tm6"
};
setValue
(
&
res
,
1
,
tt
);
testQueryStr
(
schema
,
numOfCols
,
"c>=6"
,
pSkipList
,
&
res
);
setValue
(
&
res
,
1
,
t0
);
testQueryStr
(
schema
,
numOfCols
,
"b<=10.6"
,
pSkipList
,
&
res
);
strcpy
(
str
,
"a<>'pqr'"
);
char
*
t2
[
6
]
=
{
"tm0"
,
"tm1"
,
"tm2"
,
"tm3"
,
"tm4"
,
"tm6"
};
setValue
(
&
res
,
6
,
t2
);
testQueryStr
(
schema
,
numOfCols
,
str
,
pSkipList
,
&
res
);
strcpy
(
str
,
"a='abc'"
);
setValue
(
&
res
,
1
,
t0
);
testQueryStr
(
schema
,
numOfCols
,
str
,
pSkipList
,
&
res
);
char
*
t3
[
6
]
=
{
"tm1"
,
"tm2"
,
"tm3"
,
"tm4"
,
"tm5"
,
"tm6"
};
setValue
(
&
res
,
6
,
t3
);
testQueryStr
(
schema
,
numOfCols
,
"d>1050"
,
pSkipList
,
&
res
);
char
*
t4
[
3
]
=
{
"tm4"
,
"tm5"
,
"tm6"
};
setValue
(
&
res
,
3
,
t4
);
testQueryStr
(
schema
,
numOfCols
,
"g>4.5980765"
,
pSkipList
,
&
res
);
char
*
t5
[
4
]
=
{
"tm0"
,
"tm2"
,
"tm4"
,
"tm6"
};
setValue
(
&
res
,
4
,
t5
);
testQueryStr
(
schema
,
numOfCols
,
"h=true"
,
pSkipList
,
&
res
);
char
*
t6
[
3
]
=
{
"tm1"
,
"tm3"
,
"tm5"
};
setValue
(
&
res
,
3
,
t6
);
testQueryStr
(
schema
,
numOfCols
,
"h=0"
,
pSkipList
,
&
res
);
sql
=
"(((b<40)))
\0
"
;
char
*
t7
[
3
]
=
{
"tm0"
,
"tm1"
,
"tm2"
};
setValue
(
&
res
,
3
,
t7
);
testQueryStr
(
schema
,
numOfCols
,
sql
,
pSkipList
,
&
res
);
sql
=
"((c=1) or (c=10)) or ((b=12))
\0
"
;
setValue
(
&
res
,
1
,
t1
);
testQueryStr
(
schema
,
numOfCols
,
sql
,
pSkipList
,
&
res
);
sql
=
"((((((c>0 and c<2))) or c=6) or c=3) or (b=50.5)) and h=false
\0
"
;
char
*
t8
[
2
]
=
{
"tm1"
,
"tm3"
};
setValue
(
&
res
,
2
,
t8
);
testQueryStr
(
schema
,
numOfCols
,
sql
,
pSkipList
,
&
res
);
}
static
void
Right2LeftTest_binary
(
SSchema
*
schema
,
int32_t
numOfCols
,
tSkipList
*
pSkipList
)
{
char
str
[
256
]
=
{
0
};
char
*
sql
=
NULL
;
char
*
t0
[
1
]
=
{
"tm0"
};
char
*
t1
[
1
]
=
{
"tm1"
};
ResultObj
res
=
{
1
,
{
"tm0"
}};
strcpy
(
str
,
"'abc'=a"
);
testQueryStr
(
schema
,
numOfCols
,
str
,
pSkipList
,
&
res
);
char
*
tt
[
1
]
=
{
"tm6"
};
setValue
(
&
res
,
1
,
tt
);
testQueryStr
(
schema
,
numOfCols
,
"6<=c"
,
pSkipList
,
&
res
);
setValue
(
&
res
,
1
,
t0
);
testQueryStr
(
schema
,
numOfCols
,
"10.6>=b"
,
pSkipList
,
&
res
);
strcpy
(
str
,
"'pqr'<>a"
);
char
*
t2
[
6
]
=
{
"tm0"
,
"tm1"
,
"tm2"
,
"tm3"
,
"tm4"
,
"tm6"
};
setValue
(
&
res
,
6
,
t2
);
testQueryStr
(
schema
,
numOfCols
,
str
,
pSkipList
,
&
res
);
}
namespace
{
// two level expression tree
tExprNode
*
createExpr1
()
{
auto
*
pLeft
=
(
tExprNode
*
)
calloc
(
1
,
sizeof
(
tExprNode
));
pLeft
->
nodeType
=
TSQL_NODE_COL
;
pLeft
->
pSchema
=
(
SSchema
*
)
calloc
(
1
,
sizeof
(
SSchema
));
strcpy
(
pLeft
->
pSchema
->
name
,
"col_a"
);
pLeft
->
pSchema
->
type
=
TSDB_DATA_TYPE_INT
;
pLeft
->
pSchema
->
bytes
=
sizeof
(
int32_t
);
pLeft
->
pSchema
->
colId
=
1
;
auto
*
pRight
=
(
tExprNode
*
)
calloc
(
1
,
sizeof
(
tExprNode
));
pRight
->
nodeType
=
TSQL_NODE_VALUE
;
pRight
->
pVal
=
(
tVariant
*
)
calloc
(
1
,
sizeof
(
tVariant
));
pRight
->
pVal
->
nType
=
TSDB_DATA_TYPE_INT
;
pRight
->
pVal
->
i64Key
=
12
;
auto
*
pRoot
=
(
tExprNode
*
)
calloc
(
1
,
sizeof
(
tExprNode
));
pRoot
->
nodeType
=
TSQL_NODE_EXPR
;
pRoot
->
_node
.
optr
=
TSDB_RELATION_EQUAL
;
pRoot
->
_node
.
pLeft
=
pLeft
;
pRoot
->
_node
.
pRight
=
pRight
;
pRoot
->
_node
.
hasPK
=
true
;
return
pRoot
;
}
// thress level expression tree
tExprNode
*
createExpr2
()
{
auto
*
pLeft2
=
(
tExprNode
*
)
calloc
(
1
,
sizeof
(
tExprNode
));
pLeft2
->
nodeType
=
TSQL_NODE_COL
;
pLeft2
->
pSchema
=
(
SSchema
*
)
calloc
(
1
,
sizeof
(
SSchema
));
strcpy
(
pLeft2
->
pSchema
->
name
,
"col_a"
);
pLeft2
->
pSchema
->
type
=
TSDB_DATA_TYPE_BINARY
;
pLeft2
->
pSchema
->
bytes
=
20
;
pLeft2
->
pSchema
->
colId
=
1
;
auto
*
pRight2
=
(
tExprNode
*
)
calloc
(
1
,
sizeof
(
tExprNode
));
pRight2
->
nodeType
=
TSQL_NODE_VALUE
;
pRight2
->
pVal
=
(
tVariant
*
)
calloc
(
1
,
sizeof
(
tVariant
));
pRight2
->
pVal
->
nType
=
TSDB_DATA_TYPE_BINARY
;
const
char
*
v
=
"hello world!"
;
pRight2
->
pVal
->
pz
=
strdup
(
v
);
pRight2
->
pVal
->
nLen
=
strlen
(
v
);
auto
*
p1
=
(
tExprNode
*
)
calloc
(
1
,
sizeof
(
tExprNode
));
p1
->
nodeType
=
TSQL_NODE_EXPR
;
p1
->
_node
.
optr
=
TSDB_RELATION_LIKE
;
p1
->
_node
.
pLeft
=
pLeft2
;
p1
->
_node
.
pRight
=
pRight2
;
p1
->
_node
.
hasPK
=
false
;
auto
*
pLeft1
=
(
tExprNode
*
)
calloc
(
1
,
sizeof
(
tExprNode
));
pLeft1
->
nodeType
=
TSQL_NODE_COL
;
pLeft1
->
pSchema
=
(
SSchema
*
)
calloc
(
1
,
sizeof
(
SSchema
));
strcpy
(
pLeft1
->
pSchema
->
name
,
"col_b"
);
pLeft1
->
pSchema
->
type
=
TSDB_DATA_TYPE_DOUBLE
;
pLeft1
->
pSchema
->
bytes
=
8
;
pLeft1
->
pSchema
->
colId
=
99
;
auto
*
pRight1
=
(
tExprNode
*
)
calloc
(
1
,
sizeof
(
tExprNode
));
pRight1
->
nodeType
=
TSQL_NODE_VALUE
;
pRight1
->
pVal
=
(
tVariant
*
)
calloc
(
1
,
sizeof
(
tVariant
));
pRight1
->
pVal
->
nType
=
TSDB_DATA_TYPE_DOUBLE
;
pRight1
->
pVal
->
dKey
=
91.99
;
auto
*
p2
=
(
tExprNode
*
)
calloc
(
1
,
sizeof
(
tExprNode
));
p2
->
nodeType
=
TSQL_NODE_EXPR
;
p2
->
_node
.
optr
=
TSDB_RELATION_LARGE_EQUAL
;
p2
->
_node
.
pLeft
=
pLeft1
;
p2
->
_node
.
pRight
=
pRight1
;
p2
->
_node
.
hasPK
=
false
;
auto
*
pRoot
=
(
tExprNode
*
)
calloc
(
1
,
sizeof
(
tExprNode
));
pRoot
->
nodeType
=
TSQL_NODE_EXPR
;
pRoot
->
_node
.
optr
=
TSDB_RELATION_OR
;
pRoot
->
_node
.
pLeft
=
p1
;
pRoot
->
_node
.
pRight
=
p2
;
pRoot
->
_node
.
hasPK
=
true
;
return
pRoot
;
}
void
exprSerializeTest1
()
{
tExprNode
*
p1
=
createExpr1
();
SBuffer
buf
=
exprTreeToBinary
(
p1
);
size_t
size
=
tbufTell
(
&
buf
);
ASSERT_TRUE
(
size
>
0
);
char
*
b
=
tbufGetData
(
&
buf
,
false
);
tExprNode
*
p2
=
exprTreeFromBinary
(
b
,
size
);
ASSERT_EQ
(
p1
->
nodeType
,
p2
->
nodeType
);
ASSERT_EQ
(
p2
->
_node
.
optr
,
p1
->
_node
.
optr
);
ASSERT_EQ
(
p2
->
_node
.
pLeft
->
nodeType
,
p1
->
_node
.
pLeft
->
nodeType
);
ASSERT_EQ
(
p2
->
_node
.
pRight
->
nodeType
,
p1
->
_node
.
pRight
->
nodeType
);
SSchema
*
s1
=
p1
->
_node
.
pLeft
->
pSchema
;
SSchema
*
s2
=
p2
->
_node
.
pLeft
->
pSchema
;
ASSERT_EQ
(
s2
->
colId
,
s1
->
colId
);
ASSERT_EQ
(
s2
->
type
,
s1
->
type
);
ASSERT_EQ
(
s2
->
bytes
,
s1
->
bytes
);
ASSERT_STRCASEEQ
(
s2
->
name
,
s1
->
name
);
tVariant
*
v1
=
p1
->
_node
.
pRight
->
pVal
;
tVariant
*
v2
=
p2
->
_node
.
pRight
->
pVal
;
ASSERT_EQ
(
v1
->
nType
,
v2
->
nType
);
ASSERT_EQ
(
v1
->
i64Key
,
v2
->
i64Key
);
ASSERT_EQ
(
p1
->
_node
.
hasPK
,
p2
->
_node
.
hasPK
);
tExprTreeDestroy
(
&
p1
,
nullptr
);
tExprTreeDestroy
(
&
p2
,
nullptr
);
tbufClose
(
&
buf
,
false
);
}
void
exprSerializeTest2
()
{
tExprNode
*
p1
=
createExpr2
();
SBuffer
buf
=
exprTreeToBinary
(
p1
);
size_t
size
=
tbufTell
(
&
buf
);
ASSERT_TRUE
(
size
>
0
);
char
*
b
=
tbufGetData
(
&
buf
,
false
);
tExprNode
*
p2
=
exprTreeFromBinary
(
b
,
size
);
ASSERT_EQ
(
p1
->
nodeType
,
p2
->
nodeType
);
ASSERT_EQ
(
p2
->
_node
.
optr
,
p1
->
_node
.
optr
);
ASSERT_EQ
(
p2
->
_node
.
pLeft
->
nodeType
,
p1
->
_node
.
pLeft
->
nodeType
);
ASSERT_EQ
(
p2
->
_node
.
pRight
->
nodeType
,
p1
->
_node
.
pRight
->
nodeType
);
tExprNode
*
c1Left
=
p1
->
_node
.
pLeft
;
tExprNode
*
c2Left
=
p2
->
_node
.
pLeft
;
ASSERT_EQ
(
c1Left
->
nodeType
,
c2Left
->
nodeType
);
ASSERT_EQ
(
c2Left
->
nodeType
,
TSQL_NODE_EXPR
);
ASSERT_EQ
(
c2Left
->
_node
.
optr
,
TSDB_RELATION_LIKE
);
ASSERT_STRCASEEQ
(
c2Left
->
_node
.
pLeft
->
pSchema
->
name
,
"col_a"
);
ASSERT_EQ
(
c2Left
->
_node
.
pRight
->
nodeType
,
TSQL_NODE_VALUE
);
ASSERT_STRCASEEQ
(
c2Left
->
_node
.
pRight
->
pVal
->
pz
,
"hello world!"
);
tExprNode
*
c1Right
=
p1
->
_node
.
pRight
;
tExprNode
*
c2Right
=
p2
->
_node
.
pRight
;
ASSERT_EQ
(
c1Right
->
nodeType
,
c2Right
->
nodeType
);
ASSERT_EQ
(
c2Right
->
nodeType
,
TSQL_NODE_EXPR
);
ASSERT_EQ
(
c2Right
->
_node
.
optr
,
TSDB_RELATION_LARGE_EQUAL
);
ASSERT_EQ
(
c2Right
->
_node
.
pRight
->
pVal
->
dKey
,
91.99
);
ASSERT_EQ
(
p2
->
_node
.
hasPK
,
true
);
tExprTreeDestroy
(
&
p1
,
nullptr
);
tExprTreeDestroy
(
&
p2
,
nullptr
);
tbufClose
(
&
buf
,
false
);
}
}
// namespace
TEST
(
testCase
,
astTest
)
{
exprSerializeTest2
();
}
\ No newline at end of file
src/util/inc/tbuffer.h
浏览文件 @
58258bc9
...
...
@@ -13,14 +13,15 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stddef.h>
#include <stdint.h>
#include <stdbool.h>
#include <setjmp.h>
#ifndef TDENGINE_TBUFFER_H
#define TDENGINE_TBUFFER_H
#include "setjmp.h"
#include "os.h"
#ifdef __cplusplus
extern
"C"
{
#endif
/*
SBuffer can be used to read or write a buffer, but cannot be used for both
...
...
@@ -80,37 +81,33 @@ int main(int argc, char** argv) {
*/
typedef
struct
{
jmp_buf
jb
;
char
*
data
;
size_t
pos
;
size_t
size
;
char
*
data
;
size_t
pos
;
size_t
size
;
}
SBuffer
;
// common functions can be used in both read & write
#define tbufThrowError(buf, code) longjmp((buf)->jb, (code))
size_t
tbufTell
(
SBuffer
*
buf
);
size_t
tbufSeekTo
(
SBuffer
*
buf
,
size_t
pos
);
size_t
tbufSkip
(
SBuffer
*
buf
,
size_t
size
);
void
tbufClose
(
SBuffer
*
buf
,
bool
keepData
);
void
tbufClose
(
SBuffer
*
buf
,
bool
keepData
);
// basic read functions
#define tbufBeginRead(buf,
data, len) (((buf)->data = (char*)data), ((buf)->pos = 0), ((buf)->size = ((
data) == NULL) ? 0 : (len)), setjmp((buf)->jb))
char
*
tbufRead
(
SBuffer
*
buf
,
size_t
size
);
void
tbufReadToBuffer
(
SBuffer
*
buf
,
void
*
dst
,
size_t
size
);
#define tbufBeginRead(buf,
_data, len) ((buf)->data = (char*)(_data), ((buf)->pos = 0), ((buf)->size = ((_
data) == NULL) ? 0 : (len)), setjmp((buf)->jb))
char
*
tbufRead
(
SBuffer
*
buf
,
size_t
size
);
void
tbufReadToBuffer
(
SBuffer
*
buf
,
void
*
dst
,
size_t
size
);
const
char
*
tbufReadString
(
SBuffer
*
buf
,
size_t
*
len
);
size_t
tbufReadToString
(
SBuffer
*
buf
,
char
*
dst
,
size_t
size
);
size_t
tbufReadToString
(
SBuffer
*
buf
,
char
*
dst
,
size_t
size
);
// basic write functions
#define tbufBeginWrite(buf) ((buf)->data = NULL, ((buf)->pos = 0), ((buf)->size = 0), setjmp((buf)->jb))
void
tbufEnsureCapacity
(
SBuffer
*
buf
,
size_t
size
);
void
tbufEnsureCapacity
(
SBuffer
*
buf
,
size_t
size
);
char
*
tbufGetData
(
SBuffer
*
buf
,
bool
takeOver
);
void
tbufWrite
(
SBuffer
*
buf
,
const
void
*
data
,
size_t
size
);
void
tbufWriteAt
(
SBuffer
*
buf
,
size_t
pos
,
const
void
*
data
,
size_t
size
);
void
tbufWriteStringLen
(
SBuffer
*
buf
,
const
char
*
str
,
size_t
len
);
void
tbufWriteString
(
SBuffer
*
buf
,
const
char
*
str
);
void
tbufWrite
(
SBuffer
*
buf
,
const
void
*
data
,
size_t
size
);
void
tbufWriteAt
(
SBuffer
*
buf
,
size_t
pos
,
const
void
*
data
,
size_t
size
);
void
tbufWriteStringLen
(
SBuffer
*
buf
,
const
char
*
str
,
size_t
len
);
void
tbufWriteString
(
SBuffer
*
buf
,
const
char
*
str
);
// read & write function for primitive types
#ifndef TBUFFER_DEFINE_FUNCTION
...
...
@@ -120,17 +117,21 @@ void tbufWriteString(SBuffer* buf, const char* str);
void tbufWrite##name##At(SBuffer* buf, size_t pos, type data);
#endif
TBUFFER_DEFINE_FUNCTION
(
bool
,
Bool
)
TBUFFER_DEFINE_FUNCTION
(
char
,
Char
)
TBUFFER_DEFINE_FUNCTION
(
int8_t
,
Int8
)
TBUFFER_DEFINE_FUNCTION
(
uint8_t
,
Unt8
)
TBUFFER_DEFINE_FUNCTION
(
int16_t
,
Int16
)
TBUFFER_DEFINE_FUNCTION
(
uint16_t
,
Uint16
)
TBUFFER_DEFINE_FUNCTION
(
int32_t
,
Int32
)
TBUFFER_DEFINE_FUNCTION
(
uint32_t
,
Uint32
)
TBUFFER_DEFINE_FUNCTION
(
int64_t
,
Int64
)
TBUFFER_DEFINE_FUNCTION
(
uint64_t
,
Uint64
)
TBUFFER_DEFINE_FUNCTION
(
float
,
Float
)
TBUFFER_DEFINE_FUNCTION
(
double
,
Double
)
TBUFFER_DEFINE_FUNCTION
(
bool
,
Bool
)
TBUFFER_DEFINE_FUNCTION
(
char
,
Char
)
TBUFFER_DEFINE_FUNCTION
(
int8_t
,
Int8
)
TBUFFER_DEFINE_FUNCTION
(
uint8_t
,
Unt8
)
TBUFFER_DEFINE_FUNCTION
(
int16_t
,
Int16
)
TBUFFER_DEFINE_FUNCTION
(
uint16_t
,
Uint16
)
TBUFFER_DEFINE_FUNCTION
(
int32_t
,
Int32
)
TBUFFER_DEFINE_FUNCTION
(
uint32_t
,
Uint32
)
TBUFFER_DEFINE_FUNCTION
(
int64_t
,
Int64
)
TBUFFER_DEFINE_FUNCTION
(
uint64_t
,
Uint64
)
TBUFFER_DEFINE_FUNCTION
(
float
,
Float
)
TBUFFER_DEFINE_FUNCTION
(
double
,
Double
)
#ifdef __cplusplus
}
#endif
#endif
\ No newline at end of file
src/util/src/tbuffer.c
浏览文件 @
58258bc9
...
...
@@ -30,7 +30,7 @@
tbufWriteAt(buf, pos, &data, sizeof(data));\
}
#include "
../inc/
tbuffer.h"
#include "tbuffer.h"
////////////////////////////////////////////////////////////////////////////////
...
...
@@ -119,13 +119,14 @@ void tbufEnsureCapacity(SBuffer* buf, size_t size) {
}
char
*
tbufGetData
(
SBuffer
*
buf
,
bool
takeOver
)
{
char
*
ret
=
buf
->
data
;
if
(
takeOver
)
{
buf
->
pos
=
0
;
buf
->
size
=
0
;
buf
->
data
=
NULL
;
}
return
ret
;
char
*
ret
=
buf
->
data
;
if
(
takeOver
)
{
buf
->
pos
=
0
;
buf
->
size
=
0
;
buf
->
data
=
NULL
;
}
return
ret
;
}
void
tbufEndWrite
(
SBuffer
*
buf
)
{
...
...
src/vnode/tsdb/src/tsdbRead.c
浏览文件 @
58258bc9
...
...
@@ -1310,7 +1310,7 @@ static int32_t doQueryTableList(STable* pSTable, SArray* pRes, const char* pCond
};
tSQLBinaryExprTraverse
(
pExpr
,
pSTable
->
pIndex
,
pRes
,
&
supp
);
t
SQLBinaryExpr
Destroy
(
&
pExpr
,
tSQLListTraverseDestroyInfo
);
t
ExprTree
Destroy
(
&
pExpr
,
tSQLListTraverseDestroyInfo
);
tansformQueryResult
(
pRes
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录