Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
b6aa9da9
T
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1185
Star
22016
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
b6aa9da9
编写于
3月 26, 2021
作者:
H
Haojun Liao
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[td-2859]
上级
4a0bc100
变更
18
隐藏空白更改
内联
并排
Showing
18 changed file
with
1535 addition
and
1005 deletion
+1535
-1005
src/client/inc/tscUtil.h
src/client/inc/tscUtil.h
+51
-44
src/client/inc/tsclient.h
src/client/inc/tsclient.h
+27
-25
src/client/src/tscAsync.c
src/client/src/tscAsync.c
+4
-4
src/client/src/tscLocal.c
src/client/src/tscLocal.c
+24
-24
src/client/src/tscLocalMerge.c
src/client/src/tscLocalMerge.c
+82
-82
src/client/src/tscParseInsert.c
src/client/src/tscParseInsert.c
+3
-3
src/client/src/tscSQLParser.c
src/client/src/tscSQLParser.c
+358
-352
src/client/src/tscServer.c
src/client/src/tscServer.c
+72
-73
src/client/src/tscSql.c
src/client/src/tscSql.c
+7
-7
src/client/src/tscStream.c
src/client/src/tscStream.c
+9
-9
src/client/src/tscSub.c
src/client/src/tscSub.c
+2
-2
src/client/src/tscSubquery.c
src/client/src/tscSubquery.c
+292
-112
src/client/src/tscUtil.c
src/client/src/tscUtil.c
+426
-171
src/inc/taosmsg.h
src/inc/taosmsg.h
+9
-5
src/query/inc/qExecutor.h
src/query/inc/qExecutor.h
+11
-2
src/query/src/qExecutor.c
src/query/src/qExecutor.c
+60
-87
src/query/src/qPlan.c
src/query/src/qPlan.c
+96
-1
src/query/src/queryMain.c
src/query/src/queryMain.c
+2
-2
未找到文件。
src/client/inc/tscUtil.h
浏览文件 @
b6aa9da9
...
...
@@ -88,7 +88,7 @@ typedef struct SVgroupTableInfo {
SArray
*
itemList
;
//SArray<STableIdInfo>
}
SVgroupTableInfo
;
static
FORCE_INLINE
SQueryInfo
*
tscGetQueryInfo
(
SSqlCmd
*
pCmd
,
int32_t
subClauseIndex
)
{
static
FORCE_INLINE
SQuery
Node
Info
*
tscGetQueryInfo
(
SSqlCmd
*
pCmd
,
int32_t
subClauseIndex
)
{
assert
(
pCmd
!=
NULL
&&
subClauseIndex
>=
0
);
if
(
pCmd
->
pQueryInfo
==
NULL
||
subClauseIndex
>=
pCmd
->
numOfClause
)
{
return
NULL
;
...
...
@@ -97,7 +97,7 @@ static FORCE_INLINE SQueryInfo* tscGetQueryInfo(SSqlCmd* pCmd, int32_t subClause
return
pCmd
->
pQueryInfo
[
subClauseIndex
];
}
SQueryInfo
*
tscGetActiveQueryInfo
(
SSqlCmd
*
pCmd
);
SQuery
Node
Info
*
tscGetActiveQueryInfo
(
SSqlCmd
*
pCmd
);
int32_t
tscCreateDataBlock
(
size_t
initialSize
,
int32_t
rowSize
,
int32_t
startOffset
,
SName
*
name
,
STableMeta
*
pTableMeta
,
STableDataBlocks
**
dataBlocks
);
void
tscDestroyDataBlock
(
STableDataBlocks
*
pDataBlock
,
bool
removeMeta
);
...
...
@@ -121,27 +121,33 @@ int32_t tscGetDataBlockFromList(SHashObj* pHashList, int64_t id, int32_t size, i
* @param pSql sql object
* @return
*/
bool
tscIsPointInterpQuery
(
SQueryInfo
*
pQueryInfo
);
bool
tscIsTWAQuery
(
SQueryInfo
*
pQueryInfo
);
bool
tscIsSecondStageQuery
(
SQueryInfo
*
pQueryInfo
);
bool
tscGroupbyColumn
(
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
tscIsTwoStageSTableQuery
(
SQueryInfo
*
pQueryInfo
,
int32_t
tableIndex
);
bool
tscQueryTags
(
SQueryInfo
*
pQueryInfo
);
bool
tscMultiRoundQuery
(
SQueryInfo
*
pQueryInfo
,
int32_t
tableIndex
);
bool
tscQueryBlockInfo
(
SQueryInfo
*
pQueryInfo
);
SSqlExpr
*
tscAddFuncInSelectClause
(
SQueryInfo
*
pQueryInfo
,
int32_t
outputColIndex
,
int16_t
functionId
,
bool
tscIsPointInterpQuery
(
SQueryNodeInfo
*
pQueryInfo
);
bool
tscIsTWAQuery
(
SQueryNodeInfo
*
pQueryInfo
);
bool
tscIsSecondStageQuery
(
SQueryNodeInfo
*
pQueryInfo
);
bool
tscGroupbyColumn
(
SQueryNodeInfo
*
pQueryInfo
);
bool
tscIsTopBotQuery
(
SQueryNodeInfo
*
pQueryInfo
);
bool
hasTagValOutput
(
SQueryNodeInfo
*
pQueryInfo
);
bool
timeWindowInterpoRequired
(
SQueryNodeInfo
*
pQueryNodeInfo
);
bool
isStabledev
(
SQueryNodeInfo
*
pQueryInfo
);
bool
isTsCompQuery
(
SQueryNodeInfo
*
pQueryNodeInfo
);
bool
isSimpleAggregate
(
SQueryNodeInfo
*
pQueryNodeInfo
);
bool
tscNonOrderedProjectionQueryOnSTable
(
SQueryNodeInfo
*
pQueryInfo
,
int32_t
tableIndex
);
bool
tscOrderedProjectionQueryOnSTable
(
SQueryNodeInfo
*
pQueryInfo
,
int32_t
tableIndex
);
bool
tscIsProjectionQueryOnSTable
(
SQueryNodeInfo
*
pQueryInfo
,
int32_t
tableIndex
);
bool
tscIsProjectionQuery
(
SQueryNodeInfo
*
pQueryInfo
);
bool
tscIsTwoStageSTableQuery
(
SQueryNodeInfo
*
pQueryInfo
,
int32_t
tableIndex
);
bool
tscQueryTags
(
SQueryNodeInfo
*
pQueryInfo
);
bool
tscMultiRoundQuery
(
SQueryNodeInfo
*
pQueryInfo
,
int32_t
tableIndex
);
bool
tscQueryBlockInfo
(
SQueryNodeInfo
*
pQueryInfo
);
SExprInfo
*
tscAddFuncInSelectClause
(
SQueryNodeInfo
*
pQueryInfo
,
int32_t
outputColIndex
,
int16_t
functionId
,
SColumnIndex
*
pIndex
,
SSchema
*
pColSchema
,
int16_t
colType
);
int32_t
tscSetTableFullName
(
STableMetaInfo
*
pTableMetaInfo
,
SStrToken
*
pzTableName
,
SSqlObj
*
pSql
);
void
tscClearInterpInfo
(
SQueryInfo
*
pQueryInfo
);
void
tscClearInterpInfo
(
SQuery
Node
Info
*
pQueryInfo
);
bool
tscIsInsertData
(
char
*
sqlstr
);
...
...
@@ -155,12 +161,12 @@ SInternalField* tscFieldInfoInsert(SFieldInfo* pFieldInfo, int32_t index, TAOS_F
SInternalField
*
tscFieldInfoGetInternalField
(
SFieldInfo
*
pFieldInfo
,
int32_t
index
);
TAOS_FIELD
*
tscFieldInfoGetField
(
SFieldInfo
*
pFieldInfo
,
int32_t
index
);
void
tscFieldInfoUpdateOffset
(
SQueryInfo
*
pQueryInfo
);
void
tscFieldInfoUpdateOffset
(
SQuery
Node
Info
*
pQueryInfo
);
int16_t
tscFieldInfoGetOffset
(
SQueryInfo
*
pQueryInfo
,
int32_t
index
);
int16_t
tscFieldInfoGetOffset
(
SQuery
Node
Info
*
pQueryInfo
,
int32_t
index
);
void
tscFieldInfoClear
(
SFieldInfo
*
pFieldInfo
);
static
FORCE_INLINE
int32_t
tscNumOfFields
(
SQueryInfo
*
pQueryInfo
)
{
return
pQueryInfo
->
fieldsInfo
.
numOfOutput
;
}
static
FORCE_INLINE
int32_t
tscNumOfFields
(
SQuery
Node
Info
*
pQueryInfo
)
{
return
pQueryInfo
->
fieldsInfo
.
numOfOutput
;
}
int32_t
tscFieldInfoCompare
(
const
SFieldInfo
*
pFieldInfo1
,
const
SFieldInfo
*
pFieldInfo2
);
...
...
@@ -168,24 +174,24 @@ void addExprParams(SSqlExpr* pExpr, char* argument, int32_t type, int32_t bytes)
int32_t
tscGetResRowLength
(
SArray
*
pExprList
);
S
SqlExpr
*
tscSqlExprInsert
(
SQuery
Info
*
pQueryInfo
,
int32_t
index
,
int16_t
functionId
,
SColumnIndex
*
pColIndex
,
int16_t
type
,
S
ExprInfo
*
tscSqlExprInsert
(
SQueryNode
Info
*
pQueryInfo
,
int32_t
index
,
int16_t
functionId
,
SColumnIndex
*
pColIndex
,
int16_t
type
,
int16_t
size
,
int16_t
resColId
,
int16_t
interSize
,
bool
isTagCol
);
S
SqlExpr
*
tscSqlExprAppend
(
SQuery
Info
*
pQueryInfo
,
int16_t
functionId
,
SColumnIndex
*
pColIndex
,
int16_t
type
,
S
ExprInfo
*
tscSqlExprAppend
(
SQueryNode
Info
*
pQueryInfo
,
int16_t
functionId
,
SColumnIndex
*
pColIndex
,
int16_t
type
,
int16_t
size
,
int16_t
resColId
,
int16_t
interSize
,
bool
isTagCol
);
S
SqlExpr
*
tscSqlExprUpdate
(
SQuery
Info
*
pQueryInfo
,
int32_t
index
,
int16_t
functionId
,
int16_t
srcColumnIndex
,
int16_t
type
,
S
ExprInfo
*
tscSqlExprUpdate
(
SQueryNode
Info
*
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
,
SColumnIndex
*
pIndex
);
size_t
tscSqlExprNumOfExprs
(
SQuery
Node
Info
*
pQueryInfo
);
void
tscInsertPrimaryTsSourceColumn
(
SQuery
Node
Info
*
pQueryInfo
,
SColumnIndex
*
pIndex
);
S
SqlExpr
*
tscSqlExprGet
(
SQuery
Info
*
pQueryInfo
,
int32_t
index
);
S
ExprInfo
*
tscSqlExprGet
(
SQueryNode
Info
*
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
);
SColumn
*
tscColumnClone
(
const
SColumn
*
src
);
SColumn
*
tscColumnListInsert
(
SArray
*
pColList
,
SColumnIndex
*
colIndex
);
SArray
*
tscColumnListClone
(
const
SArray
*
src
,
int16_t
tableIndex
);
SColumn
*
tscColumnListInsert
(
SArray
*
pColList
,
SColumnIndex
*
colIndex
,
SSchema
*
pSchema
);
void
tscColumnListDestroy
(
SArray
*
pColList
);
void
tscDequoteAndTrimToken
(
SStrToken
*
pToken
);
...
...
@@ -202,25 +208,25 @@ void tsSetSTableQueryCond(STagCond* pTagCond, uint64_t uid, SBufferWriter* bw)
int32_t
tscTagCondCopy
(
STagCond
*
dest
,
const
STagCond
*
src
);
void
tscTagCondRelease
(
STagCond
*
pCond
);
void
tscGetSrcColumnInfo
(
SSrcColumnInfo
*
pColInfo
,
SQueryInfo
*
pQueryInfo
);
void
tscGetSrcColumnInfo
(
SSrcColumnInfo
*
pColInfo
,
SQuery
Node
Info
*
pQueryInfo
);
bool
tscShouldBeFreed
(
SSqlObj
*
pSql
);
STableMetaInfo
*
tscGetTableMetaInfoFromCmd
(
SSqlCmd
*
pCmd
,
int32_t
subClauseIndex
,
int32_t
tableIndex
);
STableMetaInfo
*
tscGetMetaInfo
(
SQueryInfo
*
pQueryInfo
,
int32_t
tableIndex
);
STableMetaInfo
*
tscGetMetaInfo
(
SQuery
Node
Info
*
pQueryInfo
,
int32_t
tableIndex
);
void
tscInitQueryInfo
(
SQueryInfo
*
pQueryInfo
);
void
tscInitQueryInfo
(
SQuery
Node
Info
*
pQueryInfo
);
void
tscClearSubqueryInfo
(
SSqlCmd
*
pCmd
);
int32_t
tscAddQueryInfo
(
SSqlCmd
*
pCmd
);
SQueryInfo
*
tscGetQueryInfo
(
SSqlCmd
*
pCmd
,
int32_t
subClauseIndex
);
SQueryInfo
*
tscGetQueryInfoS
(
SSqlCmd
*
pCmd
,
int32_t
subClauseIndex
);
SQuery
Node
Info
*
tscGetQueryInfo
(
SSqlCmd
*
pCmd
,
int32_t
subClauseIndex
);
SQuery
Node
Info
*
tscGetQueryInfoS
(
SSqlCmd
*
pCmd
,
int32_t
subClauseIndex
);
void
tscClearTableMetaInfo
(
STableMetaInfo
*
pTableMetaInfo
);
STableMetaInfo
*
tscAddTableMetaInfo
(
SQueryInfo
*
pQueryInfo
,
SName
*
name
,
STableMeta
*
pTableMeta
,
STableMetaInfo
*
tscAddTableMetaInfo
(
SQuery
Node
Info
*
pQueryInfo
,
SName
*
name
,
STableMeta
*
pTableMeta
,
SVgroupsInfo
*
vgroupList
,
SArray
*
pTagCols
,
SArray
*
pVgroupTables
);
STableMetaInfo
*
tscAddEmptyMetaInfo
(
SQueryInfo
*
pQueryInfo
);
STableMetaInfo
*
tscAddEmptyMetaInfo
(
SQuery
Node
Info
*
pQueryInfo
);
void
tscFreeVgroupTableInfo
(
SArray
*
pVgroupTables
);
SArray
*
tscVgroupTableInfoDup
(
SArray
*
pVgroupTables
);
...
...
@@ -233,8 +239,8 @@ int tscGetTableMetaEx(SSqlObj* pSql, STableMetaInfo* pTableMetaInfo, bool creat
void
tscResetForNextRetrieve
(
SSqlRes
*
pRes
);
void
tscDoQuery
(
SSqlObj
*
pSql
);
void
executeQuery
(
SSqlObj
*
pSql
,
SQueryInfo
*
pQueryInfo
);
void
doExecuteQuery
(
SSqlObj
*
pSql
,
SQueryInfo
*
pQueryInfo
);
void
executeQuery
(
SSqlObj
*
pSql
,
SQuery
Node
Info
*
pQueryInfo
);
void
doExecuteQuery
(
SSqlObj
*
pSql
,
SQuery
Node
Info
*
pQueryInfo
);
SVgroupsInfo
*
tscVgroupInfoClone
(
SVgroupsInfo
*
pInfo
);
void
*
tscVgroupInfoClear
(
SVgroupsInfo
*
pInfo
);
...
...
@@ -263,7 +269,7 @@ void registerSqlObj(SSqlObj* pSql);
SSqlObj
*
createSubqueryObj
(
SSqlObj
*
pSql
,
int16_t
tableIndex
,
__async_cb_func_t
fp
,
void
*
param
,
int32_t
cmd
,
SSqlObj
*
pPrevSql
);
void
addGroupInfoForSubquery
(
SSqlObj
*
pParentObj
,
SSqlObj
*
pSql
,
int32_t
subClauseIndex
,
int32_t
tableIndex
);
void
doAddGroupColumnForSubquery
(
SQueryInfo
*
pQueryInfo
,
int32_t
tagIndex
);
void
doAddGroupColumnForSubquery
(
SQuery
Node
Info
*
pQueryInfo
,
int32_t
tagIndex
);
int16_t
tscGetJoinTagColIdByUid
(
STagCond
*
pTagCond
,
uint64_t
uid
);
int16_t
tscGetTagColIndexById
(
STableMeta
*
pTableMeta
,
int16_t
colId
);
...
...
@@ -282,7 +288,7 @@ int tscSetMgmtEpSetFromCfg(const char *first, const char *second, SRpcCorEpSet
bool
tscSetSqlOwner
(
SSqlObj
*
pSql
);
void
tscClearSqlOwner
(
SSqlObj
*
pSql
);
int32_t
doArithmeticCalculate
(
SQueryInfo
*
pQueryInfo
,
tFilePage
*
pOutput
,
int32_t
rowSize
,
int32_t
finalRowSize
);
int32_t
doArithmeticCalculate
(
SQuery
Node
Info
*
pQueryInfo
,
tFilePage
*
pOutput
,
int32_t
rowSize
,
int32_t
finalRowSize
);
char
*
serializeTagData
(
STagData
*
pTagData
,
char
*
pMsg
);
int32_t
copyTagData
(
STagData
*
dst
,
const
STagData
*
src
);
...
...
@@ -294,8 +300,9 @@ uint32_t tscGetTableMetaMaxSize();
int32_t
tscCreateTableMetaFromCChildMeta
(
STableMeta
*
pChild
,
const
char
*
name
);
STableMeta
*
tscTableMetaDup
(
STableMeta
*
pTableMeta
);
void
tsCreateSQLFunctionCtx
(
SQueryInfo
*
pQueryInfo
,
SQLFunctionCtx
*
pCtx
);
void
tsCreateSQLFunctionCtx
(
SQueryNodeInfo
*
pQueryInfo
,
SQLFunctionCtx
*
pCtx
);
void
*
createQueryInfoFromQueryNode
(
SQueryNodeInfo
*
pQueryNodeInfo
,
SExprInfo
*
pExprs
,
STableGroupInfo
*
pTableGroupInfo
,
uint64_t
*
qId
,
char
*
sql
);
void
*
malloc_throw
(
size_t
size
);
void
*
calloc_throw
(
size_t
nmemb
,
size_t
size
);
...
...
src/client/inc/tsclient.h
浏览文件 @
b6aa9da9
...
...
@@ -105,8 +105,7 @@ typedef struct SColumnIndex {
typedef
struct
SInternalField
{
TAOS_FIELD
field
;
bool
visible
;
SExprInfo
*
pArithExprInfo
;
SSqlExpr
*
pSqlExpr
;
SExprInfo
*
pExpr
;
}
SInternalField
;
typedef
struct
SFieldInfo
{
...
...
@@ -117,8 +116,7 @@ typedef struct SFieldInfo {
typedef
struct
SColumn
{
SColumnIndex
colIndex
;
int32_t
numOfFilters
;
SColumnFilterInfo
*
filterInfo
;
SColumnInfo
info
;
}
SColumn
;
typedef
struct
SCond
{
...
...
@@ -181,7 +179,7 @@ typedef struct STableDataBlocks {
SParamInfo
*
params
;
}
STableDataBlocks
;
typedef
struct
SQueryInfo
{
typedef
struct
SQuery
Node
Info
{
int16_t
command
;
// the command may be different for each subclause, so keep it seperately.
uint32_t
type
;
// query/insert type
STimeWindow
window
;
// the whole query time window
...
...
@@ -196,6 +194,7 @@ typedef struct SQueryInfo {
SLimitVal
limit
;
SLimitVal
slimit
;
STagCond
tagCond
;
SOrderVal
order
;
int16_t
fillType
;
// final result fill type
int16_t
numOfTables
;
...
...
@@ -215,10 +214,13 @@ typedef struct SQueryInfo {
int32_t
bufLen
;
char
*
buf
;
struct
SQueryInfo
*
sibling
;
// sibling
SArray
*
pUpstream
;
// SArray<struct SQueryInfo>
SArray
*
pDownstream
;
// SArray<struct SQueryInfo>
}
SQueryInfo
;
SArray
*
pDSOperator
;
SArray
*
pPhyOperator
;
struct
SQueryNodeInfo
*
sibling
;
// sibling
SArray
*
pUpstream
;
// SArray<struct SQueryNodeInfo>
SArray
*
pDownstream
;
// SArray<struct SQueryNodeInfo>
}
SQueryNodeInfo
;
typedef
struct
{
int
command
;
...
...
@@ -242,10 +244,10 @@ typedef struct {
char
*
payload
;
int32_t
payloadLen
;
SQueryInfo
**
pQueryInfo
;
SQuery
Node
Info
**
pQueryInfo
;
int32_t
numOfClause
;
int32_t
clauseIndex
;
// index of multiple subclause query
SQueryInfo
*
active
;
// current active query info
SQuery
Node
Info
*
active
;
// current active query info
int32_t
batchSize
;
// for parameter ('?') binding and batch processing
int32_t
numOfParams
;
...
...
@@ -402,7 +404,7 @@ void tscInitMsgsFp();
int
tsParseSql
(
SSqlObj
*
pSql
,
bool
initial
);
void
tscProcessMsgFromServer
(
SRpcMsg
*
rpcMsg
,
SRpcEpSet
*
pEpSet
);
int
tscProcessSql
(
SSqlObj
*
pSql
,
SQueryInfo
*
pQueryInfo
);
int
tscProcessSql
(
SSqlObj
*
pSql
,
SQuery
Node
Info
*
pQueryInfo
);
int
tscRenewTableMeta
(
SSqlObj
*
pSql
,
int32_t
tableIndex
);
void
tscAsyncResultOnError
(
SSqlObj
*
pSql
);
...
...
@@ -412,12 +414,12 @@ void tscQueueAsyncError(void(*fp), void *param, int32_t code);
int
tscProcessLocalCmd
(
SSqlObj
*
pSql
);
int
tscCfgDynamicOptions
(
char
*
msg
);
int32_t
tscTansformFuncForSTableQuery
(
SQueryInfo
*
pQueryInfo
);
void
tscRestoreFuncForSTableQuery
(
SQueryInfo
*
pQueryInfo
);
int32_t
tscTansformFuncForSTableQuery
(
SQuery
Node
Info
*
pQueryInfo
);
void
tscRestoreFuncForSTableQuery
(
SQuery
Node
Info
*
pQueryInfo
);
int32_t
tscCreateResPointerInfo
(
SSqlRes
*
pRes
,
SQueryInfo
*
pQueryInfo
);
void
tscSetResRawPtr
(
SSqlRes
*
pRes
,
SQueryInfo
*
pQueryInfo
);
void
prepareInputDataFromUpstream
(
SSqlRes
*
pRes
,
SQueryInfo
*
pQueryInfo
);
int32_t
tscCreateResPointerInfo
(
SSqlRes
*
pRes
,
SQuery
Node
Info
*
pQueryInfo
);
void
tscSetResRawPtr
(
SSqlRes
*
pRes
,
SQuery
Node
Info
*
pQueryInfo
);
void
prepareInputDataFromUpstream
(
SSqlRes
*
pRes
,
SQuery
Node
Info
*
pQueryInfo
);
void
tscResetSqlCmd
(
SSqlCmd
*
pCmd
,
bool
removeMeta
);
...
...
@@ -452,7 +454,7 @@ bool tscIsUpdateQuery(SSqlObj* pSql);
char
*
tscGetSqlStr
(
SSqlObj
*
pSql
);
bool
tscIsQueryWithLimit
(
SSqlObj
*
pSql
);
bool
tscHasReachLimitation
(
SQueryInfo
*
pQueryInfo
,
SSqlRes
*
pRes
);
bool
tscHasReachLimitation
(
SQuery
Node
Info
*
pQueryInfo
,
SSqlRes
*
pRes
);
char
*
tscGetErrorMsgPayload
(
SSqlCmd
*
pCmd
);
...
...
@@ -471,15 +473,15 @@ static FORCE_INLINE void tscGetResultColumnChr(SSqlRes* pRes, SFieldInfo* pField
UNUSED
(
pData
);
// user defined constant value output columns
if
(
pInfo
->
p
SqlExpr
!=
NULL
&&
TSDB_COL_IS_UD_COL
(
pInfo
->
pSqlExpr
->
colInfo
.
flag
))
{
if
(
pInfo
->
p
Expr
!=
NULL
&&
TSDB_COL_IS_UD_COL
(
pInfo
->
pExpr
->
base
.
colInfo
.
flag
))
{
if
(
type
==
TSDB_DATA_TYPE_NCHAR
||
type
==
TSDB_DATA_TYPE_BINARY
)
{
pData
=
pInfo
->
p
SqlExpr
->
param
[
1
].
pz
;
pRes
->
length
[
columnIndex
]
=
pInfo
->
p
SqlExpr
->
param
[
1
].
nLen
;
pRes
->
tsrow
[
columnIndex
]
=
(
pInfo
->
p
SqlExpr
->
param
[
1
].
nType
==
TSDB_DATA_TYPE_NULL
)
?
NULL
:
(
unsigned
char
*
)
pData
;
pData
=
pInfo
->
p
Expr
->
base
.
param
[
1
].
pz
;
pRes
->
length
[
columnIndex
]
=
pInfo
->
p
Expr
->
base
.
param
[
1
].
nLen
;
pRes
->
tsrow
[
columnIndex
]
=
(
pInfo
->
p
Expr
->
base
.
param
[
1
].
nType
==
TSDB_DATA_TYPE_NULL
)
?
NULL
:
(
unsigned
char
*
)
pData
;
}
else
{
assert
(
bytes
==
tDataTypes
[
type
].
bytes
);
pRes
->
tsrow
[
columnIndex
]
=
isNull
(
pData
,
type
)
?
NULL
:
(
unsigned
char
*
)
&
pInfo
->
p
SqlExpr
->
param
[
1
].
i64
;
pRes
->
tsrow
[
columnIndex
]
=
isNull
(
pData
,
type
)
?
NULL
:
(
unsigned
char
*
)
&
pInfo
->
p
Expr
->
base
.
param
[
1
].
i64
;
pRes
->
length
[
columnIndex
]
=
bytes
;
}
}
else
{
...
...
@@ -488,7 +490,7 @@ static FORCE_INLINE void tscGetResultColumnChr(SSqlRes* pRes, SFieldInfo* pField
assert
(
realLen
<=
bytes
-
VARSTR_HEADER_SIZE
);
pRes
->
tsrow
[
columnIndex
]
=
(
isNull
(
pData
,
type
))
?
NULL
:
(
unsigned
char
*
)((
tstr
*
)
pData
)
->
data
;
if
(
realLen
<
pInfo
->
p
SqlExpr
->
resBytes
-
VARSTR_HEADER_SIZE
)
{
// todo refactor
if
(
realLen
<
pInfo
->
p
Expr
->
base
.
resBytes
-
VARSTR_HEADER_SIZE
)
{
// todo refactor
*
(
pData
+
realLen
+
VARSTR_HEADER_SIZE
)
=
0
;
}
...
...
@@ -516,7 +518,7 @@ extern int tscNumOfObj; // number of existed sqlObj in current process.
extern
int
(
*
tscBuildMsg
[
TSDB_SQL_MAX
])(
SSqlObj
*
pSql
,
SSqlInfo
*
pInfo
);
void
tscBuildVgroupTableInfo
(
SSqlObj
*
pSql
,
STableMetaInfo
*
pTableMetaInfo
,
SArray
*
tables
);
int16_t
getNewResColId
(
SQueryInfo
*
pQueryInfo
);
int16_t
getNewResColId
(
SQuery
Node
Info
*
pQueryInfo
);
#ifdef __cplusplus
}
...
...
src/client/src/tscAsync.c
浏览文件 @
b6aa9da9
...
...
@@ -69,7 +69,7 @@ void doAsyncQuery(STscObj* pObj, SSqlObj* pSql, __async_cb_func_t fp, void* para
return
;
}
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
executeQuery
(
pSql
,
pQueryInfo
);
}
...
...
@@ -255,7 +255,7 @@ void taos_fetch_rows_a(TAOS_RES *tres, __async_cb_func_t fp, void *param) {
pCmd
->
command
=
(
pCmd
->
command
>
TSDB_SQL_MGMT
)
?
TSDB_SQL_RETRIEVE
:
TSDB_SQL_FETCH
;
}
SQueryInfo
*
pQueryInfo1
=
tscGetActiveQueryInfo
(
&
pSql
->
cmd
);
SQuery
Node
Info
*
pQueryInfo1
=
tscGetActiveQueryInfo
(
&
pSql
->
cmd
);
tscProcessSql
(
pSql
,
pQueryInfo1
);
}
}
...
...
@@ -333,7 +333,7 @@ void tscTableMetaCallBack(void *param, TAOS_RES *res, int code) {
tscDebug
(
"%p get %s successfully"
,
pSql
,
msg
);
if
(
pSql
->
pStream
==
NULL
)
{
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
// check if it is a sub-query of super table query first, if true, enter another routine
if
(
TSDB_QUERY_HAS_TYPE
(
pQueryInfo
->
type
,
(
TSDB_QUERY_TYPE_STABLE_SUBQUERY
|
TSDB_QUERY_TYPE_SUBQUERY
|
TSDB_QUERY_TYPE_TAG_FILTER_QUERY
)))
{
...
...
@@ -414,7 +414,7 @@ void tscTableMetaCallBack(void *param, TAOS_RES *res, int code) {
}
else
if
(
TSDB_QUERY_HAS_TYPE
(
pQueryInfo
->
type
,
TSDB_QUERY_TYPE_INSERT
))
{
tscHandleMultivnodeInsert
(
pSql
);
}
else
{
SQueryInfo
*
pQueryInfo1
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo1
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
executeQuery
(
pSql
,
pQueryInfo1
);
}
...
...
src/client/src/tscLocal.c
浏览文件 @
b6aa9da9
...
...
@@ -53,7 +53,7 @@ static int32_t tscSetValueToResObj(SSqlObj *pSql, int32_t rowLen) {
SSqlRes
*
pRes
=
&
pSql
->
res
;
// one column for each row
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
STableMeta
*
pMeta
=
pTableMetaInfo
->
pTableMeta
;
...
...
@@ -154,14 +154,14 @@ static int32_t tscBuildTableSchemaResultFields(SSqlObj *pSql, int32_t numOfCols,
pSql
->
cmd
.
numOfCols
=
numOfCols
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
pQueryInfo
->
order
.
order
=
TSDB_ORDER_ASC
;
TAOS_FIELD
f
=
{.
type
=
TSDB_DATA_TYPE_BINARY
,
.
bytes
=
(
TSDB_COL_NAME_LEN
-
1
)
+
VARSTR_HEADER_SIZE
};
tstrncpy
(
f
.
name
,
"Field"
,
sizeof
(
f
.
name
));
SInternalField
*
pInfo
=
tscFieldInfoAppend
(
&
pQueryInfo
->
fieldsInfo
,
&
f
);
pInfo
->
p
Sql
Expr
=
tscSqlExprAppend
(
pQueryInfo
,
TSDB_FUNC_TS_DUMMY
,
&
index
,
TSDB_DATA_TYPE_BINARY
,
pInfo
->
pExpr
=
tscSqlExprAppend
(
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
->
p
Sql
Expr
=
tscSqlExprAppend
(
pQueryInfo
,
TSDB_FUNC_TS_DUMMY
,
&
index
,
TSDB_DATA_TYPE_BINARY
,
(
int16_t
)(
typeColLength
+
VARSTR_HEADER_SIZE
),
pInfo
->
pExpr
=
tscSqlExprAppend
(
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
->
p
Sql
Expr
=
tscSqlExprAppend
(
pQueryInfo
,
TSDB_FUNC_TS_DUMMY
,
&
index
,
TSDB_DATA_TYPE_INT
,
sizeof
(
int32_t
),
pInfo
->
pExpr
=
tscSqlExprAppend
(
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
->
p
Sql
Expr
=
tscSqlExprAppend
(
pQueryInfo
,
TSDB_FUNC_TS_DUMMY
,
&
index
,
TSDB_DATA_TYPE_BINARY
,
(
int16_t
)(
noteColLength
+
VARSTR_HEADER_SIZE
),
pInfo
->
pExpr
=
tscSqlExprAppend
(
pQueryInfo
,
TSDB_FUNC_TS_DUMMY
,
&
index
,
TSDB_DATA_TYPE_BINARY
,
(
int16_t
)(
noteColLength
+
VARSTR_HEADER_SIZE
),
-
1000
,
noteColLength
,
false
);
rowLen
+=
noteColLength
+
VARSTR_HEADER_SIZE
;
...
...
@@ -199,7 +199,7 @@ static int32_t tscBuildTableSchemaResultFields(SSqlObj *pSql, int32_t numOfCols,
}
static
int32_t
tscProcessDescribeTable
(
SSqlObj
*
pSql
)
{
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
assert
(
tscGetMetaInfo
(
pQueryInfo
,
0
)
->
pTableMeta
!=
NULL
);
...
...
@@ -389,7 +389,7 @@ static int32_t tscSCreateBuildResultFields(SSqlObj *pSql, BuildType type, const
SColumnIndex
index
=
{
0
};
pSql
->
cmd
.
numOfCols
=
2
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
pQueryInfo
->
order
.
order
=
TSDB_ORDER_ASC
;
TAOS_FIELD
f
;
...
...
@@ -404,7 +404,7 @@ static int32_t tscSCreateBuildResultFields(SSqlObj *pSql, BuildType type, const
}
SInternalField
*
pInfo
=
tscFieldInfoAppend
(
&
pQueryInfo
->
fieldsInfo
,
&
f
);
pInfo
->
p
Sql
Expr
=
tscSqlExprAppend
(
pQueryInfo
,
TSDB_FUNC_TS_DUMMY
,
&
index
,
TSDB_DATA_TYPE_BINARY
,
f
.
bytes
,
-
1000
,
f
.
bytes
-
VARSTR_HEADER_SIZE
,
false
);
pInfo
->
pExpr
=
tscSqlExprAppend
(
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
->
p
SqlExpr
=
tscSqlExprAppend
(
pQueryInfo
,
TSDB_FUNC_TS_DUMMY
,
&
index
,
TSDB_DATA_TYPE_BINARY
,
pInfo
->
p
Expr
=
tscSqlExprAppend
(
pQueryInfo
,
TSDB_FUNC_TS_DUMMY
,
&
index
,
TSDB_DATA_TYPE_BINARY
,
(
int16_t
)(
ddlLen
+
VARSTR_HEADER_SIZE
),
-
1000
,
ddlLen
,
false
);
rowLen
+=
ddlLen
+
VARSTR_HEADER_SIZE
;
...
...
@@ -427,7 +427,7 @@ static int32_t tscSCreateBuildResultFields(SSqlObj *pSql, BuildType type, const
static
int32_t
tscSCreateSetValueToResObj
(
SSqlObj
*
pSql
,
int32_t
rowLen
,
const
char
*
tableName
,
const
char
*
ddl
)
{
SSqlRes
*
pRes
=
&
pSql
->
res
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
int32_t
numOfRows
=
1
;
if
(
strlen
(
ddl
)
==
0
)
{
...
...
@@ -444,7 +444,7 @@ static int32_t tscSCreateSetValueToResObj(SSqlObj *pSql, int32_t rowLen, const c
return
0
;
}
static
int32_t
tscSCreateBuildResult
(
SSqlObj
*
pSql
,
BuildType
type
,
const
char
*
str
,
const
char
*
result
)
{
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
int32_t
rowLen
=
tscSCreateBuildResultFields
(
pSql
,
type
,
result
);
tscFieldInfoUpdateOffset
(
pQueryInfo
);
...
...
@@ -552,7 +552,7 @@ static int32_t tscGetTableTagColumnName(SSqlObj *pSql, char **result) {
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
tscRebuildDDLForSubTable
(
SSqlObj
*
pSql
,
const
char
*
tableName
,
char
*
ddl
)
{
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
STableMeta
*
pMeta
=
pTableMetaInfo
->
pTableMeta
;
...
...
@@ -606,7 +606,7 @@ static int32_t tscRebuildDDLForSubTable(SSqlObj *pSql, const char *tableName, ch
}
static
int32_t
tscRebuildDDLForNormalTable
(
SSqlObj
*
pSql
,
const
char
*
tableName
,
char
*
ddl
)
{
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
STableMeta
*
pMeta
=
pTableMetaInfo
->
pTableMeta
;
...
...
@@ -633,7 +633,7 @@ static int32_t tscRebuildDDLForNormalTable(SSqlObj *pSql, const char *tableName,
}
static
int32_t
tscRebuildDDLForSuperTable
(
SSqlObj
*
pSql
,
const
char
*
tableName
,
char
*
ddl
)
{
char
*
result
=
ddl
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
STableMeta
*
pMeta
=
pTableMetaInfo
->
pTableMeta
;
...
...
@@ -674,7 +674,7 @@ static int32_t tscRebuildDDLForSuperTable(SSqlObj *pSql, const char *tableName,
}
static
int32_t
tscProcessShowCreateTable
(
SSqlObj
*
pSql
)
{
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
assert
(
pTableMetaInfo
->
pTableMeta
!=
NULL
);
...
...
@@ -700,7 +700,7 @@ static int32_t tscProcessShowCreateTable(SSqlObj *pSql) {
}
static
int32_t
tscProcessShowCreateDatabase
(
SSqlObj
*
pSql
)
{
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
...
...
@@ -727,7 +727,7 @@ static int32_t tscProcessShowCreateDatabase(SSqlObj *pSql) {
return
TSDB_CODE_TSC_ACTION_IN_PROGRESS
;
}
static
int32_t
tscProcessCurrentUser
(
SSqlObj
*
pSql
)
{
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
SSqlExpr
*
pExpr
=
taosArrayGetP
(
pQueryInfo
->
exprList
,
0
);
pExpr
->
resBytes
=
TSDB_USER_LEN
+
TSDB_DATA_TYPE_BINARY
;
...
...
@@ -754,7 +754,7 @@ static int32_t tscProcessCurrentDB(SSqlObj *pSql) {
extractDBName
(
pSql
->
pTscObj
->
db
,
db
);
pthread_mutex_unlock
(
&
pSql
->
pTscObj
->
mutex
);
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
pSql
->
cmd
.
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
pSql
->
cmd
.
clauseIndex
);
SSqlExpr
*
pExpr
=
taosArrayGetP
(
pQueryInfo
->
exprList
,
0
);
pExpr
->
resType
=
TSDB_DATA_TYPE_BINARY
;
...
...
@@ -781,7 +781,7 @@ static int32_t tscProcessCurrentDB(SSqlObj *pSql) {
static
int32_t
tscProcessServerVer
(
SSqlObj
*
pSql
)
{
const
char
*
v
=
pSql
->
pTscObj
->
sversion
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
pSql
->
cmd
.
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
pSql
->
cmd
.
clauseIndex
);
SSqlExpr
*
pExpr
=
taosArrayGetP
(
pQueryInfo
->
exprList
,
0
);
pExpr
->
resType
=
TSDB_DATA_TYPE_BINARY
;
...
...
@@ -804,7 +804,7 @@ static int32_t tscProcessServerVer(SSqlObj *pSql) {
}
static
int32_t
tscProcessClientVer
(
SSqlObj
*
pSql
)
{
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
SSqlExpr
*
pExpr
=
taosArrayGetP
(
pQueryInfo
->
exprList
,
0
);
pExpr
->
resType
=
TSDB_DATA_TYPE_BINARY
;
...
...
@@ -856,7 +856,7 @@ static int32_t tscProcessServStatus(SSqlObj *pSql) {
return
pSql
->
res
.
code
;
}
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
SSqlExpr
*
pExpr
=
taosArrayGetP
(
pQueryInfo
->
exprList
,
0
);
int32_t
val
=
1
;
...
...
@@ -870,7 +870,7 @@ void tscSetLocalQueryResult(SSqlObj *pSql, const char *val, const char *columnNa
pCmd
->
numOfCols
=
1
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
pQueryInfo
->
order
.
order
=
TSDB_ORDER_ASC
;
tscFieldInfoClear
(
&
pQueryInfo
->
fieldsInfo
);
...
...
@@ -882,7 +882,7 @@ void tscSetLocalQueryResult(SSqlObj *pSql, const char *val, const char *columnNa
tscInitResObjForLocalQuery
(
pSql
,
1
,
(
int32_t
)
valueLength
);
SInternalField
*
pInfo
=
tscFieldInfoGetInternalField
(
&
pQueryInfo
->
fieldsInfo
,
0
);
pInfo
->
p
Sql
Expr
=
taosArrayGetP
(
pQueryInfo
->
exprList
,
0
);
pInfo
->
pExpr
=
taosArrayGetP
(
pQueryInfo
->
exprList
,
0
);
memcpy
(
pRes
->
data
,
val
,
pInfo
->
field
.
bytes
);
}
...
...
src/client/src/tscLocalMerge.c
浏览文件 @
b6aa9da9
...
...
@@ -57,43 +57,43 @@ int32_t treeComparator(const void *pLeft, const void *pRight, void *param) {
}
// todo merge with vnode side function
void
tsCreateSQLFunctionCtx
(
SQueryInfo
*
pQueryInfo
,
SQLFunctionCtx
*
pCtx
)
{
void
tsCreateSQLFunctionCtx
(
SQuery
Node
Info
*
pQueryInfo
,
SQLFunctionCtx
*
pCtx
)
{
size_t
size
=
tscSqlExprNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
pCtx
[
i
].
order
=
pQueryInfo
->
order
.
order
;
pCtx
[
i
].
functionId
=
pExpr
->
functionId
;
pCtx
[
i
].
functionId
=
pExpr
->
base
.
functionId
;
// input buffer hold only one point data
pCtx
[
i
].
inputType
=
pExpr
->
colType
;
pCtx
[
i
].
inputBytes
=
pExpr
->
colBytes
;
pCtx
[
i
].
inputType
=
pExpr
->
base
.
colType
;
pCtx
[
i
].
inputBytes
=
pExpr
->
base
.
colBytes
;
pCtx
[
i
].
outputBytes
=
pExpr
->
resBytes
;
pCtx
[
i
].
outputType
=
pExpr
->
resType
;
pCtx
[
i
].
outputBytes
=
pExpr
->
base
.
resBytes
;
pCtx
[
i
].
outputType
=
pExpr
->
base
.
resType
;
pCtx
[
i
].
size
=
1
;
pCtx
[
i
].
hasNull
=
true
;
pCtx
[
i
].
currentStage
=
MERGE_STAGE
;
// for top/bottom function, the output of timestamp is the first column
int32_t
functionId
=
pExpr
->
functionId
;
int32_t
functionId
=
pExpr
->
base
.
functionId
;
if
(
functionId
==
TSDB_FUNC_TOP
||
functionId
==
TSDB_FUNC_BOTTOM
||
functionId
==
TSDB_FUNC_DIFF
)
{
pCtx
[
i
].
ptsOutputBuf
=
pCtx
[
0
].
pOutput
;
pCtx
[
i
].
param
[
2
].
i64
=
pQueryInfo
->
order
.
order
;
pCtx
[
i
].
param
[
2
].
nType
=
TSDB_DATA_TYPE_BIGINT
;
pCtx
[
i
].
param
[
1
].
i64
=
pQueryInfo
->
order
.
orderColId
;
}
else
if
(
functionId
==
TSDB_FUNC_APERCT
)
{
pCtx
[
i
].
param
[
0
].
i64
=
pExpr
->
param
[
0
].
i64
;
pCtx
[
i
].
param
[
0
].
nType
=
pExpr
->
param
[
0
].
nType
;
pCtx
[
i
].
param
[
0
].
i64
=
pExpr
->
base
.
param
[
0
].
i64
;
pCtx
[
i
].
param
[
0
].
nType
=
pExpr
->
base
.
param
[
0
].
nType
;
}
else
if
(
functionId
==
TSDB_FUNC_BLKINFO
)
{
pCtx
[
i
].
param
[
0
].
i64
=
pExpr
->
param
[
0
].
i64
;
pCtx
[
i
].
param
[
0
].
nType
=
pExpr
->
param
[
0
].
nType
;
pCtx
[
i
].
param
[
0
].
i64
=
pExpr
->
base
.
param
[
0
].
i64
;
pCtx
[
i
].
param
[
0
].
nType
=
pExpr
->
base
.
param
[
0
].
nType
;
pCtx
[
i
].
numOfParams
=
1
;
}
pCtx
[
i
].
interBufBytes
=
pExpr
->
interBytes
;
pCtx
[
i
].
interBufBytes
=
pExpr
->
base
.
interBytes
;
pCtx
[
i
].
resultInfo
=
calloc
(
1
,
pCtx
[
i
].
interBufBytes
+
sizeof
(
SResultRowCellInfo
));
pCtx
[
i
].
stableQuery
=
true
;
}
...
...
@@ -104,11 +104,11 @@ void tsCreateSQLFunctionCtx(SQueryInfo* pQueryInfo, SQLFunctionCtx* pCtx) {
SQLFunctionCtx
*
pCtx1
=
NULL
;
for
(
int32_t
i
=
0
;
i
<
pQueryInfo
->
fieldsInfo
.
numOfOutput
;
++
i
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
functionId
==
TSDB_FUNC_TAG_DUMMY
||
pExpr
->
functionId
==
TSDB_FUNC_TS_DUMMY
)
{
tagLen
+=
pExpr
->
resBytes
;
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
base
.
functionId
==
TSDB_FUNC_TAG_DUMMY
||
pExpr
->
base
.
functionId
==
TSDB_FUNC_TS_DUMMY
)
{
tagLen
+=
pExpr
->
base
.
resBytes
;
pTagCtx
[
n
++
]
=
&
pCtx
[
i
];
}
else
if
((
aAggs
[
pExpr
->
functionId
].
status
&
TSDB_FUNCSTATE_SELECTIVITY
)
!=
0
)
{
}
else
if
((
aAggs
[
pExpr
->
base
.
functionId
].
status
&
TSDB_FUNCSTATE_SELECTIVITY
)
!=
0
)
{
pCtx1
=
&
pCtx
[
i
];
}
}
...
...
@@ -122,13 +122,13 @@ void tsCreateSQLFunctionCtx(SQueryInfo* pQueryInfo, SQLFunctionCtx* pCtx) {
}
}
static
void
setCtxInputOutputBuffer
(
SQueryInfo
*
pQueryInfo
,
SQLFunctionCtx
*
pCtx
,
SLocalMerger
*
pReducer
,
static
void
setCtxInputOutputBuffer
(
SQuery
Node
Info
*
pQueryInfo
,
SQLFunctionCtx
*
pCtx
,
SLocalMerger
*
pReducer
,
tOrderDescriptor
*
pDesc
)
{
size_t
size
=
tscSqlExprNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
pCtx
[
i
].
pOutput
=
pReducer
->
pResultBuf
->
data
+
pExpr
->
offset
*
pReducer
->
resColModel
->
capacity
;
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
pCtx
[
i
].
pOutput
=
pReducer
->
pResultBuf
->
data
+
pExpr
->
base
.
offset
*
pReducer
->
resColModel
->
capacity
;
// input buffer hold only one point data
int16_t
offset
=
getColumnModelOffset
(
pDesc
->
pColumnModel
,
i
);
...
...
@@ -136,7 +136,7 @@ static void setCtxInputOutputBuffer(SQueryInfo* pQueryInfo, SQLFunctionCtx *pCtx
}
}
static
SFillColInfo
*
createFillColInfo
(
SQueryInfo
*
pQueryInfo
)
{
static
SFillColInfo
*
createFillColInfo
(
SQuery
Node
Info
*
pQueryInfo
)
{
int32_t
numOfCols
=
(
int32_t
)
tscNumOfFields
(
pQueryInfo
);
int32_t
offset
=
0
;
...
...
@@ -144,15 +144,15 @@ static SFillColInfo* createFillColInfo(SQueryInfo* pQueryInfo) {
for
(
int32_t
i
=
0
;
i
<
numOfCols
;
++
i
)
{
SInternalField
*
pIField
=
taosArrayGet
(
pQueryInfo
->
fieldsInfo
.
internalField
,
i
);
if
(
pIField
->
p
ArithExprInfo
=
=
NULL
)
{
S
SqlExpr
*
pExpr
=
pIField
->
pSql
Expr
;
if
(
pIField
->
p
Expr
->
pExpr
!
=
NULL
)
{
S
ExprInfo
*
pExpr
=
pIField
->
p
Expr
;
pFillCol
[
i
].
col
.
bytes
=
pExpr
->
resBytes
;
pFillCol
[
i
].
col
.
type
=
(
int8_t
)
pExpr
->
resType
;
pFillCol
[
i
].
col
.
colId
=
pExpr
->
colInfo
.
colId
;
pFillCol
[
i
].
flag
=
pExpr
->
colInfo
.
flag
;
pFillCol
[
i
].
col
.
bytes
=
pExpr
->
base
.
resBytes
;
pFillCol
[
i
].
col
.
type
=
(
int8_t
)
pExpr
->
base
.
resType
;
pFillCol
[
i
].
col
.
colId
=
pExpr
->
base
.
colInfo
.
colId
;
pFillCol
[
i
].
flag
=
pExpr
->
base
.
colInfo
.
flag
;
pFillCol
[
i
].
col
.
offset
=
offset
;
pFillCol
[
i
].
functionId
=
pExpr
->
functionId
;
pFillCol
[
i
].
functionId
=
pExpr
->
base
.
functionId
;
pFillCol
[
i
].
fillVal
.
i
=
pQueryInfo
->
fillVal
[
i
];
}
else
{
pFillCol
[
i
].
col
.
bytes
=
pIField
->
field
.
bytes
;
...
...
@@ -171,7 +171,7 @@ static SFillColInfo* createFillColInfo(SQueryInfo* pQueryInfo) {
}
void
tscCreateLocalMerger
(
tExtMemBuffer
**
pMemBuffer
,
int32_t
numOfBuffer
,
tOrderDescriptor
*
pDesc
,
SColumnModel
*
finalmodel
,
SColumnModel
*
pFFModel
,
SSqlObj
*
pSql
)
{
SColumnModel
*
finalmodel
,
SColumnModel
*
pFFModel
,
SSqlObj
*
pSql
)
{
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
SSqlRes
*
pRes
=
&
pSql
->
res
;
...
...
@@ -263,7 +263,7 @@ void tscCreateLocalMerger(tExtMemBuffer **pMemBuffer, int32_t numOfBuffer, tOrde
#ifdef _DEBUG_VIEW
printf
(
"load data page into mem for build loser tree: %"
PRIu64
" rows
\n
"
,
ds
->
filePage
.
num
);
SSrcColumnInfo
colInfo
[
256
]
=
{
0
};
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
tscGetSrcColumnInfo
(
colInfo
,
pQueryInfo
);
...
...
@@ -298,7 +298,7 @@ void tscCreateLocalMerger(tExtMemBuffer **pMemBuffer, int32_t numOfBuffer, tOrde
param
->
pLocalData
=
pReducer
->
pLocalDataSrc
;
param
->
pDesc
=
pReducer
->
pDesc
;
param
->
num
=
pReducer
->
pLocalDataSrc
[
0
]
->
pMemBuffer
->
numOfElemsPerPage
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
param
->
groupOrderType
=
pQueryInfo
->
groupbyExpr
.
orderType
;
pReducer
->
orderPrjOnSTable
=
tscOrderedProjectionQueryOnSTable
(
pQueryInfo
,
0
);
...
...
@@ -492,7 +492,7 @@ void tscDestroyLocalMerger(SSqlObj *pSql) {
}
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
// there is no more result, so we release all allocated resource
SLocalMerger
*
pLocalMerge
=
(
SLocalMerger
*
)
atomic_exchange_ptr
(
&
pRes
->
pLocalMerger
,
NULL
);
...
...
@@ -546,7 +546,7 @@ void tscDestroyLocalMerger(SSqlObj *pSql) {
static
int32_t
createOrderDescriptor
(
tOrderDescriptor
**
pOrderDesc
,
SSqlCmd
*
pCmd
,
SColumnModel
*
pModel
)
{
int32_t
numOfGroupByCols
=
0
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
if
(
pQueryInfo
->
groupbyExpr
.
numOfGroupCols
>
0
)
{
numOfGroupByCols
=
pQueryInfo
->
groupbyExpr
.
numOfGroupCols
;
...
...
@@ -587,8 +587,8 @@ static int32_t createOrderDescriptor(tOrderDescriptor **pOrderDesc, SSqlCmd *pCm
}
else
{
size_t
size
=
tscSqlExprNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
functionId
==
TSDB_FUNC_PRJ
&&
pExpr
->
colInfo
.
colId
==
PRIMARYKEY_TIMESTAMP_COL_INDEX
)
{
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
base
.
functionId
==
TSDB_FUNC_PRJ
&&
pExpr
->
base
.
colInfo
.
colId
==
PRIMARYKEY_TIMESTAMP_COL_INDEX
)
{
orderColIndexList
[
0
]
=
i
;
}
}
...
...
@@ -609,7 +609,7 @@ static int32_t createOrderDescriptor(tOrderDescriptor **pOrderDesc, SSqlCmd *pCm
}
bool
isSameGroup
(
SSqlCmd
*
pCmd
,
SLocalMerger
*
pReducer
,
char
*
pPrev
,
tFilePage
*
tmpBuffer
)
{
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
// disable merge procedure for column projection query
int16_t
functionId
=
pReducer
->
pCtx
[
0
].
functionId
;
...
...
@@ -660,7 +660,7 @@ int32_t tscLocalReducerEnvCreate(SSqlObj *pSql, tExtMemBuffer ***pMemBuffer, tOr
SColumnModel
*
pModel
=
NULL
;
*
pFinalModel
=
NULL
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
(
*
pMemBuffer
)
=
(
tExtMemBuffer
**
)
malloc
(
POINTER_BYTES
*
pSql
->
subState
.
numOfSub
);
...
...
@@ -681,13 +681,13 @@ int32_t tscLocalReducerEnvCreate(SSqlObj *pSql, tExtMemBuffer ***pMemBuffer, tOr
int32_t
rlen
=
0
;
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
pSchema
[
i
].
bytes
=
pExpr
->
resBytes
;
pSchema
[
i
].
type
=
(
int8_t
)
pExpr
->
resType
;
tstrncpy
(
pSchema
[
i
].
name
,
pExpr
->
aliasName
,
tListLen
(
pSchema
[
i
].
name
));
pSchema
[
i
].
bytes
=
pExpr
->
base
.
resBytes
;
pSchema
[
i
].
type
=
(
int8_t
)
pExpr
->
base
.
resType
;
tstrncpy
(
pSchema
[
i
].
name
,
pExpr
->
base
.
aliasName
,
tListLen
(
pSchema
[
i
].
name
));
rlen
+=
pExpr
->
resBytes
;
rlen
+=
pExpr
->
base
.
resBytes
;
}
int32_t
capacity
=
0
;
...
...
@@ -720,17 +720,17 @@ int32_t tscLocalReducerEnvCreate(SSqlObj *pSql, tExtMemBuffer ***pMemBuffer, tOr
memset
(
pSchema
,
0
,
sizeof
(
SSchema
)
*
size
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
SSchema
p1
=
{
0
};
if
(
pExpr
->
colInfo
.
colIndex
==
TSDB_TBNAME_COLUMN_INDEX
)
{
if
(
pExpr
->
base
.
colInfo
.
colIndex
==
TSDB_TBNAME_COLUMN_INDEX
)
{
p1
=
*
tGetTbnameColumnSchema
();
}
else
if
(
TSDB_COL_IS_UD_COL
(
pExpr
->
colInfo
.
flag
))
{
p1
.
bytes
=
pExpr
->
resBytes
;
p1
.
type
=
(
uint8_t
)
pExpr
->
resType
;
tstrncpy
(
p1
.
name
,
pExpr
->
aliasName
,
tListLen
(
p1
.
name
));
}
else
if
(
TSDB_COL_IS_UD_COL
(
pExpr
->
base
.
colInfo
.
flag
))
{
p1
.
bytes
=
pExpr
->
base
.
resBytes
;
p1
.
type
=
(
uint8_t
)
pExpr
->
base
.
resType
;
tstrncpy
(
p1
.
name
,
pExpr
->
base
.
aliasName
,
tListLen
(
p1
.
name
));
}
else
{
p1
=
*
tscGetTableColumnSchema
(
pTableMetaInfo
->
pTableMeta
,
pExpr
->
colInfo
.
colIndex
);
p1
=
*
tscGetTableColumnSchema
(
pTableMetaInfo
->
pTableMeta
,
pExpr
->
base
.
colInfo
.
colIndex
);
}
int32_t
inter
=
0
;
...
...
@@ -739,7 +739,7 @@ int32_t tscLocalReducerEnvCreate(SSqlObj *pSql, tExtMemBuffer ***pMemBuffer, tOr
// the final result size and type in the same as query on single table.
// so here, set the flag to be false;
int32_t
functionId
=
pExpr
->
functionId
;
int32_t
functionId
=
pExpr
->
base
.
functionId
;
if
(
functionId
>=
TSDB_FUNC_TS
&&
functionId
<=
TSDB_FUNC_DIFF
)
{
type
=
pModel
->
pFields
[
i
].
field
.
type
;
bytes
=
pModel
->
pFields
[
i
].
field
.
bytes
;
...
...
@@ -866,7 +866,7 @@ void adjustLoserTreeFromNewData(SLocalMerger *pLocalMerge, SLocalDataSource *pOn
}
}
void
savePrevRecordAndSetupFillInfo
(
SLocalMerger
*
pLocalMerge
,
SQueryInfo
*
pQueryInfo
,
SFillInfo
*
pFillInfo
)
{
void
savePrevRecordAndSetupFillInfo
(
SLocalMerger
*
pLocalMerge
,
SQuery
Node
Info
*
pQueryInfo
,
SFillInfo
*
pFillInfo
)
{
// discard following dataset in the same group and reset the interpolation information
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
...
...
@@ -886,7 +886,7 @@ void savePrevRecordAndSetupFillInfo(SLocalMerger *pLocalMerge, SQueryInfo *pQuer
tColModelAppend
(
pModel
,
pLocalMerge
->
discardData
,
pLocalMerge
->
prevRowOfInput
,
0
,
1
,
1
);
}
static
void
genFinalResWithoutFill
(
SSqlRes
*
pRes
,
SLocalMerger
*
pLocalMerge
,
SQueryInfo
*
pQueryInfo
)
{
static
void
genFinalResWithoutFill
(
SSqlRes
*
pRes
,
SLocalMerger
*
pLocalMerge
,
SQuery
Node
Info
*
pQueryInfo
)
{
assert
(
pQueryInfo
->
interval
.
interval
==
0
||
pQueryInfo
->
fillType
==
TSDB_FILL_NONE
);
tFilePage
*
pBeforeFillData
=
pLocalMerge
->
pResultBuf
;
...
...
@@ -950,7 +950,7 @@ static void doFillResult(SSqlObj *pSql, SLocalMerger *pLocalMerge, bool doneOutp
SSqlRes
*
pRes
=
&
pSql
->
res
;
tFilePage
*
pBeforeFillData
=
pLocalMerge
->
pResultBuf
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SFillInfo
*
pFillInfo
=
pLocalMerge
->
pFillInfo
;
// todo extract function
...
...
@@ -1049,7 +1049,7 @@ static void savePreviousRow(SLocalMerger *pLocalMerge, tFilePage *tmpBuffer) {
static
void
doExecuteFinalMerge
(
SSqlCmd
*
pCmd
,
SLocalMerger
*
pLocalMerge
,
bool
needInit
)
{
// the tag columns need to be set before all functions execution
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
size_t
size
=
tscSqlExprNumOfExprs
(
pQueryInfo
);
for
(
int32_t
j
=
0
;
j
<
size
;
++
j
)
{
...
...
@@ -1069,8 +1069,8 @@ static void doExecuteFinalMerge(SSqlCmd *pCmd, SLocalMerger *pLocalMerge, bool n
}
}
else
if
(
functionId
==
TSDB_FUNC_TOP
||
functionId
==
TSDB_FUNC_BOTTOM
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
j
);
pCtx
->
param
[
0
].
i64
=
pExpr
->
param
[
0
].
i64
;
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
j
);
pCtx
->
param
[
0
].
i64
=
pExpr
->
base
.
param
[
0
].
i64
;
}
pCtx
->
currentStage
=
MERGE_STAGE
;
...
...
@@ -1098,7 +1098,7 @@ static void handleUnprocessedRow(SSqlCmd *pCmd, SLocalMerger *pLocalMerge, tFile
}
}
static
int64_t
getNumOfResultLocal
(
SQueryInfo
*
pQueryInfo
,
SQLFunctionCtx
*
pCtx
)
{
static
int64_t
getNumOfResultLocal
(
SQuery
Node
Info
*
pQueryInfo
,
SQLFunctionCtx
*
pCtx
)
{
int64_t
maxOutput
=
0
;
size_t
size
=
tscSqlExprNumOfExprs
(
pQueryInfo
);
...
...
@@ -1127,14 +1127,14 @@ static int64_t getNumOfResultLocal(SQueryInfo *pQueryInfo, SQLFunctionCtx *pCtx)
* filled with the same result, which is the tags, specified in group by clause
*
*/
static
void
fillMultiRowsOfTagsVal
(
SQueryInfo
*
pQueryInfo
,
int32_t
numOfRes
,
SLocalMerger
*
pLocalMerge
)
{
static
void
fillMultiRowsOfTagsVal
(
SQuery
Node
Info
*
pQueryInfo
,
int32_t
numOfRes
,
SLocalMerger
*
pLocalMerge
)
{
int32_t
maxBufSize
=
0
;
// find the max tags column length to prepare the buffer
size_t
size
=
tscSqlExprNumOfExprs
(
pQueryInfo
);
for
(
int32_t
k
=
0
;
k
<
size
;
++
k
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
k
);
if
(
maxBufSize
<
pExpr
->
resBytes
&&
pExpr
->
functionId
==
TSDB_FUNC_TAG
)
{
maxBufSize
=
pExpr
->
resBytes
;
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
k
);
if
(
maxBufSize
<
pExpr
->
base
.
resBytes
&&
pExpr
->
base
.
functionId
==
TSDB_FUNC_TAG
)
{
maxBufSize
=
pExpr
->
base
.
resBytes
;
}
}
...
...
@@ -1160,7 +1160,7 @@ static void fillMultiRowsOfTagsVal(SQueryInfo *pQueryInfo, int32_t numOfRes, SLo
free
(
buf
);
}
int32_t
finalizeRes
(
SQueryInfo
*
pQueryInfo
,
SLocalMerger
*
pLocalMerge
)
{
int32_t
finalizeRes
(
SQuery
Node
Info
*
pQueryInfo
,
SLocalMerger
*
pLocalMerge
)
{
size_t
size
=
tscSqlExprNumOfExprs
(
pQueryInfo
);
for
(
int32_t
k
=
0
;
k
<
size
;
++
k
)
{
...
...
@@ -1184,7 +1184,7 @@ int32_t finalizeRes(SQueryInfo *pQueryInfo, SLocalMerger *pLocalMerge) {
* results generated by simple aggregation function, we merge them all into one points
* *Exception*: column projection query, required no merge procedure
*/
bool
needToMerge
(
SQueryInfo
*
pQueryInfo
,
SLocalMerger
*
pLocalMerge
,
tFilePage
*
tmpBuffer
)
{
bool
needToMerge
(
SQuery
Node
Info
*
pQueryInfo
,
SLocalMerger
*
pLocalMerge
,
tFilePage
*
tmpBuffer
)
{
int32_t
ret
=
0
;
// merge all result by default
int16_t
functionId
=
pLocalMerge
->
pCtx
[
0
].
functionId
;
...
...
@@ -1208,7 +1208,7 @@ bool needToMerge(SQueryInfo *pQueryInfo, SLocalMerger *pLocalMerge, tFilePage *t
return
(
ret
==
0
);
}
static
bool
reachGroupResultLimit
(
SQueryInfo
*
pQueryInfo
,
SSqlRes
*
pRes
)
{
static
bool
reachGroupResultLimit
(
SQuery
Node
Info
*
pQueryInfo
,
SSqlRes
*
pRes
)
{
return
(
pRes
->
numOfGroups
>=
pQueryInfo
->
slimit
.
limit
&&
pQueryInfo
->
slimit
.
limit
>=
0
);
}
...
...
@@ -1216,7 +1216,7 @@ static bool saveGroupResultInfo(SSqlObj *pSql) {
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
SSqlRes
*
pRes
=
&
pSql
->
res
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
if
(
pRes
->
numOfRowsGroup
>
0
)
{
pRes
->
numOfGroups
+=
1
;
...
...
@@ -1245,7 +1245,7 @@ bool genFinalResults(SSqlObj *pSql, SLocalMerger *pLocalMerge, bool noMoreCurren
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
SSqlRes
*
pRes
=
&
pSql
->
res
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
tFilePage
*
pResBuf
=
pLocalMerge
->
pResultBuf
;
SColumnModel
*
pModel
=
pLocalMerge
->
resColModel
;
...
...
@@ -1292,13 +1292,13 @@ bool genFinalResults(SSqlObj *pSql, SLocalMerger *pLocalMerge, bool noMoreCurren
return
true
;
}
void
resetOutputBuf
(
SQueryInfo
*
pQueryInfo
,
SLocalMerger
*
pLocalMerge
)
{
// reset output buffer to the beginning
void
resetOutputBuf
(
SQuery
Node
Info
*
pQueryInfo
,
SLocalMerger
*
pLocalMerge
)
{
// reset output buffer to the beginning
size_t
t
=
tscSqlExprNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
t
;
++
i
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
pLocalMerge
->
pCtx
[
i
].
pOutput
=
pLocalMerge
->
pResultBuf
->
data
+
pExpr
->
offset
*
pLocalMerge
->
resColModel
->
capacity
;
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
pLocalMerge
->
pCtx
[
i
].
pOutput
=
pLocalMerge
->
pResultBuf
->
data
+
pExpr
->
base
.
offset
*
pLocalMerge
->
resColModel
->
capacity
;
if
(
pExpr
->
functionId
==
TSDB_FUNC_TOP
||
pExpr
->
functionId
==
TSDB_FUNC_BOTTOM
||
pExpr
->
functionId
==
TSDB_FUNC_DIFF
)
{
if
(
pExpr
->
base
.
functionId
==
TSDB_FUNC_TOP
||
pExpr
->
base
.
functionId
==
TSDB_FUNC_BOTTOM
||
pExpr
->
base
.
functionId
==
TSDB_FUNC_DIFF
)
{
pLocalMerge
->
pCtx
[
i
].
ptsOutputBuf
=
pLocalMerge
->
pCtx
[
0
].
pOutput
;
}
}
...
...
@@ -1311,7 +1311,7 @@ static void resetEnvForNewResultset(SSqlRes *pRes, SSqlCmd *pCmd, SLocalMerger *
pRes
->
numOfRows
=
0
;
pRes
->
numOfRowsGroup
=
0
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
pQueryInfo
->
limit
.
offset
=
pLocalMerge
->
offset
;
...
...
@@ -1334,7 +1334,7 @@ static bool doBuildFilledResultForGroup(SSqlObj *pSql) {
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
SSqlRes
*
pRes
=
&
pSql
->
res
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SLocalMerger
*
pLocalMerge
=
pRes
->
pLocalMerger
;
SFillInfo
*
pFillInfo
=
pLocalMerge
->
pFillInfo
;
...
...
@@ -1365,7 +1365,7 @@ static bool doHandleLastRemainData(SSqlObj *pSql) {
bool
prevGroupCompleted
=
(
!
pLocalMerge
->
discard
)
&&
pLocalMerge
->
hasUnprocessedRow
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
if
((
isAllSourcesCompleted
(
pLocalMerge
)
&&
!
pLocalMerge
->
hasPrevRow
)
||
pLocalMerge
->
pLocalDataSrc
[
0
]
==
NULL
||
prevGroupCompleted
)
{
...
...
@@ -1406,7 +1406,7 @@ static void doProcessResultInNextWindow(SSqlObj *pSql, int32_t numOfRes) {
SSqlRes
*
pRes
=
&
pSql
->
res
;
SLocalMerger
*
pLocalMerge
=
pRes
->
pLocalMerger
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
size_t
size
=
tscSqlExprNumOfExprs
(
pQueryInfo
);
for
(
int32_t
k
=
0
;
k
<
size
;
++
k
)
{
...
...
@@ -1438,7 +1438,7 @@ int32_t tscDoLocalMerge(SSqlObj *pSql) {
}
SLocalMerger
*
pLocalMerge
=
pRes
->
pLocalMerger
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
tFilePage
*
tmpBuffer
=
pLocalMerge
->
pTempBuffer
;
if
(
doHandleLastRemainData
(
pSql
))
{
...
...
@@ -1626,7 +1626,7 @@ void tscInitResObjForLocalQuery(SSqlObj *pObj, int32_t numOfRes, int32_t rowLen)
pRes
->
data
=
pRes
->
pLocalMerger
->
pResultBuf
->
data
;
}
int32_t
doArithmeticCalculate
(
SQueryInfo
*
pQueryInfo
,
tFilePage
*
pOutput
,
int32_t
rowSize
,
int32_t
finalRowSize
)
{
int32_t
doArithmeticCalculate
(
SQuery
Node
Info
*
pQueryInfo
,
tFilePage
*
pOutput
,
int32_t
rowSize
,
int32_t
finalRowSize
)
{
int32_t
maxRowSize
=
MAX
(
rowSize
,
finalRowSize
);
char
*
pbuf
=
calloc
(
1
,
(
size_t
)(
pOutput
->
num
*
maxRowSize
));
...
...
@@ -1640,8 +1640,8 @@ int32_t doArithmeticCalculate(SQueryInfo* pQueryInfo, tFilePage* pOutput, int32_
arithSup
.
data
=
calloc
(
arithSup
.
numOfCols
,
POINTER_BYTES
);
for
(
int32_t
k
=
0
;
k
<
arithSup
.
numOfCols
;
++
k
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
k
);
arithSup
.
data
[
k
]
=
(
pOutput
->
data
+
pOutput
->
num
*
pExpr
->
offset
);
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
k
);
arithSup
.
data
[
k
]
=
(
pOutput
->
data
+
pOutput
->
num
*
pExpr
->
base
.
offset
);
}
int32_t
offset
=
0
;
...
...
@@ -1650,12 +1650,12 @@ int32_t doArithmeticCalculate(SQueryInfo* pQueryInfo, tFilePage* pOutput, int32_
SInternalField
*
pSup
=
TARRAY_GET_ELEM
(
pQueryInfo
->
fieldsInfo
.
internalField
,
i
);
// calculate the result from several other columns
if
(
pSup
->
p
ArithExprInfo
!=
NULL
)
{
arithSup
.
pArithExpr
=
pSup
->
p
ArithExprInfo
;
if
(
pSup
->
p
Expr
->
pExpr
!=
NULL
)
{
arithSup
.
pArithExpr
=
pSup
->
p
Expr
;
arithmeticTreeTraverse
(
arithSup
.
pArithExpr
->
pExpr
,
(
int32_t
)
pOutput
->
num
,
pbuf
+
pOutput
->
num
*
offset
,
&
arithSup
,
TSDB_ORDER_ASC
,
getArithmeticInputSrc
);
}
else
{
S
SqlExpr
*
pExpr
=
pSup
->
pSql
Expr
;
memcpy
(
pbuf
+
pOutput
->
num
*
offset
,
pExpr
->
offset
*
pOutput
->
num
+
pOutput
->
data
,
(
size_t
)(
pExpr
->
resBytes
*
pOutput
->
num
));
S
ExprInfo
*
pExpr
=
pSup
->
p
Expr
;
memcpy
(
pbuf
+
pOutput
->
num
*
offset
,
pExpr
->
base
.
offset
*
pOutput
->
num
+
pOutput
->
data
,
(
size_t
)(
pExpr
->
base
.
resBytes
*
pOutput
->
num
));
}
offset
+=
pSup
->
field
.
bytes
;
...
...
src/client/src/tscParseInsert.c
浏览文件 @
b6aa9da9
...
...
@@ -759,7 +759,7 @@ static int32_t tscCheckIfCreateTable(char **sqlstr, SSqlObj *pSql) {
const
int32_t
STABLE_INDEX
=
1
;
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
char
*
sql
=
*
sqlstr
;
...
...
@@ -1055,7 +1055,7 @@ int tsParseInsertSql(SSqlObj *pSql) {
int32_t
totalNum
=
0
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
assert
(
pQueryInfo
!=
NULL
);
STableMetaInfo
*
pTableMetaInfo
=
(
pQueryInfo
->
numOfTables
==
0
)
?
tscAddEmptyMetaInfo
(
pQueryInfo
)
:
tscGetMetaInfo
(
pQueryInfo
,
0
);
...
...
@@ -1313,7 +1313,7 @@ int tsInsertInitialCheck(SSqlObj *pSql) {
pCmd
->
count
=
0
;
pCmd
->
command
=
TSDB_SQL_INSERT
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfoS
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfoS
(
pCmd
,
pCmd
->
clauseIndex
);
TSDB_QUERY_SET_TYPE
(
pQueryInfo
->
type
,
TSDB_QUERY_TYPE_INSERT
|
pCmd
->
insertType
);
...
...
src/client/src/tscSQLParser.c
浏览文件 @
b6aa9da9
...
...
@@ -56,7 +56,7 @@ typedef struct SConvertFunc {
int32_t
execFuncId
;
}
SConvertFunc
;
static
S
SqlExpr
*
doAddProjectCol
(
SQuery
Info
*
pQueryInfo
,
int32_t
colIndex
,
int32_t
tableIndex
);
static
S
ExprInfo
*
doAddProjectCol
(
SQueryNode
Info
*
pQueryInfo
,
int32_t
colIndex
,
int32_t
tableIndex
);
static
int32_t
setShowInfo
(
SSqlObj
*
pSql
,
SSqlInfo
*
pInfo
);
static
char
*
getAccountId
(
SSqlObj
*
pSql
);
...
...
@@ -71,35 +71,35 @@ static int32_t setObjFullName(char* fullName, const char* account, SStrToken* pD
static
void
getColumnName
(
tSqlExprItem
*
pItem
,
char
*
resultFieldName
,
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
,
int8_t
type
,
char
*
fieldName
,
S
SqlExpr
*
pSqlExpr
);
static
int32_t
addExprAndResultField
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
,
int32_t
colIndex
,
tSqlExprItem
*
pItem
,
bool
finalResult
);
static
int32_t
insertResultField
(
SQuery
Node
Info
*
pQueryInfo
,
int32_t
outputIndex
,
SColumnList
*
pIdList
,
int16_t
bytes
,
int8_t
type
,
char
*
fieldName
,
S
ExprInfo
*
pSqlExpr
);
static
uint8_t
convertOptr
(
SStrToken
*
pToken
);
static
int32_t
validateSelectNodeList
(
SSqlCmd
*
pCmd
,
int32_t
clauseIndex
,
SArray
*
pSelNodeList
,
bool
isSTable
,
bool
joinQuery
,
bool
timeWindowQuery
);
static
bool
validateIpAddress
(
const
char
*
ip
,
size_t
size
);
static
bool
hasUnsupportFunctionsForSTableQuery
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
);
static
bool
functionCompatibleCheck
(
SQueryInfo
*
pQueryInfo
,
bool
joinQuery
,
bool
twQuery
);
static
bool
hasUnsupportFunctionsForSTableQuery
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
);
static
bool
functionCompatibleCheck
(
SQuery
Node
Info
*
pQueryInfo
,
bool
joinQuery
,
bool
twQuery
);
static
int32_t
validateGroupbyNode
(
SQueryInfo
*
pQueryInfo
,
SArray
*
pList
,
SSqlCmd
*
pCmd
);
static
int32_t
validateGroupbyNode
(
SQuery
Node
Info
*
pQueryInfo
,
SArray
*
pList
,
SSqlCmd
*
pCmd
);
static
int32_t
validateIntervalNode
(
SSqlObj
*
pSql
,
SQueryInfo
*
pQueryInfo
,
SQuerySqlNode
*
pQuerySqlNode
);
static
int32_t
parseIntervalOffset
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
SStrToken
*
offsetToken
);
static
int32_t
parseSlidingClause
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
SStrToken
*
pSliding
);
static
int32_t
validateIntervalNode
(
SSqlObj
*
pSql
,
SQuery
Node
Info
*
pQueryInfo
,
SQuerySqlNode
*
pQuerySqlNode
);
static
int32_t
parseIntervalOffset
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
,
SStrToken
*
offsetToken
);
static
int32_t
parseSlidingClause
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
,
SStrToken
*
pSliding
);
static
int32_t
addProjectionExprAndResultField
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
tSqlExprItem
*
pItem
);
static
int32_t
addProjectionExprAndResultField
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
,
tSqlExprItem
*
pItem
);
static
int32_t
validateWhereNode
(
SQueryInfo
*
pQueryInfo
,
tSqlExpr
**
pExpr
,
SSqlObj
*
pSql
);
static
int32_t
validateFillNode
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
SQuerySqlNode
*
pQuerySqlNode
);
static
int32_t
validateOrderbyNode
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
SQuerySqlNode
*
pQuerySqlNode
,
SSchema
*
pSchema
);
static
int32_t
validateWhereNode
(
SQuery
Node
Info
*
pQueryInfo
,
tSqlExpr
**
pExpr
,
SSqlObj
*
pSql
);
static
int32_t
validateFillNode
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
,
SQuerySqlNode
*
pQuerySqlNode
);
static
int32_t
validateOrderbyNode
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
,
SQuerySqlNode
*
pQuerySqlNode
,
SSchema
*
pSchema
);
static
int32_t
tsRewriteFieldNameIfNecessary
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
);
static
int32_t
tsRewriteFieldNameIfNecessary
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
);
static
int32_t
setAlterTableInfo
(
SSqlObj
*
pSql
,
struct
SSqlInfo
*
pInfo
);
static
int32_t
validateSqlFunctionInStreamSql
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
);
static
int32_t
validateFunctionsInIntervalOrGroupbyQuery
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
);
static
int32_t
validateArithmeticSQLExpr
(
SSqlCmd
*
pCmd
,
tSqlExpr
*
pExpr
,
SQueryInfo
*
pQueryInfo
,
SColumnList
*
pList
,
int32_t
*
type
);
static
int32_t
validateSqlFunctionInStreamSql
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
);
static
int32_t
validateFunctionsInIntervalOrGroupbyQuery
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
);
static
int32_t
validateArithmeticSQLExpr
(
SSqlCmd
*
pCmd
,
tSqlExpr
*
pExpr
,
SQuery
Node
Info
*
pQueryInfo
,
SColumnList
*
pList
,
int32_t
*
type
);
static
int32_t
validateEp
(
char
*
ep
);
static
int32_t
validateDNodeConfig
(
SMiscInfo
*
pOptions
);
static
int32_t
validateLocalConfig
(
SMiscInfo
*
pOptions
);
...
...
@@ -107,34 +107,34 @@ static int32_t validateColumnName(char* name);
static
int32_t
setKillInfo
(
SSqlObj
*
pSql
,
struct
SSqlInfo
*
pInfo
,
int32_t
killType
);
static
bool
validateOneTags
(
SSqlCmd
*
pCmd
,
TAOS_FIELD
*
pTagField
);
static
bool
hasTimestampForPointInterpQuery
(
SQueryInfo
*
pQueryInfo
);
static
bool
hasNormalColumnFilter
(
SQueryInfo
*
pQueryInfo
);
static
bool
hasTimestampForPointInterpQuery
(
SQuery
Node
Info
*
pQueryInfo
);
static
bool
hasNormalColumnFilter
(
SQuery
Node
Info
*
pQueryInfo
);
static
int32_t
validateLimitNode
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
int32_t
index
,
SQuerySqlNode
*
pQuerySqlNode
,
SSqlObj
*
pSql
);
static
int32_t
validateLimitNode
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
,
int32_t
index
,
SQuerySqlNode
*
pQuerySqlNode
,
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
);
static
int32_t
getColumnIndexByName
(
SSqlCmd
*
pCmd
,
const
SStrToken
*
pToken
,
SQuery
Node
Info
*
pQueryInfo
,
SColumnIndex
*
pIndex
);
static
int32_t
getTableIndexByName
(
SStrToken
*
pToken
,
SQuery
Node
Info
*
pQueryInfo
,
SColumnIndex
*
pIndex
);
static
int32_t
getTableIndexImpl
(
SStrToken
*
pTableToken
,
SQueryInfo
*
pQueryInfo
,
SColumnIndex
*
pIndex
);
static
int32_t
doFunctionsCompatibleCheck
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
);
static
int32_t
doLocalQueryProcess
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
SQuerySqlNode
*
pQuerySqlNode
);
static
int32_t
getTableIndexImpl
(
SStrToken
*
pTableToken
,
SQuery
Node
Info
*
pQueryInfo
,
SColumnIndex
*
pIndex
);
static
int32_t
doFunctionsCompatibleCheck
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
);
static
int32_t
doLocalQueryProcess
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
,
SQuerySqlNode
*
pQuerySqlNode
);
static
int32_t
tscCheckCreateDbParams
(
SSqlCmd
*
pCmd
,
SCreateDbMsg
*
pCreate
);
static
SColumnList
get
ColumnList
(
int32_t
num
,
int16_t
tableIndex
,
int32_t
columnIndex
);
static
SColumnList
create
ColumnList
(
int32_t
num
,
int16_t
tableIndex
,
int32_t
columnIndex
);
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
,
SQuerySqlNode
*
pQuerySqlNode
,
int32_t
index
);
static
int32_t
exprTreeFromSqlExpr
(
SSqlCmd
*
pCmd
,
tExprNode
**
pExpr
,
const
tSqlExpr
*
pSqlExpr
,
SQueryInfo
*
pQueryInfo
,
SArray
*
pCols
,
int64_t
*
uid
);
static
int32_t
exprTreeFromSqlExpr
(
SSqlCmd
*
pCmd
,
tExprNode
**
pExpr
,
const
tSqlExpr
*
pSqlExpr
,
SQuery
Node
Info
*
pQueryInfo
,
SArray
*
pCols
,
int64_t
*
uid
);
static
bool
validateDebugFlag
(
int32_t
v
);
static
int32_t
checkQueryRangeForFill
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
);
static
int32_t
checkQueryRangeForFill
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
);
static
bool
isTimeWindowQuery
(
SQueryInfo
*
pQueryInfo
)
{
static
bool
isTimeWindowQuery
(
SQuery
Node
Info
*
pQueryInfo
)
{
return
pQueryInfo
->
interval
.
interval
>
0
||
pQueryInfo
->
sessionWindow
.
gap
>
0
;
}
int16_t
getNewResColId
(
SQueryInfo
*
pQueryInfo
)
{
int16_t
getNewResColId
(
SQuery
Node
Info
*
pQueryInfo
)
{
return
pQueryInfo
->
resColumnId
--
;
}
...
...
@@ -195,7 +195,7 @@ static int32_t invalidSqlErrMsg(char* dstBuffer, const char* errMsg) {
return
tscInvalidSQLErrMsg
(
dstBuffer
,
errMsg
,
NULL
);
}
static
int
setColumnFilterInfoForTimestamp
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
tVariant
*
pVar
)
{
static
int
setColumnFilterInfoForTimestamp
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
,
tVariant
*
pVar
)
{
int64_t
time
=
0
;
const
char
*
msg
=
"invalid timestamp"
;
...
...
@@ -258,7 +258,7 @@ int32_t tscToSQLCmd(SSqlObj* pSql, struct SSqlInfo* pInfo) {
return
tscSQLSyntaxErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
NULL
,
pInfo
->
msg
);
}
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfoS
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfoS
(
pCmd
,
pCmd
->
clauseIndex
);
if
(
pQueryInfo
==
NULL
)
{
pRes
->
code
=
terrno
;
return
pRes
->
code
;
...
...
@@ -618,7 +618,7 @@ int32_t tscToSQLCmd(SSqlObj* pSql, struct SSqlInfo* pInfo) {
const
char
*
msg1
=
"columns in select clause not identical"
;
for
(
int32_t
i
=
pCmd
->
numOfClause
;
i
<
pInfo
->
subclauseInfo
.
numOfClause
;
++
i
)
{
SQueryInfo
*
p
=
tscGetQueryInfoS
(
pCmd
,
i
);
SQuery
Node
Info
*
p
=
tscGetQueryInfoS
(
pCmd
,
i
);
if
(
p
==
NULL
)
{
pRes
->
code
=
terrno
;
return
pRes
->
code
;
...
...
@@ -641,13 +641,13 @@ int32_t tscToSQLCmd(SSqlObj* pSql, struct SSqlInfo* pInfo) {
pCmd
->
clauseIndex
=
0
;
// set the command/global limit parameters from the first subclause to the sqlcmd object
SQueryInfo
*
pQueryInfo1
=
tscGetQueryInfo
(
pCmd
,
0
);
SQuery
Node
Info
*
pQueryInfo1
=
tscGetQueryInfo
(
pCmd
,
0
);
pCmd
->
command
=
pQueryInfo1
->
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
);
SQuery
Node
Info
*
pQueryInfo2
=
tscGetQueryInfo
(
pCmd
,
i
);
int32_t
ret
=
tscFieldInfoCompare
(
&
pQueryInfo1
->
fieldsInfo
,
&
pQueryInfo2
->
fieldsInfo
);
if
(
ret
!=
0
)
{
...
...
@@ -693,11 +693,11 @@ int32_t tscToSQLCmd(SSqlObj* pSql, struct SSqlInfo* pInfo) {
* if the top/bottom exists, only tags columns, tbname column, and primary timestamp column
* are available.
*/
static
bool
isTopBottomQuery
(
SQueryInfo
*
pQueryInfo
)
{
static
bool
isTopBottomQuery
(
SQuery
Node
Info
*
pQueryInfo
)
{
size_t
size
=
tscSqlExprNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
int32_t
functionId
=
tscSqlExprGet
(
pQueryInfo
,
i
)
->
functionId
;
int32_t
functionId
=
tscSqlExprGet
(
pQueryInfo
,
i
)
->
base
.
functionId
;
if
(
functionId
==
TSDB_FUNC_TOP
||
functionId
==
TSDB_FUNC_BOTTOM
)
{
return
true
;
...
...
@@ -708,7 +708,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
)
{
static
int32_t
addPrimaryTsColumnForTimeWindowQuery
(
SQuery
Node
Info
*
pQueryInfo
)
{
uint64_t
uid
=
tscSqlExprGet
(
pQueryInfo
,
0
)
->
uid
;
int32_t
tableIndex
=
COLUMN_INDEX_INITIAL_VAL
;
...
...
@@ -732,7 +732,7 @@ static int32_t addPrimaryTsColumnForTimeWindowQuery(SQueryInfo* pQueryInfo) {
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
checkInvalidExprForTimeWindow
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
)
{
static
int32_t
checkInvalidExprForTimeWindow
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
)
{
const
char
*
msg1
=
"invalid query expression"
;
const
char
*
msg2
=
"top/bottom query does not support order by value in time window query"
;
...
...
@@ -756,8 +756,8 @@ static int32_t checkInvalidExprForTimeWindow(SSqlCmd* pCmd, SQueryInfo* pQueryIn
*/
size_t
size
=
tscSqlExprNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
functionId
==
TSDB_FUNC_COUNT
&&
TSDB_COL_IS_TAG
(
pExpr
->
colInfo
.
flag
))
{
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
base
.
functionId
==
TSDB_FUNC_COUNT
&&
TSDB_COL_IS_TAG
(
pExpr
->
base
.
colInfo
.
flag
))
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg1
);
}
}
...
...
@@ -773,7 +773,7 @@ static int32_t checkInvalidExprForTimeWindow(SSqlCmd* pCmd, SQueryInfo* pQueryIn
return
addPrimaryTsColumnForTimeWindowQuery
(
pQueryInfo
);
}
int32_t
validateIntervalNode
(
SSqlObj
*
pSql
,
SQueryInfo
*
pQueryInfo
,
SQuerySqlNode
*
pQuerySqlNode
)
{
int32_t
validateIntervalNode
(
SSqlObj
*
pSql
,
SQuery
Node
Info
*
pQueryInfo
,
SQuerySqlNode
*
pQuerySqlNode
)
{
const
char
*
msg2
=
"interval cannot be less than 10 ms"
;
const
char
*
msg3
=
"sliding cannot be used without interval"
;
...
...
@@ -825,7 +825,7 @@ int32_t validateIntervalNode(SSqlObj* pSql, SQueryInfo* pQueryInfo, SQuerySqlNod
return
checkInvalidExprForTimeWindow
(
pCmd
,
pQueryInfo
);
}
int32_t
validateSessionNode
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
SQuerySqlNode
*
pQuerySqlNode
)
{
int32_t
validateSessionNode
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
,
SQuerySqlNode
*
pQuerySqlNode
)
{
const
char
*
msg1
=
"gap should be fixed time window"
;
const
char
*
msg2
=
"only one type time window allowed"
;
const
char
*
msg3
=
"invalid column name"
;
...
...
@@ -870,7 +870,7 @@ int32_t validateSessionNode(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySqlNode
return
checkInvalidExprForTimeWindow
(
pCmd
,
pQueryInfo
);
}
int32_t
parseIntervalOffset
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
SStrToken
*
offsetToken
)
{
int32_t
parseIntervalOffset
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
,
SStrToken
*
offsetToken
)
{
const
char
*
msg1
=
"interval offset cannot be negative"
;
const
char
*
msg2
=
"interval offset should be shorter than interval"
;
const
char
*
msg3
=
"cannot use 'year' as offset when interval is 'month'"
;
...
...
@@ -921,7 +921,7 @@ int32_t parseIntervalOffset(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SStrToken* of
return
TSDB_CODE_SUCCESS
;
}
int32_t
parseSlidingClause
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
SStrToken
*
pSliding
)
{
int32_t
parseSlidingClause
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
,
SStrToken
*
pSliding
)
{
const
char
*
msg0
=
"sliding value too small"
;
const
char
*
msg1
=
"sliding value no larger than the interval value"
;
const
char
*
msg2
=
"sliding value can not less than 1% of interval value"
;
...
...
@@ -1382,9 +1382,10 @@ int32_t setObjFullName(char* fullName, const char* account, SStrToken* pDB, SStr
return
(
totalLen
<
TSDB_TABLE_FNAME_LEN
)
?
TSDB_CODE_SUCCESS
:
TSDB_CODE_TSC_INVALID_SQL
;
}
void
tscInsertPrimaryTsSourceColumn
(
SQueryInfo
*
pQueryInfo
,
SColumnIndex
*
pIndex
)
{
void
tscInsertPrimaryTsSourceColumn
(
SQuery
Node
Info
*
pQueryInfo
,
SColumnIndex
*
pIndex
)
{
SColumnIndex
tsCol
=
{.
tableIndex
=
pIndex
->
tableIndex
,
.
columnIndex
=
PRIMARYKEY_TIMESTAMP_COL_INDEX
};
tscColumnListInsert
(
pQueryInfo
->
colList
,
&
tsCol
);
SSchema
s
=
{.
type
=
TSDB_DATA_TYPE_TIMESTAMP
,
.
bytes
=
TSDB_KEYSIZE
,
.
colId
=
PRIMARYKEY_TIMESTAMP_COL_INDEX
};
tscColumnListInsert
(
pQueryInfo
->
colList
,
&
tsCol
,
&
s
);
}
static
int32_t
handleArithmeticExpr
(
SSqlCmd
*
pCmd
,
int32_t
clauseIndex
,
int32_t
exprIndex
,
tSqlExprItem
*
pItem
)
{
...
...
@@ -1394,7 +1395,7 @@ static int32_t handleArithmeticExpr(SSqlCmd* pCmd, int32_t clauseIndex, int32_t
const
char
*
msg4
=
"columns from different table mixed up in arithmetic expression"
;
// arithmetic function in select clause
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
clauseIndex
);
SColumnList
columnList
=
{
0
};
int32_t
arithmeticType
=
NON_ARITHMEIC_EXPR
;
...
...
@@ -1417,12 +1418,12 @@ static int32_t handleArithmeticExpr(SSqlCmd* pCmd, int32_t clauseIndex, int32_t
// expr string is set as the parameter of function
SColumnIndex
index
=
{.
tableIndex
=
tableIndex
};
S
SqlExpr
*
pExpr
=
tscSqlExprAppend
(
pQueryInfo
,
TSDB_FUNC_ARITHM
,
&
index
,
TSDB_DATA_TYPE_DOUBLE
,
sizeof
(
double
),
S
ExprInfo
*
pExpr
=
tscSqlExprAppend
(
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
;
size_t
len
=
MIN
(
sizeof
(
pExpr
->
aliasName
),
pItem
->
pNode
->
token
.
n
+
1
);
tstrncpy
(
pExpr
->
aliasName
,
name
,
len
);
size_t
len
=
MIN
(
sizeof
(
pExpr
->
base
.
aliasName
),
pItem
->
pNode
->
token
.
n
+
1
);
tstrncpy
(
pExpr
->
base
.
aliasName
,
name
,
len
);
tExprNode
*
pNode
=
NULL
;
SArray
*
colList
=
taosArrayInit
(
10
,
sizeof
(
SColIndex
));
...
...
@@ -1460,8 +1461,8 @@ static int32_t handleArithmeticExpr(SSqlCmd* pCmd, int32_t clauseIndex, int32_t
char
*
c
=
tbufGetData
(
&
bw
,
false
);
// set the serialized binary string as the parameter of arithmetic expression
addExprParams
(
pExpr
,
c
,
TSDB_DATA_TYPE_BINARY
,
(
int32_t
)
len
);
insertResultField
(
pQueryInfo
,
exprIndex
,
&
columnList
,
sizeof
(
double
),
TSDB_DATA_TYPE_DOUBLE
,
pExpr
->
aliasName
,
pExpr
);
addExprParams
(
&
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
tscInsertPrimaryTsSourceColumn
(
pQueryInfo
,
&
index
);
...
...
@@ -1486,7 +1487,7 @@ static int32_t handleArithmeticExpr(SSqlCmd* pCmd, int32_t clauseIndex, int32_t
int32_t
slot
=
tscNumOfFields
(
pQueryInfo
)
-
1
;
SInternalField
*
pInfo
=
tscFieldInfoGetInternalField
(
&
pQueryInfo
->
fieldsInfo
,
slot
);
if
(
pInfo
->
p
Sql
Expr
==
NULL
)
{
if
(
pInfo
->
pExpr
==
NULL
)
{
SExprInfo
*
pArithExprInfo
=
calloc
(
1
,
sizeof
(
SExprInfo
));
// arithmetic expression always return result in the format of double float
...
...
@@ -1504,23 +1505,23 @@ static int32_t handleArithmeticExpr(SSqlCmd* pCmd, int32_t clauseIndex, int32_t
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
"invalid expression in select clause"
);
}
pInfo
->
p
ArithExprInfo
=
pArithExprInfo
;
pInfo
->
p
Expr
=
pArithExprInfo
;
}
SBufferWriter
bw
=
tbufInitWriter
(
NULL
,
false
);
TRY
(
0
)
{
exprTreeToBinary
(
&
bw
,
pInfo
->
p
ArithExprInfo
->
pExpr
);
exprTreeToBinary
(
&
bw
,
pInfo
->
p
Expr
->
pExpr
);
}
CATCH
(
code
)
{
tbufCloseWriter
(
&
bw
);
UNUSED
(
code
);
// TODO: other error handling
}
END_TRY
SSqlExpr
*
p
FuncMsg
=
&
pInfo
->
pArithExprInfo
->
base
;
p
FuncMsg
->
param
[
0
].
nLen
=
(
int16_t
)
tbufTell
(
&
bw
);
p
FuncMsg
->
param
[
0
].
pz
=
tbufGetData
(
&
bw
,
true
);
p
FuncMsg
->
param
[
0
].
nType
=
TSDB_DATA_TYPE_BINARY
;
SSqlExpr
*
p
SqlExpr
=
&
pInfo
->
pExpr
->
base
;
p
SqlExpr
->
param
[
0
].
nLen
=
(
int16_t
)
tbufTell
(
&
bw
);
p
SqlExpr
->
param
[
0
].
pz
=
tbufGetData
(
&
bw
,
true
);
p
SqlExpr
->
param
[
0
].
nType
=
TSDB_DATA_TYPE_BINARY
;
// tbufCloseWriter(&bw); // TODO there is a memory leak
}
...
...
@@ -1528,8 +1529,8 @@ static int32_t handleArithmeticExpr(SSqlCmd* pCmd, int32_t clauseIndex, int32_t
return
TSDB_CODE_SUCCESS
;
}
static
void
addProjectQueryCol
(
SQueryInfo
*
pQueryInfo
,
int32_t
startPos
,
SColumnIndex
*
pIndex
,
tSqlExprItem
*
pItem
)
{
S
SqlExpr
*
pExpr
=
doAddProjectCol
(
pQueryInfo
,
pIndex
->
columnIndex
,
pIndex
->
tableIndex
);
static
void
addProjectQueryCol
(
SQuery
Node
Info
*
pQueryInfo
,
int32_t
startPos
,
SColumnIndex
*
pIndex
,
tSqlExprItem
*
pItem
)
{
S
ExprInfo
*
pExpr
=
doAddProjectCol
(
pQueryInfo
,
pIndex
->
columnIndex
,
pIndex
->
tableIndex
);
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
pIndex
->
tableIndex
);
STableMeta
*
pTableMeta
=
pTableMetaInfo
->
pTableMeta
;
...
...
@@ -1537,7 +1538,7 @@ static void addProjectQueryCol(SQueryInfo* pQueryInfo, int32_t startPos, SColumn
SSchema
*
pSchema
=
tscGetTableColumnSchema
(
pTableMeta
,
pIndex
->
columnIndex
);
char
*
colName
=
(
pItem
->
aliasName
==
NULL
)
?
pSchema
->
name
:
pItem
->
aliasName
;
tstrncpy
(
pExpr
->
aliasName
,
colName
,
sizeof
(
pExpr
->
aliasName
));
tstrncpy
(
pExpr
->
base
.
aliasName
,
colName
,
sizeof
(
pExpr
->
base
.
aliasName
));
SColumnList
ids
=
{
0
};
ids
.
num
=
1
;
...
...
@@ -1548,15 +1549,15 @@ static void addProjectQueryCol(SQueryInfo* pQueryInfo, int32_t startPos, SColumn
ids
.
num
=
0
;
}
insertResultField
(
pQueryInfo
,
startPos
,
&
ids
,
pExpr
->
resBytes
,
(
int8_t
)
pExpr
->
resType
,
pExpr
->
aliasName
,
pExpr
);
insertResultField
(
pQueryInfo
,
startPos
,
&
ids
,
pExpr
->
base
.
resBytes
,
(
int8_t
)
pExpr
->
base
.
resType
,
pExpr
->
base
.
aliasName
,
pExpr
);
}
static
void
addPrimaryTsColIntoResult
(
SQueryInfo
*
pQueryInfo
)
{
static
void
addPrimaryTsColIntoResult
(
SQuery
Node
Info
*
pQueryInfo
)
{
// primary timestamp column has been added already
size_t
size
=
tscSqlExprNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
functionId
==
TSDB_FUNC_PRJ
&&
pExpr
->
colInfo
.
colId
==
PRIMARYKEY_TIMESTAMP_COL_INDEX
)
{
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
base
.
functionId
==
TSDB_FUNC_PRJ
&&
pExpr
->
base
.
colInfo
.
colId
==
PRIMARYKEY_TIMESTAMP_COL_INDEX
)
{
return
;
}
}
...
...
@@ -1577,7 +1578,7 @@ static void addPrimaryTsColIntoResult(SQueryInfo* pQueryInfo) {
pQueryInfo
->
type
|=
TSDB_QUERY_TYPE_PROJECTION_QUERY
;
}
bool
isValidDistinctSql
(
SQueryInfo
*
pQueryInfo
)
{
bool
isValidDistinctSql
(
SQuery
Node
Info
*
pQueryInfo
)
{
if
(
pQueryInfo
==
NULL
)
{
return
false
;
}
...
...
@@ -1600,7 +1601,7 @@ int32_t validateSelectNodeList(SSqlCmd* pCmd, int32_t clauseIndex, SArray* pSelN
const
char
*
msg4
=
"only support distinct one tag"
;
const
char
*
msg5
=
"invalid function name"
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
clauseIndex
);
// too many result columns not support order by in query
if
(
taosArrayGetSize
(
pSelNodeList
)
>
TSDB_MAX_COLUMNS
)
{
...
...
@@ -1684,29 +1685,29 @@ int32_t validateSelectNodeList(SSqlCmd* pCmd, int32_t clauseIndex, SArray* pSelN
return
TSDB_CODE_SUCCESS
;
}
int32_t
insertResultField
(
SQueryInfo
*
pQueryInfo
,
int32_t
outputIndex
,
SColumnList
*
pIdList
,
int16_t
bytes
,
int8_t
type
,
char
*
fieldName
,
SSqlExpr
*
pSqlExpr
)
{
for
(
int32_t
i
=
0
;
i
<
pIdList
->
num
;
++
i
)
{
int32_t
tableId
=
pIdList
->
ids
[
i
].
tableIndex
;
STableMetaInfo
*
pTableMetaInfo
=
pQueryInfo
->
pTableMetaInfo
[
tableId
];
int32_t
insertResultField
(
SQueryNodeInfo
*
pQueryInfo
,
int32_t
outputIndex
,
SColumnList
*
pColList
,
int16_t
bytes
,
int8_t
type
,
char
*
fieldName
,
SExprInfo
*
pSqlExpr
)
{
for
(
int32_t
i
=
0
;
i
<
pColList
->
num
;
++
i
)
{
int32_t
tableIndex
=
pColList
->
ids
[
i
].
tableIndex
;
STableMetaInfo
*
pTableMetaInfo
=
pQueryInfo
->
pTableMetaInfo
[
tableIndex
];
int32_t
numOfCols
=
tscGetNumOfColumns
(
pTableMetaInfo
->
pTableMeta
);
if
(
p
Id
List
->
ids
[
i
].
columnIndex
>=
numOfCols
)
{
if
(
p
Col
List
->
ids
[
i
].
columnIndex
>=
numOfCols
)
{
continue
;
}
tscColumnListInsert
(
pQueryInfo
->
colList
,
&
(
pIdList
->
ids
[
i
]));
SSchema
*
pSchema
=
tscGetTableSchema
(
pTableMetaInfo
->
pTableMeta
);
tscColumnListInsert
(
pQueryInfo
->
colList
,
&
pColList
->
ids
[
i
],
&
pSchema
[
pColList
->
ids
[
i
].
columnIndex
]);
}
TAOS_FIELD
f
=
tscCreateField
(
type
,
fieldName
,
bytes
);
SInternalField
*
pInfo
=
tscFieldInfoInsert
(
&
pQueryInfo
->
fieldsInfo
,
outputIndex
,
&
f
);
pInfo
->
p
Sql
Expr
=
pSqlExpr
;
pInfo
->
pExpr
=
pSqlExpr
;
return
TSDB_CODE_SUCCESS
;
}
S
SqlExpr
*
doAddProjectCol
(
SQuery
Info
*
pQueryInfo
,
int32_t
colIndex
,
int32_t
tableIndex
)
{
S
ExprInfo
*
doAddProjectCol
(
SQueryNode
Info
*
pQueryInfo
,
int32_t
colIndex
,
int32_t
tableIndex
)
{
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
tableIndex
);
STableMeta
*
pTableMeta
=
pTableMetaInfo
->
pTableMeta
;
int32_t
numOfCols
=
tscGetNumOfColumns
(
pTableMeta
);
...
...
@@ -1718,7 +1719,7 @@ SSqlExpr* doAddProjectCol(SQueryInfo* pQueryInfo, int32_t colIndex, int32_t tabl
if
(
functionId
==
TSDB_FUNC_TAGPRJ
)
{
index
.
columnIndex
=
colIndex
-
tscGetNumOfColumns
(
pTableMeta
);
tscColumnListInsert
(
pTableMetaInfo
->
tagColList
,
&
index
);
tscColumnListInsert
(
pTableMetaInfo
->
tagColList
,
&
index
,
pSchema
);
}
else
{
index
.
columnIndex
=
colIndex
;
}
...
...
@@ -1728,32 +1729,32 @@ SSqlExpr* doAddProjectCol(SQueryInfo* pQueryInfo, int32_t colIndex, int32_t tabl
(
functionId
==
TSDB_FUNC_TAGPRJ
));
}
S
SqlExpr
*
tscAddFuncInSelectClause
(
SQuery
Info
*
pQueryInfo
,
int32_t
outputColIndex
,
int16_t
functionId
,
S
ExprInfo
*
tscAddFuncInSelectClause
(
SQueryNode
Info
*
pQueryInfo
,
int32_t
outputColIndex
,
int16_t
functionId
,
SColumnIndex
*
pIndex
,
SSchema
*
pColSchema
,
int16_t
flag
)
{
int16_t
colId
=
getNewResColId
(
pQueryInfo
);
S
SqlExpr
*
pExpr
=
tscSqlExprInsert
(
pQueryInfo
,
outputColIndex
,
functionId
,
pIndex
,
pColSchema
->
type
,
S
ExprInfo
*
pExpr
=
tscSqlExprInsert
(
pQueryInfo
,
outputColIndex
,
functionId
,
pIndex
,
pColSchema
->
type
,
pColSchema
->
bytes
,
colId
,
pColSchema
->
bytes
,
TSDB_COL_IS_TAG
(
flag
));
tstrncpy
(
pExpr
->
aliasName
,
pColSchema
->
name
,
sizeof
(
pExpr
->
aliasName
));
tstrncpy
(
pExpr
->
base
.
aliasName
,
pColSchema
->
name
,
sizeof
(
pExpr
->
base
.
aliasName
));
SColumnList
ids
=
get
ColumnList
(
1
,
pIndex
->
tableIndex
,
pIndex
->
columnIndex
);
SColumnList
ids
=
create
ColumnList
(
1
,
pIndex
->
tableIndex
,
pIndex
->
columnIndex
);
if
(
TSDB_COL_IS_TAG
(
flag
))
{
ids
.
num
=
0
;
}
insertResultField
(
pQueryInfo
,
outputColIndex
,
&
ids
,
pColSchema
->
bytes
,
pColSchema
->
type
,
pColSchema
->
name
,
pExpr
);
pExpr
->
colInfo
.
flag
=
flag
;
pExpr
->
base
.
colInfo
.
flag
=
flag
;
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
pIndex
->
tableIndex
);
if
(
TSDB_COL_IS_TAG
(
flag
))
{
tscColumnListInsert
(
pTableMetaInfo
->
tagColList
,
pIndex
);
tscColumnListInsert
(
pTableMetaInfo
->
tagColList
,
pIndex
,
pColSchema
);
}
return
pExpr
;
}
static
int32_t
doAddProjectionExprAndResultFields
(
SQueryInfo
*
pQueryInfo
,
SColumnIndex
*
pIndex
,
int32_t
startPos
)
{
static
int32_t
doAddProjectionExprAndResultFields
(
SQuery
Node
Info
*
pQueryInfo
,
SColumnIndex
*
pIndex
,
int32_t
startPos
)
{
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
pIndex
->
tableIndex
);
int32_t
numOfTotalColumns
=
0
;
...
...
@@ -1769,8 +1770,8 @@ static int32_t doAddProjectionExprAndResultFields(SQueryInfo* pQueryInfo, SColum
}
for
(
int32_t
j
=
0
;
j
<
numOfTotalColumns
;
++
j
)
{
S
SqlExpr
*
pExpr
=
doAddProjectCol
(
pQueryInfo
,
j
,
pIndex
->
tableIndex
);
tstrncpy
(
pExpr
->
aliasName
,
pSchema
[
j
].
name
,
sizeof
(
pExpr
->
aliasName
));
S
ExprInfo
*
pExpr
=
doAddProjectCol
(
pQueryInfo
,
j
,
pIndex
->
tableIndex
);
tstrncpy
(
pExpr
->
base
.
aliasName
,
pSchema
[
j
].
name
,
sizeof
(
pExpr
->
base
.
aliasName
));
pIndex
->
columnIndex
=
j
;
SColumnList
ids
=
{
0
};
...
...
@@ -1783,7 +1784,7 @@ static int32_t doAddProjectionExprAndResultFields(SQueryInfo* pQueryInfo, SColum
return
numOfTotalColumns
;
}
int32_t
addProjectionExprAndResultField
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
tSqlExprItem
*
pItem
)
{
int32_t
addProjectionExprAndResultField
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
,
tSqlExprItem
*
pItem
)
{
const
char
*
msg0
=
"invalid column name"
;
const
char
*
msg1
=
"tag for normal table query is not allowed"
;
...
...
@@ -1821,12 +1822,12 @@ int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, t
index
.
tableIndex
=
0
;
SSchema
colSchema
=
tGetUserSpecifiedColumnSchema
(
&
pItem
->
pNode
->
value
,
&
pItem
->
pNode
->
token
,
pItem
->
aliasName
);
S
SqlExpr
*
pExpr
=
S
ExprInfo
*
pExpr
=
tscAddFuncInSelectClause
(
pQueryInfo
,
startPos
,
TSDB_FUNC_PRJ
,
&
index
,
&
colSchema
,
TSDB_COL_UDC
);
// NOTE: the first parameter is reserved for the tag column id during join query process.
pExpr
->
numOfParams
=
2
;
tVariantAssign
(
&
pExpr
->
param
[
1
],
&
pItem
->
pNode
->
value
);
pExpr
->
base
.
numOfParams
=
2
;
tVariantAssign
(
&
pExpr
->
base
.
param
[
1
],
&
pItem
->
pNode
->
value
);
}
else
if
(
optr
==
TK_ID
)
{
SColumnIndex
index
=
COLUMN_INDEX_INITIALIZER
;
...
...
@@ -1861,7 +1862,7 @@ int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, t
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
setExprInfoForFunctions
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
SSchema
*
pSchema
,
SConvertFunc
cvtFunc
,
static
int32_t
setExprInfoForFunctions
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
,
SSchema
*
pSchema
,
SConvertFunc
cvtFunc
,
const
char
*
name
,
int32_t
resColIdx
,
SColumnIndex
*
pColIndex
,
bool
finalResult
)
{
const
char
*
msg1
=
"not support column types"
;
...
...
@@ -1883,30 +1884,31 @@ static int32_t setExprInfoForFunctions(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SS
bytes
=
pSchema
->
bytes
;
}
S
SqlExpr
*
pExpr
=
tscSqlExprAppend
(
pQueryInfo
,
functionID
,
pColIndex
,
type
,
bytes
,
getNewResColId
(
pQueryInfo
),
bytes
,
false
);
tstrncpy
(
pExpr
->
aliasName
,
name
,
tListLen
(
pExpr
->
aliasName
));
S
ExprInfo
*
pExpr
=
tscSqlExprAppend
(
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
)
{
pExpr
->
colInfo
.
flag
|=
TSDB_COL_NULL
;
pExpr
->
base
.
colInfo
.
flag
|=
TSDB_COL_NULL
;
}
// set reverse order scan data blocks for last query
if
(
functionID
==
TSDB_FUNC_LAST
)
{
pExpr
->
numOfParams
=
1
;
pExpr
->
param
[
0
].
i64
=
TSDB_ORDER_DESC
;
pExpr
->
param
[
0
].
nType
=
TSDB_DATA_TYPE_INT
;
pExpr
->
base
.
numOfParams
=
1
;
pExpr
->
base
.
param
[
0
].
i64
=
TSDB_ORDER_DESC
;
pExpr
->
base
.
param
[
0
].
nType
=
TSDB_DATA_TYPE_INT
;
}
// for all queries, the timestamp column needs to be loaded
SColumnIndex
index
=
{.
tableIndex
=
pColIndex
->
tableIndex
,
.
columnIndex
=
PRIMARYKEY_TIMESTAMP_COL_INDEX
};
tscColumnListInsert
(
pQueryInfo
->
colList
,
&
index
);
SSchema
s
=
{.
colId
=
PRIMARYKEY_TIMESTAMP_COL_INDEX
,
.
bytes
=
TSDB_KEYSIZE
,
.
type
=
TSDB_DATA_TYPE_TIMESTAMP
,};
tscColumnListInsert
(
pQueryInfo
->
colList
,
&
index
,
&
s
);
// if it is not in the final result, do not add it
SColumnList
ids
=
get
ColumnList
(
1
,
pColIndex
->
tableIndex
,
pColIndex
->
columnIndex
);
SColumnList
ids
=
create
ColumnList
(
1
,
pColIndex
->
tableIndex
,
pColIndex
->
columnIndex
);
if
(
finalResult
)
{
insertResultField
(
pQueryInfo
,
resColIdx
,
&
ids
,
bytes
,
(
int8_t
)
type
,
pExpr
->
aliasName
,
pExpr
);
insertResultField
(
pQueryInfo
,
resColIdx
,
&
ids
,
bytes
,
(
int8_t
)
type
,
pExpr
->
base
.
aliasName
,
pExpr
);
}
else
{
tscColumnListInsert
(
pQueryInfo
->
colList
,
&
(
ids
.
ids
[
0
]));
tscColumnListInsert
(
pQueryInfo
->
colList
,
&
(
ids
.
ids
[
0
])
,
pSchema
);
}
return
TSDB_CODE_SUCCESS
;
...
...
@@ -1935,23 +1937,23 @@ void setResultColName(char* name, tSqlExprItem* pItem, int32_t functionId, SStrT
}
}
static
void
updateLastScanOrderIfNeeded
(
SQueryInfo
*
pQueryInfo
)
{
static
void
updateLastScanOrderIfNeeded
(
SQuery
Node
Info
*
pQueryInfo
)
{
if
(
pQueryInfo
->
sessionWindow
.
gap
>
0
||
tscGroupbyColumn
(
pQueryInfo
))
{
size_t
numOfExpr
=
tscSqlExprNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
numOfExpr
;
++
i
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
functionId
!=
TSDB_FUNC_LAST
&&
pExpr
->
functionId
!=
TSDB_FUNC_LAST_DST
)
{
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
base
.
functionId
!=
TSDB_FUNC_LAST
&&
pExpr
->
base
.
functionId
!=
TSDB_FUNC_LAST_DST
)
{
continue
;
}
pExpr
->
numOfParams
=
1
;
pExpr
->
param
->
i64
=
TSDB_ORDER_ASC
;
pExpr
->
param
->
nType
=
TSDB_DATA_TYPE_INT
;
pExpr
->
base
.
numOfParams
=
1
;
pExpr
->
base
.
param
->
i64
=
TSDB_ORDER_ASC
;
pExpr
->
base
.
param
->
nType
=
TSDB_DATA_TYPE_INT
;
}
}
}
int32_t
addExprAndResultField
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
int32_t
colIndex
,
tSqlExprItem
*
pItem
,
bool
finalResult
)
{
int32_t
addExprAndResultField
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
,
int32_t
colIndex
,
tSqlExprItem
*
pItem
,
bool
finalResult
)
{
STableMetaInfo
*
pTableMetaInfo
=
NULL
;
int32_t
functionId
=
pItem
->
pNode
->
functionId
;
...
...
@@ -1972,7 +1974,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg2
);
}
S
SqlExpr
*
pExpr
=
NULL
;
S
ExprInfo
*
pExpr
=
NULL
;
SColumnIndex
index
=
COLUMN_INDEX_INITIALIZER
;
if
(
pItem
->
pNode
->
pParam
!=
NULL
)
{
...
...
@@ -2036,16 +2038,17 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
index
.
tableIndex
);
memset
(
pExpr
->
aliasName
,
0
,
tListLen
(
pExpr
->
aliasName
));
getColumnName
(
pItem
,
pExpr
->
aliasName
,
sizeof
(
pExpr
->
aliasName
)
-
1
);
memset
(
pExpr
->
base
.
aliasName
,
0
,
tListLen
(
pExpr
->
base
.
aliasName
));
getColumnName
(
pItem
,
pExpr
->
base
.
aliasName
,
sizeof
(
pExpr
->
base
.
aliasName
)
-
1
);
SColumnList
ids
=
get
ColumnList
(
1
,
index
.
tableIndex
,
index
.
columnIndex
);
SColumnList
list
=
create
ColumnList
(
1
,
index
.
tableIndex
,
index
.
columnIndex
);
if
(
finalResult
)
{
int32_t
numOfOutput
=
tscNumOfFields
(
pQueryInfo
);
insertResultField
(
pQueryInfo
,
numOfOutput
,
&
ids
,
sizeof
(
int64_t
),
TSDB_DATA_TYPE_BIGINT
,
pExpr
->
aliasName
,
pExpr
);
insertResultField
(
pQueryInfo
,
numOfOutput
,
&
list
,
sizeof
(
int64_t
),
TSDB_DATA_TYPE_BIGINT
,
pExpr
->
base
.
aliasName
,
pExpr
);
}
else
{
for
(
int32_t
i
=
0
;
i
<
ids
.
num
;
++
i
)
{
tscColumnListInsert
(
pQueryInfo
->
colList
,
&
(
ids
.
ids
[
i
]));
for
(
int32_t
i
=
0
;
i
<
list
.
num
;
++
i
)
{
SSchema
*
ps
=
tscGetTableSchema
(
pTableMetaInfo
->
pTableMeta
);
tscColumnListInsert
(
pQueryInfo
->
colList
,
&
list
.
ids
[
i
],
&
ps
[
list
.
ids
[
i
].
columnIndex
]);
}
}
...
...
@@ -2094,11 +2097,10 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
// 2. check if sql function can be applied on this column data type
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
index
.
tableIndex
);
SSchema
*
pSchema
=
tscGetTableColumnSchema
(
pTableMetaInfo
->
pTableMeta
,
index
.
columnIndex
);
int16_t
colType
=
pSchema
->
type
;
if
(
!
IS_NUMERIC_TYPE
(
colT
ype
))
{
if
(
!
IS_NUMERIC_TYPE
(
pSchema
->
t
ype
))
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg1
);
}
else
if
(
IS_UNSIGNED_NUMERIC_TYPE
(
colT
ype
)
&&
functionId
==
TSDB_FUNC_DIFF
)
{
}
else
if
(
IS_UNSIGNED_NUMERIC_TYPE
(
pSchema
->
t
ype
)
&&
functionId
==
TSDB_FUNC_DIFF
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg9
);
}
...
...
@@ -2115,10 +2117,10 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
if
(
functionId
==
TSDB_FUNC_DIFF
)
{
colIndex
+=
1
;
SColumnIndex
indexTS
=
{.
tableIndex
=
index
.
tableIndex
,
.
columnIndex
=
0
};
S
SqlExpr
*
pExpr
=
tscSqlExprAppend
(
pQueryInfo
,
TSDB_FUNC_TS_DUMMY
,
&
indexTS
,
TSDB_DATA_TYPE_TIMESTAMP
,
TSDB_KEYSIZE
,
S
ExprInfo
*
pExpr
=
tscSqlExprAppend
(
pQueryInfo
,
TSDB_FUNC_TS_DUMMY
,
&
indexTS
,
TSDB_DATA_TYPE_TIMESTAMP
,
TSDB_KEYSIZE
,
getNewResColId
(
pQueryInfo
),
TSDB_KEYSIZE
,
false
);
SColumnList
ids
=
get
ColumnList
(
1
,
0
,
0
);
SColumnList
ids
=
create
ColumnList
(
1
,
0
,
0
);
insertResultField
(
pQueryInfo
,
0
,
&
ids
,
TSDB_KEYSIZE
,
TSDB_DATA_TYPE_TIMESTAMP
,
aAggs
[
TSDB_FUNC_TS_DUMMY
].
name
,
pExpr
);
}
...
...
@@ -2127,7 +2129,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg6
);
}
S
SqlExpr
*
pExpr
=
tscSqlExprAppend
(
pQueryInfo
,
functionId
,
&
index
,
resultType
,
resultSize
,
getNewResColId
(
pQueryInfo
),
resultSize
,
false
);
S
ExprInfo
*
pExpr
=
tscSqlExprAppend
(
pQueryInfo
,
functionId
,
&
index
,
resultType
,
resultSize
,
getNewResColId
(
pQueryInfo
),
resultSize
,
false
);
if
(
functionId
==
TSDB_FUNC_LEASTSQR
)
{
/* set the leastsquares parameters */
...
...
@@ -2136,30 +2138,28 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
return
TSDB_CODE_TSC_INVALID_SQL
;
}
addExprParams
(
pExpr
,
val
,
TSDB_DATA_TYPE_DOUBLE
,
DOUBLE_BYTES
);
addExprParams
(
&
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
;
}
addExprParams
(
pExpr
,
val
,
TSDB_DATA_TYPE_DOUBLE
,
sizeof
(
double
));
addExprParams
(
&
pExpr
->
base
,
val
,
TSDB_DATA_TYPE_DOUBLE
,
sizeof
(
double
));
}
SColumnList
ids
=
{
0
};
ids
.
num
=
1
;
ids
.
ids
[
0
]
=
index
;
memset
(
pExpr
->
aliasName
,
0
,
tListLen
(
pExpr
->
aliasName
));
getColumnName
(
pItem
,
pExpr
->
aliasName
,
sizeof
(
pExpr
->
aliasName
)
-
1
);
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
);
if
(
finalResult
)
{
int32_t
numOfOutput
=
tscNumOfFields
(
pQueryInfo
);
insertResultField
(
pQueryInfo
,
numOfOutput
,
&
ids
,
pExpr
->
resBytes
,
(
int32_t
)
pExpr
->
resType
,
pExpr
->
aliasName
,
pExpr
);
insertResultField
(
pQueryInfo
,
numOfOutput
,
&
ids
,
pExpr
->
base
.
resBytes
,
(
int32_t
)
pExpr
->
base
.
resType
,
pExpr
->
base
.
aliasName
,
pExpr
);
}
else
{
for
(
int32_t
i
=
0
;
i
<
ids
.
num
;
++
i
)
{
tscColumnListInsert
(
pQueryInfo
->
colList
,
&
(
ids
.
ids
[
i
]));
}
assert
(
ids
.
num
==
1
);
tscColumnListInsert
(
pQueryInfo
->
colList
,
&
(
ids
.
ids
[
0
]),
pSchema
);
}
tscInsertPrimaryTsSourceColumn
(
pQueryInfo
,
&
index
);
...
...
@@ -2299,7 +2299,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
}
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
index
.
tableIndex
);
SSchema
*
pSchema
=
tscGetTable
Schema
(
pTableMetaInfo
->
pTableMeta
);
SSchema
*
pSchema
=
tscGetTable
ColumnSchema
(
pTableMetaInfo
->
pTableMeta
,
index
.
columnIndex
);
// functions can not be applied to tags
if
(
index
.
columnIndex
>=
tscGetNumOfColumns
(
pTableMetaInfo
->
pTableMeta
))
{
...
...
@@ -2307,8 +2307,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
}
// 2. valid the column type
int16_t
colType
=
pSchema
[
index
.
columnIndex
].
type
;
if
(
!
IS_NUMERIC_TYPE
(
colType
))
{
if
(
!
IS_NUMERIC_TYPE
(
pSchema
->
type
))
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg1
);
}
...
...
@@ -2319,12 +2318,12 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
tVariant
*
pVariant
=
&
pParamElem
[
1
].
pNode
->
value
;
int8_t
resultType
=
pSchema
[
index
.
columnIndex
].
type
;
int16_t
resultSize
=
pSchema
[
index
.
columnIndex
].
bytes
;
int8_t
resultType
=
pSchema
->
type
;
int16_t
resultSize
=
pSchema
->
bytes
;
char
val
[
8
]
=
{
0
};
SSqlExpr
*
pExpr
=
NULL
;
SExprInfo
*
pExpr
=
NULL
;
if
(
functionId
==
TSDB_FUNC_PERCT
||
functionId
==
TSDB_FUNC_APERCT
)
{
tVariantDump
(
pVariant
,
val
,
TSDB_DATA_TYPE_DOUBLE
,
true
);
...
...
@@ -2345,7 +2344,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
colIndex
+=
1
;
// the first column is ts
pExpr
=
tscSqlExprAppend
(
pQueryInfo
,
functionId
,
&
index
,
resultType
,
resultSize
,
getNewResColId
(
pQueryInfo
),
resultSize
,
false
);
addExprParams
(
pExpr
,
val
,
TSDB_DATA_TYPE_DOUBLE
,
sizeof
(
double
));
addExprParams
(
&
pExpr
->
base
,
val
,
TSDB_DATA_TYPE_DOUBLE
,
sizeof
(
double
));
}
else
{
tVariantDump
(
pVariant
,
val
,
TSDB_DATA_TYPE_BIGINT
,
true
);
...
...
@@ -2359,29 +2358,30 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
SColumnIndex
index1
=
{
index
.
tableIndex
,
PRIMARYKEY_TIMESTAMP_COL_INDEX
};
pExpr
=
tscSqlExprAppend
(
pQueryInfo
,
TSDB_FUNC_TS
,
&
index1
,
TSDB_DATA_TYPE_TIMESTAMP
,
TSDB_KEYSIZE
,
getNewResColId
(
pQueryInfo
),
TSDB_KEYSIZE
,
false
);
tstrncpy
(
pExpr
->
aliasName
,
aAggs
[
TSDB_FUNC_TS
].
name
,
sizeof
(
pExpr
->
aliasName
));
tstrncpy
(
pExpr
->
base
.
aliasName
,
aAggs
[
TSDB_FUNC_TS
].
name
,
sizeof
(
pExpr
->
base
.
aliasName
));
const
int32_t
TS_COLUMN_INDEX
=
PRIMARYKEY_TIMESTAMP_COL_INDEX
;
SColumnList
ids
=
get
ColumnList
(
1
,
index
.
tableIndex
,
TS_COLUMN_INDEX
);
SColumnList
ids
=
create
ColumnList
(
1
,
index
.
tableIndex
,
TS_COLUMN_INDEX
);
insertResultField
(
pQueryInfo
,
TS_COLUMN_INDEX
,
&
ids
,
TSDB_KEYSIZE
,
TSDB_DATA_TYPE_TIMESTAMP
,
aAggs
[
TSDB_FUNC_TS
].
name
,
pExpr
);
colIndex
+=
1
;
// the first column is ts
pExpr
=
tscSqlExprAppend
(
pQueryInfo
,
functionId
,
&
index
,
resultType
,
resultSize
,
getNewResColId
(
pQueryInfo
),
resultSize
,
false
);
addExprParams
(
pExpr
,
val
,
TSDB_DATA_TYPE_BIGINT
,
sizeof
(
int64_t
));
addExprParams
(
&
pExpr
->
base
,
val
,
TSDB_DATA_TYPE_BIGINT
,
sizeof
(
int64_t
));
}
memset
(
pExpr
->
aliasName
,
0
,
tListLen
(
pExpr
->
aliasName
));
getColumnName
(
pItem
,
pExpr
->
aliasName
,
sizeof
(
pExpr
->
aliasName
)
-
1
);
SColumnList
ids
=
getColumnList
(
1
,
index
.
tableIndex
,
index
.
columnIndex
);
memset
(
pExpr
->
base
.
aliasName
,
0
,
tListLen
(
pExpr
->
base
.
aliasName
));
getColumnName
(
pItem
,
pExpr
->
base
.
aliasName
,
sizeof
(
pExpr
->
base
.
aliasName
)
-
1
);
// todo refactor: tscColumnListInsert part
SColumnList
ids
=
createColumnList
(
1
,
index
.
tableIndex
,
index
.
columnIndex
);
if
(
finalResult
)
{
insertResultField
(
pQueryInfo
,
colIndex
,
&
ids
,
resultSize
,
resultType
,
pExpr
->
aliasName
,
pExpr
);
insertResultField
(
pQueryInfo
,
colIndex
,
&
ids
,
resultSize
,
resultType
,
pExpr
->
base
.
aliasName
,
pExpr
);
}
else
{
for
(
int32_t
i
=
0
;
i
<
ids
.
num
;
++
i
)
{
tscColumnListInsert
(
pQueryInfo
->
colList
,
&
(
ids
.
ids
[
i
]));
}
assert
(
ids
.
num
==
1
);
tscColumnListInsert
(
pQueryInfo
->
colList
,
&
ids
.
ids
[
0
],
pSchema
);
}
return
TSDB_CODE_SUCCESS
;
...
...
@@ -2431,7 +2431,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg1
);
}
tscColumnListInsert
(
pTableMetaInfo
->
tagColList
,
&
index
);
tscColumnListInsert
(
pTableMetaInfo
->
tagColList
,
&
index
,
&
pSchema
[
index
.
columnIndex
]
);
SSchema
*
pTagSchema
=
tscGetTableTagSchema
(
pTableMetaInfo
->
pTableMeta
);
SSchema
s
=
{
0
};
...
...
@@ -2473,10 +2473,10 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
s
.
bytes
=
bytes
;
s
.
type
=
(
uint8_t
)
resType
;
S
SqlExpr
*
pExpr
=
tscAddFuncInSelectClause
(
pQueryInfo
,
0
,
TSDB_FUNC_BLKINFO
,
&
index
,
&
s
,
TSDB_COL_TAG
);
pExpr
->
numOfParams
=
1
;
pExpr
->
param
[
0
].
i64
=
pTableMetaInfo
->
pTableMeta
->
tableInfo
.
rowSize
;
pExpr
->
param
[
0
].
nType
=
TSDB_DATA_TYPE_BIGINT
;
S
ExprInfo
*
pExpr
=
tscAddFuncInSelectClause
(
pQueryInfo
,
0
,
TSDB_FUNC_BLKINFO
,
&
index
,
&
s
,
TSDB_COL_TAG
);
pExpr
->
base
.
numOfParams
=
1
;
pExpr
->
base
.
param
[
0
].
i64
=
pTableMetaInfo
->
pTableMeta
->
tableInfo
.
rowSize
;
pExpr
->
base
.
param
[
0
].
nType
=
TSDB_DATA_TYPE_BIGINT
;
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -2488,7 +2488,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
}
// todo refactor
static
SColumnList
get
ColumnList
(
int32_t
num
,
int16_t
tableIndex
,
int32_t
columnIndex
)
{
static
SColumnList
create
ColumnList
(
int32_t
num
,
int16_t
tableIndex
,
int32_t
columnIndex
)
{
assert
(
num
==
1
&&
tableIndex
>=
0
);
SColumnList
columnList
=
{
0
};
...
...
@@ -2527,7 +2527,7 @@ static bool isTableBlockDistToken(SStrToken* token) {
return
(
strncasecmp
(
TSQL_BLOCK_DIST
,
tmpToken
.
z
,
tmpToken
.
n
)
==
0
&&
tmpToken
.
n
==
strlen
(
TSQL_BLOCK_DIST_L
));
}
static
int16_t
doGetColumnIndex
(
SQueryInfo
*
pQueryInfo
,
int32_t
index
,
SStrToken
*
pToken
)
{
static
int16_t
doGetColumnIndex
(
SQuery
Node
Info
*
pQueryInfo
,
int32_t
index
,
SStrToken
*
pToken
)
{
STableMeta
*
pTableMeta
=
tscGetMetaInfo
(
pQueryInfo
,
index
)
->
pTableMeta
;
int32_t
numOfCols
=
tscGetNumOfColumns
(
pTableMeta
)
+
tscGetNumOfTags
(
pTableMeta
);
...
...
@@ -2549,7 +2549,7 @@ static int16_t doGetColumnIndex(SQueryInfo* pQueryInfo, int32_t index, SStrToken
return
columnIndex
;
}
int32_t
doGetColumnIndexByName
(
SSqlCmd
*
pCmd
,
SStrToken
*
pToken
,
SQueryInfo
*
pQueryInfo
,
SColumnIndex
*
pIndex
)
{
int32_t
doGetColumnIndexByName
(
SSqlCmd
*
pCmd
,
SStrToken
*
pToken
,
SQuery
Node
Info
*
pQueryInfo
,
SColumnIndex
*
pIndex
)
{
const
char
*
msg0
=
"ambiguous column name"
;
const
char
*
msg1
=
"invalid column name"
;
...
...
@@ -2593,7 +2593,7 @@ int32_t doGetColumnIndexByName(SSqlCmd* pCmd, SStrToken* pToken, SQueryInfo* pQu
}
}
int32_t
getTableIndexImpl
(
SStrToken
*
pTableToken
,
SQueryInfo
*
pQueryInfo
,
SColumnIndex
*
pIndex
)
{
int32_t
getTableIndexImpl
(
SStrToken
*
pTableToken
,
SQuery
Node
Info
*
pQueryInfo
,
SColumnIndex
*
pIndex
)
{
if
(
pTableToken
->
n
==
0
)
{
// only one table and no table name prefix in column name
if
(
pQueryInfo
->
numOfTables
==
1
)
{
pIndex
->
tableIndex
=
0
;
...
...
@@ -2621,7 +2621,7 @@ int32_t getTableIndexImpl(SStrToken* pTableToken, SQueryInfo* pQueryInfo, SColum
return
TSDB_CODE_SUCCESS
;
}
int32_t
getTableIndexByName
(
SStrToken
*
pToken
,
SQueryInfo
*
pQueryInfo
,
SColumnIndex
*
pIndex
)
{
int32_t
getTableIndexByName
(
SStrToken
*
pToken
,
SQuery
Node
Info
*
pQueryInfo
,
SColumnIndex
*
pIndex
)
{
SStrToken
tableToken
=
{
0
};
extractTableNameFromToken
(
pToken
,
&
tableToken
);
...
...
@@ -2632,7 +2632,7 @@ int32_t getTableIndexByName(SStrToken* pToken, SQueryInfo* pQueryInfo, SColumnIn
return
TSDB_CODE_SUCCESS
;
}
int32_t
getColumnIndexByName
(
SSqlCmd
*
pCmd
,
const
SStrToken
*
pToken
,
SQueryInfo
*
pQueryInfo
,
SColumnIndex
*
pIndex
)
{
int32_t
getColumnIndexByName
(
SSqlCmd
*
pCmd
,
const
SStrToken
*
pToken
,
SQuery
Node
Info
*
pQueryInfo
,
SColumnIndex
*
pIndex
)
{
if
(
pQueryInfo
->
pTableMetaInfo
==
NULL
||
pQueryInfo
->
numOfTables
==
0
)
{
return
TSDB_CODE_TSC_INVALID_SQL
;
}
...
...
@@ -2773,7 +2773,7 @@ bool validateIpAddress(const char* ip, size_t size) {
return
epAddr
!=
INADDR_NONE
;
}
int32_t
tscTansformFuncForSTableQuery
(
SQueryInfo
*
pQueryInfo
)
{
int32_t
tscTansformFuncForSTableQuery
(
SQuery
Node
Info
*
pQueryInfo
)
{
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
if
(
pTableMetaInfo
->
pTableMeta
==
NULL
||
!
UTIL_TABLE_IS_SUPER_TABLE
(
pTableMetaInfo
))
{
...
...
@@ -2788,23 +2788,23 @@ int32_t tscTansformFuncForSTableQuery(SQueryInfo* pQueryInfo) {
size_t
size
=
tscSqlExprNumOfExprs
(
pQueryInfo
);
for
(
int32_t
k
=
0
;
k
<
size
;
++
k
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
k
);
int16_t
functionId
=
aAggs
[
pExpr
->
functionId
].
stableFuncId
;
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
k
);
int16_t
functionId
=
aAggs
[
pExpr
->
base
.
functionId
].
stableFuncId
;
int32_t
colIndex
=
pExpr
->
colInfo
.
colIndex
;
int32_t
colIndex
=
pExpr
->
base
.
colInfo
.
colIndex
;
SSchema
*
pSrcSchema
=
tscGetTableColumnSchema
(
pTableMetaInfo
->
pTableMeta
,
colIndex
);
if
((
functionId
>=
TSDB_FUNC_SUM
&&
functionId
<=
TSDB_FUNC_TWA
)
||
(
functionId
>=
TSDB_FUNC_FIRST_DST
&&
functionId
<=
TSDB_FUNC_STDDEV_DST
)
||
(
functionId
>=
TSDB_FUNC_RATE
&&
functionId
<=
TSDB_FUNC_AVG_IRATE
))
{
if
(
getResultDataInfo
(
pSrcSchema
->
type
,
pSrcSchema
->
bytes
,
functionId
,
(
int32_t
)
pExpr
->
param
[
0
].
i64
,
&
type
,
&
bytes
,
if
(
getResultDataInfo
(
pSrcSchema
->
type
,
pSrcSchema
->
bytes
,
functionId
,
(
int32_t
)
pExpr
->
base
.
param
[
0
].
i64
,
&
type
,
&
bytes
,
&
interBytes
,
0
,
true
)
!=
TSDB_CODE_SUCCESS
)
{
return
TSDB_CODE_TSC_INVALID_SQL
;
}
tscSqlExprUpdate
(
pQueryInfo
,
k
,
functionId
,
pExpr
->
colInfo
.
colIndex
,
TSDB_DATA_TYPE_BINARY
,
bytes
);
tscSqlExprUpdate
(
pQueryInfo
,
k
,
functionId
,
pExpr
->
base
.
colInfo
.
colIndex
,
TSDB_DATA_TYPE_BINARY
,
bytes
);
// todo refactor
pExpr
->
interBytes
=
interBytes
;
pExpr
->
base
.
interBytes
=
interBytes
;
}
}
...
...
@@ -2813,7 +2813,7 @@ int32_t tscTansformFuncForSTableQuery(SQueryInfo* pQueryInfo) {
}
/* transfer the field-info back to original input format */
void
tscRestoreFuncForSTableQuery
(
SQueryInfo
*
pQueryInfo
)
{
void
tscRestoreFuncForSTableQuery
(
SQuery
Node
Info
*
pQueryInfo
)
{
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
if
(
!
UTIL_TABLE_IS_SUPER_TABLE
(
pTableMetaInfo
))
{
return
;
...
...
@@ -2821,14 +2821,14 @@ void tscRestoreFuncForSTableQuery(SQueryInfo* pQueryInfo) {
size_t
size
=
tscSqlExprNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
SSchema
*
pSchema
=
tscGetTableColumnSchema
(
pTableMetaInfo
->
pTableMeta
,
pExpr
->
colInfo
.
colIndex
);
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
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.
// so here, set the flag to be false;
int32_t
inter
=
0
;
int32_t
functionId
=
pExpr
->
functionId
;
int32_t
functionId
=
pExpr
->
base
.
functionId
;
if
(
functionId
>=
TSDB_FUNC_TS
&&
functionId
<=
TSDB_FUNC_DIFF
)
{
continue
;
}
...
...
@@ -2841,12 +2841,12 @@ void tscRestoreFuncForSTableQuery(SQueryInfo* pQueryInfo) {
functionId
=
TSDB_FUNC_STDDEV
;
}
getResultDataInfo
(
pSchema
->
type
,
pSchema
->
bytes
,
functionId
,
0
,
&
pExpr
->
resType
,
&
pExpr
->
resBytes
,
getResultDataInfo
(
pSchema
->
type
,
pSchema
->
bytes
,
functionId
,
0
,
&
pExpr
->
base
.
resType
,
&
pExpr
->
base
.
resBytes
,
&
inter
,
0
,
false
);
}
}
bool
hasUnsupportFunctionsForSTableQuery
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
)
{
bool
hasUnsupportFunctionsForSTableQuery
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
)
{
const
char
*
msg1
=
"TWA not allowed to apply to super table directly"
;
const
char
*
msg2
=
"TWA only support group by tbname for super table query"
;
const
char
*
msg3
=
"function not support for super table query"
;
...
...
@@ -2854,7 +2854,7 @@ bool hasUnsupportFunctionsForSTableQuery(SSqlCmd* pCmd, SQueryInfo* pQueryInfo)
// filter sql function not supported by metric query yet.
size_t
size
=
tscSqlExprNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
int32_t
functionId
=
tscSqlExprGet
(
pQueryInfo
,
i
)
->
functionId
;
int32_t
functionId
=
tscSqlExprGet
(
pQueryInfo
,
i
)
->
base
.
functionId
;
if
((
aAggs
[
functionId
].
status
&
TSDB_FUNCSTATE_STABLE
)
==
0
)
{
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg3
);
return
true
;
...
...
@@ -2882,7 +2882,7 @@ bool hasUnsupportFunctionsForSTableQuery(SSqlCmd* pCmd, SQueryInfo* pQueryInfo)
return
false
;
}
static
bool
groupbyTagsOrNull
(
SQueryInfo
*
pQueryInfo
)
{
static
bool
groupbyTagsOrNull
(
SQuery
Node
Info
*
pQueryInfo
)
{
if
(
pQueryInfo
->
groupbyExpr
.
columnInfo
==
NULL
||
taosArrayGetSize
(
pQueryInfo
->
groupbyExpr
.
columnInfo
)
==
0
)
{
return
true
;
...
...
@@ -2899,23 +2899,23 @@ static bool groupbyTagsOrNull(SQueryInfo* pQueryInfo) {
return
true
;
}
static
bool
functionCompatibleCheck
(
SQueryInfo
*
pQueryInfo
,
bool
joinQuery
,
bool
twQuery
)
{
static
bool
functionCompatibleCheck
(
SQuery
Node
Info
*
pQueryInfo
,
bool
joinQuery
,
bool
twQuery
)
{
int32_t
startIdx
=
0
;
size_t
numOfExpr
=
tscSqlExprNumOfExprs
(
pQueryInfo
);
assert
(
numOfExpr
>
0
);
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
startIdx
);
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
startIdx
);
// ts function can be simultaneously used with any other functions.
int32_t
functionID
=
pExpr
->
functionId
;
int32_t
functionID
=
pExpr
->
base
.
functionId
;
if
(
functionID
==
TSDB_FUNC_TS
||
functionID
==
TSDB_FUNC_TS_DUMMY
)
{
startIdx
++
;
}
int32_t
factor
=
functionCompatList
[
tscSqlExprGet
(
pQueryInfo
,
startIdx
)
->
functionId
];
int32_t
factor
=
functionCompatList
[
tscSqlExprGet
(
pQueryInfo
,
startIdx
)
->
base
.
functionId
];
if
(
tscSqlExprGet
(
pQueryInfo
,
0
)
->
functionId
==
TSDB_FUNC_LAST_ROW
&&
(
joinQuery
||
twQuery
||
!
groupbyTagsOrNull
(
pQueryInfo
)))
{
if
(
tscSqlExprGet
(
pQueryInfo
,
0
)
->
base
.
functionId
==
TSDB_FUNC_LAST_ROW
&&
(
joinQuery
||
twQuery
||
!
groupbyTagsOrNull
(
pQueryInfo
)))
{
return
false
;
}
...
...
@@ -2924,14 +2924,14 @@ static bool functionCompatibleCheck(SQueryInfo* pQueryInfo, bool joinQuery, bool
size_t
size
=
tscSqlExprNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
startIdx
+
1
;
i
<
size
;
++
i
)
{
S
SqlExpr
*
pExpr1
=
tscSqlExprGet
(
pQueryInfo
,
i
);
S
ExprInfo
*
pExpr1
=
tscSqlExprGet
(
pQueryInfo
,
i
);
int16_t
functionId
=
pExpr1
->
functionId
;
int16_t
functionId
=
pExpr1
->
base
.
functionId
;
if
(
functionId
==
TSDB_FUNC_TAGPRJ
||
functionId
==
TSDB_FUNC_TAG
||
functionId
==
TSDB_FUNC_TS
)
{
continue
;
}
if
(
functionId
==
TSDB_FUNC_PRJ
&&
(
pExpr1
->
colInfo
.
colId
==
PRIMARYKEY_TIMESTAMP_COL_INDEX
||
TSDB_COL_IS_UD_COL
(
pExpr1
->
colInfo
.
flag
)))
{
if
(
functionId
==
TSDB_FUNC_PRJ
&&
(
pExpr1
->
base
.
colInfo
.
colId
==
PRIMARYKEY_TIMESTAMP_COL_INDEX
||
TSDB_COL_IS_UD_COL
(
pExpr1
->
base
.
colInfo
.
flag
)))
{
continue
;
}
...
...
@@ -2951,7 +2951,7 @@ static bool functionCompatibleCheck(SQueryInfo* pQueryInfo, bool joinQuery, bool
return
true
;
}
int32_t
validateGroupbyNode
(
SQueryInfo
*
pQueryInfo
,
SArray
*
pList
,
SSqlCmd
*
pCmd
)
{
int32_t
validateGroupbyNode
(
SQuery
Node
Info
*
pQueryInfo
,
SArray
*
pList
,
SSqlCmd
*
pCmd
)
{
const
char
*
msg1
=
"too many columns in group by clause"
;
const
char
*
msg2
=
"invalid column name in group by clause"
;
const
char
*
msg3
=
"columns from one table allowed as group by columns"
;
...
...
@@ -3037,14 +3037,14 @@ int32_t validateGroupbyNode(SQueryInfo* pQueryInfo, SArray* pList, SSqlCmd* pCmd
taosArrayPush
(
pGroupExpr
->
columnInfo
,
&
colIndex
);
index
.
columnIndex
=
relIndex
;
tscColumnListInsert
(
pTableMetaInfo
->
tagColList
,
&
index
);
tscColumnListInsert
(
pTableMetaInfo
->
tagColList
,
&
index
,
pSchema
);
}
else
{
// check if the column type is valid, here only support the bool/tinyint/smallint/bigint group by
if
(
pSchema
->
type
==
TSDB_DATA_TYPE_TIMESTAMP
||
pSchema
->
type
==
TSDB_DATA_TYPE_FLOAT
||
pSchema
->
type
==
TSDB_DATA_TYPE_DOUBLE
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg8
);
}
tscColumnListInsert
(
pQueryInfo
->
colList
,
&
index
);
tscColumnListInsert
(
pQueryInfo
->
colList
,
&
index
,
pSchema
);
SColIndex
colIndex
=
{
.
colIndex
=
index
.
columnIndex
,
.
flag
=
TSDB_COL_NORMAL
,
.
colId
=
pSchema
->
colId
};
taosArrayPush
(
pGroupExpr
->
columnInfo
,
&
colIndex
);
...
...
@@ -3065,24 +3065,24 @@ static SColumnFilterInfo* addColumnFilterInfo(SColumn* pColumn) {
return
NULL
;
}
int32_t
size
=
pColumn
->
numOfFilters
+
1
;
int32_t
size
=
pColumn
->
info
.
numOfFilters
+
1
;
char
*
tmp
=
(
char
*
)
realloc
((
void
*
)(
pColumn
->
filterInfo
),
sizeof
(
SColumnFilterInfo
)
*
(
size
));
char
*
tmp
=
(
char
*
)
realloc
((
void
*
)(
pColumn
->
info
.
filterInfo
),
sizeof
(
SColumnFilterInfo
)
*
(
size
));
if
(
tmp
!=
NULL
)
{
pColumn
->
filterInfo
=
(
SColumnFilterInfo
*
)
tmp
;
pColumn
->
info
.
filterInfo
=
(
SColumnFilterInfo
*
)
tmp
;
}
else
{
return
NULL
;
}
pColumn
->
numOfFilters
++
;
pColumn
->
info
.
numOfFilters
++
;
SColumnFilterInfo
*
pColFilterInfo
=
&
pColumn
->
filterInfo
[
pColumn
->
numOfFilters
-
1
];
SColumnFilterInfo
*
pColFilterInfo
=
&
pColumn
->
info
.
filterInfo
[
pColumn
->
info
.
numOfFilters
-
1
];
memset
(
pColFilterInfo
,
0
,
sizeof
(
SColumnFilterInfo
));
return
pColFilterInfo
;
}
static
int32_t
doExtractColumnFilterInfo
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
SColumnFilterInfo
*
pColumnFilter
,
static
int32_t
doExtractColumnFilterInfo
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
,
SColumnFilterInfo
*
pColumnFilter
,
SColumnIndex
*
columnIndex
,
tSqlExpr
*
pExpr
)
{
const
char
*
msg
=
"not supported filter condition"
;
...
...
@@ -3232,7 +3232,7 @@ enum {
TSQL_EXPR_TBNAME
=
3
,
};
static
int32_t
extractColumnFilterInfo
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
SColumnIndex
*
pIndex
,
tSqlExpr
*
pExpr
,
int32_t
sqlOptr
)
{
static
int32_t
extractColumnFilterInfo
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
,
SColumnIndex
*
pIndex
,
tSqlExpr
*
pExpr
,
int32_t
sqlOptr
)
{
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
pIndex
->
tableIndex
);
STableMeta
*
pTableMeta
=
pTableMetaInfo
->
pTableMeta
;
...
...
@@ -3242,7 +3242,7 @@ static int32_t extractColumnFilterInfo(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SC
const
char
*
msg2
=
"binary column not support this operator"
;
const
char
*
msg3
=
"bool column not support this operator"
;
SColumn
*
pColumn
=
tscColumnListInsert
(
pQueryInfo
->
colList
,
pIndex
);
SColumn
*
pColumn
=
tscColumnListInsert
(
pQueryInfo
->
colList
,
pIndex
,
pSchema
);
SColumnFilterInfo
*
pColFilter
=
NULL
;
/*
...
...
@@ -3251,10 +3251,10 @@ static int32_t extractColumnFilterInfo(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SC
*/
if
(
sqlOptr
==
TK_AND
)
{
// this is a new filter condition on this column
if
(
pColumn
->
numOfFilters
==
0
)
{
if
(
pColumn
->
info
.
numOfFilters
==
0
)
{
pColFilter
=
addColumnFilterInfo
(
pColumn
);
}
else
{
// update the existed column filter information, find the filter info here
pColFilter
=
&
pColumn
->
filterInfo
[
0
];
pColFilter
=
&
pColumn
->
info
.
filterInfo
[
0
];
}
if
(
pColFilter
==
NULL
)
{
...
...
@@ -3298,7 +3298,7 @@ static int32_t extractColumnFilterInfo(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SC
return
doExtractColumnFilterInfo
(
pCmd
,
pQueryInfo
,
pColFilter
,
pIndex
,
pExpr
);
}
static
int32_t
getTablenameCond
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
tSqlExpr
*
pTableCond
,
SStringBuilder
*
sb
)
{
static
int32_t
getTablenameCond
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
,
tSqlExpr
*
pTableCond
,
SStringBuilder
*
sb
)
{
const
char
*
msg0
=
"invalid table name list"
;
const
char
*
msg1
=
"not string following like"
;
...
...
@@ -3332,7 +3332,7 @@ static int32_t getTablenameCond(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSqlExpr*
return
ret
;
}
static
int32_t
getColumnQueryCondInfo
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
tSqlExpr
*
pExpr
,
int32_t
relOptr
)
{
static
int32_t
getColumnQueryCondInfo
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
,
tSqlExpr
*
pExpr
,
int32_t
relOptr
)
{
if
(
pExpr
==
NULL
)
{
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -3354,7 +3354,7 @@ static int32_t getColumnQueryCondInfo(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSq
}
}
static
int32_t
getJoinCondInfo
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
tSqlExpr
*
pExpr
)
{
static
int32_t
getJoinCondInfo
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
,
tSqlExpr
*
pExpr
)
{
const
char
*
msg1
=
"invalid join query condition"
;
const
char
*
msg2
=
"invalid table name in join query"
;
const
char
*
msg3
=
"type of join columns must be identical"
;
...
...
@@ -3412,7 +3412,7 @@ static int32_t getJoinCondInfo(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSqlExpr*
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
validateSQLExpr
(
SSqlCmd
*
pCmd
,
tSqlExpr
*
pExpr
,
SQueryInfo
*
pQueryInfo
,
SColumnList
*
pList
,
static
int32_t
validateSQLExpr
(
SSqlCmd
*
pCmd
,
tSqlExpr
*
pExpr
,
SQuery
Node
Info
*
pQueryInfo
,
SColumnList
*
pList
,
int32_t
*
type
,
uint64_t
*
uid
)
{
if
(
pExpr
->
type
==
SQL_NODE_TABLE_COLUMN
)
{
if
(
*
type
==
NON_ARITHMEIC_EXPR
)
{
...
...
@@ -3469,8 +3469,8 @@ 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
)
{
S
SqlExpr
*
p1
=
tscSqlExprGet
(
pQueryInfo
,
i
+
outputIndex
);
int16_t
t
=
p1
->
resType
;
S
ExprInfo
*
p1
=
tscSqlExprGet
(
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
;
}
...
...
@@ -3488,7 +3488,7 @@ static int32_t validateSQLExpr(SSqlCmd* pCmd, tSqlExpr* pExpr, SQueryInfo* pQuer
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
validateArithmeticSQLExpr
(
SSqlCmd
*
pCmd
,
tSqlExpr
*
pExpr
,
SQueryInfo
*
pQueryInfo
,
SColumnList
*
pList
,
int32_t
*
type
)
{
static
int32_t
validateArithmeticSQLExpr
(
SSqlCmd
*
pCmd
,
tSqlExpr
*
pExpr
,
SQuery
Node
Info
*
pQueryInfo
,
SColumnList
*
pList
,
int32_t
*
type
)
{
if
(
pExpr
==
NULL
)
{
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -3593,7 +3593,7 @@ static void exchangeExpr(tSqlExpr* pExpr) {
}
}
static
bool
validateJoinExprNode
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
tSqlExpr
*
pExpr
,
SColumnIndex
*
pLeftIndex
)
{
static
bool
validateJoinExprNode
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
,
tSqlExpr
*
pExpr
,
SColumnIndex
*
pLeftIndex
)
{
const
char
*
msg1
=
"illegal column name"
;
const
char
*
msg2
=
"= is expected in join expression"
;
const
char
*
msg3
=
"join column must have same type"
;
...
...
@@ -3670,7 +3670,7 @@ static int32_t setExprToCond(tSqlExpr** parent, tSqlExpr* pExpr, const char* msg
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
handleExprInQueryCond
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
tSqlExpr
**
pExpr
,
SCondExpr
*
pCondExpr
,
static
int32_t
handleExprInQueryCond
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
,
tSqlExpr
**
pExpr
,
SCondExpr
*
pCondExpr
,
int32_t
*
type
,
int32_t
parentOptr
)
{
const
char
*
msg1
=
"table query cannot use tags filter"
;
const
char
*
msg2
=
"illegal column name"
;
...
...
@@ -3793,7 +3793,7 @@ static int32_t handleExprInQueryCond(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSql
return
ret
;
}
int32_t
getQueryCondExpr
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
tSqlExpr
**
pExpr
,
SCondExpr
*
pCondExpr
,
int32_t
getQueryCondExpr
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
,
tSqlExpr
**
pExpr
,
SCondExpr
*
pCondExpr
,
int32_t
*
type
,
int32_t
parentOptr
)
{
if
(
pExpr
==
NULL
)
{
return
TSDB_CODE_SUCCESS
;
...
...
@@ -3841,7 +3841,7 @@ int32_t getQueryCondExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSqlExpr** pExpr
return
handleExprInQueryCond
(
pCmd
,
pQueryInfo
,
pExpr
,
pCondExpr
,
type
,
parentOptr
);
}
static
void
doExtractExprForSTable
(
SSqlCmd
*
pCmd
,
tSqlExpr
**
pExpr
,
SQueryInfo
*
pQueryInfo
,
tSqlExpr
**
pOut
,
int32_t
tableIndex
)
{
static
void
doExtractExprForSTable
(
SSqlCmd
*
pCmd
,
tSqlExpr
**
pExpr
,
SQuery
Node
Info
*
pQueryInfo
,
tSqlExpr
**
pOut
,
int32_t
tableIndex
)
{
if
(
tSqlExprIsParentOfLeaf
(
*
pExpr
))
{
tSqlExpr
*
pLeft
=
(
*
pExpr
)
->
pLeft
;
...
...
@@ -3865,7 +3865,7 @@ static void doExtractExprForSTable(SSqlCmd* pCmd, tSqlExpr** pExpr, SQueryInfo*
}
}
static
tSqlExpr
*
extractExprForSTable
(
SSqlCmd
*
pCmd
,
tSqlExpr
**
pExpr
,
SQueryInfo
*
pQueryInfo
,
int32_t
tableIndex
)
{
static
tSqlExpr
*
extractExprForSTable
(
SSqlCmd
*
pCmd
,
tSqlExpr
**
pExpr
,
SQuery
Node
Info
*
pQueryInfo
,
int32_t
tableIndex
)
{
tSqlExpr
*
pResExpr
=
NULL
;
if
(
*
pExpr
!=
NULL
)
{
...
...
@@ -3889,7 +3889,7 @@ int tableNameCompar(const void* lhs, const void* rhs) {
return
ret
>
0
?
1
:
-
1
;
}
static
int32_t
setTableCondForSTableQuery
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
const
char
*
account
,
static
int32_t
setTableCondForSTableQuery
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
,
const
char
*
account
,
tSqlExpr
*
pExpr
,
int16_t
tableCondIndex
,
SStringBuilder
*
sb
)
{
const
char
*
msg
=
"table name too long"
;
...
...
@@ -3963,7 +3963,7 @@ static int32_t setTableCondForSTableQuery(SSqlCmd* pCmd, SQueryInfo* pQueryInfo,
return
TSDB_CODE_SUCCESS
;
}
static
bool
validateFilterExpr
(
SQueryInfo
*
pQueryInfo
)
{
static
bool
validateFilterExpr
(
SQuery
Node
Info
*
pQueryInfo
)
{
SArray
*
pColList
=
pQueryInfo
->
colList
;
size_t
num
=
taosArrayGetSize
(
pColList
);
...
...
@@ -3971,8 +3971,8 @@ static bool validateFilterExpr(SQueryInfo* pQueryInfo) {
for
(
int32_t
i
=
0
;
i
<
num
;
++
i
)
{
SColumn
*
pCol
=
taosArrayGetP
(
pColList
,
i
);
for
(
int32_t
j
=
0
;
j
<
pCol
->
numOfFilters
;
++
j
)
{
SColumnFilterInfo
*
pColFilter
=
&
pCol
->
filterInfo
[
j
];
for
(
int32_t
j
=
0
;
j
<
pCol
->
info
.
numOfFilters
;
++
j
)
{
SColumnFilterInfo
*
pColFilter
=
&
pCol
->
info
.
filterInfo
[
j
];
int32_t
lowerOptr
=
pColFilter
->
lowerRelOptr
;
int32_t
upperOptr
=
pColFilter
->
upperRelOptr
;
...
...
@@ -3991,7 +3991,7 @@ static bool validateFilterExpr(SQueryInfo* pQueryInfo) {
return
true
;
}
static
int32_t
getTimeRangeFromExpr
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
tSqlExpr
*
pExpr
)
{
static
int32_t
getTimeRangeFromExpr
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
,
tSqlExpr
*
pExpr
)
{
const
char
*
msg0
=
"invalid timestamp"
;
const
char
*
msg1
=
"only one time stamp window allowed"
;
...
...
@@ -4036,7 +4036,7 @@ static int32_t getTimeRangeFromExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSqlE
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
validateJoinExpr
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
SCondExpr
*
pCondExpr
)
{
static
int32_t
validateJoinExpr
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
,
SCondExpr
*
pCondExpr
)
{
const
char
*
msg1
=
"super table join requires tags column"
;
const
char
*
msg2
=
"timestamp join condition missing"
;
const
char
*
msg3
=
"condition missing for join query"
;
...
...
@@ -4086,7 +4086,7 @@ static void cleanQueryExpr(SCondExpr* pCondExpr) {
}
}
static
void
doAddJoinTagsColumnsIntoTagList
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
SCondExpr
*
pCondExpr
)
{
static
void
doAddJoinTagsColumnsIntoTagList
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
,
SCondExpr
*
pCondExpr
)
{
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
if
(
QUERY_IS_JOIN_QUERY
(
pQueryInfo
->
type
)
&&
UTIL_TABLE_IS_SUPER_TABLE
(
pTableMetaInfo
))
{
SColumnIndex
index
=
COLUMN_INDEX_INITIALIZER
;
...
...
@@ -4094,18 +4094,22 @@ static void doAddJoinTagsColumnsIntoTagList(SSqlCmd* pCmd, SQueryInfo* pQueryInf
if
(
getColumnIndexByName
(
pCmd
,
&
pCondExpr
->
pJoinExpr
->
pLeft
->
colInfo
,
pQueryInfo
,
&
index
)
!=
TSDB_CODE_SUCCESS
)
{
tscError
(
"%p: invalid column name (left)"
,
pQueryInfo
);
}
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
index
.
tableIndex
);
index
.
columnIndex
=
index
.
columnIndex
-
tscGetNumOfColumns
(
pTableMetaInfo
->
pTableMeta
);
tscColumnListInsert
(
pTableMetaInfo
->
tagColList
,
&
index
);
SSchema
*
pSchema
=
tscGetTableTagSchema
(
pTableMetaInfo
->
pTableMeta
);
tscColumnListInsert
(
pTableMetaInfo
->
tagColList
,
&
index
,
&
pSchema
[
index
.
columnIndex
]);
if
(
getColumnIndexByName
(
pCmd
,
&
pCondExpr
->
pJoinExpr
->
pRight
->
colInfo
,
pQueryInfo
,
&
index
)
!=
TSDB_CODE_SUCCESS
)
{
tscError
(
"%p: invalid column name (right)"
,
pQueryInfo
);
}
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
index
.
tableIndex
);
index
.
columnIndex
=
index
.
columnIndex
-
tscGetNumOfColumns
(
pTableMetaInfo
->
pTableMeta
);
tscColumnListInsert
(
pTableMetaInfo
->
tagColList
,
&
index
);
pSchema
=
tscGetTableTagSchema
(
pTableMetaInfo
->
pTableMeta
);
tscColumnListInsert
(
pTableMetaInfo
->
tagColList
,
&
index
,
&
pSchema
[
index
.
columnIndex
]);
}
}
...
...
@@ -4188,7 +4192,7 @@ static int32_t validateTagCondExpr(SSqlCmd* pCmd, tExprNode *p) {
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
getTagQueryCondExpr
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
SCondExpr
*
pCondExpr
,
tSqlExpr
**
pExpr
)
{
static
int32_t
getTagQueryCondExpr
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
,
SCondExpr
*
pCondExpr
,
tSqlExpr
**
pExpr
)
{
int32_t
ret
=
TSDB_CODE_SUCCESS
;
if
(
pCondExpr
->
pTagCond
==
NULL
)
{
...
...
@@ -4215,7 +4219,7 @@ static int32_t getTagQueryCondExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SCondE
// TODO: more error handling
}
END_TRY
// add to
sourc
e column list
// add to
required tabl
e column list
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
i
);
int64_t
uid
=
pTableMetaInfo
->
pTableMeta
->
id
.
uid
;
int32_t
numOfCols
=
tscGetNumOfColumns
(
pTableMetaInfo
->
pTableMeta
);
...
...
@@ -4224,7 +4228,9 @@ static int32_t getTagQueryCondExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SCondE
for
(
int32_t
j
=
0
;
j
<
num
;
++
j
)
{
SColIndex
*
pIndex
=
taosArrayGet
(
colList
,
j
);
SColumnIndex
index
=
{.
tableIndex
=
i
,
.
columnIndex
=
pIndex
->
colIndex
-
numOfCols
};
tscColumnListInsert
(
pTableMetaInfo
->
tagColList
,
&
index
);
SSchema
*
s
=
tscGetTableSchema
(
pTableMetaInfo
->
pTableMeta
);
tscColumnListInsert
(
pTableMetaInfo
->
tagColList
,
&
index
,
&
s
[
pIndex
->
colIndex
]);
}
tsSetSTableQueryCond
(
&
pQueryInfo
->
tagCond
,
uid
,
&
bw
);
...
...
@@ -4251,7 +4257,7 @@ static int32_t getTagQueryCondExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SCondE
return
ret
;
}
int32_t
validateWhereNode
(
SQueryInfo
*
pQueryInfo
,
tSqlExpr
**
pExpr
,
SSqlObj
*
pSql
)
{
int32_t
validateWhereNode
(
SQuery
Node
Info
*
pQueryInfo
,
tSqlExpr
**
pExpr
,
SSqlObj
*
pSql
)
{
if
(
pExpr
==
NULL
)
{
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -4414,7 +4420,7 @@ int32_t getTimeRange(STimeWindow* win, tSqlExpr* pRight, int32_t optr, int16_t t
}
// todo error !!!!
int32_t
tsRewriteFieldNameIfNecessary
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
)
{
int32_t
tsRewriteFieldNameIfNecessary
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
)
{
const
char
rep
[]
=
{
'('
,
')'
,
'*'
,
','
,
'.'
,
'/'
,
'\\'
,
'+'
,
'-'
,
'%'
,
' '
};
for
(
int32_t
i
=
0
;
i
<
pQueryInfo
->
fieldsInfo
.
numOfOutput
;
++
i
)
{
...
...
@@ -4445,7 +4451,7 @@ int32_t tsRewriteFieldNameIfNecessary(SSqlCmd* pCmd, SQueryInfo* pQueryInfo) {
return
TSDB_CODE_SUCCESS
;
}
int32_t
validateFillNode
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
SQuerySqlNode
*
pQuerySqlNode
)
{
int32_t
validateFillNode
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
,
SQuerySqlNode
*
pQuerySqlNode
)
{
SArray
*
pFillToken
=
pQuerySqlNode
->
fillType
;
if
(
pQuerySqlNode
->
fillType
==
NULL
)
{
return
TSDB_CODE_SUCCESS
;
...
...
@@ -4559,8 +4565,8 @@ int32_t validateFillNode(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySqlNode* p
size_t
numOfExprs
=
tscSqlExprNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
functionId
==
TSDB_FUNC_TOP
||
pExpr
->
functionId
==
TSDB_FUNC_BOTTOM
)
{
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
base
.
functionId
==
TSDB_FUNC_TOP
||
pExpr
->
base
.
functionId
==
TSDB_FUNC_BOTTOM
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg3
);
}
}
...
...
@@ -4568,7 +4574,7 @@ int32_t validateFillNode(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySqlNode* p
return
TSDB_CODE_SUCCESS
;
}
static
void
setDefaultOrderInfo
(
SQueryInfo
*
pQueryInfo
)
{
static
void
setDefaultOrderInfo
(
SQuery
Node
Info
*
pQueryInfo
)
{
/* set default timestamp order information for all queries */
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
...
...
@@ -4585,7 +4591,7 @@ static void setDefaultOrderInfo(SQueryInfo* pQueryInfo) {
}
}
int32_t
validateOrderbyNode
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
SQuerySqlNode
*
pQuerySqlNode
,
SSchema
*
pSchema
)
{
int32_t
validateOrderbyNode
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
,
SQuerySqlNode
*
pQuerySqlNode
,
SSchema
*
pSchema
)
{
const
char
*
msg0
=
"only support order by primary timestamp"
;
const
char
*
msg1
=
"invalid column name"
;
const
char
*
msg2
=
"order by primary timestamp or first tag in groupby clause allowed"
;
...
...
@@ -4676,11 +4682,11 @@ int32_t validateOrderbyNode(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySqlNode
pQueryInfo
->
groupbyExpr
.
orderType
=
p1
->
sortOrder
;
}
else
if
(
isTopBottomQuery
(
pQueryInfo
))
{
/* order of top/bottom query in interval is not valid */
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
0
);
assert
(
pExpr
->
functionId
==
TSDB_FUNC_TS
);
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
0
);
assert
(
pExpr
->
base
.
functionId
==
TSDB_FUNC_TS
);
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
1
);
if
(
pExpr
->
colInfo
.
colIndex
!=
index
.
columnIndex
&&
index
.
columnIndex
!=
PRIMARYKEY_TIMESTAMP_COL_INDEX
)
{
if
(
pExpr
->
base
.
colInfo
.
colIndex
!=
index
.
columnIndex
&&
index
.
columnIndex
!=
PRIMARYKEY_TIMESTAMP_COL_INDEX
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg2
);
}
...
...
@@ -4738,11 +4744,11 @@ int32_t validateOrderbyNode(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySqlNode
if
(
isTopBottomQuery
(
pQueryInfo
))
{
/* order of top/bottom query in interval is not valid */
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
0
);
assert
(
pExpr
->
functionId
==
TSDB_FUNC_TS
);
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
0
);
assert
(
pExpr
->
base
.
functionId
==
TSDB_FUNC_TS
);
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
1
);
if
(
pExpr
->
colInfo
.
colIndex
!=
index
.
columnIndex
&&
index
.
columnIndex
!=
PRIMARYKEY_TIMESTAMP_COL_INDEX
)
{
if
(
pExpr
->
base
.
colInfo
.
colIndex
!=
index
.
columnIndex
&&
index
.
columnIndex
!=
PRIMARYKEY_TIMESTAMP_COL_INDEX
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg2
);
}
...
...
@@ -4789,7 +4795,7 @@ int32_t setAlterTableInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) {
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
SAlterTableInfo
*
pAlterSQL
=
pInfo
->
pAlterInfo
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
DEFAULT_TABLE_INDEX
);
...
...
@@ -5041,7 +5047,7 @@ int32_t setAlterTableInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) {
return
TSDB_CODE_SUCCESS
;
}
int32_t
validateSqlFunctionInStreamSql
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
)
{
int32_t
validateSqlFunctionInStreamSql
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
)
{
const
char
*
msg0
=
"sample interval can not be less than 10ms."
;
const
char
*
msg1
=
"functions not allowed in select clause"
;
...
...
@@ -5053,7 +5059,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
=
tscSqlExprGet
(
pQueryInfo
,
i
)
->
functionId
;
int32_t
functId
=
tscSqlExprGet
(
pQueryInfo
,
i
)
->
base
.
functionId
;
if
(
!
IS_STREAM_QUERY_VALID
(
aAggs
[
functId
].
status
))
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg1
);
}
...
...
@@ -5062,7 +5068,7 @@ int32_t validateSqlFunctionInStreamSql(SSqlCmd* pCmd, SQueryInfo* pQueryInfo) {
return
TSDB_CODE_SUCCESS
;
}
int32_t
validateFunctionsInIntervalOrGroupbyQuery
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
)
{
int32_t
validateFunctionsInIntervalOrGroupbyQuery
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
)
{
bool
isProjectionFunction
=
false
;
const
char
*
msg1
=
"column projection is not compatible with interval"
;
...
...
@@ -5070,14 +5076,14 @@ int32_t validateFunctionsInIntervalOrGroupbyQuery(SSqlCmd* pCmd, SQueryInfo* pQu
size_t
size
=
taosArrayGetSize
(
pQueryInfo
->
exprList
);
for
(
int32_t
k
=
0
;
k
<
size
;
++
k
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
k
);
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
k
);
// projection query on primary timestamp, the selectivity function needs to be present.
if
(
pExpr
->
functionId
==
TSDB_FUNC_PRJ
&&
pExpr
->
colInfo
.
colId
==
PRIMARYKEY_TIMESTAMP_COL_INDEX
)
{
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
)
{
S
SqlExpr
*
pEx
=
tscSqlExprGet
(
pQueryInfo
,
j
);
if
((
aAggs
[
pEx
->
functionId
].
status
&
TSDB_FUNCSTATE_SELECTIVITY
)
==
TSDB_FUNCSTATE_SELECTIVITY
)
{
S
ExprInfo
*
pEx
=
tscSqlExprGet
(
pQueryInfo
,
j
);
if
((
aAggs
[
pEx
->
base
.
functionId
].
status
&
TSDB_FUNCSTATE_SELECTIVITY
)
==
TSDB_FUNCSTATE_SELECTIVITY
)
{
hasSelectivity
=
true
;
break
;
}
...
...
@@ -5088,8 +5094,8 @@ int32_t validateFunctionsInIntervalOrGroupbyQuery(SSqlCmd* pCmd, SQueryInfo* pQu
}
}
if
((
pExpr
->
functionId
==
TSDB_FUNC_PRJ
&&
pExpr
->
numOfParams
==
0
)
||
pExpr
->
functionId
==
TSDB_FUNC_DIFF
||
pExpr
->
functionId
==
TSDB_FUNC_ARITHM
)
{
if
((
pExpr
->
base
.
functionId
==
TSDB_FUNC_PRJ
&&
pExpr
->
base
.
numOfParams
==
0
)
||
pExpr
->
base
.
functionId
==
TSDB_FUNC_DIFF
||
pExpr
->
base
.
functionId
==
TSDB_FUNC_ARITHM
)
{
isProjectionFunction
=
true
;
}
}
...
...
@@ -5272,7 +5278,7 @@ int32_t validateColumnName(char* name) {
return
TSDB_CODE_SUCCESS
;
}
bool
hasTimestampForPointInterpQuery
(
SQueryInfo
*
pQueryInfo
)
{
bool
hasTimestampForPointInterpQuery
(
SQuery
Node
Info
*
pQueryInfo
)
{
if
(
!
tscIsPointInterpQuery
(
pQueryInfo
))
{
return
true
;
}
...
...
@@ -5280,7 +5286,7 @@ bool hasTimestampForPointInterpQuery(SQueryInfo* pQueryInfo) {
return
(
pQueryInfo
->
window
.
skey
==
pQueryInfo
->
window
.
ekey
)
&&
(
pQueryInfo
->
window
.
skey
!=
0
);
}
int32_t
validateLimitNode
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
int32_t
clauseIndex
,
SQuerySqlNode
*
pQuerySqlNode
,
SSqlObj
*
pSql
)
{
int32_t
validateLimitNode
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
,
int32_t
clauseIndex
,
SQuerySqlNode
*
pQuerySqlNode
,
SSqlObj
*
pSql
)
{
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
const
char
*
msg0
=
"soffset/offset can not be less than 0"
;
...
...
@@ -5475,32 +5481,32 @@ int32_t parseCreateDBOptions(SSqlCmd* pCmd, SCreateDbInfo* pCreateDbSql) {
}
void
addGroupInfoForSubquery
(
SSqlObj
*
pParentObj
,
SSqlObj
*
pSql
,
int32_t
subClauseIndex
,
int32_t
tableIndex
)
{
SQueryInfo
*
pParentQueryInfo
=
tscGetQueryInfo
(
&
pParentObj
->
cmd
,
subClauseIndex
);
SQuery
Node
Info
*
pParentQueryInfo
=
tscGetQueryInfo
(
&
pParentObj
->
cmd
,
subClauseIndex
);
if
(
pParentQueryInfo
->
groupbyExpr
.
numOfGroupCols
>
0
)
{
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
subClauseIndex
);
S
SqlExpr
*
pExpr
=
NULL
;
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
subClauseIndex
);
S
ExprInfo
*
pExpr
=
NULL
;
size_t
size
=
taosArrayGetSize
(
pQueryInfo
->
exprList
);
if
(
size
>
0
)
{
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
(
int32_t
)
size
-
1
);
}
if
(
pExpr
==
NULL
||
pExpr
->
functionId
!=
TSDB_FUNC_TAG
)
{
if
(
pExpr
==
NULL
||
pExpr
->
base
.
functionId
!=
TSDB_FUNC_TAG
)
{
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pParentQueryInfo
,
tableIndex
);
int16_t
colId
=
tscGetJoinTagColIdByUid
(
&
pQueryInfo
->
tagCond
,
pTableMetaInfo
->
pTableMeta
->
id
.
uid
);
SSchema
*
pTagSchema
=
tscGetColumnSchemaById
(
pTableMetaInfo
->
pTableMeta
,
colId
);
int16_t
colIndex
=
tscGetTagColIndexById
(
pTableMetaInfo
->
pTableMeta
,
colId
);
SColumnIndex
index
=
{.
tableIndex
=
0
,
.
columnIndex
=
colIndex
};
SColumnIndex
index
=
{.
tableIndex
=
0
,
.
columnIndex
=
colIndex
};
char
*
name
=
pTagSchema
->
name
;
int16_t
type
=
pTagSchema
->
type
;
int16_t
bytes
=
pTagSchema
->
bytes
;
pExpr
=
tscSqlExprAppend
(
pQueryInfo
,
TSDB_FUNC_TAG
,
&
index
,
type
,
bytes
,
getNewResColId
(
pQueryInfo
),
bytes
,
true
);
pExpr
->
colInfo
.
flag
=
TSDB_COL_TAG
;
pExpr
->
base
.
colInfo
.
flag
=
TSDB_COL_TAG
;
// NOTE: tag column does not add to source column list
SColumnList
ids
=
{
0
};
...
...
@@ -5508,24 +5514,24 @@ void addGroupInfoForSubquery(SSqlObj* pParentObj, SSqlObj* pSql, int32_t subClau
int32_t
relIndex
=
index
.
columnIndex
;
pExpr
->
colInfo
.
colIndex
=
relIndex
;
pExpr
->
base
.
colInfo
.
colIndex
=
relIndex
;
SColIndex
*
pColIndex
=
taosArrayGet
(
pQueryInfo
->
groupbyExpr
.
columnInfo
,
0
);
pColIndex
->
colIndex
=
relIndex
;
index
=
(
SColumnIndex
)
{.
tableIndex
=
tableIndex
,
.
columnIndex
=
relIndex
};
tscColumnListInsert
(
pTableMetaInfo
->
tagColList
,
&
index
);
tscColumnListInsert
(
pTableMetaInfo
->
tagColList
,
&
index
,
pTagSchema
);
}
}
}
// limit the output to be 1 for each state value
static
void
doLimitOutputNormalColOfGroupby
(
S
SqlExpr
*
pExpr
)
{
static
void
doLimitOutputNormalColOfGroupby
(
S
ExprInfo
*
pExpr
)
{
int32_t
outputRow
=
1
;
tVariantCreateFromBinary
(
&
pExpr
->
param
[
0
],
(
char
*
)
&
outputRow
,
sizeof
(
int32_t
),
TSDB_DATA_TYPE_INT
);
pExpr
->
numOfParams
=
1
;
tVariantCreateFromBinary
(
&
pExpr
->
base
.
param
[
0
],
(
char
*
)
&
outputRow
,
sizeof
(
int32_t
),
TSDB_DATA_TYPE_INT
);
pExpr
->
base
.
numOfParams
=
1
;
}
void
doAddGroupColumnForSubquery
(
SQueryInfo
*
pQueryInfo
,
int32_t
tagIndex
)
{
void
doAddGroupColumnForSubquery
(
SQuery
Node
Info
*
pQueryInfo
,
int32_t
tagIndex
)
{
SColIndex
*
pColIndex
=
taosArrayGet
(
pQueryInfo
->
groupbyExpr
.
columnInfo
,
tagIndex
);
size_t
size
=
tscSqlExprNumOfExprs
(
pQueryInfo
);
...
...
@@ -5539,11 +5545,11 @@ void doAddGroupColumnForSubquery(SQueryInfo* pQueryInfo, int32_t tagIndex) {
int32_t
numOfFields
=
tscNumOfFields
(
pQueryInfo
);
SInternalField
*
pInfo
=
tscFieldInfoGetInternalField
(
&
pQueryInfo
->
fieldsInfo
,
numOfFields
-
1
);
doLimitOutputNormalColOfGroupby
(
pInfo
->
p
Sql
Expr
);
doLimitOutputNormalColOfGroupby
(
pInfo
->
pExpr
);
pInfo
->
visible
=
false
;
}
static
void
doUpdateSqlFunctionForTagPrj
(
SQueryInfo
*
pQueryInfo
)
{
static
void
doUpdateSqlFunctionForTagPrj
(
SQuery
Node
Info
*
pQueryInfo
)
{
int32_t
tagLength
=
0
;
size_t
size
=
taosArrayGetSize
(
pQueryInfo
->
exprList
);
...
...
@@ -5552,44 +5558,44 @@ static void doUpdateSqlFunctionForTagPrj(SQueryInfo* pQueryInfo) {
bool
isSTable
=
UTIL_TABLE_IS_SUPER_TABLE
(
pTableMetaInfo
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
functionId
==
TSDB_FUNC_TAGPRJ
||
pExpr
->
functionId
==
TSDB_FUNC_TAG
)
{
pExpr
->
functionId
=
TSDB_FUNC_TAG_DUMMY
;
tagLength
+=
pExpr
->
resBytes
;
}
else
if
(
pExpr
->
functionId
==
TSDB_FUNC_PRJ
&&
pExpr
->
colInfo
.
colId
==
PRIMARYKEY_TIMESTAMP_COL_INDEX
)
{
pExpr
->
functionId
=
TSDB_FUNC_TS_DUMMY
;
tagLength
+=
pExpr
->
resBytes
;
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
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
;
}
else
if
(
pExpr
->
base
.
functionId
==
TSDB_FUNC_PRJ
&&
pExpr
->
base
.
colInfo
.
colId
==
PRIMARYKEY_TIMESTAMP_COL_INDEX
)
{
pExpr
->
base
.
functionId
=
TSDB_FUNC_TS_DUMMY
;
tagLength
+=
pExpr
->
base
.
resBytes
;
}
}
SSchema
*
pSchema
=
tscGetTableSchema
(
pTableMetaInfo
->
pTableMeta
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
if
((
pExpr
->
functionId
!=
TSDB_FUNC_TAG_DUMMY
&&
pExpr
->
functionId
!=
TSDB_FUNC_TS_DUMMY
)
&&
!
(
pExpr
->
functionId
==
TSDB_FUNC_PRJ
&&
TSDB_COL_IS_UD_COL
(
pExpr
->
colInfo
.
flag
)))
{
SSchema
*
pColSchema
=
&
pSchema
[
pExpr
->
colInfo
.
colIndex
];
getResultDataInfo
(
pColSchema
->
type
,
pColSchema
->
bytes
,
pExpr
->
functionId
,
(
int32_t
)
pExpr
->
param
[
0
].
i64
,
&
pExpr
->
resType
,
&
pExpr
->
resBytes
,
&
pExpr
->
interBytes
,
tagLength
,
isSTable
);
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
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
];
getResultDataInfo
(
pColSchema
->
type
,
pColSchema
->
bytes
,
pExpr
->
base
.
functionId
,
(
int32_t
)
pExpr
->
base
.
param
[
0
].
i64
,
&
pExpr
->
base
.
resType
,
&
pExpr
->
base
.
resBytes
,
&
pExpr
->
base
.
interBytes
,
tagLength
,
isSTable
);
}
}
}
static
int32_t
doUpdateSqlFunctionForColPrj
(
SQueryInfo
*
pQueryInfo
)
{
static
int32_t
doUpdateSqlFunctionForColPrj
(
SQuery
Node
Info
*
pQueryInfo
)
{
size_t
size
=
taosArrayGetSize
(
pQueryInfo
->
exprList
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
functionId
==
TSDB_FUNC_PRJ
&&
(
!
TSDB_COL_IS_UD_COL
(
pExpr
->
colInfo
.
flag
)
&&
(
pExpr
->
colInfo
.
colId
!=
PRIMARYKEY_TIMESTAMP_COL_INDEX
)))
{
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
;
for
(
int32_t
j
=
0
;
j
<
pQueryInfo
->
groupbyExpr
.
numOfGroupCols
;
++
j
)
{
SColIndex
*
pColIndex
=
taosArrayGet
(
pQueryInfo
->
groupbyExpr
.
columnInfo
,
j
);
if
(
pExpr
->
colInfo
.
colId
==
pColIndex
->
colId
)
{
if
(
pExpr
->
base
.
colInfo
.
colId
==
pColIndex
->
colId
)
{
qualifiedCol
=
true
;
doLimitOutputNormalColOfGroupby
(
pExpr
);
pExpr
->
numOfParams
=
1
;
pExpr
->
base
.
numOfParams
=
1
;
break
;
}
}
...
...
@@ -5616,16 +5622,16 @@ static bool tagColumnInGroupby(SSqlGroupbyExpr* pGroupbyExpr, int16_t columnId)
return
false
;
}
static
bool
onlyTagPrjFunction
(
SQueryInfo
*
pQueryInfo
)
{
static
bool
onlyTagPrjFunction
(
SQuery
Node
Info
*
pQueryInfo
)
{
bool
hasTagPrj
=
false
;
bool
hasColumnPrj
=
false
;
size_t
size
=
taosArrayGetSize
(
pQueryInfo
->
exprList
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
functionId
==
TSDB_FUNC_PRJ
)
{
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
base
.
functionId
==
TSDB_FUNC_PRJ
)
{
hasColumnPrj
=
true
;
}
else
if
(
pExpr
->
functionId
==
TSDB_FUNC_TAGPRJ
)
{
}
else
if
(
pExpr
->
base
.
functionId
==
TSDB_FUNC_TAGPRJ
)
{
hasTagPrj
=
true
;
}
}
...
...
@@ -5634,17 +5640,17 @@ static bool onlyTagPrjFunction(SQueryInfo* pQueryInfo) {
}
// check if all the tags prj columns belongs to the group by columns
static
bool
allTagPrjInGroupby
(
SQueryInfo
*
pQueryInfo
)
{
static
bool
allTagPrjInGroupby
(
SQuery
Node
Info
*
pQueryInfo
)
{
bool
allInGroupby
=
true
;
size_t
size
=
tscSqlExprNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
functionId
!=
TSDB_FUNC_TAGPRJ
)
{
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
base
.
functionId
!=
TSDB_FUNC_TAGPRJ
)
{
continue
;
}
if
(
!
tagColumnInGroupby
(
&
pQueryInfo
->
groupbyExpr
,
pExpr
->
colInfo
.
colId
))
{
if
(
!
tagColumnInGroupby
(
&
pQueryInfo
->
groupbyExpr
,
pExpr
->
base
.
colInfo
.
colId
))
{
allInGroupby
=
false
;
break
;
}
...
...
@@ -5654,13 +5660,13 @@ static bool allTagPrjInGroupby(SQueryInfo* pQueryInfo) {
return
allInGroupby
;
}
static
void
updateTagPrjFunction
(
SQueryInfo
*
pQueryInfo
)
{
static
void
updateTagPrjFunction
(
SQuery
Node
Info
*
pQueryInfo
)
{
size_t
size
=
taosArrayGetSize
(
pQueryInfo
->
exprList
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
functionId
==
TSDB_FUNC_TAGPRJ
)
{
pExpr
->
functionId
=
TSDB_FUNC_TAG
;
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
base
.
functionId
==
TSDB_FUNC_TAGPRJ
)
{
pExpr
->
base
.
functionId
=
TSDB_FUNC_TAG
;
}
}
}
...
...
@@ -5671,7 +5677,7 @@ static void updateTagPrjFunction(SQueryInfo* pQueryInfo) {
* 2. if selectivity function and tagprj function both exist, there should be only
* one selectivity function exists.
*/
static
int32_t
checkUpdateTagPrjFunctions
(
SQueryInfo
*
pQueryInfo
,
SSqlCmd
*
pCmd
)
{
static
int32_t
checkUpdateTagPrjFunctions
(
SQuery
Node
Info
*
pQueryInfo
,
SSqlCmd
*
pCmd
)
{
const
char
*
msg1
=
"only one selectivity function allowed in presence of tags function"
;
const
char
*
msg3
=
"aggregation function should not be mixed up with projection"
;
...
...
@@ -5681,18 +5687,18 @@ static int32_t checkUpdateTagPrjFunctions(SQueryInfo* pQueryInfo, SSqlCmd* pCmd)
size_t
numOfExprs
=
taosArrayGetSize
(
pQueryInfo
->
exprList
);
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
S
SqlExpr
*
pExpr
=
taosArrayGetP
(
pQueryInfo
->
exprList
,
i
);
if
(
pExpr
->
functionId
==
TSDB_FUNC_TAGPRJ
||
(
pExpr
->
functionId
==
TSDB_FUNC_PRJ
&&
pExpr
->
colInfo
.
colId
==
PRIMARYKEY_TIMESTAMP_COL_INDEX
))
{
S
ExprInfo
*
pExpr
=
taosArrayGetP
(
pQueryInfo
->
exprList
,
i
);
if
(
pExpr
->
base
.
functionId
==
TSDB_FUNC_TAGPRJ
||
(
pExpr
->
base
.
functionId
==
TSDB_FUNC_PRJ
&&
pExpr
->
base
.
colInfo
.
colId
==
PRIMARYKEY_TIMESTAMP_COL_INDEX
))
{
tagTsColExists
=
true
;
// selectivity + ts/tag column
break
;
}
}
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
S
SqlExpr
*
pExpr
=
taosArrayGetP
(
pQueryInfo
->
exprList
,
i
);
S
ExprInfo
*
pExpr
=
taosArrayGetP
(
pQueryInfo
->
exprList
,
i
);
int16_t
functionId
=
pExpr
->
functionId
;
int16_t
functionId
=
pExpr
->
base
.
functionId
;
if
(
functionId
==
TSDB_FUNC_TAGPRJ
||
functionId
==
TSDB_FUNC_PRJ
||
functionId
==
TSDB_FUNC_TS
||
functionId
==
TSDB_FUNC_ARITHM
)
{
continue
;
...
...
@@ -5728,14 +5734,14 @@ static int32_t checkUpdateTagPrjFunctions(SQueryInfo* pQueryInfo, SSqlCmd* pCmd)
* Otherwise, return with error code.
*/
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
int16_t
functionId
=
pExpr
->
functionId
;
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
int16_t
functionId
=
pExpr
->
base
.
functionId
;
if
(
functionId
==
TSDB_FUNC_TAGPRJ
||
(
aAggs
[
functionId
].
status
&
TSDB_FUNCSTATE_SELECTIVITY
)
==
0
)
{
continue
;
}
if
((
functionId
==
TSDB_FUNC_LAST_ROW
)
||
(
functionId
==
TSDB_FUNC_LAST_DST
&&
(
pExpr
->
colInfo
.
flag
&
TSDB_COL_NULL
)
!=
0
))
{
(
functionId
==
TSDB_FUNC_LAST_DST
&&
(
pExpr
->
base
.
colInfo
.
flag
&
TSDB_COL_NULL
)
!=
0
))
{
// do nothing
}
else
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg1
);
...
...
@@ -5768,7 +5774,7 @@ static int32_t checkUpdateTagPrjFunctions(SQueryInfo* pQueryInfo, SSqlCmd* pCmd)
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
doAddGroupbyColumnsOnDemand
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
)
{
static
int32_t
doAddGroupbyColumnsOnDemand
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
)
{
const
char
*
msg2
=
"interval not allowed in group by normal column"
;
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
...
...
@@ -5804,15 +5810,15 @@ static int32_t doAddGroupbyColumnsOnDemand(SSqlCmd* pCmd, SQueryInfo* pQueryInfo
if
(
TSDB_COL_IS_TAG
(
pColIndex
->
flag
))
{
SColumnIndex
index
=
{.
tableIndex
=
pQueryInfo
->
groupbyExpr
.
tableIndex
,
.
columnIndex
=
colIndex
};
S
SqlExpr
*
pExpr
=
tscSqlExprAppend
(
pQueryInfo
,
TSDB_FUNC_TAG
,
&
index
,
type
,
bytes
,
getNewResColId
(
pQueryInfo
),
bytes
,
true
);
S
ExprInfo
*
pExpr
=
tscSqlExprAppend
(
pQueryInfo
,
TSDB_FUNC_TAG
,
&
index
,
type
,
bytes
,
getNewResColId
(
pQueryInfo
),
bytes
,
true
);
memset
(
pExpr
->
aliasName
,
0
,
sizeof
(
pExpr
->
aliasName
));
tstrncpy
(
pExpr
->
aliasName
,
name
,
sizeof
(
pExpr
->
aliasName
));
memset
(
pExpr
->
base
.
aliasName
,
0
,
sizeof
(
pExpr
->
base
.
aliasName
));
tstrncpy
(
pExpr
->
base
.
aliasName
,
name
,
sizeof
(
pExpr
->
base
.
aliasName
));
pExpr
->
colInfo
.
flag
=
TSDB_COL_TAG
;
pExpr
->
base
.
colInfo
.
flag
=
TSDB_COL_TAG
;
// NOTE: tag column does not add to source column list
SColumnList
ids
=
get
ColumnList
(
1
,
0
,
pColIndex
->
colIndex
);
SColumnList
ids
=
create
ColumnList
(
1
,
0
,
pColIndex
->
colIndex
);
insertResultField
(
pQueryInfo
,
(
int32_t
)
size
,
&
ids
,
bytes
,
(
int8_t
)
type
,
name
,
pExpr
);
}
else
{
// if this query is "group by" normal column, time window query is not allowed
...
...
@@ -5822,8 +5828,8 @@ static int32_t doAddGroupbyColumnsOnDemand(SSqlCmd* pCmd, SQueryInfo* pQueryInfo
bool
hasGroupColumn
=
false
;
for
(
int32_t
j
=
0
;
j
<
size
;
++
j
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
j
);
if
(
pExpr
->
colInfo
.
colId
==
pColIndex
->
colId
)
{
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
j
);
if
(
pExpr
->
base
.
colInfo
.
colId
==
pColIndex
->
colId
)
{
break
;
}
}
...
...
@@ -5841,15 +5847,15 @@ static int32_t doAddGroupbyColumnsOnDemand(SSqlCmd* pCmd, SQueryInfo* pQueryInfo
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
doTagFunctionCheck
(
SQueryInfo
*
pQueryInfo
)
{
static
int32_t
doTagFunctionCheck
(
SQuery
Node
Info
*
pQueryInfo
)
{
bool
tagProjection
=
false
;
bool
tableCounting
=
false
;
int32_t
numOfCols
=
(
int32_t
)
tscSqlExprNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
numOfCols
;
++
i
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
int32_t
functionId
=
pExpr
->
functionId
;
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
int32_t
functionId
=
pExpr
->
base
.
functionId
;
if
(
functionId
==
TSDB_FUNC_TAGPRJ
)
{
tagProjection
=
true
;
...
...
@@ -5857,7 +5863,7 @@ static int32_t doTagFunctionCheck(SQueryInfo* pQueryInfo) {
}
if
(
functionId
==
TSDB_FUNC_COUNT
)
{
assert
(
pExpr
->
colInfo
.
colId
==
TSDB_TBNAME_COLUMN_INDEX
);
assert
(
pExpr
->
base
.
colInfo
.
colId
==
TSDB_TBNAME_COLUMN_INDEX
);
tableCounting
=
true
;
}
}
...
...
@@ -5865,7 +5871,7 @@ static int32_t doTagFunctionCheck(SQueryInfo* pQueryInfo) {
return
(
tableCounting
&&
tagProjection
)
?
-
1
:
0
;
}
int32_t
doFunctionsCompatibleCheck
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
)
{
int32_t
doFunctionsCompatibleCheck
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
)
{
const
char
*
msg1
=
"functions/columns not allowed in group by query"
;
const
char
*
msg2
=
"projection query on columns not allowed"
;
const
char
*
msg3
=
"group by not allowed on projection query"
;
...
...
@@ -5895,18 +5901,18 @@ int32_t doFunctionsCompatibleCheck(SSqlCmd* pCmd, SQueryInfo* pQueryInfo) {
// check all query functions in selection clause, multi-output functions are not allowed
size_t
size
=
tscSqlExprNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
int32_t
functId
=
pExpr
->
functionId
;
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
int32_t
functId
=
pExpr
->
base
.
functionId
;
/*
* group by normal columns.
* Check if the column projection is identical to the group by column or not
*/
if
(
functId
==
TSDB_FUNC_PRJ
&&
pExpr
->
colInfo
.
colId
!=
PRIMARYKEY_TIMESTAMP_COL_INDEX
)
{
if
(
functId
==
TSDB_FUNC_PRJ
&&
pExpr
->
base
.
colInfo
.
colId
!=
PRIMARYKEY_TIMESTAMP_COL_INDEX
)
{
bool
qualified
=
false
;
for
(
int32_t
j
=
0
;
j
<
pQueryInfo
->
groupbyExpr
.
numOfGroupCols
;
++
j
)
{
SColIndex
*
pColIndex
=
taosArrayGet
(
pQueryInfo
->
groupbyExpr
.
columnInfo
,
j
);
if
(
pColIndex
->
colId
==
pExpr
->
colInfo
.
colId
)
{
if
(
pColIndex
->
colId
==
pExpr
->
base
.
colInfo
.
colId
)
{
qualified
=
true
;
break
;
}
...
...
@@ -5922,7 +5928,7 @@ int32_t doFunctionsCompatibleCheck(SSqlCmd* pCmd, SQueryInfo* pQueryInfo) {
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg1
);
}
if
(
functId
==
TSDB_FUNC_COUNT
&&
pExpr
->
colInfo
.
colIndex
==
TSDB_TBNAME_COLUMN_INDEX
)
{
if
(
functId
==
TSDB_FUNC_COUNT
&&
pExpr
->
base
.
colInfo
.
colIndex
==
TSDB_TBNAME_COLUMN_INDEX
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg1
);
}
}
...
...
@@ -5949,7 +5955,7 @@ int32_t doFunctionsCompatibleCheck(SSqlCmd* pCmd, SQueryInfo* pQueryInfo) {
return
checkUpdateTagPrjFunctions
(
pQueryInfo
,
pCmd
);
}
}
int32_t
doLocalQueryProcess
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
SQuerySqlNode
*
pQuerySqlNode
)
{
int32_t
doLocalQueryProcess
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
,
SQuerySqlNode
*
pQuerySqlNode
)
{
const
char
*
msg1
=
"only one expression allowed"
;
const
char
*
msg2
=
"invalid expression in select clause"
;
const
char
*
msg3
=
"invalid function"
;
...
...
@@ -6006,12 +6012,12 @@ int32_t doLocalQueryProcess(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySqlNode
}
SColumnIndex
ind
=
{
0
};
S
SqlExpr
*
pExpr1
=
tscSqlExprAppend
(
pQueryInfo
,
TSDB_FUNC_TAG_DUMMY
,
&
ind
,
TSDB_DATA_TYPE_INT
,
S
ExprInfo
*
pExpr1
=
tscSqlExprAppend
(
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
);
const
char
*
name
=
(
item
->
aliasName
!=
NULL
)
?
item
->
aliasName
:
functionsInfo
[
index
].
name
;
tstrncpy
(
pExpr1
->
aliasName
,
name
,
tListLen
(
pExpr1
->
aliasName
));
tstrncpy
(
pExpr1
->
base
.
aliasName
,
name
,
tListLen
(
pExpr1
->
base
.
aliasName
));
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -6101,7 +6107,7 @@ int32_t tscCheckCreateDbParams(SSqlCmd* pCmd, SCreateDbMsg* pCreate) {
// for debug purpose
void
tscPrintSelNodeList
(
SSqlObj
*
pSql
,
int32_t
subClauseIndex
)
{
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
subClauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
subClauseIndex
);
int32_t
size
=
(
int32_t
)
tscSqlExprNumOfExprs
(
pQueryInfo
);
if
(
size
==
0
)
{
...
...
@@ -6115,12 +6121,12 @@ void tscPrintSelNodeList(SSqlObj* pSql, int32_t subClauseIndex) {
offset
+=
sprintf
(
str
,
"num:%d ["
,
size
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
char
tmpBuf
[
1024
]
=
{
0
};
int32_t
tmpLen
=
0
;
tmpLen
=
sprintf
(
tmpBuf
,
"%s(uid:%"
PRId64
", %d)"
,
aAggs
[
pExpr
->
functionId
].
name
,
pExpr
->
uid
,
pExpr
->
colInfo
.
colId
);
sprintf
(
tmpBuf
,
"%s(uid:%"
PRId64
", %d)"
,
aAggs
[
pExpr
->
base
.
functionId
].
name
,
pExpr
->
uid
,
pExpr
->
base
.
colInfo
.
colId
);
if
(
tmpLen
+
offset
>=
totalBufSize
-
1
)
break
;
...
...
@@ -6142,7 +6148,7 @@ int32_t doCheckForCreateTable(SSqlObj* pSql, int32_t subClauseIndex, SSqlInfo* p
const
char
*
msg1
=
"invalid table name"
;
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
subClauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
subClauseIndex
);
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
SCreateTableSql
*
pCreateTable
=
pInfo
->
pCreateTableInfo
;
...
...
@@ -6201,7 +6207,7 @@ int32_t doCheckForCreateFromStable(SSqlObj* pSql, SSqlInfo* pInfo) {
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
SCreateTableSql
*
pCreateTable
=
pInfo
->
pCreateTableInfo
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
// two table: the first one is for current table, and the secondary is for the super table.
if
(
pQueryInfo
->
numOfTables
<
2
)
{
...
...
@@ -6406,7 +6412,7 @@ int32_t doCheckForStream(SSqlObj* pSql, SSqlInfo* pInfo) {
const
char
*
msg7
=
"time interval is required"
;
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
assert
(
pQueryInfo
->
numOfTables
==
1
);
SCreateTableSql
*
pCreateTable
=
pInfo
->
pCreateTableInfo
;
...
...
@@ -6508,7 +6514,7 @@ int32_t doCheckForStream(SSqlObj* pSql, SSqlInfo* pInfo) {
return
TSDB_CODE_SUCCESS
;
}
int32_t
checkQueryRangeForFill
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
)
{
int32_t
checkQueryRangeForFill
(
SSqlCmd
*
pCmd
,
SQuery
Node
Info
*
pQueryInfo
)
{
const
char
*
msg3
=
"start(end) time of query range required or time range too large"
;
if
(
pQueryInfo
->
interval
.
interval
==
0
)
{
...
...
@@ -6551,7 +6557,7 @@ static int32_t doLoadAllTableMeta(SSqlObj* pSql, int32_t index, SQuerySqlNode* p
int32_t
code
=
TSDB_CODE_SUCCESS
;
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
index
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
index
);
for
(
int32_t
i
=
0
;
i
<
numOfTables
;
++
i
)
{
if
(
pQueryInfo
->
numOfTables
<=
i
)
{
// more than one table
...
...
@@ -6606,7 +6612,7 @@ static int32_t doLoadAllTableMeta(SSqlObj* pSql, int32_t index, SQuerySqlNode* p
return
TSDB_CODE_SUCCESS
;
}
static
STableMeta
*
extractTempTableMetaFromNestQuery
(
SQueryInfo
*
pUpstream
)
{
static
STableMeta
*
extractTempTableMetaFromNestQuery
(
SQuery
Node
Info
*
pUpstream
)
{
int32_t
numOfColumns
=
pUpstream
->
fieldsInfo
.
numOfOutput
;
STableMeta
*
meta
=
calloc
(
1
,
sizeof
(
STableMeta
)
+
sizeof
(
SSchema
)
*
numOfColumns
);
...
...
@@ -6622,8 +6628,8 @@ static STableMeta* extractTempTableMetaFromNestQuery(SQueryInfo* pUpstream) {
if
(
pField
->
visible
)
{
meta
->
schema
[
n
].
bytes
=
pField
->
field
.
bytes
;
meta
->
schema
[
n
].
type
=
pField
->
field
.
type
;
meta
->
schema
[
n
].
colId
=
pField
->
p
SqlExpr
->
resColId
;
tstrncpy
(
meta
->
schema
[
n
].
name
,
pField
->
p
SqlExpr
->
aliasName
,
TSDB_COL_NAME_LEN
);
meta
->
schema
[
n
].
colId
=
pField
->
p
Expr
->
base
.
resColId
;
tstrncpy
(
meta
->
schema
[
n
].
name
,
pField
->
p
Expr
->
base
.
aliasName
,
TSDB_COL_NAME_LEN
);
n
+=
1
;
}
}
...
...
@@ -6631,7 +6637,7 @@ static STableMeta* extractTempTableMetaFromNestQuery(SQueryInfo* pUpstream) {
return
meta
;
}
//static SColumnInfo* getColumnInfoFromSchema(SQueryInfo* pUpstream) {
//static SColumnInfo* getColumnInfoFromSchema(SQuery
Node
Info* pUpstream) {
//
//}
...
...
@@ -6647,7 +6653,7 @@ int32_t validateSqlNode(SSqlObj* pSql, SQuerySqlNode* pQuerySqlNode, int32_t ind
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
index
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
index
);
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
if
(
pTableMetaInfo
==
NULL
)
{
pTableMetaInfo
=
tscAddEmptyMetaInfo
(
pQueryInfo
);
...
...
@@ -6677,7 +6683,7 @@ int32_t validateSqlNode(SSqlObj* pSql, SQuerySqlNode* pQuerySqlNode, int32_t ind
}
}
SQuery
Info
*
pQueryInfo1
=
calloc
(
1
,
sizeof
(
SQuery
Info
));
SQuery
NodeInfo
*
pQueryInfo1
=
calloc
(
1
,
sizeof
(
SQueryNode
Info
));
tscInitQueryInfo
(
pQueryInfo1
);
pQueryInfo1
->
pUpstream
=
taosArrayInit
(
4
,
POINTER_BYTES
);
...
...
@@ -6836,7 +6842,7 @@ int32_t validateSqlNode(SSqlObj* pSql, SQuerySqlNode* pQuerySqlNode, int32_t ind
return
TSDB_CODE_SUCCESS
;
// Does not build query message here
}
int32_t
exprTreeFromSqlExpr
(
SSqlCmd
*
pCmd
,
tExprNode
**
pExpr
,
const
tSqlExpr
*
pSqlExpr
,
SQueryInfo
*
pQueryInfo
,
SArray
*
pCols
,
int64_t
*
uid
)
{
int32_t
exprTreeFromSqlExpr
(
SSqlCmd
*
pCmd
,
tExprNode
**
pExpr
,
const
tSqlExpr
*
pSqlExpr
,
SQuery
Node
Info
*
pQueryInfo
,
SArray
*
pCols
,
int64_t
*
uid
)
{
tExprNode
*
pLeft
=
NULL
;
tExprNode
*
pRight
=
NULL
;
...
...
@@ -6878,12 +6884,12 @@ int32_t exprTreeFromSqlExpr(SSqlCmd* pCmd, tExprNode **pExpr, const tSqlExpr* pS
size_t
size
=
taosArrayGetSize
(
pQueryInfo
->
exprList
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
S
SqlExpr
*
p1
=
taosArrayGetP
(
pQueryInfo
->
exprList
,
i
);
S
ExprInfo
*
p1
=
taosArrayGetP
(
pQueryInfo
->
exprList
,
i
);
if
(
strcmp
((
*
pExpr
)
->
pSchema
->
name
,
p1
->
aliasName
)
==
0
)
{
(
*
pExpr
)
->
pSchema
->
type
=
(
uint8_t
)
p1
->
resType
;
(
*
pExpr
)
->
pSchema
->
bytes
=
p1
->
resBytes
;
(
*
pExpr
)
->
pSchema
->
colId
=
p1
->
resColId
;
if
(
strcmp
((
*
pExpr
)
->
pSchema
->
name
,
p1
->
base
.
aliasName
)
==
0
)
{
(
*
pExpr
)
->
pSchema
->
type
=
(
uint8_t
)
p1
->
base
.
resType
;
(
*
pExpr
)
->
pSchema
->
bytes
=
p1
->
base
.
resBytes
;
(
*
pExpr
)
->
pSchema
->
colId
=
p1
->
base
.
resColId
;
if
(
uid
!=
NULL
)
{
*
uid
=
p1
->
uid
;
...
...
@@ -6961,11 +6967,11 @@ int32_t exprTreeFromSqlExpr(SSqlCmd* pCmd, tExprNode **pExpr, const tSqlExpr* pS
return
TSDB_CODE_SUCCESS
;
}
bool
hasNormalColumnFilter
(
SQueryInfo
*
pQueryInfo
)
{
bool
hasNormalColumnFilter
(
SQuery
Node
Info
*
pQueryInfo
)
{
size_t
numOfCols
=
taosArrayGetSize
(
pQueryInfo
->
colList
);
for
(
int32_t
i
=
0
;
i
<
numOfCols
;
++
i
)
{
SColumn
*
pCol
=
taosArrayGetP
(
pQueryInfo
->
colList
,
i
);
if
(
pCol
->
numOfFilters
>
0
)
{
if
(
pCol
->
info
.
numOfFilters
>
0
)
{
return
true
;
}
}
...
...
src/client/src/tscServer.c
浏览文件 @
b6aa9da9
...
...
@@ -302,7 +302,7 @@ void tscProcessMsgFromServer(SRpcMsg *rpcMsg, SRpcEpSet *pEpSet) {
return
;
}
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
if
(
pQueryInfo
!=
NULL
&&
pQueryInfo
->
type
==
TSDB_QUERY_TYPE_FREE_RESOURCE
)
{
tscDebug
(
"%p sqlObj needs to be released or DB connection is closed, cmd:%d type:%d, pObj:%p signature:%p"
,
pSql
,
pCmd
->
command
,
pQueryInfo
->
type
,
pObj
,
pObj
->
signature
);
...
...
@@ -469,7 +469,7 @@ int doProcessSql(SSqlObj *pSql) {
return
TSDB_CODE_SUCCESS
;
}
int
tscProcessSql
(
SSqlObj
*
pSql
,
SQueryInfo
*
pQueryInfo
)
{
int
tscProcessSql
(
SSqlObj
*
pSql
,
SQuery
Node
Info
*
pQueryInfo
)
{
char
name
[
TSDB_TABLE_FNAME_LEN
]
=
{
0
};
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
...
...
@@ -509,7 +509,7 @@ int tscProcessSql(SSqlObj *pSql, SQueryInfo* pQueryInfo) {
int
tscBuildFetchMsg
(
SSqlObj
*
pSql
,
SSqlInfo
*
pInfo
)
{
SRetrieveTableMsg
*
pRetrieveMsg
=
(
SRetrieveTableMsg
*
)
pSql
->
cmd
.
payload
;
SQueryInfo
*
pQueryInfo
=
tscGetActiveQueryInfo
(
&
pSql
->
cmd
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetActiveQueryInfo
(
&
pSql
->
cmd
);
pRetrieveMsg
->
free
=
htons
(
pQueryInfo
->
type
);
pRetrieveMsg
->
qid
=
htobe64
(
pSql
->
res
.
qid
);
...
...
@@ -549,7 +549,7 @@ int tscBuildFetchMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
}
int
tscBuildSubmitMsg
(
SSqlObj
*
pSql
,
SSqlInfo
*
pInfo
)
{
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
STableMeta
*
pTableMeta
=
tscGetMetaInfo
(
pQueryInfo
,
0
)
->
pTableMeta
;
char
*
pMsg
=
pSql
->
cmd
.
payload
;
...
...
@@ -588,7 +588,7 @@ static int32_t tscEstimateQueryMsgSize(SSqlObj *pSql, int32_t clauseIndex) {
const
static
int32_t
MIN_QUERY_MSG_PKT_SIZE
=
TSDB_MAX_BYTES_PER_ROW
*
5
;
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
clauseIndex
);
int32_t
srcColListSize
=
(
int32_t
)(
taosArrayGetSize
(
pQueryInfo
->
colList
)
*
sizeof
(
SColumnInfo
));
...
...
@@ -618,7 +618,7 @@ static int32_t tscEstimateQueryMsgSize(SSqlObj *pSql, int32_t clauseIndex) {
}
static
char
*
doSerializeTableInfo
(
SQueryTableMsg
*
pQueryMsg
,
SSqlObj
*
pSql
,
char
*
pMsg
)
{
SQueryInfo
*
pQueryInfo
=
tscGetActiveQueryInfo
(
&
pSql
->
cmd
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetActiveQueryInfo
(
&
pSql
->
cmd
);
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
TSKEY
dfltKey
=
htobe64
(
pQueryMsg
->
window
.
skey
);
...
...
@@ -704,7 +704,7 @@ int tscBuildQueryMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
return
TSDB_CODE_TSC_INVALID_SQL
;
// todo add test for this
}
SQueryInfo
*
pQueryInfo
=
tscGetActiveQueryInfo
(
pCmd
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetActiveQueryInfo
(
pCmd
);
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
STableMeta
*
pTableMeta
=
pTableMetaInfo
->
pTableMeta
;
...
...
@@ -779,21 +779,20 @@ int tscBuildQueryMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
char
n
[
TSDB_TABLE_FNAME_LEN
]
=
{
0
};
tNameExtractFullName
(
&
pTableMetaInfo
->
name
,
n
);
tscError
(
"%p tid:%d uid:%"
PRIu64
" id:%s, column index out of range, numOfColumns:%d, index:%d, column name:%s"
,
pSql
,
pTableMeta
->
id
.
tid
,
pTableMeta
->
id
.
uid
,
n
,
tscGetNumOfColumns
(
pTableMeta
),
pCol
->
colIndex
.
columnIndex
,
pColSchema
->
name
);
return
TSDB_CODE_TSC_INVALID_SQL
;
}
pQueryMsg
->
colList
[
i
].
colId
=
htons
(
pCol
Schema
->
colId
);
pQueryMsg
->
colList
[
i
].
bytes
=
htons
(
pCol
Schema
->
bytes
);
pQueryMsg
->
colList
[
i
].
type
=
htons
(
pCol
Schema
->
type
);
pQueryMsg
->
colList
[
i
].
numOfFilters
=
htons
(
pCol
->
numOfFilters
);
pQueryMsg
->
colList
[
i
].
colId
=
htons
(
pCol
->
info
.
colId
);
pQueryMsg
->
colList
[
i
].
bytes
=
htons
(
pCol
->
info
.
bytes
);
pQueryMsg
->
colList
[
i
].
type
=
htons
(
pCol
->
info
.
type
);
pQueryMsg
->
colList
[
i
].
numOfFilters
=
htons
(
pCol
->
info
.
numOfFilters
);
// append the filter information after the basic column information
for
(
int32_t
f
=
0
;
f
<
pCol
->
numOfFilters
;
++
f
)
{
SColumnFilterInfo
*
pColFilter
=
&
pCol
->
filterInfo
[
f
];
for
(
int32_t
f
=
0
;
f
<
pCol
->
info
.
numOfFilters
;
++
f
)
{
SColumnFilterInfo
*
pColFilter
=
&
pCol
->
info
.
filterInfo
[
f
];
SColumnFilterInfo
*
pFilterMsg
=
(
SColumnFilterInfo
*
)
pMsg
;
pFilterMsg
->
filterstr
=
htons
(
pColFilter
->
filterstr
);
...
...
@@ -822,7 +821,7 @@ int tscBuildQueryMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
SSqlExpr
*
pSqlFuncExpr
=
(
SSqlExpr
*
)
pMsg
;
for
(
int32_t
i
=
0
;
i
<
tscSqlExprNumOfExprs
(
pQueryInfo
);
++
i
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
// the queried table has been removed and a new table with the same name has already been created already
// return error msg
...
...
@@ -831,48 +830,48 @@ int tscBuildQueryMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
return
TSDB_CODE_TSC_INVALID_TABLE_NAME
;
}
if
(
!
tscValidateColumnId
(
pTableMetaInfo
,
pExpr
->
colInfo
.
colId
,
pExpr
->
numOfParams
))
{
if
(
!
tscValidateColumnId
(
pTableMetaInfo
,
pExpr
->
base
.
colInfo
.
colId
,
pExpr
->
base
.
numOfParams
))
{
tscError
(
"%p table schema is not matched with parsed sql"
,
pSql
);
return
TSDB_CODE_TSC_INVALID_SQL
;
}
assert
(
pExpr
->
resColId
<
0
);
assert
(
pExpr
->
base
.
resColId
<
0
);
pSqlFuncExpr
->
colInfo
.
colId
=
htons
(
pExpr
->
colInfo
.
colId
);
pSqlFuncExpr
->
colInfo
.
colIndex
=
htons
(
pExpr
->
colInfo
.
colIndex
);
pSqlFuncExpr
->
colInfo
.
flag
=
htons
(
pExpr
->
colInfo
.
flag
);
pSqlFuncExpr
->
colInfo
.
colId
=
htons
(
pExpr
->
base
.
colInfo
.
colId
);
pSqlFuncExpr
->
colInfo
.
colIndex
=
htons
(
pExpr
->
base
.
colInfo
.
colIndex
);
pSqlFuncExpr
->
colInfo
.
flag
=
htons
(
pExpr
->
base
.
colInfo
.
flag
);
pSqlFuncExpr
->
colType
=
htons
(
pExpr
->
colType
);
pSqlFuncExpr
->
colBytes
=
htons
(
pExpr
->
colBytes
);
pSqlFuncExpr
->
colType
=
htons
(
pExpr
->
base
.
colType
);
pSqlFuncExpr
->
colBytes
=
htons
(
pExpr
->
base
.
colBytes
);
if
(
TSDB_COL_IS_UD_COL
(
pExpr
->
colInfo
.
flag
)
||
pExpr
->
colInfo
.
colId
==
TSDB_TBNAME_COLUMN_INDEX
)
{
pSqlFuncExpr
->
resType
=
htons
(
pExpr
->
resType
);
pSqlFuncExpr
->
resBytes
=
htons
(
pExpr
->
resBytes
);
}
else
if
(
pExpr
->
colInfo
.
colId
==
TSDB_BLOCK_DIST_COLUMN_INDEX
)
{
if
(
TSDB_COL_IS_UD_COL
(
pExpr
->
base
.
colInfo
.
flag
)
||
pExpr
->
base
.
colInfo
.
colId
==
TSDB_TBNAME_COLUMN_INDEX
)
{
pSqlFuncExpr
->
resType
=
htons
(
pExpr
->
base
.
resType
);
pSqlFuncExpr
->
resBytes
=
htons
(
pExpr
->
base
.
resBytes
);
}
else
if
(
pExpr
->
base
.
colInfo
.
colId
==
TSDB_BLOCK_DIST_COLUMN_INDEX
)
{
SSchema
s
=
tGetBlockDistColumnSchema
();
pSqlFuncExpr
->
resType
=
htons
(
s
.
type
);
pSqlFuncExpr
->
resBytes
=
htons
(
s
.
bytes
);
}
else
{
SSchema
*
s
=
tscGetColumnSchemaById
(
pTableMeta
,
pExpr
->
colInfo
.
colId
);
SSchema
*
s
=
tscGetColumnSchemaById
(
pTableMeta
,
pExpr
->
base
.
colInfo
.
colId
);
pSqlFuncExpr
->
resType
=
htons
(
s
->
type
);
pSqlFuncExpr
->
resBytes
=
htons
(
s
->
bytes
);
}
pSqlFuncExpr
->
functionId
=
htons
(
pExpr
->
functionId
);
pSqlFuncExpr
->
numOfParams
=
htons
(
pExpr
->
numOfParams
);
pSqlFuncExpr
->
resColId
=
htons
(
pExpr
->
resColId
);
pSqlFuncExpr
->
functionId
=
htons
(
pExpr
->
base
.
functionId
);
pSqlFuncExpr
->
numOfParams
=
htons
(
pExpr
->
base
.
numOfParams
);
pSqlFuncExpr
->
resColId
=
htons
(
pExpr
->
base
.
resColId
);
pMsg
+=
sizeof
(
SSqlExpr
);
for
(
int32_t
j
=
0
;
j
<
pExpr
->
numOfParams
;
++
j
)
{
// todo add log
pSqlFuncExpr
->
param
[
j
].
nType
=
htons
((
uint16_t
)
pExpr
->
param
[
j
].
nType
);
pSqlFuncExpr
->
param
[
j
].
nLen
=
htons
(
pExpr
->
param
[
j
].
nLen
);
for
(
int32_t
j
=
0
;
j
<
pExpr
->
base
.
numOfParams
;
++
j
)
{
// todo add log
pSqlFuncExpr
->
param
[
j
].
nType
=
htons
((
uint16_t
)
pExpr
->
base
.
param
[
j
].
nType
);
pSqlFuncExpr
->
param
[
j
].
nLen
=
htons
(
pExpr
->
base
.
param
[
j
].
nLen
);
if
(
pExpr
->
param
[
j
].
nType
==
TSDB_DATA_TYPE_BINARY
)
{
memcpy
(
pMsg
,
pExpr
->
param
[
j
].
pz
,
pExpr
->
param
[
j
].
nLen
);
pMsg
+=
pExpr
->
param
[
j
].
nLen
;
if
(
pExpr
->
base
.
param
[
j
].
nType
==
TSDB_DATA_TYPE_BINARY
)
{
memcpy
(
pMsg
,
pExpr
->
base
.
param
[
j
].
pz
,
pExpr
->
base
.
param
[
j
].
nLen
);
pMsg
+=
pExpr
->
base
.
param
[
j
].
nLen
;
}
else
{
pSqlFuncExpr
->
param
[
j
].
i64
=
htobe64
(
pExpr
->
param
[
j
].
i64
);
pSqlFuncExpr
->
param
[
j
].
i64
=
htobe64
(
pExpr
->
base
.
param
[
j
].
i64
);
}
}
...
...
@@ -888,10 +887,10 @@ int tscBuildQueryMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
for
(
int32_t
i
=
0
;
i
<
output
;
++
i
)
{
SInternalField
*
pField
=
tscFieldInfoGetInternalField
(
&
pQueryInfo
->
fieldsInfo
,
i
);
S
SqlExpr
*
pExpr
=
pField
->
pSql
Expr
;
S
ExprInfo
*
pExpr
=
pField
->
p
Expr
;
// this should be switched to projection query
if
(
pExpr
!
=
NULL
)
{
if
(
pExpr
->
pExpr
=
=
NULL
)
{
// the queried table has been removed and a new table with the same name has already been created already
// return error msg
if
(
pExpr
->
uid
!=
pTableMeta
->
id
.
uid
)
{
...
...
@@ -899,25 +898,25 @@ int tscBuildQueryMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
return
TSDB_CODE_TSC_INVALID_TABLE_NAME
;
}
if
(
!
tscValidateColumnId
(
pTableMetaInfo
,
pExpr
->
colInfo
.
colId
,
pExpr
->
numOfParams
))
{
if
(
!
tscValidateColumnId
(
pTableMetaInfo
,
pExpr
->
base
.
colInfo
.
colId
,
pExpr
->
base
.
numOfParams
))
{
tscError
(
"%p table schema is not matched with parsed sql"
,
pSql
);
return
TSDB_CODE_TSC_INVALID_SQL
;
}
pExpr1
->
numOfParams
=
0
;
// no params for projection query
pExpr1
->
functionId
=
htons
(
TSDB_FUNC_PRJ
);
pExpr1
->
colInfo
.
colId
=
htons
(
pExpr
->
resColId
);
pExpr1
->
colInfo
.
colId
=
htons
(
pExpr
->
base
.
resColId
);
pExpr1
->
colInfo
.
flag
=
htons
(
TSDB_COL_NORMAL
);
pExpr1
->
colType
=
htons
(
pExpr
->
resType
);
pExpr1
->
colBytes
=
htons
(
pExpr
->
resBytes
);
pExpr1
->
colType
=
htons
(
pExpr
->
base
.
resType
);
pExpr1
->
colBytes
=
htons
(
pExpr
->
base
.
resBytes
);
bool
assign
=
false
;
for
(
int32_t
f
=
0
;
f
<
tscSqlExprNumOfExprs
(
pQueryInfo
);
++
f
)
{
S
SqlExpr
*
pe
=
tscSqlExprGet
(
pQueryInfo
,
f
);
S
ExprInfo
*
pe
=
tscSqlExprGet
(
pQueryInfo
,
f
);
if
(
pe
==
pExpr
)
{
pExpr1
->
colInfo
.
colIndex
=
htons
(
f
);
pExpr1
->
resType
=
htons
(
pe
->
resType
);
pExpr1
->
resBytes
=
htons
(
pe
->
resBytes
);
pExpr1
->
resType
=
htons
(
pe
->
base
.
resType
);
pExpr1
->
resBytes
=
htons
(
pe
->
base
.
resBytes
);
assign
=
true
;
break
;
}
...
...
@@ -927,8 +926,8 @@ int tscBuildQueryMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
pMsg
+=
sizeof
(
SSqlExpr
);
pExpr1
=
(
SSqlExpr
*
)
pMsg
;
}
else
{
assert
(
pField
->
p
ArithExprInfo
!=
NULL
);
SExprInfo
*
pExprInfo
=
pField
->
p
ArithExprInfo
;
assert
(
pField
->
p
Expr
!=
NULL
);
SExprInfo
*
pExprInfo
=
pField
->
p
Expr
;
pExpr1
->
colInfo
.
colId
=
htons
(
pExprInfo
->
base
.
colInfo
.
colId
);
pExpr1
->
colType
=
htons
(
pExprInfo
->
base
.
colType
);
...
...
@@ -1050,21 +1049,21 @@ int tscBuildQueryMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
}
// compressed ts block
pQueryMsg
->
tsOffset
=
htonl
((
int32_t
)(
pMsg
-
pCmd
->
payload
));
pQueryMsg
->
ts
Buf
.
ts
Offset
=
htonl
((
int32_t
)(
pMsg
-
pCmd
->
payload
));
if
(
pQueryInfo
->
tsBuf
!=
NULL
)
{
// note: here used the index instead of actual vnode id.
int32_t
vnodeIndex
=
pTableMetaInfo
->
vgroupIndex
;
int32_t
code
=
dumpFileBlockByGroupId
(
pQueryInfo
->
tsBuf
,
vnodeIndex
,
pMsg
,
&
pQueryMsg
->
ts
Len
,
&
pQueryMsg
->
tsNumOfBlocks
);
int32_t
code
=
dumpFileBlockByGroupId
(
pQueryInfo
->
tsBuf
,
vnodeIndex
,
pMsg
,
&
pQueryMsg
->
ts
Buf
.
tsLen
,
&
pQueryMsg
->
tsBuf
.
tsNumOfBlocks
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
}
pMsg
+=
pQueryMsg
->
tsLen
;
pMsg
+=
pQueryMsg
->
ts
Buf
.
ts
Len
;
pQueryMsg
->
tsOrder
=
htonl
(
pQueryInfo
->
tsBuf
->
tsOrder
);
pQueryMsg
->
ts
Len
=
htonl
(
pQueryMsg
->
tsLen
);
pQueryMsg
->
ts
NumOfBlocks
=
htonl
(
pQueryMsg
->
tsNumOfBlocks
);
pQueryMsg
->
ts
Buf
.
ts
Order
=
htonl
(
pQueryInfo
->
tsBuf
->
tsOrder
);
pQueryMsg
->
ts
Buf
.
tsLen
=
htonl
(
pQueryMsg
->
tsBuf
.
tsLen
);
pQueryMsg
->
ts
Buf
.
tsNumOfBlocks
=
htonl
(
pQueryMsg
->
tsBuf
.
tsNumOfBlocks
);
}
memcpy
(
pMsg
,
pSql
->
sqlstr
,
sqlLen
);
...
...
@@ -1383,7 +1382,7 @@ int tscBuildCreateTableMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
SSchema
*
pSchema
;
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
// Reallocate the payload size
...
...
@@ -1472,7 +1471,7 @@ int tscBuildCreateTableMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
}
int
tscEstimateAlterTableMsgLength
(
SSqlCmd
*
pCmd
)
{
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
return
minMsgSize
()
+
sizeof
(
SAlterTableMsg
)
+
sizeof
(
SSchema
)
*
tscNumOfFields
(
pQueryInfo
)
+
TSDB_EXTRA_PAYLOAD_SIZE
;
}
...
...
@@ -1481,7 +1480,7 @@ int tscBuildAlterTableMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
int
msgLen
=
0
;
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
...
...
@@ -1530,7 +1529,7 @@ int tscBuildUpdateTagMsg(SSqlObj* pSql, SSqlInfo *pInfo) {
SUpdateTableTagValMsg
*
pUpdateMsg
=
(
SUpdateTableTagValMsg
*
)
pCmd
->
payload
;
pCmd
->
payloadLen
=
htonl
(
pUpdateMsg
->
head
.
contLen
);
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
STableMeta
*
pTableMeta
=
tscGetMetaInfo
(
pQueryInfo
,
0
)
->
pTableMeta
;
SNewVgroupInfo
vgroupInfo
=
{.
vgId
=
-
1
};
...
...
@@ -1566,7 +1565,7 @@ int tscBuildRetrieveFromMgmtMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
return
TSDB_CODE_TSC_OUT_OF_MEMORY
;
}
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
SRetrieveTableMsg
*
pRetrieveMsg
=
(
SRetrieveTableMsg
*
)
pCmd
->
payload
;
pRetrieveMsg
->
qid
=
htobe64
(
pSql
->
res
.
qid
);
pRetrieveMsg
->
free
=
htons
(
pQueryInfo
->
type
);
...
...
@@ -1590,7 +1589,7 @@ static int tscLocalResultCommonBuilder(SSqlObj *pSql, int32_t numOfRes) {
pRes
->
row
=
0
;
pRes
->
rspType
=
1
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
if
(
tscCreateResPointerInfo
(
pRes
,
pQueryInfo
)
!=
TSDB_CODE_SUCCESS
)
{
return
pRes
->
code
;
}
...
...
@@ -1641,7 +1640,7 @@ int tscProcessRetrieveLocalMergeRsp(SSqlObj *pSql) {
pRes
->
code
=
tscDoLocalMerge
(
pSql
);
if
(
pRes
->
code
==
TSDB_CODE_SUCCESS
&&
pRes
->
numOfRows
>
0
)
{
SQueryInfo
*
pQueryInfo
=
tscGetActiveQueryInfo
(
pCmd
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetActiveQueryInfo
(
pCmd
);
tscCreateResPointerInfo
(
pRes
,
pQueryInfo
);
tscSetResRawPtr
(
pRes
,
pQueryInfo
);
}
...
...
@@ -1695,7 +1694,7 @@ int tscBuildConnectMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
int
tscBuildTableMetaMsg
(
SSqlObj
*
pSql
,
SSqlInfo
*
pInfo
)
{
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
STableInfoMsg
*
pInfoMsg
=
(
STableInfoMsg
*
)
pCmd
->
payload
;
...
...
@@ -1765,7 +1764,7 @@ int tscBuildSTableVgroupMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
char
*
pMsg
=
pCmd
->
payload
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
SSTableVgroupMsg
*
pStableVgroupMsg
=
(
SSTableVgroupMsg
*
)
pMsg
;
pStableVgroupMsg
->
numOfTables
=
htonl
(
pQueryInfo
->
numOfTables
);
...
...
@@ -2108,7 +2107,7 @@ int tscProcessShowRsp(SSqlObj *pSql) {
SSqlRes
*
pRes
=
&
pSql
->
res
;
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
...
...
@@ -2143,12 +2142,12 @@ int tscProcessShowRsp(SSqlObj *pSql) {
for
(
int16_t
i
=
0
;
i
<
pMetaMsg
->
numOfColumns
;
++
i
,
++
pSchema
)
{
index
.
columnIndex
=
i
;
tscColumnListInsert
(
pQueryInfo
->
colList
,
&
index
);
tscColumnListInsert
(
pQueryInfo
->
colList
,
&
index
,
&
pSchema
[
i
]
);
TAOS_FIELD
f
=
tscCreateField
(
pSchema
->
type
,
pSchema
->
name
,
pSchema
->
bytes
);
SInternalField
*
pInfo
=
tscFieldInfoAppend
(
pFieldInfo
,
&
f
);
pInfo
->
p
Sql
Expr
=
tscSqlExprAppend
(
pQueryInfo
,
TSDB_FUNC_TS_DUMMY
,
&
index
,
pInfo
->
pExpr
=
tscSqlExprAppend
(
pQueryInfo
,
TSDB_FUNC_TS_DUMMY
,
&
index
,
pTableSchema
[
i
].
type
,
pTableSchema
[
i
].
bytes
,
getNewResColId
(
pQueryInfo
),
pTableSchema
[
i
].
bytes
,
false
);
}
...
...
@@ -2167,7 +2166,7 @@ static void createHbObj(STscObj* pObj) {
pSql
->
fp
=
tscProcessHeartBeatRsp
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfoS
(
&
pSql
->
cmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfoS
(
&
pSql
->
cmd
,
0
);
if
(
pQueryInfo
==
NULL
)
{
terrno
=
TSDB_CODE_TSC_OUT_OF_MEMORY
;
tfree
(
pSql
);
...
...
@@ -2324,7 +2323,7 @@ int tscProcessRetrieveRspFromNode(SSqlObj *pSql) {
pRes
->
completed
=
(
pRetrieve
->
completed
==
1
);
pRes
->
data
=
pRetrieve
->
data
;
SQueryInfo
*
pQueryInfo
=
tscGetActiveQueryInfo
(
pCmd
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetActiveQueryInfo
(
pCmd
);
if
(
tscCreateResPointerInfo
(
pRes
,
pQueryInfo
)
!=
TSDB_CODE_SUCCESS
)
{
return
pRes
->
code
;
}
...
...
@@ -2381,7 +2380,7 @@ static int32_t getTableMetaFromMnode(SSqlObj *pSql, STableMetaInfo *pTableMetaIn
tscAddQueryInfo
(
&
pNew
->
cmd
);
SQueryInfo
*
pNewQueryInfo
=
tscGetQueryInfoS
(
&
pNew
->
cmd
,
0
);
SQuery
Node
Info
*
pNewQueryInfo
=
tscGetQueryInfoS
(
&
pNew
->
cmd
,
0
);
pNew
->
cmd
.
autoCreated
=
pSql
->
cmd
.
autoCreated
;
// create table if not exists
if
(
TSDB_CODE_SUCCESS
!=
tscAllocPayload
(
&
pNew
->
cmd
,
TSDB_DEFAULT_PAYLOAD_SIZE
+
pSql
->
cmd
.
payloadLen
))
{
...
...
@@ -2470,7 +2469,7 @@ int tscGetTableMetaEx(SSqlObj *pSql, STableMetaInfo *pTableMetaInfo, bool create
int
tscRenewTableMeta
(
SSqlObj
*
pSql
,
int32_t
tableIndex
)
{
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
tableIndex
);
char
name
[
TSDB_TABLE_FNAME_LEN
]
=
{
0
};
...
...
@@ -2494,7 +2493,7 @@ int tscRenewTableMeta(SSqlObj *pSql, int32_t tableIndex) {
}
static
bool
allVgroupInfoRetrieved
(
SSqlCmd
*
pCmd
,
int32_t
clauseIndex
)
{
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
clauseIndex
);
for
(
int32_t
i
=
0
;
i
<
pQueryInfo
->
numOfTables
;
++
i
)
{
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
i
);
if
(
pTableMetaInfo
->
vgroupList
==
NULL
)
{
...
...
@@ -2521,13 +2520,13 @@ int tscGetSTableVgroupInfo(SSqlObj *pSql, int32_t clauseIndex) {
pNew
->
cmd
.
command
=
TSDB_SQL_STABLEVGROUP
;
// TODO TEST IT
SQueryInfo
*
pNewQueryInfo
=
tscGetQueryInfoS
(
&
pNew
->
cmd
,
0
);
SQuery
Node
Info
*
pNewQueryInfo
=
tscGetQueryInfoS
(
&
pNew
->
cmd
,
0
);
if
(
pNewQueryInfo
==
NULL
)
{
tscFreeSqlObj
(
pNew
);
return
code
;
}
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
clauseIndex
);
SQuery
Node
Info
*
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/tscSql.c
浏览文件 @
b6aa9da9
...
...
@@ -373,7 +373,7 @@ int taos_num_fields(TAOS_RES *res) {
if
(
pSql
==
NULL
||
pSql
->
signature
!=
pSql
)
return
0
;
int32_t
num
=
0
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
if
(
pQueryInfo
==
NULL
)
{
return
num
;
}
...
...
@@ -407,7 +407,7 @@ TAOS_FIELD *taos_fetch_fields(TAOS_RES *res) {
SSqlObj
*
pSql
=
(
SSqlObj
*
)
res
;
if
(
pSql
==
NULL
||
pSql
->
signature
!=
pSql
)
return
0
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
if
(
pQueryInfo
==
NULL
)
{
return
NULL
;
}
...
...
@@ -558,7 +558,7 @@ static bool tscKillQueryInDnode(SSqlObj* pSql) {
return
true
;
}
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
if
((
pQueryInfo
==
NULL
)
||
tscIsTwoStageSTableQuery
(
pQueryInfo
,
0
))
{
return
true
;
...
...
@@ -671,7 +671,7 @@ char *taos_get_client_info() { return version; }
static
void
tscKillSTableQuery
(
SSqlObj
*
pSql
)
{
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
if
(
!
tscIsTwoStageSTableQuery
(
pQueryInfo
,
0
))
{
return
;
...
...
@@ -722,7 +722,7 @@ void taos_stop_query(TAOS_RES *res) {
// set the error code for master pSqlObj firstly
pSql
->
res
.
code
=
TSDB_CODE_TSC_QUERY_CANCELLED
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
if
(
tscIsTwoStageSTableQuery
(
pQueryInfo
,
0
))
{
assert
(
pSql
->
rpcRid
<=
0
);
...
...
@@ -752,7 +752,7 @@ bool taos_is_null(TAOS_RES *res, int32_t row, int32_t col) {
return
true
;
}
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
if
(
pQueryInfo
==
NULL
)
{
return
true
;
}
...
...
@@ -932,7 +932,7 @@ static int tscParseTblNameList(SSqlObj *pSql, const char *tblNameList, int32_t t
int
code
=
TSDB_CODE_TSC_INVALID_TABLE_ID_LENGTH
;
char
*
str
=
(
char
*
)
tblNameList
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfoS
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfoS
(
pCmd
,
pCmd
->
clauseIndex
);
if
(
pQueryInfo
==
NULL
)
{
pSql
->
res
.
code
=
terrno
;
return
terrno
;
...
...
src/client/src/tscStream.c
浏览文件 @
b6aa9da9
...
...
@@ -35,10 +35,10 @@ static int64_t getDelayValueAfterTimewindowClosed(SSqlStream* pStream, int64_t l
return
taosGetTimestamp
(
pStream
->
precision
)
+
launchDelay
-
pStream
->
stime
-
1
;
}
static
bool
isProjectStream
(
SQueryInfo
*
pQueryInfo
)
{
static
bool
isProjectStream
(
SQuery
Node
Info
*
pQueryInfo
)
{
for
(
int32_t
i
=
0
;
i
<
pQueryInfo
->
fieldsInfo
.
numOfOutput
;
++
i
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
functionId
!=
TSDB_FUNC_PRJ
)
{
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
base
.
functionId
!=
TSDB_FUNC_PRJ
)
{
return
false
;
}
}
...
...
@@ -89,7 +89,7 @@ static void doLaunchQuery(void* param, TAOS_RES* tres, int32_t code) {
return
;
}
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
code
=
tscGetTableMeta
(
pSql
,
pTableMetaInfo
);
...
...
@@ -130,7 +130,7 @@ static void tscProcessStreamTimer(void *handle, void *tmrId) {
pStream
->
numOfRes
=
0
;
// reset the numOfRes.
SSqlObj
*
pSql
=
pStream
->
pSql
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
tscDebug
(
"%p add into timer"
,
pSql
);
if
(
pStream
->
isProject
)
{
...
...
@@ -208,7 +208,7 @@ static void tscProcessStreamQueryCallback(void *param, TAOS_RES *tres, int numOf
static
void
tscStreamFillTimeGap
(
SSqlStream
*
pStream
,
TSKEY
ts
)
{
#if 0
SSqlObj * pSql = pStream->pSql;
SQueryInfo* pQueryInfo = tscGetQueryInfo(&pSql->cmd, 0);
SQuery
Node
Info* pQueryInfo = tscGetQueryInfo(&pSql->cmd, 0);
if (pQueryInfo->fillType != TSDB_FILL_SET_VALUE && pQueryInfo->fillType != TSDB_FILL_NULL) {
return;
...
...
@@ -421,7 +421,7 @@ static int32_t tscSetSlidingWindowInfo(SSqlObj *pSql, SSqlStream *pStream) {
int64_t
minIntervalTime
=
(
pStream
->
precision
==
TSDB_TIME_PRECISION_MICRO
)
?
tsMinIntervalTime
*
1000L
:
tsMinIntervalTime
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
if
(
!
pStream
->
isProject
&&
pQueryInfo
->
interval
.
interval
==
0
)
{
sprintf
(
pSql
->
cmd
.
payload
,
"the interval value is 0"
);
...
...
@@ -471,7 +471,7 @@ static int32_t tscSetSlidingWindowInfo(SSqlObj *pSql, SSqlStream *pStream) {
}
static
int64_t
tscGetStreamStartTimestamp
(
SSqlObj
*
pSql
,
SSqlStream
*
pStream
,
int64_t
stime
)
{
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
if
(
pStream
->
isProject
)
{
// no data in table, flush all data till now to destination meter, 10sec delay
...
...
@@ -530,7 +530,7 @@ static void tscCreateStream(void *param, TAOS_RES *res, int code) {
return
;
}
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
STableComInfo
tinfo
=
tscGetTableInfo
(
pTableMetaInfo
->
pTableMeta
);
...
...
src/client/src/tscSub.c
浏览文件 @
b6aa9da9
...
...
@@ -284,7 +284,7 @@ static int tscUpdateSubscription(STscObj* pObj, SSub* pSub) {
}
size_t
numOfTables
=
taosArrayGetSize
(
tables
);
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
SArray
*
progress
=
taosArrayInit
(
numOfTables
,
sizeof
(
SSubscriptionProgress
));
for
(
size_t
i
=
0
;
i
<
numOfTables
;
i
++
)
{
STidTags
*
tt
=
taosArrayGet
(
tables
,
i
);
...
...
@@ -502,7 +502,7 @@ TAOS_RES *taos_consume(TAOS_SUB *tsub) {
SSqlRes
*
pRes
=
&
pSql
->
res
;
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
STableMetaInfo
*
pTableMetaInfo
=
tscGetTableMetaInfoFromCmd
(
pCmd
,
pCmd
->
clauseIndex
,
0
);
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
if
(
taosArrayGetSize
(
pSub
->
progress
)
>
0
)
{
// fix crash in single table subscription
size_t
size
=
taosArrayGetSize
(
pSub
->
progress
);
...
...
src/client/src/tscSubquery.c
浏览文件 @
b6aa9da9
...
...
@@ -116,10 +116,8 @@ static bool subAndCheckDone(SSqlObj *pSql, SSqlObj *pParentSql, int idx) {
return
done
;
}
static
int64_t
doTSBlockIntersect
(
SSqlObj
*
pSql
,
SJoinSupporter
*
pSupporter1
,
SJoinSupporter
*
pSupporter2
,
STimeWindow
*
win
)
{
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
pSql
->
cmd
.
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
pSql
->
cmd
.
clauseIndex
);
STSBuf
*
output1
=
tsBufCreate
(
true
,
pQueryInfo
->
order
.
order
);
STSBuf
*
output2
=
tsBufCreate
(
true
,
pQueryInfo
->
order
.
order
);
...
...
@@ -130,8 +128,8 @@ static int64_t doTSBlockIntersect(SSqlObj* pSql, SJoinSupporter* pSupporter1, SJ
SLimitVal
*
pLimit
=
&
pQueryInfo
->
limit
;
int32_t
order
=
pQueryInfo
->
order
.
order
;
SQueryInfo
*
pSubQueryInfo1
=
tscGetQueryInfo
(
&
pSql
->
pSubs
[
0
]
->
cmd
,
0
);
SQueryInfo
*
pSubQueryInfo2
=
tscGetQueryInfo
(
&
pSql
->
pSubs
[
1
]
->
cmd
,
0
);
SQuery
Node
Info
*
pSubQueryInfo1
=
tscGetQueryInfo
(
&
pSql
->
pSubs
[
0
]
->
cmd
,
0
);
SQuery
Node
Info
*
pSubQueryInfo2
=
tscGetQueryInfo
(
&
pSql
->
pSubs
[
1
]
->
cmd
,
0
);
pSubQueryInfo1
->
tsBuf
=
output1
;
pSubQueryInfo2
->
tsBuf
=
output2
;
...
...
@@ -274,7 +272,7 @@ SJoinSupporter* tscCreateJoinSupporter(SSqlObj* pSql, int32_t index) {
pSupporter
->
pObj
=
pSql
;
pSupporter
->
subqueryIndex
=
index
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
pSql
->
cmd
.
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
pSql
->
cmd
.
clauseIndex
);
memcpy
(
&
pSupporter
->
interval
,
&
pQueryInfo
->
interval
,
sizeof
(
pSupporter
->
interval
));
pSupporter
->
limit
=
pQueryInfo
->
limit
;
...
...
@@ -335,7 +333,7 @@ static void tscDestroyJoinSupporter(SJoinSupporter* pSupporter) {
* primary timestamp column , the secondary query is not necessary
*
*/
static
UNUSED_FUNC
bool
needSecondaryQuery
(
SQueryInfo
*
pQueryInfo
)
{
static
UNUSED_FUNC
bool
needSecondaryQuery
(
SQuery
Node
Info
*
pQueryInfo
)
{
size_t
numOfCols
=
taosArrayGetSize
(
pQueryInfo
->
colList
);
for
(
int32_t
i
=
0
;
i
<
numOfCols
;
++
i
)
{
...
...
@@ -348,7 +346,7 @@ static UNUSED_FUNC bool needSecondaryQuery(SQueryInfo* pQueryInfo) {
return
false
;
}
static
void
filterVgroupTables
(
SQueryInfo
*
pQueryInfo
,
SArray
*
pVgroupTables
)
{
static
void
filterVgroupTables
(
SQuery
Node
Info
*
pQueryInfo
,
SArray
*
pVgroupTables
)
{
int32_t
num
=
0
;
int32_t
*
list
=
NULL
;
tsBufGetGroupIdList
(
pQueryInfo
->
tsBuf
,
&
num
,
&
list
);
...
...
@@ -380,7 +378,7 @@ static void filterVgroupTables(SQueryInfo* pQueryInfo, SArray* pVgroupTables) {
tfree
(
list
);
}
static
SArray
*
buildVgroupTableByResult
(
SQueryInfo
*
pQueryInfo
,
SArray
*
pVgroupTables
)
{
static
SArray
*
buildVgroupTableByResult
(
SQuery
Node
Info
*
pQueryInfo
,
SArray
*
pVgroupTables
)
{
int32_t
num
=
0
;
int32_t
*
list
=
NULL
;
tsBufGetGroupIdList
(
pQueryInfo
->
tsBuf
,
&
num
,
&
list
);
...
...
@@ -448,7 +446,7 @@ static int32_t tscLaunchRealSubqueries(SSqlObj* pSql) {
continue
;
}
SQueryInfo
*
pSubQueryInfo
=
tscGetQueryInfo
(
&
pPrevSub
->
cmd
,
0
);
SQuery
Node
Info
*
pSubQueryInfo
=
tscGetQueryInfo
(
&
pPrevSub
->
cmd
,
0
);
STSBuf
*
pTsBuf
=
pSubQueryInfo
->
tsBuf
;
pSubQueryInfo
->
tsBuf
=
NULL
;
...
...
@@ -467,7 +465,7 @@ static int32_t tscLaunchRealSubqueries(SSqlObj* pSql) {
tscClearSubqueryInfo
(
&
pNew
->
cmd
);
pSql
->
pSubs
[
i
]
=
pNew
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pNew
->
cmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pNew
->
cmd
,
0
);
pQueryInfo
->
tsBuf
=
pTsBuf
;
// transfer the ownership of timestamp comp-z data to the new created object
// set the second stage sub query for join process
...
...
@@ -504,11 +502,11 @@ static int32_t tscLaunchRealSubqueries(SSqlObj* pSql) {
SColumnIndex
index
=
{.
tableIndex
=
0
,
.
columnIndex
=
PRIMARYKEY_TIMESTAMP_COL_INDEX
};
SSchema
*
s
=
tscGetTableColumnSchema
(
pTableMetaInfo
->
pTableMeta
,
0
);
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
0
);
int16_t
funcId
=
pExpr
->
functionId
;
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
0
);
int16_t
funcId
=
pExpr
->
base
.
functionId
;
// add the invisible timestamp column
if
((
pExpr
->
colInfo
.
colId
!=
PRIMARYKEY_TIMESTAMP_COL_INDEX
)
||
if
((
pExpr
->
base
.
colInfo
.
colId
!=
PRIMARYKEY_TIMESTAMP_COL_INDEX
)
||
(
funcId
!=
TSDB_FUNC_TS
&&
funcId
!=
TSDB_FUNC_TS_DUMMY
&&
funcId
!=
TSDB_FUNC_PRJ
))
{
int16_t
functionId
=
tscIsProjectionQuery
(
pQueryInfo
)
?
TSDB_FUNC_PRJ
:
TSDB_FUNC_TS
;
...
...
@@ -526,8 +524,8 @@ static int32_t tscLaunchRealSubqueries(SSqlObj* pSql) {
int16_t
colId
=
tscGetJoinTagColIdByUid
(
&
pQueryInfo
->
tagCond
,
pTableMetaInfo
->
pTableMeta
->
id
.
uid
);
// set the tag column id for executor to extract correct tag value
pExpr
->
param
[
0
]
=
(
tVariant
)
{.
i64
=
colId
,
.
nType
=
TSDB_DATA_TYPE_BIGINT
,
.
nLen
=
sizeof
(
int64_t
)};
pExpr
->
numOfParams
=
1
;
pExpr
->
base
.
param
[
0
]
=
(
tVariant
)
{.
i64
=
colId
,
.
nType
=
TSDB_DATA_TYPE_BIGINT
,
.
nLen
=
sizeof
(
int64_t
)};
pExpr
->
base
.
numOfParams
=
1
;
}
if
(
UTIL_TABLE_IS_SUPER_TABLE
(
pTableMetaInfo
))
{
...
...
@@ -565,7 +563,7 @@ static int32_t tscLaunchRealSubqueries(SSqlObj* pSql) {
}
// tscDoQuery(pSql->pSubs[i]);
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
pSubs
[
i
]
->
cmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
pSubs
[
i
]
->
cmd
,
0
);
executeQuery
(
pSql
->
pSubs
[
i
],
pQueryInfo
);
}
...
...
@@ -608,7 +606,7 @@ static int32_t quitAllSubquery(SSqlObj* pSqlSub, SSqlObj* pSqlObj, SJoinSupporte
}
// update the query time range according to the join results on timestamp
static
void
updateQueryTimeRange
(
SQueryInfo
*
pQueryInfo
,
STimeWindow
*
win
)
{
static
void
updateQueryTimeRange
(
SQuery
Node
Info
*
pQueryInfo
,
STimeWindow
*
win
)
{
assert
(
pQueryInfo
->
window
.
skey
<=
win
->
skey
&&
pQueryInfo
->
window
.
ekey
>=
win
->
ekey
);
pQueryInfo
->
window
=
*
win
;
...
...
@@ -704,7 +702,7 @@ static void issueTsCompQuery(SSqlObj* pSql, SJoinSupporter* pSupporter, SSqlObj*
tscClearSubqueryInfo
(
pCmd
);
tscFreeSqlResult
(
pSql
);
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
assert
(
pQueryInfo
->
numOfTables
==
1
);
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
...
...
@@ -723,10 +721,10 @@ static void issueTsCompQuery(SSqlObj* pSql, SJoinSupporter* pSupporter, SSqlObj*
// set the tags value for ts_comp function
if
(
UTIL_TABLE_IS_SUPER_TABLE
(
pTableMetaInfo
))
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
0
);
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
0
);
int16_t
tagColId
=
tscGetJoinTagColIdByUid
(
&
pSupporter
->
tagCond
,
pTableMetaInfo
->
pTableMeta
->
id
.
uid
);
pExpr
->
param
->
i64
=
tagColId
;
pExpr
->
numOfParams
=
1
;
pExpr
->
base
.
param
->
i64
=
tagColId
;
pExpr
->
base
.
numOfParams
=
1
;
}
// add the filter tag column
...
...
@@ -736,7 +734,7 @@ static void issueTsCompQuery(SSqlObj* pSql, SJoinSupporter* pSupporter, SSqlObj*
for
(
int32_t
i
=
0
;
i
<
s
;
++
i
)
{
SColumn
*
pCol
=
taosArrayGetP
(
pSupporter
->
colList
,
i
);
if
(
pCol
->
numOfFilters
>
0
)
{
// copy to the pNew->cmd.colList if it is filtered.
if
(
pCol
->
info
.
numOfFilters
>
0
)
{
// copy to the pNew->cmd.colList if it is filtered.
SColumn
*
p
=
tscColumnClone
(
pCol
);
taosArrayPush
(
pQueryInfo
->
colList
,
&
p
);
}
...
...
@@ -770,7 +768,7 @@ static bool checkForDuplicateTagVal(SSchema* pColSchema, SJoinSupporter* p1, SSq
return
true
;
}
static
int32_t
getIntersectionOfTableTuple
(
SQueryInfo
*
pQueryInfo
,
SSqlObj
*
pParentSql
,
SArray
**
s1
,
SArray
**
s2
)
{
static
int32_t
getIntersectionOfTableTuple
(
SQuery
Node
Info
*
pQueryInfo
,
SSqlObj
*
pParentSql
,
SArray
**
s1
,
SArray
**
s2
)
{
SJoinSupporter
*
p1
=
pParentSql
->
pSubs
[
0
]
->
param
;
SJoinSupporter
*
p2
=
pParentSql
->
pSubs
[
1
]
->
param
;
...
...
@@ -849,7 +847,7 @@ static void tidTagRetrieveCallback(void* param, TAOS_RES* tres, int32_t numOfRow
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
SSqlRes
*
pRes
=
&
pSql
->
res
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
// todo, the type may not include TSDB_QUERY_TYPE_TAG_FILTER_QUERY
assert
(
TSDB_QUERY_HAS_TYPE
(
pQueryInfo
->
type
,
TSDB_QUERY_TYPE_TAG_FILTER_QUERY
));
...
...
@@ -969,11 +967,11 @@ static void tidTagRetrieveCallback(void* param, TAOS_RES* tres, int32_t numOfRow
SSqlCmd
*
pSubCmd1
=
&
pParentSql
->
pSubs
[
0
]
->
cmd
;
SSqlCmd
*
pSubCmd2
=
&
pParentSql
->
pSubs
[
1
]
->
cmd
;
SQueryInfo
*
pQueryInfo1
=
tscGetQueryInfo
(
pSubCmd1
,
0
);
SQuery
Node
Info
*
pQueryInfo1
=
tscGetQueryInfo
(
pSubCmd1
,
0
);
STableMetaInfo
*
pTableMetaInfo1
=
tscGetMetaInfo
(
pQueryInfo1
,
0
);
tscBuildVgroupTableInfo
(
pParentSql
,
pTableMetaInfo1
,
s1
);
SQueryInfo
*
pQueryInfo2
=
tscGetQueryInfo
(
pSubCmd2
,
0
);
SQuery
Node
Info
*
pQueryInfo2
=
tscGetQueryInfo
(
pSubCmd2
,
0
);
STableMetaInfo
*
pTableMetaInfo2
=
tscGetMetaInfo
(
pQueryInfo2
,
0
);
tscBuildVgroupTableInfo
(
pParentSql
,
pTableMetaInfo2
,
s2
);
...
...
@@ -1007,7 +1005,7 @@ static void tsCompRetrieveCallback(void* param, TAOS_RES* tres, int32_t numOfRow
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
SSqlRes
*
pRes
=
&
pSql
->
res
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
assert
(
!
TSDB_QUERY_HAS_TYPE
(
pQueryInfo
->
type
,
TSDB_QUERY_TYPE_JOIN_SEC_STAGE
));
if
(
pParentSql
->
res
.
code
!=
TSDB_CODE_SUCCESS
)
{
...
...
@@ -1143,7 +1141,7 @@ static void tsCompRetrieveCallback(void* param, TAOS_RES* tres, int32_t numOfRow
}
// launch the query the retrieve actual results from vnode along with the filtered timestamp
SQueryInfo
*
pPQueryInfo
=
tscGetQueryInfo
(
&
pParentSql
->
cmd
,
pParentSql
->
cmd
.
clauseIndex
);
SQuery
Node
Info
*
pPQueryInfo
=
tscGetQueryInfo
(
&
pParentSql
->
cmd
,
pParentSql
->
cmd
.
clauseIndex
);
updateQueryTimeRange
(
pPQueryInfo
,
&
win
);
//update the vgroup that involved in real data query
...
...
@@ -1159,7 +1157,7 @@ static void joinRetrieveFinalResCallback(void* param, TAOS_RES* tres, int numOfR
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
SSqlRes
*
pRes
=
&
pSql
->
res
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
if
(
pParentSql
->
res
.
code
!=
TSDB_CODE_SUCCESS
)
{
tscError
(
"%p abort query due to other subquery failure. code:%d, global code:%d"
,
pSql
,
numOfRows
,
pParentSql
->
res
.
code
);
...
...
@@ -1268,7 +1266,7 @@ void tscFetchDatablockForSubquery(SSqlObj* pSql) {
SSqlRes
*
pRes
=
&
pSub
->
res
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSub
->
cmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSub
->
cmd
,
0
);
if
(
!
tscHasReachLimitation
(
pQueryInfo
,
pRes
))
{
if
(
pRes
->
row
>=
pRes
->
numOfRows
)
{
// no data left in current result buffer
...
...
@@ -1320,7 +1318,7 @@ void tscFetchDatablockForSubquery(SSqlObj* pSql) {
continue
;
}
SQueryInfo
*
p
=
tscGetQueryInfo
(
&
pSub
->
cmd
,
0
);
SQuery
Node
Info
*
p
=
tscGetQueryInfo
(
&
pSub
->
cmd
,
0
);
orderedPrjQuery
=
tscNonOrderedProjectionQueryOnSTable
(
p
,
0
);
if
(
orderedPrjQuery
)
{
break
;
...
...
@@ -1344,7 +1342,7 @@ void tscFetchDatablockForSubquery(SSqlObj* pSql) {
continue
;
}
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSub
->
cmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSub
->
cmd
,
0
);
if
(
tscNonOrderedProjectionQueryOnSTable
(
pQueryInfo
,
0
)
&&
pSub
->
res
.
row
>=
pSub
->
res
.
numOfRows
&&
pSub
->
res
.
completed
)
{
...
...
@@ -1419,7 +1417,7 @@ void tscFetchDatablockForSubquery(SSqlObj* pSql) {
pSupporter
=
(
SJoinSupporter
*
)
pSql1
->
param
;
// wait for all subqueries completed
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd1
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd1
,
0
);
assert
(
pRes1
->
numOfRows
>=
0
&&
pQueryInfo
->
numOfTables
==
1
);
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
...
...
@@ -1450,7 +1448,7 @@ void tscSetupOutputColumnIndex(SSqlObj* pSql) {
return
;
}
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
int32_t
numOfExprs
=
(
int32_t
)
tscSqlExprNumOfExprs
(
pQueryInfo
);
pRes
->
pColumnIndex
=
calloc
(
1
,
sizeof
(
SColumnIndex
)
*
numOfExprs
);
...
...
@@ -1460,7 +1458,7 @@ void tscSetupOutputColumnIndex(SSqlObj* pSql) {
}
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
int32_t
tableIndexOfSub
=
-
1
;
for
(
int32_t
j
=
0
;
j
<
pQueryInfo
->
numOfTables
;
++
j
)
{
...
...
@@ -1474,12 +1472,12 @@ void tscSetupOutputColumnIndex(SSqlObj* pSql) {
assert
(
tableIndexOfSub
>=
0
&&
tableIndexOfSub
<
pQueryInfo
->
numOfTables
);
SSqlCmd
*
pSubCmd
=
&
pSql
->
pSubs
[
tableIndexOfSub
]
->
cmd
;
SQueryInfo
*
pSubQueryInfo
=
tscGetQueryInfo
(
pSubCmd
,
0
);
SQuery
Node
Info
*
pSubQueryInfo
=
tscGetQueryInfo
(
pSubCmd
,
0
);
size_t
numOfSubExpr
=
taosArrayGetSize
(
pSubQueryInfo
->
exprList
);
for
(
int32_t
k
=
0
;
k
<
numOfSubExpr
;
++
k
)
{
S
SqlExpr
*
pSubExpr
=
tscSqlExprGet
(
pSubQueryInfo
,
k
);
if
(
pExpr
->
functionId
==
pSubExpr
->
functionId
&&
pExpr
->
colInfo
.
colId
==
pSubExpr
->
colInfo
.
colId
)
{
S
ExprInfo
*
pSubExpr
=
tscSqlExprGet
(
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
;
}
...
...
@@ -1498,7 +1496,7 @@ void tscJoinQueryCallback(void* param, TAOS_RES* tres, int code) {
SSqlObj
*
pParentSql
=
pSupporter
->
pObj
;
// There is only one subquery and table for each subquery.
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
assert
(
pQueryInfo
->
numOfTables
==
1
&&
pSql
->
cmd
.
numOfClause
==
1
);
...
...
@@ -1582,7 +1580,7 @@ static SSqlObj *tscCreateSTableSubquery(SSqlObj *pSql, SRetrieveSupport *trsuppo
int32_t
tscCreateJoinSubquery
(
SSqlObj
*
pSql
,
int16_t
tableIndex
,
SJoinSupporter
*
pSupporter
)
{
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
pSql
->
res
.
qid
=
0x1
;
assert
(
pSql
->
res
.
numOfRows
==
0
);
...
...
@@ -1605,7 +1603,7 @@ int32_t tscCreateJoinSubquery(SSqlObj *pSql, int16_t tableIndex, SJoinSupporter
addGroupInfoForSubquery
(
pSql
,
pNew
,
0
,
tableIndex
);
// refactor as one method
SQueryInfo
*
pNewQueryInfo
=
tscGetQueryInfo
(
&
pNew
->
cmd
,
0
);
SQuery
Node
Info
*
pNewQueryInfo
=
tscGetQueryInfo
(
&
pNew
->
cmd
,
0
);
assert
(
pNewQueryInfo
!=
NULL
);
// update the table index
...
...
@@ -1682,12 +1680,12 @@ 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
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pNewQueryInfo
,
0
);
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pNewQueryInfo
,
0
);
if
(
UTIL_TABLE_IS_SUPER_TABLE
(
pTableMetaInfo
))
{
int16_t
tagColId
=
tscGetJoinTagColIdByUid
(
&
pSupporter
->
tagCond
,
pTableMetaInfo
->
pTableMeta
->
id
.
uid
);
pExpr
->
param
->
i64
=
tagColId
;
pExpr
->
numOfParams
=
1
;
pExpr
->
base
.
param
->
i64
=
tagColId
;
pExpr
->
base
.
numOfParams
=
1
;
}
// add the filter tag column
...
...
@@ -1697,7 +1695,7 @@ int32_t tscCreateJoinSubquery(SSqlObj *pSql, int16_t tableIndex, SJoinSupporter
for
(
int32_t
i
=
0
;
i
<
s
;
++
i
)
{
SColumn
*
pCol
=
taosArrayGetP
(
pSupporter
->
colList
,
i
);
if
(
pCol
->
numOfFilters
>
0
)
{
// copy to the pNew->cmd.colList if it is filtered.
if
(
pCol
->
info
.
numOfFilters
>
0
)
{
// copy to the pNew->cmd.colList if it is filtered.
SColumn
*
p
=
tscColumnClone
(
pCol
);
taosArrayPush
(
pNewQueryInfo
->
colList
,
&
p
);
}
...
...
@@ -1714,7 +1712,7 @@ int32_t tscCreateJoinSubquery(SSqlObj *pSql, int16_t tableIndex, SJoinSupporter
}
}
else
{
assert
(
0
);
SQueryInfo
*
pNewQueryInfo
=
tscGetQueryInfo
(
&
pNew
->
cmd
,
0
);
SQuery
Node
Info
*
pNewQueryInfo
=
tscGetQueryInfo
(
&
pNew
->
cmd
,
0
);
pNewQueryInfo
->
type
|=
TSDB_QUERY_TYPE_SUBQUERY
;
}
...
...
@@ -1725,7 +1723,7 @@ void tscHandleMasterJoinQuery(SSqlObj* pSql) {
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
SSqlRes
*
pRes
=
&
pSql
->
res
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
assert
((
pQueryInfo
->
type
&
TSDB_QUERY_TYPE_SUBQUERY
)
==
0
);
int32_t
code
=
TSDB_CODE_SUCCESS
;
...
...
@@ -1846,15 +1844,15 @@ typedef struct SFirstRoundQuerySup {
int32_t
bufLen
;
}
SFirstRoundQuerySup
;
void
doAppendData
(
SInterResult
*
pInterResult
,
TAOS_ROW
row
,
int32_t
numOfCols
,
SQueryInfo
*
pQueryInfo
)
{
void
doAppendData
(
SInterResult
*
pInterResult
,
TAOS_ROW
row
,
int32_t
numOfCols
,
SQuery
Node
Info
*
pQueryInfo
)
{
TSKEY
key
=
INT64_MIN
;
for
(
int32_t
i
=
0
;
i
<
numOfCols
;
++
i
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
if
(
TSDB_COL_IS_TAG
(
pExpr
->
colInfo
.
flag
)
||
pExpr
->
functionId
==
TSDB_FUNC_PRJ
)
{
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
if
(
TSDB_COL_IS_TAG
(
pExpr
->
base
.
colInfo
.
flag
)
||
pExpr
->
base
.
functionId
==
TSDB_FUNC_PRJ
)
{
continue
;
}
if
(
pExpr
->
colInfo
.
colId
==
PRIMARYKEY_TIMESTAMP_COL_INDEX
)
{
if
(
pExpr
->
base
.
colInfo
.
colId
==
PRIMARYKEY_TIMESTAMP_COL_INDEX
)
{
key
=
*
(
TSKEY
*
)
row
[
i
];
continue
;
}
...
...
@@ -1866,7 +1864,7 @@ void doAppendData(SInterResult* pInterResult, TAOS_ROW row, int32_t numOfCols, S
SET_DOUBLE_NULL
(
&
v
);
}
int32_t
id
=
pExpr
->
colInfo
.
colId
;
int32_t
id
=
pExpr
->
base
.
colInfo
.
colId
;
int32_t
numOfQueriedCols
=
(
int32_t
)
taosArrayGetSize
(
pInterResult
->
pResult
);
SArray
*
p
=
NULL
;
...
...
@@ -1910,7 +1908,7 @@ void tscFirstRoundRetrieveCallback(void* param, TAOS_RES* tres, int numOfRows) {
SFirstRoundQuerySup
*
pSup
=
param
;
SSqlObj
*
pParent
=
pSup
->
pParent
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
int32_t
code
=
taos_errno
(
pSql
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
...
...
@@ -1942,16 +1940,16 @@ void tscFirstRoundRetrieveCallback(void* param, TAOS_RES* tres, int numOfRows) {
int32_t
offset
=
0
;
for
(
int32_t
i
=
0
;
i
<
numOfCols
&&
offset
<
pSup
->
tagLen
;
++
i
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
// tag or group by column
if
(
TSDB_COL_IS_TAG
(
pExpr
->
colInfo
.
flag
)
||
pExpr
->
functionId
==
TSDB_FUNC_PRJ
)
{
if
(
TSDB_COL_IS_TAG
(
pExpr
->
base
.
colInfo
.
flag
)
||
pExpr
->
base
.
functionId
==
TSDB_FUNC_PRJ
)
{
if
(
row
[
i
]
==
NULL
)
{
setNull
(
p
+
offset
,
pExpr
->
resType
,
pExpr
->
resBytes
);
setNull
(
p
+
offset
,
pExpr
->
base
.
resType
,
pExpr
->
base
.
resBytes
);
}
else
{
memcpy
(
p
+
offset
,
row
[
i
],
length
[
i
]);
}
offset
+=
pExpr
->
resBytes
;
offset
+=
pExpr
->
base
.
resBytes
;
}
}
...
...
@@ -1993,7 +1991,7 @@ void tscFirstRoundRetrieveCallback(void* param, TAOS_RES* tres, int numOfRows) {
// set the parameters for the second round query process
SSqlCmd
*
pPCmd
=
&
pParent
->
cmd
;
SQueryInfo
*
pQueryInfo1
=
tscGetQueryInfo
(
pPCmd
,
0
);
SQuery
Node
Info
*
pQueryInfo1
=
tscGetQueryInfo
(
pPCmd
,
0
);
int32_t
resRows
=
pSup
->
numOfRows
;
if
(
pSup
->
numOfRows
>
0
)
{
...
...
@@ -2044,7 +2042,7 @@ void tscFirstRoundCallback(void* param, TAOS_RES* tres, int code) {
}
int32_t
tscHandleFirstRoundStableQuery
(
SSqlObj
*
pSql
)
{
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
STableMetaInfo
*
pTableMetaInfo1
=
tscGetTableMetaInfoFromCmd
(
&
pSql
->
cmd
,
0
,
0
);
SFirstRoundQuerySup
*
pSup
=
calloc
(
1
,
sizeof
(
SFirstRoundQuerySup
));
...
...
@@ -2060,7 +2058,7 @@ int32_t tscHandleFirstRoundStableQuery(SSqlObj *pSql) {
tscClearSubqueryInfo
(
pCmd
);
tscFreeSqlResult
(
pSql
);
SQueryInfo
*
pNewQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
SQuery
Node
Info
*
pNewQueryInfo
=
tscGetQueryInfo
(
pCmd
,
0
);
assert
(
pQueryInfo
->
numOfTables
==
1
);
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pNewQueryInfo
,
0
);
...
...
@@ -2089,54 +2087,54 @@ int32_t tscHandleFirstRoundStableQuery(SSqlObj *pSql) {
int32_t
index
=
0
;
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
functionId
==
TSDB_FUNC_TS
&&
pQueryInfo
->
interval
.
interval
>
0
)
{
taosArrayPush
(
pSup
->
pColsInfo
,
&
pExpr
->
resColId
);
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
base
.
functionId
==
TSDB_FUNC_TS
&&
pQueryInfo
->
interval
.
interval
>
0
)
{
taosArrayPush
(
pSup
->
pColsInfo
,
&
pExpr
->
base
.
resColId
);
SColumnIndex
colIndex
=
{.
tableIndex
=
0
,
.
columnIndex
=
PRIMARYKEY_TIMESTAMP_COL_INDEX
};
SSchema
*
schema
=
tscGetColumnSchemaById
(
pTableMetaInfo1
->
pTableMeta
,
pExpr
->
colInfo
.
colId
);
SSchema
*
schema
=
tscGetColumnSchemaById
(
pTableMetaInfo1
->
pTableMeta
,
pExpr
->
base
.
colInfo
.
colId
);
S
SqlExpr
*
p
=
tscAddFuncInSelectClause
(
pNewQueryInfo
,
index
++
,
TSDB_FUNC_TS
,
&
colIndex
,
schema
,
TSDB_COL_NORMAL
);
p
->
resColId
=
pExpr
->
resColId
;
// update the result column id
}
else
if
(
pExpr
->
functionId
==
TSDB_FUNC_STDDEV_DST
)
{
taosArrayPush
(
pSup
->
pColsInfo
,
&
pExpr
->
resColId
);
S
ExprInfo
*
p
=
tscAddFuncInSelectClause
(
pNewQueryInfo
,
index
++
,
TSDB_FUNC_TS
,
&
colIndex
,
schema
,
TSDB_COL_NORMAL
);
p
->
base
.
resColId
=
pExpr
->
base
.
resColId
;
// update the result column id
}
else
if
(
pExpr
->
base
.
functionId
==
TSDB_FUNC_STDDEV_DST
)
{
taosArrayPush
(
pSup
->
pColsInfo
,
&
pExpr
->
base
.
resColId
);
SColumnIndex
colIndex
=
{.
tableIndex
=
0
,
.
columnIndex
=
pExpr
->
colInfo
.
colIndex
};
SColumnIndex
colIndex
=
{.
tableIndex
=
0
,
.
columnIndex
=
pExpr
->
base
.
colInfo
.
colIndex
};
SSchema
schema
=
{.
type
=
TSDB_DATA_TYPE_DOUBLE
,
.
bytes
=
sizeof
(
double
)};
tstrncpy
(
schema
.
name
,
pExpr
->
aliasName
,
tListLen
(
schema
.
name
));
tstrncpy
(
schema
.
name
,
pExpr
->
base
.
aliasName
,
tListLen
(
schema
.
name
));
S
SqlExpr
*
p
=
tscAddFuncInSelectClause
(
pNewQueryInfo
,
index
++
,
TSDB_FUNC_AVG
,
&
colIndex
,
&
schema
,
TSDB_COL_NORMAL
);
p
->
resColId
=
pExpr
->
resColId
;
// update the result column id
}
else
if
(
pExpr
->
functionId
==
TSDB_FUNC_TAG
)
{
pSup
->
tagLen
+=
pExpr
->
resBytes
;
SColumnIndex
colIndex
=
{.
tableIndex
=
0
,
.
columnIndex
=
pExpr
->
colInfo
.
colIndex
};
S
ExprInfo
*
p
=
tscAddFuncInSelectClause
(
pNewQueryInfo
,
index
++
,
TSDB_FUNC_AVG
,
&
colIndex
,
&
schema
,
TSDB_COL_NORMAL
);
p
->
base
.
resColId
=
pExpr
->
base
.
resColId
;
// update the result column id
}
else
if
(
pExpr
->
base
.
functionId
==
TSDB_FUNC_TAG
)
{
pSup
->
tagLen
+=
pExpr
->
base
.
resBytes
;
SColumnIndex
colIndex
=
{.
tableIndex
=
0
,
.
columnIndex
=
pExpr
->
base
.
colInfo
.
colIndex
};
SSchema
*
schema
=
NULL
;
if
(
pExpr
->
colInfo
.
colId
!=
TSDB_TBNAME_COLUMN_INDEX
)
{
schema
=
tscGetColumnSchemaById
(
pTableMetaInfo1
->
pTableMeta
,
pExpr
->
colInfo
.
colId
);
if
(
pExpr
->
base
.
colInfo
.
colId
!=
TSDB_TBNAME_COLUMN_INDEX
)
{
schema
=
tscGetColumnSchemaById
(
pTableMetaInfo1
->
pTableMeta
,
pExpr
->
base
.
colInfo
.
colId
);
}
else
{
schema
=
tGetTbnameColumnSchema
();
}
S
SqlExpr
*
p
=
tscAddFuncInSelectClause
(
pNewQueryInfo
,
index
++
,
TSDB_FUNC_TAG
,
&
colIndex
,
schema
,
TSDB_COL_TAG
);
p
->
resColId
=
pExpr
->
resColId
;
}
else
if
(
pExpr
->
functionId
==
TSDB_FUNC_PRJ
)
{
S
ExprInfo
*
p
=
tscAddFuncInSelectClause
(
pNewQueryInfo
,
index
++
,
TSDB_FUNC_TAG
,
&
colIndex
,
schema
,
TSDB_COL_TAG
);
p
->
base
.
resColId
=
pExpr
->
base
.
resColId
;
}
else
if
(
pExpr
->
base
.
functionId
==
TSDB_FUNC_PRJ
)
{
int32_t
num
=
(
int32_t
)
taosArrayGetSize
(
pNewQueryInfo
->
groupbyExpr
.
columnInfo
);
for
(
int32_t
k
=
0
;
k
<
num
;
++
k
)
{
SColIndex
*
pIndex
=
taosArrayGet
(
pNewQueryInfo
->
groupbyExpr
.
columnInfo
,
k
);
if
(
pExpr
->
colInfo
.
colId
==
pIndex
->
colId
)
{
pSup
->
tagLen
+=
pExpr
->
resBytes
;
taosArrayPush
(
pSup
->
pColsInfo
,
&
pExpr
->
resColId
);
if
(
pExpr
->
base
.
colInfo
.
colId
==
pIndex
->
colId
)
{
pSup
->
tagLen
+=
pExpr
->
base
.
resBytes
;
taosArrayPush
(
pSup
->
pColsInfo
,
&
pExpr
->
base
.
resColId
);
SColumnIndex
colIndex
=
{.
tableIndex
=
0
,
.
columnIndex
=
pIndex
->
colIndex
};
SSchema
*
schema
=
tscGetColumnSchemaById
(
pTableMetaInfo1
->
pTableMeta
,
pExpr
->
colInfo
.
colId
);
SSchema
*
schema
=
tscGetColumnSchemaById
(
pTableMetaInfo1
->
pTableMeta
,
pExpr
->
base
.
colInfo
.
colId
);
//doLimitOutputNormalColOfGroupby
S
SqlExpr
*
p
=
tscAddFuncInSelectClause
(
pNewQueryInfo
,
index
++
,
TSDB_FUNC_PRJ
,
&
colIndex
,
schema
,
TSDB_COL_NORMAL
);
p
->
numOfParams
=
1
;
p
->
param
[
0
].
i64
=
1
;
p
->
param
[
0
].
nType
=
TSDB_DATA_TYPE_INT
;
p
->
resColId
=
pExpr
->
resColId
;
// update the result column id
S
ExprInfo
*
p
=
tscAddFuncInSelectClause
(
pNewQueryInfo
,
index
++
,
TSDB_FUNC_PRJ
,
&
colIndex
,
schema
,
TSDB_COL_NORMAL
);
p
->
base
.
numOfParams
=
1
;
p
->
base
.
param
[
0
].
i64
=
1
;
p
->
base
.
param
[
0
].
nType
=
TSDB_DATA_TYPE_INT
;
p
->
base
.
resColId
=
pExpr
->
base
.
resColId
;
// update the result column id
}
}
}
...
...
@@ -2183,7 +2181,7 @@ int32_t tscHandleMasterSTableQuery(SSqlObj *pSql) {
const
uint32_t
nBufferSize
=
(
1u
<<
16u
);
// 64KB
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
SSubqueryState
*
pState
=
&
pSql
->
subState
;
...
...
@@ -2265,7 +2263,7 @@ int32_t tscHandleMasterSTableQuery(SSqlObj *pSql) {
// todo handle multi-vnode situation
if
(
pQueryInfo
->
tsBuf
)
{
SQueryInfo
*
pNewQueryInfo
=
tscGetQueryInfo
(
&
pNew
->
cmd
,
0
);
SQuery
Node
Info
*
pNewQueryInfo
=
tscGetQueryInfo
(
&
pNew
->
cmd
,
0
);
pNewQueryInfo
->
tsBuf
=
tsBufClone
(
pQueryInfo
->
tsBuf
);
assert
(
pNewQueryInfo
->
tsBuf
!=
NULL
);
}
...
...
@@ -2453,7 +2451,7 @@ void tscHandleSubqueryError(SRetrieveSupport *trsupport, SSqlObj *pSql, int numO
tscFreeRetrieveSup
(
pSql
);
// in case of second stage join subquery, invoke its callback function instead of regular QueueAsyncRes
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pParentSql
->
cmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pParentSql
->
cmd
,
0
);
if
(
!
TSDB_QUERY_HAS_TYPE
(
pQueryInfo
->
type
,
TSDB_QUERY_TYPE_JOIN_SEC_STAGE
))
{
(
*
pParentSql
->
fp
)(
pParentSql
->
param
,
pParentSql
,
pParentSql
->
res
.
code
);
...
...
@@ -2470,7 +2468,7 @@ static void tscAllDataRetrievedFromDnode(SRetrieveSupport *trsupport, SSqlObj* p
tOrderDescriptor
*
pDesc
=
trsupport
->
pOrderDescriptor
;
SSubqueryState
*
pState
=
&
pParentSql
->
subState
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
STableMetaInfo
*
pTableMetaInfo
=
pQueryInfo
->
pTableMetaInfo
[
0
];
...
...
@@ -2518,7 +2516,7 @@ static void tscAllDataRetrievedFromDnode(SRetrieveSupport *trsupport, SSqlObj* p
tscDebug
(
"%p retrieve from %d vnodes completed.final NumOfRows:%"
PRId64
",start to build loser tree"
,
pParentSql
,
pState
->
numOfSub
,
pState
->
numOfRetrievedRows
);
SQueryInfo
*
pPQueryInfo
=
tscGetQueryInfo
(
&
pParentSql
->
cmd
,
0
);
SQuery
Node
Info
*
pPQueryInfo
=
tscGetQueryInfo
(
&
pParentSql
->
cmd
,
0
);
tscClearInterpInfo
(
pPQueryInfo
);
tscCreateLocalMerger
(
trsupport
->
pExtMemBuffer
,
pState
->
numOfSub
,
pDesc
,
trsupport
->
pFinalColModel
,
trsupport
->
pFFColModel
,
pParentSql
);
...
...
@@ -2594,7 +2592,7 @@ static void tscRetrieveFromDnodeCallBack(void *param, TAOS_RES *tres, int numOfR
}
SSqlRes
*
pRes
=
&
pSql
->
res
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
if
(
numOfRows
>
0
)
{
assert
(
pRes
->
numOfRows
==
numOfRows
);
...
...
@@ -2646,7 +2644,7 @@ static SSqlObj *tscCreateSTableSubquery(SSqlObj *pSql, SRetrieveSupport *trsuppo
SSqlObj
*
pNew
=
createSubqueryObj
(
pSql
,
table_index
,
tscRetrieveDataRes
,
trsupport
,
TSDB_SQL_SELECT
,
prevSqlObj
);
if
(
pNew
!=
NULL
)
{
// the sub query of two-stage super table query
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pNew
->
cmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pNew
->
cmd
,
0
);
pQueryInfo
->
type
|=
TSDB_QUERY_TYPE_STABLE_SUBQUERY
;
...
...
@@ -2680,7 +2678,7 @@ void tscRetrieveDataRes(void *param, TAOS_RES *tres, int code) {
SSqlObj
*
pParentSql
=
trsupport
->
pParentSql
;
SSqlObj
*
pSql
=
(
SSqlObj
*
)
tres
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
0
);
assert
(
pSql
->
cmd
.
numOfClause
==
1
&&
pQueryInfo
->
numOfTables
==
1
);
STableMetaInfo
*
pTableMetaInfo
=
tscGetTableMetaInfoFromCmd
(
&
pSql
->
cmd
,
0
,
0
);
...
...
@@ -2818,7 +2816,7 @@ static void multiVnodeInsertFinalize(void* param, TAOS_RES* tres, int numOfRows)
// clean up tableMeta in cache
tscFreeQueryInfo
(
&
pSql
->
cmd
,
false
);
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfoS
(
&
pSql
->
cmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfoS
(
&
pSql
->
cmd
,
0
);
STableMetaInfo
*
pMasterTableMetaInfo
=
tscGetTableMetaInfoFromCmd
(
&
pParentObj
->
cmd
,
pSql
->
cmd
.
clauseIndex
,
0
);
tscAddTableMetaInfo
(
pQueryInfo
,
&
pMasterTableMetaInfo
->
name
,
NULL
,
NULL
,
NULL
,
NULL
);
...
...
@@ -2990,13 +2988,13 @@ int32_t tscHandleMultivnodeInsert(SSqlObj *pSql) {
}
static
char
*
getResultBlockPosition
(
SSqlCmd
*
pCmd
,
SSqlRes
*
pRes
,
int32_t
columnIndex
,
int16_t
*
bytes
)
{
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SInternalField
*
pInfo
=
(
SInternalField
*
)
TARRAY_GET_ELEM
(
pQueryInfo
->
fieldsInfo
.
internalField
,
columnIndex
);
assert
(
pInfo
->
p
SqlExpr
!
=
NULL
);
assert
(
pInfo
->
p
Expr
->
pExpr
=
=
NULL
);
*
bytes
=
pInfo
->
p
SqlExpr
->
resBytes
;
char
*
pData
=
pRes
->
data
+
pInfo
->
p
SqlExpr
->
offset
*
pRes
->
numOfRows
+
pRes
->
row
*
(
*
bytes
);
*
bytes
=
pInfo
->
p
Expr
->
base
.
resBytes
;
char
*
pData
=
pRes
->
data
+
pInfo
->
p
Expr
->
base
.
offset
*
pRes
->
numOfRows
+
pRes
->
row
*
(
*
bytes
);
return
pData
;
}
...
...
@@ -3004,7 +3002,7 @@ static char* getResultBlockPosition(SSqlCmd* pCmd, SSqlRes* pRes, int32_t column
static
void
doBuildResFromSubqueries
(
SSqlObj
*
pSql
)
{
SSqlRes
*
pRes
=
&
pSql
->
res
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
pSql
->
cmd
.
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
pSql
->
cmd
.
clauseIndex
);
int32_t
numOfRes
=
INT32_MAX
;
for
(
int32_t
i
=
0
;
i
<
pSql
->
subState
.
numOfSub
;
++
i
)
{
...
...
@@ -3087,7 +3085,7 @@ void tscBuildResFromSubqueries(SSqlObj *pSql) {
}
if
(
pRes
->
tsrow
==
NULL
)
{
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
pSql
->
cmd
.
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
&
pSql
->
cmd
,
pSql
->
cmd
.
clauseIndex
);
pRes
->
numOfCols
=
(
int16_t
)
tscSqlExprNumOfExprs
(
pQueryInfo
);
pRes
->
tsrow
=
calloc
(
pRes
->
numOfCols
,
POINTER_BYTES
);
...
...
@@ -3117,18 +3115,18 @@ char *getArithmeticInputSrc(void *param, const char *name, int32_t colId) {
SArithmeticSupport
*
pSupport
=
(
SArithmeticSupport
*
)
param
;
int32_t
index
=
-
1
;
S
SqlExpr
*
pExpr
=
NULL
;
S
ExprInfo
*
pExpr
=
NULL
;
for
(
int32_t
i
=
0
;
i
<
pSupport
->
numOfCols
;
++
i
)
{
pExpr
=
taosArrayGetP
(
pSupport
->
exprList
,
i
);
if
(
strncmp
(
name
,
pExpr
->
aliasName
,
sizeof
(
pExpr
->
aliasName
)
-
1
)
==
0
)
{
if
(
strncmp
(
name
,
pExpr
->
base
.
aliasName
,
sizeof
(
pExpr
->
base
.
aliasName
)
-
1
)
==
0
)
{
index
=
i
;
break
;
}
}
assert
(
index
>=
0
&&
index
<
pSupport
->
numOfCols
);
return
pSupport
->
data
[
index
]
+
pSupport
->
offset
*
pExpr
->
resBytes
;
return
pSupport
->
data
[
index
]
+
pSupport
->
offset
*
pExpr
->
base
.
resBytes
;
}
TAOS_ROW
doSetResultRowData
(
SSqlObj
*
pSql
)
{
...
...
@@ -3141,7 +3139,7 @@ TAOS_ROW doSetResultRowData(SSqlObj *pSql) {
return
pRes
->
tsrow
;
}
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
size_t
size
=
tscNumOfFields
(
pQueryInfo
);
for
(
int
i
=
0
;
i
<
size
;
++
i
)
{
...
...
@@ -3168,7 +3166,7 @@ static UNUSED_FUNC bool tscHasRemainDataInSubqueryResultSet(SSqlObj *pSql) {
bool
hasData
=
true
;
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
if
(
tscNonOrderedProjectionQueryOnSTable
(
pQueryInfo
,
0
))
{
bool
allSubqueryExhausted
=
true
;
...
...
@@ -3180,7 +3178,7 @@ static UNUSED_FUNC bool tscHasRemainDataInSubqueryResultSet(SSqlObj *pSql) {
SSqlRes
*
pRes1
=
&
pSql
->
pSubs
[
i
]
->
res
;
SSqlCmd
*
pCmd1
=
&
pSql
->
pSubs
[
i
]
->
cmd
;
SQueryInfo
*
pQueryInfo1
=
tscGetQueryInfo
(
pCmd1
,
pCmd1
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo1
=
tscGetQueryInfo
(
pCmd1
,
pCmd1
->
clauseIndex
);
assert
(
pQueryInfo1
->
numOfTables
==
1
);
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo1
,
0
);
...
...
@@ -3204,7 +3202,7 @@ static UNUSED_FUNC bool tscHasRemainDataInSubqueryResultSet(SSqlObj *pSql) {
}
SSqlRes
*
pRes1
=
&
pSql
->
pSubs
[
i
]
->
res
;
SQueryInfo
*
pQueryInfo1
=
tscGetQueryInfo
(
&
pSql
->
pSubs
[
i
]
->
cmd
,
0
);
SQuery
Node
Info
*
pQueryInfo1
=
tscGetQueryInfo
(
&
pSql
->
pSubs
[
i
]
->
cmd
,
0
);
if
((
pRes1
->
row
>=
pRes1
->
numOfRows
&&
tscHasReachLimitation
(
pQueryInfo1
,
pRes1
)
&&
tscIsProjectionQuery
(
pQueryInfo1
))
||
(
pRes1
->
numOfRows
==
0
))
{
...
...
@@ -3216,3 +3214,185 @@ static UNUSED_FUNC bool tscHasRemainDataInSubqueryResultSet(SSqlObj *pSql) {
return
hasData
;
}
void
*
createQueryInfoFromQueryNode
(
SQueryNodeInfo
*
pQueryNodeInfo
,
SExprInfo
*
pExprs
,
STableGroupInfo
*
pTableGroupInfo
,
uint64_t
*
qId
,
char
*
sql
)
{
assert
(
pQueryNodeInfo
!=
NULL
);
int16_t
numOfCols
=
taosArrayGetSize
(
pQueryNodeInfo
->
colList
);
int16_t
numOfOutput
=
pQueryNodeInfo
->
fieldsInfo
.
numOfOutput
;
SQInfo
*
pQInfo
=
(
SQInfo
*
)
calloc
(
1
,
sizeof
(
SQInfo
));
if
(
pQInfo
==
NULL
)
{
goto
_cleanup
;
}
// to make sure third party won't overwrite this structure
pQInfo
->
signature
=
pQInfo
;
SQuery
*
pQuery
=
&
pQInfo
->
query
;
pQInfo
->
runtimeEnv
.
pQuery
=
pQuery
;
pQuery
->
tableGroupInfo
=
*
pTableGroupInfo
;
pQuery
->
numOfCols
=
numOfCols
;
pQuery
->
numOfOutput
=
numOfOutput
;
pQuery
->
limit
=
pQueryNodeInfo
->
limit
;
pQuery
->
order
=
pQueryNodeInfo
->
order
;
pQuery
->
pExpr1
=
pExprs
;
pQuery
->
pExpr2
=
NULL
;
// not support yet.
pQuery
->
numOfExpr2
=
0
;
pQuery
->
pGroupbyExpr
=
NULL
;
memcpy
(
&
pQuery
->
interval
,
&
pQueryNodeInfo
->
interval
,
sizeof
(
pQuery
->
interval
));
pQuery
->
fillType
=
pQueryNodeInfo
->
fillType
;
pQuery
->
numOfTags
=
0
;
pQuery
->
tagColList
=
NULL
;
// pQuery->prjInfo.vgroupLimit = pQueryNodeInfo->vgroupLimit;
pQuery
->
prjInfo
.
ts
=
(
pQueryNodeInfo
->
order
.
order
==
TSDB_ORDER_ASC
)
?
INT64_MIN
:
INT64_MAX
;
pQuery
->
sw
=
pQueryNodeInfo
->
sessionWindow
;
pQuery
->
colList
=
calloc
(
numOfCols
,
sizeof
(
SSingleColumnFilterInfo
));
if
(
pQuery
->
colList
==
NULL
)
{
goto
_cleanup
;
}
pQuery
->
srcRowSize
=
0
;
pQuery
->
maxSrcColumnSize
=
0
;
for
(
int16_t
i
=
0
;
i
<
numOfCols
;
++
i
)
{
SColumn
*
pCol
=
taosArrayGet
(
pQueryNodeInfo
->
colList
,
i
);
pQuery
->
colList
[
i
]
=
pCol
->
info
;
pQuery
->
colList
[
i
].
filterInfo
=
tFilterInfoDup
(
pCol
->
info
.
filterInfo
,
pQuery
->
colList
[
i
].
numOfFilters
);
pQuery
->
srcRowSize
+=
pQuery
->
colList
[
i
].
bytes
;
if
(
pQuery
->
maxSrcColumnSize
<
pQuery
->
colList
[
i
].
bytes
)
{
pQuery
->
maxSrcColumnSize
=
pQuery
->
colList
[
i
].
bytes
;
}
}
// calculate the result row size
for
(
int16_t
col
=
0
;
col
<
numOfOutput
;
++
col
)
{
assert
(
pExprs
[
col
].
base
.
resBytes
>
0
);
pQuery
->
resultRowSize
+=
pExprs
[
col
].
base
.
resBytes
;
// keep the tag length
if
(
TSDB_COL_IS_TAG
(
pExprs
[
col
].
base
.
colInfo
.
flag
))
{
pQuery
->
tagLen
+=
pExprs
[
col
].
base
.
resBytes
;
}
}
// doUpdateExprColumnIndex(pQuery);
// int32_t ret = createFilterInfo(pQInfo, pQuery);
// if (ret != TSDB_CODE_SUCCESS) {
// goto _cleanup;
// }
if
(
pQuery
->
fillType
!=
TSDB_FILL_NONE
)
{
pQuery
->
fillVal
=
malloc
(
sizeof
(
int64_t
)
*
pQuery
->
numOfOutput
);
if
(
pQuery
->
fillVal
==
NULL
)
{
goto
_cleanup
;
}
// the first column is the timestamp
memcpy
(
pQuery
->
fillVal
,
(
char
*
)
pQueryNodeInfo
->
fillVal
,
pQuery
->
numOfOutput
*
sizeof
(
int64_t
));
}
size_t
numOfGroups
=
0
;
if
(
pTableGroupInfo
->
pGroupList
!=
NULL
)
{
numOfGroups
=
taosArrayGetSize
(
pTableGroupInfo
->
pGroupList
);
STableGroupInfo
*
pTableqinfo
=
&
pQInfo
->
runtimeEnv
.
tableqinfoGroupInfo
;
pTableqinfo
->
pGroupList
=
taosArrayInit
(
numOfGroups
,
POINTER_BYTES
);
pTableqinfo
->
numOfTables
=
pTableGroupInfo
->
numOfTables
;
pTableqinfo
->
map
=
taosHashInit
(
pTableGroupInfo
->
numOfTables
,
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_INT
),
true
,
HASH_NO_LOCK
);
}
pQInfo
->
pBuf
=
calloc
(
pTableGroupInfo
->
numOfTables
,
sizeof
(
STableQueryInfo
));
if
(
pQInfo
->
pBuf
==
NULL
)
{
goto
_cleanup
;
}
pQInfo
->
dataReady
=
QUERY_RESULT_NOT_READY
;
pQInfo
->
rspContext
=
NULL
;
pQInfo
->
sql
=
sql
;
pthread_mutex_init
(
&
pQInfo
->
lock
,
NULL
);
tsem_init
(
&
pQInfo
->
ready
,
0
,
0
);
pQuery
->
window
=
pQueryNodeInfo
->
window
;
// changeExecuteScanOrder(pQInfo, pQueryMsg, stableQuery);
SQueryRuntimeEnv
*
pRuntimeEnv
=
&
pQInfo
->
runtimeEnv
;
bool
groupByCol
=
false
;
//isGroupbyColumn(pQuery->pGroupbyExpr);
STimeWindow
window
=
pQuery
->
window
;
int32_t
index
=
0
;
for
(
int32_t
i
=
0
;
i
<
numOfGroups
;
++
i
)
{
SArray
*
pa
=
taosArrayGetP
(
pQuery
->
tableGroupInfo
.
pGroupList
,
i
);
size_t
s
=
taosArrayGetSize
(
pa
);
SArray
*
p1
=
taosArrayInit
(
s
,
POINTER_BYTES
);
if
(
p1
==
NULL
)
{
goto
_cleanup
;
}
taosArrayPush
(
pRuntimeEnv
->
tableqinfoGroupInfo
.
pGroupList
,
&
p1
);
for
(
int32_t
j
=
0
;
j
<
s
;
++
j
)
{
STableKeyInfo
*
info
=
taosArrayGet
(
pa
,
j
);
window
.
skey
=
info
->
lastKey
;
void
*
buf
=
(
char
*
)
pQInfo
->
pBuf
+
index
*
sizeof
(
STableQueryInfo
);
STableQueryInfo
*
item
=
createTableQueryInfo
(
pQuery
,
info
->
pTable
,
groupByCol
,
window
,
buf
);
if
(
item
==
NULL
)
{
goto
_cleanup
;
}
item
->
groupIndex
=
i
;
taosArrayPush
(
p1
,
&
item
);
// STableId* id = TSDB_TABLEID(info->pTable);
STableId
id
=
{.
tid
=
0
,
.
uid
=
0
};
taosHashPut
(
pRuntimeEnv
->
tableqinfoGroupInfo
.
map
,
&
id
.
tid
,
sizeof
(
id
.
tid
),
&
item
,
POINTER_BYTES
);
index
+=
1
;
}
}
// colIdCheck(pQuery, pQInfo);
// todo refactor
pQInfo
->
query
.
queryBlockDist
=
(
numOfOutput
==
1
&&
pExprs
[
0
].
base
.
colInfo
.
colId
==
TSDB_BLOCK_DIST_COLUMN_INDEX
);
pQInfo
->
qId
=
0
;
//atomic_add_fetch_64(&queryHandleId, 1);
if
(
qId
!=
NULL
)
{
*
qId
=
pQInfo
->
qId
;
}
// qDebug("qmsg:%p QInfo:%" PRIu64 "-%p created", pQueryMsg, pQInfo->qId, pQInfo);
// return pQInfo;
// if (pGroupbyExpr != NULL) {
// taosArrayDestroy(pGroupbyExpr->columnInfo);
// free(pGroupbyExpr);
// }
//
// tfree(pTagCols);
for
(
int32_t
i
=
0
;
i
<
numOfOutput
;
++
i
)
{
SExprInfo
*
pExprInfo
=
&
pExprs
[
i
];
if
(
pExprInfo
->
pExpr
!=
NULL
)
{
tExprTreeDestroy
(
pExprInfo
->
pExpr
,
NULL
);
pExprInfo
->
pExpr
=
NULL
;
}
}
tfree
(
pExprs
);
STsBufInfo
bufInfo
=
{
0
};
SQueryParam
param
=
{
0
};
/*int32_t code = */
initQInfo
(
&
bufInfo
,
NULL
,
0
,
pQInfo
,
&
param
,
NULL
,
0
,
false
);
qTableQuery
(
pQInfo
);
return
pQInfo
;
_cleanup:
freeQInfo
(
pQInfo
);
return
NULL
;
}
src/client/src/tscUtil.c
浏览文件 @
b6aa9da9
...
...
@@ -29,8 +29,8 @@
#include "ttimer.h"
#include "ttokendef.h"
static
void
freeQueryInfoImpl
(
SQueryInfo
*
pQueryInfo
);
static
void
clearAllTableMetaInfo
(
SQueryInfo
*
pQueryInfo
,
bool
removeMeta
);
static
void
freeQueryInfoImpl
(
SQuery
Node
Info
*
pQueryInfo
);
static
void
clearAllTableMetaInfo
(
SQuery
Node
Info
*
pQueryInfo
,
bool
removeMeta
);
static
void
tscStrToLower
(
char
*
str
,
int32_t
n
)
{
if
(
str
==
NULL
||
n
<=
0
)
{
return
;}
...
...
@@ -77,15 +77,15 @@ void tsSetSTableQueryCond(STagCond* pTagCond, uint64_t uid, SBufferWriter* bw) {
taosArrayPush
(
pTagCond
->
pCond
,
&
cond
);
}
bool
tscQueryTags
(
SQueryInfo
*
pQueryInfo
)
{
bool
tscQueryTags
(
SQuery
Node
Info
*
pQueryInfo
)
{
int32_t
numOfCols
=
(
int32_t
)
tscSqlExprNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
numOfCols
;
++
i
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
int32_t
functId
=
pExpr
->
functionId
;
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
int32_t
functId
=
pExpr
->
base
.
functionId
;
// "select count(tbname)" query
if
(
functId
==
TSDB_FUNC_COUNT
&&
pExpr
->
colInfo
.
colId
==
TSDB_TBNAME_COLUMN_INDEX
)
{
if
(
functId
==
TSDB_FUNC_COUNT
&&
pExpr
->
base
.
colInfo
.
colId
==
TSDB_TBNAME_COLUMN_INDEX
)
{
continue
;
}
...
...
@@ -97,12 +97,12 @@ bool tscQueryTags(SQueryInfo* pQueryInfo) {
return
true
;
}
bool
tscQueryBlockInfo
(
SQueryInfo
*
pQueryInfo
)
{
bool
tscQueryBlockInfo
(
SQuery
Node
Info
*
pQueryInfo
)
{
int32_t
numOfCols
=
(
int32_t
)
tscSqlExprNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
numOfCols
;
++
i
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
int32_t
functId
=
pExpr
->
functionId
;
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
int32_t
functId
=
pExpr
->
base
.
functionId
;
// "select count(tbname)" query
if
(
functId
==
TSDB_FUNC_BLKINFO
)
{
...
...
@@ -113,7 +113,7 @@ bool tscQueryBlockInfo(SQueryInfo* pQueryInfo) {
return
false
;
}
bool
tscIsTwoStageSTableQuery
(
SQueryInfo
*
pQueryInfo
,
int32_t
tableIndex
)
{
bool
tscIsTwoStageSTableQuery
(
SQuery
Node
Info
*
pQueryInfo
,
int32_t
tableIndex
)
{
if
(
pQueryInfo
==
NULL
)
{
return
false
;
}
...
...
@@ -139,7 +139,7 @@ bool tscIsTwoStageSTableQuery(SQueryInfo* pQueryInfo, int32_t tableIndex) {
return
false
;
}
bool
tscIsProjectionQueryOnSTable
(
SQueryInfo
*
pQueryInfo
,
int32_t
tableIndex
)
{
bool
tscIsProjectionQueryOnSTable
(
SQuery
Node
Info
*
pQueryInfo
,
int32_t
tableIndex
)
{
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
tableIndex
);
/*
...
...
@@ -154,7 +154,7 @@ bool tscIsProjectionQueryOnSTable(SQueryInfo* pQueryInfo, int32_t tableIndex) {
}
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
int32_t
functionId
=
tscSqlExprGet
(
pQueryInfo
,
i
)
->
functionId
;
int32_t
functionId
=
tscSqlExprGet
(
pQueryInfo
,
i
)
->
base
.
functionId
;
if
(
functionId
!=
TSDB_FUNC_PRJ
&&
functionId
!=
TSDB_FUNC_TAGPRJ
&&
...
...
@@ -171,7 +171,7 @@ bool tscIsProjectionQueryOnSTable(SQueryInfo* pQueryInfo, int32_t tableIndex) {
}
// not order by timestamp projection query on super table
bool
tscNonOrderedProjectionQueryOnSTable
(
SQueryInfo
*
pQueryInfo
,
int32_t
tableIndex
)
{
bool
tscNonOrderedProjectionQueryOnSTable
(
SQuery
Node
Info
*
pQueryInfo
,
int32_t
tableIndex
)
{
if
(
!
tscIsProjectionQueryOnSTable
(
pQueryInfo
,
tableIndex
))
{
return
false
;
}
...
...
@@ -180,7 +180,7 @@ bool tscNonOrderedProjectionQueryOnSTable(SQueryInfo* pQueryInfo, int32_t tableI
return
pQueryInfo
->
order
.
orderColId
<
0
;
}
bool
tscOrderedProjectionQueryOnSTable
(
SQueryInfo
*
pQueryInfo
,
int32_t
tableIndex
)
{
bool
tscOrderedProjectionQueryOnSTable
(
SQuery
Node
Info
*
pQueryInfo
,
int32_t
tableIndex
)
{
if
(
!
tscIsProjectionQueryOnSTable
(
pQueryInfo
,
tableIndex
))
{
return
false
;
}
...
...
@@ -189,11 +189,11 @@ bool tscOrderedProjectionQueryOnSTable(SQueryInfo* pQueryInfo, int32_t tableInde
return
pQueryInfo
->
order
.
orderColId
>=
0
;
}
bool
tscIsProjectionQuery
(
SQueryInfo
*
pQueryInfo
)
{
bool
tscIsProjectionQuery
(
SQuery
Node
Info
*
pQueryInfo
)
{
size_t
size
=
tscSqlExprNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
int32_t
functionId
=
tscSqlExprGet
(
pQueryInfo
,
i
)
->
functionId
;
int32_t
functionId
=
tscSqlExprGet
(
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
)
{
...
...
@@ -204,13 +204,13 @@ bool tscIsProjectionQuery(SQueryInfo* pQueryInfo) {
return
true
;
}
bool
tscIsPointInterpQuery
(
SQueryInfo
*
pQueryInfo
)
{
bool
tscIsPointInterpQuery
(
SQuery
Node
Info
*
pQueryInfo
)
{
size_t
size
=
tscSqlExprNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
assert
(
pExpr
!=
NULL
);
int32_t
functionId
=
pExpr
->
functionId
;
int32_t
functionId
=
pExpr
->
base
.
functionId
;
if
(
functionId
==
TSDB_FUNC_TAG
)
{
continue
;
}
...
...
@@ -223,15 +223,15 @@ bool tscIsPointInterpQuery(SQueryInfo* pQueryInfo) {
return
true
;
}
bool
tscIsSecondStageQuery
(
SQueryInfo
*
pQueryInfo
)
{
bool
tscIsSecondStageQuery
(
SQuery
Node
Info
*
pQueryInfo
)
{
if
(
tscIsProjectionQuery
(
pQueryInfo
))
{
return
false
;
}
size_t
numOfOutput
=
tscNumOfFields
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
numOfOutput
;
++
i
)
{
SExprInfo
*
pExprInfo
=
tscFieldInfoGetInternalField
(
&
pQueryInfo
->
fieldsInfo
,
i
)
->
p
ArithExprInfo
;
if
(
pExprInfo
!=
NULL
)
{
SExprInfo
*
pExprInfo
=
tscFieldInfoGetInternalField
(
&
pQueryInfo
->
fieldsInfo
,
i
)
->
p
Expr
;
if
(
pExprInfo
->
pExpr
!=
NULL
)
{
return
true
;
}
}
...
...
@@ -239,7 +239,7 @@ bool tscIsSecondStageQuery(SQueryInfo* pQueryInfo) {
return
false
;
}
bool
tscGroupbyColumn
(
SQueryInfo
*
pQueryInfo
)
{
bool
tscGroupbyColumn
(
SQuery
Node
Info
*
pQueryInfo
)
{
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
int32_t
numOfCols
=
tscGetNumOfColumns
(
pTableMetaInfo
->
pTableMeta
);
...
...
@@ -254,16 +254,53 @@ bool tscGroupbyColumn(SQueryInfo* pQueryInfo) {
return
false
;
}
bool
tscIsT
WAQuery
(
SQuery
Info
*
pQueryInfo
)
{
bool
tscIsT
opBotQuery
(
SQueryNode
Info
*
pQueryInfo
)
{
size_t
numOfExprs
=
tscSqlExprNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
SExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
==
NULL
)
{
continue
;
}
if
(
pExpr
->
base
.
functionId
==
TSDB_FUNC_TS
)
{
continue
;
}
if
(
pExpr
->
base
.
functionId
==
TSDB_FUNC_TOP
||
pExpr
->
base
.
functionId
==
TSDB_FUNC_BOTTOM
)
{
return
true
;
}
}
return
false
;
}
bool
isTsCompQuery
(
SQueryNodeInfo
*
pQueryNodeInfo
)
{
size_t
numOfExprs
=
tscSqlExprNumOfExprs
(
pQueryNodeInfo
);
SExprInfo
*
pExpr1
=
tscSqlExprGet
(
pQueryNodeInfo
,
0
);
if
(
numOfExprs
!=
1
)
{
return
false
;
}
return
pExpr1
->
base
.
functionId
==
TSDB_FUNC_TS_COMP
;
}
bool
hasTagValOutput
(
SQueryNodeInfo
*
pQueryNodeInfo
)
{
size_t
numOfExprs
=
tscSqlExprNumOfExprs
(
pQueryNodeInfo
);
SExprInfo
*
pExpr1
=
tscSqlExprGet
(
pQueryNodeInfo
,
0
);
if
(
numOfExprs
==
1
&&
pExpr1
->
base
.
functionId
==
TSDB_FUNC_TS_COMP
)
{
return
true
;
}
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQuery
Info
,
i
);
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryNode
Info
,
i
);
if
(
pExpr
==
NULL
)
{
continue
;
}
int32_t
functionId
=
pExpr
->
functionId
;
if
(
functionId
==
TSDB_FUNC_TWA
)
{
// ts_comp column required the tag value for join filter
if
(
TSDB_COL_IS_TAG
(
pExpr
->
base
.
colInfo
.
flag
)
)
{
return
true
;
}
}
...
...
@@ -271,7 +308,116 @@ bool tscIsTWAQuery(SQueryInfo* pQueryInfo) {
return
false
;
}
void
tscClearInterpInfo
(
SQueryInfo
*
pQueryInfo
)
{
bool
timeWindowInterpoRequired
(
SQueryNodeInfo
*
pQueryNodeInfo
)
{
size_t
numOfExprs
=
tscSqlExprNumOfExprs
(
pQueryNodeInfo
);
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
SExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryNodeInfo
,
i
);
if
(
pExpr
==
NULL
)
{
continue
;
}
int32_t
functionId
=
pExpr
->
base
.
functionId
;
if
(
functionId
==
TSDB_FUNC_TWA
||
functionId
==
TSDB_FUNC_INTERP
)
{
return
true
;
}
}
return
false
;
}
bool
isStabledev
(
SQueryNodeInfo
*
pQueryNodeInfo
)
{
size_t
numOfExprs
=
tscSqlExprNumOfExprs
(
pQueryNodeInfo
);
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
SExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryNodeInfo
,
i
);
if
(
pExpr
==
NULL
)
{
continue
;
}
int32_t
functionId
=
pExpr
->
base
.
functionId
;
if
(
functionId
==
TSDB_FUNC_STDDEV_DST
)
{
return
true
;
}
}
return
false
;
}
bool
tscIsTWAQuery
(
SQueryNodeInfo
*
pQueryInfo
)
{
size_t
numOfExprs
=
tscSqlExprNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
SExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
==
NULL
)
{
continue
;
}
if
(
pExpr
->
base
.
functionId
==
TSDB_FUNC_TWA
)
{
return
true
;
}
}
return
false
;
}
bool
tscNeedReverseScan
(
SQueryNodeInfo
*
pQueryInfo
)
{
size_t
numOfExprs
=
tscSqlExprNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
SExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
==
NULL
)
{
continue
;
}
int32_t
functionId
=
pExpr
->
base
.
functionId
;
if
(
functionId
==
TSDB_FUNC_TS
||
functionId
==
TSDB_FUNC_TS_DUMMY
||
functionId
==
TSDB_FUNC_TAG
)
{
continue
;
}
if
((
functionId
==
TSDB_FUNC_FIRST
||
functionId
==
TSDB_FUNC_FIRST_DST
)
&&
pQueryInfo
->
order
.
order
==
TSDB_ORDER_DESC
)
{
return
true
;
}
if
(
functionId
==
TSDB_FUNC_LAST
||
functionId
==
TSDB_FUNC_LAST_DST
)
{
// the scan order to acquire the last result of the specified column
int32_t
order
=
(
int32_t
)
pExpr
->
base
.
param
[
0
].
i64
;
if
(
order
!=
pQueryInfo
->
order
.
order
)
{
return
true
;
}
}
}
return
false
;
}
bool
isSimpleAggregate
(
SQueryNodeInfo
*
pQueryNodeInfo
)
{
if
(
pQueryNodeInfo
->
interval
.
interval
>
0
)
{
return
false
;
}
// Note:top/bottom query is fixed output query
if
(
tscIsTopBotQuery
(
pQueryNodeInfo
)
||
tscGroupbyColumn
(
pQueryNodeInfo
)
||
isTsCompQuery
(
pQueryNodeInfo
))
{
return
true
;
}
size_t
numOfExprs
=
tscSqlExprNumOfExprs
(
pQueryNodeInfo
);
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
SExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryNodeInfo
,
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
;
}
void
tscClearInterpInfo
(
SQueryNodeInfo
*
pQueryInfo
)
{
if
(
!
tscIsPointInterpQuery
(
pQueryInfo
))
{
return
;
}
...
...
@@ -280,7 +426,7 @@ void tscClearInterpInfo(SQueryInfo* pQueryInfo) {
tfree
(
pQueryInfo
->
fillVal
);
}
int32_t
tscCreateResPointerInfo
(
SSqlRes
*
pRes
,
SQueryInfo
*
pQueryInfo
)
{
int32_t
tscCreateResPointerInfo
(
SSqlRes
*
pRes
,
SQuery
Node
Info
*
pQueryInfo
)
{
if
(
pRes
->
tsrow
==
NULL
)
{
pRes
->
numOfCols
=
pQueryInfo
->
fieldsInfo
.
numOfOutput
;
...
...
@@ -304,7 +450,7 @@ int32_t tscCreateResPointerInfo(SSqlRes* pRes, SQueryInfo* pQueryInfo) {
return
TSDB_CODE_SUCCESS
;
}
void
tscSetResRawPtr
(
SSqlRes
*
pRes
,
SQueryInfo
*
pQueryInfo
)
{
void
tscSetResRawPtr
(
SSqlRes
*
pRes
,
SQuery
Node
Info
*
pQueryInfo
)
{
assert
(
pRes
->
numOfCols
>
0
);
int32_t
offset
=
0
;
...
...
@@ -318,23 +464,23 @@ void tscSetResRawPtr(SSqlRes* pRes, SQueryInfo* pQueryInfo) {
offset
+=
pInfo
->
field
.
bytes
;
// generated the user-defined column result
if
(
pInfo
->
p
SqlExpr
!=
NULL
&&
TSDB_COL_IS_UD_COL
(
pInfo
->
pSqlExpr
->
colInfo
.
flag
))
{
if
(
pInfo
->
p
SqlExpr
->
param
[
1
].
nType
==
TSDB_DATA_TYPE_NULL
)
{
if
(
pInfo
->
p
Expr
->
pExpr
==
NULL
&&
TSDB_COL_IS_UD_COL
(
pInfo
->
pExpr
->
base
.
colInfo
.
flag
))
{
if
(
pInfo
->
p
Expr
->
base
.
param
[
1
].
nType
==
TSDB_DATA_TYPE_NULL
)
{
setNullN
(
pRes
->
urow
[
i
],
pInfo
->
field
.
type
,
pInfo
->
field
.
bytes
,
(
int32_t
)
pRes
->
numOfRows
);
}
else
{
if
(
pInfo
->
field
.
type
==
TSDB_DATA_TYPE_NCHAR
||
pInfo
->
field
.
type
==
TSDB_DATA_TYPE_BINARY
)
{
assert
(
pInfo
->
p
SqlExpr
->
param
[
1
].
nLen
<=
pInfo
->
field
.
bytes
);
assert
(
pInfo
->
p
Expr
->
base
.
param
[
1
].
nLen
<=
pInfo
->
field
.
bytes
);
for
(
int32_t
k
=
0
;
k
<
pRes
->
numOfRows
;
++
k
)
{
char
*
p
=
((
char
**
)
pRes
->
urow
)[
i
]
+
k
*
pInfo
->
field
.
bytes
;
memcpy
(
varDataVal
(
p
),
pInfo
->
p
SqlExpr
->
param
[
1
].
pz
,
pInfo
->
pSqlExpr
->
param
[
1
].
nLen
);
varDataSetLen
(
p
,
pInfo
->
p
SqlExpr
->
param
[
1
].
nLen
);
memcpy
(
varDataVal
(
p
),
pInfo
->
p
Expr
->
base
.
param
[
1
].
pz
,
pInfo
->
pExpr
->
base
.
param
[
1
].
nLen
);
varDataSetLen
(
p
,
pInfo
->
p
Expr
->
base
.
param
[
1
].
nLen
);
}
}
else
{
for
(
int32_t
k
=
0
;
k
<
pRes
->
numOfRows
;
++
k
)
{
char
*
p
=
((
char
**
)
pRes
->
urow
)[
i
]
+
k
*
pInfo
->
field
.
bytes
;
memcpy
(
p
,
&
pInfo
->
p
SqlExpr
->
param
[
1
].
i64
,
pInfo
->
field
.
bytes
);
memcpy
(
p
,
&
pInfo
->
p
Expr
->
base
.
param
[
1
].
i64
,
pInfo
->
field
.
bytes
);
}
}
}
...
...
@@ -388,10 +534,10 @@ static SColumnInfo* extractColumnInfoFromResult(STableMeta* pTableMeta, SArray*
return
pColInfo
;
}
void
prepareInputDataFromUpstream
(
SSqlRes
*
pRes
,
SQueryInfo
*
pQueryInfo
)
{
void
prepareInputDataFromUpstream
(
SSqlRes
*
pRes
,
SQuery
Node
Info
*
pQueryInfo
)
{
if
(
pQueryInfo
->
pDownstream
!=
NULL
&&
taosArrayGetSize
(
pQueryInfo
->
pDownstream
)
>
0
)
{
// handle the following query process
SQueryInfo
*
px
=
taosArrayGetP
(
pQueryInfo
->
pDownstream
,
0
);
SQuery
Node
Info
*
px
=
taosArrayGetP
(
pQueryInfo
->
pDownstream
,
0
);
printf
(
"%d
\n
"
,
px
->
type
);
SColumnInfo
*
colInfo
=
extractColumnInfoFromResult
(
px
->
pTableMetaInfo
[
0
]
->
pTableMeta
,
px
->
colList
);
...
...
@@ -404,6 +550,20 @@ void prepareInputDataFromUpstream(SSqlRes* pRes, SQueryInfo* pQueryInfo) {
SQueriedTableInfo
info
=
{.
colList
=
colInfo
,
.
numOfCols
=
numOfCols
,};
/*int32_t code = */
createQueryFunc
(
&
info
,
numOfOutput
,
&
exprInfo
,
px
->
exprList
->
pData
,
NULL
,
px
->
type
,
NULL
);
tsCreateSQLFunctionCtx
(
px
,
pCtx
);
STableGroupInfo
tableGroupInfo
=
{
0
};
tableGroupInfo
.
numOfTables
=
1
;
tableGroupInfo
.
pGroupList
=
taosArrayInit
(
1
,
POINTER_BYTES
);
SArray
*
group
=
taosArrayInit
(
1
,
sizeof
(
STableKeyInfo
));
STableKeyInfo
tableKeyInfo
=
{.
pTable
=
NULL
,
.
lastKey
=
INT64_MIN
};
taosArrayPush
(
group
,
&
tableKeyInfo
);
taosArrayPush
(
tableGroupInfo
.
pGroupList
,
&
group
);
SQInfo
*
pQInfo
=
createQueryInfoFromQueryNode
(
px
,
exprInfo
,
&
tableGroupInfo
,
0
,
NULL
);
printf
(
"%p
\n
"
,
pQInfo
);
}
}
...
...
@@ -440,7 +600,7 @@ void tscFreeQueryInfo(SSqlCmd* pCmd, bool removeMeta) {
}
for
(
int32_t
i
=
0
;
i
<
pCmd
->
numOfClause
;
++
i
)
{
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
i
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
i
);
freeQueryInfoImpl
(
pQueryInfo
);
clearAllTableMetaInfo
(
pQueryInfo
,
removeMeta
);
...
...
@@ -705,7 +865,7 @@ int32_t tscCopyDataBlockToPayload(SSqlObj* pSql, STableDataBlocks* pDataBlock) {
return
TSDB_CODE_SUCCESS
;
}
SQueryInfo
*
tscGetActiveQueryInfo
(
SSqlCmd
*
pCmd
)
{
SQuery
Node
Info
*
tscGetActiveQueryInfo
(
SSqlCmd
*
pCmd
)
{
return
pCmd
->
active
;
}
...
...
@@ -1023,11 +1183,7 @@ SInternalField* tscFieldInfoAppend(SFieldInfo* pFieldInfo, TAOS_FIELD* pField) {
assert
(
pFieldInfo
!=
NULL
);
pFieldInfo
->
numOfOutput
++
;
struct
SInternalField
info
=
{
.
pSqlExpr
=
NULL
,
.
pArithExprInfo
=
NULL
,
.
visible
=
true
,
};
struct
SInternalField
info
=
{
.
pExpr
=
NULL
,
.
visible
=
true
};
info
.
field
=
*
pField
;
return
taosArrayPush
(
pFieldInfo
->
internalField
,
&
info
);
...
...
@@ -1035,27 +1191,23 @@ SInternalField* tscFieldInfoAppend(SFieldInfo* pFieldInfo, TAOS_FIELD* pField) {
SInternalField
*
tscFieldInfoInsert
(
SFieldInfo
*
pFieldInfo
,
int32_t
index
,
TAOS_FIELD
*
field
)
{
pFieldInfo
->
numOfOutput
++
;
struct
SInternalField
info
=
{
.
pSqlExpr
=
NULL
,
.
pArithExprInfo
=
NULL
,
.
visible
=
true
,
};
struct
SInternalField
info
=
{
.
pExpr
=
NULL
,
.
visible
=
true
};
info
.
field
=
*
field
;
return
taosArrayInsert
(
pFieldInfo
->
internalField
,
index
,
&
info
);
}
void
tscFieldInfoUpdateOffset
(
SQueryInfo
*
pQueryInfo
)
{
void
tscFieldInfoUpdateOffset
(
SQuery
Node
Info
*
pQueryInfo
)
{
size_t
numOfExprs
=
tscSqlExprNumOfExprs
(
pQueryInfo
);
S
SqlExpr
*
pExpr
=
taosArrayGetP
(
pQueryInfo
->
exprList
,
0
);
pExpr
->
offset
=
0
;
S
ExprInfo
*
pExpr
=
taosArrayGetP
(
pQueryInfo
->
exprList
,
0
);
pExpr
->
base
.
offset
=
0
;
for
(
int32_t
i
=
1
;
i
<
numOfExprs
;
++
i
)
{
S
SqlExpr
*
prev
=
taosArrayGetP
(
pQueryInfo
->
exprList
,
i
-
1
);
S
SqlExpr
*
p
=
taosArrayGetP
(
pQueryInfo
->
exprList
,
i
);
S
ExprInfo
*
prev
=
taosArrayGetP
(
pQueryInfo
->
exprList
,
i
-
1
);
S
ExprInfo
*
p
=
taosArrayGetP
(
pQueryInfo
->
exprList
,
i
);
p
->
offset
=
prev
->
offset
+
prev
->
resBytes
;
p
->
base
.
offset
=
prev
->
base
.
offset
+
prev
->
base
.
resBytes
;
}
}
...
...
@@ -1069,11 +1221,11 @@ TAOS_FIELD* tscFieldInfoGetField(SFieldInfo* pFieldInfo, int32_t index) {
return
&
((
SInternalField
*
)
TARRAY_GET_ELEM
(
pFieldInfo
->
internalField
,
index
))
->
field
;
}
int16_t
tscFieldInfoGetOffset
(
SQueryInfo
*
pQueryInfo
,
int32_t
index
)
{
int16_t
tscFieldInfoGetOffset
(
SQuery
Node
Info
*
pQueryInfo
,
int32_t
index
)
{
SInternalField
*
pInfo
=
tscFieldInfoGetInternalField
(
&
pQueryInfo
->
fieldsInfo
,
index
);
assert
(
pInfo
!=
NULL
&&
pInfo
->
p
SqlExpr
!
=
NULL
);
assert
(
pInfo
!=
NULL
&&
pInfo
->
p
Expr
->
pExpr
=
=
NULL
);
return
pInfo
->
p
SqlExpr
->
offset
;
return
pInfo
->
p
Expr
->
base
.
offset
;
}
int32_t
tscFieldInfoCompare
(
const
SFieldInfo
*
pFieldInfo1
,
const
SFieldInfo
*
pFieldInfo2
)
{
...
...
@@ -1105,8 +1257,8 @@ int32_t tscGetResRowLength(SArray* pExprList) {
int32_t
size
=
0
;
for
(
int32_t
i
=
0
;
i
<
num
;
++
i
)
{
S
SqlExpr
*
pExpr
=
taosArrayGetP
(
pExprList
,
i
);
size
+=
pExpr
->
resBytes
;
S
ExprInfo
*
pExpr
=
taosArrayGetP
(
pExprList
,
i
);
size
+=
pExpr
->
base
.
resBytes
;
}
return
size
;
...
...
@@ -1120,15 +1272,15 @@ void tscFieldInfoClear(SFieldInfo* pFieldInfo) {
for
(
int32_t
i
=
0
;
i
<
pFieldInfo
->
numOfOutput
;
++
i
)
{
SInternalField
*
pInfo
=
taosArrayGet
(
pFieldInfo
->
internalField
,
i
);
if
(
pInfo
->
p
ArithExprInfo
!=
NULL
)
{
tExprTreeDestroy
(
pInfo
->
p
ArithExprInfo
->
pExpr
,
NULL
);
if
(
pInfo
->
p
Expr
!=
NULL
&&
pInfo
->
pExpr
->
pExpr
!=
NULL
)
{
tExprTreeDestroy
(
pInfo
->
p
Expr
->
pExpr
,
NULL
);
SSqlExpr
*
p
FuncMsg
=
&
pInfo
->
pArithExprInfo
->
base
;
for
(
int32_t
j
=
0
;
j
<
p
FuncMsg
->
numOfParams
;
++
j
)
{
tVariantDestroy
(
&
p
FuncMsg
->
param
[
j
]);
SSqlExpr
*
p
SqlExpr
=
&
pInfo
->
pExpr
->
base
;
for
(
int32_t
j
=
0
;
j
<
p
SqlExpr
->
numOfParams
;
++
j
)
{
tVariantDestroy
(
&
p
SqlExpr
->
param
[
j
]);
}
tfree
(
pInfo
->
p
ArithExprInfo
);
tfree
(
pInfo
->
p
Expr
->
pExpr
);
}
}
...
...
@@ -1138,57 +1290,58 @@ void tscFieldInfoClear(SFieldInfo* pFieldInfo) {
memset
(
pFieldInfo
,
0
,
sizeof
(
SFieldInfo
));
}
static
S
SqlExpr
*
doCreateSqlExpr
(
SQuery
Info
*
pQueryInfo
,
int16_t
functionId
,
SColumnIndex
*
pColIndex
,
int16_t
type
,
static
S
ExprInfo
*
doCreateSqlExpr
(
SQueryNode
Info
*
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
);
S
SqlExpr
*
pExpr
=
calloc
(
1
,
sizeof
(
SSqlExpr
));
S
ExprInfo
*
pExpr
=
calloc
(
1
,
sizeof
(
SExprInfo
));
if
(
pExpr
==
NULL
)
{
return
NULL
;
}
pExpr
->
functionId
=
functionId
;
SSqlExpr
*
p
=
&
pExpr
->
base
;
p
->
functionId
=
functionId
;
// set the correct columnIndex index
if
(
pColIndex
->
columnIndex
==
TSDB_TBNAME_COLUMN_INDEX
)
{
SSchema
*
s
=
tGetTbnameColumnSchema
();
p
Expr
->
colInfo
.
colId
=
TSDB_TBNAME_COLUMN_INDEX
;
p
Expr
->
colBytes
=
s
->
bytes
;
p
Expr
->
colType
=
s
->
type
;
p
->
colInfo
.
colId
=
TSDB_TBNAME_COLUMN_INDEX
;
p
->
colBytes
=
s
->
bytes
;
p
->
colType
=
s
->
type
;
}
else
if
(
pColIndex
->
columnIndex
==
TSDB_BLOCK_DIST_COLUMN_INDEX
)
{
SSchema
s
=
tGetBlockDistColumnSchema
();
p
Expr
->
colInfo
.
colId
=
TSDB_BLOCK_DIST_COLUMN_INDEX
;
p
Expr
->
colBytes
=
s
.
bytes
;
p
Expr
->
colType
=
s
.
type
;
p
->
colInfo
.
colId
=
TSDB_BLOCK_DIST_COLUMN_INDEX
;
p
->
colBytes
=
s
.
bytes
;
p
->
colType
=
s
.
type
;
}
else
if
(
pColIndex
->
columnIndex
<=
TSDB_UD_COLUMN_INDEX
)
{
p
Expr
->
colInfo
.
colId
=
pColIndex
->
columnIndex
;
p
Expr
->
colBytes
=
size
;
p
Expr
->
colType
=
type
;
p
->
colInfo
.
colId
=
pColIndex
->
columnIndex
;
p
->
colBytes
=
size
;
p
->
colType
=
type
;
}
else
{
if
(
TSDB_COL_IS_TAG
(
colType
))
{
SSchema
*
pSchema
=
tscGetTableTagSchema
(
pTableMetaInfo
->
pTableMeta
);
p
Expr
->
colInfo
.
colId
=
pSchema
[
pColIndex
->
columnIndex
].
colId
;
p
Expr
->
colBytes
=
pSchema
[
pColIndex
->
columnIndex
].
bytes
;
p
Expr
->
colType
=
pSchema
[
pColIndex
->
columnIndex
].
type
;
tstrncpy
(
p
Expr
->
colInfo
.
name
,
pSchema
[
pColIndex
->
columnIndex
].
name
,
sizeof
(
pExpr
->
colInfo
.
name
));
p
->
colInfo
.
colId
=
pSchema
[
pColIndex
->
columnIndex
].
colId
;
p
->
colBytes
=
pSchema
[
pColIndex
->
columnIndex
].
bytes
;
p
->
colType
=
pSchema
[
pColIndex
->
columnIndex
].
type
;
tstrncpy
(
p
->
colInfo
.
name
,
pSchema
[
pColIndex
->
columnIndex
].
name
,
sizeof
(
p
->
colInfo
.
name
));
}
else
if
(
pTableMetaInfo
->
pTableMeta
!=
NULL
)
{
// in handling select database/version/server_status(), the pTableMeta is NULL
SSchema
*
pSchema
=
tscGetTableColumnSchema
(
pTableMetaInfo
->
pTableMeta
,
pColIndex
->
columnIndex
);
p
Expr
->
colInfo
.
colId
=
pSchema
->
colId
;
p
Expr
->
colBytes
=
pSchema
->
bytes
;
p
Expr
->
colType
=
pSchema
->
type
;
tstrncpy
(
p
Expr
->
colInfo
.
name
,
pSchema
->
name
,
sizeof
(
pExpr
->
colInfo
.
name
));
p
->
colInfo
.
colId
=
pSchema
->
colId
;
p
->
colBytes
=
pSchema
->
bytes
;
p
->
colType
=
pSchema
->
type
;
tstrncpy
(
p
->
colInfo
.
name
,
pSchema
->
name
,
sizeof
(
p
->
colInfo
.
name
));
}
}
p
Expr
->
colInfo
.
flag
=
colType
;
p
Expr
->
colInfo
.
colIndex
=
pColIndex
->
columnIndex
;
p
->
colInfo
.
flag
=
colType
;
p
->
colInfo
.
colIndex
=
pColIndex
->
columnIndex
;
p
Expr
->
resType
=
type
;
p
Expr
->
resBytes
=
size
;
p
Expr
->
resColId
=
resColId
;
p
Expr
->
interBytes
=
interSize
;
p
->
resType
=
type
;
p
->
resBytes
=
size
;
p
->
resColId
=
resColId
;
p
->
interBytes
=
interSize
;
if
(
pTableMetaInfo
->
pTableMeta
)
{
pExpr
->
uid
=
pTableMetaInfo
->
pTableMeta
->
id
.
uid
;
...
...
@@ -1197,53 +1350,54 @@ static SSqlExpr* doCreateSqlExpr(SQueryInfo* pQueryInfo, int16_t functionId, SCo
return
pExpr
;
}
S
SqlExpr
*
tscSqlExprInsert
(
SQuery
Info
*
pQueryInfo
,
int32_t
index
,
int16_t
functionId
,
SColumnIndex
*
pColIndex
,
int16_t
type
,
S
ExprInfo
*
tscSqlExprInsert
(
SQueryNode
Info
*
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
tscSqlExprAppend
(
pQueryInfo
,
functionId
,
pColIndex
,
type
,
size
,
resColId
,
interSize
,
isTagCol
);
}
S
SqlExpr
*
pExpr
=
doCreateSqlExpr
(
pQueryInfo
,
functionId
,
pColIndex
,
type
,
size
,
resColId
,
interSize
,
isTagCol
);
S
ExprInfo
*
pExpr
=
doCreateSqlExpr
(
pQueryInfo
,
functionId
,
pColIndex
,
type
,
size
,
resColId
,
interSize
,
isTagCol
);
taosArrayInsert
(
pQueryInfo
->
exprList
,
index
,
&
pExpr
);
return
pExpr
;
}
S
SqlExpr
*
tscSqlExprAppend
(
SQuery
Info
*
pQueryInfo
,
int16_t
functionId
,
SColumnIndex
*
pColIndex
,
int16_t
type
,
S
ExprInfo
*
tscSqlExprAppend
(
SQueryNode
Info
*
pQueryInfo
,
int16_t
functionId
,
SColumnIndex
*
pColIndex
,
int16_t
type
,
int16_t
size
,
int16_t
resColId
,
int16_t
interSize
,
bool
isTagCol
)
{
S
SqlExpr
*
pExpr
=
doCreateSqlExpr
(
pQueryInfo
,
functionId
,
pColIndex
,
type
,
size
,
resColId
,
interSize
,
isTagCol
);
S
ExprInfo
*
pExpr
=
doCreateSqlExpr
(
pQueryInfo
,
functionId
,
pColIndex
,
type
,
size
,
resColId
,
interSize
,
isTagCol
);
taosArrayPush
(
pQueryInfo
->
exprList
,
&
pExpr
);
return
pExpr
;
}
S
SqlExpr
*
tscSqlExprUpdate
(
SQuery
Info
*
pQueryInfo
,
int32_t
index
,
int16_t
functionId
,
int16_t
srcColumnIndex
,
S
ExprInfo
*
tscSqlExprUpdate
(
SQueryNode
Info
*
pQueryInfo
,
int32_t
index
,
int16_t
functionId
,
int16_t
srcColumnIndex
,
int16_t
type
,
int16_t
size
)
{
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
index
);
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
index
);
if
(
pExpr
==
NULL
)
{
return
NULL
;
}
pExpr
->
functionId
=
functionId
;
SSqlExpr
*
pse
=
&
pExpr
->
base
;
pse
->
functionId
=
functionId
;
p
Expr
->
colInfo
.
colIndex
=
srcColumnIndex
;
p
Expr
->
colInfo
.
colId
=
tscGetTableColumnSchema
(
pTableMetaInfo
->
pTableMeta
,
srcColumnIndex
)
->
colId
;
p
se
->
colInfo
.
colIndex
=
srcColumnIndex
;
p
se
->
colInfo
.
colId
=
tscGetTableColumnSchema
(
pTableMetaInfo
->
pTableMeta
,
srcColumnIndex
)
->
colId
;
p
Expr
->
resType
=
type
;
p
Expr
->
resBytes
=
size
;
p
se
->
resType
=
type
;
p
se
->
resBytes
=
size
;
return
pExpr
;
}
bool
tscMultiRoundQuery
(
SQueryInfo
*
pQueryInfo
,
int32_t
index
)
{
bool
tscMultiRoundQuery
(
SQuery
Node
Info
*
pQueryInfo
,
int32_t
index
)
{
if
(
!
UTIL_TABLE_IS_SUPER_TABLE
(
pQueryInfo
->
pTableMetaInfo
[
index
]))
{
return
false
;
}
int32_t
numOfExprs
=
(
int32_t
)
tscSqlExprNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
functionId
==
TSDB_FUNC_STDDEV_DST
)
{
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
if
(
pExpr
->
base
.
functionId
==
TSDB_FUNC_STDDEV_DST
)
{
return
true
;
}
}
...
...
@@ -1251,7 +1405,7 @@ bool tscMultiRoundQuery(SQueryInfo* pQueryInfo, int32_t index) {
return
false
;
}
size_t
tscSqlExprNumOfExprs
(
SQueryInfo
*
pQueryInfo
)
{
size_t
tscSqlExprNumOfExprs
(
SQuery
Node
Info
*
pQueryInfo
)
{
return
taosArrayGetSize
(
pQueryInfo
->
exprList
);
}
...
...
@@ -1266,17 +1420,18 @@ void addExprParams(SSqlExpr* pExpr, char* argument, int32_t type, int32_t bytes)
assert
(
pExpr
->
numOfParams
<=
3
);
}
S
SqlExpr
*
tscSqlExprGet
(
SQuery
Info
*
pQueryInfo
,
int32_t
index
)
{
S
ExprInfo
*
tscSqlExprGet
(
SQueryNode
Info
*
pQueryInfo
,
int32_t
index
)
{
return
taosArrayGetP
(
pQueryInfo
->
exprList
,
index
);
}
void
*
sqlExprDestroy
(
S
SqlExpr
*
pExpr
)
{
void
*
sqlExprDestroy
(
S
ExprInfo
*
pExpr
)
{
if
(
pExpr
==
NULL
)
{
return
NULL
;
}
for
(
int32_t
i
=
0
;
i
<
tListLen
(
pExpr
->
param
);
++
i
)
{
tVariantDestroy
(
&
pExpr
->
param
[
i
]);
SSqlExpr
*
p
=
&
pExpr
->
base
;
for
(
int32_t
i
=
0
;
i
<
tListLen
(
p
->
param
);
++
i
)
{
tVariantDestroy
(
&
p
->
param
[
i
]);
}
tfree
(
pExpr
);
...
...
@@ -1285,13 +1440,13 @@ void* sqlExprDestroy(SSqlExpr* pExpr) {
}
/*
* NOTE: Does not release S
Sql
ExprInfo here.
* NOTE: Does not release SExprInfo here.
*/
void
tscSqlExprInfoDestroy
(
SArray
*
pExprInfo
)
{
size_t
size
=
taosArrayGetSize
(
pExprInfo
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
S
SqlExpr
*
pExpr
=
taosArrayGetP
(
pExprInfo
,
i
);
S
ExprInfo
*
pExpr
=
taosArrayGetP
(
pExprInfo
,
i
);
sqlExprDestroy
(
pExpr
);
}
...
...
@@ -1303,34 +1458,38 @@ int32_t tscSqlExprCopy(SArray* dst, const SArray* src, uint64_t uid, bool deepco
size_t
size
=
taosArrayGetSize
(
src
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
S
SqlExpr
*
pExpr
=
taosArrayGetP
(
src
,
i
);
S
ExprInfo
*
pExpr
=
taosArrayGetP
(
src
,
i
);
if
(
pExpr
->
uid
==
uid
)
{
if
(
deepcopy
)
{
SSqlExpr
*
p1
=
calloc
(
1
,
sizeof
(
SSqlExpr
));
if
(
p1
==
NULL
)
{
return
-
1
;
}
*
p1
=
*
pExpr
;
memset
(
p1
->
param
,
0
,
sizeof
(
tVariant
)
*
tListLen
(
p1
->
param
));
SExprInfo
*
p1
=
calloc
(
1
,
sizeof
(
SExprInfo
));
tscSqlExprAssign
(
p1
,
pExpr
);
for
(
int32_t
j
=
0
;
j
<
pExpr
->
numOfParams
;
++
j
)
{
tVariantAssign
(
&
p1
->
param
[
j
],
&
pExpr
->
param
[
j
]);
}
taosArrayPush
(
dst
,
&
p1
);
}
else
{
taosArrayPush
(
dst
,
&
pExpr
);
}
}
}
return
0
;
}
SColumn
*
tscColumnListInsert
(
SArray
*
pColumnList
,
SColumnIndex
*
pColIndex
)
{
void
tscSqlExprAssign
(
SExprInfo
*
dst
,
const
SExprInfo
*
src
)
{
assert
(
dst
!=
NULL
&&
src
!=
NULL
);
*
dst
=
*
src
;
memset
(
dst
->
base
.
param
,
0
,
sizeof
(
tVariant
)
*
tListLen
(
dst
->
base
.
param
));
for
(
int32_t
j
=
0
;
j
<
src
->
base
.
numOfParams
;
++
j
)
{
tVariantAssign
(
&
dst
->
base
.
param
[
j
],
&
src
->
base
.
param
[
j
]);
}
}
// TODO refactor
SColumn
*
tscColumnListInsert
(
SArray
*
pColumnList
,
SColumnIndex
*
pColIndex
,
SSchema
*
pSchema
)
{
// ignore the tbname columnIndex to be inserted into source list
if
(
pColIndex
->
columnIndex
<
0
)
{
return
NULL
;
...
...
@@ -1358,6 +1517,10 @@ SColumn* tscColumnListInsert(SArray* pColumnList, SColumnIndex* pColIndex) {
}
b
->
colIndex
=
*
pColIndex
;
b
->
info
.
colId
=
pSchema
->
colId
;
b
->
info
.
bytes
=
pSchema
->
bytes
;
b
->
info
.
type
=
pSchema
->
type
;
taosArrayInsert
(
pColumnList
,
i
,
&
b
);
}
else
{
SColumn
*
pCol
=
taosArrayGetP
(
pColumnList
,
i
);
...
...
@@ -1369,6 +1532,10 @@ SColumn* tscColumnListInsert(SArray* pColumnList, SColumnIndex* pColIndex) {
}
b
->
colIndex
=
*
pColIndex
;
b
->
info
.
colId
=
pSchema
->
colId
;
b
->
info
.
bytes
=
pSchema
->
bytes
;
b
->
info
.
type
=
pSchema
->
type
;
taosArrayInsert
(
pColumnList
,
i
,
&
b
);
}
}
...
...
@@ -1394,15 +1561,15 @@ SColumn* tscColumnClone(const SColumn* src) {
return
NULL
;
}
dst
->
colIndex
=
src
->
colIndex
;
dst
->
numOfFilters
=
src
->
numOfFilters
;
dst
->
filterInfo
=
tFilterInfoDup
(
src
->
filterInfo
,
src
->
numOfFilters
);
dst
->
colIndex
=
src
->
colIndex
;
dst
->
info
.
numOfFilters
=
src
->
info
.
numOfFilters
;
dst
->
info
.
filterInfo
=
tFilterInfoDup
(
src
->
info
.
filterInfo
,
src
->
info
.
numOfFilters
);
return
dst
;
}
static
void
tscColumnDestroy
(
SColumn
*
pCol
)
{
destroyFilterInfo
(
pCol
->
filterInfo
,
pCol
->
numOfFilters
);
destroyFilterInfo
(
pCol
->
info
.
filterInfo
,
pCol
->
info
.
numOfFilters
);
free
(
pCol
);
}
...
...
@@ -1683,22 +1850,22 @@ void tscTagCondRelease(STagCond* pTagCond) {
memset
(
pTagCond
,
0
,
sizeof
(
STagCond
));
}
void
tscGetSrcColumnInfo
(
SSrcColumnInfo
*
pColInfo
,
SQueryInfo
*
pQueryInfo
)
{
void
tscGetSrcColumnInfo
(
SSrcColumnInfo
*
pColInfo
,
SQuery
Node
Info
*
pQueryInfo
)
{
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
SSchema
*
pSchema
=
tscGetTableSchema
(
pTableMetaInfo
->
pTableMeta
);
size_t
numOfExprs
=
tscSqlExprNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
pColInfo
[
i
].
functionId
=
pExpr
->
functionId
;
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
pColInfo
[
i
].
functionId
=
pExpr
->
base
.
functionId
;
if
(
TSDB_COL_IS_TAG
(
pExpr
->
colInfo
.
flag
))
{
if
(
TSDB_COL_IS_TAG
(
pExpr
->
base
.
colInfo
.
flag
))
{
SSchema
*
pTagSchema
=
tscGetTableTagSchema
(
pTableMetaInfo
->
pTableMeta
);
int16_t
index
=
pExpr
->
colInfo
.
colIndex
;
int16_t
index
=
pExpr
->
base
.
colInfo
.
colIndex
;
pColInfo
[
i
].
type
=
(
index
!=
-
1
)
?
pTagSchema
[
index
].
type
:
TSDB_DATA_TYPE_BINARY
;
}
else
{
pColInfo
[
i
].
type
=
pSchema
[
pExpr
->
colInfo
.
colIndex
].
type
;
pColInfo
[
i
].
type
=
pSchema
[
pExpr
->
base
.
colInfo
.
colIndex
].
type
;
}
}
}
...
...
@@ -1748,11 +1915,11 @@ STableMetaInfo* tscGetTableMetaInfoFromCmd(SSqlCmd* pCmd, int32_t clauseIndex, i
assert
(
clauseIndex
>=
0
&&
clauseIndex
<
pCmd
->
numOfClause
);
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
clauseIndex
);
return
tscGetMetaInfo
(
pQueryInfo
,
tableIndex
);
}
STableMetaInfo
*
tscGetMetaInfo
(
SQueryInfo
*
pQueryInfo
,
int32_t
tableIndex
)
{
STableMetaInfo
*
tscGetMetaInfo
(
SQuery
Node
Info
*
pQueryInfo
,
int32_t
tableIndex
)
{
assert
(
pQueryInfo
!=
NULL
);
if
(
pQueryInfo
->
pTableMetaInfo
==
NULL
)
{
...
...
@@ -1765,8 +1932,8 @@ STableMetaInfo* tscGetMetaInfo(SQueryInfo* pQueryInfo, int32_t tableIndex) {
return
pQueryInfo
->
pTableMetaInfo
[
tableIndex
];
}
SQueryInfo
*
tscGetQueryInfoS
(
SSqlCmd
*
pCmd
,
int32_t
subClauseIndex
)
{
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
subClauseIndex
);
SQuery
Node
Info
*
tscGetQueryInfoS
(
SSqlCmd
*
pCmd
,
int32_t
subClauseIndex
)
{
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
subClauseIndex
);
int32_t
ret
=
TSDB_CODE_SUCCESS
;
while
((
pQueryInfo
)
==
NULL
)
{
...
...
@@ -1781,7 +1948,7 @@ SQueryInfo* tscGetQueryInfoS(SSqlCmd* pCmd, int32_t subClauseIndex) {
return
pQueryInfo
;
}
STableMetaInfo
*
tscGetTableMetaInfoByUid
(
SQueryInfo
*
pQueryInfo
,
uint64_t
uid
,
int32_t
*
index
)
{
STableMetaInfo
*
tscGetTableMetaInfoByUid
(
SQuery
Node
Info
*
pQueryInfo
,
uint64_t
uid
,
int32_t
*
index
)
{
int32_t
k
=
-
1
;
for
(
int32_t
i
=
0
;
i
<
pQueryInfo
->
numOfTables
;
++
i
)
{
...
...
@@ -1799,7 +1966,7 @@ STableMetaInfo* tscGetTableMetaInfoByUid(SQueryInfo* pQueryInfo, uint64_t uid, i
return
tscGetMetaInfo
(
pQueryInfo
,
k
);
}
void
tscInitQueryInfo
(
SQueryInfo
*
pQueryInfo
)
{
void
tscInitQueryInfo
(
SQuery
Node
Info
*
pQueryInfo
)
{
assert
(
pQueryInfo
->
fieldsInfo
.
internalField
==
NULL
);
pQueryInfo
->
fieldsInfo
.
internalField
=
taosArrayInit
(
4
,
sizeof
(
SInternalField
));
...
...
@@ -1829,9 +1996,9 @@ int32_t tscAddQueryInfo(SSqlCmd* pCmd) {
return
TSDB_CODE_TSC_OUT_OF_MEMORY
;
}
pCmd
->
pQueryInfo
=
(
SQueryInfo
**
)
tmp
;
pCmd
->
pQueryInfo
=
(
SQuery
Node
Info
**
)
tmp
;
SQuery
Info
*
pQueryInfo
=
calloc
(
1
,
sizeof
(
SQuery
Info
));
SQuery
NodeInfo
*
pQueryInfo
=
calloc
(
1
,
sizeof
(
SQueryNode
Info
));
if
(
pQueryInfo
==
NULL
)
{
return
TSDB_CODE_TSC_OUT_OF_MEMORY
;
}
...
...
@@ -1845,7 +2012,7 @@ int32_t tscAddQueryInfo(SSqlCmd* pCmd) {
return
TSDB_CODE_SUCCESS
;
}
static
void
freeQueryInfoImpl
(
SQueryInfo
*
pQueryInfo
)
{
static
void
freeQueryInfoImpl
(
SQuery
Node
Info
*
pQueryInfo
)
{
tscTagCondRelease
(
&
pQueryInfo
->
tagCond
);
tscFieldInfoClear
(
&
pQueryInfo
->
fieldsInfo
);
...
...
@@ -1869,7 +2036,7 @@ static void freeQueryInfoImpl(SQueryInfo* pQueryInfo) {
void
tscClearSubqueryInfo
(
SSqlCmd
*
pCmd
)
{
for
(
int32_t
i
=
0
;
i
<
pCmd
->
numOfClause
;
++
i
)
{
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
i
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
i
);
freeQueryInfoImpl
(
pQueryInfo
);
}
}
...
...
@@ -1938,7 +2105,7 @@ SArray* tscVgroupTableInfoDup(SArray* pVgroupTables) {
return
pa
;
}
void
clearAllTableMetaInfo
(
SQueryInfo
*
pQueryInfo
,
bool
removeMeta
)
{
void
clearAllTableMetaInfo
(
SQuery
Node
Info
*
pQueryInfo
,
bool
removeMeta
)
{
for
(
int32_t
i
=
0
;
i
<
pQueryInfo
->
numOfTables
;
++
i
)
{
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
i
);
...
...
@@ -1957,7 +2124,7 @@ void clearAllTableMetaInfo(SQueryInfo* pQueryInfo, bool removeMeta) {
tfree
(
pQueryInfo
->
pTableMetaInfo
);
}
STableMetaInfo
*
tscAddTableMetaInfo
(
SQueryInfo
*
pQueryInfo
,
SName
*
name
,
STableMeta
*
pTableMeta
,
STableMetaInfo
*
tscAddTableMetaInfo
(
SQuery
Node
Info
*
pQueryInfo
,
SName
*
name
,
STableMeta
*
pTableMeta
,
SVgroupsInfo
*
vgroupList
,
SArray
*
pTagCols
,
SArray
*
pVgroupTables
)
{
void
*
pAlloc
=
realloc
(
pQueryInfo
->
pTableMetaInfo
,
(
pQueryInfo
->
numOfTables
+
1
)
*
POINTER_BYTES
);
if
(
pAlloc
==
NULL
)
{
...
...
@@ -2000,7 +2167,7 @@ STableMetaInfo* tscAddTableMetaInfo(SQueryInfo* pQueryInfo, SName* name, STableM
return
pTableMetaInfo
;
}
STableMetaInfo
*
tscAddEmptyMetaInfo
(
SQueryInfo
*
pQueryInfo
)
{
STableMetaInfo
*
tscAddEmptyMetaInfo
(
SQuery
Node
Info
*
pQueryInfo
)
{
return
tscAddTableMetaInfo
(
pQueryInfo
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
);
}
...
...
@@ -2071,7 +2238,7 @@ SSqlObj* createSimpleSubObj(SSqlObj* pSql, __async_cb_func_t fp, void* param, in
pNew
->
sqlstr
=
NULL
;
pNew
->
maxRetry
=
TSDB_MAX_REPLICA
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfoS
(
pCmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfoS
(
pCmd
,
0
);
assert
(
pSql
->
cmd
.
clauseIndex
==
0
);
STableMetaInfo
*
pMasterTableMetaInfo
=
tscGetTableMetaInfoFromCmd
(
&
pSql
->
cmd
,
pSql
->
cmd
.
clauseIndex
,
0
);
...
...
@@ -2082,7 +2249,7 @@ SSqlObj* createSimpleSubObj(SSqlObj* pSql, __async_cb_func_t fp, void* param, in
return
pNew
;
}
static
void
doSetSqlExprAndResultFieldInfo
(
SQueryInfo
*
pNewQueryInfo
,
int64_t
uid
)
{
static
void
doSetSqlExprAndResultFieldInfo
(
SQuery
Node
Info
*
pNewQueryInfo
,
int64_t
uid
)
{
int32_t
numOfOutput
=
(
int32_t
)
tscSqlExprNumOfExprs
(
pNewQueryInfo
);
if
(
numOfOutput
==
0
)
{
return
;
...
...
@@ -2091,11 +2258,11 @@ static void doSetSqlExprAndResultFieldInfo(SQueryInfo* pNewQueryInfo, int64_t ui
// set the field info in pNewQueryInfo object according to sqlExpr information
size_t
numOfExprs
=
tscSqlExprNumOfExprs
(
pNewQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
S
SqlExpr
*
pExpr
=
tscSqlExprGet
(
pNewQueryInfo
,
i
);
S
ExprInfo
*
pExpr
=
tscSqlExprGet
(
pNewQueryInfo
,
i
);
TAOS_FIELD
f
=
tscCreateField
((
int8_t
)
pExpr
->
resType
,
pExpr
->
aliasName
,
pExpr
->
resBytes
);
TAOS_FIELD
f
=
tscCreateField
((
int8_t
)
pExpr
->
base
.
resType
,
pExpr
->
base
.
aliasName
,
pExpr
->
base
.
resBytes
);
SInternalField
*
pInfo1
=
tscFieldInfoAppend
(
&
pNewQueryInfo
->
fieldsInfo
,
&
f
);
pInfo1
->
p
Sql
Expr
=
pExpr
;
pInfo1
->
pExpr
=
pExpr
;
}
// update the pSqlExpr pointer in SInternalField according the field name
...
...
@@ -2105,11 +2272,11 @@ static void doSetSqlExprAndResultFieldInfo(SQueryInfo* pNewQueryInfo, int64_t ui
bool
matched
=
false
;
for
(
int32_t
k1
=
0
;
k1
<
numOfExprs
;
++
k1
)
{
S
SqlExpr
*
pExpr1
=
tscSqlExprGet
(
pNewQueryInfo
,
k1
);
S
ExprInfo
*
pExpr1
=
tscSqlExprGet
(
pNewQueryInfo
,
k1
);
if
(
strcmp
(
field
->
name
,
pExpr1
->
aliasName
)
==
0
)
{
// establish link according to the result field name
if
(
strcmp
(
field
->
name
,
pExpr1
->
base
.
aliasName
)
==
0
)
{
// establish link according to the result field name
SInternalField
*
pInfo
=
tscFieldInfoGetInternalField
(
&
pNewQueryInfo
->
fieldsInfo
,
f
);
pInfo
->
p
Sql
Expr
=
pExpr1
;
pInfo
->
pExpr
=
pExpr1
;
matched
=
true
;
break
;
...
...
@@ -2163,8 +2330,8 @@ SSqlObj* createSubqueryObj(SSqlObj* pSql, int16_t tableIndex, __async_cb_func_t
goto
_error
;
}
SQueryInfo
*
pNewQueryInfo
=
tscGetQueryInfo
(
pnCmd
,
0
);
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pNewQueryInfo
=
tscGetQueryInfo
(
pnCmd
,
0
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
pNewQueryInfo
->
command
=
pQueryInfo
->
command
;
pnCmd
->
active
=
pNewQueryInfo
;
...
...
@@ -2228,7 +2395,7 @@ SSqlObj* createSubqueryObj(SSqlObj* pSql, int16_t tableIndex, __async_cb_func_t
// set the correct query type
if
(
pPrevSql
!=
NULL
)
{
SQueryInfo
*
pPrevQueryInfo
=
tscGetQueryInfo
(
&
pPrevSql
->
cmd
,
pPrevSql
->
cmd
.
clauseIndex
);
SQuery
Node
Info
*
pPrevQueryInfo
=
tscGetQueryInfo
(
&
pPrevSql
->
cmd
,
pPrevSql
->
cmd
.
clauseIndex
);
pNewQueryInfo
->
type
=
pPrevQueryInfo
->
type
;
}
else
{
TSDB_QUERY_SET_TYPE
(
pNewQueryInfo
->
type
,
TSDB_QUERY_TYPE_SUBQUERY
);
// it must be the subquery
...
...
@@ -2311,7 +2478,7 @@ _error:
return
NULL
;
}
void
doExecuteQuery
(
SSqlObj
*
pSql
,
SQueryInfo
*
pQueryInfo
)
{
void
doExecuteQuery
(
SSqlObj
*
pSql
,
SQuery
Node
Info
*
pQueryInfo
)
{
uint16_t
type
=
pQueryInfo
->
type
;
if
(
QUERY_IS_JOIN_QUERY
(
type
)
&&
!
TSDB_QUERY_HAS_TYPE
(
type
,
TSDB_QUERY_TYPE_SUBQUERY
))
{
tscHandleMasterJoinQuery
(
pSql
);
...
...
@@ -2331,9 +2498,9 @@ void doExecuteQuery(SSqlObj* pSql, SQueryInfo* pQueryInfo) {
}
// do execute the query according to the query execution plan
void
executeQuery
(
SSqlObj
*
pSql
,
SQueryInfo
*
pQueryInfo
)
{
void
executeQuery
(
SSqlObj
*
pSql
,
SQuery
Node
Info
*
pQueryInfo
)
{
if
(
taosArrayGetSize
(
pQueryInfo
->
pUpstream
)
>
0
)
{
// nest query. do execute it firstly
SQueryInfo
*
pq
=
taosArrayGetP
(
pQueryInfo
->
pUpstream
,
0
);
SQuery
Node
Info
*
pq
=
taosArrayGetP
(
pQueryInfo
->
pUpstream
,
0
);
pSql
->
cmd
.
active
=
pq
;
executeQuery
(
pSql
,
pq
);
...
...
@@ -2369,7 +2536,7 @@ void tscDoQuery(SSqlObj* pSql) {
if
(
pCmd
->
dataSourceType
==
DATA_FROM_DATA_FILE
)
{
tscImportDataFromFile
(
pSql
);
}
else
{
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
uint16_t
type
=
pQueryInfo
->
type
;
if
(
QUERY_IS_JOIN_QUERY
(
type
))
{
...
...
@@ -2455,7 +2622,7 @@ bool tscIsQueryWithLimit(SSqlObj* pSql) {
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
for
(
int32_t
i
=
0
;
i
<
pCmd
->
numOfClause
;
++
i
)
{
SQueryInfo
*
pqi
=
tscGetQueryInfoS
(
pCmd
,
i
);
SQuery
Node
Info
*
pqi
=
tscGetQueryInfoS
(
pCmd
,
i
);
if
(
pqi
==
NULL
)
{
continue
;
}
...
...
@@ -2521,7 +2688,7 @@ int32_t tscInvalidSQLErrMsg(char* msg, const char* additionalInfo, const char* s
return
TSDB_CODE_TSC_INVALID_SQL
;
}
bool
tscHasReachLimitation
(
SQueryInfo
*
pQueryInfo
,
SSqlRes
*
pRes
)
{
bool
tscHasReachLimitation
(
SQuery
Node
Info
*
pQueryInfo
,
SSqlRes
*
pRes
)
{
assert
(
pQueryInfo
!=
NULL
&&
pQueryInfo
->
clauseLimit
!=
0
);
return
(
pQueryInfo
->
clauseLimit
>
0
&&
pRes
->
numOfClauseTotal
>=
pQueryInfo
->
clauseLimit
);
}
...
...
@@ -2540,7 +2707,7 @@ bool hasMoreVnodesToTry(SSqlObj* pSql) {
}
assert
(
pRes
->
completed
);
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
// for normal table, no need to try any more if results are all retrieved from one vnode
...
...
@@ -2565,7 +2732,7 @@ void tscTryQueryNextVnode(SSqlObj* pSql, __async_cb_func_t fp) {
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
SSqlRes
*
pRes
=
&
pSql
->
res
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
/*
* no result returned from the current virtual node anymore, try the next vnode if exists
...
...
@@ -2625,7 +2792,7 @@ void tscTryQueryNextClause(SSqlObj* pSql, __async_cb_func_t fp) {
assert
(
pCmd
->
clauseIndex
<
pCmd
->
numOfClause
-
1
);
pCmd
->
clauseIndex
++
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
SQuery
Node
Info
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
,
pCmd
->
clauseIndex
);
pSql
->
cmd
.
command
=
pQueryInfo
->
command
;
...
...
@@ -2902,4 +3069,92 @@ STableMeta* tscTableMetaDup(STableMeta* pTableMeta) {
return
p
;
}
SQuery
*
tscCreateQueryFromQueryNodeInfo
(
SQueryNodeInfo
*
pQueryNodeInfo
)
{
SQuery
*
pQuery
=
calloc
(
1
,
sizeof
(
SQuery
));
int16_t
numOfCols
=
taosArrayGetSize
(
pQueryNodeInfo
->
colList
);
int16_t
numOfOutput
=
pQueryNodeInfo
->
fieldsInfo
.
numOfOutput
;
pQuery
->
tsdb
=
NULL
;
pQuery
->
topBotQuery
=
tscIsTopBotQuery
(
pQueryNodeInfo
);
pQuery
->
hasTagResults
=
hasTagValOutput
(
pQueryNodeInfo
);
pQuery
->
timeWindowInterpo
=
timeWindowInterpoRequired
(
pQueryNodeInfo
);
pQuery
->
stabledev
=
isStabledev
(
pQueryNodeInfo
);
pQuery
->
tsCompQuery
=
isTsCompQuery
(
pQueryNodeInfo
);
pQuery
->
simpleAgg
=
isSimpleAggregate
(
pQueryNodeInfo
);
pQuery
->
needReverseScan
=
tscNeedReverseScan
(
pQueryNodeInfo
);
pQuery
->
numOfCols
=
numOfCols
;
pQuery
->
numOfOutput
=
numOfOutput
;
pQuery
->
limit
=
pQueryNodeInfo
->
limit
;
pQuery
->
order
=
pQueryNodeInfo
->
order
;
pQuery
->
pExpr1
=
NULL
;
pQuery
->
pExpr2
=
NULL
;
// not support yet.
pQuery
->
numOfExpr2
=
0
;
pQuery
->
pGroupbyExpr
=
NULL
;
memcpy
(
&
pQuery
->
interval
,
&
pQueryNodeInfo
->
interval
,
sizeof
(
pQuery
->
interval
));
pQuery
->
fillType
=
pQueryNodeInfo
->
fillType
;
pQuery
->
numOfTags
=
0
;
pQuery
->
tagColList
=
NULL
;
STableMetaInfo
*
pTableMetaInfo
=
pQueryNodeInfo
->
pTableMetaInfo
[
0
];
pQuery
->
vgId
=
0
;
pQuery
->
stableQuery
=
UTIL_TABLE_IS_SUPER_TABLE
(
pTableMetaInfo
);
pQuery
->
groupbyColumn
=
tscGroupbyColumn
(
pQueryNodeInfo
);
pQuery
->
interBufSize
=
getOutputInterResultBufSize
(
pQuery
);
{
pQuery
->
numOfOutput
=
tscSqlExprNumOfExprs
(
pQueryNodeInfo
);
pQuery
->
pExpr1
=
calloc
(
pQuery
->
numOfOutput
,
sizeof
(
SExprInfo
));
for
(
int32_t
i
=
0
;
i
<
pQuery
->
numOfOutput
;
++
i
)
{
SExprInfo
*
pExpr
=
tscSqlExprGet
(
pQueryNodeInfo
,
i
);
tscSqlExprAssign
(
&
pQuery
->
pExpr1
[
i
],
pExpr
);
}
}
{
// for simple table, not for super table
if
(
tscIsSecondStageQuery
(
pQueryNodeInfo
))
{
pQuery
->
numOfExpr2
=
tscNumOfFields
(
pQueryNodeInfo
);
pQuery
->
pExpr2
=
calloc
(
pQuery
->
numOfExpr2
,
sizeof
(
SExprInfo
));
for
(
int32_t
i
=
0
;
i
<
pQuery
->
numOfExpr2
;
++
i
)
{
SInternalField
*
pField
=
tscFieldInfoGetInternalField
(
&
pQueryNodeInfo
->
fieldsInfo
,
i
);
SExprInfo
*
pExpr
=
pField
->
pExpr
;
SSqlExpr
*
pse
=
&
pQuery
->
pExpr2
[
i
].
base
;
// this should be switched to projection query
if
(
pExpr
->
pExpr
==
NULL
)
{
pse
->
numOfParams
=
0
;
// no params for projection query
pse
->
functionId
=
TSDB_FUNC_PRJ
;
pse
->
colInfo
.
colId
=
pExpr
->
base
.
resColId
;
pse
->
colInfo
.
flag
=
TSDB_COL_NORMAL
;
pse
->
colType
=
pExpr
->
base
.
resType
;
pse
->
colBytes
=
pExpr
->
base
.
resBytes
;
pse
->
resType
=
pExpr
->
base
.
resType
;
pse
->
resBytes
=
pExpr
->
base
.
resBytes
;
}
else
{
assert
(
pField
->
pExpr
->
pExpr
!=
NULL
);
pse
->
colInfo
.
colId
=
pExpr
->
base
.
colInfo
.
colId
;
pse
->
colType
=
pExpr
->
base
.
colType
;
pse
->
colBytes
=
pExpr
->
base
.
colBytes
;
pse
->
resBytes
=
sizeof
(
double
);
pse
->
resType
=
TSDB_DATA_TYPE_DOUBLE
;
pse
->
functionId
=
pExpr
->
base
.
functionId
;
pse
->
numOfParams
=
pExpr
->
base
.
numOfParams
;
}
}
}
else
{
pQuery
->
numOfExpr2
=
0
;
}
}
return
pQuery
;
}
src/inc/taosmsg.h
浏览文件 @
b6aa9da9
...
...
@@ -451,7 +451,7 @@ typedef struct SColumnInfo {
int16_t
numOfFilters
;
union
{
int64_t
placeholder
;
SColumnFilterInfo
*
filter
s
;
SColumnFilterInfo
*
filter
Info
;
};
}
SColumnInfo
;
...
...
@@ -466,6 +466,13 @@ typedef struct STimeWindow {
TSKEY
ekey
;
}
STimeWindow
;
typedef
struct
{
int32_t
tsOffset
;
// offset value in current msg body, NOTE: ts list is compressed
int32_t
tsLen
;
// total length of ts comp block
int32_t
tsNumOfBlocks
;
// ts comp block numbers
int32_t
tsOrder
;
// ts comp block order
}
STsBufInfo
;
typedef
struct
{
SMsgHead
head
;
char
version
[
TSDB_VERSION_LEN
];
...
...
@@ -492,10 +499,7 @@ typedef struct {
int16_t
fillType
;
// interpolate type
uint64_t
fillVal
;
// default value array list
int32_t
secondStageOutput
;
int32_t
tsOffset
;
// offset value in current msg body, NOTE: ts list is compressed
int32_t
tsLen
;
// total length of ts comp block
int32_t
tsNumOfBlocks
;
// ts comp block numbers
int32_t
tsOrder
;
// ts comp block order
STsBufInfo
tsBuf
;
// tsBuf info
int32_t
numOfTags
;
// number of tags columns involved
int32_t
sqlstrLen
;
// sql query string
int32_t
prevResultLen
;
// previous result length
...
...
src/query/inc/qExecutor.h
浏览文件 @
b6aa9da9
...
...
@@ -177,6 +177,8 @@ typedef struct SSDataBlock {
SDataBlockInfo
info
;
}
SSDataBlock
;
// The basic query information extracted from the SQueryNodeInfo tree to support the
// execution of query in a data node.
typedef
struct
SQuery
{
SLimitVal
limit
;
...
...
@@ -187,6 +189,10 @@ typedef struct SQuery {
bool
timeWindowInterpo
;
// if the time window start/end required interpolation
bool
queryBlockDist
;
// if query data block distribution
bool
stabledev
;
// super table stddev query
bool
tsCompQuery
;
// is tscomp query
bool
simpleAgg
;
bool
pointInterpQuery
;
// point interpolation query
bool
needReverseScan
;
// need reverse scan
int32_t
interBufSize
;
// intermediate buffer sizse
SOrderVal
order
;
...
...
@@ -199,7 +205,6 @@ typedef struct SQuery {
int16_t
precision
;
int16_t
numOfOutput
;
int16_t
fillType
;
int16_t
checkResultBuf
;
// check if the buffer is full during scan each block
int32_t
srcRowSize
;
// todo extract struct
int32_t
resultRowSize
;
...
...
@@ -438,9 +443,13 @@ int32_t createIndirectQueryFuncExprFromMsg(SQueryTableMsg *pQueryMsg, int32_t nu
SSqlGroupbyExpr
*
createGroupbyExprFromMsg
(
SQueryTableMsg
*
pQueryMsg
,
SColIndex
*
pColIndex
,
int32_t
*
code
);
SQInfo
*
createQInfoImpl
(
SQueryTableMsg
*
pQueryMsg
,
SSqlGroupbyExpr
*
pGroupbyExpr
,
SExprInfo
*
pExprs
,
SExprInfo
*
pSecExprs
,
STableGroupInfo
*
pTableGroupInfo
,
SColumnInfo
*
pTagCols
,
bool
stableQuery
,
char
*
sql
,
uint64_t
*
qId
);
int32_t
initQInfo
(
SQueryTableMsg
*
pQueryMsg
,
void
*
tsdb
,
int32_t
vgId
,
SQInfo
*
pQInfo
,
SQueryParam
*
param
,
bool
isSTable
);
int32_t
initQInfo
(
STsBufInfo
*
pTsBufInfo
,
void
*
tsdb
,
int32_t
vgId
,
SQInfo
*
pQInfo
,
SQueryParam
*
param
,
char
*
start
,
int32_t
prevResultLen
,
bool
isSTable
);
void
freeColumnFilterInfo
(
SColumnFilterInfo
*
pFilter
,
int32_t
numOfFilters
);
STableQueryInfo
*
createTableQueryInfo
(
SQuery
*
pQuery
,
void
*
pTable
,
bool
groupbyColumn
,
STimeWindow
win
,
void
*
buf
);
bool
isQueryKilled
(
SQInfo
*
pQInfo
);
int32_t
checkForQueryBuf
(
size_t
numOfTables
);
bool
doBuildResCheck
(
SQInfo
*
pQInfo
);
...
...
src/query/src/qExecutor.c
浏览文件 @
b6aa9da9
...
...
@@ -163,7 +163,7 @@ static STableIdInfo createTableIdInfo(STableQueryInfo* pTableQueryInfo);
static
void
setTableScanFilterOperatorInfo
(
STableScanInfo
*
pTableScanInfo
,
SOperatorInfo
*
pDownstream
);
static
int32_t
getNumOfScanTimes
(
SQuery
*
pQuery
);
static
bool
isFixedOutputQuery
(
SQuery
*
pQuery
);
//
static bool isFixedOutputQuery(SQuery* pQuery);
static
SOperatorInfo
*
createDataBlocksOptScanInfo
(
void
*
pTsdbQueryHandle
,
SQueryRuntimeEnv
*
pRuntimeEnv
,
int32_t
repeatTime
,
int32_t
reverseTime
);
static
SOperatorInfo
*
createTableScanOperator
(
void
*
pTsdbQueryHandle
,
SQueryRuntimeEnv
*
pRuntimeEnv
,
int32_t
repeatTime
);
...
...
@@ -1790,8 +1790,8 @@ static int32_t setupQueryRuntimeEnv(SQueryRuntimeEnv *pRuntimeEnv, int32_t numOf
if
(
pQuery
->
pExpr2
!=
NULL
)
{
pRuntimeEnv
->
proot
=
createArithOperatorInfo
(
pRuntimeEnv
,
pRuntimeEnv
->
proot
,
pQuery
->
pExpr2
,
pQuery
->
numOfExpr2
);
}
}
else
if
(
isFixedOutputQuery
(
pQuery
)
)
{
if
(
pQuery
->
stableQuery
&&
!
isTsCompQuery
(
pQuery
)
)
{
}
else
if
(
pQuery
->
simpleAgg
)
{
if
(
pQuery
->
stableQuery
&&
!
pQuery
->
tsCompQuery
)
{
pRuntimeEnv
->
proot
=
createMultiTableAggOperatorInfo
(
pRuntimeEnv
,
pRuntimeEnv
->
pTableScanner
,
pQuery
->
pExpr1
,
pQuery
->
numOfOutput
);
}
else
{
...
...
@@ -1805,7 +1805,6 @@ static int32_t setupQueryRuntimeEnv(SQueryRuntimeEnv *pRuntimeEnv, int32_t numOf
pRuntimeEnv
->
proot
=
createArithOperatorInfo
(
pRuntimeEnv
,
pRuntimeEnv
->
proot
,
pQuery
->
pExpr2
,
pQuery
->
numOfExpr2
);
}
}
else
{
// diff/add/multiply/subtract/division
assert
(
pQuery
->
checkResultBuf
==
1
);
if
(
!
onlyQueryTags
(
pQuery
))
{
pRuntimeEnv
->
proot
=
createArithOperatorInfo
(
pRuntimeEnv
,
pRuntimeEnv
->
pTableScanner
,
pQuery
->
pExpr1
,
pQuery
->
numOfOutput
);
...
...
@@ -1905,36 +1904,30 @@ bool isQueryKilled(SQInfo *pQInfo) {
void
setQueryKilled
(
SQInfo
*
pQInfo
)
{
pQInfo
->
code
=
TSDB_CODE_TSC_QUERY_CANCELLED
;}
static
bool
isFixedOutputQuery
(
SQuery
*
pQuery
)
{
if
(
QUERY_IS_INTERVAL_QUERY
(
pQuery
))
{
return
false
;
}
// Note:top/bottom query is fixed output query
if
(
pQuery
->
topBotQuery
||
pQuery
->
groupbyColumn
||
isTsCompQuery
(
pQuery
))
{
return
true
;
}
for
(
int32_t
i
=
0
;
i
<
pQuery
->
numOfOutput
;
++
i
)
{
SSqlExpr
*
pExpr
=
&
pQuery
->
pExpr1
[
i
].
base
;
// ignore the ts_comp function
if
(
i
==
0
&&
pExpr
->
functionId
==
TSDB_FUNC_PRJ
&&
pExpr
->
numOfParams
==
1
&&
pExpr
->
colInfo
.
colIndex
==
PRIMARYKEY_TIMESTAMP_COL_INDEX
)
{
continue
;
}
if
(
pExpr
->
functionId
==
TSDB_FUNC_TS
||
pExpr
->
functionId
==
TSDB_FUNC_TS_DUMMY
)
{
continue
;
}
if
(
!
IS_MULTIOUTPUT
(
aAggs
[
pExpr
->
functionId
].
status
))
{
return
true
;
}
}
return
false
;
}
//static bool isFixedOutputQuery(SQuery* pQuery) {
// if (QUERY_IS_INTERVAL_QUERY(pQuery)) {
// return false;
// }
//
// // Note:top/bottom query is fixed output query
// if (pQuery->topBotQuery || pQuery->groupbyColumn || pQuery->tsCompQuery) {
// return true;
// }
//
// for (int32_t i = 0; i < pQuery->numOfOutput; ++i) {
// SSqlExpr *pExpr = &pQuery->pExpr1[i].base;
//
// if (pExpr->functionId == TSDB_FUNC_TS || pExpr->functionId == TSDB_FUNC_TS_DUMMY) {
// continue;
// }
//
// if (!IS_MULTIOUTPUT(aAggs[pExpr->functionId].status)) {
// return true;
// }
// }
//
// return false;
//}
// todo refactor with isLastRowQuery
bool
isPointInterpoQuery
(
SQuery
*
pQuery
)
{
...
...
@@ -2040,29 +2033,6 @@ void getAlignQueryTimeWindow(SQuery *pQuery, int64_t key, int64_t keyFirst, int6
}
}
static
void
setScanLimitationByResultBuffer
(
SQuery
*
pQuery
)
{
if
(
isTopBottomQuery
(
pQuery
))
{
pQuery
->
checkResultBuf
=
0
;
}
else
if
(
isGroupbyColumn
(
pQuery
->
pGroupbyExpr
))
{
pQuery
->
checkResultBuf
=
0
;
}
else
{
bool
hasMultioutput
=
false
;
for
(
int32_t
i
=
0
;
i
<
pQuery
->
numOfOutput
;
++
i
)
{
SSqlExpr
*
pExpr
=
&
pQuery
->
pExpr1
[
i
].
base
;
if
(
pExpr
->
functionId
==
TSDB_FUNC_TS
||
pExpr
->
functionId
==
TSDB_FUNC_TS_DUMMY
)
{
continue
;
}
hasMultioutput
=
IS_MULTIOUTPUT
(
aAggs
[
pExpr
->
functionId
].
status
);
if
(
!
hasMultioutput
)
{
break
;
}
}
pQuery
->
checkResultBuf
=
hasMultioutput
?
1
:
0
;
}
}
/*
* todo add more parameters to check soon..
*/
...
...
@@ -3175,7 +3145,7 @@ static bool hasMainOutput(SQuery *pQuery) {
return
false
;
}
static
STableQueryInfo
*
createTableQueryInfo
(
SQuery
*
pQuery
,
void
*
pTable
,
bool
groupbyColumn
,
STimeWindow
win
,
void
*
buf
)
{
STableQueryInfo
*
createTableQueryInfo
(
SQuery
*
pQuery
,
void
*
pTable
,
bool
groupbyColumn
,
STimeWindow
win
,
void
*
buf
)
{
STableQueryInfo
*
pTableQueryInfo
=
buf
;
pTableQueryInfo
->
win
=
win
;
...
...
@@ -3893,8 +3863,8 @@ static int32_t setupQueryHandle(void* tsdb, SQInfo* pQInfo, bool isSTableQuery)
&&
(
pRuntimeEnv
->
tableqinfoGroupInfo
.
numOfTables
==
1
)
&&
(
cond
.
order
==
TSDB_ORDER_ASC
)
&&
(
!
QUERY_IS_INTERVAL_QUERY
(
pQuery
))
&&
(
!
isGroupbyColumn
(
pQuery
->
pGroupbyExpr
)
)
&&
(
!
isFixedOutputQuery
(
pQuery
)
)
&&
(
!
pQuery
->
groupbyColumn
)
&&
(
!
pQuery
->
simpleAgg
)
)
{
SArray
*
pa
=
GET_TABLEGROUP
(
pRuntimeEnv
,
0
);
STableQueryInfo
*
pCheckInfo
=
taosArrayGetP
(
pa
,
0
);
...
...
@@ -3971,11 +3941,11 @@ int32_t doInitQInfo(SQInfo *pQInfo, STSBuf *pTsBuf, SArray* prevResult, void *ts
pRuntimeEnv
->
prevResult
=
prevResult
;
pRuntimeEnv
->
qinfo
=
pQInfo
;
setScanLimitationByResultBuffer
(
pQuery
);
int32_t
code
=
setupQueryHandle
(
tsdb
,
pQInfo
,
isSTableQuery
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
if
(
tsdb
!=
NULL
)
{
int32_t
code
=
setupQueryHandle
(
tsdb
,
pQInfo
,
isSTableQuery
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
}
}
pQuery
->
tsdb
=
tsdb
;
...
...
@@ -4013,7 +3983,7 @@ int32_t doInitQInfo(SQInfo *pQInfo, STSBuf *pTsBuf, SArray* prevResult, void *ts
getIntermediateBufInfo
(
pRuntimeEnv
,
&
ps
,
&
pQuery
->
intermediateResultRowSize
);
int32_t
TENMB
=
1024
*
1024
*
10
;
code
=
createDiskbasedResultBuffer
(
&
pRuntimeEnv
->
pResultBuf
,
ps
,
TENMB
,
pQInfo
);
int32_t
code
=
createDiskbasedResultBuffer
(
&
pRuntimeEnv
->
pResultBuf
,
ps
,
TENMB
,
pQInfo
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
}
...
...
@@ -4265,6 +4235,7 @@ SOperatorInfo* createTableScanOperator(void* pTsdbQueryHandle, SQueryRuntimeEnv*
SOperatorInfo
*
pOperator
=
calloc
(
1
,
sizeof
(
SOperatorInfo
));
pOperator
->
name
=
"TableScanOperator"
;
pOperator
->
operatorType
=
OP_TableScan
;
pOperator
->
blockingOptr
=
false
;
pOperator
->
status
=
OP_IN_EXECUTING
;
pOperator
->
info
=
pInfo
;
...
...
@@ -5498,10 +5469,10 @@ int32_t convertQueryMsg(SQueryTableMsg *pQueryMsg, SQueryParam* param) {
pQueryMsg
->
numOfOutput
=
htons
(
pQueryMsg
->
numOfOutput
);
pQueryMsg
->
numOfGroupCols
=
htons
(
pQueryMsg
->
numOfGroupCols
);
pQueryMsg
->
tagCondLen
=
htons
(
pQueryMsg
->
tagCondLen
);
pQueryMsg
->
ts
Offset
=
htonl
(
pQueryMsg
->
tsOffset
);
pQueryMsg
->
ts
Len
=
htonl
(
pQueryMsg
->
tsLen
);
pQueryMsg
->
ts
NumOfBlocks
=
htonl
(
pQueryMsg
->
tsNumOfBlocks
);
pQueryMsg
->
ts
Order
=
htonl
(
pQueryMsg
->
tsOrder
);
pQueryMsg
->
ts
Buf
.
tsOffset
=
htonl
(
pQueryMsg
->
tsBuf
.
tsOffset
);
pQueryMsg
->
ts
Buf
.
tsLen
=
htonl
(
pQueryMsg
->
tsBuf
.
tsLen
);
pQueryMsg
->
ts
Buf
.
tsNumOfBlocks
=
htonl
(
pQueryMsg
->
tsBuf
.
tsNumOfBlocks
);
pQueryMsg
->
ts
Buf
.
tsOrder
=
htonl
(
pQueryMsg
->
tsBuf
.
tsOrder
);
pQueryMsg
->
numOfTags
=
htonl
(
pQueryMsg
->
numOfTags
);
pQueryMsg
->
tbnameCondLen
=
htonl
(
pQueryMsg
->
tbnameCondLen
);
pQueryMsg
->
secondStageOutput
=
htonl
(
pQueryMsg
->
secondStageOutput
);
...
...
@@ -5533,8 +5504,8 @@ int32_t convertQueryMsg(SQueryTableMsg *pQueryMsg, SQueryParam* param) {
int32_t
numOfFilters
=
pColInfo
->
numOfFilters
;
if
(
numOfFilters
>
0
)
{
pColInfo
->
filter
s
=
calloc
(
numOfFilters
,
sizeof
(
SColumnFilterInfo
));
if
(
pColInfo
->
filter
s
==
NULL
)
{
pColInfo
->
filter
Info
=
calloc
(
numOfFilters
,
sizeof
(
SColumnFilterInfo
));
if
(
pColInfo
->
filter
Info
==
NULL
)
{
code
=
TSDB_CODE_QRY_OUT_OF_MEMORY
;
goto
_cleanup
;
}
...
...
@@ -5543,7 +5514,7 @@ int32_t convertQueryMsg(SQueryTableMsg *pQueryMsg, SQueryParam* param) {
for
(
int32_t
f
=
0
;
f
<
numOfFilters
;
++
f
)
{
SColumnFilterInfo
*
pFilterMsg
=
(
SColumnFilterInfo
*
)
pMsg
;
SColumnFilterInfo
*
pColFilter
=
&
pColInfo
->
filter
s
[
f
];
SColumnFilterInfo
*
pColFilter
=
&
pColInfo
->
filter
Info
[
f
];
pColFilter
->
filterstr
=
htons
(
pFilterMsg
->
filterstr
);
pMsg
+=
sizeof
(
SColumnFilterInfo
);
...
...
@@ -5756,8 +5727,8 @@ int32_t convertQueryMsg(SQueryTableMsg *pQueryMsg, SQueryParam* param) {
}
//skip ts buf
if
((
pQueryMsg
->
ts
Offset
+
pQueryMsg
->
tsLen
)
>
0
)
{
pMsg
=
(
char
*
)
pQueryMsg
+
pQueryMsg
->
ts
Offset
+
pQueryMsg
->
tsLen
;
if
((
pQueryMsg
->
ts
Buf
.
tsOffset
+
pQueryMsg
->
tsBuf
.
tsLen
)
>
0
)
{
pMsg
=
(
char
*
)
pQueryMsg
+
pQueryMsg
->
ts
Buf
.
tsOffset
+
pQueryMsg
->
tsBuf
.
tsLen
;
}
param
->
sql
=
strndup
(
pMsg
,
pQueryMsg
->
sqlstrLen
);
...
...
@@ -5772,7 +5743,7 @@ int32_t convertQueryMsg(SQueryTableMsg *pQueryMsg, SQueryParam* param) {
"outputCols:%d, numOfCols:%d, interval:%"
PRId64
", fillType:%d, comptsLen:%d, compNumOfBlocks:%d, limit:%"
PRId64
", offset:%"
PRId64
,
pQueryMsg
,
pQueryMsg
->
numOfTables
,
pQueryMsg
->
queryType
,
pQueryMsg
->
window
.
skey
,
pQueryMsg
->
window
.
ekey
,
pQueryMsg
->
numOfGroupCols
,
pQueryMsg
->
order
,
pQueryMsg
->
numOfOutput
,
pQueryMsg
->
numOfCols
,
pQueryMsg
->
interval
.
interval
,
pQueryMsg
->
fillType
,
pQueryMsg
->
ts
Len
,
pQueryMsg
->
tsNumOfBlocks
,
pQueryMsg
->
limit
,
pQueryMsg
->
offset
);
pQueryMsg
->
fillType
,
pQueryMsg
->
ts
Buf
.
tsLen
,
pQueryMsg
->
tsBuf
.
tsNumOfBlocks
,
pQueryMsg
->
limit
,
pQueryMsg
->
offset
);
qDebug
(
"qmsg:%p, sql:%s"
,
pQueryMsg
,
param
->
sql
);
return
TSDB_CODE_SUCCESS
;
...
...
@@ -6030,7 +6001,7 @@ static int32_t createFilterInfo(void *pQInfo, SQuery *pQuery) {
for
(
int32_t
f
=
0
;
f
<
pFilterInfo
->
numOfFilters
;
++
f
)
{
SColumnFilterElem
*
pSingleColFilter
=
&
pFilterInfo
->
pFilters
[
f
];
pSingleColFilter
->
filterInfo
=
pQuery
->
colList
[
i
].
filter
s
[
f
];
pSingleColFilter
->
filterInfo
=
pQuery
->
colList
[
i
].
filter
Info
[
f
];
int32_t
lower
=
pSingleColFilter
->
filterInfo
.
lowerRelOptr
;
int32_t
upper
=
pSingleColFilter
->
filterInfo
.
upperRelOptr
;
...
...
@@ -6166,7 +6137,7 @@ SQInfo* createQInfoImpl(SQueryTableMsg* pQueryMsg, SSqlGroupbyExpr* pGroupbyExpr
pQuery
->
maxSrcColumnSize
=
0
;
for
(
int16_t
i
=
0
;
i
<
numOfCols
;
++
i
)
{
pQuery
->
colList
[
i
]
=
pQueryMsg
->
colList
[
i
];
pQuery
->
colList
[
i
].
filter
s
=
tFilterInfoDup
(
pQueryMsg
->
colList
[
i
].
filters
,
pQuery
->
colList
[
i
].
numOfFilters
);
pQuery
->
colList
[
i
].
filter
Info
=
tFilterInfoDup
(
pQueryMsg
->
colList
[
i
].
filterInfo
,
pQuery
->
colList
[
i
].
numOfFilters
);
pQuery
->
srcRowSize
+=
pQuery
->
colList
[
i
].
bytes
;
if
(
pQuery
->
maxSrcColumnSize
<
pQuery
->
colList
[
i
].
bytes
)
{
...
...
@@ -6309,29 +6280,31 @@ bool isValidQInfo(void *param) {
return
(
sig
==
(
uint64_t
)
pQInfo
);
}
int32_t
initQInfo
(
SQueryTableMsg
*
pQueryMsg
,
void
*
tsdb
,
int32_t
vgId
,
SQInfo
*
pQInfo
,
SQueryParam
*
param
,
bool
isSTable
)
{
int32_t
initQInfo
(
STsBufInfo
*
pTsBufInfo
,
void
*
tsdb
,
int32_t
vgId
,
SQInfo
*
pQInfo
,
SQueryParam
*
param
,
char
*
start
,
int32_t
prevResultLen
,
bool
isSTable
)
{
int32_t
code
=
TSDB_CODE_SUCCESS
;
SQueryRuntimeEnv
*
pRuntimeEnv
=
&
pQInfo
->
runtimeEnv
;
SQuery
*
pQuery
=
pQInfo
->
runtimeEnv
.
pQuery
;
STSBuf
*
pTsBuf
=
NULL
;
if
(
p
QueryMsg
->
tsLen
>
0
)
{
// open new file to save the result
char
*
tsBlock
=
(
char
*
)
pQueryMsg
+
pQueryMsg
->
tsOffset
;
pTsBuf
=
tsBufCreateFromCompBlocks
(
tsBlock
,
p
QueryMsg
->
tsNumOfBlocks
,
pQueryMsg
->
tsLen
,
pQueryMsg
->
tsOrder
,
vgId
);
if
(
p
TsBufInfo
->
tsLen
>
0
)
{
// open new file to save the result
char
*
tsBlock
=
start
+
pTsBufInfo
->
tsOffset
;
pTsBuf
=
tsBufCreateFromCompBlocks
(
tsBlock
,
p
TsBufInfo
->
tsNumOfBlocks
,
pTsBufInfo
->
tsLen
,
pTsBufInfo
->
tsOrder
,
vgId
);
tsBufResetPos
(
pTsBuf
);
bool
ret
=
tsBufNextPos
(
pTsBuf
);
UNUSED
(
ret
);
}
SArray
*
prevResult
=
NULL
;
if
(
p
QueryMsg
->
p
revResultLen
>
0
)
{
prevResult
=
interResFromBinary
(
param
->
prevResult
,
p
QueryMsg
->
p
revResultLen
);
if
(
prevResultLen
>
0
)
{
prevResult
=
interResFromBinary
(
param
->
prevResult
,
prevResultLen
);
}
pQuery
->
precision
=
tsdbGetCfg
(
tsdb
)
->
precision
;
if
(
tsdb
!=
NULL
)
{
pQuery
->
precision
=
tsdbGetCfg
(
tsdb
)
->
precision
;
}
if
((
QUERY_IS_ASC_QUERY
(
pQuery
)
&&
(
pQuery
->
window
.
skey
>
pQuery
->
window
.
ekey
))
||
(
!
QUERY_IS_ASC_QUERY
(
pQuery
)
&&
(
pQuery
->
window
.
ekey
>
pQuery
->
window
.
skey
)))
{
...
...
@@ -6449,7 +6422,7 @@ void freeQInfo(SQInfo *pQInfo) {
if
(
pQuery
->
colList
!=
NULL
)
{
for
(
int32_t
i
=
0
;
i
<
pQuery
->
numOfCols
;
i
++
)
{
SColumnInfo
*
column
=
pQuery
->
colList
+
i
;
freeColumnFilterInfo
(
column
->
filter
s
,
column
->
numOfFilters
);
freeColumnFilterInfo
(
column
->
filter
Info
,
column
->
numOfFilters
);
}
tfree
(
pQuery
->
colList
);
}
...
...
src/query/src/qPlan.c
浏览文件 @
b6aa9da9
#include "os.h"
#include "tsclient.h"
#include "qUtil.h"
#include "texpr.h"
UNUSED_FUNC
SArray
*
createTableScanPlan
(
SQuery
*
pQuery
)
{
SArray
*
plan
=
taosArrayInit
(
4
,
sizeof
(
int32_t
));
int32_t
op
=
0
;
if
(
onlyQueryTags
(
pQuery
))
{
// op = OP_TagScan;
}
else
if
(
pQuery
->
queryBlockDist
)
{
op
=
OP_TableBlockInfoScan
;
}
else
if
(
pQuery
->
tsCompQuery
||
pQuery
->
pointInterpQuery
)
{
op
=
OP_TableSeqScan
;
}
else
if
(
pQuery
->
needReverseScan
)
{
op
=
OP_DataBlocksOptScan
;
}
else
{
op
=
OP_TableScan
;
}
taosArrayPush
(
plan
,
&
op
);
return
plan
;
}
UNUSED_FUNC
SArray
*
createExecOperatorPlan
(
SQuery
*
pQuery
)
{
SArray
*
plan
=
taosArrayInit
(
4
,
sizeof
(
int32_t
));
int32_t
op
=
0
;
if
(
onlyQueryTags
(
pQuery
))
{
// do nothing for tags query
op
=
OP_TagScan
;
taosArrayPush
(
plan
,
&
op
);
}
else
if
(
pQuery
->
interval
.
interval
>
0
)
{
if
(
pQuery
->
stableQuery
)
{
op
=
OP_MultiTableTimeInterval
;
taosArrayPush
(
plan
,
&
op
);
}
else
{
op
=
OP_TimeWindow
;
taosArrayPush
(
plan
,
&
op
);
if
(
pQuery
->
pExpr2
!=
NULL
)
{
op
=
OP_Arithmetic
;
taosArrayPush
(
plan
,
&
op
);
}
if
(
pQuery
->
fillType
!=
TSDB_FILL_NONE
&&
(
!
pQuery
->
pointInterpQuery
))
{
op
=
OP_Fill
;
taosArrayPush
(
plan
,
&
op
);
}
}
}
else
if
(
pQuery
->
groupbyColumn
)
{
op
=
OP_Groupby
;
taosArrayPush
(
plan
,
&
op
);
if
(
pQuery
->
pExpr2
!=
NULL
)
{
op
=
OP_Arithmetic
;
taosArrayPush
(
plan
,
&
op
);
}
}
else
if
(
pQuery
->
sw
.
gap
>
0
)
{
op
=
OP_SessionWindow
;
taosArrayPush
(
plan
,
&
op
);
if
(
pQuery
->
pExpr2
!=
NULL
)
{
op
=
OP_Arithmetic
;
taosArrayPush
(
plan
,
&
op
);
}
}
else
if
(
pQuery
->
simpleAgg
)
{
if
(
pQuery
->
stableQuery
&&
!
pQuery
->
tsCompQuery
)
{
op
=
OP_MultiTableAggregate
;
}
else
{
op
=
OP_Aggregate
;
}
taosArrayPush
(
plan
,
&
op
);
if
(
pQuery
->
pExpr2
!=
NULL
&&
!
pQuery
->
stableQuery
)
{
op
=
OP_Arithmetic
;
taosArrayPush
(
plan
,
&
op
);
}
}
else
{
// diff/add/multiply/subtract/division
op
=
OP_Arithmetic
;
taosArrayPush
(
plan
,
&
op
);
}
if
(
pQuery
->
limit
.
offset
>
0
)
{
op
=
OP_Offset
;
taosArrayPush
(
plan
,
&
op
);
}
if
(
pQuery
->
limit
.
limit
>
0
)
{
op
=
OP_Limit
;
taosArrayPush
(
plan
,
&
op
);
}
return
plan
;
}
src/query/src/queryMain.c
浏览文件 @
b6aa9da9
...
...
@@ -170,7 +170,7 @@ int32_t qCreateQueryInfo(void* tsdb, int32_t vgId, SQueryTableMsg* pQueryMsg, qi
goto
_over
;
}
code
=
initQInfo
(
pQueryMsg
,
tsdb
,
vgId
,
*
pQInfo
,
&
param
,
isSTableQuery
);
code
=
initQInfo
(
&
pQueryMsg
->
tsBuf
,
tsdb
,
vgId
,
*
pQInfo
,
&
param
,
(
char
*
)
pQueryMsg
,
pQueryMsg
->
prevResultLen
,
isSTableQuery
);
_over:
if
(
param
.
pGroupbyExpr
!=
NULL
)
{
...
...
@@ -184,7 +184,7 @@ int32_t qCreateQueryInfo(void* tsdb, int32_t vgId, SQueryTableMsg* pQueryMsg, qi
for
(
int32_t
i
=
0
;
i
<
pQueryMsg
->
numOfCols
;
i
++
)
{
SColumnInfo
*
column
=
pQueryMsg
->
colList
+
i
;
freeColumnFilterInfo
(
column
->
filter
s
,
column
->
numOfFilters
);
freeColumnFilterInfo
(
column
->
filter
Info
,
column
->
numOfFilters
);
}
//pQInfo already freed in initQInfo, but *pQInfo may not pointer to null;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录