Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
97f85ca1
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1185
Star
22016
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
97f85ca1
编写于
11月 04, 2021
作者:
S
shenglian zhou
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
expr tree add type, begin
上级
ccf1b20d
变更
3
显示空白变更内容
内联
并排
Showing
3 changed file
with
113 addition
and
3 deletion
+113
-3
src/client/src/tscSQLParser.c
src/client/src/tscSQLParser.c
+9
-2
src/common/inc/texpr.h
src/common/inc/texpr.h
+6
-1
src/common/src/texpr.c
src/common/src/texpr.c
+98
-0
未找到文件。
src/client/src/tscSQLParser.c
浏览文件 @
97f85ca1
...
@@ -1788,6 +1788,13 @@ static int32_t handleScalarExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t e
...
@@ -1788,6 +1788,13 @@ static int32_t handleScalarExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t e
}
}
}
}
// ret = exprTreeValidateTree(pNode);
// if (ret != TSDB_CODE_SUCCESS) {
// taosArrayDestroy(colList);
// tExprTreeDestroy(pNode, NULL);
// return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg2);
// }
SBufferWriter
bw
=
tbufInitWriter
(
NULL
,
false
);
SBufferWriter
bw
=
tbufInitWriter
(
NULL
,
false
);
TRY
(
0
)
{
TRY
(
0
)
{
...
@@ -9624,12 +9631,12 @@ int32_t exprTreeFromSqlExpr(SSqlCmd* pCmd, tExprNode **pExpr, const tSqlExpr* pS
...
@@ -9624,12 +9631,12 @@ int32_t exprTreeFromSqlExpr(SSqlCmd* pCmd, tExprNode **pExpr, const tSqlExpr* pS
(
*
pExpr
)
->
nodeType
=
TSQL_NODE_FUNC
;
(
*
pExpr
)
->
nodeType
=
TSQL_NODE_FUNC
;
(
*
pExpr
)
->
_func
.
functionId
=
pSqlExpr
->
functionId
;
(
*
pExpr
)
->
_func
.
functionId
=
pSqlExpr
->
functionId
;
SArray
*
paramList
=
pSqlExpr
->
Expr
.
paramList
;
SArray
*
paramList
=
pSqlExpr
->
Expr
.
paramList
;
size_t
paramSize
=
taosArrayGetSize
(
paramList
)
;
size_t
paramSize
=
paramList
?
taosArrayGetSize
(
paramList
)
:
0
;
if
(
paramSize
>
0
)
{
if
(
paramSize
>
0
)
{
(
*
pExpr
)
->
_func
.
numChildren
=
paramSize
;
(
*
pExpr
)
->
_func
.
numChildren
=
paramSize
;
(
*
pExpr
)
->
_func
.
pChildren
=
(
tExprNode
**
)
calloc
(
paramSize
,
sizeof
(
tExprNode
*
));
(
*
pExpr
)
->
_func
.
pChildren
=
(
tExprNode
**
)
calloc
(
paramSize
,
sizeof
(
tExprNode
*
));
}
}
for
(
int
i
=
0
;
i
<
taosArrayGetSize
(
paramList
)
;
++
i
)
{
for
(
int
32_t
i
=
0
;
i
<
paramSize
;
++
i
)
{
tSqlExprItem
*
param
=
taosArrayGet
(
paramList
,
i
);
tSqlExprItem
*
param
=
taosArrayGet
(
paramList
,
i
);
tSqlExpr
*
paramNode
=
param
->
pNode
;
tSqlExpr
*
paramNode
=
param
->
pNode
;
int32_t
ret
=
exprTreeFromSqlExpr
(
pCmd
,
(
*
pExpr
)
->
_func
.
pChildren
+
i
,
paramNode
,
pQueryInfo
,
pCols
,
uid
);
int32_t
ret
=
exprTreeFromSqlExpr
(
pCmd
,
(
*
pExpr
)
->
_func
.
pChildren
+
i
,
paramNode
,
pQueryInfo
,
pCols
,
uid
);
...
...
src/common/inc/texpr.h
浏览文件 @
97f85ca1
...
@@ -44,12 +44,15 @@ struct SSchema;
...
@@ -44,12 +44,15 @@ struct SSchema;
#define TSDB_FUNC_FLAG_SCALAR 0x4000
#define TSDB_FUNC_FLAG_SCALAR 0x4000
#define TSDB_FUNC_IS_SCALAR(id) ((((id) > 0)) && (((id) & TSDB_FUNC_FLAG_SCALAR) != 0))
#define TSDB_FUNC_IS_SCALAR(id) ((((id) > 0)) && (((id) & TSDB_FUNC_FLAG_SCALAR) != 0))
#define TSDB_FUNC_SCALAR_INDEX(id) ((id) & ~TSDB_FUNC_FLAG_SCALAR)
#define TSDB_FUNC_SCALAR_INDEX(id) ((id) & ~TSDB_FUNC_FLAG_SCALAR)
///////////////////////////////////////////
///////////////////////////////////////////
// SCALAR FUNCTIONS
// SCALAR FUNCTIONS
#define TSDB_FUNC_SCALAR_POW (TSDB_FUNC_FLAG_SCALAR | 0x0000)
#define TSDB_FUNC_SCALAR_POW (TSDB_FUNC_FLAG_SCALAR | 0x0000)
#define TSDB_FUNC_SCALAR_LOG (TSDB_FUNC_FLAG_SCALAR | 0x0001)
#define TSDB_FUNC_SCALAR_LOG (TSDB_FUNC_FLAG_SCALAR | 0x0001)
#define TSDB_FUNC_SCALAR_MAX_NUM 2
#define TSDB_FUNC_SCALAR_CONCAT (TSDB_FUNC_FLAG_SCALAR | 0x0002)
#define TSDB_FUNC_SCALAR_MAX_NUM 3
#define TSDB_FUNC_SCALAR_NAME_MAX_LEN 16
#define TSDB_FUNC_SCALAR_NAME_MAX_LEN 16
typedef
struct
{
typedef
struct
{
int16_t
type
;
int16_t
type
;
int16_t
bytes
;
int16_t
bytes
;
...
@@ -126,6 +129,8 @@ typedef struct SExprTraverseSupp {
...
@@ -126,6 +129,8 @@ typedef struct SExprTraverseSupp {
void
tExprTreeDestroy
(
tExprNode
*
pNode
,
void
(
*
fp
)(
void
*
));
void
tExprTreeDestroy
(
tExprNode
*
pNode
,
void
(
*
fp
)(
void
*
));
int32_t
exprTreeValidateTree
(
tExprNode
*
pExpr
);
void
exprTreeToBinary
(
SBufferWriter
*
bw
,
tExprNode
*
pExprTree
);
void
exprTreeToBinary
(
SBufferWriter
*
bw
,
tExprNode
*
pExprTree
);
tExprNode
*
exprTreeFromBinary
(
const
void
*
data
,
size_t
size
);
tExprNode
*
exprTreeFromBinary
(
const
void
*
data
,
size_t
size
);
tExprNode
*
exprdup
(
tExprNode
*
pTree
);
tExprNode
*
exprdup
(
tExprNode
*
pTree
);
...
...
src/common/src/texpr.c
浏览文件 @
97f85ca1
...
@@ -28,6 +28,96 @@
...
@@ -28,6 +28,96 @@
#include "texpr.h"
#include "texpr.h"
#include "tarithoperator.h"
#include "tarithoperator.h"
int32_t
exprTreeValidateFunctionNode
(
tExprNode
*
pExpr
)
{
int32_t
code
=
TSDB_CODE_SUCCESS
;
//TODO: check childs for every function
switch
(
pExpr
->
_func
.
functionId
)
{
case
TSDB_FUNC_SCALAR_POW
:
case
TSDB_FUNC_SCALAR_LOG
:
{
if
(
pExpr
->
_func
.
numChildren
!=
2
)
{
return
TSDB_CODE_TSC_INVALID_OPERATION
;
}
tExprNode
*
child1
=
pExpr
->
_func
.
pChildren
[
0
];
tExprNode
*
child2
=
pExpr
->
_func
.
pChildren
[
1
];
if
((
child2
->
nodeType
==
TSQL_NODE_VALUE
&&
!
IS_NUMERIC_TYPE
(
child2
->
pVal
->
nType
))
||
!
IS_NUMERIC_TYPE
(
child2
->
resultType
))
{
return
TSDB_CODE_TSC_INVALID_OPERATION
;
}
if
(
!
IS_NUMERIC_TYPE
(
child1
->
resultType
))
{
return
TSDB_CODE_TSC_INVALID_OPERATION
;
}
pExpr
->
resultType
=
TSDB_DATA_TYPE_DOUBLE
;
pExpr
->
resultBytes
=
tDataTypes
[
TSDB_DATA_TYPE_DOUBLE
].
bytes
;
break
;
}
case
TSDB_FUNC_SCALAR_CONCAT
:
{
}
default:
break
;
}
return
code
;
}
int32_t
exprTreeValidateExprNode
(
tExprNode
*
pExpr
)
{
//TODO: modify. keep existing behavior
if
(
pExpr
->
_node
.
optr
==
TSDB_BINARY_OP_ADD
||
pExpr
->
_node
.
optr
==
TSDB_BINARY_OP_SUBTRACT
||
pExpr
->
_node
.
optr
==
TSDB_BINARY_OP_MULTIPLY
||
pExpr
->
_node
.
optr
==
TSDB_BINARY_OP_DIVIDE
||
pExpr
->
_node
.
optr
==
TSDB_BINARY_OP_REMAINDER
)
{
pExpr
->
resultType
=
TSDB_DATA_TYPE_DOUBLE
;
pExpr
->
resultBytes
=
tDataTypes
[
TSDB_DATA_TYPE_DOUBLE
].
bytes
;
return
TSDB_CODE_SUCCESS
;
}
else
{
return
TSDB_CODE_SUCCESS
;
}
}
int32_t
exprTreeValidateTree
(
tExprNode
*
pExpr
)
{
int32_t
code
=
TSDB_CODE_SUCCESS
;
if
(
pExpr
==
NULL
)
{
return
TSDB_CODE_SUCCESS
;
}
if
(
pExpr
->
nodeType
==
TSQL_NODE_VALUE
)
{
pExpr
->
resultType
=
-
1
;
pExpr
->
resultBytes
=
-
1
;
}
else
if
(
pExpr
->
nodeType
==
TSQL_NODE_COL
)
{
pExpr
->
resultType
=
pExpr
->
pSchema
->
type
;
if
(
pExpr
->
pSchema
->
colId
!=
TSDB_TBNAME_COLUMN_INDEX
)
{
pExpr
->
resultBytes
=
pExpr
->
pSchema
->
bytes
;
}
else
{
pExpr
->
resultBytes
=
tGetTbnameColumnSchema
()
->
bytes
;
}
}
else
if
(
pExpr
->
nodeType
==
TSQL_NODE_EXPR
)
{
code
=
exprTreeValidateTree
(
pExpr
->
_node
.
pLeft
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
}
code
=
exprTreeValidateTree
(
pExpr
->
_node
.
pRight
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
}
code
=
exprTreeValidateExprNode
(
pExpr
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
}
}
else
if
(
pExpr
->
nodeType
==
TSQL_NODE_FUNC
)
{
for
(
int32_t
i
=
0
;
i
<
pExpr
->
_func
.
numChildren
;
++
i
)
{
code
=
exprTreeValidateTree
(
pExpr
->
_func
.
pChildren
[
i
]);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
}
}
code
=
exprTreeValidateFunctionNode
(
pExpr
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
}
}
return
TSDB_CODE_SUCCESS
;
}
static
uint8_t
UNUSED_FUNC
isQueryOnPrimaryKey
(
const
char
*
primaryColumnName
,
const
tExprNode
*
pLeft
,
const
tExprNode
*
pRight
)
{
static
uint8_t
UNUSED_FUNC
isQueryOnPrimaryKey
(
const
char
*
primaryColumnName
,
const
tExprNode
*
pLeft
,
const
tExprNode
*
pRight
)
{
if
(
pLeft
->
nodeType
==
TSQL_NODE_COL
)
{
if
(
pLeft
->
nodeType
==
TSQL_NODE_COL
)
{
// if left node is the primary column,return true
// if left node is the primary column,return true
...
@@ -788,6 +878,9 @@ void vectorLog(int16_t functionId, tExprOperandInfo* pInputs, uint8_t numInputs,
...
@@ -788,6 +878,9 @@ void vectorLog(int16_t functionId, tExprOperandInfo* pInputs, uint8_t numInputs,
}
}
}
}
void
vectorConcat
(
int16_t
functionId
,
tExprOperandInfo
*
pInputs
,
uint8_t
numInputs
,
tExprOperandInfo
*
pOutput
,
int32_t
order
)
{
}
_expr_scalar_function_t
getExprScalarFunction
(
uint16_t
funcId
)
{
_expr_scalar_function_t
getExprScalarFunction
(
uint16_t
funcId
)
{
assert
(
TSDB_FUNC_IS_SCALAR
(
funcId
));
assert
(
TSDB_FUNC_IS_SCALAR
(
funcId
));
...
@@ -807,4 +900,9 @@ tScalarFunctionInfo aScalarFunctions[] = {
...
@@ -807,4 +900,9 @@ tScalarFunctionInfo aScalarFunctions[] = {
"log"
,
"log"
,
vectorLog
vectorLog
},
},
{
TSDB_FUNC_SCALAR_CONCAT
,
"concat"
,
vectorConcat
},
};
};
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录