Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
562dfa9e
T
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1185
Star
22016
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看板
提交
562dfa9e
编写于
10月 27, 2021
作者:
H
Haojun Liao
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[td-10564]Add implementation for planner.
上级
a531411e
变更
18
展开全部
隐藏空白更改
内联
并排
Showing
18 changed file
with
1269 addition
and
738 deletion
+1269
-738
include/common/taosmsg.h
include/common/taosmsg.h
+0
-1
include/libs/function/function.h
include/libs/function/function.h
+8
-2
include/libs/parser/parser.h
include/libs/parser/parser.h
+43
-2
source/libs/function/src/taggfunction.c
source/libs/function/src/taggfunction.c
+108
-108
source/libs/function/src/texpr.c
source/libs/function/src/texpr.c
+0
-1
source/libs/function/src/tfunction.c
source/libs/function/src/tfunction.c
+1
-1
source/libs/parser/inc/parserInt.h
source/libs/parser/inc/parserInt.h
+3
-28
source/libs/parser/inc/parserUtil.h
source/libs/parser/inc/parserUtil.h
+1
-1
source/libs/parser/inc/queryInfoUtil.h
source/libs/parser/inc/queryInfoUtil.h
+2
-3
source/libs/parser/src/astValidate.c
source/libs/parser/src/astValidate.c
+269
-266
source/libs/parser/src/parser.c
source/libs/parser/src/parser.c
+1
-6
source/libs/parser/src/parserUtil.c
source/libs/parser/src/parserUtil.c
+11
-11
source/libs/parser/src/queryInfoUtil.c
source/libs/parser/src/queryInfoUtil.c
+13
-14
source/libs/parser/test/parserTests.cpp
source/libs/parser/test/parserTests.cpp
+268
-268
source/libs/planner/CMakeLists.txt
source/libs/planner/CMakeLists.txt
+1
-1
source/libs/planner/inc/plannerInt.h
source/libs/planner/inc/plannerInt.h
+4
-5
source/libs/planner/src/planner.c
source/libs/planner/src/planner.c
+536
-8
src/client/src/tscUtil.c
src/client/src/tscUtil.c
+0
-12
未找到文件。
include/common/taosmsg.h
浏览文件 @
562dfa9e
...
...
@@ -460,7 +460,6 @@ typedef struct SColumnInfo {
typedef
struct
STableIdInfo
{
uint64_t
uid
;
int32_t
tid
;
TSKEY
key
;
// last accessed ts, for subscription
}
STableIdInfo
;
...
...
include/libs/function/function.h
浏览文件 @
562dfa9e
...
...
@@ -178,8 +178,14 @@ typedef struct SScalarFunctionInfo {
void
(
*
exec
)(
SQLFunctionCtx
*
pCtx
);
}
SScalarFunctionInfo
;
int32_t
getResultDataInfo
(
int32_t
dataType
,
int32_t
dataBytes
,
int32_t
functionId
,
int32_t
param
,
int16_t
*
type
,
int16_t
*
len
,
int32_t
*
interBytes
,
int16_t
extLength
,
bool
isSuperTable
/*, SUdfInfo* pUdfInfo*/
);
typedef
struct
SResultDataInfo
{
int16_t
type
;
int16_t
bytes
;
int32_t
intermediateBytes
;
}
SResultDataInfo
;
int32_t
getResultDataInfo
(
int32_t
dataType
,
int32_t
dataBytes
,
int32_t
functionId
,
int32_t
param
,
SResultDataInfo
*
pInfo
,
int16_t
extLength
,
bool
isSuperTable
);
/**
* If the given name is a valid built-in sql function, the value of true will be returned.
...
...
include/libs/parser/parser.h
浏览文件 @
562dfa9e
...
...
@@ -23,6 +23,29 @@ extern "C" {
#include "catalog.h"
#include "common.h"
#include "tname.h"
#include "tvariant.h"
typedef
struct
SColumn
{
uint64_t
tableUid
;
int32_t
columnIndex
;
SColumnInfo
info
;
}
SColumn
;
// the structure for sql function in select clause
typedef
struct
SSqlExpr
{
char
token
[
TSDB_COL_NAME_LEN
];
// original token
SSchema
resSchema
;
SColIndex
colInfo
;
uint64_t
uid
;
// table uid, todo refactor use the pointer
int32_t
interBytes
;
// inter result buffer size
int16_t
numOfParams
;
// argument value of each function
SVariant
param
[
3
];
// parameters are not more than 3
}
SSqlExpr
;
typedef
struct
SExprInfo
{
SSqlExpr
base
;
struct
tExprNode
*
pExpr
;
}
SExprInfo
;
//typedef struct SInterval {
// int32_t tz; // query client timezone
...
...
@@ -107,7 +130,7 @@ typedef struct STableMetaInfo {
SArray
*
tagColList
;
// SArray<SColumn*>, involved tag columns
}
STableMetaInfo
;
typedef
struct
SQuery
Type
{
typedef
struct
SQuery
AttrInfo
{
bool
stableQuery
;
bool
groupbyColumn
;
bool
simpleAgg
;
...
...
@@ -119,7 +142,7 @@ typedef struct SQueryType {
bool
stateWindow
;
bool
globalMerge
;
bool
multigroupResult
;
}
SQuery
Type
;
}
SQuery
AttrInfo
;
typedef
struct
SQueryStmtInfo
{
int16_t
command
;
// the command may be different for each subclause, so keep it seperately.
...
...
@@ -163,8 +186,15 @@ typedef struct SQueryStmtInfo {
SArray
*
pUpstream
;
// SArray<struct SQueryStmtInfo>
struct
SQueryStmtInfo
*
pDownstream
;
int32_t
havingFieldNum
;
SQueryAttrInfo
info
;
}
SQueryStmtInfo
;
typedef
struct
SColumnIndex
{
int16_t
tableIndex
;
int16_t
columnIndex
;
int16_t
type
;
// normal column/tag/ user input constant column
}
SColumnIndex
;
struct
SInsertStmtInfo
;
/**
...
...
@@ -206,6 +236,17 @@ int32_t qParseInsertSql(const char* pStr, size_t length, struct SInsertStmtInfo*
*/
int32_t
qParserConvertSql
(
const
char
*
pStr
,
size_t
length
,
char
**
pConvertSql
);
void
assignExprInfo
(
SExprInfo
*
dst
,
const
SExprInfo
*
src
);
void
columnListCopy
(
SArray
*
dst
,
const
SArray
*
src
,
uint64_t
uid
);
void
columnListDestroy
(
SArray
*
pColumnList
);
void
dropAllExprInfo
(
SArray
*
pExprInfo
);
SExprInfo
*
createExprInfo
(
STableMetaInfo
*
pTableMetaInfo
,
int16_t
functionId
,
SColumnIndex
*
pColIndex
,
struct
tExprNode
*
pParamExpr
,
SSchema
*
pResSchema
,
int16_t
interSize
);
int32_t
copyExprInfoList
(
SArray
*
dst
,
const
SArray
*
src
,
uint64_t
uid
,
bool
deepcopy
);
STableMetaInfo
*
getMetaInfo
(
SQueryStmtInfo
*
pQueryInfo
,
int32_t
tableIndex
);
int32_t
getNewResColId
();
#ifdef __cplusplus
}
#endif
...
...
source/libs/function/src/taggfunction.c
浏览文件 @
562dfa9e
...
...
@@ -196,8 +196,8 @@ typedef struct SFileBlockInfo {
int32_t
numBlocksOfStep
;
}
SFileBlockInfo
;
int32_t
getResultDataInfo
(
int32_t
dataType
,
int32_t
dataBytes
,
int32_t
functionId
,
int32_t
param
,
int16_t
*
type
,
int16_t
*
bytes
,
int32_t
*
interBytes
,
int16_t
extLength
,
bool
isSuperTable
/*, SUdfInfo* pUdfInfo*/
)
{
int32_t
getResultDataInfo
(
int32_t
dataType
,
int32_t
dataBytes
,
int32_t
functionId
,
int32_t
param
,
SResultDataInfo
*
pInfo
,
int16_t
extLength
,
bool
isSuperTable
/*, SUdfInfo* pUdfInfo*/
)
{
if
(
!
isValidDataType
(
dataType
))
{
// qError("Illegal data type %d or data type length %d", dataType, dataBytes);
return
TSDB_CODE_TSC_INVALID_OPERATION
;
...
...
@@ -207,13 +207,13 @@ int32_t getResultDataInfo(int32_t dataType, int32_t dataBytes, int32_t functionI
if
(
functionId
==
FUNCTION_TS
||
functionId
==
FUNCTION_TS_DUMMY
||
functionId
==
FUNCTION_TAG_DUMMY
||
functionId
==
FUNCTION_DIFF
||
functionId
==
FUNCTION_PRJ
||
functionId
==
FUNCTION_TAGPRJ
||
functionId
==
FUNCTION_TAG
||
functionId
==
FUNCTION_INTERP
)
{
*
type
=
(
int16_t
)
dataType
;
*
bytes
=
(
int16_t
)
dataBytes
;
pInfo
->
type
=
(
int16_t
)
dataType
;
pInfo
->
bytes
=
(
int16_t
)
dataBytes
;
if
(
functionId
==
FUNCTION_INTERP
)
{
*
inter
Bytes
=
sizeof
(
SInterpInfoDetail
);
pInfo
->
intermediate
Bytes
=
sizeof
(
SInterpInfoDetail
);
}
else
{
*
inter
Bytes
=
0
;
pInfo
->
intermediate
Bytes
=
0
;
}
return
TSDB_CODE_SUCCESS
;
...
...
@@ -221,207 +221,207 @@ int32_t getResultDataInfo(int32_t dataType, int32_t dataBytes, int32_t functionI
// (uid, tid) + VGID + TAGSIZE + VARSTR_HEADER_SIZE
if
(
functionId
==
FUNCTION_TID_TAG
)
{
// todo use struct
*
type
=
TSDB_DATA_TYPE_BINARY
;
*
bytes
=
(
int16_t
)(
dataBytes
+
sizeof
(
int16_t
)
+
sizeof
(
int64_t
)
+
sizeof
(
int32_t
)
+
sizeof
(
int32_t
)
+
VARSTR_HEADER_SIZE
);
*
inter
Bytes
=
0
;
pInfo
->
type
=
TSDB_DATA_TYPE_BINARY
;
pInfo
->
bytes
=
(
int16_t
)(
dataBytes
+
sizeof
(
int16_t
)
+
sizeof
(
int64_t
)
+
sizeof
(
int32_t
)
+
sizeof
(
int32_t
)
+
VARSTR_HEADER_SIZE
);
pInfo
->
intermediate
Bytes
=
0
;
return
TSDB_CODE_SUCCESS
;
}
if
(
functionId
==
FUNCTION_BLKINFO
)
{
*
type
=
TSDB_DATA_TYPE_BINARY
;
*
bytes
=
16384
;
*
inter
Bytes
=
0
;
pInfo
->
type
=
TSDB_DATA_TYPE_BINARY
;
pInfo
->
bytes
=
16384
;
pInfo
->
intermediate
Bytes
=
0
;
return
TSDB_CODE_SUCCESS
;
}
if
(
functionId
==
FUNCTION_COUNT
)
{
*
type
=
TSDB_DATA_TYPE_BIGINT
;
*
bytes
=
sizeof
(
int64_t
);
*
inter
Bytes
=
0
;
pInfo
->
type
=
TSDB_DATA_TYPE_BIGINT
;
pInfo
->
bytes
=
sizeof
(
int64_t
);
pInfo
->
intermediate
Bytes
=
0
;
return
TSDB_CODE_SUCCESS
;
}
if
(
functionId
==
FUNCTION_ARITHM
)
{
*
type
=
TSDB_DATA_TYPE_DOUBLE
;
*
bytes
=
sizeof
(
double
);
*
inter
Bytes
=
0
;
pInfo
->
type
=
TSDB_DATA_TYPE_DOUBLE
;
pInfo
->
bytes
=
sizeof
(
double
);
pInfo
->
intermediate
Bytes
=
0
;
return
TSDB_CODE_SUCCESS
;
}
if
(
functionId
==
FUNCTION_TS_COMP
)
{
*
type
=
TSDB_DATA_TYPE_BINARY
;
*
bytes
=
1
;
// this results is compressed ts data, only one byte
*
inter
Bytes
=
POINTER_BYTES
;
pInfo
->
type
=
TSDB_DATA_TYPE_BINARY
;
pInfo
->
bytes
=
1
;
// this results is compressed ts data, only one byte
pInfo
->
intermediate
Bytes
=
POINTER_BYTES
;
return
TSDB_CODE_SUCCESS
;
}
if
(
functionId
==
FUNCTION_DERIVATIVE
)
{
*
type
=
TSDB_DATA_TYPE_DOUBLE
;
*
bytes
=
sizeof
(
double
);
// this results is compressed ts data, only one byte
*
inter
Bytes
=
sizeof
(
SDerivInfo
);
pInfo
->
type
=
TSDB_DATA_TYPE_DOUBLE
;
pInfo
->
bytes
=
sizeof
(
double
);
// this results is compressed ts data, only one byte
pInfo
->
intermediate
Bytes
=
sizeof
(
SDerivInfo
);
return
TSDB_CODE_SUCCESS
;
}
if
(
isSuperTable
)
{
// if (functionId < 0) {
// if (pUdfInfo->bufSize > 0) {
//
*
type = TSDB_DATA_TYPE_BINARY;
//
*
bytes = pUdfInfo->bufSize;
//
*interBytes = *
bytes;
//
pInfo->
type = TSDB_DATA_TYPE_BINARY;
//
pInfo->
bytes = pUdfInfo->bufSize;
//
pInfo->intermediateBytes = pInfo->
bytes;
// } else {
//
*
type = pUdfInfo->resType;
//
*
bytes = pUdfInfo->resBytes;
//
*interBytes = *
bytes;
//
pInfo->
type = pUdfInfo->resType;
//
pInfo->
bytes = pUdfInfo->resBytes;
//
pInfo->intermediateBytes = pInfo->
bytes;
// }
//
// return TSDB_CODE_SUCCESS;
// }
if
(
functionId
==
FUNCTION_MIN
||
functionId
==
FUNCTION_MAX
)
{
*
type
=
TSDB_DATA_TYPE_BINARY
;
*
bytes
=
(
int16_t
)(
dataBytes
+
DATA_SET_FLAG_SIZE
);
*
interBytes
=
*
bytes
;
pInfo
->
type
=
TSDB_DATA_TYPE_BINARY
;
pInfo
->
bytes
=
(
int16_t
)(
dataBytes
+
DATA_SET_FLAG_SIZE
);
pInfo
->
intermediateBytes
=
pInfo
->
bytes
;
return
TSDB_CODE_SUCCESS
;
}
else
if
(
functionId
==
FUNCTION_SUM
)
{
*
type
=
TSDB_DATA_TYPE_BINARY
;
*
bytes
=
sizeof
(
SSumInfo
);
*
interBytes
=
*
bytes
;
pInfo
->
type
=
TSDB_DATA_TYPE_BINARY
;
pInfo
->
bytes
=
sizeof
(
SSumInfo
);
pInfo
->
intermediateBytes
=
pInfo
->
bytes
;
return
TSDB_CODE_SUCCESS
;
}
else
if
(
functionId
==
FUNCTION_AVG
)
{
*
type
=
TSDB_DATA_TYPE_BINARY
;
*
bytes
=
sizeof
(
SAvgInfo
);
*
interBytes
=
*
bytes
;
pInfo
->
type
=
TSDB_DATA_TYPE_BINARY
;
pInfo
->
bytes
=
sizeof
(
SAvgInfo
);
pInfo
->
intermediateBytes
=
pInfo
->
bytes
;
return
TSDB_CODE_SUCCESS
;
}
else
if
(
functionId
>=
FUNCTION_RATE
&&
functionId
<=
FUNCTION_IRATE
)
{
*
type
=
TSDB_DATA_TYPE_DOUBLE
;
*
bytes
=
sizeof
(
SRateInfo
);
*
inter
Bytes
=
sizeof
(
SRateInfo
);
pInfo
->
type
=
TSDB_DATA_TYPE_DOUBLE
;
pInfo
->
bytes
=
sizeof
(
SRateInfo
);
pInfo
->
intermediate
Bytes
=
sizeof
(
SRateInfo
);
return
TSDB_CODE_SUCCESS
;
}
else
if
(
functionId
==
FUNCTION_TOP
||
functionId
==
FUNCTION_BOTTOM
)
{
*
type
=
TSDB_DATA_TYPE_BINARY
;
*
bytes
=
(
int16_t
)(
sizeof
(
STopBotInfo
)
+
(
sizeof
(
tValuePair
)
+
POINTER_BYTES
+
extLength
)
*
param
);
*
interBytes
=
*
bytes
;
pInfo
->
type
=
TSDB_DATA_TYPE_BINARY
;
pInfo
->
bytes
=
(
int16_t
)(
sizeof
(
STopBotInfo
)
+
(
sizeof
(
tValuePair
)
+
POINTER_BYTES
+
extLength
)
*
param
);
pInfo
->
intermediateBytes
=
pInfo
->
bytes
;
return
TSDB_CODE_SUCCESS
;
}
else
if
(
functionId
==
FUNCTION_SPREAD
)
{
*
type
=
TSDB_DATA_TYPE_BINARY
;
*
bytes
=
sizeof
(
SSpreadInfo
);
*
interBytes
=
*
bytes
;
pInfo
->
type
=
TSDB_DATA_TYPE_BINARY
;
pInfo
->
bytes
=
sizeof
(
SSpreadInfo
);
pInfo
->
intermediateBytes
=
pInfo
->
bytes
;
return
TSDB_CODE_SUCCESS
;
}
else
if
(
functionId
==
FUNCTION_APERCT
)
{
*
type
=
TSDB_DATA_TYPE_BINARY
;
*
bytes
=
sizeof
(
SHistBin
)
*
(
MAX_HISTOGRAM_BIN
+
1
)
+
sizeof
(
SHistogramInfo
)
+
sizeof
(
SAPercentileInfo
);
*
interBytes
=
*
bytes
;
pInfo
->
type
=
TSDB_DATA_TYPE_BINARY
;
pInfo
->
bytes
=
sizeof
(
SHistBin
)
*
(
MAX_HISTOGRAM_BIN
+
1
)
+
sizeof
(
SHistogramInfo
)
+
sizeof
(
SAPercentileInfo
);
pInfo
->
intermediateBytes
=
pInfo
->
bytes
;
return
TSDB_CODE_SUCCESS
;
}
else
if
(
functionId
==
FUNCTION_LAST_ROW
)
{
*
type
=
TSDB_DATA_TYPE_BINARY
;
*
bytes
=
(
int16_t
)(
sizeof
(
SLastrowInfo
)
+
dataBytes
);
*
interBytes
=
*
bytes
;
pInfo
->
type
=
TSDB_DATA_TYPE_BINARY
;
pInfo
->
bytes
=
(
int16_t
)(
sizeof
(
SLastrowInfo
)
+
dataBytes
);
pInfo
->
intermediateBytes
=
pInfo
->
bytes
;
return
TSDB_CODE_SUCCESS
;
}
else
if
(
functionId
==
FUNCTION_TWA
)
{
*
type
=
TSDB_DATA_TYPE_DOUBLE
;
*
bytes
=
sizeof
(
STwaInfo
);
*
interBytes
=
*
bytes
;
pInfo
->
type
=
TSDB_DATA_TYPE_DOUBLE
;
pInfo
->
bytes
=
sizeof
(
STwaInfo
);
pInfo
->
intermediateBytes
=
pInfo
->
bytes
;
return
TSDB_CODE_SUCCESS
;
}
}
if
(
functionId
==
FUNCTION_SUM
)
{
if
(
IS_SIGNED_NUMERIC_TYPE
(
dataType
))
{
*
type
=
TSDB_DATA_TYPE_BIGINT
;
pInfo
->
type
=
TSDB_DATA_TYPE_BIGINT
;
}
else
if
(
IS_UNSIGNED_NUMERIC_TYPE
(
dataType
))
{
*
type
=
TSDB_DATA_TYPE_UBIGINT
;
pInfo
->
type
=
TSDB_DATA_TYPE_UBIGINT
;
}
else
{
*
type
=
TSDB_DATA_TYPE_DOUBLE
;
pInfo
->
type
=
TSDB_DATA_TYPE_DOUBLE
;
}
*
bytes
=
sizeof
(
int64_t
);
*
inter
Bytes
=
sizeof
(
SSumInfo
);
pInfo
->
bytes
=
sizeof
(
int64_t
);
pInfo
->
intermediate
Bytes
=
sizeof
(
SSumInfo
);
return
TSDB_CODE_SUCCESS
;
}
else
if
(
functionId
==
FUNCTION_APERCT
)
{
*
type
=
TSDB_DATA_TYPE_DOUBLE
;
*
bytes
=
sizeof
(
double
);
*
inter
Bytes
=
pInfo
->
type
=
TSDB_DATA_TYPE_DOUBLE
;
pInfo
->
bytes
=
sizeof
(
double
);
pInfo
->
intermediate
Bytes
=
sizeof
(
SAPercentileInfo
)
+
sizeof
(
SHistogramInfo
)
+
sizeof
(
SHistBin
)
*
(
MAX_HISTOGRAM_BIN
+
1
);
return
TSDB_CODE_SUCCESS
;
}
else
if
(
functionId
==
FUNCTION_TWA
)
{
*
type
=
TSDB_DATA_TYPE_DOUBLE
;
*
bytes
=
sizeof
(
double
);
*
inter
Bytes
=
sizeof
(
STwaInfo
);
pInfo
->
type
=
TSDB_DATA_TYPE_DOUBLE
;
pInfo
->
bytes
=
sizeof
(
double
);
pInfo
->
intermediate
Bytes
=
sizeof
(
STwaInfo
);
return
TSDB_CODE_SUCCESS
;
}
// if (functionId < 0) {
//
*
type = pUdfInfo->resType;
//
*
bytes = pUdfInfo->resBytes;
//
pInfo->
type = pUdfInfo->resType;
//
pInfo->
bytes = pUdfInfo->resBytes;
//
// if (pUdfInfo->bufSize > 0) {
//
*inter
Bytes = pUdfInfo->bufSize;
//
pInfo->intermediate
Bytes = pUdfInfo->bufSize;
// } else {
//
*interBytes = *
bytes;
//
pInfo->intermediateBytes = pInfo->
bytes;
// }
//
// return TSDB_CODE_SUCCESS;
// }
if
(
functionId
==
FUNCTION_AVG
)
{
*
type
=
TSDB_DATA_TYPE_DOUBLE
;
*
bytes
=
sizeof
(
double
);
*
inter
Bytes
=
sizeof
(
SAvgInfo
);
pInfo
->
type
=
TSDB_DATA_TYPE_DOUBLE
;
pInfo
->
bytes
=
sizeof
(
double
);
pInfo
->
intermediate
Bytes
=
sizeof
(
SAvgInfo
);
}
else
if
(
functionId
>=
FUNCTION_RATE
&&
functionId
<=
FUNCTION_IRATE
)
{
*
type
=
TSDB_DATA_TYPE_DOUBLE
;
*
bytes
=
sizeof
(
double
);
*
inter
Bytes
=
sizeof
(
SRateInfo
);
pInfo
->
type
=
TSDB_DATA_TYPE_DOUBLE
;
pInfo
->
bytes
=
sizeof
(
double
);
pInfo
->
intermediate
Bytes
=
sizeof
(
SRateInfo
);
}
else
if
(
functionId
==
FUNCTION_STDDEV
)
{
*
type
=
TSDB_DATA_TYPE_DOUBLE
;
*
bytes
=
sizeof
(
double
);
*
inter
Bytes
=
sizeof
(
SStddevInfo
);
pInfo
->
type
=
TSDB_DATA_TYPE_DOUBLE
;
pInfo
->
bytes
=
sizeof
(
double
);
pInfo
->
intermediate
Bytes
=
sizeof
(
SStddevInfo
);
}
else
if
(
functionId
==
FUNCTION_MIN
||
functionId
==
FUNCTION_MAX
)
{
*
type
=
(
int16_t
)
dataType
;
*
bytes
=
(
int16_t
)
dataBytes
;
*
inter
Bytes
=
dataBytes
+
DATA_SET_FLAG_SIZE
;
pInfo
->
type
=
(
int16_t
)
dataType
;
pInfo
->
bytes
=
(
int16_t
)
dataBytes
;
pInfo
->
intermediate
Bytes
=
dataBytes
+
DATA_SET_FLAG_SIZE
;
}
else
if
(
functionId
==
FUNCTION_FIRST
||
functionId
==
FUNCTION_LAST
)
{
*
type
=
(
int16_t
)
dataType
;
*
bytes
=
(
int16_t
)
dataBytes
;
*
inter
Bytes
=
(
int16_t
)(
dataBytes
+
sizeof
(
SFirstLastInfo
));
pInfo
->
type
=
(
int16_t
)
dataType
;
pInfo
->
bytes
=
(
int16_t
)
dataBytes
;
pInfo
->
intermediate
Bytes
=
(
int16_t
)(
dataBytes
+
sizeof
(
SFirstLastInfo
));
}
else
if
(
functionId
==
FUNCTION_SPREAD
)
{
*
type
=
(
int16_t
)
TSDB_DATA_TYPE_DOUBLE
;
*
bytes
=
sizeof
(
double
);
*
inter
Bytes
=
sizeof
(
SSpreadInfo
);
pInfo
->
type
=
(
int16_t
)
TSDB_DATA_TYPE_DOUBLE
;
pInfo
->
bytes
=
sizeof
(
double
);
pInfo
->
intermediate
Bytes
=
sizeof
(
SSpreadInfo
);
}
else
if
(
functionId
==
FUNCTION_PERCT
)
{
*
type
=
(
int16_t
)
TSDB_DATA_TYPE_DOUBLE
;
*
bytes
=
(
int16_t
)
sizeof
(
double
);
*
inter
Bytes
=
(
int16_t
)
sizeof
(
SPercentileInfo
);
pInfo
->
type
=
(
int16_t
)
TSDB_DATA_TYPE_DOUBLE
;
pInfo
->
bytes
=
(
int16_t
)
sizeof
(
double
);
pInfo
->
intermediate
Bytes
=
(
int16_t
)
sizeof
(
SPercentileInfo
);
}
else
if
(
functionId
==
FUNCTION_LEASTSQR
)
{
*
type
=
TSDB_DATA_TYPE_BINARY
;
*
bytes
=
MAX
(
AVG_FUNCTION_INTER_BUFFER_SIZE
,
sizeof
(
SLeastsquaresInfo
));
// string
*
interBytes
=
*
bytes
;
pInfo
->
type
=
TSDB_DATA_TYPE_BINARY
;
pInfo
->
bytes
=
MAX
(
AVG_FUNCTION_INTER_BUFFER_SIZE
,
sizeof
(
SLeastsquaresInfo
));
// string
pInfo
->
intermediateBytes
=
pInfo
->
bytes
;
}
else
if
(
functionId
==
FUNCTION_FIRST_DST
||
functionId
==
FUNCTION_LAST_DST
)
{
*
type
=
TSDB_DATA_TYPE_BINARY
;
*
bytes
=
(
int16_t
)(
dataBytes
+
sizeof
(
SFirstLastInfo
));
*
interBytes
=
*
bytes
;
pInfo
->
type
=
TSDB_DATA_TYPE_BINARY
;
pInfo
->
bytes
=
(
int16_t
)(
dataBytes
+
sizeof
(
SFirstLastInfo
));
pInfo
->
intermediateBytes
=
pInfo
->
bytes
;
}
else
if
(
functionId
==
FUNCTION_TOP
||
functionId
==
FUNCTION_BOTTOM
)
{
*
type
=
(
int16_t
)
dataType
;
*
bytes
=
(
int16_t
)
dataBytes
;
pInfo
->
type
=
(
int16_t
)
dataType
;
pInfo
->
bytes
=
(
int16_t
)
dataBytes
;
size_t
size
=
sizeof
(
STopBotInfo
)
+
(
sizeof
(
tValuePair
)
+
POINTER_BYTES
+
extLength
)
*
param
;
// the output column may be larger than sizeof(STopBotInfo)
*
inter
Bytes
=
(
int32_t
)
size
;
pInfo
->
intermediate
Bytes
=
(
int32_t
)
size
;
}
else
if
(
functionId
==
FUNCTION_LAST_ROW
)
{
*
type
=
(
int16_t
)
dataType
;
*
bytes
=
(
int16_t
)
dataBytes
;
*
inter
Bytes
=
dataBytes
;
pInfo
->
type
=
(
int16_t
)
dataType
;
pInfo
->
bytes
=
(
int16_t
)
dataBytes
;
pInfo
->
intermediate
Bytes
=
dataBytes
;
}
else
if
(
functionId
==
FUNCTION_STDDEV_DST
)
{
*
type
=
TSDB_DATA_TYPE_BINARY
;
*
bytes
=
sizeof
(
SStddevdstInfo
);
*
interBytes
=
(
*
bytes
);
pInfo
->
type
=
TSDB_DATA_TYPE_BINARY
;
pInfo
->
bytes
=
sizeof
(
SStddevdstInfo
);
pInfo
->
intermediateBytes
=
(
pInfo
->
bytes
);
}
else
{
return
TSDB_CODE_TSC_INVALID_OPERATION
;
...
...
source/libs/function/src/texpr.c
浏览文件 @
562dfa9e
...
...
@@ -698,7 +698,6 @@ err_ret:
tfree
(
tmp
);
}
tExprNode
*
exprdup
(
tExprNode
*
pNode
)
{
if
(
pNode
==
NULL
)
{
return
NULL
;
...
...
source/libs/function/src/tfunction.c
浏览文件 @
562dfa9e
...
...
@@ -414,7 +414,7 @@ bool timeWindowInterpoRequired(SArray* pFunctionIdList) {
return
false
;
}
//SQuery
Type
setQueryType(SArray* pFunctionIdList) {
//SQuery
AttrInfo
setQueryType(SArray* pFunctionIdList) {
// assert(pFunctionIdList != NULL);
//
//
...
...
source/libs/parser/inc/parserInt.h
浏览文件 @
562dfa9e
...
...
@@ -26,12 +26,6 @@ extern "C" {
struct
SSqlNode
;
typedef
struct
SColumnIndex
{
int16_t
tableIndex
;
int16_t
columnIndex
;
int16_t
type
;
// normal column/tag/ user input constant column
}
SColumnIndex
;
typedef
struct
SInsertStmtInfo
{
SHashObj
*
pTableBlockHashList
;
// data block for each table
SArray
*
pDataBlocks
;
// SArray<STableDataBlocks*>. Merged submit block for each vgroup
...
...
@@ -41,28 +35,6 @@ typedef struct SInsertStmtInfo {
char
*
sql
;
// current sql statement position
}
SInsertStmtInfo
;
// the structure for sql function in select clause
typedef
struct
SSqlExpr
{
char
token
[
TSDB_COL_NAME_LEN
];
// original token
SSchema
resSchema
;
SColIndex
colInfo
;
uint64_t
uid
;
// table uid, todo refactor use the pointer
int32_t
interBytes
;
// inter result buffer size
int16_t
numOfParams
;
// argument value of each function
SVariant
param
[
3
];
// parameters are not more than 3
}
SSqlExpr
;
typedef
struct
SExprInfo
{
SSqlExpr
base
;
struct
tExprNode
*
pExpr
;
}
SExprInfo
;
typedef
struct
SColumn
{
uint64_t
tableUid
;
int32_t
columnIndex
;
SColumnInfo
info
;
}
SColumn
;
typedef
struct
SInternalField
{
TAOS_FIELD
field
;
bool
visible
;
...
...
@@ -100,8 +72,11 @@ int32_t qParserValidateSqlNode(struct SCatalog* pCatalog, SSqlInfo* pSqlInfo, SQ
int32_t
evaluateSqlNode
(
SSqlNode
*
pNode
,
int32_t
tsPrecision
,
SMsgBuf
*
pMsgBuf
);
int32_t
validateSqlNode
(
SSqlNode
*
pSqlNode
,
SQueryStmtInfo
*
pQueryInfo
,
SMsgBuf
*
pMsgBuf
);
void
initQueryInfo
(
SQueryStmtInfo
*
pQueryInfo
);
int32_t
checkForInvalidExpr
(
SQueryStmtInfo
*
pQueryInfo
,
SMsgBuf
*
pMsgBuf
);
/**
* Extract request meta info from the sql statement
* @param pSqlInfo
...
...
source/libs/parser/inc/parserUtil.h
浏览文件 @
562dfa9e
...
...
@@ -50,8 +50,8 @@ int32_t buildSyntaxErrMsg(char* dst, int32_t dstBufLen, const char* additionalIn
int32_t
createProjectionExpr
(
SQueryStmtInfo
*
pQueryInfo
,
STableMetaInfo
*
pTableMetaInfo
,
SExprInfo
***
pExpr
,
int32_t
*
num
);
STableMetaInfo
*
addEmptyMetaInfo
(
SQueryStmtInfo
*
pQueryInfo
);
void
columnListCopy
(
SArray
*
dst
,
const
SArray
*
src
,
uint64_t
tableUid
);
void
columnListCopyAll
(
SArray
*
dst
,
const
SArray
*
src
);
void
columnListDestroy
(
SArray
*
pColumnList
);
SColumn
*
columnListInsert
(
SArray
*
pColumnList
,
int32_t
columnIndex
,
uint64_t
uid
,
SSchema
*
pSchema
);
...
...
source/libs/parser/inc/queryInfoUtil.h
浏览文件 @
562dfa9e
...
...
@@ -30,13 +30,12 @@ SSchema *getTableTagSchema(const STableMeta* pTableMeta);
SSchema
*
getOneColumnSchema
(
const
STableMeta
*
pTableMeta
,
int32_t
colIndex
);
size_t
getNumOfExprs
(
SQueryStmtInfo
*
pQueryInfo
);
SExprInfo
*
createExprInfo
(
STableMetaInfo
*
pTableMetaInfo
,
int16_t
functionId
,
SColumnIndex
*
pColIndex
,
struct
tExprNode
*
pParamExpr
,
SSchema
*
pResSchema
,
int16_t
interSize
);
//SExprInfo* createExprInfo(STableMetaInfo* pTableMetaInfo, int16_t functionId, SColumnIndex* pColIndex, struct tExprNode* pParamExpr, SSchema* pResSchema, int16_t interSize);
SExprInfo
*
createBinaryExprInfo
(
struct
tExprNode
*
pNode
,
SSchema
*
pResSchema
);
void
destroyExprInfoList
();
void
addExprInfo
(
SQueryStmtInfo
*
pQueryInfo
,
int32_t
index
,
SExprInfo
*
pExprInfo
);
void
updateExprInfo
(
SExprInfo
*
pExprInfo
,
int16_t
functionId
,
int32_t
colId
,
int16_t
srcColumnIndex
,
int16_t
resType
,
int16_t
resSize
);
void
assignExprInfo
(
SExprInfo
*
dst
,
const
SExprInfo
*
src
);
SExprInfo
*
getExprInfo
(
SQueryStmtInfo
*
pQueryInfo
,
int32_t
index
);
int32_t
copyAllExprInfo
(
SArray
*
dst
,
const
SArray
*
src
,
bool
deepcopy
);
...
...
source/libs/parser/src/astValidate.c
浏览文件 @
562dfa9e
此差异已折叠。
点击以展开。
source/libs/parser/src/parser.c
浏览文件 @
562dfa9e
...
...
@@ -43,12 +43,7 @@ int32_t qParseQuerySql(const char* pStr, size_t length, struct SQueryStmtInfo**
}
struct
SCatalog
*
pCatalog
=
getCatalogHandle
(
NULL
);
int32_t
code
=
qParserValidateSqlNode
(
pCatalog
,
&
info
,
*
pQueryInfo
,
id
,
msg
,
msgLen
);
if
(
code
!=
0
)
{
return
code
;
}
return
0
;
return
qParserValidateSqlNode
(
pCatalog
,
&
info
,
*
pQueryInfo
,
id
,
msg
,
msgLen
);
}
int32_t
qParseInsertSql
(
const
char
*
pStr
,
size_t
length
,
struct
SInsertStmtInfo
**
pInsertInfo
,
int64_t
id
,
char
*
msg
,
int32_t
msgLen
)
{
...
...
source/libs/parser/src/parserUtil.c
浏览文件 @
562dfa9e
...
...
@@ -834,28 +834,28 @@ void columnCopy(SColumn* pDest, const SColumn* pSrc) {
pDest
->
info
.
bytes
=
pSrc
->
info
.
bytes
;
}
void
columnListCopy
(
SArray
*
dst
,
const
SArray
*
src
,
uint64_t
tableUid
)
{
void
columnListCopy
All
(
SArray
*
dst
,
const
SArray
*
src
)
{
assert
(
src
!=
NULL
&&
dst
!=
NULL
);
size_t
num
=
taosArrayGetSize
(
src
);
for
(
int32_t
i
=
0
;
i
<
num
;
++
i
)
{
SColumn
*
pCol
=
taosArrayGetP
(
src
,
i
);
if
(
pCol
->
tableUid
==
tableUid
)
{
SColumn
*
p
=
columnClone
(
pCol
);
taosArrayPush
(
dst
,
&
p
);
}
SColumn
*
p
=
columnClone
(
pCol
);
taosArrayPush
(
dst
,
&
p
);
}
}
void
columnListCopy
All
(
SArray
*
dst
,
const
SArray
*
src
)
{
void
columnListCopy
(
SArray
*
dst
,
const
SArray
*
src
,
uint64_t
uid
)
{
assert
(
src
!=
NULL
&&
dst
!=
NULL
);
size_t
num
=
taosArrayGetSize
(
src
);
for
(
int32_t
i
=
0
;
i
<
num
;
++
i
)
{
SColumn
*
pCol
=
taosArrayGetP
(
src
,
i
);
SColumn
*
p
=
columnClone
(
pCol
);
taosArrayPush
(
dst
,
&
p
);
if
(
pCol
->
tableUid
==
uid
)
{
SColumn
*
p
=
columnClone
(
pCol
);
taosArrayPush
(
dst
,
&
p
);
}
}
}
...
...
@@ -1705,7 +1705,7 @@ int32_t tscCreateQueryFromQueryInfo(SQueryStmtInfo* pQueryInfo, SQueryAttr* pQue
pQueryAttr->pExpr1 = calloc(pQueryAttr->numOfOutput, sizeof(SExprInfo));
for(int32_t i = 0; i < pQueryAttr->numOfOutput; ++i) {
SExprInfo* pExpr = getExprInfo(pQueryInfo, i);
tscExprAssign
(&pQueryAttr->pExpr1[i], pExpr);
ExprInfoCopy
(&pQueryAttr->pExpr1[i], pExpr);
if (pQueryAttr->pExpr1[i].base.functionId == FUNCTION_ARITHM) {
for (int32_t j = 0; j < pQueryAttr->pExpr1[i].base.numOfParams; ++j) {
...
...
@@ -1736,7 +1736,7 @@ int32_t tscCreateQueryFromQueryInfo(SQueryStmtInfo* pQueryInfo, SQueryAttr* pQue
pQueryAttr->pExpr2 = calloc(pQueryAttr->numOfExpr2, sizeof(SExprInfo));
for(int32_t i = 0; i < pQueryAttr->numOfExpr2; ++i) {
SExprInfo* p = taosArrayGetP(pQueryInfo->exprList1, i);
tscExprAssign
(&pQueryAttr->pExpr2[i], p);
ExprInfoCopy
(&pQueryAttr->pExpr2[i], p);
}
}
...
...
source/libs/parser/src/queryInfoUtil.c
浏览文件 @
562dfa9e
#include "queryInfoUtil.h"
#include <function.h>
#include "astGenerator.h"
#include "function.h"
#include "os.h"
...
...
@@ -166,12 +165,17 @@ SExprInfo* getExprInfo(SQueryStmtInfo* pQueryInfo, int32_t index) {
return
taosArrayGetP
(
pQueryInfo
->
exprList
,
index
);
}
void
destroyExprInfo
(
SArray
*
pExprInfo
)
{
void
destroyExprInfo
(
SExprInfo
*
pExprInfo
)
{
tExprTreeDestroy
(
pExprInfo
->
pExpr
,
NULL
);
tfree
(
pExprInfo
);
}
void
dropAllExprInfo
(
SArray
*
pExprInfo
)
{
size_t
size
=
taosArrayGetSize
(
pExprInfo
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
SExprInfo
*
pExpr
=
taosArrayGetP
(
pExprInfo
,
i
);
// tSqlExprDestroy(&pExpr->base
);
destroyExprInfo
(
pExpr
);
}
taosArrayDestroy
(
pExprInfo
);
...
...
@@ -199,7 +203,6 @@ void assignExprInfo(SExprInfo* dst, const SExprInfo* src) {
}
#endif
assert
(
0
);
// dst->pExpr = exprdup(src->pExpr);
memset
(
dst
->
base
.
param
,
0
,
sizeof
(
SVariant
)
*
tListLen
(
dst
->
base
.
param
));
for
(
int32_t
j
=
0
;
j
<
src
->
base
.
numOfParams
;
++
j
)
{
...
...
@@ -207,7 +210,7 @@ void assignExprInfo(SExprInfo* dst, const SExprInfo* src) {
}
}
int32_t
copy
OneExprInfo
(
SArray
*
dst
,
const
SArray
*
src
,
uint64_t
uid
,
bool
deepcopy
)
{
int32_t
copy
ExprInfoList
(
SArray
*
dst
,
const
SArray
*
src
,
uint64_t
uid
,
bool
deepcopy
)
{
assert
(
src
!=
NULL
&&
dst
!=
NULL
);
size_t
size
=
taosArrayGetSize
(
src
);
...
...
@@ -236,13 +239,9 @@ int32_t copyAllExprInfo(SArray* dst, const SArray* src, bool deepcopy) {
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
SExprInfo
*
pExpr
=
taosArrayGetP
(
src
,
i
);
if
(
deepcopy
)
{
SExprInfo
*
p1
=
calloc
(
1
,
sizeof
(
SExprInfo
));
assignExprInfo
(
p1
,
pExpr
);
taosArrayPush
(
dst
,
&
p1
);
}
else
{
taosArrayPush
(
dst
,
&
pExpr
);
}
SExprInfo
*
p1
=
calloc
(
1
,
sizeof
(
SExprInfo
));
assignExprInfo
(
p1
,
pExpr
);
taosArrayPush
(
dst
,
&
p1
);
}
return
0
;
...
...
@@ -290,11 +289,11 @@ static void freeQueryInfoImpl(SQueryStmtInfo* pQueryInfo) {
cleanupColumnCond
(
&
pQueryInfo
->
colCond
);
cleanupFieldInfo
(
&
pQueryInfo
->
fieldsInfo
);
d
estroy
ExprInfo
(
pQueryInfo
->
exprList
);
d
ropAll
ExprInfo
(
pQueryInfo
->
exprList
);
pQueryInfo
->
exprList
=
NULL
;
if
(
pQueryInfo
->
exprList1
!=
NULL
)
{
d
estroy
ExprInfo
(
pQueryInfo
->
exprList1
);
d
ropAll
ExprInfo
(
pQueryInfo
->
exprList1
);
pQueryInfo
->
exprList1
=
NULL
;
}
...
...
source/libs/parser/test/parserTests.cpp
浏览文件 @
562dfa9e
此差异已折叠。
点击以展开。
source/libs/planner/CMakeLists.txt
浏览文件 @
562dfa9e
...
...
@@ -8,5 +8,5 @@ target_include_directories(
target_link_libraries
(
planner
PRIVATE os util common catalog parser transport
PRIVATE os util common catalog parser transport
function
)
\ No newline at end of file
source/libs/planner/inc/plannerInt.h
浏览文件 @
562dfa9e
...
...
@@ -33,22 +33,21 @@ typedef struct SQueryNodeBasicInfo {
typedef
struct
SQueryTableInfo
{
char
*
tableName
;
uint64_t
uid
;
int32_t
tid
;
}
SQueryTableInfo
;
typedef
struct
SQueryNode
{
typedef
struct
SQuery
Plan
Node
{
SQueryNodeBasicInfo
info
;
SQueryTableInfo
tableInfo
;
SSchema
*
pSchema
;
// the schema of the input SSDatablock
int32_t
numOfCols
;
// number of input columns
struct
SExprInfo
*
pExpr
;
// the query functions or sql aggregations
SArray
*
pExpr
;
// the query functions or sql aggregations
int32_t
numOfOutput
;
// number of result columns, which is also the number of pExprs
void
*
pExtInfo
;
// additional information
// previous operator to generated result for current node to process
// in case of join, multiple prev nodes exist.
SArray
*
pPrevNodes
;
// upstream nodes
struct
SQueryNode
*
nextNode
;
}
SQueryNode
;
struct
SQuery
Plan
Node
*
nextNode
;
}
SQuery
Plan
Node
;
typedef
struct
SQueryDistPlanNode
{
...
...
source/libs/planner/src/planner.c
浏览文件 @
562dfa9e
...
...
@@ -16,24 +16,58 @@
#include "os.h"
#include "plannerInt.h"
#include "parser.h"
#include "function.h"
int32_t
qOptimizeQueryPlan
(
struct
SQueryNode
*
pQueryNode
)
{
#define QNODE_TAGSCAN 1
#define QNODE_TABLESCAN 2
#define QNODE_PROJECT 3
#define QNODE_AGGREGATE 4
#define QNODE_GROUPBY 5
#define QNODE_LIMIT 6
#define QNODE_JOIN 7
#define QNODE_DISTINCT 8
#define QNODE_SORT 9
#define QNODE_UNIONALL 10
#define QNODE_TIMEWINDOW 11
#define QNODE_SESSIONWINDOW 12
#define QNODE_FILL 13
typedef
struct
SFillEssInfo
{
int32_t
fillType
;
// fill type
int64_t
*
val
;
// fill value
}
SFillEssInfo
;
typedef
struct
SJoinCond
{
bool
tagExists
;
// denote if tag condition exists or not
SColumn
*
tagCond
[
2
];
SColumn
*
colCond
[
2
];
}
SJoinCond
;
static
SArray
*
createQueryPlanImpl
(
SQueryStmtInfo
*
pQueryInfo
);
static
void
doDestroyQueryNode
(
SQueryPlanNode
*
pQueryNode
);
int32_t
qOptimizeQueryPlan
(
struct
SQueryPlanNode
*
pQueryNode
)
{
return
0
;
}
int32_t
qCreateQueryPlan
(
const
struct
SQueryStmtInfo
*
pQueryInfo
,
struct
SQueryNode
*
pQueryNode
)
{
return
0
;
int32_t
qCreateQueryPlan
(
const
struct
SQueryStmtInfo
*
pQueryInfo
,
struct
SQueryPlanNode
*
pQueryNode
)
{
SArray
*
upstream
=
createQueryPlanImpl
((
struct
SQueryStmtInfo
*
)
pQueryInfo
);
assert
(
taosArrayGetSize
(
upstream
)
==
1
);
/*SQueryPlanNode* p = */
taosArrayGetP
(
upstream
,
0
);
taosArrayDestroy
(
upstream
);
return
TSDB_CODE_SUCCESS
;
}
int32_t
qQueryPlanToString
(
struct
SQueryNode
*
pQueryNode
,
char
**
str
)
{
int32_t
qQueryPlanToString
(
struct
SQuery
Plan
Node
*
pQueryNode
,
char
**
str
)
{
return
0
;
}
int32_t
qQueryPlanToSql
(
struct
SQueryNode
*
pQueryNode
,
char
**
sql
)
{
int32_t
qQueryPlanToSql
(
struct
SQuery
Plan
Node
*
pQueryNode
,
char
**
sql
)
{
return
0
;
}
int32_t
qCreatePhysicalPlan
(
struct
SQueryNode
*
pQueryNode
,
struct
SEpSet
*
pQnode
,
struct
SQueryDistPlanNode
*
pPhyNode
)
{
int32_t
qCreatePhysicalPlan
(
struct
SQuery
Plan
Node
*
pQueryNode
,
struct
SEpSet
*
pQnode
,
struct
SQueryDistPlanNode
*
pPhyNode
)
{
return
0
;
}
...
...
@@ -41,7 +75,12 @@ int32_t qPhyPlanToString(struct SQueryDistPlanNode *pPhyNode, char** str) {
return
0
;
}
void
*
qDestroyQueryPlan
(
struct
SQueryNode
*
pQueryNode
)
{
void
*
qDestroyQueryPlan
(
SQueryPlanNode
*
pQueryNode
)
{
if
(
pQueryNode
==
NULL
)
{
return
NULL
;
}
doDestroyQueryNode
(
pQueryNode
);
return
NULL
;
}
...
...
@@ -51,4 +90,493 @@ void* qDestroyQueryPhyPlan(struct SQueryDistPlanNode* pQueryPhyNode) {
int32_t
qCreateQueryJob
(
const
struct
SQueryDistPlanNode
*
pPhyNode
,
struct
SQueryJob
**
pJob
)
{
return
0
;
}
\ No newline at end of file
}
//======================================================================================================================
static
SQueryPlanNode
*
createQueryNode
(
int32_t
type
,
const
char
*
name
,
SQueryPlanNode
**
prev
,
int32_t
numOfPrev
,
SExprInfo
**
pExpr
,
int32_t
numOfOutput
,
SQueryTableInfo
*
pTableInfo
,
void
*
pExtInfo
)
{
SQueryPlanNode
*
pNode
=
calloc
(
1
,
sizeof
(
SQueryPlanNode
));
pNode
->
info
.
type
=
type
;
pNode
->
info
.
name
=
strdup
(
name
);
if
(
pTableInfo
->
uid
!=
0
&&
pTableInfo
->
tableName
)
{
// it is a true table
pNode
->
tableInfo
.
uid
=
pTableInfo
->
uid
;
pNode
->
tableInfo
.
tableName
=
strdup
(
pTableInfo
->
tableName
);
}
pNode
->
numOfOutput
=
numOfOutput
;
pNode
->
pExpr
=
calloc
(
numOfOutput
,
sizeof
(
SExprInfo
));
for
(
int32_t
i
=
0
;
i
<
numOfOutput
;
++
i
)
{
assignExprInfo
(
&
pNode
->
pExpr
[
i
],
pExpr
[
i
]);
}
pNode
->
pPrevNodes
=
taosArrayInit
(
4
,
POINTER_BYTES
);
for
(
int32_t
i
=
0
;
i
<
numOfPrev
;
++
i
)
{
taosArrayPush
(
pNode
->
pPrevNodes
,
&
prev
[
i
]);
}
switch
(
type
)
{
case
QNODE_TABLESCAN
:
{
STimeWindow
*
window
=
calloc
(
1
,
sizeof
(
STimeWindow
));
memcpy
(
window
,
pExtInfo
,
sizeof
(
STimeWindow
));
pNode
->
pExtInfo
=
window
;
break
;
}
case
QNODE_TIMEWINDOW
:
{
SInterval
*
pInterval
=
calloc
(
1
,
sizeof
(
SInterval
));
pNode
->
pExtInfo
=
pInterval
;
memcpy
(
pInterval
,
pExtInfo
,
sizeof
(
SInterval
));
break
;
}
case
QNODE_GROUPBY
:
{
SGroupbyExpr
*
p
=
(
SGroupbyExpr
*
)
pExtInfo
;
SGroupbyExpr
*
pGroupbyExpr
=
calloc
(
1
,
sizeof
(
SGroupbyExpr
));
pGroupbyExpr
->
tableIndex
=
p
->
tableIndex
;
pGroupbyExpr
->
orderType
=
p
->
orderType
;
pGroupbyExpr
->
orderIndex
=
p
->
orderIndex
;
pGroupbyExpr
->
columnInfo
=
taosArrayDup
(
p
->
columnInfo
);
pNode
->
pExtInfo
=
pGroupbyExpr
;
break
;
}
case
QNODE_FILL
:
{
// todo !!
pNode
->
pExtInfo
=
pExtInfo
;
break
;
}
case
QNODE_LIMIT
:
{
pNode
->
pExtInfo
=
calloc
(
1
,
sizeof
(
SLimit
));
memcpy
(
pNode
->
pExtInfo
,
pExtInfo
,
sizeof
(
SLimit
));
break
;
}
}
return
pNode
;
}
static
SQueryPlanNode
*
doAddTableColumnNode
(
SQueryStmtInfo
*
pQueryInfo
,
STableMetaInfo
*
pTableMetaInfo
,
SQueryTableInfo
*
info
,
SArray
*
pExprs
,
SArray
*
tableCols
)
{
if
(
pQueryInfo
->
info
.
onlyTagQuery
)
{
int32_t
num
=
(
int32_t
)
taosArrayGetSize
(
pExprs
);
SQueryPlanNode
*
pNode
=
createQueryNode
(
QNODE_TAGSCAN
,
"TableTagScan"
,
NULL
,
0
,
pExprs
->
pData
,
num
,
info
,
NULL
);
if
(
pQueryInfo
->
distinct
)
{
pNode
=
createQueryNode
(
QNODE_DISTINCT
,
"Distinct"
,
&
pNode
,
1
,
pExprs
->
pData
,
num
,
info
,
NULL
);
}
return
pNode
;
}
STimeWindow
*
window
=
&
pQueryInfo
->
window
;
SQueryPlanNode
*
pNode
=
createQueryNode
(
QNODE_TABLESCAN
,
"TableScan"
,
NULL
,
0
,
NULL
,
0
,
info
,
window
);
if
(
pQueryInfo
->
info
.
projectionQuery
)
{
int32_t
numOfOutput
=
(
int32_t
)
taosArrayGetSize
(
pExprs
);
pNode
=
createQueryNode
(
QNODE_PROJECT
,
"Projection"
,
&
pNode
,
1
,
pExprs
->
pData
,
numOfOutput
,
info
,
NULL
);
}
else
{
// table source column projection, generate the projection expr
int32_t
numOfCols
=
(
int32_t
)
taosArrayGetSize
(
tableCols
);
SExprInfo
**
pExpr
=
calloc
(
numOfCols
,
POINTER_BYTES
);
SSchema
*
pSchema
=
pTableMetaInfo
->
pTableMeta
->
schema
;
STableMetaInfo
*
pTableMetaInfo1
=
getMetaInfo
(
pQueryInfo
,
0
);
SSchema
resultSchema
=
*
pSchema
;
resultSchema
.
colId
=
getNewResColId
();
for
(
int32_t
i
=
0
;
i
<
numOfCols
;
++
i
)
{
SColumn
*
pCol
=
taosArrayGetP
(
tableCols
,
i
);
SColumnIndex
index
=
{.
tableIndex
=
0
,
.
columnIndex
=
pCol
->
columnIndex
};
SExprInfo
*
p
=
createExprInfo
(
pTableMetaInfo1
,
FUNCTION_PRJ
,
&
index
,
NULL
,
&
resultSchema
,
0
);
pExpr
[
i
]
=
p
;
}
pNode
=
createQueryNode
(
QNODE_PROJECT
,
"Projection"
,
&
pNode
,
1
,
pExpr
,
numOfCols
,
info
,
NULL
);
// dropAllExprInfo(pExpr);
tfree
(
pExpr
);
}
return
pNode
;
}
static
SQueryPlanNode
*
doCreateQueryPlanForOneTableImpl
(
SQueryStmtInfo
*
pQueryInfo
,
SQueryPlanNode
*
pNode
,
SQueryTableInfo
*
info
,
SArray
*
pExprs
)
{
// check for aggregation
size_t
numOfGroupCols
=
taosArrayGetSize
(
pQueryInfo
->
groupbyExpr
.
columnInfo
);
if
(
pQueryInfo
->
interval
.
interval
>
0
)
{
int32_t
numOfOutput
=
(
int32_t
)
taosArrayGetSize
(
pExprs
);
pNode
=
createQueryNode
(
QNODE_TIMEWINDOW
,
"TimeWindowAgg"
,
&
pNode
,
1
,
pExprs
->
pData
,
numOfOutput
,
info
,
&
pQueryInfo
->
interval
);
if
(
numOfGroupCols
!=
0
)
{
pNode
=
createQueryNode
(
QNODE_GROUPBY
,
"Groupby"
,
&
pNode
,
1
,
pExprs
->
pData
,
numOfOutput
,
info
,
&
pQueryInfo
->
groupbyExpr
);
}
}
else
if
(
numOfGroupCols
>
0
)
{
int32_t
numOfOutput
=
(
int32_t
)
taosArrayGetSize
(
pExprs
);
pNode
=
createQueryNode
(
QNODE_GROUPBY
,
"Groupby"
,
&
pNode
,
1
,
pExprs
->
pData
,
numOfOutput
,
info
,
&
pQueryInfo
->
groupbyExpr
);
}
else
if
(
pQueryInfo
->
sessionWindow
.
gap
>
0
)
{
pNode
=
createQueryNode
(
QNODE_SESSIONWINDOW
,
"SessionWindowAgg"
,
&
pNode
,
1
,
NULL
,
0
,
info
,
NULL
);
}
else
if
(
pQueryInfo
->
info
.
simpleAgg
)
{
int32_t
numOfOutput
=
(
int32_t
)
taosArrayGetSize
(
pExprs
);
pNode
=
createQueryNode
(
QNODE_AGGREGATE
,
"Aggregate"
,
&
pNode
,
1
,
pExprs
->
pData
,
numOfOutput
,
info
,
NULL
);
}
if
(
pQueryInfo
->
havingFieldNum
>
0
||
pQueryInfo
->
info
.
arithmeticOnAgg
)
{
int32_t
numOfExpr
=
(
int32_t
)
taosArrayGetSize
(
pQueryInfo
->
exprList1
);
pNode
=
createQueryNode
(
QNODE_PROJECT
,
"Projection"
,
&
pNode
,
1
,
pQueryInfo
->
exprList1
->
pData
,
numOfExpr
,
info
,
NULL
);
}
if
(
pQueryInfo
->
fillType
!=
TSDB_FILL_NONE
)
{
SFillEssInfo
*
pInfo
=
calloc
(
1
,
sizeof
(
SFillEssInfo
));
pInfo
->
fillType
=
pQueryInfo
->
fillType
;
pInfo
->
val
=
calloc
(
pNode
->
numOfOutput
,
sizeof
(
int64_t
));
memcpy
(
pInfo
->
val
,
pQueryInfo
->
fillVal
,
pNode
->
numOfOutput
);
pNode
=
createQueryNode
(
QNODE_FILL
,
"Fill"
,
&
pNode
,
1
,
NULL
,
0
,
info
,
pInfo
);
}
if
(
pQueryInfo
->
limit
.
limit
!=
-
1
||
pQueryInfo
->
limit
.
offset
!=
0
)
{
pNode
=
createQueryNode
(
QNODE_LIMIT
,
"Limit"
,
&
pNode
,
1
,
NULL
,
0
,
info
,
&
pQueryInfo
->
limit
);
}
return
pNode
;
}
static
SQueryPlanNode
*
doCreateQueryPlanForOneTable
(
SQueryStmtInfo
*
pQueryInfo
,
STableMetaInfo
*
pTableMetaInfo
,
SArray
*
pExprs
,
SArray
*
tableCols
)
{
char
name
[
TSDB_TABLE_FNAME_LEN
]
=
{
0
};
tNameExtractFullName
(
&
pTableMetaInfo
->
name
,
name
);
SQueryTableInfo
info
=
{.
tableName
=
strdup
(
name
),
.
uid
=
pTableMetaInfo
->
pTableMeta
->
uid
,};
// handle the only tag query
SQueryPlanNode
*
pNode
=
doAddTableColumnNode
(
pQueryInfo
,
pTableMetaInfo
,
&
info
,
pExprs
,
tableCols
);
if
(
pQueryInfo
->
info
.
onlyTagQuery
)
{
tfree
(
info
.
tableName
);
return
pNode
;
}
SQueryPlanNode
*
pNode1
=
doCreateQueryPlanForOneTableImpl
(
pQueryInfo
,
pNode
,
&
info
,
pExprs
);
tfree
(
info
.
tableName
);
return
pNode1
;
}
SArray
*
createQueryPlanImpl
(
SQueryStmtInfo
*
pQueryInfo
)
{
SArray
*
upstream
=
NULL
;
if
(
pQueryInfo
->
pUpstream
!=
NULL
&&
taosArrayGetSize
(
pQueryInfo
->
pUpstream
)
>
0
)
{
// subquery in the from clause
upstream
=
taosArrayInit
(
4
,
POINTER_BYTES
);
size_t
size
=
taosArrayGetSize
(
pQueryInfo
->
pUpstream
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
SQueryStmtInfo
*
pq
=
taosArrayGet
(
pQueryInfo
->
pUpstream
,
i
);
SArray
*
p
=
createQueryPlanImpl
(
pq
);
taosArrayAddBatch
(
upstream
,
p
->
pData
,
(
int32_t
)
taosArrayGetSize
(
p
));
}
}
if
(
pQueryInfo
->
numOfTables
>
1
)
{
// it is a join query
// 1. separate the select clause according to table
taosArrayDestroy
(
upstream
);
upstream
=
taosArrayInit
(
5
,
POINTER_BYTES
);
for
(
int32_t
i
=
0
;
i
<
pQueryInfo
->
numOfTables
;
++
i
)
{
STableMetaInfo
*
pTableMetaInfo
=
pQueryInfo
->
pTableMetaInfo
[
i
];
uint64_t
uid
=
pTableMetaInfo
->
pTableMeta
->
uid
;
SArray
*
exprList
=
taosArrayInit
(
4
,
POINTER_BYTES
);
if
(
copyExprInfoList
(
exprList
,
pQueryInfo
->
exprList
,
uid
,
true
)
!=
0
)
{
terrno
=
TSDB_CODE_TSC_OUT_OF_MEMORY
;
dropAllExprInfo
(
exprList
);
exit
(
-
1
);
}
// 2. create the query execution node
char
name
[
TSDB_TABLE_FNAME_LEN
]
=
{
0
};
tNameExtractFullName
(
&
pTableMetaInfo
->
name
,
name
);
SQueryTableInfo
info
=
{.
tableName
=
strdup
(
name
),
.
uid
=
pTableMetaInfo
->
pTableMeta
->
uid
,};
// 3. get the required table column list
SArray
*
tableColumnList
=
taosArrayInit
(
4
,
sizeof
(
SColumn
));
columnListCopy
(
tableColumnList
,
pQueryInfo
->
colList
,
uid
);
// 4. add the projection query node
SQueryPlanNode
*
pNode
=
doAddTableColumnNode
(
pQueryInfo
,
pTableMetaInfo
,
&
info
,
exprList
,
tableColumnList
);
columnListDestroy
(
tableColumnList
);
dropAllExprInfo
(
exprList
);
taosArrayPush
(
upstream
,
&
pNode
);
}
// 3. add the join node here
SQueryTableInfo
info
=
{
0
};
int32_t
num
=
(
int32_t
)
taosArrayGetSize
(
pQueryInfo
->
exprList
);
SQueryPlanNode
*
pNode
=
createQueryNode
(
QNODE_JOIN
,
"Join"
,
upstream
->
pData
,
pQueryInfo
->
numOfTables
,
pQueryInfo
->
exprList
->
pData
,
num
,
&
info
,
NULL
);
// 4. add the aggregation or projection execution node
pNode
=
doCreateQueryPlanForOneTableImpl
(
pQueryInfo
,
pNode
,
&
info
,
pQueryInfo
->
exprList
);
upstream
=
taosArrayInit
(
5
,
POINTER_BYTES
);
taosArrayPush
(
upstream
,
&
pNode
);
}
else
{
// only one table, normal query process
STableMetaInfo
*
pTableMetaInfo
=
pQueryInfo
->
pTableMetaInfo
[
0
];
SQueryPlanNode
*
pNode
=
doCreateQueryPlanForOneTable
(
pQueryInfo
,
pTableMetaInfo
,
pQueryInfo
->
exprList
,
pQueryInfo
->
colList
);
upstream
=
taosArrayInit
(
5
,
POINTER_BYTES
);
taosArrayPush
(
upstream
,
&
pNode
);
}
return
upstream
;
}
static
void
doDestroyQueryNode
(
SQueryPlanNode
*
pQueryNode
)
{
tfree
(
pQueryNode
->
pExtInfo
);
tfree
(
pQueryNode
->
pSchema
);
tfree
(
pQueryNode
->
info
.
name
);
tfree
(
pQueryNode
->
tableInfo
.
tableName
);
dropAllExprInfo
(
pQueryNode
->
pExpr
);
if
(
pQueryNode
->
pPrevNodes
!=
NULL
)
{
int32_t
size
=
(
int32_t
)
taosArrayGetSize
(
pQueryNode
->
pPrevNodes
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
SQueryPlanNode
*
p
=
taosArrayGetP
(
pQueryNode
->
pPrevNodes
,
i
);
doDestroyQueryNode
(
p
);
}
taosArrayDestroy
(
pQueryNode
->
pPrevNodes
);
}
tfree
(
pQueryNode
);
}
bool
hasAliasName
(
SExprInfo
*
pExpr
)
{
assert
(
pExpr
!=
NULL
);
return
true
;
// return strncmp(pExpr->base.token, pExpr->base., tListLen(pExpr->base.aliasName)) != 0;
}
static
int32_t
doPrintPlan
(
char
*
buf
,
SQueryPlanNode
*
pQueryNode
,
int32_t
level
,
int32_t
totalLen
)
{
if
(
level
>
0
)
{
sprintf
(
buf
+
totalLen
,
"%*c"
,
level
,
' '
);
totalLen
+=
level
;
}
int32_t
len1
=
sprintf
(
buf
+
totalLen
,
"%s("
,
pQueryNode
->
info
.
name
);
int32_t
len
=
len1
+
totalLen
;
switch
(
pQueryNode
->
info
.
type
)
{
case
QNODE_TABLESCAN
:
{
STimeWindow
*
win
=
(
STimeWindow
*
)
pQueryNode
->
pExtInfo
;
len1
=
sprintf
(
buf
+
len
,
"%s #%"
PRIu64
") time_range: %"
PRId64
" - %"
PRId64
"
\n
"
,
pQueryNode
->
tableInfo
.
tableName
,
pQueryNode
->
tableInfo
.
uid
,
win
->
skey
,
win
->
ekey
);
len
+=
len1
;
break
;
}
case
QNODE_PROJECT
:
{
len1
=
sprintf
(
buf
+
len
,
"cols: "
);
len
+=
len1
;
for
(
int32_t
i
=
0
;
i
<
pQueryNode
->
numOfOutput
;
++
i
)
{
SExprInfo
*
pExprInfo
=
taosArrayGetP
(
pQueryNode
->
pExpr
,
i
);
SSqlExpr
*
p
=
&
pExprInfo
->
base
;
len1
=
sprintf
(
buf
+
len
,
"[%s #%d]"
,
p
->
resSchema
.
name
,
p
->
resSchema
.
colId
);
len
+=
len1
;
if
(
i
<
pQueryNode
->
numOfOutput
-
1
)
{
len1
=
sprintf
(
buf
+
len
,
", "
);
len
+=
len1
;
}
}
len1
=
sprintf
(
buf
+
len
,
")"
);
len
+=
len1
;
//todo print filter info
len1
=
sprintf
(
buf
+
len
,
" filters:(nil)
\n
"
);
len
+=
len1
;
break
;
}
case
QNODE_AGGREGATE
:
{
for
(
int32_t
i
=
0
;
i
<
pQueryNode
->
numOfOutput
;
++
i
)
{
SExprInfo
*
pExprInfo
=
taosArrayGetP
(
pQueryNode
->
pExpr
,
i
);
SSqlExpr
*
pExpr
=
&
pExprInfo
->
base
;
// if (hasAliasName(&pQueryNode->pExpr[i])) {
len1
=
sprintf
(
buf
+
len
,
"[%s #%s]"
,
pExpr
->
token
,
pExpr
->
resSchema
.
name
);
// } else {
// len1 = sprintf(buf + len,"[%s]", pExpr->token);
// }
len
+=
len1
;
if
(
i
<
pQueryNode
->
numOfOutput
-
1
)
{
len1
=
sprintf
(
buf
+
len
,
", "
);
len
+=
len1
;
}
}
len1
=
sprintf
(
buf
+
len
,
")
\n
"
);
len
+=
len1
;
break
;
}
case
QNODE_TIMEWINDOW
:
{
for
(
int32_t
i
=
0
;
i
<
pQueryNode
->
numOfOutput
;
++
i
)
{
SExprInfo
*
pExprInfo
=
taosArrayGetP
(
pQueryNode
->
pExpr
,
i
);
SSqlExpr
*
pExpr
=
&
pExprInfo
->
base
;
if
(
hasAliasName
(
pExprInfo
))
{
len1
=
sprintf
(
buf
+
len
,
"[%s #%s]"
,
pExpr
->
token
,
pExpr
->
resSchema
.
name
);
}
else
{
len1
=
sprintf
(
buf
+
len
,
"[%s]"
,
pExpr
->
token
);
}
len
+=
len1
;
if
(
i
<
pQueryNode
->
numOfOutput
-
1
)
{
len1
=
sprintf
(
buf
+
len
,
", "
);
len
+=
len1
;
}
}
len1
=
sprintf
(
buf
+
len
,
") "
);
len
+=
len1
;
SInterval
*
pInterval
=
pQueryNode
->
pExtInfo
;
len1
=
sprintf
(
buf
+
len
,
"interval:%"
PRId64
"(%s), sliding:%"
PRId64
"(%s), offset:%"
PRId64
"
\n
"
,
pInterval
->
interval
,
TSDB_TIME_PRECISION_MILLI_STR
,
pInterval
->
sliding
,
TSDB_TIME_PRECISION_MILLI_STR
,
pInterval
->
offset
);
len
+=
len1
;
break
;
}
case
QNODE_GROUPBY
:
{
// todo hide the invisible column
for
(
int32_t
i
=
0
;
i
<
pQueryNode
->
numOfOutput
;
++
i
)
{
SExprInfo
*
pExprInfo
=
taosArrayGetP
(
pQueryNode
->
pExpr
,
i
);
SSqlExpr
*
pExpr
=
&
pExprInfo
->
base
;
if
(
hasAliasName
(
pExprInfo
))
{
len1
=
sprintf
(
buf
+
len
,
"[%s #%s]"
,
pExpr
->
token
,
pExpr
->
resSchema
.
name
);
}
else
{
len1
=
sprintf
(
buf
+
len
,
"[%s]"
,
pExpr
->
token
);
}
len
+=
len1
;
if
(
i
<
pQueryNode
->
numOfOutput
-
1
)
{
len1
=
sprintf
(
buf
+
len
,
", "
);
len
+=
len1
;
}
}
SGroupbyExpr
*
pGroupbyExpr
=
pQueryNode
->
pExtInfo
;
SColIndex
*
pIndex
=
taosArrayGet
(
pGroupbyExpr
->
columnInfo
,
0
);
len1
=
sprintf
(
buf
+
len
,
") groupby_col: [%s #%d]
\n
"
,
pIndex
->
name
,
pIndex
->
colId
);
len
+=
len1
;
break
;
}
case
QNODE_FILL
:
{
SFillEssInfo
*
pEssInfo
=
pQueryNode
->
pExtInfo
;
len1
=
sprintf
(
buf
+
len
,
"%d"
,
pEssInfo
->
fillType
);
len
+=
len1
;
if
(
pEssInfo
->
fillType
==
TSDB_FILL_SET_VALUE
)
{
len1
=
sprintf
(
buf
+
len
,
", val:"
);
len
+=
len1
;
// todo get the correct fill data type
for
(
int32_t
i
=
0
;
i
<
pQueryNode
->
numOfOutput
;
++
i
)
{
len1
=
sprintf
(
buf
+
len
,
"%"
PRId64
,
pEssInfo
->
val
[
i
]);
len
+=
len1
;
if
(
i
<
pQueryNode
->
numOfOutput
-
1
)
{
len1
=
sprintf
(
buf
+
len
,
", "
);
len
+=
len1
;
}
}
}
len1
=
sprintf
(
buf
+
len
,
")
\n
"
);
len
+=
len1
;
break
;
}
case
QNODE_LIMIT
:
{
SLimit
*
pVal
=
pQueryNode
->
pExtInfo
;
len1
=
sprintf
(
buf
+
len
,
"limit: %"
PRId64
", offset: %"
PRId64
")
\n
"
,
pVal
->
limit
,
pVal
->
offset
);
len
+=
len1
;
break
;
}
case
QNODE_DISTINCT
:
case
QNODE_TAGSCAN
:
{
len1
=
sprintf
(
buf
+
len
,
"cols: "
);
len
+=
len1
;
for
(
int32_t
i
=
0
;
i
<
pQueryNode
->
numOfOutput
;
++
i
)
{
SExprInfo
*
pExprInfo
=
taosArrayGetP
(
pQueryNode
->
pExpr
,
i
);
SSchema
*
resSchema
=
&
pExprInfo
->
base
.
resSchema
;
len1
=
sprintf
(
buf
+
len
,
"[%s #%d]"
,
resSchema
->
name
,
resSchema
->
colId
);
len
+=
len1
;
if
(
i
<
pQueryNode
->
numOfOutput
-
1
)
{
len1
=
sprintf
(
buf
+
len
,
", "
);
len
+=
len1
;
}
}
len1
=
sprintf
(
buf
+
len
,
")
\n
"
);
len
+=
len1
;
break
;
}
case
QNODE_JOIN
:
{
// print join condition
len1
=
sprintf
(
buf
+
len
,
")
\n
"
);
len
+=
len1
;
break
;
}
}
return
len
;
}
int32_t
queryPlanToStringImpl
(
char
*
buf
,
SQueryPlanNode
*
pQueryNode
,
int32_t
level
,
int32_t
totalLen
)
{
int32_t
len
=
doPrintPlan
(
buf
,
pQueryNode
,
level
,
totalLen
);
for
(
int32_t
i
=
0
;
i
<
taosArrayGetSize
(
pQueryNode
->
pPrevNodes
);
++
i
)
{
SQueryPlanNode
*
p1
=
taosArrayGetP
(
pQueryNode
->
pPrevNodes
,
i
);
int32_t
len1
=
queryPlanToStringImpl
(
buf
,
p1
,
level
+
1
,
len
);
len
=
len1
;
}
return
len
;
}
char
*
queryPlanToString
(
SQueryPlanNode
*
pQueryNode
)
{
assert
(
pQueryNode
);
char
*
buf
=
calloc
(
1
,
4096
);
int32_t
len
=
sprintf
(
buf
,
"===== logic plan =====
\n
"
);
queryPlanToStringImpl
(
buf
,
pQueryNode
,
0
,
len
);
return
buf
;
}
SQueryPlanNode
*
queryPlanFromString
()
{
return
NULL
;
}
src/client/src/tscUtil.c
浏览文件 @
562dfa9e
...
...
@@ -2667,19 +2667,7 @@ void tscColumnCopy(SColumn* pDest, const SColumn* pSrc) {
pDest
->
info
.
bytes
=
pSrc
->
info
.
bytes
;
}
void
tscColumnListCopy
(
SArray
*
dst
,
const
SArray
*
src
,
uint64_t
tableUid
)
{
assert
(
src
!=
NULL
&&
dst
!=
NULL
);
size_t
num
=
taosArrayGetSize
(
src
);
for
(
int32_t
i
=
0
;
i
<
num
;
++
i
)
{
SColumn
*
pCol
=
taosArrayGetP
(
src
,
i
);
if
(
pCol
->
tableUid
==
tableUid
)
{
SColumn
*
p
=
tscColumnClone
(
pCol
);
taosArrayPush
(
dst
,
&
p
);
}
}
}
void
tscColumnListCopyAll
(
SArray
*
dst
,
const
SArray
*
src
)
{
assert
(
src
!=
NULL
&&
dst
!=
NULL
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录