Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Rattenking
TDengine
提交
ce44531c
T
TDengine
项目概览
Rattenking
/
TDengine
与 Fork 源项目一致
Fork自
taosdata / TDengine
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
ce44531c
编写于
6月 04, 2021
作者:
L
lichuang
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'develop' into feature/TD-3963
上级
d7219d1a
ecbc6108
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
260 addition
and
273 deletion
+260
-273
src/client/src/tscSQLParser.c
src/client/src/tscSQLParser.c
+23
-13
src/query/inc/qAggMain.h
src/query/inc/qAggMain.h
+12
-18
src/query/src/qAggMain.c
src/query/src/qAggMain.c
+62
-210
src/query/src/qExecutor.c
src/query/src/qExecutor.c
+0
-17
tests/examples/c/apitest.c
tests/examples/c/apitest.c
+24
-15
tests/script/general/parser/function.sim
tests/script/general/parser/function.sim
+118
-0
tests/script/general/parser/nestquery.sim
tests/script/general/parser/nestquery.sim
+21
-0
未找到文件。
src/client/src/tscSQLParser.c
浏览文件 @
ce44531c
...
...
@@ -1938,8 +1938,10 @@ int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, t
}
if
(
index
.
columnIndex
==
TSDB_TBNAME_COLUMN_INDEX
)
{
SSchema
*
colSchema
=
tGetTbnameColumnSchema
();
tscAddFuncInSelectClause
(
pQueryInfo
,
startPos
,
TSDB_FUNC_TAGPRJ
,
&
index
,
colSchema
,
TSDB_COL_TAG
,
getNewResColId
(
pCmd
));
SSchema
colSchema
=
*
tGetTbnameColumnSchema
();
getColumnName
(
pItem
,
colSchema
.
name
,
colSchema
.
name
,
sizeof
(
colSchema
.
name
)
-
1
);
/*SExprInfo* pExpr = */
tscAddFuncInSelectClause
(
pQueryInfo
,
startPos
,
TSDB_FUNC_TAGPRJ
,
&
index
,
&
colSchema
,
TSDB_COL_TAG
,
getNewResColId
(
pCmd
));
}
else
{
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
index
.
tableIndex
);
STableMeta
*
pTableMeta
=
pTableMetaInfo
->
pTableMeta
;
...
...
@@ -2151,10 +2153,6 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
case
TSDB_FUNC_AVG
:
case
TSDB_FUNC_RATE
:
case
TSDB_FUNC_IRATE
:
case
TSDB_FUNC_SUM_RATE
:
case
TSDB_FUNC_SUM_IRATE
:
case
TSDB_FUNC_AVG_RATE
:
case
TSDB_FUNC_AVG_IRATE
:
case
TSDB_FUNC_TWA
:
case
TSDB_FUNC_MIN
:
case
TSDB_FUNC_MAX
:
...
...
@@ -2219,8 +2217,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
SExprInfo
*
pExpr
=
tscExprAppend
(
pQueryInfo
,
functionId
,
&
index
,
resultType
,
resultSize
,
getNewResColId
(
pCmd
),
resultSize
,
false
);
if
(
functionId
==
TSDB_FUNC_LEASTSQR
)
{
/* set the leastsquares parameters */
if
(
functionId
==
TSDB_FUNC_LEASTSQR
)
{
// set the leastsquares parameters
char
val
[
8
]
=
{
0
};
if
(
tVariantDump
(
&
pParamElem
[
1
].
pNode
->
value
,
val
,
TSDB_DATA_TYPE_DOUBLE
,
true
)
<
0
)
{
return
TSDB_CODE_TSC_INVALID_OPERATION
;
...
...
@@ -2234,6 +2231,11 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
}
tscExprAddParams
(
&
pExpr
->
base
,
val
,
TSDB_DATA_TYPE_DOUBLE
,
sizeof
(
double
));
}
else
if
(
functionId
==
TSDB_FUNC_IRATE
)
{
STableComInfo
info
=
tscGetTableInfo
(
pTableMetaInfo
->
pTableMeta
);
int64_t
prec
=
info
.
precision
;
tscExprAddParams
(
&
pExpr
->
base
,
(
char
*
)
&
prec
,
TSDB_DATA_TYPE_BIGINT
,
LONG_BYTES
);
}
SColumnList
ids
=
createColumnList
(
1
,
index
.
tableIndex
,
index
.
columnIndex
);
...
...
@@ -2882,7 +2884,7 @@ int32_t tscTansformFuncForSTableQuery(SQueryInfo* pQueryInfo) {
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
))
{
(
functionId
>=
TSDB_FUNC_RATE
&&
functionId
<=
TSDB_FUNC_IRATE
))
{
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_OPERATION
;
...
...
@@ -3894,7 +3896,8 @@ static int32_t handleExprInQueryCond(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSql
return
code
;
}
if
(
index
.
columnIndex
==
PRIMARYKEY_TIMESTAMP_COL_INDEX
)
{
// query on time range
SSchema
*
pSchema
=
tscGetTableColumnSchema
(
pTableMeta
,
index
.
columnIndex
);
if
(
pSchema
->
type
==
TSDB_DATA_TYPE_TIMESTAMP
&&
index
.
columnIndex
==
PRIMARYKEY_TIMESTAMP_COL_INDEX
)
{
// query on time range
if
(
!
validateJoinExprNode
(
pCmd
,
pQueryInfo
,
*
pExpr
,
&
index
))
{
return
TSDB_CODE_TSC_INVALID_OPERATION
;
}
...
...
@@ -6854,6 +6857,7 @@ int32_t doCheckForStream(SSqlObj* pSql, SSqlInfo* pInfo) {
const
char
*
msg5
=
"sql too long"
;
// todo ADD support
const
char
*
msg6
=
"from missing in subclause"
;
const
char
*
msg7
=
"time interval is required"
;
const
char
*
msg8
=
"the first column should be primary timestamp column"
;
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfo
(
pCmd
);
...
...
@@ -6907,13 +6911,19 @@ int32_t doCheckForStream(SSqlObj* pSql, SSqlInfo* pInfo) {
return
TSDB_CODE_TSC_INVALID_OPERATION
;
}
if
(
isTimeWindowQuery
(
pQueryInfo
)
&&
(
validateFunctionsInIntervalOrGroupbyQuery
(
pCmd
,
pQueryInfo
)
!=
TSDB_CODE_SUCCESS
))
{
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg2
);
}
if
(
!
tscIsProjectionQuery
(
pQueryInfo
)
&&
pQueryInfo
->
interval
.
interval
==
0
)
{
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg7
);
if
(
tscIsProjectionQuery
(
pQueryInfo
))
{
SExprInfo
*
pExpr
=
tscExprGet
(
pQueryInfo
,
0
);
if
(
pExpr
->
base
.
colInfo
.
colId
!=
PRIMARYKEY_TIMESTAMP_COL_INDEX
)
{
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg8
);
}
}
else
{
if
(
pQueryInfo
->
interval
.
interval
==
0
)
{
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg7
);
}
}
// set the created table[stream] name
...
...
src/query/inc/qAggMain.h
浏览文件 @
ce44531c
...
...
@@ -65,24 +65,18 @@ extern "C" {
#define TSDB_FUNC_RATE 29
#define TSDB_FUNC_IRATE 30
#define TSDB_FUNC_SUM_RATE 31
#define TSDB_FUNC_SUM_IRATE 32
#define TSDB_FUNC_AVG_RATE 33
#define TSDB_FUNC_AVG_IRATE 34
#define TSDB_FUNC_TID_TAG 35
#define TSDB_FUNC_BLKINFO 36
#define TSDB_FUNC_HISTOGRAM 37
#define TSDB_FUNC_HLL 38
#define TSDB_FUNC_MODE 39
#define TSDB_FUNC_SAMPLE 40
#define TSDB_FUNC_CEIL 41
#define TSDB_FUNC_FLOOR 42
#define TSDB_FUNC_ROUND 43
#define TSDB_FUNC_MAVG 44
#define TSDB_FUNC_CSUM 45
#define TSDB_FUNC_TID_TAG 31
#define TSDB_FUNC_BLKINFO 32
#define TSDB_FUNC_HISTOGRAM 33
#define TSDB_FUNC_HLL 34
#define TSDB_FUNC_MODE 35
#define TSDB_FUNC_SAMPLE 36
#define TSDB_FUNC_CEIL 37
#define TSDB_FUNC_FLOOR 38
#define TSDB_FUNC_ROUND 39
#define TSDB_FUNC_MAVG 40
#define TSDB_FUNC_CSUM 41
#define TSDB_FUNCSTATE_SO 0x1u // single output
#define TSDB_FUNCSTATE_MO 0x2u // dynamic number of output, not multinumber of output e.g., TOP/BOTTOM
...
...
src/query/src/qAggMain.c
浏览文件 @
ce44531c
...
...
@@ -152,15 +152,13 @@ typedef struct STSCompInfo {
}
STSCompInfo
;
typedef
struct
SRateInfo
{
int64_t
C
orrectionValue
;
int64_t
firstValue
;
double
c
orrectionValue
;
double
firstValue
;
TSKEY
firstKey
;
int64_t
lastValue
;
double
lastValue
;
TSKEY
lastKey
;
int8_t
hasResult
;
// flag to denote has value
bool
isIRate
;
// true for IRate functions, false for Rate functions
int64_t
num
;
// for sum/avg
double
sum
;
// for sum/avg
}
SRateInfo
;
int32_t
getResultDataInfo
(
int32_t
dataType
,
int32_t
dataBytes
,
int32_t
functionId
,
int32_t
param
,
int16_t
*
type
,
...
...
@@ -238,7 +236,7 @@ int32_t getResultDataInfo(int32_t dataType, int32_t dataBytes, int32_t functionI
*
interBytes
=
*
bytes
;
return
TSDB_CODE_SUCCESS
;
}
else
if
(
functionId
>=
TSDB_FUNC_RATE
&&
functionId
<=
TSDB_FUNC_
AVG_
IRATE
)
{
}
else
if
(
functionId
>=
TSDB_FUNC_RATE
&&
functionId
<=
TSDB_FUNC_IRATE
)
{
*
type
=
TSDB_DATA_TYPE_DOUBLE
;
*
bytes
=
sizeof
(
SRateInfo
);
*
interBytes
=
sizeof
(
SRateInfo
);
...
...
@@ -304,7 +302,7 @@ int32_t getResultDataInfo(int32_t dataType, int32_t dataBytes, int32_t functionI
*
type
=
TSDB_DATA_TYPE_DOUBLE
;
*
bytes
=
sizeof
(
double
);
*
interBytes
=
sizeof
(
SAvgInfo
);
}
else
if
(
functionId
>=
TSDB_FUNC_RATE
&&
functionId
<=
TSDB_FUNC_
AVG_
IRATE
)
{
}
else
if
(
functionId
>=
TSDB_FUNC_RATE
&&
functionId
<=
TSDB_FUNC_IRATE
)
{
*
type
=
TSDB_DATA_TYPE_DOUBLE
;
*
bytes
=
sizeof
(
double
);
*
interBytes
=
sizeof
(
SRateInfo
);
...
...
@@ -4479,36 +4477,34 @@ static void ts_comp_finalize(SQLFunctionCtx *pCtx) {
}
//////////////////////////////////////////////////////////////////////////////////////////////
//
RATE
functions
static
double
do_calc_rate
(
const
SRateInfo
*
pRateInfo
)
{
if
((
INT64_MIN
==
pRateInfo
->
lastKey
)
||
(
INT64_MIN
==
pRateInfo
->
firstKey
)
||
(
pRateInfo
->
firstKey
>=
pRateInfo
->
lastKey
))
{
return
0
;
//
rate
functions
static
double
do_calc_rate
(
const
SRateInfo
*
pRateInfo
,
double
tickPerSec
)
{
if
((
INT64_MIN
==
pRateInfo
->
lastKey
)
||
(
INT64_MIN
==
pRateInfo
->
firstKey
)
||
(
pRateInfo
->
firstKey
>=
pRateInfo
->
lastKey
))
{
return
0
.
0
;
}
int64_t
diff
=
0
;
double
diff
=
0
;
if
(
pRateInfo
->
isIRate
)
{
// If the previous value of the last is greater than the last value, only keep the last point instead of the delta
// value between two values.
diff
=
pRateInfo
->
lastValue
;
if
(
diff
>=
pRateInfo
->
firstValue
)
{
diff
-=
pRateInfo
->
firstValue
;
}
}
else
{
diff
=
pRateInfo
->
C
orrectionValue
+
pRateInfo
->
lastValue
-
pRateInfo
->
firstValue
;
diff
=
pRateInfo
->
c
orrectionValue
+
pRateInfo
->
lastValue
-
pRateInfo
->
firstValue
;
if
(
diff
<=
0
)
{
return
0
;
}
}
int64_t
duration
=
pRateInfo
->
lastKey
-
pRateInfo
->
firstKey
;
duration
=
(
duration
+
500
)
/
1000
;
double
resultVal
=
((
double
)
diff
)
/
duration
;
qDebug
(
"do_calc_rate() isIRate:%d firstKey:%"
PRId64
" lastKey:%"
PRId64
" firstValue:%"
PRId64
" lastValue:%"
PRId64
" CorrectionValue:%"
PRId64
" resultVal:%f"
,
pRateInfo
->
isIRate
,
pRateInfo
->
firstKey
,
pRateInfo
->
lastKey
,
pRateInfo
->
firstValue
,
pRateInfo
->
lastValue
,
pRateInfo
->
CorrectionValue
,
resultVal
);
return
resultVal
;
if
(
duration
==
0
)
{
return
0
;
}
return
(
duration
>
0
)
?
((
double
)
diff
)
/
(
duration
/
tickPerSec
)
:
0
.
0
;
}
static
bool
rate_function_setup
(
SQLFunctionCtx
*
pCtx
)
{
...
...
@@ -4516,19 +4512,17 @@ static bool rate_function_setup(SQLFunctionCtx *pCtx) {
return
false
;
}
SResultRowCellInfo
*
pResInfo
=
GET_RES_INFO
(
pCtx
);
//->pOutput + pCtx->outputBytes;
SRateInfo
*
pInfo
=
GET_ROWCELL_INTERBUF
(
pResInfo
);
pInfo
->
C
orrectionValue
=
0
;
SResultRowCellInfo
*
pResInfo
=
GET_RES_INFO
(
pCtx
);
SRateInfo
*
pInfo
=
GET_ROWCELL_INTERBUF
(
pResInfo
);
pInfo
->
c
orrectionValue
=
0
;
pInfo
->
firstKey
=
INT64_MIN
;
pInfo
->
lastKey
=
INT64_MIN
;
pInfo
->
firstValue
=
INT64_MIN
;
pInfo
->
lastValue
=
INT64_MIN
;
pInfo
->
num
=
0
;
pInfo
->
sum
=
0
;
pInfo
->
hasResult
=
0
;
pInfo
->
isIRate
=
(
(
pCtx
->
functionId
==
TSDB_FUNC_IRATE
)
||
(
pCtx
->
functionId
==
TSDB_FUNC_SUM_IRATE
)
||
(
pCtx
->
functionId
==
TSDB_FUNC_AVG_IRATE
)
);
pInfo
->
isIRate
=
(
pCtx
->
functionId
==
TSDB_FUNC_IRATE
);
return
true
;
}
...
...
@@ -4550,26 +4544,22 @@ static void rate_function(SQLFunctionCtx *pCtx) {
notNullElems
++
;
int64_t
v
=
0
;
GET_TYPED_DATA
(
v
,
int64_t
,
pCtx
->
inputType
,
pData
);
double
v
=
0
;
GET_TYPED_DATA
(
v
,
double
,
pCtx
->
inputType
,
pData
);
if
((
INT64_MIN
==
pRateInfo
->
firstValue
)
||
(
INT64_MIN
==
pRateInfo
->
firstKey
))
{
pRateInfo
->
firstValue
=
v
;
pRateInfo
->
firstKey
=
primaryKey
[
i
];
qDebug
(
"firstValue:%"
PRId64
" firstKey:%"
PRId64
,
pRateInfo
->
firstValue
,
pRateInfo
->
firstKey
);
}
if
(
INT64_MIN
==
pRateInfo
->
lastValue
)
{
pRateInfo
->
lastValue
=
v
;
}
else
if
(
v
<
pRateInfo
->
lastValue
)
{
pRateInfo
->
CorrectionValue
+=
pRateInfo
->
lastValue
;
qDebug
(
"CorrectionValue:%"
PRId64
,
pRateInfo
->
CorrectionValue
);
pRateInfo
->
correctionValue
+=
pRateInfo
->
lastValue
;
}
pRateInfo
->
lastValue
=
v
;
pRateInfo
->
lastKey
=
primaryKey
[
i
];
qDebug
(
"lastValue:%"
PRId64
" lastKey:%"
PRId64
,
pRateInfo
->
lastValue
,
pRateInfo
->
lastKey
);
}
if
(
!
pCtx
->
hasNull
)
{
...
...
@@ -4600,8 +4590,8 @@ static void rate_function_f(SQLFunctionCtx *pCtx, int32_t index) {
SRateInfo
*
pRateInfo
=
(
SRateInfo
*
)
GET_ROWCELL_INTERBUF
(
pResInfo
);
TSKEY
*
primaryKey
=
GET_TS_LIST
(
pCtx
);
int64_t
v
=
0
;
GET_TYPED_DATA
(
v
,
int64_t
,
pCtx
->
inputType
,
pData
);
double
v
=
0
;
GET_TYPED_DATA
(
v
,
double
,
pCtx
->
inputType
,
pData
);
if
((
INT64_MIN
==
pRateInfo
->
firstValue
)
||
(
INT64_MIN
==
pRateInfo
->
firstKey
))
{
pRateInfo
->
firstValue
=
v
;
...
...
@@ -4611,14 +4601,12 @@ static void rate_function_f(SQLFunctionCtx *pCtx, int32_t index) {
if
(
INT64_MIN
==
pRateInfo
->
lastValue
)
{
pRateInfo
->
lastValue
=
v
;
}
else
if
(
v
<
pRateInfo
->
lastValue
)
{
pRateInfo
->
C
orrectionValue
+=
pRateInfo
->
lastValue
;
pRateInfo
->
c
orrectionValue
+=
pRateInfo
->
lastValue
;
}
pRateInfo
->
lastValue
=
v
;
pRateInfo
->
lastKey
=
primaryKey
[
index
];
qDebug
(
"====%p rate_function_f() index:%d lastValue:%"
PRId64
" lastKey:%"
PRId64
" CorrectionValue:%"
PRId64
,
pCtx
,
index
,
pRateInfo
->
lastValue
,
pRateInfo
->
lastKey
,
pRateInfo
->
CorrectionValue
);
SET_VAL
(
pCtx
,
1
,
1
);
// set has result flag
...
...
@@ -4637,28 +4625,19 @@ static void rate_func_copy(SQLFunctionCtx *pCtx) {
SResultRowCellInfo
*
pResInfo
=
GET_RES_INFO
(
pCtx
);
memcpy
(
GET_ROWCELL_INTERBUF
(
pResInfo
),
pCtx
->
pInput
,
(
size_t
)
pCtx
->
inputBytes
);
pResInfo
->
hasResult
=
((
SRateInfo
*
)
pCtx
->
pInput
)
->
hasResult
;
SRateInfo
*
pRateInfo
=
(
SRateInfo
*
)
pCtx
->
pInput
;
qDebug
(
"%p rate_func_merge() firstKey:%"
PRId64
" lastKey:%"
PRId64
" firstValue:%"
PRId64
" lastValue:%"
PRId64
" CorrectionValue:%"
PRId64
" hasResult:%d"
,
pCtx
,
pRateInfo
->
firstKey
,
pRateInfo
->
lastKey
,
pRateInfo
->
firstValue
,
pRateInfo
->
lastValue
,
pRateInfo
->
CorrectionValue
,
pRateInfo
->
hasResult
);
}
static
void
rate_finalizer
(
SQLFunctionCtx
*
pCtx
)
{
SResultRowCellInfo
*
pResInfo
=
GET_RES_INFO
(
pCtx
);
SRateInfo
*
pRateInfo
=
(
SRateInfo
*
)
GET_ROWCELL_INTERBUF
(
pResInfo
);
qDebug
(
"%p isIRate:%d firstKey:%"
PRId64
" lastKey:%"
PRId64
" firstValue:%"
PRId64
" lastValue:%"
PRId64
" CorrectionValue:%"
PRId64
" hasResult:%d"
,
pCtx
,
pRateInfo
->
isIRate
,
pRateInfo
->
firstKey
,
pRateInfo
->
lastKey
,
pRateInfo
->
firstValue
,
pRateInfo
->
lastValue
,
pRateInfo
->
CorrectionValue
,
pRateInfo
->
hasResult
);
if
(
pRateInfo
->
hasResult
!=
DATA_SET_FLAG
)
{
setNull
(
pCtx
->
pOutput
,
TSDB_DATA_TYPE_DOUBLE
,
sizeof
(
double
));
return
;
}
*
(
double
*
)
pCtx
->
pOutput
=
do_calc_rate
(
pRateInfo
);
qDebug
(
"rate_finalizer() output result:%f"
,
*
(
double
*
)
pCtx
->
pOutput
);
*
(
double
*
)
pCtx
->
pOutput
=
do_calc_rate
(
pRateInfo
,
TSDB_TICK_PER_SECOND
(
pCtx
->
param
[
0
].
i64
));
// cannot set the numOfIteratedElems again since it is set during previous iteration
pResInfo
->
numOfRes
=
1
;
pResInfo
->
hasResult
=
DATA_SET_FLAG
;
...
...
@@ -4667,44 +4646,32 @@ static void rate_finalizer(SQLFunctionCtx *pCtx) {
}
static
void
irate_function
(
SQLFunctionCtx
*
pCtx
)
{
int32_t
notNullElems
=
0
;
SResultRowCellInfo
*
pResInfo
=
GET_RES_INFO
(
pCtx
);
SRateInfo
*
pRateInfo
=
(
SRateInfo
*
)
GET_ROWCELL_INTERBUF
(
pResInfo
);
TSKEY
*
primaryKey
=
GET_TS_LIST
(
pCtx
);
SResultRowCellInfo
*
pResInfo
=
GET_RES_INFO
(
pCtx
);
qDebug
(
"%p irate_function() size:%d, hasNull:%d"
,
pCtx
,
pCtx
->
size
,
pCtx
->
hasNull
);
if
(
pCtx
->
size
<
1
)
{
return
;
}
int32_t
notNullElems
=
0
;
SRateInfo
*
pRateInfo
=
(
SRateInfo
*
)
GET_ROWCELL_INTERBUF
(
pResInfo
);
TSKEY
*
primaryKey
=
GET_TS_LIST
(
pCtx
);
for
(
int32_t
i
=
pCtx
->
size
-
1
;
i
>=
0
;
--
i
)
{
char
*
pData
=
GET_INPUT_DATA
(
pCtx
,
i
);
if
(
pCtx
->
hasNull
&&
isNull
(
pData
,
pCtx
->
inputType
))
{
qDebug
(
"%p irate_function() index of null data:%d"
,
pCtx
,
i
);
continue
;
}
notNullElems
++
;
int64_t
v
=
0
;
GET_TYPED_DATA
(
v
,
int64_t
,
pCtx
->
inputType
,
pData
);
// TODO: calc once if only call this function once ????
if
((
INT64_MIN
==
pRateInfo
->
lastKey
)
||
(
INT64_MIN
==
pRateInfo
->
lastValue
))
{
double
v
=
0
;
GET_TYPED_DATA
(
v
,
double
,
pCtx
->
inputType
,
pData
);
if
((
INT64_MIN
==
pRateInfo
->
lastKey
)
||
primaryKey
[
i
]
>
pRateInfo
->
lastKey
)
{
pRateInfo
->
lastValue
=
v
;
pRateInfo
->
lastKey
=
primaryKey
[
i
];
qDebug
(
"%p irate_function() lastValue:%"
PRId64
" lastKey:%"
PRId64
,
pCtx
,
pRateInfo
->
lastValue
,
pRateInfo
->
lastKey
);
continue
;
}
if
((
INT64_MIN
==
pRateInfo
->
firstKey
)
||
(
INT64_MIN
==
pRateInfo
->
firstValue
))
{
if
((
INT64_MIN
==
pRateInfo
->
firstKey
)
||
primaryKey
[
i
]
>
pRateInfo
->
firstKey
)
{
pRateInfo
->
firstValue
=
v
;
pRateInfo
->
firstKey
=
primaryKey
[
i
];
qDebug
(
"%p irate_function() firstValue:%"
PRId64
" firstKey:%"
PRId64
,
pCtx
,
pRateInfo
->
firstValue
,
pRateInfo
->
firstKey
);
break
;
}
}
...
...
@@ -4733,8 +4700,8 @@ static void irate_function_f(SQLFunctionCtx *pCtx, int32_t index) {
SRateInfo
*
pRateInfo
=
(
SRateInfo
*
)
GET_ROWCELL_INTERBUF
(
pResInfo
);
TSKEY
*
primaryKey
=
GET_TS_LIST
(
pCtx
);
int64_t
v
=
0
;
GET_TYPED_DATA
(
v
,
int64_t
,
pCtx
->
inputType
,
pData
);
double
v
=
0
;
GET_TYPED_DATA
(
v
,
double
,
pCtx
->
inputType
,
pData
);
pRateInfo
->
firstKey
=
pRateInfo
->
lastKey
;
pRateInfo
->
firstValue
=
pRateInfo
->
lastValue
;
...
...
@@ -4742,8 +4709,7 @@ static void irate_function_f(SQLFunctionCtx *pCtx, int32_t index) {
pRateInfo
->
lastValue
=
v
;
pRateInfo
->
lastKey
=
primaryKey
[
index
];
qDebug
(
"====%p irate_function_f() index:%d lastValue:%"
PRId64
" lastKey:%"
PRId64
" firstValue:%"
PRId64
" firstKey:%"
PRId64
,
pCtx
,
index
,
pRateInfo
->
lastValue
,
pRateInfo
->
lastKey
,
pRateInfo
->
firstValue
,
pRateInfo
->
firstKey
);
// qDebug("====%p irate_function_f() index:%d lastValue:%" PRId64 " lastKey:%" PRId64 " firstValue:%" PRId64 " firstKey:%" PRId64, pCtx, index, pRateInfo->lastValue, pRateInfo->lastKey, pRateInfo->firstValue , pRateInfo->firstKey);
SET_VAL
(
pCtx
,
1
,
1
);
// set has result flag
...
...
@@ -4756,68 +4722,6 @@ static void irate_function_f(SQLFunctionCtx *pCtx, int32_t index) {
}
}
static
void
do_sumrate_merge
(
SQLFunctionCtx
*
pCtx
)
{
SResultRowCellInfo
*
pResInfo
=
GET_RES_INFO
(
pCtx
);
assert
(
pCtx
->
stableQuery
);
SRateInfo
*
pRateInfo
=
(
SRateInfo
*
)
GET_ROWCELL_INTERBUF
(
pResInfo
);
char
*
input
=
GET_INPUT_DATA_LIST
(
pCtx
);
for
(
int32_t
i
=
0
;
i
<
pCtx
->
size
;
++
i
,
input
+=
pCtx
->
inputBytes
)
{
SRateInfo
*
pInput
=
(
SRateInfo
*
)
input
;
qDebug
(
"%p do_sumrate_merge() hasResult:%d input num:%"
PRId64
" input sum:%f total num:%"
PRId64
" total sum:%f"
,
pCtx
,
pInput
->
hasResult
,
pInput
->
num
,
pInput
->
sum
,
pRateInfo
->
num
,
pRateInfo
->
sum
);
if
(
pInput
->
hasResult
!=
DATA_SET_FLAG
)
{
continue
;
}
else
if
(
pInput
->
num
==
0
)
{
pRateInfo
->
sum
+=
do_calc_rate
(
pInput
);
pRateInfo
->
num
++
;
}
else
{
pRateInfo
->
sum
+=
pInput
->
sum
;
pRateInfo
->
num
+=
pInput
->
num
;
}
pRateInfo
->
hasResult
=
DATA_SET_FLAG
;
}
// if the data set hasResult is not set, the result is null
if
(
DATA_SET_FLAG
==
pRateInfo
->
hasResult
)
{
pResInfo
->
hasResult
=
DATA_SET_FLAG
;
SET_VAL
(
pCtx
,
pRateInfo
->
num
,
1
);
memcpy
(
pCtx
->
pOutput
,
GET_ROWCELL_INTERBUF
(
pResInfo
),
sizeof
(
SRateInfo
));
}
}
static
void
sumrate_func_merge
(
SQLFunctionCtx
*
pCtx
)
{
qDebug
(
"%p sumrate_func_merge() process ..."
,
pCtx
);
do_sumrate_merge
(
pCtx
);
}
static
void
sumrate_finalizer
(
SQLFunctionCtx
*
pCtx
)
{
SResultRowCellInfo
*
pResInfo
=
GET_RES_INFO
(
pCtx
);
SRateInfo
*
pRateInfo
=
(
SRateInfo
*
)
GET_ROWCELL_INTERBUF
(
pResInfo
);
qDebug
(
"%p sumrate_finalizer() superTableQ:%d num:%"
PRId64
" sum:%f hasResult:%d"
,
pCtx
,
pCtx
->
stableQuery
,
pRateInfo
->
num
,
pRateInfo
->
sum
,
pRateInfo
->
hasResult
);
if
(
pRateInfo
->
hasResult
!=
DATA_SET_FLAG
)
{
setNull
(
pCtx
->
pOutput
,
TSDB_DATA_TYPE_DOUBLE
,
sizeof
(
double
));
return
;
}
if
(
pRateInfo
->
num
==
0
)
{
// from meter
*
(
double
*
)
pCtx
->
pOutput
=
do_calc_rate
(
pRateInfo
);
}
else
if
(
pCtx
->
functionId
==
TSDB_FUNC_SUM_RATE
||
pCtx
->
functionId
==
TSDB_FUNC_SUM_IRATE
)
{
*
(
double
*
)
pCtx
->
pOutput
=
pRateInfo
->
sum
;
}
else
{
*
(
double
*
)
pCtx
->
pOutput
=
pRateInfo
->
sum
/
pRateInfo
->
num
;
}
pResInfo
->
numOfRes
=
1
;
pResInfo
->
hasResult
=
DATA_SET_FLAG
;
doFinalizer
(
pCtx
);
}
void
blockInfo_func
(
SQLFunctionCtx
*
pCtx
)
{
SResultRowCellInfo
*
pResInfo
=
GET_RES_INFO
(
pCtx
);
STableBlockDist
*
pDist
=
(
STableBlockDist
*
)
GET_ROWCELL_INTERBUF
(
pResInfo
);
...
...
@@ -4983,12 +4887,12 @@ void blockinfo_func_finalizer(SQLFunctionCtx* pCtx) {
int32_t
functionCompatList
[]
=
{
// count, sum, avg, min, max, stddev, percentile, apercentile, first, last
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
// last_row,top, bottom, spread, twa, leastsqr, ts, ts_dummy, tag_dummy, ts_
z
// last_row,top, bottom, spread, twa, leastsqr, ts, ts_dummy, tag_dummy, ts_
comp
4
,
-
1
,
-
1
,
1
,
1
,
1
,
1
,
1
,
1
,
-
1
,
// tag, colprj, tagprj, arithmetic, diff, first_dist, last_dist, interp rate irate
1
,
1
,
1
,
1
,
-
1
,
1
,
1
,
5
,
1
,
1
,
//
sum_rate, sum_irate, avg_rate, avg_irate,
tid_tag, blk_info
1
,
1
,
1
,
1
,
6
,
7
// tag, colprj, tagprj, arithmetic, diff, first_dist, last_dist,
stddev_dst,
interp rate irate
1
,
1
,
1
,
1
,
-
1
,
1
,
1
,
1
,
5
,
1
,
1
,
// tid_tag, blk_info
6
,
7
};
SAggFunctionInfo
aAggs
[]
=
{{
...
...
@@ -5400,58 +5304,6 @@ SAggFunctionInfo aAggs[] = {{
},
{
// 31
"sum_rate"
,
TSDB_FUNC_SUM_RATE
,
TSDB_FUNC_SUM_RATE
,
TSDB_BASE_FUNC_SO
|
TSDB_FUNCSTATE_NEED_TS
,
rate_function_setup
,
rate_function
,
rate_function_f
,
sumrate_finalizer
,
sumrate_func_merge
,
dataBlockRequired
,
},
{
// 32
"sum_irate"
,
TSDB_FUNC_SUM_IRATE
,
TSDB_FUNC_SUM_IRATE
,
TSDB_BASE_FUNC_SO
|
TSDB_FUNCSTATE_NEED_TS
,
rate_function_setup
,
irate_function
,
irate_function_f
,
sumrate_finalizer
,
sumrate_func_merge
,
dataBlockRequired
,
},
{
// 33
"avg_rate"
,
TSDB_FUNC_AVG_RATE
,
TSDB_FUNC_AVG_RATE
,
TSDB_BASE_FUNC_SO
|
TSDB_FUNCSTATE_NEED_TS
,
rate_function_setup
,
rate_function
,
rate_function_f
,
sumrate_finalizer
,
sumrate_func_merge
,
dataBlockRequired
,
},
{
// 34
"avg_irate"
,
TSDB_FUNC_AVG_IRATE
,
TSDB_FUNC_AVG_IRATE
,
TSDB_BASE_FUNC_SO
|
TSDB_FUNCSTATE_NEED_TS
,
rate_function_setup
,
irate_function
,
irate_function_f
,
sumrate_finalizer
,
sumrate_func_merge
,
dataBlockRequired
,
},
{
// 35
"tbid"
,
// return table id and the corresponding tags for join match and subscribe
TSDB_FUNC_TID_TAG
,
TSDB_FUNC_TID_TAG
,
...
...
@@ -5464,15 +5316,15 @@ SAggFunctionInfo aAggs[] = {{
dataBlockRequired
,
},
{
// 3
5
"_block_dist"
,
// return table id and the corresponding tags for join match and subscribe
TSDB_FUNC_BLKINFO
,
TSDB_FUNC_BLKINFO
,
TSDB_FUNCSTATE_SO
|
TSDB_FUNCSTATE_STABLE
,
function_setup
,
blockInfo_func
,
noop2
,
blockinfo_func_finalizer
,
block_func_merge
,
dataBlockRequired
,
// 3
2
"_block_dist"
,
// return table id and the corresponding tags for join match and subscribe
TSDB_FUNC_BLKINFO
,
TSDB_FUNC_BLKINFO
,
TSDB_FUNCSTATE_SO
|
TSDB_FUNCSTATE_STABLE
,
function_setup
,
blockInfo_func
,
noop2
,
blockinfo_func_finalizer
,
block_func_merge
,
dataBlockRequired
,
}};
src/query/src/qExecutor.c
浏览文件 @
ce44531c
...
...
@@ -1990,23 +1990,6 @@ void setQueryKilled(SQInfo *pQInfo) { pQInfo->code = TSDB_CODE_TSC_QUERY_CANCELL
// return false;
//}
// TODO REFACTOR:MERGE WITH CLIENT-SIDE FUNCTION
static
UNUSED_FUNC
bool
isSumAvgRateQuery
(
SQueryAttr
*
pQueryAttr
)
{
for
(
int32_t
i
=
0
;
i
<
pQueryAttr
->
numOfOutput
;
++
i
)
{
int32_t
functionId
=
pQueryAttr
->
pExpr1
[
i
].
base
.
functionId
;
if
(
functionId
==
TSDB_FUNC_TS
)
{
continue
;
}
if
(
functionId
==
TSDB_FUNC_SUM_RATE
||
functionId
==
TSDB_FUNC_SUM_IRATE
||
functionId
==
TSDB_FUNC_AVG_RATE
||
functionId
==
TSDB_FUNC_AVG_IRATE
)
{
return
true
;
}
}
return
false
;
}
static
bool
isFirstLastRowQuery
(
SQueryAttr
*
pQueryAttr
)
{
for
(
int32_t
i
=
0
;
i
<
pQueryAttr
->
numOfOutput
;
++
i
)
{
int32_t
functionID
=
pQueryAttr
->
pExpr1
[
i
].
base
.
functionId
;
...
...
tests/examples/c/apitest.c
浏览文件 @
ce44531c
...
...
@@ -402,10 +402,6 @@ void verify_prepare(TAOS* taos) {
taos_stmt_close
(
stmt
);
}
void
verify_prepare2
(
TAOS
*
taos
)
{
TAOS_RES
*
result
=
taos_query
(
taos
,
"drop database if exists test;"
);
taos_free_result
(
result
);
...
...
@@ -531,10 +527,9 @@ void verify_prepare2(TAOS* taos) {
params
[
9
].
is_null
=
is_null
;
params
[
9
].
num
=
10
;
sql
=
"insert into ? values(?,?,?,?,?,?,?,?,?,?)"
;
sql
=
"insert into ? (ts, b, v1, v2, v4, v8, f4, f8, bin, blob) values(?,?,?,?,?,?,?,?,?,?)"
;
code
=
taos_stmt_prepare
(
stmt
,
sql
,
0
);
if
(
code
!=
0
){
if
(
code
!=
0
)
{
printf
(
"
\033
[31mfailed to execute taos_stmt_prepare. code:0x%x
\033
[0m
\n
"
,
code
);
}
...
...
@@ -577,9 +572,8 @@ void verify_prepare2(TAOS* taos) {
printf
(
"
\033
[31mfailed to execute insert statement.
\033
[0m
\n
"
);
return
;
}
taos_stmt_close
(
stmt
);
taos_stmt_close
(
stmt
);
// query the records
stmt
=
taos_stmt_init
(
taos
);
...
...
@@ -623,9 +617,16 @@ void verify_prepare2(TAOS* taos) {
taos_free_result
(
result
);
taos_stmt_close
(
stmt
);
}
free
(
t8_len
);
free
(
t16_len
);
free
(
t32_len
);
free
(
t64_len
);
free
(
float_len
);
free
(
double_len
);
free
(
bin_len
);
free
(
blob_len
);
}
void
verify_prepare3
(
TAOS
*
taos
)
{
TAOS_RES
*
result
=
taos_query
(
taos
,
"drop database if exists test;"
);
...
...
@@ -810,7 +811,6 @@ void verify_prepare3(TAOS* taos) {
blob_len
[
i
]
=
(
int32_t
)
strlen
(
v
.
blob
[
i
]);
}
taos_stmt_bind_param_batch
(
stmt
,
params
);
taos_stmt_add_batch
(
stmt
);
...
...
@@ -852,10 +852,12 @@ void verify_prepare3(TAOS* taos) {
int
rows
=
0
;
int
num_fields
=
taos_num_fields
(
result
);
TAOS_FIELD
*
fields
=
taos_fetch_fields
(
result
);
char
temp
[
256
];
char
temp
[
256
]
=
{
0
}
;
// fetch the records row by row
while
((
row
=
taos_fetch_row
(
result
)))
{
memset
(
temp
,
0
,
sizeof
(
temp
)
/
sizeof
(
temp
[
0
]));
rows
++
;
taos_print_row
(
temp
,
row
,
fields
,
num_fields
);
printf
(
"%s
\n
"
,
temp
);
...
...
@@ -863,9 +865,16 @@ void verify_prepare3(TAOS* taos) {
taos_free_result
(
result
);
taos_stmt_close
(
stmt
);
}
free
(
t8_len
);
free
(
t16_len
);
free
(
t32_len
);
free
(
t64_len
);
free
(
float_len
);
free
(
double_len
);
free
(
bin_len
);
free
(
blob_len
);
}
void
retrieve_callback
(
void
*
param
,
TAOS_RES
*
tres
,
int
numOfRows
)
{
...
...
tests/script/general/parser/function.sim
浏览文件 @
ce44531c
...
...
@@ -814,3 +814,121 @@ if $data00 != 1 then
endi
print ====================> TODO stddev + normal column filter
print ====================> irate
sql select irate(k) from t1
if $rows != 1 then
return -1
endi
if $data00 != 0.000027778 then
return -1
endi
sql select irate(k) from t1 where ts>='2015-8-18 00:30:00.000'
if $rows != 1 then
return -1
endi
if $data00 != 0.000000000 then
print expect 0.000000000, actual $data00
return -1
endi
sql select irate(k) from t1 where ts>='2015-8-18 00:06:00.000' and ts<='2015-8-18 00:12:000';
if $rows != 1 then
return -1
endi
if $data00 != 0.005633334 then
return -1
endi
sql select irate(k) from t1 interval(10a)
if $rows != 6 then
return -1
endi
if $data01 != 0.000000000 then
return -1
endi
if $data11 != 0.000000000 then
return -1
endi
if $data51 != 0.000000000 then
return -1
endi
sql select count(*),irate(k) from t1 interval(10m)
if $rows != 4 then
return -1
endi
if $data00 != @15-08-18 00:00:00.000@ then
return -1
endi
if $data01 != 2 then
return -1
endi
if $data02 != 0.000144445 then
return -1
endi
if $data10 != @15-08-18 00:10:00.000@ then
return -1
endi
if $data11 != 2 then
return -1
endi
if $data12 != 0.000272222 then
return -1
endi
if $data20 != @15-08-18 00:20:00.000@ then
return -1
endi
if $data21 != 1 then
return -1
endi
if $data22 != 0.000000000 then
return -1
endi
if $data30 != @15-08-18 00:30:00.000@ then
return -1
endi
if $data31 != 1 then
return -1
endi
if $data32 != 0.000000000 then
return -1
endi
sql select count(*),irate(k) from t1 interval(10m) order by ts desc
if $rows != 4 then
return -1
endi
if $data30 != @15-08-18 00:00:00.000@ then
return -1
endi
if $data31 != 2 then
return -1
endi
if $data32 != 0.000144445 then
return -1
endi
tests/script/general/parser/nestquery.sim
浏览文件 @
ce44531c
...
...
@@ -124,6 +124,27 @@ if $rows != 2 then
return -1
endi
sql select * from (select count(*) a, tbname f1 from nest_mt0 group by tbname) t where t.a<0 and f1 = 'nest_tb0';
if $rows != 0 then
return -1
endi
sql select * from (select count(*) a, tbname f1 from nest_mt0 group by tbname) t where t.a>0 and f1 = 'nest_tb0';
if $rows != 1 then
return -1
endi
if $data00 != 10000 then
return -1
endi
if $data01 != @nest_tb0@ then
return -1
endi
if $data02 != @nest_tb0@ then
return -1
endi
print ===================> nest query interval
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录