Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
c6b0d6b0
T
TDengine
项目概览
taosdata
/
TDengine
大约 1 年 前同步成功
通知
1184
Star
22015
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看板
体验新版 GitCode,发现更多精彩内容 >>
提交
c6b0d6b0
编写于
1月 29, 2020
作者:
H
hjxilinx
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
support the sliding query [tbase-266]
上级
f7261780
变更
10
展开全部
隐藏空白更改
内联
并排
Showing
10 changed file
with
1060 addition
and
583 deletion
+1060
-583
src/client/src/tscSQLParser.c
src/client/src/tscSQLParser.c
+32
-25
src/system/detail/inc/vnode.h
src/system/detail/inc/vnode.h
+1
-0
src/system/detail/inc/vnodeQueryImpl.h
src/system/detail/inc/vnodeQueryImpl.h
+7
-3
src/system/detail/inc/vnodeRead.h
src/system/detail/inc/vnodeRead.h
+31
-4
src/system/detail/src/vnodeQueryImpl.c
src/system/detail/src/vnodeQueryImpl.c
+941
-496
src/system/detail/src/vnodeQueryProcess.c
src/system/detail/src/vnodeQueryProcess.c
+23
-40
src/system/detail/src/vnodeRead.c
src/system/detail/src/vnodeRead.c
+3
-0
src/util/src/hash.c
src/util/src/hash.c
+8
-2
src/util/src/thashutil.c
src/util/src/thashutil.c
+1
-0
src/util/src/tinterpolation.c
src/util/src/tinterpolation.c
+13
-13
未找到文件。
src/client/src/tscSQLParser.c
浏览文件 @
c6b0d6b0
...
...
@@ -62,7 +62,7 @@ static int32_t addExprAndResultField(SQueryInfo* pQueryInfo, int32_t colIdx, tSQ
static
int32_t
insertResultField
(
SQueryInfo
*
pQueryInfo
,
int32_t
outputIndex
,
SColumnList
*
pIdList
,
int16_t
bytes
,
int8_t
type
,
char
*
fieldName
);
static
int32_t
changeFunctionID
(
int32_t
optr
,
int16_t
*
functionId
);
static
int32_t
parseSelectClause
(
SSqlCmd
*
pCmd
,
int32_t
clauseIndex
,
tSQLExprList
*
pSelection
,
bool
is
Metric
);
static
int32_t
parseSelectClause
(
SSqlCmd
*
pCmd
,
int32_t
clauseIndex
,
tSQLExprList
*
pSelection
,
bool
is
STable
);
static
bool
validateIpAddress
(
const
char
*
ip
,
size_t
size
);
static
bool
hasUnsupportFunctionsForSTableQuery
(
SQueryInfo
*
pQueryInfo
);
...
...
@@ -93,6 +93,8 @@ static int32_t setKillInfo(SSqlObj* pSql, struct SSqlInfo* pInfo);
static
bool
validateOneTags
(
SSqlCmd
*
pCmd
,
TAOS_FIELD
*
pTagField
);
static
bool
hasTimestampForPointInterpQuery
(
SQueryInfo
*
pQueryInfo
);
static
bool
hasDefaultQueryTimeRange
(
SQueryInfo
*
pQueryInfo
);
static
void
updateTagColumnIndex
(
SQueryInfo
*
pQueryInfo
,
int32_t
tableIndex
);
static
int32_t
parseLimitClause
(
SQueryInfo
*
pQueryInfo
,
int32_t
index
,
SQuerySQL
*
pQuerySql
,
SSqlObj
*
pSql
);
...
...
@@ -4432,8 +4434,6 @@ int32_t parseLimitClause(SQueryInfo* pQueryInfo, int32_t clauseIndex, SQuerySQL*
const
char
*
msg1
=
"slimit/soffset only available for STable query"
;
const
char
*
msg2
=
"function not supported on table"
;
const
char
*
msg3
=
"slimit/soffset can not apply to projection query"
;
const
char
*
msg4
=
"projection on super table requires order by clause along with limitation"
;
const
char
*
msg5
=
"ordered projection result too large"
;
// handle the limit offset value, validate the limit
pQueryInfo
->
limit
=
pQuerySql
->
limit
;
...
...
@@ -5542,28 +5542,6 @@ int32_t doCheckForQuery(SSqlObj* pSql, SQuerySQL* pQuerySql, int32_t index) {
}
}
// set sliding value
SSQLToken
*
pSliding
=
&
pQuerySql
->
sliding
;
if
(
pSliding
->
n
!=
0
)
{
if
(
!
tscEmbedded
&&
pCmd
->
inStream
==
0
)
{
// sliding only allowed in stream
const
char
*
msg
=
"not support sliding in query"
;
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg
);
}
getTimestampInUsFromStr
(
pSliding
->
z
,
pSliding
->
n
,
&
pQueryInfo
->
nSlidingTime
);
if
(
pMeterMetaInfo
->
pMeterMeta
->
precision
==
TSDB_TIME_PRECISION_MILLI
)
{
pQueryInfo
->
nSlidingTime
/=
1000
;
}
if
(
pQueryInfo
->
nSlidingTime
<
tsMinSlidingTime
)
{
return
invalidSqlErrMsg
(
pQueryInfo
->
msg
,
msg3
);
}
if
(
pQueryInfo
->
nSlidingTime
>
pQueryInfo
->
nAggTimeInterval
)
{
return
invalidSqlErrMsg
(
pQueryInfo
->
msg
,
msg4
);
}
}
// set order by info
if
(
parseOrderbyClause
(
pQueryInfo
,
pQuerySql
,
tsGetSchema
(
pMeterMetaInfo
->
pMeterMeta
))
!=
TSDB_CODE_SUCCESS
)
{
return
TSDB_CODE_INVALID_SQL
;
...
...
@@ -5602,6 +5580,30 @@ int32_t doCheckForQuery(SSqlObj* pSql, SQuerySQL* pQuerySql, int32_t index) {
if
(
!
hasTimestampForPointInterpQuery
(
pQueryInfo
))
{
return
invalidSqlErrMsg
(
pQueryInfo
->
msg
,
msg2
);
}
// set sliding value, the query time range needs to be decide in the first place
SSQLToken
*
pSliding
=
&
pQuerySql
->
sliding
;
if
(
pSliding
->
n
!=
0
)
{
if
(
!
tscEmbedded
&&
pCmd
->
inStream
==
0
&&
hasDefaultQueryTimeRange
(
pQueryInfo
))
{
// sliding only allowed in stream
const
char
*
msg
=
"time range expected for sliding window query"
;
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg
);
}
getTimestampInUsFromStr
(
pSliding
->
z
,
pSliding
->
n
,
&
pQueryInfo
->
nSlidingTime
);
if
(
pMeterMetaInfo
->
pMeterMeta
->
precision
==
TSDB_TIME_PRECISION_MILLI
)
{
pQueryInfo
->
nSlidingTime
/=
1000
;
}
if
(
pQueryInfo
->
nSlidingTime
<
tsMinSlidingTime
)
{
return
invalidSqlErrMsg
(
pQueryInfo
->
msg
,
msg3
);
}
if
(
pQueryInfo
->
nSlidingTime
>
pQueryInfo
->
nAggTimeInterval
)
{
return
invalidSqlErrMsg
(
pQueryInfo
->
msg
,
msg4
);
}
}
else
{
pQueryInfo
->
nSlidingTime
=
-
1
;
}
// in case of join query, time range is required.
if
(
QUERY_IS_JOIN_QUERY
(
pQueryInfo
->
type
))
{
...
...
@@ -5651,3 +5653,8 @@ int32_t doCheckForQuery(SSqlObj* pSql, SQuerySQL* pQuerySql, int32_t index) {
return
TSDB_CODE_SUCCESS
;
// Does not build query message here
}
bool
hasDefaultQueryTimeRange
(
SQueryInfo
*
pQueryInfo
)
{
return
(
pQueryInfo
->
stime
==
0
&&
pQueryInfo
->
etime
==
INT64_MAX
)
||
(
pQueryInfo
->
stime
==
INT64_MAX
&&
pQueryInfo
->
etime
==
0
);
}
\ No newline at end of file
src/system/detail/inc/vnode.h
浏览文件 @
c6b0d6b0
...
...
@@ -260,6 +260,7 @@ typedef struct SQuery {
TSKEY
skey
;
TSKEY
ekey
;
int64_t
nAggTimeInterval
;
int64_t
slidingTime
;
// sliding time for sliding window query
char
intervalTimeUnit
;
// interval data type, used for daytime revise
int8_t
precision
;
int16_t
numOfOutputCols
;
...
...
src/system/detail/inc/vnodeQueryImpl.h
浏览文件 @
c6b0d6b0
...
...
@@ -64,7 +64,7 @@ typedef enum {
* the next query.
*
* this status is only exist in group-by clause and
* diff/add/division/mul
it
ply/ query.
* diff/add/division/mul
ti
ply/ query.
*/
QUERY_RESBUF_FULL
=
0x2
,
...
...
@@ -149,7 +149,6 @@ void vnodeScanAllData(SQueryRuntimeEnv* pRuntimeEnv);
int32_t
vnodeQueryResultInterpolate
(
SQInfo
*
pQInfo
,
tFilePage
**
pDst
,
tFilePage
**
pDataSrc
,
int32_t
numOfRows
,
int32_t
*
numOfInterpo
);
void
copyResToQueryResultBuf
(
SMeterQuerySupportObj
*
pSupporter
,
SQuery
*
pQuery
);
void
moveDescOrderResultsToFront
(
SQueryRuntimeEnv
*
pRuntimeEnv
);
void
doSkipResults
(
SQueryRuntimeEnv
*
pRuntimeEnv
);
void
doFinalizeResult
(
SQueryRuntimeEnv
*
pRuntimeEnv
);
...
...
@@ -159,7 +158,7 @@ void forwardIntervalQueryRange(SMeterQuerySupportObj* pSupporter, SQueryRuntimeE
void
forwardQueryStartPosition
(
SQueryRuntimeEnv
*
pRuntimeEnv
);
bool
normalizedFirstQueryRange
(
bool
dataInDisk
,
bool
dataInCache
,
SMeterQuerySupportObj
*
pSupporter
,
SPointInterpoSupporter
*
pPointInterpSupporter
);
SPointInterpoSupporter
*
pPointInterpSupporter
,
int64_t
*
key
);
void
pointInterpSupporterInit
(
SQuery
*
pQuery
,
SPointInterpoSupporter
*
pInterpoSupport
);
void
pointInterpSupporterDestroy
(
SPointInterpoSupporter
*
pPointInterpSupport
);
...
...
@@ -278,6 +277,11 @@ void displayInterResult(SData** pdata, SQuery* pQuery, int32_t numOfRows);
void
vnodePrintQueryStatistics
(
SMeterQuerySupportObj
*
pSupporter
);
void
clearGroupResultBuf
(
SOutputRes
*
pOneOutputRes
,
int32_t
nOutputCols
);
void
copyGroupResultBuf
(
SOutputRes
*
dst
,
const
SOutputRes
*
src
,
int32_t
nOutputCols
);
void
resetResWindowInfo
(
SSlidingWindowResInfo
*
pWindowResInfo
,
int32_t
numOfCols
);
void
clearCompletedResWindows
(
SSlidingWindowResInfo
*
pWindowResInfo
,
int32_t
numOfCols
);
int32_t
numOfResFromResWindowInfo
(
SSlidingWindowResInfo
*
pWindowResInfo
);
#ifdef __cplusplus
}
...
...
src/system/detail/inc/vnodeRead.h
浏览文件 @
c6b0d6b0
...
...
@@ -112,7 +112,31 @@ typedef struct SQueryFilesInfo {
char
dbFilePathPrefix
[
PATH_MAX
];
}
SQueryFilesInfo
;
typedef
struct
RuntimeEnvironment
{
typedef
struct
STimeWindow
{
TSKEY
skey
;
TSKEY
ekey
;
}
STimeWindow
;
typedef
struct
SWindowStatus
{
STimeWindow
window
;
bool
closed
;
}
SWindowStatus
;
typedef
struct
SSlidingWindowResInfo
{
SOutputRes
*
pResult
;
// reference to SQuerySupporter->pResult
SWindowStatus
*
pStatus
;
// current query window closed or not?
void
*
hashList
;
// hash list for quick access
int16_t
type
;
// data type for hash key
int32_t
capacity
;
// max capacity
int32_t
curIndex
;
// current start active index
int32_t
size
;
int64_t
startTime
;
// start time of the first time window for sliding query
int64_t
prevSKey
;
// previous (not completed) sliding window start key
int64_t
threshold
;
// threshold for return completed results.
}
SSlidingWindowResInfo
;
typedef
struct
SQueryRuntimeEnv
{
SPositionInfo
startPos
;
/* the start position, used for secondary/third iteration */
SPositionInfo
endPos
;
/* the last access position in query, served as the start pos of reversed order query */
SPositionInfo
nextPos
;
/* start position of the next scan */
...
...
@@ -134,13 +158,16 @@ typedef struct RuntimeEnvironment {
int16_t
scanFlag
;
// denotes reversed scan of data or not
SInterpolationInfo
interpoInfo
;
SData
**
pInterpoBuf
;
SOutputRes
*
pResult
;
// reference to SQuerySupporter->pResult
void
*
hashList
;
int32_t
usedIndex
;
// assigned SOutputRes in list
SSlidingWindowResInfo
swindowResInfo
;
STSBuf
*
pTSBuf
;
STSCursor
cur
;
SQueryCostSummary
summary
;
TSKEY
intervalSKey
;
// skey of the complete time window, not affected by the actual data distribution
TSKEY
intervalEKey
;
// ekey of the complete time window
/*
* Temporarily hold the in-memory cache block info during scan cache blocks
* Here we do not use the cacheblock info from pMeterObj, simple because it may change anytime
...
...
src/system/detail/src/vnodeQueryImpl.c
浏览文件 @
c6b0d6b0
此差异已折叠。
点击以展开。
src/system/detail/src/vnodeQueryProcess.c
浏览文件 @
c6b0d6b0
...
...
@@ -535,7 +535,7 @@ static int64_t doCheckMetersInGroup(SQInfo *pQInfo, int32_t index, int32_t start
SPointInterpoSupporter
pointInterpSupporter
=
{
0
};
pointInterpSupporterInit
(
pQuery
,
&
pointInterpSupporter
);
if
(
!
normalizedFirstQueryRange
(
dataInDisk
,
dataInCache
,
pSupporter
,
&
pointInterpSupporter
))
{
if
(
!
normalizedFirstQueryRange
(
dataInDisk
,
dataInCache
,
pSupporter
,
&
pointInterpSupporter
,
NULL
))
{
pointInterpSupporterDestroy
(
&
pointInterpSupporter
);
return
0
;
}
...
...
@@ -666,19 +666,10 @@ static void vnodeMultiMeterMultiOutputProcessor(SQInfo *pQInfo) {
if
(
pSupporter
->
meterIdx
>=
pSids
->
numOfSids
)
{
return
;
}
for
(
int32_t
i
=
0
;
i
<
pRuntimeEnv
->
usedIndex
;
++
i
)
{
SOutputRes
*
pOneRes
=
&
pRuntimeEnv
->
pResult
[
i
];
clearGroupResultBuf
(
pOneRes
,
pQuery
->
numOfOutputCols
);
}
pRuntimeEnv
->
usedIndex
=
0
;
taosCleanUpHashTable
(
pRuntimeEnv
->
hashList
);
int32_t
primeHashSlot
=
10039
;
pRuntimeEnv
->
hashList
=
taosInitHashTable
(
primeHashSlot
,
taosIntHash_32
,
false
);
while
(
pSupporter
->
meterIdx
<
pSupporter
->
numOfMeters
)
{
resetResWindowInfo
(
&
pRuntimeEnv
->
swindowResInfo
,
pQuery
->
numOfOutputCols
);
while
(
pSupporter
->
meterIdx
<
pSupporter
->
numOfMeters
)
{
int32_t
k
=
pSupporter
->
meterIdx
;
if
(
isQueryKilled
(
pQuery
))
{
...
...
@@ -703,7 +694,7 @@ static void vnodeMultiMeterMultiOutputProcessor(SQInfo *pQInfo) {
#endif
SPointInterpoSupporter
pointInterpSupporter
=
{
0
};
if
(
normalizedFirstQueryRange
(
dataInDisk
,
dataInCache
,
pSupporter
,
&
pointInterpSupporter
)
==
false
)
{
if
(
normalizedFirstQueryRange
(
dataInDisk
,
dataInCache
,
pSupporter
,
&
pointInterpSupporter
,
NULL
)
==
false
)
{
pQuery
->
skey
=
pSupporter
->
rawSKey
;
pQuery
->
ekey
=
pSupporter
->
rawEKey
;
...
...
@@ -778,8 +769,10 @@ static void vnodeMultiMeterMultiOutputProcessor(SQInfo *pQInfo) {
}
if
(
isGroupbyNormalCol
(
pQuery
->
pGroupbyExpr
))
{
for
(
int32_t
i
=
0
;
i
<
pRuntimeEnv
->
usedIndex
;
++
i
)
{
SOutputRes
*
buf
=
&
pRuntimeEnv
->
pResult
[
i
];
SSlidingWindowResInfo
*
pWindowResInfo
=
&
pRuntimeEnv
->
swindowResInfo
;
for
(
int32_t
i
=
0
;
i
<
pWindowResInfo
->
size
;
++
i
)
{
SOutputRes
*
buf
=
&
pWindowResInfo
->
pResult
[
i
];
for
(
int32_t
j
=
0
;
j
<
pQuery
->
numOfOutputCols
;
++
j
)
{
buf
->
numOfRows
=
MAX
(
buf
->
numOfRows
,
buf
->
resultInfo
[
j
].
numOfRes
);
}
...
...
@@ -787,14 +780,12 @@ static void vnodeMultiMeterMultiOutputProcessor(SQInfo *pQInfo) {
pQInfo
->
pMeterQuerySupporter
->
subgroupIdx
=
0
;
pQuery
->
pointsRead
=
0
;
copyFromGroupBuf
(
pQInfo
,
p
RuntimeEnv
->
pResult
);
copyFromGroupBuf
(
pQInfo
,
p
WindowResInfo
->
pResult
);
}
pQInfo
->
pointsRead
+=
pQuery
->
pointsRead
;
pQuery
->
pointsOffset
=
pQuery
->
pointsToRead
;
moveDescOrderResultsToFront
(
pRuntimeEnv
);
dTrace
(
"QInfo %p vid:%d, numOfMeters:%d, index:%d, numOfGroups:%d, %d points returned, totalRead:%d totalReturn:%d,"
"next skey:%"
PRId64
", offset:%"
PRId64
,
...
...
@@ -982,12 +973,11 @@ static void vnodeSingleMeterFixedOutputProcessor(SQInfo *pQInfo) {
if
(
isGroupbyNormalCol
(
pQuery
->
pGroupbyExpr
))
{
pQInfo
->
pMeterQuerySupporter
->
subgroupIdx
=
0
;
pQuery
->
pointsRead
=
0
;
copyFromGroupBuf
(
pQInfo
,
pRuntimeEnv
->
pResult
);
copyFromGroupBuf
(
pQInfo
,
pRuntimeEnv
->
swindowResInfo
.
pResult
);
}
doSkipResults
(
pRuntimeEnv
);
doRevisedResultsByLimit
(
pQInfo
);
moveDescOrderResultsToFront
(
pRuntimeEnv
);
pQInfo
->
pointsRead
=
pQuery
->
pointsRead
;
}
...
...
@@ -1034,8 +1024,6 @@ static void vnodeSingleMeterMultiOutputProcessor(SQInfo *pQInfo) {
}
doRevisedResultsByLimit
(
pQInfo
);
moveDescOrderResultsToFront
(
pRuntimeEnv
);
pQInfo
->
pointsRead
+=
pQuery
->
pointsRead
;
if
(
Q_STATUS_EQUAL
(
pQuery
->
over
,
QUERY_RESBUF_FULL
))
{
...
...
@@ -1063,7 +1051,8 @@ static void vnodeSingleMeterIntervalMainLooper(SMeterQuerySupportObj *pSupporter
(
pQuery
->
skey
>=
pQuery
->
ekey
&&
!
QUERY_IS_ASC_QUERY
(
pQuery
)));
initCtxOutputBuf
(
pRuntimeEnv
);
clearCompletedResWindows
(
&
pRuntimeEnv
->
swindowResInfo
,
pQuery
->
numOfOutputCols
);
vnodeScanAllData
(
pRuntimeEnv
);
if
(
isQueryKilled
(
pQuery
))
{
return
;
...
...
@@ -1094,7 +1083,7 @@ static void vnodeSingleMeterIntervalMainLooper(SMeterQuerySupportObj *pSupporter
}
forwardIntervalQueryRange
(
pSupporter
,
pRuntimeEnv
);
if
(
Q_STATUS_EQUAL
(
pQuery
->
over
,
QUERY_COMPLETED
))
{
if
(
Q_STATUS_EQUAL
(
pQuery
->
over
,
QUERY_COMPLETED
|
QUERY_RESBUF_FULL
))
{
break
;
}
...
...
@@ -1133,17 +1122,8 @@ static void vnodeSingleMeterIntervalProcessor(SQInfo *pQInfo) {
taosInterpoSetStartInfo
(
&
pRuntimeEnv
->
interpoInfo
,
pQuery
->
pointsRead
,
pQuery
->
interpoType
);
SData
**
pInterpoBuf
=
pRuntimeEnv
->
pInterpoBuf
;
if
(
QUERY_IS_ASC_QUERY
(
pQuery
))
{
for
(
int32_t
i
=
0
;
i
<
pQuery
->
numOfOutputCols
;
++
i
)
{
memcpy
(
pInterpoBuf
[
i
]
->
data
,
pQuery
->
sdata
[
i
]
->
data
,
pQuery
->
pointsRead
*
pQuery
->
pSelectExpr
[
i
].
resBytes
);
}
}
else
{
int32_t
size
=
pMeterObj
->
pointsPerFileBlock
;
for
(
int32_t
i
=
0
;
i
<
pQuery
->
numOfOutputCols
;
++
i
)
{
memcpy
(
pInterpoBuf
[
i
]
->
data
,
pQuery
->
sdata
[
i
]
->
data
+
(
size
-
pQuery
->
pointsRead
)
*
pQuery
->
pSelectExpr
[
i
].
resBytes
,
pQuery
->
pointsRead
*
pQuery
->
pSelectExpr
[
i
].
resBytes
);
}
for
(
int32_t
i
=
0
;
i
<
pQuery
->
numOfOutputCols
;
++
i
)
{
memcpy
(
pInterpoBuf
[
i
]
->
data
,
pQuery
->
sdata
[
i
]
->
data
,
pQuery
->
pointsRead
*
pQuery
->
pSelectExpr
[
i
].
resBytes
);
}
numOfInterpo
=
0
;
...
...
@@ -1160,12 +1140,16 @@ static void vnodeSingleMeterIntervalProcessor(SQInfo *pQInfo) {
pQuery
->
pointsRead
=
0
;
}
}
if
(
isGroupbyNormalCol
(
pQuery
->
pGroupbyExpr
)
||
(
pQuery
->
slidingTime
>
0
&&
pQuery
->
nAggTimeInterval
>
0
))
{
pQInfo
->
pMeterQuerySupporter
->
subgroupIdx
=
0
;
pQuery
->
pointsRead
=
0
;
copyFromGroupBuf
(
pQInfo
,
pRuntimeEnv
->
swindowResInfo
.
pResult
);
}
pQInfo
->
pointsRead
+=
pQuery
->
pointsRead
;
pQInfo
->
pointsInterpo
+=
numOfInterpo
;
// moveDescOrderResultsToFront(pRuntimeEnv);
dTrace
(
"%p vid:%d sid:%d id:%s, %d points returned %d points interpo, totalRead:%d totalInterpo:%d totalReturn:%d"
,
pQInfo
,
pMeterObj
->
vnode
,
pMeterObj
->
sid
,
pMeterObj
->
meterId
,
pQuery
->
pointsRead
,
numOfInterpo
,
pQInfo
->
pointsRead
-
pQInfo
->
pointsInterpo
,
pQInfo
->
pointsInterpo
,
pQInfo
->
pointsReturned
);
...
...
@@ -1209,7 +1193,6 @@ void vnodeSingleMeterQuery(SSchedMsg *pMsg) {
(
tFilePage
**
)
pRuntimeEnv
->
pInterpoBuf
,
remain
,
&
numOfInterpo
);
doRevisedResultsByLimit
(
pQInfo
);
moveDescOrderResultsToFront
(
pRuntimeEnv
);
pQInfo
->
pointsInterpo
+=
numOfInterpo
;
pQInfo
->
pointsRead
+=
pQuery
->
pointsRead
;
...
...
src/system/detail/src/vnodeRead.c
浏览文件 @
c6b0d6b0
...
...
@@ -267,6 +267,7 @@ static SQInfo *vnodeAllocateQInfoEx(SQueryMeterMsg *pQueryMsg, SSqlGroupbyExpr *
pQuery
->
pGroupbyExpr
=
pGroupbyExpr
;
pQuery
->
nAggTimeInterval
=
pQueryMsg
->
nAggTimeInterval
;
pQuery
->
slidingTime
=
pQueryMsg
->
slidingTime
;
pQuery
->
interpoType
=
pQueryMsg
->
interpoType
;
pQuery
->
intervalTimeUnit
=
pQueryMsg
->
intervalTimeUnit
;
...
...
@@ -966,6 +967,8 @@ int32_t vnodeConvertQueryMeterMsg(SQueryMeterMsg *pQueryMsg) {
pQueryMsg
->
queryType
=
htons
(
pQueryMsg
->
queryType
);
pQueryMsg
->
nAggTimeInterval
=
htobe64
(
pQueryMsg
->
nAggTimeInterval
);
pQueryMsg
->
slidingTime
=
htobe64
(
pQueryMsg
->
slidingTime
);
pQueryMsg
->
numOfTagsCols
=
htons
(
pQueryMsg
->
numOfTagsCols
);
pQueryMsg
->
numOfCols
=
htons
(
pQueryMsg
->
numOfCols
);
pQueryMsg
->
numOfOutputCols
=
htons
(
pQueryMsg
->
numOfOutputCols
);
...
...
src/util/src/hash.c
浏览文件 @
c6b0d6b0
...
...
@@ -423,7 +423,8 @@ void taosDeleteFromHashTable(HashObj *pObj, const char *key, uint32_t keyLen) {
__wr_lock
(
&
pObj
->
lock
);
}
SHashNode
*
pNode
=
doGetNodeFromHashTable
(
pObj
,
key
,
keyLen
,
NULL
);
uint32_t
val
=
0
;
SHashNode
*
pNode
=
doGetNodeFromHashTable
(
pObj
,
key
,
keyLen
,
&
val
);
if
(
pNode
==
NULL
)
{
if
(
pObj
->
multithreadSafe
)
{
__unlock
(
&
pObj
->
lock
);
...
...
@@ -434,7 +435,12 @@ void taosDeleteFromHashTable(HashObj *pObj, const char *key, uint32_t keyLen) {
SHashNode
*
pNext
=
pNode
->
next
;
if
(
pNode
->
prev
!=
NULL
)
{
pNode
->
prev
->
next
=
pNext
;
int32_t
slot
=
HASH_INDEX
(
val
,
pObj
->
capacity
);
if
(
pObj
->
hashList
[
slot
]
->
next
==
pNode
)
{
pObj
->
hashList
[
slot
]
->
next
=
pNext
;
}
else
{
pNode
->
prev
->
next
=
pNext
;
}
}
if
(
pNext
!=
NULL
)
{
...
...
src/util/src/thashutil.c
浏览文件 @
c6b0d6b0
...
...
@@ -93,6 +93,7 @@ uint32_t taosIntHash_64(const char *key, uint32_t UNUSED_PARAM(len)) {
_hash_fn_t
taosGetDefaultHashFunction
(
int32_t
type
)
{
_hash_fn_t
fn
=
NULL
;
switch
(
type
)
{
case
TSDB_DATA_TYPE_TIMESTAMP
:
case
TSDB_DATA_TYPE_BIGINT
:
fn
=
taosIntHash_64
;
break
;
case
TSDB_DATA_TYPE_BINARY
:
fn
=
MurmurHash3_32
;
break
;
case
TSDB_DATA_TYPE_INT
:
fn
=
taosIntHash_32
;
break
;
...
...
src/util/src/tinterpolation.c
浏览文件 @
c6b0d6b0
...
...
@@ -37,7 +37,7 @@ int64_t taosGetIntervalStartTimestamp(int64_t startTime, int64_t timeRange, char
* here we revised the start time of day according to the local time zone,
* but in case of DST, the start time of one day need to be dynamically decided.
*
* TODO dyn
ma
ically decide the start time of a day
* TODO dyn
am
ically decide the start time of a day
*/
#if defined(WINDOWS) && _MSC_VER >= 1900
...
...
@@ -94,7 +94,7 @@ void taosInterpoSetStartInfo(SInterpolationInfo* pInterpoInfo, int32_t numOfRawD
return
;
}
pInterpoInfo
->
rowIdx
=
INTERPOL_IS_ASC_INTERPOL
(
pInterpoInfo
)
?
0
:
numOfRawDataInRows
-
1
;
pInterpoInfo
->
rowIdx
=
0
;
//
INTERPOL_IS_ASC_INTERPOL(pInterpoInfo) ? 0 : numOfRawDataInRows - 1;
pInterpoInfo
->
numOfRawDataInRows
=
numOfRawDataInRows
;
}
...
...
@@ -118,14 +118,14 @@ int32_t taosGetNumOfResWithoutLimit(SInterpolationInfo* pInterpoInfo, int64_t* p
if
(
numOfAvailRawData
>
0
)
{
int32_t
finalNumOfResult
=
0
;
if
(
pInterpoInfo
->
order
==
TSQL_SO_ASC
)
{
//
if (pInterpoInfo->order == TSQL_SO_ASC) {
// get last timestamp, calculate the result size
int64_t
lastKey
=
pPrimaryKeyArray
[
pInterpoInfo
->
numOfRawDataInRows
-
1
];
finalNumOfResult
=
(
int32_t
)((
lastKey
-
pInterpoInfo
->
startTimestamp
)
/
nInterval
)
+
1
;
}
else
{
// todo error less than one!!!
TSKEY
lastKey
=
pPrimaryKeyArray
[
0
];
finalNumOfResult
=
(
int32_t
)((
pInterpoInfo
->
startTimestamp
-
lastKey
)
/
nInterval
)
+
1
;
}
finalNumOfResult
=
(
int32_t
)(
labs
(
lastKey
-
pInterpoInfo
->
startTimestamp
)
/
nInterval
)
+
1
;
//
} else { // todo error less than one!!!
//
TSKEY lastKey = pPrimaryKeyArray[0];
//
finalNumOfResult = (int32_t)((pInterpoInfo->startTimestamp - lastKey) / nInterval) + 1;
//
}
assert
(
finalNumOfResult
>=
numOfAvailRawData
);
return
finalNumOfResult
;
...
...
@@ -198,11 +198,11 @@ int taosDoLinearInterpolation(int32_t type, SPoint* point1, SPoint* point2, SPoi
}
static
char
*
getPos
(
char
*
data
,
int32_t
bytes
,
int32_t
order
,
int32_t
capacity
,
int32_t
index
)
{
if
(
order
==
TSQL_SO_ASC
)
{
//
if (order == TSQL_SO_ASC) {
return
data
+
index
*
bytes
;
}
else
{
return
data
+
(
capacity
-
index
-
1
)
*
bytes
;
}
//
} else {
//
return data + (capacity - index - 1) * bytes;
//
}
}
static
void
setTagsValueInInterpolation
(
tFilePage
**
data
,
char
**
pTags
,
tColModel
*
pModel
,
int32_t
order
,
int32_t
start
,
...
...
@@ -397,7 +397,7 @@ int32_t taosDoInterpoResult(SInterpolationInfo* pInterpoInfo, int16_t interpoTyp
}
pInterpoInfo
->
startTimestamp
+=
(
nInterval
*
step
);
pInterpoInfo
->
rowIdx
+=
step
;
pInterpoInfo
->
rowIdx
+=
1
;
num
+=
1
;
if
((
pInterpoInfo
->
rowIdx
>=
pInterpoInfo
->
numOfRawDataInRows
&&
INTERPOL_IS_ASC_INTERPOL
(
pInterpoInfo
))
||
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录