Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
慢慢CG
TDengine
提交
c18dd031
T
TDengine
项目概览
慢慢CG
/
TDengine
与 Fork 源项目一致
Fork自
taosdata / TDengine
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
c18dd031
编写于
5月 06, 2021
作者:
H
Haojun Liao
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[td-3299]
上级
6216f6c5
变更
22
隐藏空白更改
内联
并排
Showing
22 changed file
with
998 addition
and
498 deletion
+998
-498
src/client/inc/tscUtil.h
src/client/inc/tscUtil.h
+23
-16
src/client/inc/tsclient.h
src/client/inc/tsclient.h
+5
-5
src/client/src/tscAsync.c
src/client/src/tscAsync.c
+9
-6
src/client/src/tscLocal.c
src/client/src/tscLocal.c
+6
-6
src/client/src/tscLocalMerge.c
src/client/src/tscLocalMerge.c
+8
-8
src/client/src/tscParseInsert.c
src/client/src/tscParseInsert.c
+1
-2
src/client/src/tscPrepare.c
src/client/src/tscPrepare.c
+0
-1
src/client/src/tscSQLParser.c
src/client/src/tscSQLParser.c
+186
-171
src/client/src/tscServer.c
src/client/src/tscServer.c
+12
-16
src/client/src/tscStream.c
src/client/src/tscStream.c
+1
-1
src/client/src/tscSubquery.c
src/client/src/tscSubquery.c
+29
-28
src/client/src/tscUtil.c
src/client/src/tscUtil.c
+210
-133
src/common/inc/tname.h
src/common/inc/tname.h
+1
-3
src/common/src/tarithoperator.c
src/common/src/tarithoperator.c
+1
-0
src/common/src/texpr.c
src/common/src/texpr.c
+20
-17
src/query/inc/qExecutor.h
src/query/inc/qExecutor.h
+7
-7
src/query/inc/qFill.h
src/query/inc/qFill.h
+1
-1
src/query/inc/qPlan.h
src/query/inc/qPlan.h
+32
-1
src/query/inc/qUtil.h
src/query/inc/qUtil.h
+2
-0
src/query/src/qAggMain.c
src/query/src/qAggMain.c
+1
-1
src/query/src/qExecutor.c
src/query/src/qExecutor.c
+6
-6
src/query/src/qPlan.c
src/query/src/qPlan.c
+437
-69
未找到文件。
src/client/inc/tscUtil.h
浏览文件 @
c18dd031
...
...
@@ -59,7 +59,7 @@ typedef struct SJoinSupporter {
SArray
*
exprList
;
SFieldInfo
fieldsInfo
;
STagCond
tagCond
;
S
Sql
GroupbyExpr
groupInfo
;
// group by info
SGroupbyExpr
groupInfo
;
// group by info
struct
STSBuf
*
pTSBuf
;
// the TSBuf struct that holds the compressed timestamp array
FILE
*
f
;
// temporary file in order to create TSBuf
char
path
[
PATH_MAX
];
// temporary file path, todo dynamic allocate memory
...
...
@@ -92,11 +92,11 @@ typedef struct SVgroupTableInfo {
static
FORCE_INLINE
SQueryInfo
*
tscGetQueryInfo
(
SSqlCmd
*
pCmd
,
int32_t
subClauseIndex
)
{
assert
(
pCmd
!=
NULL
&&
subClauseIndex
>=
0
);
if
(
pCmd
->
pQueryInfo
==
NULL
||
subClauseIndex
>=
pCmd
->
numOfClause
)
{
if
(
pCmd
->
pQueryInfo
==
NULL
)
{
return
NULL
;
}
return
pCmd
->
pQueryInfo
[
subClauseIndex
]
;
return
pCmd
->
active
;
}
SQueryInfo
*
tscGetActiveQueryInfo
(
SSqlCmd
*
pCmd
);
...
...
@@ -127,7 +127,7 @@ int32_t tscGetDataBlockFromList(SHashObj* pHashList, int64_t id, int32_t size, i
*/
bool
tscIsPointInterpQuery
(
SQueryInfo
*
pQueryInfo
);
bool
tscIsTWAQuery
(
SQueryInfo
*
pQueryInfo
);
bool
ts
cIsSecondStageQuery
(
SQueryInfo
*
pQueryInfo
);
bool
ts
IsArithmeticQueryOnAggResult
(
SQueryInfo
*
pQueryInfo
);
bool
tscGroupbyColumn
(
SQueryInfo
*
pQueryInfo
);
bool
tscIsTopBotQuery
(
SQueryInfo
*
pQueryInfo
);
bool
hasTagValOutput
(
SQueryInfo
*
pQueryInfo
);
...
...
@@ -136,13 +136,14 @@ bool isStabledev(SQueryInfo* pQueryInfo);
bool
isTsCompQuery
(
SQueryInfo
*
pQueryInfo
);
bool
isSimpleAggregate
(
SQueryInfo
*
pQueryInfo
);
bool
isBlockDistQuery
(
SQueryInfo
*
pQueryInfo
);
int32_t
tscGetTopbotQueryParam
(
SQueryInfo
*
pQueryInfo
);
bool
isSimpleAggregateRv
(
SQueryInfo
*
pQueryInfo
);
bool
tscNonOrderedProjectionQueryOnSTable
(
SQueryInfo
*
pQueryInfo
,
int32_t
tableIndex
);
bool
tscOrderedProjectionQueryOnSTable
(
SQueryInfo
*
pQueryInfo
,
int32_t
tableIndex
);
bool
tscIsProjectionQueryOnSTable
(
SQueryInfo
*
pQueryInfo
,
int32_t
tableIndex
);
bool
tscIsProjectionQuery
(
SQueryInfo
*
pQueryInfo
);
bool
tscHasColumnFilter
(
SQueryInfo
*
pQueryInfo
);
bool
tscIsTwoStageSTableQuery
(
SQueryInfo
*
pQueryInfo
,
int32_t
tableIndex
);
bool
tscQueryTags
(
SQueryInfo
*
pQueryInfo
);
...
...
@@ -175,26 +176,32 @@ void tscFieldInfoClear(SFieldInfo* pFieldInfo);
static
FORCE_INLINE
int32_t
tscNumOfFields
(
SQueryInfo
*
pQueryInfo
)
{
return
pQueryInfo
->
fieldsInfo
.
numOfOutput
;
}
int32_t
tscFieldInfoCompare
(
const
SFieldInfo
*
pFieldInfo1
,
const
SFieldInfo
*
pFieldInfo2
);
void
tscInsertPrimaryTsSourceColumn
(
SQueryInfo
*
pQueryInfo
,
uint64_t
uid
);
void
addExprParams
(
SSqlExpr
*
pExpr
,
char
*
argument
,
int32_t
type
,
int32_t
bytes
);
int32_t
tscGetResRowLength
(
SArray
*
pExprList
);
SExprInfo
*
tsc
Sql
ExprInsert
(
SQueryInfo
*
pQueryInfo
,
int32_t
index
,
int16_t
functionId
,
SColumnIndex
*
pColIndex
,
int16_t
type
,
SExprInfo
*
tscExprInsert
(
SQueryInfo
*
pQueryInfo
,
int32_t
index
,
int16_t
functionId
,
SColumnIndex
*
pColIndex
,
int16_t
type
,
int16_t
size
,
int16_t
resColId
,
int16_t
interSize
,
bool
isTagCol
);
SExprInfo
*
tscSqlExprAppend
(
SQueryInfo
*
pQueryInfo
,
int16_t
functionId
,
SColumnIndex
*
pColIndex
,
int16_t
type
,
SExprInfo
*
tscExprCreate
(
SQueryInfo
*
pQueryInfo
,
int16_t
functionId
,
SColumnIndex
*
pColIndex
,
int16_t
type
,
int16_t
size
,
int16_t
resColId
,
int16_t
interSize
,
int32_t
colType
);
void
tscExprAddParams
(
SSqlExpr
*
pExpr
,
char
*
argument
,
int32_t
type
,
int32_t
bytes
);
SExprInfo
*
tscExprAppend
(
SQueryInfo
*
pQueryInfo
,
int16_t
functionId
,
SColumnIndex
*
pColIndex
,
int16_t
type
,
int16_t
size
,
int16_t
resColId
,
int16_t
interSize
,
bool
isTagCol
);
SExprInfo
*
tsc
Sql
ExprUpdate
(
SQueryInfo
*
pQueryInfo
,
int32_t
index
,
int16_t
functionId
,
int16_t
srcColumnIndex
,
int16_t
type
,
SExprInfo
*
tscExprUpdate
(
SQueryInfo
*
pQueryInfo
,
int32_t
index
,
int16_t
functionId
,
int16_t
srcColumnIndex
,
int16_t
type
,
int16_t
size
);
size_t
tscSqlExprNumOfExprs
(
SQueryInfo
*
pQueryInfo
);
void
tscInsertPrimaryTsSourceColumn
(
SQueryInfo
*
pQueryInfo
,
uint64_t
uid
);
SExprInfo
*
tscSqlExprGet
(
SQueryInfo
*
pQueryInfo
,
int32_t
index
);
int32_t
tscSqlExprCopy
(
SArray
*
dst
,
const
SArray
*
src
,
uint64_t
uid
,
bool
deepcopy
);
void
tscSqlExprAssign
(
SExprInfo
*
dst
,
const
SExprInfo
*
src
);
void
tscSqlExprInfoDestroy
(
SArray
*
pExprInfo
);
size_t
tscNumOfExprs
(
SQueryInfo
*
pQueryInfo
);
SExprInfo
*
tscExprGet
(
SQueryInfo
*
pQueryInfo
,
int32_t
index
);
int32_t
tscExprCopy
(
SArray
*
dst
,
const
SArray
*
src
,
uint64_t
uid
,
bool
deepcopy
);
void
tscExprAssign
(
SExprInfo
*
dst
,
const
SExprInfo
*
src
);
void
tscExprDestroy
(
SArray
*
pExprInfo
);
int32_t
createProjectionExpr
(
SQueryInfo
*
pQueryInfo
,
STableMetaInfo
*
pTableMetaInfo
,
SExprInfo
***
pExpr
,
int32_t
*
num
);
SColumn
*
tscColumnClone
(
const
SColumn
*
src
);
bool
tscColumnExists
(
SArray
*
pColumnList
,
int32_t
columnIndex
,
uint64_t
uid
);
...
...
@@ -243,7 +250,7 @@ SArray* tscVgroupTableInfoDup(SArray* pVgroupTables);
void
tscRemoveVgroupTableGroup
(
SArray
*
pVgroupTable
,
int32_t
index
);
void
tscVgroupTableCopy
(
SVgroupTableInfo
*
info
,
SVgroupTableInfo
*
pInfo
);
int
tscGetSTableVgroupInfo
(
SSqlObj
*
pSql
,
int32_t
clauseIndex
);
int
tscGetSTableVgroupInfo
(
SSqlObj
*
pSql
,
SQueryInfo
*
pQueryInfo
);
int
tscGetTableMeta
(
SSqlObj
*
pSql
,
STableMetaInfo
*
pTableMetaInfo
);
int
tscGetTableMetaEx
(
SSqlObj
*
pSql
,
STableMetaInfo
*
pTableMetaInfo
,
bool
createIfNotExists
);
...
...
src/client/inc/tsclient.h
浏览文件 @
c18dd031
...
...
@@ -203,10 +203,11 @@ typedef struct SQueryInfo {
SInterval
interval
;
// tumble time window
SSessionWindow
sessionWindow
;
// session time window
S
Sql
GroupbyExpr
groupbyExpr
;
// groupby tags info
SGroupbyExpr
groupbyExpr
;
// groupby tags info
SArray
*
colList
;
// SArray<SColumn*>
SFieldInfo
fieldsInfo
;
SArray
*
exprList
;
// SArray<SExprInfo*>
SArray
*
exprList1
;
// final exprlist in case of arithmetic expression exists
SLimitVal
limit
;
SLimitVal
slimit
;
STagCond
tagCond
;
...
...
@@ -230,8 +231,6 @@ typedef struct SQueryInfo {
int32_t
bufLen
;
char
*
buf
;
SQInfo
*
pQInfo
;
// global merge operator
SArray
*
pDSOperator
;
// data source operator
SArray
*
pPhyOperator
;
// physical query execution plan
SQueryAttr
*
pQueryAttr
;
// query object
struct
SQueryInfo
*
sibling
;
// sibling
...
...
@@ -244,6 +243,7 @@ typedef struct SQueryInfo {
bool
arithmeticOnAgg
;
bool
projectionQuery
;
bool
hasFilter
;
bool
onlyTagQuery
;
}
SQueryInfo
;
typedef
struct
{
...
...
@@ -268,8 +268,8 @@ typedef struct {
char
*
payload
;
int32_t
payloadLen
;
SQueryInfo
*
*
pQueryInfo
;
int32_t
numOfClause
;
SQueryInfo
*
pQueryInfo
;
//
int32_t numOfClause;
int32_t
clauseIndex
;
// index of multiple subclause query
SQueryInfo
*
active
;
// current active query info
...
...
src/client/src/tscAsync.c
浏览文件 @
c18dd031
...
...
@@ -127,7 +127,8 @@ static void tscAsyncFetchRowsProxy(void *param, TAOS_RES *tres, int numOfRows) {
* all available virtual node has been checked already, now we need to check
* for the next subclause queries
*/
if
(
pCmd
->
clauseIndex
<
pCmd
->
numOfClause
-
1
)
{
if
(
pCmd
->
active
->
sibling
!=
NULL
)
{
pCmd
->
active
=
pCmd
->
active
->
sibling
;
tscTryQueryNextClause
(
pSql
,
tscAsyncQueryRowsForNextVnode
);
return
;
}
...
...
@@ -231,7 +232,8 @@ void taos_fetch_rows_a(TAOS_RES *tres, __async_cb_func_t fp, void *param) {
* all available virtual nodes in current clause has been checked already, now try the
* next one in the following union subclause
*/
if
(
pCmd
->
clauseIndex
<
pCmd
->
numOfClause
-
1
)
{
if
(
pCmd
->
active
->
sibling
!=
NULL
)
{
pCmd
->
active
=
pCmd
->
active
->
sibling
;
// todo refactor
tscTryQueryNextClause
(
pSql
,
tscAsyncQueryRowsForNextVnode
);
return
;
}
...
...
@@ -317,13 +319,13 @@ static int32_t updateMetaBeforeRetryQuery(SSqlObj* pSql, STableMetaInfo* pTableM
// update the pExpr info, colList info, number of table columns
// TODO Re-parse this sql and issue the corresponding subquery as an alternative for this case.
if
(
pSql
->
retryReason
==
TSDB_CODE_TDB_INVALID_TABLE_ID
)
{
int32_t
numOfExprs
=
(
int32_t
)
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
int32_t
numOfExprs
=
(
int32_t
)
tscNumOfExprs
(
pQueryInfo
);
int32_t
numOfCols
=
tscGetNumOfColumns
(
pTableMetaInfo
->
pTableMeta
);
int32_t
numOfTags
=
tscGetNumOfTags
(
pTableMetaInfo
->
pTableMeta
);
SSchema
*
pSchema
=
tscGetTableSchema
(
pTableMetaInfo
->
pTableMeta
);
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
SSqlExpr
*
pExpr
=
&
(
tsc
Sql
ExprGet
(
pQueryInfo
,
i
)
->
base
);
SSqlExpr
*
pExpr
=
&
(
tscExprGet
(
pQueryInfo
,
i
)
->
base
);
pExpr
->
uid
=
pTableMetaInfo
->
pTableMeta
->
id
.
uid
;
if
(
pExpr
->
colInfo
.
colIndex
>=
0
)
{
...
...
@@ -474,7 +476,8 @@ void tscTableMetaCallBack(void *param, TAOS_RES *res, int code) {
}
}
else
{
// stream computing
STableMetaInfo
*
pTableMetaInfo
=
tscGetTableMetaInfoFromCmd
(
pCmd
,
pCmd
->
clauseIndex
,
0
);
SQueryInfo
*
pQueryInfo
=
tscGetActiveQueryInfo
(
pCmd
);
STableMetaInfo
*
pTableMetaInfo
=
pQueryInfo
->
pTableMetaInfo
[
0
];
code
=
tscGetTableMeta
(
pSql
,
pTableMetaInfo
);
if
(
code
==
TSDB_CODE_TSC_ACTION_IN_PROGRESS
)
{
...
...
@@ -485,7 +488,7 @@ void tscTableMetaCallBack(void *param, TAOS_RES *res, int code) {
}
if
(
UTIL_TABLE_IS_SUPER_TABLE
(
pTableMetaInfo
))
{
code
=
tscGetSTableVgroupInfo
(
pSql
,
p
Cmd
->
clauseIndex
);
code
=
tscGetSTableVgroupInfo
(
pSql
,
p
QueryInfo
);
if
(
code
==
TSDB_CODE_TSC_ACTION_IN_PROGRESS
)
{
taosReleaseRef
(
tscObjRef
,
pSql
->
self
);
return
;
...
...
src/client/src/tscLocal.c
浏览文件 @
c18dd031
...
...
@@ -161,7 +161,7 @@ static int32_t tscBuildTableSchemaResultFields(SSqlObj *pSql, int32_t numOfCols,
tstrncpy
(
f
.
name
,
"Field"
,
sizeof
(
f
.
name
));
SInternalField
*
pInfo
=
tscFieldInfoAppend
(
&
pQueryInfo
->
fieldsInfo
,
&
f
);
pInfo
->
pExpr
=
tsc
Sql
ExprAppend
(
pQueryInfo
,
TSDB_FUNC_TS_DUMMY
,
&
index
,
TSDB_DATA_TYPE_BINARY
,
pInfo
->
pExpr
=
tscExprAppend
(
pQueryInfo
,
TSDB_FUNC_TS_DUMMY
,
&
index
,
TSDB_DATA_TYPE_BINARY
,
(
TSDB_COL_NAME_LEN
-
1
)
+
VARSTR_HEADER_SIZE
,
-
1000
,
(
TSDB_COL_NAME_LEN
-
1
),
false
);
rowLen
+=
((
TSDB_COL_NAME_LEN
-
1
)
+
VARSTR_HEADER_SIZE
);
...
...
@@ -171,7 +171,7 @@ static int32_t tscBuildTableSchemaResultFields(SSqlObj *pSql, int32_t numOfCols,
tstrncpy
(
f
.
name
,
"Type"
,
sizeof
(
f
.
name
));
pInfo
=
tscFieldInfoAppend
(
&
pQueryInfo
->
fieldsInfo
,
&
f
);
pInfo
->
pExpr
=
tsc
Sql
ExprAppend
(
pQueryInfo
,
TSDB_FUNC_TS_DUMMY
,
&
index
,
TSDB_DATA_TYPE_BINARY
,
(
int16_t
)(
typeColLength
+
VARSTR_HEADER_SIZE
),
pInfo
->
pExpr
=
tscExprAppend
(
pQueryInfo
,
TSDB_FUNC_TS_DUMMY
,
&
index
,
TSDB_DATA_TYPE_BINARY
,
(
int16_t
)(
typeColLength
+
VARSTR_HEADER_SIZE
),
-
1000
,
typeColLength
,
false
);
rowLen
+=
typeColLength
+
VARSTR_HEADER_SIZE
;
...
...
@@ -181,7 +181,7 @@ static int32_t tscBuildTableSchemaResultFields(SSqlObj *pSql, int32_t numOfCols,
tstrncpy
(
f
.
name
,
"Length"
,
sizeof
(
f
.
name
));
pInfo
=
tscFieldInfoAppend
(
&
pQueryInfo
->
fieldsInfo
,
&
f
);
pInfo
->
pExpr
=
tsc
Sql
ExprAppend
(
pQueryInfo
,
TSDB_FUNC_TS_DUMMY
,
&
index
,
TSDB_DATA_TYPE_INT
,
sizeof
(
int32_t
),
pInfo
->
pExpr
=
tscExprAppend
(
pQueryInfo
,
TSDB_FUNC_TS_DUMMY
,
&
index
,
TSDB_DATA_TYPE_INT
,
sizeof
(
int32_t
),
-
1000
,
sizeof
(
int32_t
),
false
);
rowLen
+=
sizeof
(
int32_t
);
...
...
@@ -191,7 +191,7 @@ static int32_t tscBuildTableSchemaResultFields(SSqlObj *pSql, int32_t numOfCols,
tstrncpy
(
f
.
name
,
"Note"
,
sizeof
(
f
.
name
));
pInfo
=
tscFieldInfoAppend
(
&
pQueryInfo
->
fieldsInfo
,
&
f
);
pInfo
->
pExpr
=
tsc
Sql
ExprAppend
(
pQueryInfo
,
TSDB_FUNC_TS_DUMMY
,
&
index
,
TSDB_DATA_TYPE_BINARY
,
(
int16_t
)(
noteColLength
+
VARSTR_HEADER_SIZE
),
pInfo
->
pExpr
=
tscExprAppend
(
pQueryInfo
,
TSDB_FUNC_TS_DUMMY
,
&
index
,
TSDB_DATA_TYPE_BINARY
,
(
int16_t
)(
noteColLength
+
VARSTR_HEADER_SIZE
),
-
1000
,
noteColLength
,
false
);
rowLen
+=
noteColLength
+
VARSTR_HEADER_SIZE
;
...
...
@@ -404,7 +404,7 @@ static int32_t tscSCreateBuildResultFields(SSqlObj *pSql, BuildType type, const
}
SInternalField
*
pInfo
=
tscFieldInfoAppend
(
&
pQueryInfo
->
fieldsInfo
,
&
f
);
pInfo
->
pExpr
=
tsc
Sql
ExprAppend
(
pQueryInfo
,
TSDB_FUNC_TS_DUMMY
,
&
index
,
TSDB_DATA_TYPE_BINARY
,
f
.
bytes
,
-
1000
,
f
.
bytes
-
VARSTR_HEADER_SIZE
,
false
);
pInfo
->
pExpr
=
tscExprAppend
(
pQueryInfo
,
TSDB_FUNC_TS_DUMMY
,
&
index
,
TSDB_DATA_TYPE_BINARY
,
f
.
bytes
,
-
1000
,
f
.
bytes
-
VARSTR_HEADER_SIZE
,
false
);
rowLen
+=
f
.
bytes
;
...
...
@@ -417,7 +417,7 @@ static int32_t tscSCreateBuildResultFields(SSqlObj *pSql, BuildType type, const
}
pInfo
=
tscFieldInfoAppend
(
&
pQueryInfo
->
fieldsInfo
,
&
f
);
pInfo
->
pExpr
=
tsc
Sql
ExprAppend
(
pQueryInfo
,
TSDB_FUNC_TS_DUMMY
,
&
index
,
TSDB_DATA_TYPE_BINARY
,
pInfo
->
pExpr
=
tscExprAppend
(
pQueryInfo
,
TSDB_FUNC_TS_DUMMY
,
&
index
,
TSDB_DATA_TYPE_BINARY
,
(
int16_t
)(
ddlLen
+
VARSTR_HEADER_SIZE
),
-
1000
,
ddlLen
,
false
);
rowLen
+=
ddlLen
+
VARSTR_HEADER_SIZE
;
...
...
src/client/src/tscLocalMerge.c
浏览文件 @
c18dd031
...
...
@@ -341,13 +341,13 @@ static int32_t createOrderDescriptor(tOrderDescriptor **pOrderDesc, SQueryInfo*
if
(
numOfGroupByCols
>
0
)
{
if
(
pQueryInfo
->
groupbyExpr
.
numOfGroupCols
>
0
)
{
int32_t
numOfInternalOutput
=
(
int32_t
)
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
int32_t
numOfInternalOutput
=
(
int32_t
)
tscNumOfExprs
(
pQueryInfo
);
// the last "pQueryInfo->groupbyExpr.numOfGroupCols" columns are order-by columns
for
(
int32_t
i
=
0
;
i
<
pQueryInfo
->
groupbyExpr
.
numOfGroupCols
;
++
i
)
{
SColIndex
*
pColIndex
=
taosArrayGet
(
pQueryInfo
->
groupbyExpr
.
columnInfo
,
i
);
for
(
int32_t
j
=
0
;
j
<
numOfInternalOutput
;
++
j
)
{
SExprInfo
*
pExprInfo
=
tsc
Sql
ExprGet
(
pQueryInfo
,
j
);
SExprInfo
*
pExprInfo
=
tscExprGet
(
pQueryInfo
,
j
);
int32_t
functionId
=
pExprInfo
->
base
.
functionId
;
if
(
pColIndex
->
colId
==
pExprInfo
->
base
.
colInfo
.
colId
&&
(
functionId
==
TSDB_FUNC_PRJ
||
functionId
==
TSDB_FUNC_TAG
))
{
...
...
@@ -369,9 +369,9 @@ static int32_t createOrderDescriptor(tOrderDescriptor **pOrderDesc, SQueryInfo*
if
(
pQueryInfo
->
interval
.
interval
!=
0
)
{
orderColIndexList
[
0
]
=
PRIMARYKEY_TIMESTAMP_COL_INDEX
;
}
else
{
size_t
size
=
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
size_t
size
=
tscNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
base
.
functionId
==
TSDB_FUNC_PRJ
&&
pExpr
->
base
.
colInfo
.
colId
==
PRIMARYKEY_TIMESTAMP_COL_INDEX
)
{
orderColIndexList
[
0
]
=
i
;
}
...
...
@@ -405,7 +405,7 @@ int32_t tscLocalReducerEnvCreate(SQueryInfo *pQueryInfo, tExtMemBuffer ***pMemBu
return
TSDB_CODE_TSC_OUT_OF_MEMORY
;
}
size_t
size
=
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
size_t
size
=
tscNumOfExprs
(
pQueryInfo
);
pSchema
=
(
SSchema
*
)
calloc
(
1
,
sizeof
(
SSchema
)
*
size
);
if
(
pSchema
==
NULL
)
{
...
...
@@ -415,7 +415,7 @@ int32_t tscLocalReducerEnvCreate(SQueryInfo *pQueryInfo, tExtMemBuffer ***pMemBu
int32_t
rlen
=
0
;
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
i
);
pSchema
[
i
].
bytes
=
pExpr
->
base
.
resBytes
;
pSchema
[
i
].
type
=
(
int8_t
)
pExpr
->
base
.
resType
;
...
...
@@ -702,12 +702,12 @@ int32_t doArithmeticCalculate(SQueryInfo* pQueryInfo, tFilePage* pOutput, int32_
// todo refactor
arithSup
.
offset
=
0
;
arithSup
.
numOfCols
=
(
int32_t
)
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
arithSup
.
numOfCols
=
(
int32_t
)
tscNumOfExprs
(
pQueryInfo
);
arithSup
.
exprList
=
pQueryInfo
->
exprList
;
arithSup
.
data
=
calloc
(
arithSup
.
numOfCols
,
POINTER_BYTES
);
for
(
int32_t
k
=
0
;
k
<
arithSup
.
numOfCols
;
++
k
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
k
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
k
);
arithSup
.
data
[
k
]
=
(
pOutput
->
data
+
pOutput
->
num
*
pExpr
->
base
.
offset
);
}
...
...
src/client/src/tscParseInsert.c
浏览文件 @
c18dd031
...
...
@@ -1363,7 +1363,6 @@ static int doPackSendDataBlock(SSqlObj *pSql, int32_t numOfRows, STableDataBlock
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
pSql
->
res
.
numOfRows
=
0
;
assert
(
pCmd
->
numOfClause
==
1
);
STableMeta
*
pTableMeta
=
tscGetTableMetaInfoFromCmd
(
pCmd
,
pCmd
->
clauseIndex
,
0
)
->
pTableMeta
;
SSubmitBlk
*
pBlocks
=
(
SSubmitBlk
*
)(
pTableDataBlocks
->
pData
);
...
...
@@ -1527,7 +1526,7 @@ void tscImportDataFromFile(SSqlObj *pSql) {
}
assert
(
pCmd
->
dataSourceType
==
DATA_FROM_DATA_FILE
&&
strlen
(
pCmd
->
payload
)
!=
0
);
pCmd
->
active
=
pCmd
->
pQueryInfo
[
0
]
;
pCmd
->
active
=
pCmd
->
pQueryInfo
;
SImportFileSupport
*
pSupporter
=
calloc
(
1
,
sizeof
(
SImportFileSupport
));
SSqlObj
*
pNew
=
createSubqueryObj
(
pSql
,
0
,
parseFileSendDataBlock
,
pSupporter
,
TSDB_SQL_INSERT
,
NULL
);
...
...
src/client/src/tscPrepare.c
浏览文件 @
c18dd031
...
...
@@ -774,7 +774,6 @@ static int insertStmtExecute(STscStmt* stmt) {
return
TSDB_CODE_TSC_INVALID_VALUE
;
}
assert
(
pCmd
->
numOfClause
==
1
);
if
(
taosHashGetSize
(
pCmd
->
pTableBlockHashList
)
==
0
)
{
return
TSDB_CODE_SUCCESS
;
}
...
...
src/client/src/tscSQLParser.c
浏览文件 @
c18dd031
...
...
@@ -35,6 +35,7 @@
#include "tstrbuild.h"
#include "ttokendef.h"
#include "qUtil.h"
#include "qPlan.h"
#define DEFAULT_PRIMARY_TIMESTAMP_COL_NAME "_c0"
...
...
@@ -70,7 +71,7 @@ static bool validateTagParams(SArray* pTagsList, SArray* pFieldList, SSqlCmd* pC
static
int32_t
setObjFullName
(
char
*
fullName
,
const
char
*
account
,
SStrToken
*
pDB
,
SStrToken
*
tableName
,
int32_t
*
len
);
static
void
getColumnName
(
tSqlExprItem
*
pItem
,
char
*
resultFieldName
,
int32_t
nameLength
);
static
void
getColumnName
(
tSqlExprItem
*
pItem
,
char
*
resultFieldName
,
char
*
rawName
,
int32_t
nameLength
);
static
int32_t
addExprAndResultField
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
int32_t
colIndex
,
tSqlExprItem
*
pItem
,
bool
finalResult
);
static
int32_t
insertResultField
(
SQueryInfo
*
pQueryInfo
,
int32_t
outputIndex
,
SColumnList
*
pIdList
,
int16_t
bytes
,
...
...
@@ -111,7 +112,7 @@ static bool validateOneTags(SSqlCmd* pCmd, TAOS_FIELD* pTagField);
static
bool
hasTimestampForPointInterpQuery
(
SQueryInfo
*
pQueryInfo
);
static
bool
hasNormalColumnFilter
(
SQueryInfo
*
pQueryInfo
);
static
int32_t
validateLimitNode
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
int32_t
index
,
SSqlNode
*
pSqlNode
,
SSqlObj
*
pSql
);
static
int32_t
validateLimitNode
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
SSqlNode
*
pSqlNode
,
SSqlObj
*
pSql
);
static
int32_t
parseCreateDBOptions
(
SSqlCmd
*
pCmd
,
SCreateDbInfo
*
pCreateDbSql
);
static
int32_t
getColumnIndexByName
(
SSqlCmd
*
pCmd
,
const
SStrToken
*
pToken
,
SQueryInfo
*
pQueryInfo
,
SColumnIndex
*
pIndex
);
static
int32_t
getTableIndexByName
(
SStrToken
*
pToken
,
SQueryInfo
*
pQueryInfo
,
SColumnIndex
*
pIndex
);
...
...
@@ -126,7 +127,7 @@ static SColumnList createColumnList(int32_t num, int16_t tableIndex, int32_t col
static
int32_t
doCheckForCreateTable
(
SSqlObj
*
pSql
,
int32_t
subClauseIndex
,
SSqlInfo
*
pInfo
);
static
int32_t
doCheckForCreateFromStable
(
SSqlObj
*
pSql
,
SSqlInfo
*
pInfo
);
static
int32_t
doCheckForStream
(
SSqlObj
*
pSql
,
SSqlInfo
*
pInfo
);
static
int32_t
validateSqlNode
(
SSqlObj
*
pSql
,
SSqlNode
*
pSqlNode
,
int32_t
index
);
static
int32_t
validateSqlNode
(
SSqlObj
*
pSql
,
SSqlNode
*
pSqlNode
,
SQueryInfo
*
pQueryInfo
);
static
int32_t
exprTreeFromSqlExpr
(
SSqlCmd
*
pCmd
,
tExprNode
**
pExpr
,
const
tSqlExpr
*
pSqlExpr
,
SQueryInfo
*
pQueryInfo
,
SArray
*
pCols
,
uint64_t
*
uid
);
static
bool
validateDebugFlag
(
int32_t
v
);
static
int32_t
checkQueryRangeForFill
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
);
...
...
@@ -618,43 +619,46 @@ int32_t tscToSQLCmd(SSqlObj* pSql, struct SSqlInfo* pInfo) {
case
TSDB_SQL_SELECT
:
{
const
char
*
msg1
=
"columns in select clause not identical"
;
size_t
size
=
taosArrayGetSize
(
pInfo
->
list
);
for
(
int32_t
i
=
pCmd
->
numOfClause
;
i
<
size
;
++
i
)
{
SQueryInfo
*
p
=
tscGetQueryInfoS
(
pCmd
,
i
);
if
(
p
==
NULL
)
{
pRes
->
code
=
terrno
;
return
pRes
->
code
;
}
SQueryInfo
*
pCurrent
=
pCmd
->
pQueryInfo
;
for
(
int32_t
i
=
0
;
i
<
pCmd
->
clauseIndex
;
++
i
)
{
pCurrent
=
pCurrent
->
sibling
;
}
assert
(
pCmd
->
numOfClause
==
size
);
size_t
size
=
taosArrayGetSize
(
pInfo
->
list
);
for
(
int32_t
i
=
pCmd
->
clauseIndex
;
i
<
size
;
++
i
)
{
SSqlNode
*
pSqlNode
=
taosArrayGetP
(
pInfo
->
list
,
i
);
tscTrace
(
"%p start to parse %dth subclause, total:%d"
,
pSql
,
i
,
(
int32_t
)
size
);
if
((
code
=
validateSqlNode
(
pSql
,
pSqlNode
,
i
))
!=
TSDB_CODE_SUCCESS
)
{
if
((
code
=
validateSqlNode
(
pSql
,
pSqlNode
,
pCurrent
))
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
}
tscPrintSelNodeList
(
pSql
,
i
);
pCmd
->
clauseIndex
+=
1
;
if
(
i
+
1
<
size
&&
pCurrent
->
sibling
==
NULL
)
{
if
((
code
=
tscAddQueryInfo
(
pCmd
))
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
}
pCurrent
=
pCmd
->
active
;
}
}
// restore the clause index
pCmd
->
clauseIndex
=
0
;
// set the command/global limit parameters from the first subclause to the sqlcmd object
SQueryInfo
*
pQueryInfo1
=
tscGetQueryInfo
(
pCmd
,
0
)
;
pCmd
->
command
=
p
QueryInfo1
->
command
;
pCmd
->
active
=
pCmd
->
pQueryInfo
;
pCmd
->
command
=
p
Cmd
->
pQueryInfo
->
command
;
// if there is only one element, the limit of clause is the limit of global result.
// validate the select node for "UNION ALL" subclause
for
(
int32_t
i
=
1
;
i
<
pCmd
->
numOfClause
;
++
i
)
{
SQueryInfo
*
pQueryInfo2
=
tscGetQueryInfo
(
pCmd
,
i
);
int32_t
ret
=
tscFieldInfoCompare
(
&
pQueryInfo1
->
fieldsInfo
,
&
pQueryInfo2
->
fieldsInfo
);
SQueryInfo
*
pQueryInfo1
=
pCmd
->
pQueryInfo
;
while
(
pQueryInfo1
->
sibling
!=
NULL
)
{
int32_t
ret
=
tscFieldInfoCompare
(
&
pQueryInfo1
->
fieldsInfo
,
&
pQueryInfo1
->
sibling
->
fieldsInfo
);
if
(
ret
!=
0
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg1
);
}
pQueryInfo1
=
pQueryInfo1
->
sibling
;
}
pCmd
->
parseFinished
=
1
;
...
...
@@ -707,10 +711,10 @@ int32_t tscToSQLCmd(SSqlObj* pSql, struct SSqlInfo* pInfo) {
* are available.
*/
static
bool
isTopBottomQuery
(
SQueryInfo
*
pQueryInfo
)
{
size_t
size
=
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
size_t
size
=
tscNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
int32_t
functionId
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
)
->
base
.
functionId
;
int32_t
functionId
=
tscExprGet
(
pQueryInfo
,
i
)
->
base
.
functionId
;
if
(
functionId
==
TSDB_FUNC_TOP
||
functionId
==
TSDB_FUNC_BOTTOM
)
{
return
true
;
...
...
@@ -722,7 +726,7 @@ static bool isTopBottomQuery(SQueryInfo* pQueryInfo) {
// need to add timestamp column in result set, if it is a time window query
static
int32_t
addPrimaryTsColumnForTimeWindowQuery
(
SQueryInfo
*
pQueryInfo
)
{
uint64_t
uid
=
tsc
Sql
ExprGet
(
pQueryInfo
,
0
)
->
base
.
uid
;
uint64_t
uid
=
tscExprGet
(
pQueryInfo
,
0
)
->
base
.
uid
;
int32_t
tableIndex
=
COLUMN_INDEX_INITIAL_VAL
;
for
(
int32_t
i
=
0
;
i
<
pQueryInfo
->
numOfTables
;
++
i
)
{
...
...
@@ -767,9 +771,9 @@ static int32_t checkInvalidExprForTimeWindow(SSqlCmd* pCmd, SQueryInfo* pQueryIn
* invalid sql:
* select count(tbname)/count(tag1)/count(tag2) from super_table_name [interval(1d)|session(ts, 1d)];
*/
size_t
size
=
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
size_t
size
=
tscNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
base
.
functionId
==
TSDB_FUNC_COUNT
&&
TSDB_COL_IS_TAG
(
pExpr
->
base
.
colInfo
.
flag
))
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg1
);
}
...
...
@@ -1193,8 +1197,6 @@ bool validateOneTags(SSqlCmd* pCmd, TAOS_FIELD* pTagField) {
const
char
*
msg5
=
"invalid binary/nchar tag length"
;
const
char
*
msg6
=
"invalid data type in tags"
;
assert
(
pCmd
->
numOfClause
==
1
);
STableMetaInfo
*
pTableMetaInfo
=
tscGetTableMetaInfoFromCmd
(
pCmd
,
pCmd
->
clauseIndex
,
0
);
STableMeta
*
pTableMeta
=
pTableMetaInfo
->
pTableMeta
;
...
...
@@ -1267,7 +1269,7 @@ bool validateOneColumn(SSqlCmd* pCmd, TAOS_FIELD* pColField) {
const
char
*
msg5
=
"invalid column name"
;
const
char
*
msg6
=
"invalid column length"
;
assert
(
pCmd
->
numOfClause
==
1
);
//
assert(pCmd->numOfClause == 1);
STableMetaInfo
*
pTableMetaInfo
=
tscGetTableMetaInfoFromCmd
(
pCmd
,
pCmd
->
clauseIndex
,
0
);
STableMeta
*
pTableMeta
=
pTableMetaInfo
->
pTableMeta
;
...
...
@@ -1434,7 +1436,7 @@ static int32_t handleArithmeticExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32
// expr string is set as the parameter of function
SColumnIndex
index
=
{.
tableIndex
=
tableIndex
};
SExprInfo
*
pExpr
=
tsc
Sql
ExprAppend
(
pQueryInfo
,
TSDB_FUNC_ARITHM
,
&
index
,
TSDB_DATA_TYPE_DOUBLE
,
sizeof
(
double
),
SExprInfo
*
pExpr
=
tscExprAppend
(
pQueryInfo
,
TSDB_FUNC_ARITHM
,
&
index
,
TSDB_DATA_TYPE_DOUBLE
,
sizeof
(
double
),
getNewResColId
(
pQueryInfo
),
sizeof
(
double
),
false
);
char
*
name
=
(
pItem
->
aliasName
!=
NULL
)
?
pItem
->
aliasName
:
pItem
->
pNode
->
token
.
z
;
...
...
@@ -1477,7 +1479,7 @@ static int32_t handleArithmeticExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32
char
*
c
=
tbufGetData
(
&
bw
,
false
);
// set the serialized binary string as the parameter of arithmetic expression
addExpr
Params
(
&
pExpr
->
base
,
c
,
TSDB_DATA_TYPE_BINARY
,
(
int32_t
)
len
);
tscExprAdd
Params
(
&
pExpr
->
base
,
c
,
TSDB_DATA_TYPE_BINARY
,
(
int32_t
)
len
);
insertResultField
(
pQueryInfo
,
exprIndex
,
&
columnList
,
sizeof
(
double
),
TSDB_DATA_TYPE_DOUBLE
,
pExpr
->
base
.
aliasName
,
pExpr
);
// add ts column
...
...
@@ -1490,40 +1492,37 @@ static int32_t handleArithmeticExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32
columnList
.
num
=
0
;
columnList
.
ids
[
0
]
=
(
SColumnIndex
)
{
0
,
0
};
char
rawName
[
TSDB_COL_NAME_LEN
]
=
{
0
};
char
aliasName
[
TSDB_COL_NAME_LEN
]
=
{
0
};
if
(
pItem
->
aliasName
!=
NULL
)
{
tstrncpy
(
aliasName
,
pItem
->
aliasName
,
TSDB_COL_NAME_LEN
);
}
else
{
int32_t
nameLen
=
MIN
(
TSDB_COL_NAME_LEN
,
pItem
->
pNode
->
token
.
n
+
1
);
tstrncpy
(
aliasName
,
pItem
->
pNode
->
token
.
z
,
nameLen
);
}
getColumnName
(
pItem
,
aliasName
,
rawName
,
TSDB_COL_NAME_LEN
);
insertResultField
(
pQueryInfo
,
exprIndex
,
&
columnList
,
sizeof
(
double
),
TSDB_DATA_TYPE_DOUBLE
,
aliasName
,
NULL
);
int32_t
slot
=
tscNumOfFields
(
pQueryInfo
)
-
1
;
SInternalField
*
pInfo
=
tscFieldInfoGetInternalField
(
&
pQueryInfo
->
fieldsInfo
,
slot
);
assert
(
pInfo
->
pExpr
==
NULL
);
if
(
pInfo
->
pExpr
==
NULL
)
{
SExprInfo
*
pExprInfo
=
calloc
(
1
,
sizeof
(
SExprInfo
));
SExprInfo
*
pExprInfo
=
calloc
(
1
,
sizeof
(
SExprInfo
));
// arithmetic expression always return result in the format of double float
pExprInfo
->
base
.
resBytes
=
sizeof
(
double
);
pExprInfo
->
base
.
interBytes
=
sizeof
(
double
);
pExprInfo
->
base
.
resType
=
TSDB_DATA_TYPE_DOUBLE
;
// arithmetic expression always return result in the format of double float
pExprInfo
->
base
.
resBytes
=
sizeof
(
double
);
pExprInfo
->
base
.
interBytes
=
sizeof
(
double
);
pExprInfo
->
base
.
resType
=
TSDB_DATA_TYPE_DOUBLE
;
pExprInfo
->
base
.
functionId
=
TSDB_FUNC_ARITHM
;
pExprInfo
->
base
.
numOfParams
=
1
;
pExprInfo
->
base
.
resColId
=
getNewResColId
(
pQueryInfo
);
int32_t
ret
=
exprTreeFromSqlExpr
(
pCmd
,
&
pExprInfo
->
pExpr
,
pItem
->
pNode
,
pQueryInfo
,
NULL
,
&
(
pExprInfo
->
base
.
uid
));
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
tExprTreeDestroy
(
pExprInfo
->
pExpr
,
NULL
);
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
"invalid expression in select clause"
);
}
pExprInfo
->
base
.
functionId
=
TSDB_FUNC_ARITHM
;
pExprInfo
->
base
.
numOfParams
=
1
;
pExprInfo
->
base
.
resColId
=
getNewResColId
(
pQueryInfo
);
strncpy
(
pExprInfo
->
base
.
aliasName
,
aliasName
,
tListLen
(
pExprInfo
->
base
.
aliasName
));
strncpy
(
pExprInfo
->
base
.
token
,
rawName
,
tListLen
(
pExprInfo
->
base
.
token
));
pInfo
->
pExpr
=
pExprInfo
;
int32_t
ret
=
exprTreeFromSqlExpr
(
pCmd
,
&
pExprInfo
->
pExpr
,
pItem
->
pNode
,
pQueryInfo
,
NULL
,
&
(
pExprInfo
->
base
.
uid
));
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
tExprTreeDestroy
(
pExprInfo
->
pExpr
,
NULL
);
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
"invalid expression in select clause"
);
}
pInfo
->
pExpr
=
pExprInfo
;
SBufferWriter
bw
=
tbufInitWriter
(
NULL
,
false
);
TRY
(
0
)
{
...
...
@@ -1570,9 +1569,9 @@ static void addProjectQueryCol(SQueryInfo* pQueryInfo, int32_t startPos, SColumn
static
void
addPrimaryTsColIntoResult
(
SQueryInfo
*
pQueryInfo
)
{
// primary timestamp column has been added already
size_t
size
=
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
size_t
size
=
tscNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
base
.
functionId
==
TSDB_FUNC_PRJ
&&
pExpr
->
base
.
colInfo
.
colId
==
PRIMARYKEY_TIMESTAMP_COL_INDEX
)
{
return
;
}
...
...
@@ -1585,7 +1584,7 @@ static void addPrimaryTsColIntoResult(SQueryInfo* pQueryInfo) {
// add the timestamp column into the output columns
SColumnIndex
index
=
{
0
};
// primary timestamp column info
int32_t
numOfCols
=
(
int32_t
)
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
int32_t
numOfCols
=
(
int32_t
)
tscNumOfExprs
(
pQueryInfo
);
tscAddFuncInSelectClause
(
pQueryInfo
,
numOfCols
,
TSDB_FUNC_PRJ
,
&
index
,
pSchema
,
TSDB_COL_NORMAL
);
SInternalField
*
pSupInfo
=
tscFieldInfoGetInternalField
(
&
pQueryInfo
->
fieldsInfo
,
numOfCols
);
...
...
@@ -1601,7 +1600,7 @@ bool isValidDistinctSql(SQueryInfo* pQueryInfo) {
if
((
pQueryInfo
->
type
&
TSDB_QUERY_TYPE_STABLE_QUERY
)
!=
TSDB_QUERY_TYPE_STABLE_QUERY
)
{
return
false
;
}
if
(
tscQueryTags
(
pQueryInfo
)
&&
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
)
==
1
){
if
(
tscQueryTags
(
pQueryInfo
)
&&
tscNumOfExprs
(
pQueryInfo
)
==
1
){
return
true
;
}
return
false
;
...
...
@@ -1629,7 +1628,7 @@ int32_t validateSelectNodeList(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SArray* pS
bool
hasDistinct
=
false
;
size_t
numOfExpr
=
taosArrayGetSize
(
pSelNodeList
);
for
(
int32_t
i
=
0
;
i
<
numOfExpr
;
++
i
)
{
int32_t
outputIndex
=
(
int32_t
)
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
int32_t
outputIndex
=
(
int32_t
)
tscNumOfExprs
(
pQueryInfo
);
tSqlExprItem
*
pItem
=
taosArrayGet
(
pSelNodeList
,
i
);
if
(
hasDistinct
==
false
)
{
...
...
@@ -1728,7 +1727,7 @@ SExprInfo* doAddProjectCol(SQueryInfo* pQueryInfo, int32_t colIndex, int32_t tab
}
int16_t
colId
=
getNewResColId
(
pQueryInfo
);
return
tsc
Sql
ExprAppend
(
pQueryInfo
,
functionId
,
&
index
,
pSchema
->
type
,
pSchema
->
bytes
,
colId
,
pSchema
->
bytes
,
return
tscExprAppend
(
pQueryInfo
,
functionId
,
&
index
,
pSchema
->
type
,
pSchema
->
bytes
,
colId
,
pSchema
->
bytes
,
(
functionId
==
TSDB_FUNC_TAGPRJ
));
}
...
...
@@ -1736,9 +1735,10 @@ SExprInfo* tscAddFuncInSelectClause(SQueryInfo* pQueryInfo, int32_t outputColInd
SColumnIndex
*
pIndex
,
SSchema
*
pColSchema
,
int16_t
flag
)
{
int16_t
colId
=
getNewResColId
(
pQueryInfo
);
SExprInfo
*
pExpr
=
tsc
Sql
ExprInsert
(
pQueryInfo
,
outputColIndex
,
functionId
,
pIndex
,
pColSchema
->
type
,
SExprInfo
*
pExpr
=
tscExprInsert
(
pQueryInfo
,
outputColIndex
,
functionId
,
pIndex
,
pColSchema
->
type
,
pColSchema
->
bytes
,
colId
,
pColSchema
->
bytes
,
TSDB_COL_IS_TAG
(
flag
));
tstrncpy
(
pExpr
->
base
.
aliasName
,
pColSchema
->
name
,
sizeof
(
pExpr
->
base
.
aliasName
));
tstrncpy
(
pExpr
->
base
.
token
,
pColSchema
->
name
,
sizeof
(
pExpr
->
base
.
token
));
SColumnList
ids
=
createColumnList
(
1
,
pIndex
->
tableIndex
,
pIndex
->
columnIndex
);
if
(
TSDB_COL_IS_TAG
(
flag
))
{
...
...
@@ -1791,7 +1791,7 @@ int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, t
const
char
*
msg0
=
"invalid column name"
;
const
char
*
msg1
=
"tag for normal table query is not allowed"
;
int32_t
startPos
=
(
int32_t
)
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
int32_t
startPos
=
(
int32_t
)
tscNumOfExprs
(
pQueryInfo
);
int32_t
optr
=
pItem
->
pNode
->
tokenId
;
if
(
optr
==
TK_ALL
)
{
// project on all fields
...
...
@@ -1889,7 +1889,7 @@ static int32_t setExprInfoForFunctions(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SS
bytes
=
pSchema
->
bytes
;
}
SExprInfo
*
pExpr
=
tsc
Sql
ExprAppend
(
pQueryInfo
,
functionID
,
pColIndex
,
type
,
bytes
,
getNewResColId
(
pQueryInfo
),
bytes
,
false
);
SExprInfo
*
pExpr
=
tscExprAppend
(
pQueryInfo
,
functionID
,
pColIndex
,
type
,
bytes
,
getNewResColId
(
pQueryInfo
),
bytes
,
false
);
tstrncpy
(
pExpr
->
base
.
aliasName
,
name
,
tListLen
(
pExpr
->
base
.
aliasName
));
if
(
cvtFunc
.
originFuncId
==
TSDB_FUNC_LAST_ROW
&&
cvtFunc
.
originFuncId
!=
functionID
)
{
...
...
@@ -1943,9 +1943,9 @@ void setResultColName(char* name, tSqlExprItem* pItem, int32_t functionId, SStrT
static
void
updateLastScanOrderIfNeeded
(
SQueryInfo
*
pQueryInfo
)
{
if
(
pQueryInfo
->
sessionWindow
.
gap
>
0
||
tscGroupbyColumn
(
pQueryInfo
))
{
size_t
numOfExpr
=
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
size_t
numOfExpr
=
tscNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
numOfExpr
;
++
i
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
base
.
functionId
!=
TSDB_FUNC_LAST
&&
pExpr
->
base
.
functionId
!=
TSDB_FUNC_LAST_DST
)
{
continue
;
}
...
...
@@ -1984,14 +1984,14 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
if
(
pItem
->
pNode
->
pParam
!=
NULL
)
{
tSqlExprItem
*
pParamElem
=
taosArrayGet
(
pItem
->
pNode
->
pParam
,
0
);
SStrToken
*
pToken
=
&
pParamElem
->
pNode
->
colInfo
;
int16_t
sqlOptr
=
pParamElem
->
pNode
->
tokenId
;
if
((
pToken
->
z
==
NULL
||
pToken
->
n
==
0
)
&&
(
TK_INTEGER
!=
sqlOptr
))
/*select count(1) from table*/
{
int16_t
tokenId
=
pParamElem
->
pNode
->
tokenId
;
if
((
pToken
->
z
==
NULL
||
pToken
->
n
==
0
)
&&
(
TK_INTEGER
!=
tokenId
))
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg3
);
}
if
(
sqlOptr
==
TK_ALL
)
{
// select table.*
// select count(table.*)
// select count(1)|count(2)
if
(
tokenId
==
TK_ALL
||
tokenId
==
TK_INTEGER
)
{
// check if the table name is valid or not
SStrToken
tmpToken
=
pParamElem
->
pNode
->
colInfo
;
...
...
@@ -2001,24 +2001,9 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
index
=
(
SColumnIndex
){
0
,
PRIMARYKEY_TIMESTAMP_COL_INDEX
};
int32_t
size
=
tDataTypes
[
TSDB_DATA_TYPE_BIGINT
].
bytes
;
pExpr
=
tscSqlExprAppend
(
pQueryInfo
,
functionId
,
&
index
,
TSDB_DATA_TYPE_BIGINT
,
size
,
getNewResColId
(
pQueryInfo
),
size
,
false
);
}
else
if
(
sqlOptr
==
TK_INTEGER
)
{
// select count(1) from table1
char
buf
[
8
]
=
{
0
};
int64_t
val
=
-
1
;
tVariant
*
pVariant
=
&
pParamElem
->
pNode
->
value
;
if
(
pVariant
->
nType
==
TSDB_DATA_TYPE_BIGINT
)
{
tVariantDump
(
pVariant
,
buf
,
TSDB_DATA_TYPE_BIGINT
,
true
);
val
=
GET_INT64_VAL
(
buf
);
}
if
(
val
==
1
)
{
index
=
(
SColumnIndex
){
0
,
PRIMARYKEY_TIMESTAMP_COL_INDEX
};
int32_t
size
=
tDataTypes
[
TSDB_DATA_TYPE_BIGINT
].
bytes
;
pExpr
=
tscSqlExprAppend
(
pQueryInfo
,
functionId
,
&
index
,
TSDB_DATA_TYPE_BIGINT
,
size
,
getNewResColId
(
pQueryInfo
),
size
,
false
);
}
else
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg3
);
}
pExpr
=
tscExprAppend
(
pQueryInfo
,
functionId
,
&
index
,
TSDB_DATA_TYPE_BIGINT
,
size
,
getNewResColId
(
pQueryInfo
),
size
,
false
);
}
else
{
// count the number of
meters
created according to the super table
// count the number of
table
created according to the super table
if
(
getColumnIndexByName
(
pCmd
,
pToken
,
pQueryInfo
,
&
index
)
!=
TSDB_CODE_SUCCESS
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg3
);
}
...
...
@@ -2033,18 +2018,18 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
}
int32_t
size
=
tDataTypes
[
TSDB_DATA_TYPE_BIGINT
].
bytes
;
pExpr
=
tsc
Sql
ExprAppend
(
pQueryInfo
,
functionId
,
&
index
,
TSDB_DATA_TYPE_BIGINT
,
size
,
getNewResColId
(
pQueryInfo
),
size
,
isTag
);
pExpr
=
tscExprAppend
(
pQueryInfo
,
functionId
,
&
index
,
TSDB_DATA_TYPE_BIGINT
,
size
,
getNewResColId
(
pQueryInfo
),
size
,
isTag
);
}
}
else
{
// count(*) is equalled to count(primary_timestamp_key)
index
=
(
SColumnIndex
){
0
,
PRIMARYKEY_TIMESTAMP_COL_INDEX
};
int32_t
size
=
tDataTypes
[
TSDB_DATA_TYPE_BIGINT
].
bytes
;
pExpr
=
tsc
Sql
ExprAppend
(
pQueryInfo
,
functionId
,
&
index
,
TSDB_DATA_TYPE_BIGINT
,
size
,
getNewResColId
(
pQueryInfo
),
size
,
false
);
pExpr
=
tscExprAppend
(
pQueryInfo
,
functionId
,
&
index
,
TSDB_DATA_TYPE_BIGINT
,
size
,
getNewResColId
(
pQueryInfo
),
size
,
false
);
}
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
index
.
tableIndex
);
memset
(
pExpr
->
base
.
aliasName
,
0
,
tListLen
(
pExpr
->
base
.
aliasName
));
getColumnName
(
pItem
,
pExpr
->
base
.
aliasName
,
sizeof
(
pExpr
->
base
.
aliasName
)
-
1
);
getColumnName
(
pItem
,
pExpr
->
base
.
aliasName
,
pExpr
->
base
.
token
,
sizeof
(
pExpr
->
base
.
aliasName
)
-
1
);
SColumnList
list
=
createColumnList
(
1
,
index
.
tableIndex
,
index
.
columnIndex
);
if
(
finalResult
)
{
...
...
@@ -2123,7 +2108,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
if
(
functionId
==
TSDB_FUNC_DIFF
)
{
colIndex
+=
1
;
SColumnIndex
indexTS
=
{.
tableIndex
=
index
.
tableIndex
,
.
columnIndex
=
0
};
SExprInfo
*
pExpr
=
tsc
Sql
ExprAppend
(
pQueryInfo
,
TSDB_FUNC_TS_DUMMY
,
&
indexTS
,
TSDB_DATA_TYPE_TIMESTAMP
,
TSDB_KEYSIZE
,
SExprInfo
*
pExpr
=
tscExprAppend
(
pQueryInfo
,
TSDB_FUNC_TS_DUMMY
,
&
indexTS
,
TSDB_DATA_TYPE_TIMESTAMP
,
TSDB_KEYSIZE
,
getNewResColId
(
pQueryInfo
),
TSDB_KEYSIZE
,
false
);
SColumnList
ids
=
createColumnList
(
1
,
0
,
0
);
...
...
@@ -2135,7 +2120,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg6
);
}
SExprInfo
*
pExpr
=
tsc
Sql
ExprAppend
(
pQueryInfo
,
functionId
,
&
index
,
resultType
,
resultSize
,
getNewResColId
(
pQueryInfo
),
resultSize
,
false
);
SExprInfo
*
pExpr
=
tscExprAppend
(
pQueryInfo
,
functionId
,
&
index
,
resultType
,
resultSize
,
getNewResColId
(
pQueryInfo
),
resultSize
,
false
);
if
(
functionId
==
TSDB_FUNC_LEASTSQR
)
{
/* set the leastsquares parameters */
...
...
@@ -2144,20 +2129,20 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
return
TSDB_CODE_TSC_INVALID_SQL
;
}
addExpr
Params
(
&
pExpr
->
base
,
val
,
TSDB_DATA_TYPE_DOUBLE
,
DOUBLE_BYTES
);
tscExprAdd
Params
(
&
pExpr
->
base
,
val
,
TSDB_DATA_TYPE_DOUBLE
,
DOUBLE_BYTES
);
memset
(
val
,
0
,
tListLen
(
val
));
if
(
tVariantDump
(
&
pParamElem
[
2
].
pNode
->
value
,
val
,
TSDB_DATA_TYPE_DOUBLE
,
true
)
<
0
)
{
return
TSDB_CODE_TSC_INVALID_SQL
;
}
addExpr
Params
(
&
pExpr
->
base
,
val
,
TSDB_DATA_TYPE_DOUBLE
,
sizeof
(
double
));
tscExprAdd
Params
(
&
pExpr
->
base
,
val
,
TSDB_DATA_TYPE_DOUBLE
,
sizeof
(
double
));
}
SColumnList
ids
=
createColumnList
(
1
,
index
.
tableIndex
,
index
.
columnIndex
);
memset
(
pExpr
->
base
.
aliasName
,
0
,
tListLen
(
pExpr
->
base
.
aliasName
));
getColumnName
(
pItem
,
pExpr
->
base
.
aliasName
,
sizeof
(
pExpr
->
base
.
aliasName
)
-
1
);
getColumnName
(
pItem
,
pExpr
->
base
.
aliasName
,
pExpr
->
base
.
token
,
sizeof
(
pExpr
->
base
.
aliasName
)
-
1
);
if
(
finalResult
)
{
int32_t
numOfOutput
=
tscNumOfFields
(
pQueryInfo
);
...
...
@@ -2349,8 +2334,8 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
tscInsertPrimaryTsSourceColumn
(
pQueryInfo
,
pTableMetaInfo
->
pTableMeta
->
id
.
uid
);
colIndex
+=
1
;
// the first column is ts
pExpr
=
tsc
Sql
ExprAppend
(
pQueryInfo
,
functionId
,
&
index
,
resultType
,
resultSize
,
getNewResColId
(
pQueryInfo
),
resultSize
,
false
);
addExpr
Params
(
&
pExpr
->
base
,
val
,
TSDB_DATA_TYPE_DOUBLE
,
sizeof
(
double
));
pExpr
=
tscExprAppend
(
pQueryInfo
,
functionId
,
&
index
,
resultType
,
resultSize
,
getNewResColId
(
pQueryInfo
),
resultSize
,
false
);
tscExprAdd
Params
(
&
pExpr
->
base
,
val
,
TSDB_DATA_TYPE_DOUBLE
,
sizeof
(
double
));
}
else
{
tVariantDump
(
pVariant
,
val
,
TSDB_DATA_TYPE_BIGINT
,
true
);
...
...
@@ -2362,7 +2347,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
// todo REFACTOR
// set the first column ts for top/bottom query
SColumnIndex
index1
=
{
index
.
tableIndex
,
PRIMARYKEY_TIMESTAMP_COL_INDEX
};
pExpr
=
tsc
Sql
ExprAppend
(
pQueryInfo
,
TSDB_FUNC_TS
,
&
index1
,
TSDB_DATA_TYPE_TIMESTAMP
,
TSDB_KEYSIZE
,
getNewResColId
(
pQueryInfo
),
pExpr
=
tscExprAppend
(
pQueryInfo
,
TSDB_FUNC_TS
,
&
index1
,
TSDB_DATA_TYPE_TIMESTAMP
,
TSDB_KEYSIZE
,
getNewResColId
(
pQueryInfo
),
TSDB_KEYSIZE
,
false
);
tstrncpy
(
pExpr
->
base
.
aliasName
,
aAggs
[
TSDB_FUNC_TS
].
name
,
sizeof
(
pExpr
->
base
.
aliasName
));
...
...
@@ -2373,12 +2358,12 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
colIndex
+=
1
;
// the first column is ts
pExpr
=
tsc
Sql
ExprAppend
(
pQueryInfo
,
functionId
,
&
index
,
resultType
,
resultSize
,
getNewResColId
(
pQueryInfo
),
resultSize
,
false
);
addExpr
Params
(
&
pExpr
->
base
,
val
,
TSDB_DATA_TYPE_BIGINT
,
sizeof
(
int64_t
));
pExpr
=
tscExprAppend
(
pQueryInfo
,
functionId
,
&
index
,
resultType
,
resultSize
,
getNewResColId
(
pQueryInfo
),
resultSize
,
false
);
tscExprAdd
Params
(
&
pExpr
->
base
,
val
,
TSDB_DATA_TYPE_BIGINT
,
sizeof
(
int64_t
));
}
memset
(
pExpr
->
base
.
aliasName
,
0
,
tListLen
(
pExpr
->
base
.
aliasName
));
getColumnName
(
pItem
,
pExpr
->
base
.
aliasName
,
sizeof
(
pExpr
->
base
.
aliasName
)
-
1
);
getColumnName
(
pItem
,
pExpr
->
base
.
aliasName
,
pExpr
->
base
.
token
,
sizeof
(
pExpr
->
base
.
aliasName
)
-
1
);
// todo refactor: tscColumnListInsert part
SColumnList
ids
=
createColumnList
(
1
,
index
.
tableIndex
,
index
.
columnIndex
);
...
...
@@ -2508,12 +2493,14 @@ static SColumnList createColumnList(int32_t num, int16_t tableIndex, int32_t col
return
columnList
;
}
void
getColumnName
(
tSqlExprItem
*
pItem
,
char
*
resultFieldName
,
int32_t
nameLength
)
{
void
getColumnName
(
tSqlExprItem
*
pItem
,
char
*
resultFieldName
,
char
*
rawName
,
int32_t
nameLength
)
{
int32_t
len
=
((
int32_t
)
pItem
->
pNode
->
token
.
n
<
nameLength
)
?
(
int32_t
)
pItem
->
pNode
->
token
.
n
:
nameLength
;
strncpy
(
rawName
,
pItem
->
pNode
->
token
.
z
,
len
);
if
(
pItem
->
aliasName
!=
NULL
)
{
strncpy
(
resultFieldName
,
pItem
->
aliasName
,
nameLength
);
strncpy
(
resultFieldName
,
pItem
->
aliasName
,
len
);
}
else
{
int32_t
len
=
((
int32_t
)
pItem
->
pNode
->
token
.
n
<
nameLength
)
?
(
int32_t
)
pItem
->
pNode
->
token
.
n
:
nameLength
;
strncpy
(
resultFieldName
,
pItem
->
pNode
->
token
.
z
,
len
);
strncpy
(
resultFieldName
,
rawName
,
len
);
}
}
...
...
@@ -2656,7 +2643,7 @@ int32_t getColumnIndexByName(SSqlCmd* pCmd, const SStrToken* pToken, SQueryInfo*
int32_t
setShowInfo
(
SSqlObj
*
pSql
,
struct
SSqlInfo
*
pInfo
)
{
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
STableMetaInfo
*
pTableMetaInfo
=
tscGetTableMetaInfoFromCmd
(
pCmd
,
pCmd
->
clauseIndex
,
0
);
assert
(
pCmd
->
numOfClause
==
1
);
//
assert(pCmd->numOfClause == 1);
pCmd
->
command
=
TSDB_SQL_SHOW
;
...
...
@@ -2793,9 +2780,9 @@ int32_t tscTansformFuncForSTableQuery(SQueryInfo* pQueryInfo) {
int16_t
type
=
0
;
int32_t
interBytes
=
0
;
size_t
size
=
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
size_t
size
=
tscNumOfExprs
(
pQueryInfo
);
for
(
int32_t
k
=
0
;
k
<
size
;
++
k
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
k
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
k
);
int16_t
functionId
=
aAggs
[
pExpr
->
base
.
functionId
].
stableFuncId
;
int32_t
colIndex
=
pExpr
->
base
.
colInfo
.
colIndex
;
...
...
@@ -2809,7 +2796,7 @@ int32_t tscTansformFuncForSTableQuery(SQueryInfo* pQueryInfo) {
return
TSDB_CODE_TSC_INVALID_SQL
;
}
tsc
Sql
ExprUpdate
(
pQueryInfo
,
k
,
functionId
,
pExpr
->
base
.
colInfo
.
colIndex
,
TSDB_DATA_TYPE_BINARY
,
bytes
);
tscExprUpdate
(
pQueryInfo
,
k
,
functionId
,
pExpr
->
base
.
colInfo
.
colIndex
,
TSDB_DATA_TYPE_BINARY
,
bytes
);
// todo refactor
pExpr
->
base
.
interBytes
=
interBytes
;
}
...
...
@@ -2826,9 +2813,9 @@ void tscRestoreFuncForSTableQuery(SQueryInfo* pQueryInfo) {
return
;
}
size_t
size
=
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
size_t
size
=
tscNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
i
);
SSchema
*
pSchema
=
tscGetTableColumnSchema
(
pTableMetaInfo
->
pTableMeta
,
pExpr
->
base
.
colInfo
.
colIndex
);
// the final result size and type in the same as query on single table.
...
...
@@ -2859,9 +2846,9 @@ bool hasUnsupportFunctionsForSTableQuery(SSqlCmd* pCmd, SQueryInfo* pQueryInfo)
const
char
*
msg3
=
"function not support for super table query"
;
// filter sql function not supported by metric query yet.
size_t
size
=
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
size_t
size
=
tscNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
int32_t
functionId
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
)
->
base
.
functionId
;
int32_t
functionId
=
tscExprGet
(
pQueryInfo
,
i
)
->
base
.
functionId
;
if
((
aAggs
[
functionId
].
status
&
TSDB_FUNCSTATE_STABLE
)
==
0
)
{
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg3
);
return
true
;
...
...
@@ -2909,10 +2896,10 @@ static bool groupbyTagsOrNull(SQueryInfo* pQueryInfo) {
static
bool
functionCompatibleCheck
(
SQueryInfo
*
pQueryInfo
,
bool
joinQuery
,
bool
twQuery
)
{
int32_t
startIdx
=
0
;
size_t
numOfExpr
=
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
size_t
numOfExpr
=
tscNumOfExprs
(
pQueryInfo
);
assert
(
numOfExpr
>
0
);
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
startIdx
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
startIdx
);
// ts function can be simultaneously used with any other functions.
int32_t
functionID
=
pExpr
->
base
.
functionId
;
...
...
@@ -2920,18 +2907,18 @@ static bool functionCompatibleCheck(SQueryInfo* pQueryInfo, bool joinQuery, bool
startIdx
++
;
}
int32_t
factor
=
functionCompatList
[
tsc
Sql
ExprGet
(
pQueryInfo
,
startIdx
)
->
base
.
functionId
];
int32_t
factor
=
functionCompatList
[
tscExprGet
(
pQueryInfo
,
startIdx
)
->
base
.
functionId
];
if
(
tsc
Sql
ExprGet
(
pQueryInfo
,
0
)
->
base
.
functionId
==
TSDB_FUNC_LAST_ROW
&&
(
joinQuery
||
twQuery
||
!
groupbyTagsOrNull
(
pQueryInfo
)))
{
if
(
tscExprGet
(
pQueryInfo
,
0
)
->
base
.
functionId
==
TSDB_FUNC_LAST_ROW
&&
(
joinQuery
||
twQuery
||
!
groupbyTagsOrNull
(
pQueryInfo
)))
{
return
false
;
}
// diff function cannot be executed with other function
// arithmetic function can be executed with other arithmetic functions
size_t
size
=
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
size_t
size
=
tscNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
startIdx
+
1
;
i
<
size
;
++
i
)
{
SExprInfo
*
pExpr1
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
);
SExprInfo
*
pExpr1
=
tscExprGet
(
pQueryInfo
,
i
);
int16_t
functionId
=
pExpr1
->
base
.
functionId
;
if
(
functionId
==
TSDB_FUNC_TAGPRJ
||
functionId
==
TSDB_FUNC_TAG
||
functionId
==
TSDB_FUNC_TS
)
{
...
...
@@ -3025,7 +3012,7 @@ int32_t validateGroupbyNode(SQueryInfo* pQueryInfo, SArray* pList, SSqlCmd* pCmd
groupTag
=
true
;
}
S
Sql
GroupbyExpr
*
pGroupExpr
=
&
pQueryInfo
->
groupbyExpr
;
SGroupbyExpr
*
pGroupExpr
=
&
pQueryInfo
->
groupbyExpr
;
if
(
pGroupExpr
->
columnInfo
==
NULL
)
{
pGroupExpr
->
columnInfo
=
taosArrayInit
(
4
,
sizeof
(
SColIndex
));
}
...
...
@@ -3041,6 +3028,7 @@ int32_t validateGroupbyNode(SQueryInfo* pQueryInfo, SArray* pList, SSqlCmd* pCmd
}
SColIndex
colIndex
=
{
.
colIndex
=
relIndex
,
.
flag
=
TSDB_COL_TAG
,
.
colId
=
pSchema
->
colId
,
};
strncpy
(
colIndex
.
name
,
pSchema
->
name
,
tListLen
(
colIndex
.
name
));
taosArrayPush
(
pGroupExpr
->
columnInfo
,
&
colIndex
);
index
.
columnIndex
=
relIndex
;
...
...
@@ -3054,6 +3042,8 @@ int32_t validateGroupbyNode(SQueryInfo* pQueryInfo, SArray* pList, SSqlCmd* pCmd
tscColumnListInsert
(
pQueryInfo
->
colList
,
index
.
columnIndex
,
pTableMeta
->
id
.
uid
,
pSchema
);
SColIndex
colIndex
=
{
.
colIndex
=
index
.
columnIndex
,
.
flag
=
TSDB_COL_NORMAL
,
.
colId
=
pSchema
->
colId
};
strncpy
(
colIndex
.
name
,
pSchema
->
name
,
tListLen
(
colIndex
.
name
));
taosArrayPush
(
pGroupExpr
->
columnInfo
,
&
colIndex
);
pQueryInfo
->
groupbyExpr
.
orderType
=
TSDB_ORDER_ASC
;
...
...
@@ -3510,7 +3500,7 @@ static int32_t validateSQLExpr(SSqlCmd* pCmd, tSqlExpr* pExpr, SQueryInfo* pQuer
return
TSDB_CODE_TSC_INVALID_SQL
;
}
int32_t
outputIndex
=
(
int32_t
)
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
int32_t
outputIndex
=
(
int32_t
)
tscNumOfExprs
(
pQueryInfo
);
tSqlExprItem
item
=
{.
pNode
=
pExpr
,
.
aliasName
=
NULL
};
...
...
@@ -3526,7 +3516,7 @@ static int32_t validateSQLExpr(SSqlCmd* pCmd, tSqlExpr* pExpr, SQueryInfo* pQuer
}
// It is invalid in case of more than one sqlExpr, such as first(ts, k) - last(ts, k)
int32_t
inc
=
(
int32_t
)
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
)
-
outputIndex
;
int32_t
inc
=
(
int32_t
)
tscNumOfExprs
(
pQueryInfo
)
-
outputIndex
;
if
(
inc
>
1
)
{
return
TSDB_CODE_TSC_INVALID_SQL
;
}
...
...
@@ -3534,7 +3524,7 @@ static int32_t validateSQLExpr(SSqlCmd* pCmd, tSqlExpr* pExpr, SQueryInfo* pQuer
// Not supported data type in arithmetic expression
uint64_t
id
=
-
1
;
for
(
int32_t
i
=
0
;
i
<
inc
;
++
i
)
{
SExprInfo
*
p1
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
+
outputIndex
);
SExprInfo
*
p1
=
tscExprGet
(
pQueryInfo
,
i
+
outputIndex
);
int16_t
t
=
p1
->
base
.
resType
;
if
(
t
==
TSDB_DATA_TYPE_BINARY
||
t
==
TSDB_DATA_TYPE_NCHAR
||
t
==
TSDB_DATA_TYPE_BOOL
||
t
==
TSDB_DATA_TYPE_TIMESTAMP
)
{
return
TSDB_CODE_TSC_INVALID_SQL
;
...
...
@@ -4826,9 +4816,9 @@ int32_t validateFillNode(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SSqlNode* pSqlNo
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg2
);
}
size_t
numOfExprs
=
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
size_t
numOfExprs
=
tscNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
base
.
functionId
==
TSDB_FUNC_TOP
||
pExpr
->
base
.
functionId
==
TSDB_FUNC_BOTTOM
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg3
);
}
...
...
@@ -4945,10 +4935,10 @@ int32_t validateOrderbyNode(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SSqlNode* pSq
pQueryInfo
->
groupbyExpr
.
orderType
=
p1
->
sortOrder
;
}
else
if
(
isTopBottomQuery
(
pQueryInfo
))
{
/* order of top/bottom query in interval is not valid */
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
0
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
0
);
assert
(
pExpr
->
base
.
functionId
==
TSDB_FUNC_TS
);
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
1
);
pExpr
=
tscExprGet
(
pQueryInfo
,
1
);
if
(
pExpr
->
base
.
colInfo
.
colIndex
!=
index
.
columnIndex
&&
index
.
columnIndex
!=
PRIMARYKEY_TIMESTAMP_COL_INDEX
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg2
);
}
...
...
@@ -5007,10 +4997,10 @@ int32_t validateOrderbyNode(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SSqlNode* pSq
if
(
isTopBottomQuery
(
pQueryInfo
))
{
/* order of top/bottom query in interval is not valid */
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
0
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
0
);
assert
(
pExpr
->
base
.
functionId
==
TSDB_FUNC_TS
);
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
1
);
pExpr
=
tscExprGet
(
pQueryInfo
,
1
);
if
(
pExpr
->
base
.
colInfo
.
colIndex
!=
index
.
columnIndex
&&
index
.
columnIndex
!=
PRIMARYKEY_TIMESTAMP_COL_INDEX
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg2
);
}
...
...
@@ -5322,7 +5312,7 @@ int32_t validateSqlFunctionInStreamSql(SSqlCmd* pCmd, SQueryInfo* pQueryInfo) {
size_t
size
=
taosArrayGetSize
(
pQueryInfo
->
exprList
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
int32_t
functId
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
)
->
base
.
functionId
;
int32_t
functId
=
tscExprGet
(
pQueryInfo
,
i
)
->
base
.
functionId
;
if
(
!
IS_STREAM_QUERY_VALID
(
aAggs
[
functId
].
status
))
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg1
);
}
...
...
@@ -5339,13 +5329,13 @@ int32_t validateFunctionsInIntervalOrGroupbyQuery(SSqlCmd* pCmd, SQueryInfo* pQu
size_t
size
=
taosArrayGetSize
(
pQueryInfo
->
exprList
);
for
(
int32_t
k
=
0
;
k
<
size
;
++
k
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
k
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
k
);
// projection query on primary timestamp, the selectivity function needs to be present.
if
(
pExpr
->
base
.
functionId
==
TSDB_FUNC_PRJ
&&
pExpr
->
base
.
colInfo
.
colId
==
PRIMARYKEY_TIMESTAMP_COL_INDEX
)
{
bool
hasSelectivity
=
false
;
for
(
int32_t
j
=
0
;
j
<
size
;
++
j
)
{
SExprInfo
*
pEx
=
tsc
Sql
ExprGet
(
pQueryInfo
,
j
);
SExprInfo
*
pEx
=
tscExprGet
(
pQueryInfo
,
j
);
if
((
aAggs
[
pEx
->
base
.
functionId
].
status
&
TSDB_FUNCSTATE_SELECTIVITY
)
==
TSDB_FUNCSTATE_SELECTIVITY
)
{
hasSelectivity
=
true
;
break
;
...
...
@@ -5553,7 +5543,7 @@ bool hasTimestampForPointInterpQuery(SQueryInfo* pQueryInfo) {
return
!
(
pQueryInfo
->
window
.
skey
!=
pQueryInfo
->
window
.
ekey
&&
pQueryInfo
->
interval
.
interval
==
0
);
}
int32_t
validateLimitNode
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
int32_t
clauseIndex
,
SSqlNode
*
pSqlNode
,
SSqlObj
*
pSql
)
{
int32_t
validateLimitNode
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
SSqlNode
*
pSqlNode
,
SSqlObj
*
pSql
)
{
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
const
char
*
msg0
=
"soffset/offset can not be less than 0"
;
...
...
@@ -5606,7 +5596,7 @@ int32_t validateLimitNode(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t clauseI
* And then launching multiple async-queries against all qualified virtual nodes, during the first-stage
* query operation.
*/
int32_t
code
=
tscGetSTableVgroupInfo
(
pSql
,
clauseIndex
);
int32_t
code
=
tscGetSTableVgroupInfo
(
pSql
,
pQueryInfo
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
}
...
...
@@ -5756,7 +5746,7 @@ void addGroupInfoForSubquery(SSqlObj* pParentObj, SSqlObj* pSql, int32_t subClau
size_t
size
=
taosArrayGetSize
(
pQueryInfo
->
exprList
);
if
(
size
>
0
)
{
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
(
int32_t
)
size
-
1
);
pExpr
=
tscExprGet
(
pQueryInfo
,
(
int32_t
)
size
-
1
);
}
if
(
pExpr
==
NULL
||
pExpr
->
base
.
functionId
!=
TSDB_FUNC_TAG
)
{
...
...
@@ -5773,7 +5763,7 @@ void addGroupInfoForSubquery(SSqlObj* pParentObj, SSqlObj* pSql, int32_t subClau
int16_t
type
=
pTagSchema
->
type
;
int16_t
bytes
=
pTagSchema
->
bytes
;
pExpr
=
tsc
Sql
ExprAppend
(
pQueryInfo
,
TSDB_FUNC_TAG
,
&
index
,
type
,
bytes
,
getNewResColId
(
pQueryInfo
),
bytes
,
true
);
pExpr
=
tscExprAppend
(
pQueryInfo
,
TSDB_FUNC_TAG
,
&
index
,
type
,
bytes
,
getNewResColId
(
pQueryInfo
),
bytes
,
true
);
pExpr
->
base
.
colInfo
.
flag
=
TSDB_COL_TAG
;
// NOTE: tag column does not add to source column list
...
...
@@ -5800,14 +5790,17 @@ static void doLimitOutputNormalColOfGroupby(SExprInfo* pExpr) {
void
doAddGroupColumnForSubquery
(
SQueryInfo
*
pQueryInfo
,
int32_t
tagIndex
)
{
SColIndex
*
pColIndex
=
taosArrayGet
(
pQueryInfo
->
groupbyExpr
.
columnInfo
,
tagIndex
);
size_t
size
=
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
size_t
size
=
tscNumOfExprs
(
pQueryInfo
);
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
SSchema
*
pSchema
=
tscGetTableColumnSchema
(
pTableMetaInfo
->
pTableMeta
,
pColIndex
->
colIndex
);
SColumnIndex
colIndex
=
{.
tableIndex
=
0
,
.
columnIndex
=
pColIndex
->
colIndex
};
tscAddFuncInSelectClause
(
pQueryInfo
,
(
int32_t
)
size
,
TSDB_FUNC_PRJ
,
&
colIndex
,
pSchema
,
TSDB_COL_NORMAL
);
SExprInfo
*
pExprInfo
=
tscAddFuncInSelectClause
(
pQueryInfo
,
(
int32_t
)
size
,
TSDB_FUNC_PRJ
,
&
colIndex
,
pSchema
,
TSDB_COL_NORMAL
);
strncpy
(
pExprInfo
->
base
.
token
,
pExprInfo
->
base
.
colInfo
.
name
,
tListLen
(
pExprInfo
->
base
.
token
));
int32_t
numOfFields
=
tscNumOfFields
(
pQueryInfo
);
SInternalField
*
pInfo
=
tscFieldInfoGetInternalField
(
&
pQueryInfo
->
fieldsInfo
,
numOfFields
-
1
);
...
...
@@ -5825,7 +5818,7 @@ static void doUpdateSqlFunctionForTagPrj(SQueryInfo* pQueryInfo) {
bool
isSTable
=
UTIL_TABLE_IS_SUPER_TABLE
(
pTableMetaInfo
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
base
.
functionId
==
TSDB_FUNC_TAGPRJ
||
pExpr
->
base
.
functionId
==
TSDB_FUNC_TAG
)
{
pExpr
->
base
.
functionId
=
TSDB_FUNC_TAG_DUMMY
;
tagLength
+=
pExpr
->
base
.
resBytes
;
...
...
@@ -5838,7 +5831,7 @@ static void doUpdateSqlFunctionForTagPrj(SQueryInfo* pQueryInfo) {
SSchema
*
pSchema
=
tscGetTableSchema
(
pTableMetaInfo
->
pTableMeta
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
i
);
if
((
pExpr
->
base
.
functionId
!=
TSDB_FUNC_TAG_DUMMY
&&
pExpr
->
base
.
functionId
!=
TSDB_FUNC_TS_DUMMY
)
&&
!
(
pExpr
->
base
.
functionId
==
TSDB_FUNC_PRJ
&&
TSDB_COL_IS_UD_COL
(
pExpr
->
base
.
colInfo
.
flag
)))
{
SSchema
*
pColSchema
=
&
pSchema
[
pExpr
->
base
.
colInfo
.
colIndex
];
...
...
@@ -5852,7 +5845,7 @@ static int32_t doUpdateSqlFunctionForColPrj(SQueryInfo* pQueryInfo) {
size_t
size
=
taosArrayGetSize
(
pQueryInfo
->
exprList
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
base
.
functionId
==
TSDB_FUNC_PRJ
&&
(
!
TSDB_COL_IS_UD_COL
(
pExpr
->
base
.
colInfo
.
flag
)
&&
(
pExpr
->
base
.
colInfo
.
colId
!=
PRIMARYKEY_TIMESTAMP_COL_INDEX
)))
{
bool
qualifiedCol
=
false
;
...
...
@@ -5877,7 +5870,7 @@ static int32_t doUpdateSqlFunctionForColPrj(SQueryInfo* pQueryInfo) {
return
TSDB_CODE_SUCCESS
;
}
static
bool
tagColumnInGroupby
(
S
Sql
GroupbyExpr
*
pGroupbyExpr
,
int16_t
columnId
)
{
static
bool
tagColumnInGroupby
(
SGroupbyExpr
*
pGroupbyExpr
,
int16_t
columnId
)
{
for
(
int32_t
j
=
0
;
j
<
pGroupbyExpr
->
numOfGroupCols
;
++
j
)
{
SColIndex
*
pColIndex
=
taosArrayGet
(
pGroupbyExpr
->
columnInfo
,
j
);
...
...
@@ -5895,7 +5888,7 @@ static bool onlyTagPrjFunction(SQueryInfo* pQueryInfo) {
size_t
size
=
taosArrayGetSize
(
pQueryInfo
->
exprList
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
base
.
functionId
==
TSDB_FUNC_PRJ
)
{
hasColumnPrj
=
true
;
}
else
if
(
pExpr
->
base
.
functionId
==
TSDB_FUNC_TAGPRJ
)
{
...
...
@@ -5910,9 +5903,9 @@ static bool onlyTagPrjFunction(SQueryInfo* pQueryInfo) {
static
bool
allTagPrjInGroupby
(
SQueryInfo
*
pQueryInfo
)
{
bool
allInGroupby
=
true
;
size_t
size
=
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
size_t
size
=
tscNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
base
.
functionId
!=
TSDB_FUNC_TAGPRJ
)
{
continue
;
}
...
...
@@ -5931,7 +5924,7 @@ static void updateTagPrjFunction(SQueryInfo* pQueryInfo) {
size_t
size
=
taosArrayGetSize
(
pQueryInfo
->
exprList
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
base
.
functionId
==
TSDB_FUNC_TAGPRJ
)
{
pExpr
->
base
.
functionId
=
TSDB_FUNC_TAG
;
}
...
...
@@ -6001,7 +5994,7 @@ static int32_t checkUpdateTagPrjFunctions(SQueryInfo* pQueryInfo, SSqlCmd* pCmd)
* Otherwise, return with error code.
*/
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
i
);
int16_t
functionId
=
pExpr
->
base
.
functionId
;
if
(
functionId
==
TSDB_FUNC_TAGPRJ
||
(
aAggs
[
functionId
].
status
&
TSDB_FUNCSTATE_SELECTIVITY
)
==
0
)
{
continue
;
...
...
@@ -6069,15 +6062,16 @@ static int32_t doAddGroupbyColumnsOnDemand(SSqlCmd* pCmd, SQueryInfo* pQueryInfo
}
}
size_t
size
=
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
size_t
size
=
tscNumOfExprs
(
pQueryInfo
);
if
(
TSDB_COL_IS_TAG
(
pColIndex
->
flag
))
{
SColumnIndex
index
=
{.
tableIndex
=
pQueryInfo
->
groupbyExpr
.
tableIndex
,
.
columnIndex
=
colIndex
};
SExprInfo
*
pExpr
=
tsc
Sql
ExprAppend
(
pQueryInfo
,
TSDB_FUNC_TAG
,
&
index
,
s
->
type
,
s
->
bytes
,
SExprInfo
*
pExpr
=
tscExprAppend
(
pQueryInfo
,
TSDB_FUNC_TAG
,
&
index
,
s
->
type
,
s
->
bytes
,
getNewResColId
(
pQueryInfo
),
s
->
bytes
,
true
);
memset
(
pExpr
->
base
.
aliasName
,
0
,
sizeof
(
pExpr
->
base
.
aliasName
));
tstrncpy
(
pExpr
->
base
.
aliasName
,
s
->
name
,
sizeof
(
pExpr
->
base
.
aliasName
));
tstrncpy
(
pExpr
->
base
.
token
,
s
->
name
,
sizeof
(
pExpr
->
base
.
aliasName
));
pExpr
->
base
.
colInfo
.
flag
=
TSDB_COL_TAG
;
...
...
@@ -6092,7 +6086,7 @@ static int32_t doAddGroupbyColumnsOnDemand(SSqlCmd* pCmd, SQueryInfo* pQueryInfo
bool
hasGroupColumn
=
false
;
for
(
int32_t
j
=
0
;
j
<
size
;
++
j
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
j
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
j
);
if
((
pExpr
->
base
.
functionId
==
TSDB_FUNC_PRJ
)
&&
pExpr
->
base
.
colInfo
.
colId
==
pColIndex
->
colId
)
{
hasGroupColumn
=
true
;
break
;
...
...
@@ -6113,10 +6107,10 @@ static int32_t doTagFunctionCheck(SQueryInfo* pQueryInfo) {
bool
tagProjection
=
false
;
bool
tableCounting
=
false
;
int32_t
numOfCols
=
(
int32_t
)
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
int32_t
numOfCols
=
(
int32_t
)
tscNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
numOfCols
;
++
i
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
i
);
int32_t
functionId
=
pExpr
->
base
.
functionId
;
if
(
functionId
==
TSDB_FUNC_TAGPRJ
)
{
...
...
@@ -6162,9 +6156,9 @@ int32_t doFunctionsCompatibleCheck(SSqlCmd* pCmd, SQueryInfo* pQueryInfo) {
}
// check all query functions in selection clause, multi-output functions are not allowed
size_t
size
=
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
size_t
size
=
tscNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
i
);
int32_t
functId
=
pExpr
->
base
.
functionId
;
/*
...
...
@@ -6271,7 +6265,7 @@ int32_t doLocalQueryProcess(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SSqlNode* pSq
}
SColumnIndex
ind
=
{
0
};
SExprInfo
*
pExpr1
=
tsc
Sql
ExprAppend
(
pQueryInfo
,
TSDB_FUNC_TAG_DUMMY
,
&
ind
,
TSDB_DATA_TYPE_INT
,
SExprInfo
*
pExpr1
=
tscExprAppend
(
pQueryInfo
,
TSDB_FUNC_TAG_DUMMY
,
&
ind
,
TSDB_DATA_TYPE_INT
,
tDataTypes
[
TSDB_DATA_TYPE_INT
].
bytes
,
getNewResColId
(
pQueryInfo
),
tDataTypes
[
TSDB_DATA_TYPE_INT
].
bytes
,
false
);
tSqlExprItem
*
item
=
taosArrayGet
(
pExprList
,
0
);
...
...
@@ -6368,7 +6362,7 @@ int32_t tscCheckCreateDbParams(SSqlCmd* pCmd, SCreateDbMsg* pCreate) {
void
tscPrintSelNodeList
(
SSqlObj
*
pSql
,
int32_t
subClauseIndex
)
{
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
subClauseIndex
);
int32_t
size
=
(
int32_t
)
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
int32_t
size
=
(
int32_t
)
tscNumOfExprs
(
pQueryInfo
);
if
(
size
==
0
)
{
return
;
}
...
...
@@ -6380,7 +6374,7 @@ void tscPrintSelNodeList(SSqlObj* pSql, int32_t subClauseIndex) {
offset
+=
sprintf
(
str
,
"num:%d ["
,
size
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
i
);
char
tmpBuf
[
1024
]
=
{
0
};
int32_t
tmpLen
=
0
;
...
...
@@ -6828,9 +6822,9 @@ int32_t tscGetExprFilters(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SArray* pSelect
getColumnIndexByName
(
pCmd
,
pToken
,
pQueryInfo
,
&
index
);
}
size_t
numOfNodeInSel
=
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
size_t
numOfNodeInSel
=
tscNumOfExprs
(
pQueryInfo
);
for
(
int32_t
k
=
0
;
k
<
numOfNodeInSel
;
++
k
)
{
SExprInfo
*
pExpr1
=
tsc
Sql
ExprGet
(
pQueryInfo
,
k
);
SExprInfo
*
pExpr1
=
tscExprGet
(
pQueryInfo
,
k
);
if
(
pExpr1
->
base
.
functionId
!=
functionId
)
{
continue
;
...
...
@@ -6852,7 +6846,7 @@ int32_t tscGetExprFilters(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SArray* pSelect
tSqlExprItem
item
=
{.
pNode
=
pSqlExpr
,
.
aliasName
=
NULL
,
.
distinct
=
false
};
int32_t
outputIndex
=
(
int32_t
)
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
int32_t
outputIndex
=
(
int32_t
)
tscNumOfExprs
(
pQueryInfo
);
// ADD TRUE FOR TEST
if
(
addExprAndResultField
(
pCmd
,
pQueryInfo
,
outputIndex
,
&
item
,
true
)
!=
TSDB_CODE_SUCCESS
)
{
...
...
@@ -6861,8 +6855,8 @@ int32_t tscGetExprFilters(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SArray* pSelect
++
pQueryInfo
->
havingFieldNum
;
size_t
n
=
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
(
int32_t
)
n
-
1
);
size_t
n
=
tscNumOfExprs
(
pQueryInfo
);
*
pExpr
=
tscExprGet
(
pQueryInfo
,
(
int32_t
)
n
-
1
);
SInternalField
*
pField
=
taosArrayGet
(
pQueryInfo
->
fieldsInfo
.
internalField
,
n
-
1
);
pField
->
visible
=
false
;
...
...
@@ -7072,7 +7066,7 @@ int32_t validateHavingClause(SQueryInfo* pQueryInfo, tSqlExpr* pExpr, SSqlCmd* p
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
doLoadAllTableMeta
(
SSqlObj
*
pSql
,
int32_t
index
,
SSqlNode
*
pSqlNode
,
int32_t
numOfTables
)
{
static
int32_t
doLoadAllTableMeta
(
SSqlObj
*
pSql
,
SQueryInfo
*
pQueryInfo
,
SSqlNode
*
pSqlNode
,
int32_t
numOfTables
)
{
const
char
*
msg1
=
"invalid table name"
;
const
char
*
msg2
=
"invalid table alias name"
;
const
char
*
msg3
=
"alias name too long"
;
...
...
@@ -7080,8 +7074,6 @@ static int32_t doLoadAllTableMeta(SSqlObj* pSql, int32_t index, SSqlNode* pSqlNo
int32_t
code
=
TSDB_CODE_SUCCESS
;
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
index
);
for
(
int32_t
i
=
0
;
i
<
numOfTables
;
++
i
)
{
if
(
pQueryInfo
->
numOfTables
<=
i
)
{
// more than one table
tscAddEmptyMetaInfo
(
pQueryInfo
);
...
...
@@ -7160,7 +7152,7 @@ static STableMeta* extractTempTableMetaFromNestQuery(SQueryInfo* pUpstream) {
return
meta
;
}
int32_t
validateSqlNode
(
SSqlObj
*
pSql
,
SSqlNode
*
pSqlNode
,
int32_t
index
)
{
int32_t
validateSqlNode
(
SSqlObj
*
pSql
,
SSqlNode
*
pSqlNode
,
SQueryInfo
*
pQueryInfo
)
{
assert
(
pSqlNode
!=
NULL
&&
(
pSqlNode
->
from
==
NULL
||
taosArrayGetSize
(
pSqlNode
->
from
->
list
)
>
0
));
const
char
*
msg1
=
"point interpolation query needs timestamp"
;
...
...
@@ -7171,14 +7163,11 @@ int32_t validateSqlNode(SSqlObj* pSql, SSqlNode* pSqlNode, int32_t index) {
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
index
);
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
if
(
pTableMetaInfo
==
NULL
)
{
pTableMetaInfo
=
tscAddEmptyMetaInfo
(
pQueryInfo
);
}
assert
(
pCmd
->
clauseIndex
==
index
);
/*
* handle the sql expression without from subclause
* select current_database();
...
...
@@ -7197,7 +7186,7 @@ int32_t validateSqlNode(SSqlObj* pSql, SSqlNode* pSqlNode, int32_t index) {
SArray
*
list
=
taosArrayGetP
(
pSqlNode
->
from
->
list
,
0
);
SSqlNode
*
p
=
taosArrayGetP
(
list
,
0
);
code
=
validateSqlNode
(
pSql
,
p
,
0
);
code
=
validateSqlNode
(
pSql
,
p
,
NULL
);
if
(
code
==
TSDB_CODE_TSC_ACTION_IN_PROGRESS
)
{
return
code
;
}
...
...
@@ -7206,7 +7195,7 @@ int32_t validateSqlNode(SSqlObj* pSql, SSqlNode* pSqlNode, int32_t index) {
return
code
;
}
pQueryInfo
=
pCmd
->
pQueryInfo
[
0
]
;
pQueryInfo
=
pCmd
->
pQueryInfo
;
SQueryInfo
*
current
=
calloc
(
1
,
sizeof
(
SQueryInfo
));
...
...
@@ -7222,7 +7211,7 @@ int32_t validateSqlNode(SSqlObj* pSql, SSqlNode* pSqlNode, int32_t index) {
current
->
numOfTables
=
1
;
current
->
order
=
pQueryInfo
->
order
;
pCmd
->
pQueryInfo
[
0
]
=
current
;
pCmd
->
pQueryInfo
=
current
;
pQueryInfo
->
pDownstream
=
current
;
if
(
validateSelectNodeList
(
pCmd
,
current
,
pSqlNode
->
pSelNodeList
,
false
,
false
,
false
)
!=
TSDB_CODE_SUCCESS
)
{
...
...
@@ -7238,14 +7227,14 @@ int32_t validateSqlNode(SSqlObj* pSql, SSqlNode* pSqlNode, int32_t index) {
}
// set all query tables, which are maybe more than one.
code
=
doLoadAllTableMeta
(
pSql
,
index
,
pSqlNode
,
(
int32_t
)
fromSize
);
code
=
doLoadAllTableMeta
(
pSql
,
pQueryInfo
,
pSqlNode
,
(
int32_t
)
fromSize
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
}
bool
isSTable
=
UTIL_TABLE_IS_SUPER_TABLE
(
pTableMetaInfo
);
if
(
isSTable
)
{
code
=
tscGetSTableVgroupInfo
(
pSql
,
index
);
// TODO refactor: getTablemeta along with vgroupInfo
code
=
tscGetSTableVgroupInfo
(
pSql
,
pQueryInfo
);
// TODO refactor: getTablemeta along with vgroupInfo
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
}
...
...
@@ -7345,7 +7334,7 @@ int32_t validateSqlNode(SSqlObj* pSql, SSqlNode* pSqlNode, int32_t index) {
}
}
if
((
code
=
validateLimitNode
(
pCmd
,
pQueryInfo
,
index
,
pSqlNode
,
pSql
))
!=
TSDB_CODE_SUCCESS
)
{
if
((
code
=
validateLimitNode
(
pCmd
,
pQueryInfo
,
pSqlNode
,
pSql
))
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
}
...
...
@@ -7361,6 +7350,32 @@ int32_t validateSqlNode(SSqlObj* pSql, SSqlNode* pSqlNode, int32_t index) {
}
}
{
// set the query info
pQueryInfo
->
projectionQuery
=
tscIsProjectionQuery
(
pQueryInfo
);
pQueryInfo
->
hasFilter
=
tscHasColumnFilter
(
pQueryInfo
);
pQueryInfo
->
simpleAgg
=
isSimpleAggregateRv
(
pQueryInfo
);
pQueryInfo
->
onlyTagQuery
=
onlyTagPrjFunction
(
pQueryInfo
);
pQueryInfo
->
groupbyColumn
=
tscGroupbyColumn
(
pQueryInfo
);
pQueryInfo
->
arithmeticOnAgg
=
tsIsArithmeticQueryOnAggResult
(
pQueryInfo
);
SExprInfo
**
p
=
NULL
;
int32_t
numOfExpr
=
0
;
code
=
createProjectionExpr
(
pQueryInfo
,
pTableMetaInfo
,
&
p
,
&
numOfExpr
);
if
(
pQueryInfo
->
exprList1
==
NULL
)
{
pQueryInfo
->
exprList1
=
taosArrayInit
(
4
,
POINTER_BYTES
);
}
taosArrayPushBatch
(
pQueryInfo
->
exprList1
,
(
void
*
)
p
,
numOfExpr
);
}
SQueryNode
*
p
=
qCreateQueryPlan
(
pQueryInfo
);
char
*
s
=
queryPlanToString
(
p
);
printf
(
"%s
\n
"
,
s
);
tfree
(
s
);
qDestroyQueryPlan
(
p
);
return
TSDB_CODE_SUCCESS
;
// Does not build query message here
}
...
...
src/client/src/tscServer.c
浏览文件 @
c18dd031
...
...
@@ -624,7 +624,7 @@ static int32_t tscEstimateQueryMsgSize(SSqlObj *pSql, int32_t clauseIndex) {
int32_t
srcColListSize
=
(
int32_t
)(
taosArrayGetSize
(
pQueryInfo
->
colList
)
*
sizeof
(
SColumnInfo
));
size_t
numOfExprs
=
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
size_t
numOfExprs
=
tscNumOfExprs
(
pQueryInfo
);
int32_t
exprSize
=
(
int32_t
)(
sizeof
(
SSqlExpr
)
*
numOfExprs
*
2
);
int32_t
tsBufSize
=
(
pQueryInfo
->
tsBuf
!=
NULL
)
?
pQueryInfo
->
tsBuf
->
fileSize
:
0
;
...
...
@@ -929,7 +929,7 @@ int tscBuildQueryMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
goto
_end
;
}
S
Sql
GroupbyExpr
*
pGroupbyExpr
=
query
.
pGroupbyExpr
;
SGroupbyExpr
*
pGroupbyExpr
=
query
.
pGroupbyExpr
;
if
(
pGroupbyExpr
->
numOfGroupCols
>
0
)
{
pQueryMsg
->
orderByIdx
=
htons
(
pGroupbyExpr
->
orderIndex
);
pQueryMsg
->
orderType
=
htons
(
pGroupbyExpr
->
orderType
);
...
...
@@ -1050,7 +1050,7 @@ int32_t tscBuildCreateDbMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
SCreateDbMsg
*
pCreateDbMsg
=
(
SCreateDbMsg
*
)
pCmd
->
payload
;
assert
(
pCmd
->
numOfClause
==
1
);
//
assert(pCmd->numOfClause == 1);
STableMetaInfo
*
pTableMetaInfo
=
tscGetTableMetaInfoFromCmd
(
pCmd
,
pCmd
->
clauseIndex
,
0
);
int32_t
code
=
tNameExtractFullName
(
&
pTableMetaInfo
->
name
,
pCreateDbMsg
->
db
);
assert
(
code
==
TSDB_CODE_SUCCESS
);
...
...
@@ -1632,9 +1632,9 @@ int tscProcessRetrieveLocalMergeRsp(SSqlObj *pSql) {
taosArrayPush
(
group
,
&
tableKeyInfo
);
taosArrayPush
(
tableGroupInfo
.
pGroupList
,
&
group
);
SExprInfo
*
list
=
calloc
(
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
),
sizeof
(
SExprInfo
));
for
(
int32_t
i
=
0
;
i
<
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
++
i
)
{
SExprInfo
*
pExprInfo
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
);
SExprInfo
*
list
=
calloc
(
tscNumOfExprs
(
pQueryInfo
),
sizeof
(
SExprInfo
));
for
(
int32_t
i
=
0
;
i
<
tscNumOfExprs
(
pQueryInfo
);
++
i
)
{
SExprInfo
*
pExprInfo
=
tscExprGet
(
pQueryInfo
,
i
);
list
[
i
]
=
*
pExprInfo
;
}
...
...
@@ -2166,7 +2166,7 @@ int tscProcessShowRsp(SSqlObj *pSql) {
TAOS_FIELD
f
=
tscCreateField
(
pSchema
->
type
,
pSchema
->
name
,
pSchema
->
bytes
);
SInternalField
*
pInfo
=
tscFieldInfoAppend
(
pFieldInfo
,
&
f
);
pInfo
->
pExpr
=
tsc
Sql
ExprAppend
(
pQueryInfo
,
TSDB_FUNC_TS_DUMMY
,
&
index
,
pInfo
->
pExpr
=
tscExprAppend
(
pQueryInfo
,
TSDB_FUNC_TS_DUMMY
,
&
index
,
pTableSchema
[
i
].
type
,
pTableSchema
[
i
].
bytes
,
getNewResColId
(
pQueryInfo
),
pTableSchema
[
i
].
bytes
,
false
);
}
...
...
@@ -2411,7 +2411,7 @@ static int32_t getTableMetaFromMnode(SSqlObj *pSql, STableMetaInfo *pTableMetaIn
}
STableMetaInfo
*
pNewMeterMetaInfo
=
tscAddEmptyMetaInfo
(
pNewQueryInfo
);
assert
(
pNew
->
cmd
.
numOfClause
==
1
&&
pNewQueryInfo
->
numOfTables
==
1
);
assert
(
/*pNew->cmd.numOfClause == 1 && */
pNewQueryInfo
->
numOfTables
==
1
);
tNameAssign
(
&
pNewMeterMetaInfo
->
name
,
&
pTableMetaInfo
->
name
);
...
...
@@ -2513,8 +2513,7 @@ int tscRenewTableMeta(SSqlObj *pSql, int32_t tableIndex) {
return
getTableMetaFromMnode
(
pSql
,
pTableMetaInfo
);
}
static
bool
allVgroupInfoRetrieved
(
SSqlCmd
*
pCmd
,
int32_t
clauseIndex
)
{
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
clauseIndex
);
static
bool
allVgroupInfoRetrieved
(
SQueryInfo
*
pQueryInfo
)
{
for
(
int32_t
i
=
0
;
i
<
pQueryInfo
->
numOfTables
;
++
i
)
{
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
i
);
if
(
pTableMetaInfo
->
vgroupList
==
NULL
)
{
...
...
@@ -2526,11 +2525,9 @@ static bool allVgroupInfoRetrieved(SSqlCmd* pCmd, int32_t clauseIndex) {
return
true
;
}
int
tscGetSTableVgroupInfo
(
SSqlObj
*
pSql
,
int32_t
clauseIndex
)
{
int
code
=
TSDB_CODE_RPC_NETWORK_UNAVAIL
;
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
if
(
allVgroupInfoRetrieved
(
pCmd
,
clauseIndex
))
{
int
tscGetSTableVgroupInfo
(
SSqlObj
*
pSql
,
SQueryInfo
*
pQueryInfo
)
{
int32_t
code
=
TSDB_CODE_RPC_NETWORK_UNAVAIL
;
if
(
allVgroupInfoRetrieved
(
pQueryInfo
))
{
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -2547,7 +2544,6 @@ int tscGetSTableVgroupInfo(SSqlObj *pSql, int32_t clauseIndex) {
return
code
;
}
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
clauseIndex
);
for
(
int32_t
i
=
0
;
i
<
pQueryInfo
->
numOfTables
;
++
i
)
{
STableMetaInfo
*
pMInfo
=
tscGetMetaInfo
(
pQueryInfo
,
i
);
STableMeta
*
pTableMeta
=
tscTableMetaDup
(
pMInfo
->
pTableMeta
);
...
...
src/client/src/tscStream.c
浏览文件 @
c18dd031
...
...
@@ -37,7 +37,7 @@ static int64_t getDelayValueAfterTimewindowClosed(SSqlStream* pStream, int64_t l
static
bool
isProjectStream
(
SQueryInfo
*
pQueryInfo
)
{
for
(
int32_t
i
=
0
;
i
<
pQueryInfo
->
fieldsInfo
.
numOfOutput
;
++
i
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
base
.
functionId
!=
TSDB_FUNC_PRJ
)
{
return
false
;
}
...
...
src/client/src/tscSubquery.c
浏览文件 @
c18dd031
...
...
@@ -417,14 +417,15 @@ static void tscDestroyJoinSupporter(SJoinSupporter* pSupporter) {
}
if
(
pSupporter
->
exprList
!=
NULL
)
{
tscSqlExprInfoDestroy
(
pSupporter
->
exprList
);
tscExprDestroy
(
pSupporter
->
exprList
);
pSupporter
->
exprList
=
NULL
;
}
if
(
pSupporter
->
colList
!=
NULL
)
{
tscColumnListDestroy
(
pSupporter
->
colList
);
}
tscFieldInfoClear
(
&
pSupporter
->
fieldsInfo
);
//
tscFieldInfoClear(&pSupporter->fieldsInfo);
if
(
pSupporter
->
pTSBuf
!=
NULL
)
{
tsBufDestroy
(
pSupporter
->
pTSBuf
);
...
...
@@ -554,7 +555,7 @@ static int32_t tscLaunchRealSubqueries(SSqlObj* pSql) {
pSubQueryInfo
->
tsBuf
=
NULL
;
// free result for async object will also free sqlObj
assert
(
tsc
SqlExpr
NumOfExprs
(
pSubQueryInfo
)
==
1
);
// ts_comp query only requires one result columns
assert
(
tscNumOfExprs
(
pSubQueryInfo
)
==
1
);
// ts_comp query only requires one result columns
taos_free_result
(
pPrevSub
);
SSqlObj
*
pNew
=
createSubqueryObj
(
pSql
,
(
int16_t
)
i
,
tscJoinQueryCallback
,
pSupporter
,
TSDB_SQL_SELECT
,
NULL
);
...
...
@@ -582,7 +583,7 @@ static int32_t tscLaunchRealSubqueries(SSqlObj* pSql) {
pQueryInfo
->
groupbyExpr
=
pSupporter
->
groupInfo
;
pQueryInfo
->
pUpstream
=
taosArrayInit
(
4
,
sizeof
(
POINTER_BYTES
));
assert
(
pNew
->
subState
.
numOfSub
==
0
&&
p
New
->
cmd
.
numOfClause
==
1
&&
p
QueryInfo
->
numOfTables
==
1
);
assert
(
pNew
->
subState
.
numOfSub
==
0
&&
pQueryInfo
->
numOfTables
==
1
);
tscFieldInfoUpdateOffset
(
pQueryInfo
);
...
...
@@ -593,7 +594,7 @@ static int32_t tscLaunchRealSubqueries(SSqlObj* pSql) {
pSupporter
->
colList
=
NULL
;
pSupporter
->
pVgroupTables
=
NULL
;
memset
(
&
pSupporter
->
fieldsInfo
,
0
,
sizeof
(
SFieldInfo
));
memset
(
&
pSupporter
->
groupInfo
,
0
,
sizeof
(
S
Sql
GroupbyExpr
));
memset
(
&
pSupporter
->
groupInfo
,
0
,
sizeof
(
SGroupbyExpr
));
/*
* When handling the projection query, the offset value will be modified for table-table join, which is changed
...
...
@@ -605,7 +606,7 @@ static int32_t tscLaunchRealSubqueries(SSqlObj* pSql) {
SColumnIndex
index
=
{.
tableIndex
=
0
,
.
columnIndex
=
PRIMARYKEY_TIMESTAMP_COL_INDEX
};
SSchema
*
s
=
tscGetTableColumnSchema
(
pTableMetaInfo
->
pTableMeta
,
0
);
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
0
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
0
);
int16_t
funcId
=
pExpr
->
base
.
functionId
;
// add the invisible timestamp column
...
...
@@ -618,7 +619,7 @@ static int32_t tscLaunchRealSubqueries(SSqlObj* pSql) {
tscPrintSelNodeList
(
pNew
,
0
);
tscFieldInfoUpdateOffset
(
pQueryInfo
);
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
0
);
pExpr
=
tscExprGet
(
pQueryInfo
,
0
);
}
// set the join condition tag column info, todo extract method
...
...
@@ -821,7 +822,7 @@ static void issueTsCompQuery(SSqlObj* pSql, SJoinSupporter* pSupporter, SSqlObj*
// set the tags value for ts_comp function
if
(
UTIL_TABLE_IS_SUPER_TABLE
(
pTableMetaInfo
))
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
0
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
0
);
int16_t
tagColId
=
tscGetJoinTagColIdByUid
(
&
pSupporter
->
tagCond
,
pTableMetaInfo
->
pTableMeta
->
id
.
uid
);
pExpr
->
base
.
param
[
0
].
i64
=
tagColId
;
pExpr
->
base
.
param
[
0
].
nLen
=
sizeof
(
int64_t
);
...
...
@@ -849,7 +850,7 @@ static void issueTsCompQuery(SSqlObj* pSql, SJoinSupporter* pSupporter, SSqlObj*
"0x%"
PRIx64
" subquery:0x%"
PRIx64
" tableIndex:%d, vgroupIndex:%d, numOfVgroups:%d, type:%d, ts_comp query to retrieve timestamps, "
"numOfExpr:%"
PRIzu
", colList:%"
PRIzu
", numOfOutputFields:%d, name:%s"
,
pParent
->
self
,
pSql
->
self
,
0
,
pTableMetaInfo
->
vgroupIndex
,
pTableMetaInfo
->
vgroupList
->
numOfVgroups
,
pQueryInfo
->
type
,
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
),
numOfCols
,
pQueryInfo
->
fieldsInfo
.
numOfOutput
,
tNameGetTableName
(
&
pTableMetaInfo
->
name
));
tscNumOfExprs
(
pQueryInfo
),
numOfCols
,
pQueryInfo
->
fieldsInfo
.
numOfOutput
,
tNameGetTableName
(
&
pTableMetaInfo
->
name
));
tscBuildAndSendRequest
(
pSql
,
NULL
);
}
...
...
@@ -1688,7 +1689,7 @@ void tscSetupOutputColumnIndex(SSqlObj* pSql) {
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
int32_t
numOfExprs
=
(
int32_t
)
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
int32_t
numOfExprs
=
(
int32_t
)
tscNumOfExprs
(
pQueryInfo
);
pRes
->
pColumnIndex
=
calloc
(
1
,
sizeof
(
SColumnIndex
)
*
numOfExprs
);
if
(
pRes
->
pColumnIndex
==
NULL
)
{
pRes
->
code
=
TSDB_CODE_TSC_OUT_OF_MEMORY
;
...
...
@@ -1696,7 +1697,7 @@ void tscSetupOutputColumnIndex(SSqlObj* pSql) {
}
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
i
);
int32_t
tableIndexOfSub
=
-
1
;
for
(
int32_t
j
=
0
;
j
<
pQueryInfo
->
numOfTables
;
++
j
)
{
...
...
@@ -1714,7 +1715,7 @@ void tscSetupOutputColumnIndex(SSqlObj* pSql) {
size_t
numOfSubExpr
=
taosArrayGetSize
(
pSubQueryInfo
->
exprList
);
for
(
int32_t
k
=
0
;
k
<
numOfSubExpr
;
++
k
)
{
SExprInfo
*
pSubExpr
=
tsc
Sql
ExprGet
(
pSubQueryInfo
,
k
);
SExprInfo
*
pSubExpr
=
tscExprGet
(
pSubQueryInfo
,
k
);
if
(
pExpr
->
base
.
functionId
==
pSubExpr
->
base
.
functionId
&&
pExpr
->
base
.
colInfo
.
colId
==
pSubExpr
->
base
.
colInfo
.
colId
)
{
pRes
->
pColumnIndex
[
i
]
=
(
SColumnIndex
){.
tableIndex
=
tableIndexOfSub
,
.
columnIndex
=
k
};
break
;
...
...
@@ -1737,7 +1738,7 @@ void tscJoinQueryCallback(void* param, TAOS_RES* tres, int code) {
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
assert
(
pQueryInfo
->
numOfTables
==
1
&&
pSql
->
cmd
.
numOfClause
==
1
);
assert
(
pQueryInfo
->
numOfTables
==
1
);
// retrieve actual query results from vnode during the second stage join subquery
if
(
pParentSql
->
res
.
code
!=
TSDB_CODE_SUCCESS
)
{
...
...
@@ -1865,7 +1866,7 @@ int32_t tscCreateJoinSubquery(SSqlObj *pSql, int16_t tableIndex, SJoinSupporter
}
pSupporter
->
groupInfo
=
pNewQueryInfo
->
groupbyExpr
;
memset
(
&
pNewQueryInfo
->
groupbyExpr
,
0
,
sizeof
(
S
Sql
GroupbyExpr
));
memset
(
&
pNewQueryInfo
->
groupbyExpr
,
0
,
sizeof
(
SGroupbyExpr
));
pNew
->
cmd
.
numOfCols
=
0
;
pNewQueryInfo
->
interval
.
interval
=
0
;
...
...
@@ -1878,7 +1879,7 @@ int32_t tscCreateJoinSubquery(SSqlObj *pSql, int16_t tableIndex, SJoinSupporter
pNewQueryInfo
->
order
.
orderColId
=
INT32_MIN
;
// backup the data and clear it in the sqlcmd object
memset
(
&
pNewQueryInfo
->
groupbyExpr
,
0
,
sizeof
(
S
Sql
GroupbyExpr
));
memset
(
&
pNewQueryInfo
->
groupbyExpr
,
0
,
sizeof
(
SGroupbyExpr
));
tscInitQueryInfo
(
pNewQueryInfo
);
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pNewQueryInfo
,
0
);
...
...
@@ -1912,7 +1913,7 @@ int32_t tscCreateJoinSubquery(SSqlObj *pSql, int16_t tableIndex, SJoinSupporter
tscDebug
(
"%p subquery:%p tableIndex:%d, vgroupIndex:%d, type:%d, transfer to tid_tag query to retrieve (tableId, tags), "
"exprInfo:%"
PRIzu
", colList:%"
PRIzu
", fieldsInfo:%d, tagIndex:%d, name:%s"
,
pSql
,
pNew
,
tableIndex
,
pTableMetaInfo
->
vgroupIndex
,
pNewQueryInfo
->
type
,
tsc
SqlExpr
NumOfExprs
(
pNewQueryInfo
),
pSql
,
pNew
,
tableIndex
,
pTableMetaInfo
->
vgroupIndex
,
pNewQueryInfo
->
type
,
tscNumOfExprs
(
pNewQueryInfo
),
numOfCols
,
pNewQueryInfo
->
fieldsInfo
.
numOfOutput
,
colIndex
.
columnIndex
,
tNameGetTableName
(
&
pNewQueryInfo
->
pTableMetaInfo
[
0
]
->
name
));
}
else
{
SSchema
colSchema
=
{.
type
=
TSDB_DATA_TYPE_BINARY
,
.
bytes
=
1
};
...
...
@@ -1920,7 +1921,7 @@ int32_t tscCreateJoinSubquery(SSqlObj *pSql, int16_t tableIndex, SJoinSupporter
tscAddFuncInSelectClause
(
pNewQueryInfo
,
0
,
TSDB_FUNC_TS_COMP
,
&
colIndex
,
&
colSchema
,
TSDB_COL_NORMAL
);
// set the tags value for ts_comp function
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pNewQueryInfo
,
0
);
SExprInfo
*
pExpr
=
tscExprGet
(
pNewQueryInfo
,
0
);
if
(
UTIL_TABLE_IS_SUPER_TABLE
(
pTableMetaInfo
))
{
int16_t
tagColId
=
tscGetJoinTagColIdByUid
(
&
pSupporter
->
tagCond
,
pTableMetaInfo
->
pTableMeta
->
id
.
uid
);
...
...
@@ -1947,7 +1948,7 @@ int32_t tscCreateJoinSubquery(SSqlObj *pSql, int16_t tableIndex, SJoinSupporter
tscDebug
(
"%p subquery:%p tableIndex:%d, vgroupIndex:%d, type:%u, transfer to ts_comp query to retrieve timestamps, "
"exprInfo:%"
PRIzu
", colList:%"
PRIzu
", fieldsInfo:%d, name:%s"
,
pSql
,
pNew
,
tableIndex
,
pTableMetaInfo
->
vgroupIndex
,
pNewQueryInfo
->
type
,
tsc
SqlExpr
NumOfExprs
(
pNewQueryInfo
),
pSql
,
pNew
,
tableIndex
,
pTableMetaInfo
->
vgroupIndex
,
pNewQueryInfo
->
type
,
tscNumOfExprs
(
pNewQueryInfo
),
numOfCols
,
pNewQueryInfo
->
fieldsInfo
.
numOfOutput
,
tNameGetTableName
(
&
pNewQueryInfo
->
pTableMetaInfo
[
0
]
->
name
));
}
}
else
{
...
...
@@ -2086,7 +2087,7 @@ typedef struct SFirstRoundQuerySup {
void
doAppendData
(
SInterResult
*
pInterResult
,
TAOS_ROW
row
,
int32_t
numOfCols
,
SQueryInfo
*
pQueryInfo
)
{
TSKEY
key
=
INT64_MIN
;
for
(
int32_t
i
=
0
;
i
<
numOfCols
;
++
i
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
i
);
if
(
TSDB_COL_IS_TAG
(
pExpr
->
base
.
colInfo
.
flag
)
||
pExpr
->
base
.
functionId
==
TSDB_FUNC_PRJ
)
{
continue
;
}
...
...
@@ -2179,7 +2180,7 @@ void tscFirstRoundRetrieveCallback(void* param, TAOS_RES* tres, int numOfRows) {
int32_t
offset
=
0
;
for
(
int32_t
i
=
0
;
i
<
numOfCols
&&
offset
<
pSup
->
tagLen
;
++
i
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
i
);
// tag or group by column
if
(
TSDB_COL_IS_TAG
(
pExpr
->
base
.
colInfo
.
flag
)
||
pExpr
->
base
.
functionId
==
TSDB_FUNC_PRJ
)
{
...
...
@@ -2321,11 +2322,11 @@ int32_t tscHandleFirstRoundStableQuery(SSqlObj *pSql) {
pCmd
->
command
=
TSDB_SQL_SELECT
;
pNew
->
fp
=
tscFirstRoundCallback
;
int32_t
numOfExprs
=
(
int32_t
)
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
int32_t
numOfExprs
=
(
int32_t
)
tscNumOfExprs
(
pQueryInfo
);
int32_t
index
=
0
;
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
base
.
functionId
==
TSDB_FUNC_TS
&&
pQueryInfo
->
interval
.
interval
>
0
)
{
taosArrayPush
(
pSup
->
pColsInfo
,
&
pExpr
->
base
.
resColId
);
...
...
@@ -2385,7 +2386,7 @@ int32_t tscHandleFirstRoundStableQuery(SSqlObj *pSql) {
"0x%"
PRIx64
" first round subquery:0x%"
PRIx64
" tableIndex:%d, vgroupIndex:%d, numOfVgroups:%d, type:%d, query to retrieve timestamps, "
"numOfExpr:%"
PRIzu
", colList:%d, numOfOutputFields:%d, name:%s"
,
pSql
->
self
,
pNew
->
self
,
0
,
pTableMetaInfo
->
vgroupIndex
,
pTableMetaInfo
->
vgroupList
->
numOfVgroups
,
pNewQueryInfo
->
type
,
tsc
SqlExpr
NumOfExprs
(
pNewQueryInfo
),
index
+
1
,
pNewQueryInfo
->
fieldsInfo
.
numOfOutput
,
tNameGetTableName
(
&
pTableMetaInfo
->
name
));
tscNumOfExprs
(
pNewQueryInfo
),
index
+
1
,
pNewQueryInfo
->
fieldsInfo
.
numOfOutput
,
tNameGetTableName
(
&
pTableMetaInfo
->
name
));
tscHandleMasterSTableQuery
(
pNew
);
return
TSDB_CODE_SUCCESS
;
...
...
@@ -2897,7 +2898,7 @@ static SSqlObj *tscCreateSTableSubquery(SSqlObj *pSql, SRetrieveSupport *trsuppo
pQueryInfo
->
limit
.
limit
=
-
1
;
pQueryInfo
->
limit
.
offset
=
0
;
assert
(
pQueryInfo
->
numOfTables
==
1
&&
pNew
->
cmd
.
numOfClause
==
1
&&
trsupport
->
subqueryIndex
<
pSql
->
subState
.
numOfSub
);
assert
(
/*pQueryInfo->numOfTables == 1 && pNew->cmd.numOfClause == 1 &&*/
trsupport
->
subqueryIndex
<
pSql
->
subState
.
numOfSub
);
// launch subquery for each vnode, so the subquery index equals to the vgroupIndex.
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
table_index
);
...
...
@@ -2924,7 +2925,7 @@ void tscRetrieveDataRes(void *param, TAOS_RES *tres, int code) {
SSqlObj
*
pSql
=
(
SSqlObj
*
)
tres
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
assert
(
p
Sql
->
cmd
.
numOfClause
==
1
&&
p
QueryInfo
->
numOfTables
==
1
);
assert
(
pQueryInfo
->
numOfTables
==
1
);
STableMetaInfo
*
pTableMetaInfo
=
tscGetTableMetaInfoFromCmd
(
&
pSql
->
cmd
,
0
,
0
);
SVgroupInfo
*
pVgroup
=
&
pTableMetaInfo
->
vgroupList
->
vgroups
[
trsupport
->
subqueryIndex
];
...
...
@@ -3296,12 +3297,12 @@ static void doBuildResFromSubqueries(SSqlObj* pSql) {
continue
;
}
SQueryInfo
*
pSubQueryInfo
=
pSub
->
cmd
.
pQueryInfo
[
0
]
;
SQueryInfo
*
pSubQueryInfo
=
pSub
->
cmd
.
pQueryInfo
;
tscRestoreFuncForSTableQuery
(
pSubQueryInfo
);
tscFieldInfoUpdateOffset
(
pSubQueryInfo
);
}
size_t
numOfExprs
=
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
size_t
numOfExprs
=
tscNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
SColumnIndex
*
pIndex
=
&
pRes
->
pColumnIndex
[
i
];
SSqlRes
*
pRes1
=
&
pSql
->
pSubs
[
pIndex
->
tableIndex
]
->
res
;
...
...
@@ -3348,7 +3349,7 @@ void tscBuildResFromSubqueries(SSqlObj *pSql) {
if
(
pRes
->
tsrow
==
NULL
)
{
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
pSql
->
cmd
.
clauseIndex
);
pRes
->
numOfCols
=
(
int16_t
)
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
pRes
->
numOfCols
=
(
int16_t
)
tscNumOfExprs
(
pQueryInfo
);
pRes
->
tsrow
=
calloc
(
pRes
->
numOfCols
,
POINTER_BYTES
);
pRes
->
urow
=
calloc
(
pRes
->
numOfCols
,
POINTER_BYTES
);
...
...
src/client/src/tscUtil.c
浏览文件 @
c18dd031
...
...
@@ -78,10 +78,10 @@ void tsSetSTableQueryCond(STagCond* pTagCond, uint64_t uid, SBufferWriter* bw) {
}
bool
tscQueryTags
(
SQueryInfo
*
pQueryInfo
)
{
int32_t
numOfCols
=
(
int32_t
)
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
int32_t
numOfCols
=
(
int32_t
)
tscNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
numOfCols
;
++
i
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
i
);
int32_t
functId
=
pExpr
->
base
.
functionId
;
// "select count(tbname)" query
...
...
@@ -98,10 +98,10 @@ bool tscQueryTags(SQueryInfo* pQueryInfo) {
}
bool
tscQueryBlockInfo
(
SQueryInfo
*
pQueryInfo
)
{
int32_t
numOfCols
=
(
int32_t
)
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
int32_t
numOfCols
=
(
int32_t
)
tscNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
numOfCols
;
++
i
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
i
);
int32_t
functId
=
pExpr
->
base
.
functionId
;
if
(
functId
==
TSDB_FUNC_BLKINFO
)
{
...
...
@@ -146,14 +146,14 @@ bool tscIsProjectionQueryOnSTable(SQueryInfo* pQueryInfo, int32_t tableIndex) {
* 1. failed to get tableMeta from server; 2. not a super table; 3. limitation is 0;
* 4. show queries, instead of a select query
*/
size_t
numOfExprs
=
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
size_t
numOfExprs
=
tscNumOfExprs
(
pQueryInfo
);
if
(
pTableMetaInfo
==
NULL
||
!
UTIL_TABLE_IS_SUPER_TABLE
(
pTableMetaInfo
)
||
pQueryInfo
->
command
==
TSDB_SQL_RETRIEVE_EMPTY_RESULT
||
numOfExprs
==
0
)
{
return
false
;
}
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
int32_t
functionId
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
)
->
base
.
functionId
;
int32_t
functionId
=
tscExprGet
(
pQueryInfo
,
i
)
->
base
.
functionId
;
if
(
functionId
!=
TSDB_FUNC_PRJ
&&
functionId
!=
TSDB_FUNC_TAGPRJ
&&
...
...
@@ -189,10 +189,10 @@ bool tscOrderedProjectionQueryOnSTable(SQueryInfo* pQueryInfo, int32_t tableInde
}
bool
tscIsProjectionQuery
(
SQueryInfo
*
pQueryInfo
)
{
size_t
size
=
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
size_t
size
=
tscNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
int32_t
functionId
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
)
->
base
.
functionId
;
int32_t
functionId
=
tscExprGet
(
pQueryInfo
,
i
)
->
base
.
functionId
;
if
(
functionId
!=
TSDB_FUNC_PRJ
&&
functionId
!=
TSDB_FUNC_TAGPRJ
&&
functionId
!=
TSDB_FUNC_TAG
&&
functionId
!=
TSDB_FUNC_TS
&&
functionId
!=
TSDB_FUNC_ARITHM
)
{
...
...
@@ -203,10 +203,27 @@ bool tscIsProjectionQuery(SQueryInfo* pQueryInfo) {
return
true
;
}
bool
tscHasColumnFilter
(
SQueryInfo
*
pQueryInfo
)
{
// filter on primary timestamp column
if
(
pQueryInfo
->
window
.
skey
!=
INT64_MIN
||
pQueryInfo
->
window
.
ekey
!=
INT64_MAX
)
{
return
true
;
}
size_t
size
=
taosArrayGetSize
(
pQueryInfo
->
colList
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
SColumn
*
pCol
=
taosArrayGet
(
pQueryInfo
->
colList
,
i
);
if
(
pCol
->
info
.
flist
.
numOfFilters
>
0
)
{
return
true
;
}
}
return
false
;
}
bool
tscIsPointInterpQuery
(
SQueryInfo
*
pQueryInfo
)
{
size_t
size
=
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
size_t
size
=
tscNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
i
);
assert
(
pExpr
!=
NULL
);
int32_t
functionId
=
pExpr
->
base
.
functionId
;
...
...
@@ -222,7 +239,7 @@ bool tscIsPointInterpQuery(SQueryInfo* pQueryInfo) {
return
true
;
}
bool
ts
cIsSecondStageQuery
(
SQueryInfo
*
pQueryInfo
)
{
bool
ts
IsArithmeticQueryOnAggResult
(
SQueryInfo
*
pQueryInfo
)
{
if
(
tscIsProjectionQuery
(
pQueryInfo
))
{
return
false
;
}
...
...
@@ -242,7 +259,7 @@ bool tscGroupbyColumn(SQueryInfo* pQueryInfo) {
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
int32_t
numOfCols
=
tscGetNumOfColumns
(
pTableMetaInfo
->
pTableMeta
);
S
Sql
GroupbyExpr
*
pGroupbyExpr
=
&
pQueryInfo
->
groupbyExpr
;
SGroupbyExpr
*
pGroupbyExpr
=
&
pQueryInfo
->
groupbyExpr
;
for
(
int32_t
k
=
0
;
k
<
pGroupbyExpr
->
numOfGroupCols
;
++
k
)
{
SColIndex
*
pIndex
=
taosArrayGet
(
pGroupbyExpr
->
columnInfo
,
k
);
if
(
!
TSDB_COL_IS_TAG
(
pIndex
->
flag
)
&&
pIndex
->
colIndex
<
numOfCols
)
{
// group by normal columns
...
...
@@ -254,10 +271,10 @@ bool tscGroupbyColumn(SQueryInfo* pQueryInfo) {
}
bool
tscIsTopBotQuery
(
SQueryInfo
*
pQueryInfo
)
{
size_t
numOfExprs
=
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
size_t
numOfExprs
=
tscNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
==
NULL
)
{
continue
;
}
...
...
@@ -275,8 +292,8 @@ bool tscIsTopBotQuery(SQueryInfo* pQueryInfo) {
}
bool
isTsCompQuery
(
SQueryInfo
*
pQueryInfo
)
{
size_t
numOfExprs
=
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
SExprInfo
*
pExpr1
=
tsc
Sql
ExprGet
(
pQueryInfo
,
0
);
size_t
numOfExprs
=
tscNumOfExprs
(
pQueryInfo
);
SExprInfo
*
pExpr1
=
tscExprGet
(
pQueryInfo
,
0
);
if
(
numOfExprs
!=
1
)
{
return
false
;
}
...
...
@@ -285,15 +302,15 @@ bool isTsCompQuery(SQueryInfo* pQueryInfo) {
}
bool
hasTagValOutput
(
SQueryInfo
*
pQueryInfo
)
{
size_t
numOfExprs
=
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
SExprInfo
*
pExpr1
=
tsc
Sql
ExprGet
(
pQueryInfo
,
0
);
size_t
numOfExprs
=
tscNumOfExprs
(
pQueryInfo
);
SExprInfo
*
pExpr1
=
tscExprGet
(
pQueryInfo
,
0
);
if
(
numOfExprs
==
1
&&
pExpr1
->
base
.
functionId
==
TSDB_FUNC_TS_COMP
)
{
return
true
;
}
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
==
NULL
)
{
continue
;
}
...
...
@@ -308,9 +325,9 @@ bool hasTagValOutput(SQueryInfo* pQueryInfo) {
}
bool
timeWindowInterpoRequired
(
SQueryInfo
*
pQueryInfo
)
{
size_t
numOfExprs
=
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
size_t
numOfExprs
=
tscNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
==
NULL
)
{
continue
;
}
...
...
@@ -325,9 +342,9 @@ bool timeWindowInterpoRequired(SQueryInfo *pQueryInfo) {
}
bool
isStabledev
(
SQueryInfo
*
pQueryInfo
)
{
size_t
numOfExprs
=
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
size_t
numOfExprs
=
tscNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
==
NULL
)
{
continue
;
}
...
...
@@ -342,9 +359,9 @@ bool isStabledev(SQueryInfo* pQueryInfo) {
}
bool
tscIsTWAQuery
(
SQueryInfo
*
pQueryInfo
)
{
size_t
numOfExprs
=
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
size_t
numOfExprs
=
tscNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
==
NULL
)
{
continue
;
}
...
...
@@ -358,9 +375,9 @@ bool tscIsTWAQuery(SQueryInfo* pQueryInfo) {
}
bool
tscNeedReverseScan
(
SQueryInfo
*
pQueryInfo
)
{
size_t
numOfExprs
=
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
size_t
numOfExprs
=
tscNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
==
NULL
)
{
continue
;
}
...
...
@@ -396,9 +413,38 @@ bool isSimpleAggregate(SQueryInfo* pQueryInfo) {
return
true
;
}
size_t
numOfExprs
=
tscSqlExprNumOfExprs
(
pQueryInfo
);
size_t
numOfExprs
=
tscNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
==
NULL
)
{
continue
;
}
int32_t
functionId
=
pExpr
->
base
.
functionId
;
if
(
functionId
==
TSDB_FUNC_TS
||
functionId
==
TSDB_FUNC_TS_DUMMY
)
{
continue
;
}
if
(
!
IS_MULTIOUTPUT
(
aAggs
[
functionId
].
status
))
{
return
true
;
}
}
return
false
;
}
bool
isSimpleAggregateRv
(
SQueryInfo
*
pQueryInfo
)
{
if
(
pQueryInfo
->
interval
.
interval
>
0
||
pQueryInfo
->
sessionWindow
.
gap
>
0
)
{
return
false
;
}
if
(
tscGroupbyColumn
(
pQueryInfo
)
||
isTsCompQuery
(
pQueryInfo
))
{
return
false
;
}
size_t
numOfExprs
=
tscNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
==
NULL
)
{
continue
;
}
...
...
@@ -414,11 +460,12 @@ bool isSimpleAggregate(SQueryInfo* pQueryInfo) {
}
return
false
;
}
bool
isBlockDistQuery
(
SQueryInfo
*
pQueryInfo
)
{
size_t
numOfExprs
=
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
0
);
size_t
numOfExprs
=
tscNumOfExprs
(
pQueryInfo
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
0
);
return
(
numOfExprs
==
1
&&
pExpr
->
base
.
colInfo
.
colId
==
TSDB_BLOCK_DIST_COLUMN_INDEX
);
}
...
...
@@ -702,7 +749,7 @@ void handleDownstreamOperator(SSqlRes* pRes, SQueryInfo* pQueryInfo) {
// handle the following query process
SQueryInfo
*
px
=
pQueryInfo
->
pDownstream
;
SColumnInfo
*
pColumnInfo
=
extractColumnInfoFromResult
(
px
->
pTableMetaInfo
[
0
]
->
pTableMeta
,
px
->
colList
);
int32_t
numOfOutput
=
(
int32_t
)
tsc
SqlExpr
NumOfExprs
(
px
);
int32_t
numOfOutput
=
(
int32_t
)
tscNumOfExprs
(
px
);
int32_t
numOfCols
=
(
int32_t
)
taosArrayGetSize
(
px
->
colList
);
SQueriedTableInfo
info
=
{.
colList
=
pColumnInfo
,
.
numOfCols
=
numOfCols
,};
...
...
@@ -762,17 +809,19 @@ static void tscDestroyResPointerInfo(SSqlRes* pRes) {
}
void
tscFreeQueryInfo
(
SSqlCmd
*
pCmd
,
bool
removeMeta
)
{
if
(
pCmd
==
NULL
||
pCmd
->
numOfClause
==
0
)
{
if
(
pCmd
==
NULL
)
{
return
;
}
for
(
int32_t
i
=
0
;
i
<
pCmd
->
numOfClause
;
++
i
)
{
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
i
);
// recursive call it
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
while
(
pQueryInfo
!=
NULL
)
{
SQueryInfo
*
p
=
pQueryInfo
->
sibling
;
if
(
taosArrayGetSize
(
pQueryInfo
->
pUpstream
)
>
0
)
{
SQueryInfo
*
pUp
=
taosArrayGetP
(
pQueryInfo
->
pUpstream
,
0
);
freeQueryInfoImpl
(
pUp
);
clearAllTableMetaInfo
(
pUp
,
removeMeta
);
if
(
pUp
->
pQInfo
!=
NULL
)
{
qDestroyQueryInfo
(
pUp
->
pQInfo
);
...
...
@@ -781,7 +830,7 @@ void tscFreeQueryInfo(SSqlCmd* pCmd, bool removeMeta) {
tfree
(
pUp
);
}
freeQueryInfoImpl
(
pQueryInfo
);
clearAllTableMetaInfo
(
pQueryInfo
,
removeMeta
);
...
...
@@ -791,10 +840,11 @@ void tscFreeQueryInfo(SSqlCmd* pCmd, bool removeMeta) {
}
tfree
(
pQueryInfo
);
pQueryInfo
=
p
;
}
pCmd
->
numOfClause
=
0
;
tfree
(
pCmd
->
pQueryInfo
);
pCmd
->
pQueryInfo
=
NULL
;
}
void
destroyTableNameList
(
SSqlCmd
*
pCmd
)
{
...
...
@@ -1026,7 +1076,7 @@ int32_t tscCopyDataBlockToPayload(SSqlObj* pSql, STableDataBlocks* pDataBlock) {
pCmd
->
numOfTablesInSubmit
=
pDataBlock
->
numOfTables
;
assert
(
pCmd
->
numOfClause
==
1
);
//
assert(pCmd->numOfClause == 1);
STableMetaInfo
*
pTableMetaInfo
=
tscGetTableMetaInfoFromCmd
(
pCmd
,
pCmd
->
clauseIndex
,
0
);
// todo refactor
...
...
@@ -1407,7 +1457,7 @@ SInternalField* tscFieldInfoInsert(SFieldInfo* pFieldInfo, int32_t index, TAOS_F
}
void
tscFieldInfoUpdateOffset
(
SQueryInfo
*
pQueryInfo
)
{
size_t
numOfExprs
=
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
size_t
numOfExprs
=
tscNumOfExprs
(
pQueryInfo
);
SExprInfo
*
pExpr
=
taosArrayGetP
(
pQueryInfo
->
exprList
,
0
);
pExpr
->
base
.
offset
=
0
;
...
...
@@ -1527,8 +1577,8 @@ void tscFieldInfoClear(SFieldInfo* pFieldInfo) {
memset
(
pFieldInfo
,
0
,
sizeof
(
SFieldInfo
));
}
static
SExprInfo
*
doCreateSqlExpr
(
SQueryInfo
*
pQueryInfo
,
int16_t
functionId
,
SColumnIndex
*
pColIndex
,
int16_t
type
,
int16_t
size
,
int16_t
resColId
,
int16_t
interSize
,
int32_t
colType
)
{
SExprInfo
*
tscExprCreate
(
SQueryInfo
*
pQueryInfo
,
int16_t
functionId
,
SColumnIndex
*
pColIndex
,
int16_t
type
,
int16_t
size
,
int16_t
resColId
,
int16_t
interSize
,
int32_t
colType
)
{
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
pColIndex
->
tableIndex
);
SExprInfo
*
pExpr
=
calloc
(
1
,
sizeof
(
SExprInfo
));
...
...
@@ -1587,29 +1637,29 @@ static SExprInfo* doCreateSqlExpr(SQueryInfo* pQueryInfo, int16_t functionId, SC
return
pExpr
;
}
SExprInfo
*
tsc
Sql
ExprInsert
(
SQueryInfo
*
pQueryInfo
,
int32_t
index
,
int16_t
functionId
,
SColumnIndex
*
pColIndex
,
int16_t
type
,
SExprInfo
*
tscExprInsert
(
SQueryInfo
*
pQueryInfo
,
int32_t
index
,
int16_t
functionId
,
SColumnIndex
*
pColIndex
,
int16_t
type
,
int16_t
size
,
int16_t
resColId
,
int16_t
interSize
,
bool
isTagCol
)
{
int32_t
num
=
(
int32_t
)
taosArrayGetSize
(
pQueryInfo
->
exprList
);
if
(
index
==
num
)
{
return
tsc
Sql
ExprAppend
(
pQueryInfo
,
functionId
,
pColIndex
,
type
,
size
,
resColId
,
interSize
,
isTagCol
);
return
tscExprAppend
(
pQueryInfo
,
functionId
,
pColIndex
,
type
,
size
,
resColId
,
interSize
,
isTagCol
);
}
SExprInfo
*
pExpr
=
doCreateSqlExpr
(
pQueryInfo
,
functionId
,
pColIndex
,
type
,
size
,
resColId
,
interSize
,
isTagCol
);
SExprInfo
*
pExpr
=
tscExprCreate
(
pQueryInfo
,
functionId
,
pColIndex
,
type
,
size
,
resColId
,
interSize
,
isTagCol
);
taosArrayInsert
(
pQueryInfo
->
exprList
,
index
,
&
pExpr
);
return
pExpr
;
}
SExprInfo
*
tsc
Sql
ExprAppend
(
SQueryInfo
*
pQueryInfo
,
int16_t
functionId
,
SColumnIndex
*
pColIndex
,
int16_t
type
,
SExprInfo
*
tscExprAppend
(
SQueryInfo
*
pQueryInfo
,
int16_t
functionId
,
SColumnIndex
*
pColIndex
,
int16_t
type
,
int16_t
size
,
int16_t
resColId
,
int16_t
interSize
,
bool
isTagCol
)
{
SExprInfo
*
pExpr
=
doCreateSqlExpr
(
pQueryInfo
,
functionId
,
pColIndex
,
type
,
size
,
resColId
,
interSize
,
isTagCol
);
SExprInfo
*
pExpr
=
tscExprCreate
(
pQueryInfo
,
functionId
,
pColIndex
,
type
,
size
,
resColId
,
interSize
,
isTagCol
);
taosArrayPush
(
pQueryInfo
->
exprList
,
&
pExpr
);
return
pExpr
;
}
SExprInfo
*
tsc
Sql
ExprUpdate
(
SQueryInfo
*
pQueryInfo
,
int32_t
index
,
int16_t
functionId
,
int16_t
srcColumnIndex
,
SExprInfo
*
tscExprUpdate
(
SQueryInfo
*
pQueryInfo
,
int32_t
index
,
int16_t
functionId
,
int16_t
srcColumnIndex
,
int16_t
type
,
int16_t
size
)
{
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
index
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
index
);
if
(
pExpr
==
NULL
)
{
return
NULL
;
}
...
...
@@ -1631,9 +1681,9 @@ bool tscMultiRoundQuery(SQueryInfo* pQueryInfo, int32_t index) {
return
false
;
}
int32_t
numOfExprs
=
(
int32_t
)
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
int32_t
numOfExprs
=
(
int32_t
)
tscNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
base
.
functionId
==
TSDB_FUNC_STDDEV_DST
)
{
return
true
;
}
...
...
@@ -1642,11 +1692,11 @@ bool tscMultiRoundQuery(SQueryInfo* pQueryInfo, int32_t index) {
return
false
;
}
size_t
tsc
SqlExpr
NumOfExprs
(
SQueryInfo
*
pQueryInfo
)
{
size_t
tscNumOfExprs
(
SQueryInfo
*
pQueryInfo
)
{
return
taosArrayGetSize
(
pQueryInfo
->
exprList
);
}
void
addExpr
Params
(
SSqlExpr
*
pExpr
,
char
*
argument
,
int32_t
type
,
int32_t
bytes
)
{
void
tscExprAdd
Params
(
SSqlExpr
*
pExpr
,
char
*
argument
,
int32_t
type
,
int32_t
bytes
)
{
assert
(
pExpr
!=
NULL
||
argument
!=
NULL
||
bytes
!=
0
);
// set parameter value
...
...
@@ -1657,14 +1707,14 @@ void addExprParams(SSqlExpr* pExpr, char* argument, int32_t type, int32_t bytes)
assert
(
pExpr
->
numOfParams
<=
3
);
}
SExprInfo
*
tsc
Sql
ExprGet
(
SQueryInfo
*
pQueryInfo
,
int32_t
index
)
{
SExprInfo
*
tscExprGet
(
SQueryInfo
*
pQueryInfo
,
int32_t
index
)
{
return
taosArrayGetP
(
pQueryInfo
->
exprList
,
index
);
}
/*
* NOTE: Does not release SExprInfo here.
*/
void
tsc
SqlExprInfo
Destroy
(
SArray
*
pExprInfo
)
{
void
tsc
Expr
Destroy
(
SArray
*
pExprInfo
)
{
size_t
size
=
taosArrayGetSize
(
pExprInfo
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
...
...
@@ -1675,7 +1725,7 @@ void tscSqlExprInfoDestroy(SArray* pExprInfo) {
taosArrayDestroy
(
pExprInfo
);
}
int32_t
tsc
Sql
ExprCopy
(
SArray
*
dst
,
const
SArray
*
src
,
uint64_t
uid
,
bool
deepcopy
)
{
int32_t
tscExprCopy
(
SArray
*
dst
,
const
SArray
*
src
,
uint64_t
uid
,
bool
deepcopy
)
{
assert
(
src
!=
NULL
&&
dst
!=
NULL
);
size_t
size
=
taosArrayGetSize
(
src
);
...
...
@@ -1685,7 +1735,7 @@ int32_t tscSqlExprCopy(SArray* dst, const SArray* src, uint64_t uid, bool deepco
if
(
pExpr
->
base
.
uid
==
uid
)
{
if
(
deepcopy
)
{
SExprInfo
*
p1
=
calloc
(
1
,
sizeof
(
SExprInfo
));
tsc
Sql
ExprAssign
(
p1
,
pExpr
);
tscExprAssign
(
p1
,
pExpr
);
taosArrayPush
(
dst
,
&
p1
);
}
else
{
...
...
@@ -1724,7 +1774,7 @@ bool tscColumnExists(SArray* pColumnList, int32_t columnIndex, uint64_t uid) {
return
true
;
}
void
tsc
Sql
ExprAssign
(
SExprInfo
*
dst
,
const
SExprInfo
*
src
)
{
void
tscExprAssign
(
SExprInfo
*
dst
,
const
SExprInfo
*
src
)
{
assert
(
dst
!=
NULL
&&
src
!=
NULL
);
*
dst
=
*
src
;
...
...
@@ -2138,9 +2188,9 @@ void tscGetSrcColumnInfo(SSrcColumnInfo* pColInfo, SQueryInfo* pQueryInfo) {
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
SSchema
*
pSchema
=
tscGetTableSchema
(
pTableMetaInfo
->
pTableMeta
);
size_t
numOfExprs
=
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
size_t
numOfExprs
=
tscNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
i
);
pColInfo
[
i
].
functionId
=
pExpr
->
base
.
functionId
;
if
(
TSDB_COL_IS_TAG
(
pExpr
->
base
.
colInfo
.
flag
))
{
...
...
@@ -2193,11 +2243,12 @@ bool tscShouldBeFreed(SSqlObj* pSql) {
* @return
*/
STableMetaInfo
*
tscGetTableMetaInfoFromCmd
(
SSqlCmd
*
pCmd
,
int32_t
clauseIndex
,
int32_t
tableIndex
)
{
if
(
pCmd
==
NULL
||
pCmd
->
numOfClause
==
0
)
{
return
NULL
;
}
assert
(
pCmd
!=
NULL
);
// if (pCmd == NULL || pCmd->numOfClause == 0) {
// return NULL;
// }
assert
(
clauseIndex
>=
0
&&
clauseIndex
<
pCmd
->
numOfClause
);
//
assert(clauseIndex >= 0 && clauseIndex < pCmd->numOfClause);
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
clauseIndex
);
return
tscGetMetaInfo
(
pQueryInfo
,
tableIndex
);
...
...
@@ -2272,13 +2323,13 @@ int32_t tscAddQueryInfo(SSqlCmd* pCmd) {
assert
(
pCmd
!=
NULL
);
// todo refactor: remove this structure
size_t
s
=
pCmd
->
numOfClause
+
1
;
char
*
tmp
=
realloc
(
pCmd
->
pQueryInfo
,
s
*
POINTER_BYTES
);
if
(
tmp
==
NULL
)
{
return
TSDB_CODE_TSC_OUT_OF_MEMORY
;
}
//
size_t s = pCmd->numOfClause + 1;
//
char* tmp = realloc(pCmd->pQueryInfo, s * POINTER_BYTES);
//
if (tmp == NULL) {
//
return TSDB_CODE_TSC_OUT_OF_MEMORY;
//
}
pCmd
->
pQueryInfo
=
(
SQueryInfo
**
)
tmp
;
//
pCmd->pQueryInfo = (SQueryInfo**)tmp;
SQueryInfo
*
pQueryInfo
=
calloc
(
1
,
sizeof
(
SQueryInfo
));
if
(
pQueryInfo
==
NULL
)
{
...
...
@@ -2290,7 +2341,19 @@ int32_t tscAddQueryInfo(SSqlCmd* pCmd) {
pQueryInfo
->
window
=
TSWINDOW_INITIALIZER
;
pQueryInfo
->
msg
=
pCmd
->
payload
;
// pointer to the parent error message buffer
pCmd
->
pQueryInfo
[
pCmd
->
numOfClause
++
]
=
pQueryInfo
;
if
(
pCmd
->
pQueryInfo
==
NULL
)
{
pCmd
->
pQueryInfo
=
pQueryInfo
;
}
else
{
SQueryInfo
*
p
=
pCmd
->
pQueryInfo
;
while
(
p
->
sibling
!=
NULL
)
{
p
=
p
->
sibling
;
}
p
->
sibling
=
pQueryInfo
;
}
pCmd
->
active
=
pQueryInfo
;
// pCmd->pQueryInfo[pCmd->numOfClause++] = pQueryInfo;
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -2298,7 +2361,7 @@ static void freeQueryInfoImpl(SQueryInfo* pQueryInfo) {
tscTagCondRelease
(
&
pQueryInfo
->
tagCond
);
tscFieldInfoClear
(
&
pQueryInfo
->
fieldsInfo
);
tsc
SqlExprInfo
Destroy
(
pQueryInfo
->
exprList
);
tsc
Expr
Destroy
(
pQueryInfo
->
exprList
);
pQueryInfo
->
exprList
=
NULL
;
tscColumnListDestroy
(
pQueryInfo
->
colList
);
...
...
@@ -2320,9 +2383,11 @@ static void freeQueryInfoImpl(SQueryInfo* pQueryInfo) {
}
void
tscClearSubqueryInfo
(
SSqlCmd
*
pCmd
)
{
for
(
int32_t
i
=
0
;
i
<
pCmd
->
numOfClause
;
++
i
)
{
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
i
);
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
while
(
pQueryInfo
!=
NULL
)
{
SQueryInfo
*
p
=
pQueryInfo
->
sibling
;
freeQueryInfoImpl
(
pQueryInfo
);
pQueryInfo
=
p
;
}
}
...
...
@@ -2535,14 +2600,14 @@ SSqlObj* createSimpleSubObj(SSqlObj* pSql, __async_cb_func_t fp, void* param, in
}
static
void
doSetSqlExprAndResultFieldInfo
(
SQueryInfo
*
pNewQueryInfo
,
int64_t
uid
)
{
int32_t
numOfOutput
=
(
int32_t
)
tsc
SqlExpr
NumOfExprs
(
pNewQueryInfo
);
int32_t
numOfOutput
=
(
int32_t
)
tscNumOfExprs
(
pNewQueryInfo
);
if
(
numOfOutput
==
0
)
{
return
;
}
// set the field info in pNewQueryInfo object according to sqlExpr information
for
(
int32_t
i
=
0
;
i
<
numOfOutput
;
++
i
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pNewQueryInfo
,
i
);
SExprInfo
*
pExpr
=
tscExprGet
(
pNewQueryInfo
,
i
);
TAOS_FIELD
f
=
tscCreateField
((
int8_t
)
pExpr
->
base
.
resType
,
pExpr
->
base
.
aliasName
,
pExpr
->
base
.
resBytes
);
SInternalField
*
pInfo1
=
tscFieldInfoAppend
(
&
pNewQueryInfo
->
fieldsInfo
,
&
f
);
...
...
@@ -2556,7 +2621,7 @@ static void doSetSqlExprAndResultFieldInfo(SQueryInfo* pNewQueryInfo, int64_t ui
bool
matched
=
false
;
for
(
int32_t
k1
=
0
;
k1
<
numOfOutput
;
++
k1
)
{
SExprInfo
*
pExpr1
=
tsc
Sql
ExprGet
(
pNewQueryInfo
,
k1
);
SExprInfo
*
pExpr1
=
tscExprGet
(
pNewQueryInfo
,
k1
);
if
(
strcmp
(
field
->
name
,
pExpr1
->
base
.
aliasName
)
==
0
)
{
// establish link according to the result field name
SInternalField
*
pInfo
=
tscFieldInfoGetInternalField
(
&
pNewQueryInfo
->
fieldsInfo
,
f
);
...
...
@@ -2599,7 +2664,6 @@ SSqlObj* createSubqueryObj(SSqlObj* pSql, int16_t tableIndex, __async_cb_func_t
pnCmd
->
allocSize
=
0
;
pnCmd
->
pQueryInfo
=
NULL
;
pnCmd
->
numOfClause
=
0
;
pnCmd
->
clauseIndex
=
0
;
pnCmd
->
pDataBlocks
=
NULL
;
...
...
@@ -2686,7 +2750,7 @@ SSqlObj* createSubqueryObj(SSqlObj* pSql, int16_t tableIndex, __async_cb_func_t
TSDB_QUERY_SET_TYPE
(
pNewQueryInfo
->
type
,
TSDB_QUERY_TYPE_SUBQUERY
);
// it must be the subquery
}
if
(
tsc
Sql
ExprCopy
(
pNewQueryInfo
->
exprList
,
pQueryInfo
->
exprList
,
uid
,
true
)
!=
0
)
{
if
(
tscExprCopy
(
pNewQueryInfo
->
exprList
,
pQueryInfo
->
exprList
,
uid
,
true
)
!=
0
)
{
terrno
=
TSDB_CODE_TSC_OUT_OF_MEMORY
;
goto
_error
;
}
...
...
@@ -2746,7 +2810,7 @@ SSqlObj* createSubqueryObj(SSqlObj* pSql, int16_t tableIndex, __async_cb_func_t
tscDebug
(
"0x%"
PRIx64
" new subquery:0x%"
PRIx64
", tableIndex:%d, vgroupIndex:%d, type:%d, exprInfo:%"
PRIzu
", colList:%"
PRIzu
","
"fieldInfo:%d, name:%s, qrang:%"
PRId64
" - %"
PRId64
" order:%d, limit:%"
PRId64
,
pSql
->
self
,
pNew
->
self
,
tableIndex
,
pTableMetaInfo
->
vgroupIndex
,
pNewQueryInfo
->
type
,
tsc
SqlExpr
NumOfExprs
(
pNewQueryInfo
),
pSql
->
self
,
pNew
->
self
,
tableIndex
,
pTableMetaInfo
->
vgroupIndex
,
pNewQueryInfo
->
type
,
tscNumOfExprs
(
pNewQueryInfo
),
size
,
pNewQueryInfo
->
fieldsInfo
.
numOfOutput
,
tNameGetTableName
(
&
pFinalInfo
->
name
),
pNewQueryInfo
->
window
.
skey
,
pNewQueryInfo
->
window
.
ekey
,
pNewQueryInfo
->
order
.
order
,
pNewQueryInfo
->
limit
.
limit
);
...
...
@@ -2923,17 +2987,15 @@ bool tscIsQueryWithLimit(SSqlObj* pSql) {
}
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
for
(
int32_t
i
=
0
;
i
<
pCmd
->
numOfClause
;
++
i
)
{
SQueryInfo
*
pqi
=
tscGetQueryInfoS
(
pCmd
,
i
);
if
(
pqi
==
NULL
)
{
continue
;
}
SQueryInfo
*
pqi
=
tscGetQueryInfo
(
pCmd
,
0
);
while
(
pqi
!=
NULL
)
{
if
(
pqi
->
limit
.
limit
>
0
)
{
return
true
;
}
pqi
=
pqi
->
sibling
;
}
return
false
;
}
...
...
@@ -3027,7 +3089,8 @@ bool hasMoreVnodesToTry(SSqlObj* pSql) {
}
bool
hasMoreClauseToTry
(
SSqlObj
*
pSql
)
{
return
pSql
->
cmd
.
clauseIndex
<
pSql
->
cmd
.
numOfClause
-
1
;
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
return
pCmd
->
active
->
sibling
!=
NULL
;
}
void
tscTryQueryNextVnode
(
SSqlObj
*
pSql
,
__async_cb_func_t
fp
)
{
...
...
@@ -3090,9 +3153,6 @@ void tscTryQueryNextClause(SSqlObj* pSql, __async_cb_func_t fp) {
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
SSqlRes
*
pRes
=
&
pSql
->
res
;
// current subclause is completed, try the next subclause
assert
(
pCmd
->
clauseIndex
<
pCmd
->
numOfClause
-
1
);
pCmd
->
clauseIndex
++
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
...
...
@@ -3108,7 +3168,7 @@ void tscTryQueryNextClause(SSqlObj* pSql, __async_cb_func_t fp) {
pSql
->
subState
.
numOfSub
=
0
;
pSql
->
fp
=
fp
;
tscDebug
(
"0x%"
PRIx64
" try data in the next subclause:%d
, total subclause:%d"
,
pSql
->
self
,
pCmd
->
clauseIndex
,
pCmd
->
numOfClause
);
tscDebug
(
"0x%"
PRIx64
" try data in the next subclause:%d
"
,
pSql
->
self
,
pCmd
->
clauseIndex
);
if
(
pCmd
->
command
>
TSDB_SQL_LOCAL
)
{
tscProcessLocalCmd
(
pSql
);
}
else
{
...
...
@@ -3371,69 +3431,78 @@ STableMeta* tscTableMetaDup(STableMeta* pTableMeta) {
return
p
;
}
static
int32_t
createSecondaryExpr
(
SQueryAttr
*
pQueryAttr
,
SQueryInfo
*
pQueryInfo
,
STableMetaInfo
*
pTableMetaInfo
)
{
if
(
!
tscIsSecondStageQuery
(
pQueryInfo
)
)
{
int32_t
createProjectionExpr
(
SQueryInfo
*
pQueryInfo
,
STableMetaInfo
*
pTableMetaInfo
,
SExprInfo
***
pExpr
,
int32_t
*
num
)
{
if
(
!
pQueryInfo
->
arithmeticOnAgg
)
{
return
TSDB_CODE_SUCCESS
;
}
pQueryAttr
->
numOfExpr2
=
tscNumOfFields
(
pQueryInfo
);
pQueryAttr
->
pExpr2
=
calloc
(
pQueryAttr
->
numOfExpr2
,
sizeof
(
SExprInfo
)
);
if
(
pQueryAttr
->
pExpr2
==
NULL
)
{
*
num
=
tscNumOfFields
(
pQueryInfo
);
*
pExpr
=
calloc
(
*
(
num
),
POINTER_BYTES
);
if
(
(
*
pExpr
)
==
NULL
)
{
return
TSDB_CODE_TSC_OUT_OF_MEMORY
;
}
for
(
int32_t
i
=
0
;
i
<
pQueryAttr
->
numOfExpr2
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
(
*
num
)
;
++
i
)
{
SInternalField
*
pField
=
tscFieldInfoGetInternalField
(
&
pQueryInfo
->
fieldsInfo
,
i
);
SExprInfo
*
pExpr
=
pField
->
pExpr
;
SExprInfo
*
pSource
=
pField
->
pExpr
;
SExprInfo
*
px
=
calloc
(
1
,
sizeof
(
SExprInfo
));
(
*
pExpr
)[
i
]
=
px
;
SSqlExpr
*
pse
=
&
p
QueryAttr
->
pExpr2
[
i
].
base
;
SSqlExpr
*
pse
=
&
p
x
->
base
;
pse
->
uid
=
pTableMetaInfo
->
pTableMeta
->
id
.
uid
;
pse
->
resColId
=
pExpr
->
base
.
resColId
;
pse
->
resColId
=
pSource
->
base
.
resColId
;
strncpy
(
pse
->
aliasName
,
pSource
->
base
.
aliasName
,
tListLen
(
pse
->
aliasName
));
strncpy
(
pse
->
token
,
pSource
->
base
.
token
,
tListLen
(
pse
->
token
));
if
(
p
Expr
->
base
.
functionId
!=
TSDB_FUNC_ARITHM
)
{
// this should be switched to projection query
if
(
p
Source
->
base
.
functionId
!=
TSDB_FUNC_ARITHM
)
{
// this should be switched to projection query
pse
->
numOfParams
=
0
;
// no params for projection query
pse
->
functionId
=
TSDB_FUNC_PRJ
;
pse
->
colInfo
.
colId
=
p
Expr
->
base
.
resColId
;
pse
->
colInfo
.
colId
=
p
Source
->
base
.
resColId
;
for
(
int32_t
j
=
0
;
j
<
pQueryAttr
->
numOfOutput
;
++
j
)
{
if
(
pQueryAttr
->
pExpr1
[
j
].
base
.
resColId
==
pse
->
colInfo
.
colId
)
{
int32_t
numOfOutput
=
(
int32_t
)
taosArrayGetSize
(
pQueryInfo
->
exprList
);
for
(
int32_t
j
=
0
;
j
<
numOfOutput
;
++
j
)
{
SExprInfo
*
px
=
taosArrayGetP
(
pQueryInfo
->
exprList
,
j
);
if
(
px
->
base
.
resColId
==
pse
->
colInfo
.
colId
)
{
pse
->
colInfo
.
colIndex
=
j
;
break
;
}
}
pse
->
colInfo
.
flag
=
TSDB_COL_NORMAL
;
pse
->
resType
=
pExpr
->
base
.
resType
;
pse
->
resBytes
=
pExpr
->
base
.
resBytes
;
pse
->
resType
=
pSource
->
base
.
resType
;
pse
->
resBytes
=
pSource
->
base
.
resBytes
;
strncpy
(
pse
->
colInfo
.
name
,
pSource
->
base
.
aliasName
,
tListLen
(
pse
->
colInfo
.
name
));
// TODO restore refactor
int32_t
functionId
=
p
Expr
->
base
.
functionId
;
if
(
p
Expr
->
base
.
functionId
==
TSDB_FUNC_FIRST_DST
)
{
int32_t
functionId
=
p
Source
->
base
.
functionId
;
if
(
p
Source
->
base
.
functionId
==
TSDB_FUNC_FIRST_DST
)
{
functionId
=
TSDB_FUNC_FIRST
;
}
else
if
(
p
Expr
->
base
.
functionId
==
TSDB_FUNC_LAST_DST
)
{
}
else
if
(
p
Source
->
base
.
functionId
==
TSDB_FUNC_LAST_DST
)
{
functionId
=
TSDB_FUNC_LAST
;
}
else
if
(
p
Expr
->
base
.
functionId
==
TSDB_FUNC_STDDEV_DST
)
{
}
else
if
(
p
Source
->
base
.
functionId
==
TSDB_FUNC_STDDEV_DST
)
{
functionId
=
TSDB_FUNC_STDDEV
;
}
int32_t
inter
=
0
;
getResultDataInfo
(
p
Expr
->
base
.
colType
,
pExpr
->
base
.
colBytes
,
functionId
,
0
,
&
pse
->
resType
,
getResultDataInfo
(
p
Source
->
base
.
colType
,
pSource
->
base
.
colBytes
,
functionId
,
0
,
&
pse
->
resType
,
&
pse
->
resBytes
,
&
inter
,
0
,
false
);
pse
->
colType
=
pse
->
resType
;
pse
->
colBytes
=
pse
->
resBytes
;
}
else
{
// arithmetic expression
pse
->
colInfo
.
colId
=
p
Expr
->
base
.
colInfo
.
colId
;
pse
->
colType
=
p
Expr
->
base
.
colType
;
pse
->
colBytes
=
p
Expr
->
base
.
colBytes
;
pse
->
colInfo
.
colId
=
p
Source
->
base
.
colInfo
.
colId
;
pse
->
colType
=
p
Source
->
base
.
colType
;
pse
->
colBytes
=
p
Source
->
base
.
colBytes
;
pse
->
resBytes
=
sizeof
(
double
);
pse
->
resType
=
TSDB_DATA_TYPE_DOUBLE
;
pse
->
functionId
=
p
Expr
->
base
.
functionId
;
pse
->
numOfParams
=
p
Expr
->
base
.
numOfParams
;
pse
->
functionId
=
p
Source
->
base
.
functionId
;
pse
->
numOfParams
=
p
Source
->
base
.
numOfParams
;
for
(
int32_t
j
=
0
;
j
<
p
Expr
->
base
.
numOfParams
;
++
j
)
{
tVariantAssign
(
&
pse
->
param
[
j
],
&
p
Expr
->
base
.
param
[
j
]);
buildArithmeticExprFromMsg
(
&
pQueryAttr
->
pExpr2
[
i
]
,
NULL
);
for
(
int32_t
j
=
0
;
j
<
p
Source
->
base
.
numOfParams
;
++
j
)
{
tVariantAssign
(
&
pse
->
param
[
j
],
&
p
Source
->
base
.
param
[
j
]);
buildArithmeticExprFromMsg
(
px
,
NULL
);
}
}
}
...
...
@@ -3444,7 +3513,7 @@ static int32_t createSecondaryExpr(SQueryAttr* pQueryAttr, SQueryInfo* pQueryInf
static
int32_t
createGlobalAggregateExpr
(
SQueryAttr
*
pQueryAttr
,
SQueryInfo
*
pQueryInfo
)
{
assert
(
tscIsTwoStageSTableQuery
(
pQueryInfo
,
0
));
pQueryAttr
->
numOfExpr3
=
(
int32_t
)
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
pQueryAttr
->
numOfExpr3
=
(
int32_t
)
tscNumOfExprs
(
pQueryInfo
);
pQueryAttr
->
pExpr3
=
calloc
(
pQueryAttr
->
numOfExpr3
,
sizeof
(
SExprInfo
));
if
(
pQueryAttr
->
pExpr3
==
NULL
)
{
return
TSDB_CODE_TSC_OUT_OF_MEMORY
;
...
...
@@ -3454,7 +3523,7 @@ static int32_t createGlobalAggregateExpr(SQueryAttr* pQueryAttr, SQueryInfo* pQu
SExprInfo
*
pExpr
=
&
pQueryAttr
->
pExpr1
[
i
];
SSqlExpr
*
pse
=
&
pQueryAttr
->
pExpr3
[
i
].
base
;
tsc
Sql
ExprAssign
(
&
pQueryAttr
->
pExpr3
[
i
],
pExpr
);
tscExprAssign
(
&
pQueryAttr
->
pExpr3
[
i
],
pExpr
);
pse
->
colInfo
.
colId
=
pExpr
->
base
.
resColId
;
pse
->
colInfo
.
colIndex
=
i
;
...
...
@@ -3536,7 +3605,7 @@ int32_t tscCreateQueryFromQueryInfo(SQueryInfo* pQueryInfo, SQueryAttr* pQueryAt
memset
(
pQueryAttr
,
0
,
sizeof
(
SQueryAttr
));
int16_t
numOfCols
=
(
int16_t
)
taosArrayGetSize
(
pQueryInfo
->
colList
);
int16_t
numOfOutput
=
(
int16_t
)
tsc
SqlExpr
NumOfExprs
(
pQueryInfo
);
int16_t
numOfOutput
=
(
int16_t
)
tscNumOfExprs
(
pQueryInfo
);
pQueryAttr
->
topBotQuery
=
tscIsTopBotQuery
(
pQueryInfo
);
pQueryAttr
->
hasTagResults
=
hasTagValOutput
(
pQueryInfo
);
...
...
@@ -3571,7 +3640,7 @@ int32_t tscCreateQueryFromQueryInfo(SQueryInfo* pQueryInfo, SQueryAttr* pQueryAt
STableMetaInfo
*
pTableMetaInfo
=
pQueryInfo
->
pTableMetaInfo
[
0
];
pQueryAttr
->
pGroupbyExpr
=
calloc
(
1
,
sizeof
(
S
Sql
GroupbyExpr
));
pQueryAttr
->
pGroupbyExpr
=
calloc
(
1
,
sizeof
(
SGroupbyExpr
));
*
(
pQueryAttr
->
pGroupbyExpr
)
=
pQueryInfo
->
groupbyExpr
;
if
(
pQueryInfo
->
groupbyExpr
.
numOfGroupCols
>
0
)
{
...
...
@@ -3582,8 +3651,8 @@ int32_t tscCreateQueryFromQueryInfo(SQueryInfo* pQueryInfo, SQueryAttr* pQueryAt
pQueryAttr
->
pExpr1
=
calloc
(
pQueryAttr
->
numOfOutput
,
sizeof
(
SExprInfo
));
for
(
int32_t
i
=
0
;
i
<
pQueryAttr
->
numOfOutput
;
++
i
)
{
SExprInfo
*
pExpr
=
tsc
Sql
ExprGet
(
pQueryInfo
,
i
);
tsc
Sql
ExprAssign
(
&
pQueryAttr
->
pExpr1
[
i
],
pExpr
);
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
i
);
tscExprAssign
(
&
pQueryAttr
->
pExpr1
[
i
],
pExpr
);
if
(
pQueryAttr
->
pExpr1
[
i
].
base
.
functionId
==
TSDB_FUNC_ARITHM
)
{
for
(
int32_t
j
=
0
;
j
<
pQueryAttr
->
pExpr1
[
i
].
base
.
numOfParams
;
++
j
)
{
...
...
@@ -3609,13 +3678,21 @@ int32_t tscCreateQueryFromQueryInfo(SQueryInfo* pQueryInfo, SQueryAttr* pQueryAt
}
// for simple table, not for super table
int32_t
code
=
createSecondaryExpr
(
pQueryAttr
,
pQueryInfo
,
pTableMetaInfo
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
if
(
pQueryInfo
->
arithmeticOnAgg
)
{
pQueryAttr
->
numOfExpr2
=
(
int32_t
)
taosArrayGetSize
(
pQueryInfo
->
exprList1
);
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
);
}
}
// int32_t code = createProjectionExpr(pQueryInfo, pTableMetaInfo, &pQueryAttr->pExpr2, &pQueryAttr->numOfExpr2);
// if (code != TSDB_CODE_SUCCESS) {
// return code;
// }
// tag column info
code
=
createTagColumnInfo
(
pQueryAttr
,
pQueryInfo
,
pTableMetaInfo
);
int32_t
code
=
createTagColumnInfo
(
pQueryAttr
,
pQueryInfo
,
pTableMetaInfo
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
}
...
...
src/common/inc/tname.h
浏览文件 @
c18dd031
...
...
@@ -44,8 +44,8 @@ typedef struct SResPair {
// the structure for sql function in select clause
typedef
struct
SSqlExpr
{
char
aliasName
[
TSDB_COL_NAME_LEN
];
// as aliasName
char
token
[
TSDB_COL_NAME_LEN
];
// original token
SColIndex
colInfo
;
uint64_t
uid
;
// refactor use the pointer
int16_t
functionId
;
// function id in aAgg array
...
...
@@ -92,8 +92,6 @@ size_t tableIdPrefix(const char* name, char* prefix, int32_t len);
void
extractTableNameFromToken
(
SStrToken
*
pToken
,
SStrToken
*
pTable
);
//SSchema tGetTbnameColumnSchema();
SSchema
tGetBlockDistColumnSchema
();
SSchema
tGetUserSpecifiedColumnSchema
(
tVariant
*
pVal
,
SStrToken
*
exprStr
,
const
char
*
name
);
...
...
src/common/src/tarithoperator.c
浏览文件 @
c18dd031
...
...
@@ -2569,6 +2569,7 @@ _arithmetic_operator_fn_t getArithmeticOperatorFn(int32_t arithmeticOptr) {
case
TSDB_BINARY_OP_REMAINDER
:
return
vectorRemainder
;
default:
assert
(
0
);
return
NULL
;
}
}
src/common/src/texpr.c
浏览文件 @
c18dd031
...
...
@@ -13,6 +13,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <texpr.h>
#include "os.h"
#include "texpr.h"
...
...
@@ -465,27 +466,29 @@ tExprNode* exprTreeFromTableName(const char* tbnameCond) {
return
expr
;
}
tExprNode
*
exprdup
(
tExprNode
*
p
Tre
e
)
{
if
(
p
Tre
e
==
NULL
)
{
tExprNode
*
exprdup
(
tExprNode
*
p
Nod
e
)
{
if
(
p
Nod
e
==
NULL
)
{
return
NULL
;
}
tExprNode
*
pNode
=
calloc
(
1
,
sizeof
(
tExprNode
));
if
(
pTree
->
nodeType
==
TSQL_NODE_EXPR
)
{
tExprNode
*
pLeft
=
exprdup
(
pTree
->
_node
.
pLeft
);
tExprNode
*
pRight
=
exprdup
(
pTree
->
_node
.
pRight
);
pNode
->
nodeType
=
TSQL_NODE_EXPR
;
pNode
->
_node
.
pLeft
=
pLeft
;
pNode
->
_node
.
pRight
=
pRight
;
}
else
if
(
pTree
->
nodeType
==
TSQL_NODE_VALUE
)
{
pNode
->
pVal
=
calloc
(
1
,
sizeof
(
tVariant
));
tVariantAssign
(
pNode
->
pVal
,
pTree
->
pVal
);
}
else
if
(
pTree
->
nodeType
==
TSQL_NODE_COL
)
{
pNode
->
pSchema
=
calloc
(
1
,
sizeof
(
SSchema
));
*
pNode
->
pSchema
=
*
pTree
->
pSchema
;
tExprNode
*
pCloned
=
calloc
(
1
,
sizeof
(
tExprNode
));
if
(
pNode
->
nodeType
==
TSQL_NODE_EXPR
)
{
tExprNode
*
pLeft
=
exprdup
(
pNode
->
_node
.
pLeft
);
tExprNode
*
pRight
=
exprdup
(
pNode
->
_node
.
pRight
);
pCloned
->
_node
.
pLeft
=
pLeft
;
pCloned
->
_node
.
pRight
=
pRight
;
pCloned
->
_node
.
optr
=
pNode
->
_node
.
optr
;
pCloned
->
_node
.
hasPK
=
pNode
->
_node
.
hasPK
;
}
else
if
(
pNode
->
nodeType
==
TSQL_NODE_VALUE
)
{
pCloned
->
pVal
=
calloc
(
1
,
sizeof
(
tVariant
));
tVariantAssign
(
pCloned
->
pVal
,
pNode
->
pVal
);
}
else
if
(
pNode
->
nodeType
==
TSQL_NODE_COL
)
{
pCloned
->
pSchema
=
calloc
(
1
,
sizeof
(
SSchema
));
*
pCloned
->
pSchema
=
*
pNode
->
pSchema
;
}
return
pNode
;
pCloned
->
nodeType
=
pNode
->
nodeType
;
return
pCloned
;
}
src/query/inc/qExecutor.h
浏览文件 @
c18dd031
...
...
@@ -70,13 +70,13 @@ typedef struct SResultRowPool {
SArray
*
pData
;
// SArray<void*>
}
SResultRowPool
;
typedef
struct
S
Sql
GroupbyExpr
{
typedef
struct
SGroupbyExpr
{
int16_t
tableIndex
;
SArray
*
columnInfo
;
// SArray<SColIndex>, group by columns information
int16_t
numOfGroupCols
;
int16_t
numOfGroupCols
;
// todo remove it
int16_t
orderIndex
;
// order by column index
int16_t
orderType
;
// order by type: asc/desc
}
S
Sql
GroupbyExpr
;
}
SGroupbyExpr
;
typedef
struct
SResultRow
{
int32_t
pageId
;
// pageId & rowId is the position of current result in disk-based output buffer
...
...
@@ -216,7 +216,7 @@ typedef struct SQueryAttr {
int32_t
intermediateResultRowSize
;
// intermediate result row size, in case of top-k query.
int32_t
maxTableColumnWidth
;
int32_t
tagLen
;
// tag value length of current query
S
Sql
GroupbyExpr
*
pGroupbyExpr
;
SGroupbyExpr
*
pGroupbyExpr
;
SExprInfo
*
pExpr1
;
SExprInfo
*
pExpr2
;
...
...
@@ -362,7 +362,7 @@ typedef struct SQueryParam {
SColIndex
*
pGroupColIndex
;
SColumnInfo
*
pTagColumnInfo
;
S
Sql
GroupbyExpr
*
pGroupbyExpr
;
SGroupbyExpr
*
pGroupbyExpr
;
int32_t
tableScanOperator
;
SArray
*
pOperator
;
}
SQueryParam
;
...
...
@@ -536,8 +536,8 @@ int32_t createQueryFunc(SQueriedTableInfo* pTableInfo, int32_t numOfOutput, SExp
int32_t
createIndirectQueryFuncExprFromMsg
(
SQueryTableMsg
*
pQueryMsg
,
int32_t
numOfOutput
,
SExprInfo
**
pExprInfo
,
SSqlExpr
**
pExpr
,
SExprInfo
*
prevExpr
);
S
Sql
GroupbyExpr
*
createGroupbyExprFromMsg
(
SQueryTableMsg
*
pQueryMsg
,
SColIndex
*
pColIndex
,
int32_t
*
code
);
SQInfo
*
createQInfoImpl
(
SQueryTableMsg
*
pQueryMsg
,
S
Sql
GroupbyExpr
*
pGroupbyExpr
,
SExprInfo
*
pExprs
,
SGroupbyExpr
*
createGroupbyExprFromMsg
(
SQueryTableMsg
*
pQueryMsg
,
SColIndex
*
pColIndex
,
int32_t
*
code
);
SQInfo
*
createQInfoImpl
(
SQueryTableMsg
*
pQueryMsg
,
SGroupbyExpr
*
pGroupbyExpr
,
SExprInfo
*
pExprs
,
SExprInfo
*
pSecExprs
,
STableGroupInfo
*
pTableGroupInfo
,
SColumnInfo
*
pTagCols
,
int32_t
vgId
,
char
*
sql
,
uint64_t
*
qId
);
int32_t
initQInfo
(
STsBufInfo
*
pTsBufInfo
,
void
*
tsdb
,
void
*
sourceOptr
,
SQInfo
*
pQInfo
,
SQueryParam
*
param
,
char
*
start
,
...
...
src/query/inc/qFill.h
浏览文件 @
c18dd031
...
...
@@ -62,7 +62,7 @@ typedef struct SFillInfo {
SFillColInfo
*
pFillCol
;
// column info for fill operations
SFillTagColInfo
*
pTags
;
// tags value for filling gap
void
*
handle
;
// for d
u
bug purpose
void
*
handle
;
// for d
e
bug purpose
}
SFillInfo
;
typedef
struct
SPoint
{
...
...
src/query/inc/qPlan.h
浏览文件 @
c18dd031
...
...
@@ -16,7 +16,38 @@
#ifndef TDENGINE_QPLAN_H
#define TDENGINE_QPLAN_H
//TODO refactor
struct
SQueryInfo
;
typedef
struct
SQueryNodeBasicInfo
{
int32_t
type
;
char
*
name
;
}
SQueryNodeBasicInfo
;
typedef
struct
SQueryTableInfo
{
char
*
tableName
;
STableId
id
;
}
SQueryTableInfo
;
typedef
struct
SQueryNode
{
SQueryNodeBasicInfo
info
;
SQueryTableInfo
tableInfo
;
SSchema
*
pSchema
;
// the schema of the input SSDatablock
int32_t
numOfCols
;
// number of input columns
SExprInfo
*
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
;
SQueryNode
*
qCreateQueryPlan
(
struct
SQueryInfo
*
pQueryInfo
);
void
*
qDestroyQueryPlan
(
SQueryNode
*
pQueryNode
);
char
*
queryPlanToString
(
SQueryNode
*
pQueryNode
);
SArray
*
createTableScanPlan
(
SQueryAttr
*
pQueryAttr
);
SArray
*
createExecOperatorPlan
(
SQueryAttr
*
pQueryAttr
);
SArray
*
createGlobalMergePlan
(
SQueryAttr
*
pQueryAttr
);
...
...
src/query/inc/qUtil.h
浏览文件 @
c18dd031
...
...
@@ -47,6 +47,8 @@ void clearResultRow(SQueryRuntimeEnv* pRuntimeEnv, SResultRow* pResultRow, in
SResultRowCellInfo
*
getResultCell
(
const
SResultRow
*
pRow
,
int32_t
index
,
int32_t
*
offset
);
void
*
destroyQueryFuncExpr
(
SExprInfo
*
pExprInfo
,
int32_t
numOfExpr
);
static
FORCE_INLINE
SResultRow
*
getResultRow
(
SResultRowInfo
*
pResultRowInfo
,
int32_t
slot
)
{
assert
(
pResultRowInfo
!=
NULL
&&
slot
>=
0
&&
slot
<
pResultRowInfo
->
size
);
return
pResultRowInfo
->
pResult
[
slot
];
...
...
src/query/src/qAggMain.c
浏览文件 @
c18dd031
...
...
@@ -3700,7 +3700,7 @@ char *getArithColumnData(void *param, const char* name, int32_t colId) {
}
}
assert
(
index
>=
0
/*&& colId >= 0*/
);
assert
(
index
>=
0
);
return
pSupport
->
data
[
index
]
+
pSupport
->
offset
*
pSupport
->
colList
[
index
].
bytes
;
}
...
...
src/query/src/qExecutor.c
浏览文件 @
c18dd031
...
...
@@ -189,7 +189,7 @@ static void destroyOperatorInfo(SOperatorInfo* pOperator);
static
int32_t
doCopyToSDataBlock
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SGroupResInfo
*
pGroupResInfo
,
int32_t
orderType
,
SSDataBlock
*
pBlock
);
static
int32_t
getGroupbyColumnIndex
(
S
Sql
GroupbyExpr
*
pGroupbyExpr
,
SSDataBlock
*
pDataBlock
);
static
int32_t
getGroupbyColumnIndex
(
SGroupbyExpr
*
pGroupbyExpr
,
SSDataBlock
*
pDataBlock
);
static
int32_t
setGroupResultOutputBuf
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SGroupbyOperatorInfo
*
pInfo
,
int32_t
numOfCols
,
char
*
pData
,
int16_t
type
,
int16_t
bytes
,
int32_t
groupIndex
);
static
void
initCtxOutputBuffer
(
SQLFunctionCtx
*
pCtx
,
int32_t
size
);
...
...
@@ -1418,7 +1418,7 @@ static int32_t setGroupResultOutputBuf(SQueryRuntimeEnv *pRuntimeEnv, SGroupbyOp
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
getGroupbyColumnIndex
(
S
Sql
GroupbyExpr
*
pGroupbyExpr
,
SSDataBlock
*
pDataBlock
)
{
static
int32_t
getGroupbyColumnIndex
(
SGroupbyExpr
*
pGroupbyExpr
,
SSDataBlock
*
pDataBlock
)
{
for
(
int32_t
k
=
0
;
k
<
pGroupbyExpr
->
numOfGroupCols
;
++
k
)
{
SColIndex
*
pColIndex
=
taosArrayGet
(
pGroupbyExpr
->
columnInfo
,
k
);
if
(
TSDB_COL_IS_TAG
(
pColIndex
->
flag
))
{
...
...
@@ -6603,13 +6603,13 @@ int32_t createIndirectQueryFuncExprFromMsg(SQueryTableMsg* pQueryMsg, int32_t nu
return
TSDB_CODE_SUCCESS
;
}
S
Sql
GroupbyExpr
*
createGroupbyExprFromMsg
(
SQueryTableMsg
*
pQueryMsg
,
SColIndex
*
pColIndex
,
int32_t
*
code
)
{
SGroupbyExpr
*
createGroupbyExprFromMsg
(
SQueryTableMsg
*
pQueryMsg
,
SColIndex
*
pColIndex
,
int32_t
*
code
)
{
if
(
pQueryMsg
->
numOfGroupCols
==
0
)
{
return
NULL
;
}
// using group by tag columns
S
SqlGroupbyExpr
*
pGroupbyExpr
=
(
SSqlGroupbyExpr
*
)
calloc
(
1
,
sizeof
(
SSql
GroupbyExpr
));
S
GroupbyExpr
*
pGroupbyExpr
=
(
SGroupbyExpr
*
)
calloc
(
1
,
sizeof
(
S
GroupbyExpr
));
if
(
pGroupbyExpr
==
NULL
)
{
*
code
=
TSDB_CODE_QRY_OUT_OF_MEMORY
;
return
NULL
;
...
...
@@ -6770,7 +6770,7 @@ FORCE_INLINE bool checkQIdEqual(void *qHandle, uint64_t qId) {
return
((
SQInfo
*
)
qHandle
)
->
qId
==
qId
;
}
SQInfo
*
createQInfoImpl
(
SQueryTableMsg
*
pQueryMsg
,
S
Sql
GroupbyExpr
*
pGroupbyExpr
,
SExprInfo
*
pExprs
,
SQInfo
*
createQInfoImpl
(
SQueryTableMsg
*
pQueryMsg
,
SGroupbyExpr
*
pGroupbyExpr
,
SExprInfo
*
pExprs
,
SExprInfo
*
pSecExprs
,
STableGroupInfo
*
pTableGroupInfo
,
SColumnInfo
*
pTagCols
,
int32_t
vgId
,
char
*
sql
,
uint64_t
*
qId
)
{
int16_t
numOfCols
=
pQueryMsg
->
numOfCols
;
...
...
@@ -7073,7 +7073,7 @@ static void doDestroyTableQueryInfo(STableGroupInfo* pTableqinfoGroupInfo) {
pTableqinfoGroupInfo
->
numOfTables
=
0
;
}
static
void
*
destroyQueryFuncExpr
(
SExprInfo
*
pExprInfo
,
int32_t
numOfExpr
)
{
void
*
destroyQueryFuncExpr
(
SExprInfo
*
pExprInfo
,
int32_t
numOfExpr
)
{
if
(
pExprInfo
==
NULL
)
{
assert
(
numOfExpr
==
0
);
return
NULL
;
...
...
src/query/src/qPlan.c
浏览文件 @
c18dd031
#include <tscUtil.h>
#include "os.h"
#include "qExecutor.h"
#include "qUtil.h"
#include "texpr.h"
#include "qPlan.h"
#include "tsclient.h"
#include "tscUtil.h"
#define QNODE_
PROJECT
1
#define QNODE_
FILTER
2
#define QNODE_
TABLESCAN
3
#define QNODE_
TAGSCAN
1
#define QNODE_
TABLESCAN
2
#define QNODE_
PROJECT
3
#define QNODE_AGGREGATE 4
#define QNODE_GROUPBY 5
#define QNODE_LIMIT 6
...
...
@@ -18,126 +20,492 @@
#define QNODE_SESSIONWINDOW 12
#define QNODE_FILL 13
typedef
struct
S
QueryNodeBasic
Info
{
int32_t
type
;
char
*
name
;
}
S
QueryNodeBasic
Info
;
typedef
struct
S
FillEss
Info
{
int32_t
fillType
;
// fill type
int64_t
*
val
;
// fill value
}
S
FillEss
Info
;
typedef
struct
SQueryNode
{
SQueryNodeBasicInfo
info
;
// char *name; // the name of logic node
// int32_t type; // the type of logic node
SSchema
*
pSchema
;
// the schema of the input SSDatablock
int32_t
numOfCols
;
// number of input columns
SExprInfo
*
pExpr
;
// the query functions or sql aggregations
int32_t
numOfOutput
;
// number of result columns, which is also the number of pExprs
// 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
;
static
SQueryNode
*
createQueryNode
(
int32_t
type
,
const
char
*
name
,
SQueryNode
**
prev
,
int32_t
numOfPrev
)
{
static
SQueryNode
*
createQueryNode
(
int32_t
type
,
const
char
*
name
,
SQueryNode
**
prev
,
int32_t
numOfPrev
,
SExprInfo
**
pExpr
,
int32_t
numOfOutput
,
SQueryTableInfo
*
pTableInfo
,
void
*
pExtInfo
)
{
SQueryNode
*
pNode
=
calloc
(
1
,
sizeof
(
SQueryNode
));
pNode
->
info
.
type
=
type
;
pNode
->
info
.
name
=
strdup
(
name
);
if
(
pTableInfo
->
id
.
uid
!=
0
)
{
// it is a true table
pNode
->
tableInfo
.
id
=
pTableInfo
->
id
;
pNode
->
tableInfo
.
tableName
=
strdup
(
pTableInfo
->
tableName
);
}
pNode
->
numOfOutput
=
numOfOutput
;
pNode
->
pExpr
=
calloc
(
numOfOutput
,
sizeof
(
SExprInfo
));
for
(
int32_t
i
=
0
;
i
<
numOfOutput
;
++
i
)
{
tscExprAssign
(
&
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
->
numOfGroupCols
=
p
->
numOfGroupCols
;
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
(
SLimitVal
));
memcpy
(
pNode
->
pExtInfo
,
pExtInfo
,
sizeof
(
SLimitVal
));
break
;
}
}
return
pNode
;
}
static
SQueryNode
*
doCreateQueryPlanForOneTable
(
SQueryInfo
*
pQueryInfo
)
{
SQueryNode
*
pNode
=
createQueryNode
(
QNODE_TABLESCAN
,
""
,
NULL
,
0
);
static
SQueryNode
*
doAddTableColumnNode
(
SQueryInfo
*
pQueryInfo
,
STableMetaInfo
*
pTableMetaInfo
,
SQueryTableInfo
*
info
,
SArray
*
pExprs
,
SArray
*
tableCols
)
{
if
(
pQueryInfo
->
onlyTagQuery
)
{
int32_t
num
=
taosArrayGetSize
(
pExprs
);
SQueryNode
*
pNode
=
createQueryNode
(
QNODE_TAGSCAN
,
"TableTagScan"
,
NULL
,
0
,
pExprs
->
pData
,
num
,
info
,
NULL
);
if
(
pQueryInfo
->
distinctTag
)
{
pNode
=
createQueryNode
(
QNODE_DISTINCT
,
"Distinct"
,
&
pNode
,
1
,
pExprs
->
pData
,
num
,
info
,
NULL
);
}
// check for filter
if
(
pQueryInfo
->
hasFilter
)
{
pNode
=
createQueryNode
(
QNODE_FILTER
,
""
,
&
pNode
,
1
);
return
pNode
;
}
if
(
pQueryInfo
->
distinctTag
)
{
pNode
=
createQueryNode
(
QNODE_DISTINCT
,
""
,
&
pNode
,
0
);
STimeWindow
*
window
=
&
pQueryInfo
->
window
;
SQueryNode
*
pNode
=
createQueryNode
(
QNODE_TABLESCAN
,
"TableScan"
,
NULL
,
0
,
NULL
,
0
,
info
,
window
);
if
(
pQueryInfo
->
projectionQuery
)
{
int32_t
numOfOutput
=
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
=
taosArrayGetSize
(
tableCols
);
SExprInfo
**
pExpr
=
calloc
(
numOfCols
,
POINTER_BYTES
);
SSchema
*
pSchema
=
pTableMetaInfo
->
pTableMeta
->
schema
;
for
(
int32_t
i
=
0
;
i
<
numOfCols
;
++
i
)
{
SColumn
*
pCol
=
taosArrayGetP
(
tableCols
,
i
);
SColumnIndex
index
=
{.
tableIndex
=
0
,
.
columnIndex
=
pCol
->
columnIndex
};
SExprInfo
*
p
=
tscExprCreate
(
pQueryInfo
,
TSDB_FUNC_PRJ
,
&
index
,
pCol
->
info
.
type
,
pCol
->
info
.
bytes
,
pCol
->
info
.
colId
,
0
,
TSDB_COL_NORMAL
);
strncpy
(
p
->
base
.
aliasName
,
pSchema
[
pCol
->
columnIndex
].
name
,
tListLen
(
p
->
base
.
aliasName
));
}
else
if
(
pQueryInfo
->
projectionQuery
)
{
pNode
=
createQueryNode
(
QNODE_PROJECT
,
""
,
&
pNode
,
1
);
}
else
{
// check for aggregation
pExpr
[
i
]
=
p
;
}
pNode
=
createQueryNode
(
QNODE_PROJECT
,
"Projection"
,
&
pNode
,
1
,
pExpr
,
numOfCols
,
info
,
NULL
);
for
(
int32_t
i
=
0
;
i
<
numOfCols
;
++
i
)
{
destroyQueryFuncExpr
(
pExpr
[
i
],
1
);
}
tfree
(
pExpr
);
}
return
pNode
;
}
static
SQueryNode
*
doCreateQueryPlanForOneTableImpl
(
SQueryInfo
*
pQueryInfo
,
SQueryNode
*
pNode
,
SQueryTableInfo
*
info
,
SArray
*
pExprs
)
{
// check for aggregation
if
(
pQueryInfo
->
interval
.
interval
>
0
)
{
pNode
=
createQueryNode
(
QNODE_TIMEWINDOW
,
""
,
&
pNode
,
1
);
int32_t
numOfOutput
=
taosArrayGetSize
(
pExprs
);
pNode
=
createQueryNode
(
QNODE_TIMEWINDOW
,
"TimeWindowAgg"
,
&
pNode
,
1
,
pExprs
->
pData
,
numOfOutput
,
info
,
&
pQueryInfo
->
interval
);
}
else
if
(
pQueryInfo
->
groupbyColumn
)
{
pNode
=
createQueryNode
(
QNODE_GROUPBY
,
""
,
&
pNode
,
1
);
int32_t
numOfOutput
=
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
,
"
"
,
&
pNode
,
1
);
pNode
=
createQueryNode
(
QNODE_SESSIONWINDOW
,
"
SessionWindowAgg"
,
&
pNode
,
1
,
NULL
,
0
,
info
,
NULL
);
}
else
if
(
pQueryInfo
->
simpleAgg
)
{
pNode
=
createQueryNode
(
QNODE_AGGREGATE
,
""
,
&
pNode
,
1
);
}
if
(
pQueryInfo
->
havingFieldNum
>
0
)
{
pNode
=
createQueryNode
(
QNODE_FILTER
,
""
,
&
pNode
,
1
);
int32_t
numOfOutput
=
taosArrayGetSize
(
pExprs
);
pNode
=
createQueryNode
(
QNODE_AGGREGATE
,
"Aggregate"
,
&
pNode
,
1
,
pExprs
->
pData
,
numOfOutput
,
info
,
NULL
);
}
if
(
pQueryInfo
->
arithmeticOnAgg
)
{
pNode
=
createQueryNode
(
QNODE_PROJECT
,
""
,
&
pNode
,
1
);
if
(
pQueryInfo
->
havingFieldNum
>
0
||
pQueryInfo
->
arithmeticOnAgg
)
{
int32_t
numOfExpr
=
taosArrayGetSize
(
pQueryInfo
->
exprList1
);
pNode
=
createQueryNode
(
QNODE_PROJECT
,
"Projection"
,
&
pNode
,
1
,
pQueryInfo
->
exprList1
->
pData
,
numOfExpr
,
info
,
NULL
);
}
if
(
pQueryInfo
->
fillType
!=
TSDB_FILL_NONE
)
{
pNode
=
createQueryNode
(
QNODE_FILL
,
""
,
&
pNode
,
1
);
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
,
"
"
,
&
pNode
,
1
);
pNode
=
createQueryNode
(
QNODE_LIMIT
,
"
Limit"
,
&
pNode
,
1
,
NULL
,
0
,
info
,
&
pQueryInfo
->
limit
);
}
return
pNode
;
}
SArray
*
qCreateQueryPlan
(
SQueryInfo
*
pQueryInfo
)
{
// join and subquery
static
SQueryNode
*
doCreateQueryPlanForOneTable
(
SQueryInfo
*
pQueryInfo
,
STableMetaInfo
*
pTableMetaInfo
,
SArray
*
pExprs
,
SArray
*
tableCols
)
{
char
name
[
TSDB_TABLE_FNAME_LEN
]
=
{
0
};
tNameExtractFullName
(
&
pTableMetaInfo
->
name
,
name
);
SQueryTableInfo
info
=
{.
tableName
=
strdup
(
name
),
.
id
=
pTableMetaInfo
->
pTableMeta
->
id
,};
// handle the only tag query
SQueryNode
*
pNode
=
doAddTableColumnNode
(
pQueryInfo
,
pTableMetaInfo
,
&
info
,
pExprs
,
tableCols
);
if
(
pQueryInfo
->
onlyTagQuery
)
{
tfree
(
info
.
tableName
);
return
pNode
;
}
SQueryNode
*
pNode1
=
doCreateQueryPlanForOneTableImpl
(
pQueryInfo
,
pNode
,
&
info
,
pExprs
);
tfree
(
info
.
tableName
);
return
pNode1
;
}
SArray
*
createQueryPlanImpl
(
SQueryInfo
*
pQueryInfo
)
{
SArray
*
upstream
=
NULL
;
if
(
pQueryInfo
->
pUpstream
!=
NULL
)
{
// subquery in the from clause
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
)
{
SQueryInfo
*
pq
=
taosArrayGet
(
pQueryInfo
->
pUpstream
,
i
);
SArray
*
p
=
qCreateQueryPlan
(
pq
);
SArray
*
p
=
createQueryPlanImpl
(
pq
);
taosArrayPushBatch
(
upstream
,
p
->
pData
,
(
int32_t
)
taosArrayGetSize
(
p
));
}
}
if
(
pQueryInfo
->
numOfTables
>
1
)
{
// it is a join query
// 1. separate the select clause according to table
int32_t
tableIndex
=
0
;
STableMetaInfo
*
pTableMetaInfo
=
pQueryInfo
->
pTableMetaInfo
[
tableIndex
];
uint64_t
uid
=
pTableMetaInfo
->
pTableMeta
->
id
.
uid
;
upstream
=
taosArrayInit
(
5
,
POINTER_BYTES
);
for
(
int32_t
i
=
0
;
i
<
pQueryInfo
->
numOfTables
;
++
i
)
{
STableMetaInfo
*
pTableMetaInfo
=
pQueryInfo
->
pTableMetaInfo
[
i
];
uint64_t
uid
=
pTableMetaInfo
->
pTableMeta
->
id
.
uid
;
SArray
*
exprList
=
taosArrayInit
(
4
,
POINTER_BYTES
);
if
(
tscExprCopy
(
exprList
,
pQueryInfo
->
exprList
,
uid
,
true
)
!=
0
)
{
terrno
=
TSDB_CODE_TSC_OUT_OF_MEMORY
;
exit
(
-
1
);
}
SArray
*
tableColumnList
=
taosArrayInit
(
4
,
sizeof
(
SColumn
));
tscColumnListCopy
(
tableColumnList
,
pQueryInfo
->
colList
,
uid
);
// 2. create the query execution node
char
name
[
TSDB_TABLE_FNAME_LEN
]
=
{
0
};
tNameExtractFullName
(
&
pTableMetaInfo
->
name
,
name
);
SQueryTableInfo
info
=
{.
tableName
=
strdup
(
name
),
.
id
=
pTableMetaInfo
->
pTableMeta
->
id
,};
SQueryNode
*
pNode
=
doAddTableColumnNode
(
pQueryInfo
,
pTableMetaInfo
,
&
info
,
exprList
,
tableColumnList
);
taosArrayPush
(
upstream
,
&
pNode
);
}
// 3. add the join node here
SQueryTableInfo
info
=
{
0
};
int32_t
num
=
taosArrayGetSize
(
pQueryInfo
->
exprList
);
SQueryNode
*
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
];
SQueryNode
*
pNode
=
doCreateQueryPlanForOneTable
(
pQueryInfo
,
pTableMetaInfo
,
pQueryInfo
->
exprList
,
pQueryInfo
->
colList
);
upstream
=
taosArrayInit
(
5
,
POINTER_BYTES
);
taosArrayPush
(
upstream
,
&
pNode
);
}
return
upstream
;
}
SQueryNode
*
qCreateQueryPlan
(
SQueryInfo
*
pQueryInfo
)
{
SArray
*
upstream
=
createQueryPlanImpl
(
pQueryInfo
);
assert
(
taosArrayGetSize
(
upstream
)
==
1
);
SQueryNode
*
p
=
taosArrayGetP
(
upstream
,
0
);
taosArrayDestroy
(
upstream
);
return
p
;
}
static
void
doDestroyQueryNode
(
SQueryNode
*
pQueryNode
)
{
tfree
(
pQueryNode
->
pExtInfo
);
tfree
(
pQueryNode
->
pSchema
);
tfree
(
pQueryNode
->
info
.
name
);
SArray
*
exprList
=
taosArrayInit
(
4
,
POINTER_BYTES
);
if
(
tscSqlExprCopy
(
exprList
,
pQueryInfo
->
exprList
,
uid
,
true
)
!=
0
)
{
terrno
=
TSDB_CODE_TSC_OUT_OF_MEMORY
;
exit
(
-
1
);
tfree
(
pQueryNode
->
tableInfo
.
tableName
);
pQueryNode
->
pExpr
=
destroyQueryFuncExpr
(
pQueryNode
->
pExpr
,
pQueryNode
->
numOfOutput
);
if
(
pQueryNode
->
pPrevNodes
!=
NULL
)
{
int32_t
size
=
taosArrayGetSize
(
pQueryNode
->
pPrevNodes
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
SQueryNode
*
p
=
taosArrayGetP
(
pQueryNode
->
pPrevNodes
,
i
);
doDestroyQueryNode
(
p
);
}
SArray
*
tableColumnList
=
taosArrayInit
(
4
,
sizeof
(
SColumn
)
);
tscColumnListCopy
(
tableColumnList
,
pQueryInfo
->
colList
,
uid
);
taosArrayDestroy
(
pQueryNode
->
pPrevNodes
);
}
tfree
(
pQueryNode
);
}
// 2.
SQueryNode
*
pNode
=
doCreateQueryPlanForOneTable
(
pQueryInfo
);
UNUSED
(
pNode
);
}
else
{
// only one table, normal query process
SQueryNode
*
pNode
=
doCreateQueryPlanForOneTable
(
pQueryInfo
);
UNUSED
(
pNode
);
void
*
qDestroyQueryPlan
(
SQueryNode
*
pQueryNode
)
{
if
(
pQueryNode
==
NULL
)
{
return
NULL
;
}
doDestroyQueryNode
(
pQueryNode
);
return
NULL
;
}
char
*
queryPlanToString
()
{
return
NULL
;
bool
hasAliasName
(
SExprInfo
*
pExpr
)
{
assert
(
pExpr
!=
NULL
);
return
strncmp
(
pExpr
->
base
.
token
,
pExpr
->
base
.
aliasName
,
tListLen
(
pExpr
->
base
.
aliasName
))
!=
0
;
}
static
int32_t
doPrintPlan
(
char
*
buf
,
SQueryNode
*
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 #0x%"
PRIx64
") time_range: %"
PRId64
" - %"
PRId64
"
\n
"
,
pQueryNode
->
tableInfo
.
tableName
,
pQueryNode
->
tableInfo
.
id
.
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
)
{
SSqlExpr
*
p
=
&
pQueryNode
->
pExpr
[
i
].
base
;
len1
=
sprintf
(
buf
+
len
,
"[%s #%d]"
,
p
->
aliasName
,
p
->
resColId
);
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
)
{
SSqlExpr
*
pExpr
=
&
pQueryNode
->
pExpr
[
i
].
base
;
if
(
hasAliasName
(
&
pQueryNode
->
pExpr
[
i
]))
{
len1
=
sprintf
(
buf
+
len
,
"[%s #%s]"
,
pExpr
->
token
,
pExpr
->
aliasName
);
}
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
)
{
SSqlExpr
*
pExpr
=
&
pQueryNode
->
pExpr
[
i
].
base
;
if
(
hasAliasName
(
&
pQueryNode
->
pExpr
[
i
]))
{
len1
=
sprintf
(
buf
+
len
,
"[%s #%s]"
,
pExpr
->
token
,
pExpr
->
aliasName
);
}
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
"(%c), sliding:%"
PRId64
"(%c), offset:%"
PRId64
"
\n
"
,
pInterval
->
interval
,
pInterval
->
intervalUnit
,
pInterval
->
sliding
,
pInterval
->
slidingUnit
,
pInterval
->
offset
);
len
+=
len1
;
break
;
}
case
QNODE_GROUPBY
:
{
// todo hide the invisible column
for
(
int32_t
i
=
0
;
i
<
pQueryNode
->
numOfOutput
;
++
i
)
{
SSqlExpr
*
pExpr
=
&
pQueryNode
->
pExpr
[
i
].
base
;
if
(
hasAliasName
(
&
pQueryNode
->
pExpr
[
i
]))
{
len1
=
sprintf
(
buf
+
len
,
"[%s #%s]"
,
pExpr
->
token
,
pExpr
->
aliasName
);
}
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
:
{
SLimitVal
*
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
)
{
SSqlExpr
*
p
=
&
pQueryNode
->
pExpr
[
i
].
base
;
len1
=
sprintf
(
buf
+
len
,
"[%s #%d]"
,
p
->
aliasName
,
p
->
resColId
);
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
,
SQueryNode
*
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
)
{
SQueryNode
*
p1
=
taosArrayGetP
(
pQueryNode
->
pPrevNodes
,
i
);
int32_t
len1
=
queryPlanToStringImpl
(
buf
,
p1
,
level
+
1
,
len
);
len
=
len1
;
}
return
len
;
}
char
*
queryPlanToString
(
SQueryNode
*
pQueryNode
)
{
assert
(
pQueryNode
);
char
*
buf
=
calloc
(
1
,
4096
);
int32_t
len
=
sprintf
(
buf
,
"===== logic plan =====
\n
"
);
queryPlanToStringImpl
(
buf
,
pQueryNode
,
0
,
len
);
return
buf
;
}
SQueryNode
*
queryPlanFromString
()
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录