Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
9bd02b1c
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看板
提交
9bd02b1c
编写于
10月 25, 2021
作者:
S
shenglian zhou
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
support function as expression tree node
上级
fb2ca78d
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
120 addition
and
122 deletion
+120
-122
src/client/src/tscSQLParser.c
src/client/src/tscSQLParser.c
+106
-108
src/common/inc/texpr.h
src/common/inc/texpr.h
+2
-2
src/common/src/texpr.c
src/common/src/texpr.c
+12
-12
未找到文件。
src/client/src/tscSQLParser.c
浏览文件 @
9bd02b1c
...
...
@@ -4380,36 +4380,37 @@ static int32_t validateSQLExprTerm(SSqlCmd* pCmd, tSqlExpr* pExpr,
if
(
uidLeft
!=
uidRight
&&
uidLeft
!=
0
&&
uidRight
!=
0
)
{
return
TSDB_CODE_TSC_INVALID_OPERATION
;
*
uid
=
uidLeft
;
}
else
if
(
pExpr
->
type
==
SQL_NODE_SQLFUNCTION
)
{
validateArithmeticSQLFunc
(
pCmd
,
pExpr
,
pQueryInfo
,
pList
,
type
,
uid
);
}
else
if
(
pExpr
->
type
==
SQL_NODE_TABLE_COLUMN
)
{
if
(
*
type
==
NON_ARITHMEIC_EXPR
)
{
*
type
=
NORMAL_ARITHMETIC
;
}
else
if
(
*
type
==
AGG_ARIGHTMEIC
)
{
return
TSDB_CODE_TSC_INVALID_OPERATION
;
}
}
*
uid
=
uidLeft
;
SColumnIndex
index
=
COLUMN_INDEX_INITIALIZER
;
if
(
getColumnIndexByName
(
&
pExpr
->
columnName
,
pQueryInfo
,
&
index
,
tscGetErrorMsgPayload
(
pCmd
))
!=
TSDB_CODE_SUCCESS
)
{
return
TSDB_CODE_TSC_INVALID_OPERATION
;
}
}
else
if
(
pExpr
->
type
==
SQL_NODE_SQLFUNCTION
)
{
validateArithmeticSQLFunc
(
pCmd
,
pExpr
,
pQueryInfo
,
pList
,
type
,
uid
);
}
else
if
(
pExpr
->
type
==
SQL_NODE_TABLE_COLUMN
)
{
if
(
*
type
==
NON_ARITHMEIC_EXPR
)
{
*
type
=
NORMAL_ARITHMETIC
;
}
else
if
(
*
type
==
AGG_ARIGHTMEIC
)
{
return
TSDB_CODE_TSC_INVALID_OPERATION
;
}
// if column is timestamp, bool, binary, nchar, not support arithmetic, so return invalid sql
STableMeta
*
pTableMeta
=
tscGetMetaInfo
(
pQueryInfo
,
index
.
tableIndex
)
->
pTableMeta
;
SSchema
*
pSchema
=
tscGetTableSchema
(
pTableMeta
)
+
index
.
columnIndex
;
SColumnIndex
index
=
COLUMN_INDEX_INITIALIZER
;
if
(
getColumnIndexByName
(
&
pExpr
->
columnName
,
pQueryInfo
,
&
index
,
tscGetErrorMsgPayload
(
pCmd
))
!=
TSDB_CODE_SUCCESS
)
{
return
TSDB_CODE_TSC_INVALID_OPERATION
;
}
if
((
pSchema
->
type
==
TSDB_DATA_TYPE_TIMESTAMP
)
||
(
pSchema
->
type
==
TSDB_DATA_TYPE_BOOL
)
||
(
pSchema
->
type
==
TSDB_DATA_TYPE_BINARY
)
||
(
pSchema
->
type
==
TSDB_DATA_TYPE_NCHAR
))
{
return
TSDB_CODE_TSC_INVALID_OPERATION
;
}
// if column is timestamp, bool, binary, nchar, not support arithmetic, so return invalid sql
STableMeta
*
pTableMeta
=
tscGetMetaInfo
(
pQueryInfo
,
index
.
tableIndex
)
->
pTableMeta
;
SSchema
*
pSchema
=
tscGetTableSchema
(
pTableMeta
)
+
index
.
columnIndex
;
pList
->
ids
[
pList
->
num
++
]
=
index
;
}
else
if
((
pExpr
->
tokenId
==
TK_FLOAT
&&
(
isnan
(
pExpr
->
value
.
dKey
)
||
isinf
(
pExpr
->
value
.
dKey
)))
||
pExpr
->
tokenId
==
TK_NULL
)
{
if
((
pSchema
->
type
==
TSDB_DATA_TYPE_TIMESTAMP
)
||
(
pSchema
->
type
==
TSDB_DATA_TYPE_BOOL
)
||
(
pSchema
->
type
==
TSDB_DATA_TYPE_BINARY
)
||
(
pSchema
->
type
==
TSDB_DATA_TYPE_NCHAR
))
{
return
TSDB_CODE_TSC_INVALID_OPERATION
;
}
pList
->
ids
[
pList
->
num
++
]
=
index
;
}
else
if
((
pExpr
->
tokenId
==
TK_FLOAT
&&
(
isnan
(
pExpr
->
value
.
dKey
)
||
isinf
(
pExpr
->
value
.
dKey
)))
||
pExpr
->
tokenId
==
TK_NULL
)
{
return
TSDB_CODE_TSC_INVALID_OPERATION
;
}
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -9266,33 +9267,7 @@ int32_t validateSqlNode(SSqlObj* pSql, SSqlNode* pSqlNode, SQueryInfo* pQueryInf
}
int32_t
exprTreeFromSqlExpr
(
SSqlCmd
*
pCmd
,
tExprNode
**
pExpr
,
const
tSqlExpr
*
pSqlExpr
,
SQueryInfo
*
pQueryInfo
,
SArray
*
pCols
,
uint64_t
*
uid
)
{
tExprNode
*
pLeft
=
NULL
;
tExprNode
*
pRight
=
NULL
;
SColumnIndex
index
=
COLUMN_INDEX_INITIALIZER
;
if
(
pSqlExpr
->
pLeft
!=
NULL
)
{
int32_t
ret
=
exprTreeFromSqlExpr
(
pCmd
,
&
pLeft
,
pSqlExpr
->
pLeft
,
pQueryInfo
,
pCols
,
uid
);
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
return
ret
;
}
}
if
(
pSqlExpr
->
pRight
!=
NULL
)
{
int32_t
ret
=
exprTreeFromSqlExpr
(
pCmd
,
&
pRight
,
pSqlExpr
->
pRight
,
pQueryInfo
,
pCols
,
uid
);
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
tExprTreeDestroy
(
pLeft
,
NULL
);
return
ret
;
}
}
if
(
pSqlExpr
->
pLeft
==
NULL
&&
pSqlExpr
->
pRight
==
NULL
&&
pSqlExpr
->
tokenId
==
0
)
{
*
pExpr
=
calloc
(
1
,
sizeof
(
tExprNode
));
return
TSDB_CODE_SUCCESS
;
}
if
(
pSqlExpr
->
pLeft
==
NULL
)
{
// it is the leaf node
assert
(
pSqlExpr
->
pRight
==
NULL
);
if
(
pSqlExpr
->
pLeft
==
NULL
&&
pSqlExpr
->
pRight
==
NULL
)
{
if
(
pSqlExpr
->
type
==
SQL_NODE_VALUE
)
{
int32_t
ret
=
TSDB_CODE_SUCCESS
;
*
pExpr
=
calloc
(
1
,
sizeof
(
tExprNode
));
...
...
@@ -9306,7 +9281,7 @@ int32_t exprTreeFromSqlExpr(SSqlCmd* pCmd, tExprNode **pExpr, const tSqlExpr* pS
if
(
colSize
>
0
)
{
SColIndex
*
idx
=
taosArrayGet
(
pCols
,
colSize
-
1
);
SSchema
*
pSchema
=
tscGetTableColumnSchema
(
pTableMeta
,
idx
->
colIndex
);
// convert time by precision
if
(
pSchema
!=
NULL
&&
TSDB_DATA_TYPE_TIMESTAMP
==
pSchema
->
type
&&
TSDB_DATA_TYPE_BINARY
==
(
*
pExpr
)
->
pVal
->
nType
)
{
...
...
@@ -9315,52 +9290,9 @@ int32_t exprTreeFromSqlExpr(SSqlCmd* pCmd, tExprNode **pExpr, const tSqlExpr* pS
}
}
return
ret
;
}
else
if
(
pSqlExpr
->
type
==
SQL_NODE_SQLFUNCTION
)
{
if
(
TSDB_FUNC_IS_SCALAR
(
pSqlExpr
->
functionId
))
{
*
pExpr
=
calloc
(
1
,
sizeof
(
tExprNode
));
(
*
pExpr
)
->
nodeType
=
TSQL_NODE_FUNC
;
(
*
pExpr
)
->
_func
.
functionId
=
pSqlExpr
->
functionId
;
SArray
*
paramList
=
pSqlExpr
->
Expr
.
paramList
;
size_t
paramSize
=
taosArrayGetSize
(
paramList
);
if
(
paramSize
>
0
)
{
(
*
pExpr
)
->
_func
.
numChilds
=
paramSize
;
(
*
pExpr
)
->
_func
.
pChilds
=
(
tExprNode
**
)
calloc
(
paramSize
,
sizeof
(
tExprNode
*
));
}
for
(
int
i
=
0
;
i
<
taosArrayGetSize
(
paramList
);
++
i
)
{
tSqlExprItem
*
param
=
taosArrayGet
(
paramList
,
i
);
tSqlExpr
*
paramNode
=
param
->
pNode
;
int32_t
ret
=
exprTreeFromSqlExpr
(
pCmd
,
(
*
pExpr
)
->
_func
.
pChilds
+
i
,
paramNode
,
pQueryInfo
,
pCols
,
uid
);
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
return
ret
;
}
}
}
else
{
// arithmetic expression on the results of aggregation functions
*
pExpr
=
calloc
(
1
,
sizeof
(
tExprNode
));
(
*
pExpr
)
->
nodeType
=
TSQL_NODE_COL
;
(
*
pExpr
)
->
pSchema
=
calloc
(
1
,
sizeof
(
SSchema
));
strncpy
((
*
pExpr
)
->
pSchema
->
name
,
pSqlExpr
->
exprToken
.
z
,
pSqlExpr
->
exprToken
.
n
);
// set the input column data byte and type.
size_t
size
=
taosArrayGetSize
(
pQueryInfo
->
exprList
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
SExprInfo
*
p1
=
taosArrayGetP
(
pQueryInfo
->
exprList
,
i
);
if
(
strcmp
((
*
pExpr
)
->
pSchema
->
name
,
p1
->
base
.
aliasName
)
==
0
)
{
(
*
pExpr
)
->
pSchema
->
type
=
(
uint8_t
)
p1
->
base
.
resType
;
(
*
pExpr
)
->
pSchema
->
bytes
=
p1
->
base
.
resBytes
;
(
*
pExpr
)
->
pSchema
->
colId
=
p1
->
base
.
resColId
;
if
(
uid
!=
NULL
)
{
*
uid
=
p1
->
base
.
uid
;
}
}
else
if
(
pSqlExpr
->
type
==
SQL_NODE_TABLE_COLUMN
)
{
// column name, normal column arithmetic expression
SColumnIndex
index
=
COLUMN_INDEX_INITIALIZER
;
break
;
}
}
// endfor each expr
}
// end not scalar function
}
else
if
(
pSqlExpr
->
type
==
SQL_NODE_TABLE_COLUMN
)
{
// column name, normal column arithmetic expression
int32_t
ret
=
getColumnIndexByName
(
&
pSqlExpr
->
columnName
,
pQueryInfo
,
&
index
,
tscGetErrorMsgPayload
(
pCmd
));
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
return
ret
;
...
...
@@ -9368,14 +9300,14 @@ int32_t exprTreeFromSqlExpr(SSqlCmd* pCmd, tExprNode **pExpr, const tSqlExpr* pS
pQueryInfo
->
curTableIdx
=
index
.
tableIndex
;
STableMeta
*
pTableMeta
=
tscGetMetaInfo
(
pQueryInfo
,
index
.
tableIndex
)
->
pTableMeta
;
int32_t
numOfColumns
=
tscGetNumOfColumns
(
pTableMeta
);
int32_t
numOfColumns
=
tscGetNumOfColumns
(
pTableMeta
);
*
pExpr
=
calloc
(
1
,
sizeof
(
tExprNode
));
(
*
pExpr
)
->
nodeType
=
TSQL_NODE_COL
;
(
*
pExpr
)
->
pSchema
=
calloc
(
1
,
sizeof
(
SSchema
));
SSchema
*
pSchema
=
NULL
;
if
(
index
.
columnIndex
==
TSDB_TBNAME_COLUMN_INDEX
)
{
pSchema
=
(
*
pExpr
)
->
pSchema
;
strcpy
(
pSchema
->
name
,
TSQL_TBNAME_L
);
...
...
@@ -9386,17 +9318,16 @@ int32_t exprTreeFromSqlExpr(SSqlCmd* pCmd, tExprNode **pExpr, const tSqlExpr* pS
pSchema
=
tscGetTableColumnSchema
(
pTableMeta
,
index
.
columnIndex
);
*
(
*
pExpr
)
->
pSchema
=
*
pSchema
;
}
if
(
pCols
!=
NULL
)
{
// record the involved columns
SColIndex
colIndex
=
{
0
};
tstrncpy
(
colIndex
.
name
,
pSchema
->
name
,
sizeof
(
colIndex
.
name
));
colIndex
.
colId
=
pSchema
->
colId
;
colIndex
.
colIndex
=
index
.
columnIndex
;
colIndex
.
flag
=
(
index
.
columnIndex
>=
numOfColumns
)
?
1
:
0
;
colIndex
.
flag
=
(
index
.
columnIndex
>=
numOfColumns
)
?
1
:
0
;
taosArrayPush
(
pCols
,
&
colIndex
);
}
return
TSDB_CODE_SUCCESS
;
}
else
if
(
pSqlExpr
->
tokenId
==
TK_SET
)
{
int32_t
colType
=
-
1
;
...
...
@@ -9430,21 +9361,44 @@ int32_t exprTreeFromSqlExpr(SSqlCmd* pCmd, tExprNode **pExpr, const tSqlExpr* pS
*
pExpr
=
calloc
(
1
,
sizeof
(
tExprNode
));
(
*
pExpr
)
->
nodeType
=
TSQL_NODE_VALUE
;
(
*
pExpr
)
->
pVal
=
pVal
;
return
TSDB_CODE_SUCCESS
;
}
else
if
(
pSqlExpr
->
tokenId
==
0
)
{
*
pExpr
=
calloc
(
1
,
sizeof
(
tExprNode
));
return
TSDB_CODE_SUCCESS
;
}
else
{
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
"not support filter expression"
);
}
}
else
{
}
if
(
pSqlExpr
->
type
==
SQL_NODE_EXPR
)
{
tExprNode
*
pLeft
=
NULL
;
tExprNode
*
pRight
=
NULL
;
if
(
pSqlExpr
->
pLeft
!=
NULL
)
{
int32_t
ret
=
exprTreeFromSqlExpr
(
pCmd
,
&
pLeft
,
pSqlExpr
->
pLeft
,
pQueryInfo
,
pCols
,
uid
);
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
return
ret
;
}
}
if
(
pSqlExpr
->
pRight
!=
NULL
)
{
int32_t
ret
=
exprTreeFromSqlExpr
(
pCmd
,
&
pRight
,
pSqlExpr
->
pRight
,
pQueryInfo
,
pCols
,
uid
);
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
tExprTreeDestroy
(
pLeft
,
NULL
);
return
ret
;
}
}
*
pExpr
=
(
tExprNode
*
)
calloc
(
1
,
sizeof
(
tExprNode
));
(
*
pExpr
)
->
nodeType
=
TSQL_NODE_EXPR
;
(
*
pExpr
)
->
_node
.
hasPK
=
false
;
(
*
pExpr
)
->
_node
.
pLeft
=
pLeft
;
(
*
pExpr
)
->
_node
.
pRight
=
pRight
;
SStrToken
t
=
{.
type
=
pSqlExpr
->
tokenId
};
(
*
pExpr
)
->
_node
.
optr
=
convertRelationalOperator
(
&
t
);
assert
((
*
pExpr
)
->
_node
.
optr
!=
0
);
// check for dividing by 0
...
...
@@ -9466,8 +9420,52 @@ int32_t exprTreeFromSqlExpr(SSqlCmd* pCmd, tExprNode **pExpr, const tSqlExpr* pS
}
}
}
}
else
if
(
pSqlExpr
->
type
==
SQL_NODE_SQLFUNCTION
)
{
if
(
TSDB_FUNC_IS_SCALAR
(
pSqlExpr
->
functionId
))
{
*
pExpr
=
calloc
(
1
,
sizeof
(
tExprNode
));
(
*
pExpr
)
->
nodeType
=
TSQL_NODE_FUNC
;
(
*
pExpr
)
->
_func
.
functionId
=
pSqlExpr
->
functionId
;
SArray
*
paramList
=
pSqlExpr
->
Expr
.
paramList
;
size_t
paramSize
=
taosArrayGetSize
(
paramList
);
if
(
paramSize
>
0
)
{
(
*
pExpr
)
->
_func
.
numChildren
=
paramSize
;
(
*
pExpr
)
->
_func
.
pChildren
=
(
tExprNode
**
)
calloc
(
paramSize
,
sizeof
(
tExprNode
*
));
}
for
(
int
i
=
0
;
i
<
taosArrayGetSize
(
paramList
);
++
i
)
{
tSqlExprItem
*
param
=
taosArrayGet
(
paramList
,
i
);
tSqlExpr
*
paramNode
=
param
->
pNode
;
int32_t
ret
=
exprTreeFromSqlExpr
(
pCmd
,
(
*
pExpr
)
->
_func
.
pChildren
+
i
,
paramNode
,
pQueryInfo
,
pCols
,
uid
);
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
return
ret
;
}
}
}
else
{
// arithmetic expression on the results of aggregation functions
*
pExpr
=
calloc
(
1
,
sizeof
(
tExprNode
));
(
*
pExpr
)
->
nodeType
=
TSQL_NODE_COL
;
(
*
pExpr
)
->
pSchema
=
calloc
(
1
,
sizeof
(
SSchema
));
strncpy
((
*
pExpr
)
->
pSchema
->
name
,
pSqlExpr
->
exprToken
.
z
,
pSqlExpr
->
exprToken
.
n
);
// set the input column data byte and type.
size_t
size
=
taosArrayGetSize
(
pQueryInfo
->
exprList
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
SExprInfo
*
p1
=
taosArrayGetP
(
pQueryInfo
->
exprList
,
i
);
if
(
strcmp
((
*
pExpr
)
->
pSchema
->
name
,
p1
->
base
.
aliasName
)
==
0
)
{
(
*
pExpr
)
->
pSchema
->
type
=
(
uint8_t
)
p1
->
base
.
resType
;
(
*
pExpr
)
->
pSchema
->
bytes
=
p1
->
base
.
resBytes
;
(
*
pExpr
)
->
pSchema
->
colId
=
p1
->
base
.
resColId
;
if
(
uid
!=
NULL
)
{
*
uid
=
p1
->
base
.
uid
;
}
break
;
}
}
// endfor each expr
}
// end not scalar function
}
return
TSDB_CODE_SUCCESS
;
}
...
...
src/common/inc/texpr.h
浏览文件 @
9bd02b1c
...
...
@@ -80,8 +80,8 @@ typedef struct tExprNode {
struct
{
int16_t
functionId
;
uint8_t
numChild
s
;
struct
tExprNode
**
pChild
s
;
uint8_t
numChild
ren
;
struct
tExprNode
**
pChild
ren
;
}
_func
;
};
}
tExprNode
;
...
...
src/common/src/texpr.c
浏览文件 @
9bd02b1c
...
...
@@ -144,8 +144,8 @@ static void doExprTreeDestroy(tExprNode **pExpr, void (*fp)(void *)) {
}
else
if
((
*
pExpr
)
->
nodeType
==
TSQL_NODE_COL
)
{
free
((
*
pExpr
)
->
pSchema
);
}
else
if
((
*
pExpr
)
->
nodeType
==
TSQL_NODE_FUNC
)
{
for
(
int
i
=
0
;
i
<
(
*
pExpr
)
->
_func
.
numChild
s
;
++
i
)
{
doExprTreeDestroy
((
*
pExpr
)
->
_func
.
pChild
s
+
i
,
fp
);
for
(
int
i
=
0
;
i
<
(
*
pExpr
)
->
_func
.
numChild
ren
;
++
i
)
{
doExprTreeDestroy
((
*
pExpr
)
->
_func
.
pChild
ren
+
i
,
fp
);
}
}
...
...
@@ -315,9 +315,9 @@ static void exprTreeToBinaryImpl(SBufferWriter* bw, tExprNode* expr) {
exprTreeToBinaryImpl
(
bw
,
expr
->
_node
.
pRight
);
}
else
if
(
expr
->
nodeType
==
TSQL_NODE_FUNC
)
{
tbufWriteInt16
(
bw
,
expr
->
_func
.
functionId
);
tbufWriteUint8
(
bw
,
expr
->
_func
.
numChild
s
);
for
(
int
i
=
0
;
i
<
expr
->
_func
.
numChild
s
;
++
i
)
{
exprTreeToBinaryImpl
(
bw
,
expr
->
_func
.
pChild
s
[
i
]);
tbufWriteUint8
(
bw
,
expr
->
_func
.
numChild
ren
);
for
(
int
i
=
0
;
i
<
expr
->
_func
.
numChild
ren
;
++
i
)
{
exprTreeToBinaryImpl
(
bw
,
expr
->
_func
.
pChild
ren
[
i
]);
}
}
}
...
...
@@ -386,10 +386,10 @@ static tExprNode* exprTreeFromBinaryImpl(SBufferReader* br) {
assert
(
pExpr
->
_node
.
pLeft
!=
NULL
&&
pExpr
->
_node
.
pRight
!=
NULL
);
}
else
if
(
pExpr
->
nodeType
==
TSQL_NODE_FUNC
)
{
pExpr
->
_func
.
functionId
=
tbufReadInt16
(
br
);
pExpr
->
_func
.
numChild
s
=
tbufReadUint8
(
br
);
pExpr
->
_func
.
pChild
s
=
(
tExprNode
**
)
calloc
(
pExpr
->
_func
.
numChilds
,
sizeof
(
tExprNode
*
));
for
(
int
i
=
0
;
i
<
pExpr
->
_func
.
numChild
s
;
++
i
)
{
pExpr
->
_func
.
pChild
s
[
i
]
=
exprTreeFromBinaryImpl
(
br
);
pExpr
->
_func
.
numChild
ren
=
tbufReadUint8
(
br
);
pExpr
->
_func
.
pChild
ren
=
(
tExprNode
**
)
calloc
(
pExpr
->
_func
.
numChildren
,
sizeof
(
tExprNode
*
));
for
(
int
i
=
0
;
i
<
pExpr
->
_func
.
numChild
ren
;
++
i
)
{
pExpr
->
_func
.
pChild
ren
[
i
]
=
exprTreeFromBinaryImpl
(
br
);
}
}
...
...
@@ -641,9 +641,9 @@ tExprNode* exprdup(tExprNode* pNode) {
*
pCloned
->
pSchema
=
*
pNode
->
pSchema
;
}
else
if
(
pNode
->
nodeType
==
TSQL_NODE_FUNC
)
{
pCloned
->
_func
.
functionId
=
pNode
->
_func
.
functionId
;
pCloned
->
_func
.
numChild
s
=
pNode
->
_func
.
numChilds
;
for
(
int
i
=
0
;
i
<
pNode
->
_func
.
numChild
s
;
++
i
)
{
pCloned
->
_func
.
pChild
s
[
i
]
=
exprdup
(
pNode
->
_func
.
pChilds
[
i
]);
pCloned
->
_func
.
numChild
ren
=
pNode
->
_func
.
numChildren
;
for
(
int
i
=
0
;
i
<
pNode
->
_func
.
numChild
ren
;
++
i
)
{
pCloned
->
_func
.
pChild
ren
[
i
]
=
exprdup
(
pNode
->
_func
.
pChildren
[
i
]);
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录