Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
4a02684b
TDengine
项目概览
taosdata
/
TDengine
大约 2 年 前同步成功
通知
1192
Star
22018
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
4a02684b
编写于
3月 26, 2022
作者:
G
Ganlin Zhao
提交者:
GitHub
3月 26, 2022
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #11009 from taosdata/3.0_glzhao_math_func
[TD-14240]<feature>: add math functions
上级
6a773532
8a2623e9
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
2297 addition
and
113 deletion
+2297
-113
include/libs/function/functionMgt.h
include/libs/function/functionMgt.h
+8
-7
include/libs/scalar/scalar.h
include/libs/scalar/scalar.h
+15
-0
source/libs/function/CMakeLists.txt
source/libs/function/CMakeLists.txt
+1
-1
source/libs/function/src/builtins.c
source/libs/function/src/builtins.c
+131
-0
source/libs/scalar/inc/sclfunc.h
source/libs/scalar/inc/sclfunc.h
+0
-1
source/libs/scalar/src/sclfunc.c
source/libs/scalar/src/sclfunc.c
+495
-104
source/libs/scalar/test/scalar/scalarTests.cpp
source/libs/scalar/test/scalar/scalarTests.cpp
+1647
-0
未找到文件。
include/libs/function/functionMgt.h
浏览文件 @
4a02684b
...
@@ -57,18 +57,19 @@ typedef enum EFunctionType {
...
@@ -57,18 +57,19 @@ typedef enum EFunctionType {
// math function
// math function
FUNCTION_TYPE_ABS
=
1000
,
FUNCTION_TYPE_ABS
=
1000
,
FUNCTION_TYPE_ACOS
,
FUNCTION_TYPE_ASION
,
FUNCTION_TYPE_ATAN
,
FUNCTION_TYPE_CEIL
,
FUNCTION_TYPE_COS
,
FUNCTION_TYPE_FLOOR
,
FUNCTION_TYPE_LOG
,
FUNCTION_TYPE_LOG
,
FUNCTION_TYPE_POW
,
FUNCTION_TYPE_POW
,
FUNCTION_TYPE_SQRT
,
FUNCTION_TYPE_CEIL
,
FUNCTION_TYPE_FLOOR
,
FUNCTION_TYPE_ROUND
,
FUNCTION_TYPE_ROUND
,
FUNCTION_TYPE_SIN
,
FUNCTION_TYPE_SIN
,
FUNCTION_TYPE_
SQRT
,
FUNCTION_TYPE_
COS
,
FUNCTION_TYPE_TAN
,
FUNCTION_TYPE_TAN
,
FUNCTION_TYPE_ASIN
,
FUNCTION_TYPE_ACOS
,
FUNCTION_TYPE_ATAN
,
// string function
// string function
FUNCTION_TYPE_CHAR_LENGTH
=
1500
,
FUNCTION_TYPE_CHAR_LENGTH
=
1500
,
...
...
include/libs/scalar/scalar.h
浏览文件 @
4a02684b
...
@@ -42,6 +42,21 @@ int32_t scalarGenerateSetFromList(void **data, void *pNode, uint32_t type);
...
@@ -42,6 +42,21 @@ int32_t scalarGenerateSetFromList(void **data, void *pNode, uint32_t type);
int32_t
vectorGetConvertType
(
int32_t
type1
,
int32_t
type2
);
int32_t
vectorGetConvertType
(
int32_t
type1
,
int32_t
type2
);
int32_t
vectorConvertImpl
(
SScalarParam
*
pIn
,
SScalarParam
*
pOut
);
int32_t
vectorConvertImpl
(
SScalarParam
*
pIn
,
SScalarParam
*
pOut
);
int32_t
absFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
);
int32_t
logFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
);
int32_t
powFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
);
int32_t
sqrtFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
);
int32_t
sinFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
);
int32_t
cosFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
);
int32_t
tanFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
);
int32_t
asinFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
);
int32_t
acosFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
);
int32_t
atanFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
);
int32_t
ceilFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
);
int32_t
floorFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
);
int32_t
roundFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
);
#ifdef __cplusplus
#ifdef __cplusplus
}
}
...
...
source/libs/function/CMakeLists.txt
浏览文件 @
4a02684b
...
@@ -11,8 +11,8 @@ target_include_directories(
...
@@ -11,8 +11,8 @@ target_include_directories(
target_link_libraries
(
target_link_libraries
(
function
function
PRIVATE os util common nodes scalar
PUBLIC uv_a
PUBLIC uv_a
PRIVATE os util common nodes
)
)
add_executable
(
runUdf test/runUdf.c
)
add_executable
(
runUdf test/runUdf.c
)
...
...
source/libs/function/src/builtins.c
浏览文件 @
4a02684b
...
@@ -15,6 +15,7 @@
...
@@ -15,6 +15,7 @@
#include "builtins.h"
#include "builtins.h"
#include "builtinsimpl.h"
#include "builtinsimpl.h"
#include "scalar.h"
#include "taoserror.h"
#include "taoserror.h"
#include "tdatablock.h"
#include "tdatablock.h"
...
@@ -151,6 +152,136 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
...
@@ -151,6 +152,136 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
.
processFunc
=
lastFunction
,
.
processFunc
=
lastFunction
,
.
finalizeFunc
=
functionFinalize
.
finalizeFunc
=
functionFinalize
},
},
{
.
name
=
"abs"
,
.
type
=
FUNCTION_TYPE_ABS
,
.
classification
=
FUNC_MGT_SCALAR_FUNC
,
.
checkFunc
=
stubCheckAndGetResultType
,
.
getEnvFunc
=
NULL
,
.
initFunc
=
NULL
,
.
sprocessFunc
=
absFunction
,
.
finalizeFunc
=
NULL
},
{
.
name
=
"log"
,
.
type
=
FUNCTION_TYPE_LOG
,
.
classification
=
FUNC_MGT_SCALAR_FUNC
,
.
checkFunc
=
stubCheckAndGetResultType
,
.
getEnvFunc
=
NULL
,
.
initFunc
=
NULL
,
.
sprocessFunc
=
logFunction
,
.
finalizeFunc
=
NULL
},
{
.
name
=
"power"
,
.
type
=
FUNCTION_TYPE_POW
,
.
classification
=
FUNC_MGT_SCALAR_FUNC
,
.
checkFunc
=
stubCheckAndGetResultType
,
.
getEnvFunc
=
NULL
,
.
initFunc
=
NULL
,
.
sprocessFunc
=
powFunction
,
.
finalizeFunc
=
NULL
},
{
.
name
=
"sqrt"
,
.
type
=
FUNCTION_TYPE_SQRT
,
.
classification
=
FUNC_MGT_SCALAR_FUNC
,
.
checkFunc
=
stubCheckAndGetResultType
,
.
getEnvFunc
=
NULL
,
.
initFunc
=
NULL
,
.
sprocessFunc
=
sqrtFunction
,
.
finalizeFunc
=
NULL
},
{
.
name
=
"ceil"
,
.
type
=
FUNCTION_TYPE_CEIL
,
.
classification
=
FUNC_MGT_SCALAR_FUNC
,
.
checkFunc
=
stubCheckAndGetResultType
,
.
getEnvFunc
=
NULL
,
.
initFunc
=
NULL
,
.
sprocessFunc
=
ceilFunction
,
.
finalizeFunc
=
NULL
},
{
.
name
=
"floor"
,
.
type
=
FUNCTION_TYPE_FLOOR
,
.
classification
=
FUNC_MGT_SCALAR_FUNC
,
.
checkFunc
=
stubCheckAndGetResultType
,
.
getEnvFunc
=
NULL
,
.
initFunc
=
NULL
,
.
sprocessFunc
=
floorFunction
,
.
finalizeFunc
=
NULL
},
{
.
name
=
"round"
,
.
type
=
FUNCTION_TYPE_ROUND
,
.
classification
=
FUNC_MGT_SCALAR_FUNC
,
.
checkFunc
=
stubCheckAndGetResultType
,
.
getEnvFunc
=
NULL
,
.
initFunc
=
NULL
,
.
sprocessFunc
=
roundFunction
,
.
finalizeFunc
=
NULL
},
{
.
name
=
"sin"
,
.
type
=
FUNCTION_TYPE_SIN
,
.
classification
=
FUNC_MGT_SCALAR_FUNC
,
.
checkFunc
=
stubCheckAndGetResultType
,
.
getEnvFunc
=
NULL
,
.
initFunc
=
NULL
,
.
sprocessFunc
=
sinFunction
,
.
finalizeFunc
=
NULL
},
{
.
name
=
"cos"
,
.
type
=
FUNCTION_TYPE_COS
,
.
classification
=
FUNC_MGT_SCALAR_FUNC
,
.
checkFunc
=
stubCheckAndGetResultType
,
.
getEnvFunc
=
NULL
,
.
initFunc
=
NULL
,
.
sprocessFunc
=
cosFunction
,
.
finalizeFunc
=
NULL
},
{
.
name
=
"tan"
,
.
type
=
FUNCTION_TYPE_TAN
,
.
classification
=
FUNC_MGT_SCALAR_FUNC
,
.
checkFunc
=
stubCheckAndGetResultType
,
.
getEnvFunc
=
NULL
,
.
initFunc
=
NULL
,
.
sprocessFunc
=
tanFunction
,
.
finalizeFunc
=
NULL
},
{
.
name
=
"asin"
,
.
type
=
FUNCTION_TYPE_ASIN
,
.
classification
=
FUNC_MGT_SCALAR_FUNC
,
.
checkFunc
=
stubCheckAndGetResultType
,
.
getEnvFunc
=
NULL
,
.
initFunc
=
NULL
,
.
sprocessFunc
=
asinFunction
,
.
finalizeFunc
=
NULL
},
{
.
name
=
"acos"
,
.
type
=
FUNCTION_TYPE_ACOS
,
.
classification
=
FUNC_MGT_SCALAR_FUNC
,
.
checkFunc
=
stubCheckAndGetResultType
,
.
getEnvFunc
=
NULL
,
.
initFunc
=
NULL
,
.
sprocessFunc
=
acosFunction
,
.
finalizeFunc
=
NULL
},
{
.
name
=
"atan"
,
.
type
=
FUNCTION_TYPE_ATAN
,
.
classification
=
FUNC_MGT_SCALAR_FUNC
,
.
checkFunc
=
stubCheckAndGetResultType
,
.
getEnvFunc
=
NULL
,
.
initFunc
=
NULL
,
.
sprocessFunc
=
atanFunction
,
.
finalizeFunc
=
NULL
},
{
{
.
name
=
"concat"
,
.
name
=
"concat"
,
.
type
=
FUNCTION_TYPE_CONCAT
,
.
type
=
FUNCTION_TYPE_CONCAT
,
...
...
source/libs/scalar/inc/sclfunc.h
浏览文件 @
4a02684b
...
@@ -37,7 +37,6 @@ int32_t evaluateExprNodeTree(tExprNode* pExprs, int32_t numOfRows, SScalarParam*
...
@@ -37,7 +37,6 @@ int32_t evaluateExprNodeTree(tExprNode* pExprs, int32_t numOfRows, SScalarParam*
void
*
param
,
char
*
(
*
getSourceDataBlock
)(
void
*
,
const
char
*
,
int32_t
));
void
*
param
,
char
*
(
*
getSourceDataBlock
)(
void
*
,
const
char
*
,
int32_t
));
#ifdef __cplusplus
#ifdef __cplusplus
}
}
#endif
#endif
...
...
source/libs/scalar/src/sclfunc.c
浏览文件 @
4a02684b
...
@@ -4,145 +4,536 @@
...
@@ -4,145 +4,536 @@
static
void
assignBasicParaInfo
(
struct
SScalarParam
*
dst
,
const
struct
SScalarParam
*
src
)
{
static
void
assignBasicParaInfo
(
struct
SScalarParam
*
dst
,
const
struct
SScalarParam
*
src
)
{
dst
->
type
=
src
->
type
;
dst
->
type
=
src
->
type
;
dst
->
bytes
=
src
->
bytes
;
dst
->
bytes
=
src
->
bytes
;
dst
->
num
=
src
->
num
;
//
dst->num = src->num;
}
}
static
void
tceil
(
SScalarParam
*
pOutput
,
size_t
numOfInput
,
const
SScalarParam
*
pLeft
)
{
/** Math functions **/
assignBasicParaInfo
(
pOutput
,
pLeft
);
int32_t
absFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
)
{
assert
(
numOfInput
==
1
);
assignBasicParaInfo
(
pOutput
,
pInput
);
if
(
inputNum
!=
1
||
!
IS_NUMERIC_TYPE
(
pInput
->
type
))
{
return
TSDB_CODE_FAILED
;
}
switch
(
pLeft
->
bytes
)
{
char
*
input
=
NULL
,
*
output
=
NULL
;
case
TSDB_DATA_TYPE_FLOAT
:
{
for
(
int32_t
i
=
0
;
i
<
pOutput
->
num
;
++
i
)
{
float
*
p
=
(
float
*
)
pLeft
->
data
;
if
(
pInput
->
num
==
1
)
{
float
*
out
=
(
float
*
)
pOutput
->
data
;
input
=
pInput
->
data
;
for
(
int32_t
i
=
0
;
i
<
pLeft
->
num
;
++
i
)
{
}
else
{
out
[
i
]
=
ceilf
(
p
[
i
]);
input
=
pInput
->
data
+
i
*
pInput
->
bytes
;
}
output
=
pOutput
->
data
+
i
*
pOutput
->
bytes
;
if
(
isNull
(
input
,
pInput
->
type
))
{
setNull
(
output
,
pOutput
->
type
,
pOutput
->
bytes
);
continue
;
}
switch
(
pInput
->
type
)
{
case
TSDB_DATA_TYPE_FLOAT
:
{
float
v
;
GET_TYPED_DATA
(
v
,
float
,
pInput
->
type
,
input
);
float
result
;
result
=
(
v
>
0
)
?
v
:
-
v
;
SET_TYPED_DATA
(
output
,
pOutput
->
type
,
result
);
break
;
}
case
TSDB_DATA_TYPE_DOUBLE
:
{
double
v
;
GET_TYPED_DATA
(
v
,
double
,
pInput
->
type
,
input
);
double
result
;
result
=
(
v
>
0
)
?
v
:
-
v
;
SET_TYPED_DATA
(
output
,
pOutput
->
type
,
result
);
break
;
}
case
TSDB_DATA_TYPE_TINYINT
:
{
int8_t
v
;
GET_TYPED_DATA
(
v
,
int8_t
,
pInput
->
type
,
input
);
int8_t
result
;
result
=
(
v
>
0
)
?
v
:
-
v
;
SET_TYPED_DATA
(
output
,
pOutput
->
type
,
result
);
break
;
}
case
TSDB_DATA_TYPE_SMALLINT
:
{
int16_t
v
;
GET_TYPED_DATA
(
v
,
int16_t
,
pInput
->
type
,
input
);
int16_t
result
;
result
=
(
v
>
0
)
?
v
:
-
v
;
SET_TYPED_DATA
(
output
,
pOutput
->
type
,
result
);
break
;
}
case
TSDB_DATA_TYPE_INT
:
{
int32_t
v
;
GET_TYPED_DATA
(
v
,
int32_t
,
pInput
->
type
,
input
);
int32_t
result
;
result
=
(
v
>
0
)
?
v
:
-
v
;
SET_TYPED_DATA
(
output
,
pOutput
->
type
,
result
);
break
;
}
case
TSDB_DATA_TYPE_BIGINT
:
{
int64_t
v
;
GET_TYPED_DATA
(
v
,
int64_t
,
pInput
->
type
,
input
);
int64_t
result
;
result
=
(
v
>
0
)
?
v
:
-
v
;
SET_TYPED_DATA
(
output
,
pOutput
->
type
,
result
);
break
;
}
default:
{
memcpy
(
output
,
input
,
pInput
->
bytes
);
break
;
}
}
}
}
}
case
TSDB_DATA_TYPE_DOUBLE
:
{
return
TSDB_CODE_SUCCESS
;
double
*
p
=
(
double
*
)
pLeft
->
data
;
}
double
*
out
=
(
double
*
)
pOutput
->
data
;
for
(
int32_t
i
=
0
;
i
<
pLeft
->
num
;
++
i
)
{
int32_t
logFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
)
{
out
[
i
]
=
ceil
(
p
[
i
]);
if
(
inputNum
!=
2
||
!
IS_NUMERIC_TYPE
(
pInput
[
0
].
type
)
||
!
IS_NUMERIC_TYPE
(
pInput
[
1
].
type
))
{
return
TSDB_CODE_FAILED
;
}
pOutput
->
type
=
TSDB_DATA_TYPE_DOUBLE
;
pOutput
->
bytes
=
tDataTypes
[
TSDB_DATA_TYPE_DOUBLE
].
bytes
;
char
**
input
=
NULL
,
*
output
=
NULL
;
bool
hasNullInput
=
false
;
input
=
taosMemoryCalloc
(
inputNum
,
sizeof
(
char
*
));
for
(
int32_t
i
=
0
;
i
<
pOutput
->
num
;
++
i
)
{
for
(
int32_t
j
=
0
;
j
<
inputNum
;
++
j
)
{
if
(
pInput
[
j
].
num
==
1
)
{
input
[
j
]
=
pInput
[
j
].
data
;
}
else
{
input
[
j
]
=
pInput
[
j
].
data
+
i
*
pInput
[
j
].
bytes
;
}
if
(
isNull
(
input
[
j
],
pInput
[
j
].
type
))
{
hasNullInput
=
true
;
break
;
}
}
}
}
output
=
pOutput
->
data
+
i
*
pOutput
->
bytes
;
default:
if
(
hasNullInput
)
{
memcpy
(
pOutput
->
data
,
pLeft
->
data
,
pLeft
->
num
*
pLeft
->
bytes
);
setNull
(
output
,
pOutput
->
type
,
pOutput
->
bytes
);
continue
;
}
double
base
;
GET_TYPED_DATA
(
base
,
double
,
pInput
[
1
].
type
,
input
[
1
]);
double
v
;
GET_TYPED_DATA
(
v
,
double
,
pInput
[
0
].
type
,
input
[
0
]);
double
result
=
log
(
v
)
/
log
(
base
);
SET_TYPED_DATA
(
output
,
pOutput
->
type
,
result
);
}
}
}
static
void
tfloor
(
SScalarParam
*
pOutput
,
size_t
numOfInput
,
const
SScalarParam
*
pLeft
)
{
taosMemoryFree
(
input
);
assignBasicParaInfo
(
pOutput
,
pLeft
);
assert
(
numOfInput
==
1
);
switch
(
pLeft
->
bytes
)
{
return
TSDB_CODE_SUCCESS
;
case
TSDB_DATA_TYPE_FLOAT
:
{
}
float
*
p
=
(
float
*
)
pLeft
->
data
;
float
*
out
=
(
float
*
)
pOutput
->
data
;
int32_t
powFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
)
{
if
(
inputNum
!=
2
||
!
IS_NUMERIC_TYPE
(
pInput
[
0
].
type
)
||
!
IS_NUMERIC_TYPE
(
pInput
[
1
].
type
))
{
return
TSDB_CODE_FAILED
;
}
for
(
int32_t
i
=
0
;
i
<
pLeft
->
num
;
++
i
)
{
pOutput
->
type
=
TSDB_DATA_TYPE_DOUBLE
;
out
[
i
]
=
floorf
(
p
[
i
]);
pOutput
->
bytes
=
tDataTypes
[
TSDB_DATA_TYPE_DOUBLE
].
bytes
;
char
**
input
=
NULL
,
*
output
=
NULL
;
bool
hasNullInput
=
false
;
input
=
taosMemoryCalloc
(
inputNum
,
sizeof
(
char
*
));
for
(
int32_t
i
=
0
;
i
<
pOutput
->
num
;
++
i
)
{
for
(
int32_t
j
=
0
;
j
<
inputNum
;
++
j
)
{
if
(
pInput
[
j
].
num
==
1
)
{
input
[
j
]
=
pInput
[
j
].
data
;
}
else
{
input
[
j
]
=
pInput
[
j
].
data
+
i
*
pInput
[
j
].
bytes
;
}
if
(
isNull
(
input
[
j
],
pInput
[
j
].
type
))
{
hasNullInput
=
true
;
break
;
}
}
}
}
output
=
pOutput
->
data
+
i
*
pOutput
->
bytes
;
case
TSDB_DATA_TYPE_DOUBLE
:
{
if
(
hasNullInput
)
{
double
*
p
=
(
double
*
)
pLeft
->
data
;
setNull
(
output
,
pOutput
->
type
,
pOutput
->
bytes
);
double
*
out
=
(
double
*
)
pOutput
->
data
;
continue
;
}
for
(
int32_t
i
=
0
;
i
<
pLeft
->
num
;
++
i
)
{
double
base
;
out
[
i
]
=
floor
(
p
[
i
]);
GET_TYPED_DATA
(
base
,
double
,
pInput
[
1
].
type
,
input
[
1
]);
}
double
v
;
GET_TYPED_DATA
(
v
,
double
,
pInput
[
0
].
type
,
input
[
0
]);
double
result
=
pow
(
v
,
base
);
SET_TYPED_DATA
(
output
,
pOutput
->
type
,
result
);
}
taosMemoryFree
(
input
);
return
TSDB_CODE_SUCCESS
;
}
int32_t
sqrtFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
)
{
if
(
inputNum
!=
1
||
!
IS_NUMERIC_TYPE
(
pInput
->
type
))
{
return
TSDB_CODE_FAILED
;
}
pOutput
->
type
=
TSDB_DATA_TYPE_DOUBLE
;
pOutput
->
bytes
=
tDataTypes
[
TSDB_DATA_TYPE_DOUBLE
].
bytes
;
char
*
input
=
NULL
,
*
output
=
NULL
;
for
(
int32_t
i
=
0
;
i
<
pOutput
->
num
;
++
i
)
{
if
(
pInput
->
num
==
1
)
{
input
=
pInput
->
data
;
}
else
{
input
=
pInput
->
data
+
i
*
pInput
->
bytes
;
}
output
=
pOutput
->
data
+
i
*
pOutput
->
bytes
;
if
(
isNull
(
input
,
pInput
->
type
))
{
setNull
(
output
,
pOutput
->
type
,
pOutput
->
bytes
);
continue
;
}
}
default:
double
v
;
memcpy
(
pOutput
->
data
,
pLeft
->
data
,
pLeft
->
num
*
pLeft
->
bytes
);
GET_TYPED_DATA
(
v
,
double
,
pInput
->
type
,
input
);
double
result
=
sqrt
(
v
);
SET_TYPED_DATA
(
output
,
pOutput
->
type
,
result
);
}
}
return
TSDB_CODE_SUCCESS
;
}
}
static
void
_tabs
(
SScalarParam
*
pOutput
,
size_t
numOfInput
,
const
SScalarParam
*
pLeft
)
{
int32_t
sinFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
)
{
assignBasicParaInfo
(
pOutput
,
pLeft
);
if
(
inputNum
!=
1
||
!
IS_NUMERIC_TYPE
(
pInput
->
type
))
{
assert
(
numOfInput
==
1
);
return
TSDB_CODE_FAILED
;
}
switch
(
pLeft
->
bytes
)
{
pOutput
->
type
=
TSDB_DATA_TYPE_DOUBLE
;
case
TSDB_DATA_TYPE_FLOAT
:
{
pOutput
->
bytes
=
tDataTypes
[
TSDB_DATA_TYPE_DOUBLE
].
bytes
;
float
*
p
=
(
float
*
)
pLeft
->
data
;
float
*
out
=
(
float
*
)
pOutput
->
data
;
char
*
input
=
NULL
,
*
output
=
NULL
;
for
(
int32_t
i
=
0
;
i
<
pLeft
->
num
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
pOutput
->
num
;
++
i
)
{
out
[
i
]
=
(
p
[
i
]
>
0
)
?
p
[
i
]
:-
p
[
i
];
if
(
pInput
->
num
==
1
)
{
}
input
=
pInput
->
data
;
}
else
{
input
=
pInput
->
data
+
i
*
pInput
->
bytes
;
}
}
output
=
pOutput
->
data
+
i
*
pOutput
->
bytes
;
case
TSDB_DATA_TYPE_DOUBLE
:
{
if
(
isNull
(
input
,
pInput
->
type
))
{
double
*
p
=
(
double
*
)
pLeft
->
data
;
setNull
(
output
,
pOutput
->
type
,
pOutput
->
bytes
);
double
*
out
=
(
double
*
)
pOutput
->
data
;
continue
;
for
(
int32_t
i
=
0
;
i
<
pLeft
->
num
;
++
i
)
{
out
[
i
]
=
(
p
[
i
]
>
0
)
?
p
[
i
]
:-
p
[
i
];
}
}
}
case
TSDB_DATA_TYPE_TINYINT
:
{
double
v
;
int8_t
*
p
=
(
int8_t
*
)
pLeft
->
data
;
GET_TYPED_DATA
(
v
,
double
,
pInput
->
type
,
input
);
int8_t
*
out
=
(
int8_t
*
)
pOutput
->
data
;
double
result
=
sin
(
v
);
for
(
int32_t
i
=
0
;
i
<
pLeft
->
num
;
++
i
)
{
SET_TYPED_DATA
(
output
,
pOutput
->
type
,
result
);
out
[
i
]
=
(
p
[
i
]
>
0
)
?
p
[
i
]
:-
p
[
i
];
}
}
return
TSDB_CODE_SUCCESS
;
}
int32_t
cosFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
)
{
if
(
inputNum
!=
1
||
!
IS_NUMERIC_TYPE
(
pInput
->
type
))
{
return
TSDB_CODE_FAILED
;
}
pOutput
->
type
=
TSDB_DATA_TYPE_DOUBLE
;
pOutput
->
bytes
=
tDataTypes
[
TSDB_DATA_TYPE_DOUBLE
].
bytes
;
char
*
input
=
NULL
,
*
output
=
NULL
;
for
(
int32_t
i
=
0
;
i
<
pOutput
->
num
;
++
i
)
{
if
(
pInput
->
num
==
1
)
{
input
=
pInput
->
data
;
}
else
{
input
=
pInput
->
data
+
i
*
pInput
->
bytes
;
}
}
output
=
pOutput
->
data
+
i
*
pOutput
->
bytes
;
case
TSDB_DATA_TYPE_SMALLINT
:
{
if
(
isNull
(
input
,
pInput
->
type
))
{
int16_t
*
p
=
(
int16_t
*
)
pLeft
->
data
;
setNull
(
output
,
pOutput
->
type
,
pOutput
->
bytes
);
int16_t
*
out
=
(
int16_t
*
)
pOutput
->
data
;
continue
;
for
(
int32_t
i
=
0
;
i
<
pLeft
->
num
;
++
i
)
{
out
[
i
]
=
(
p
[
i
]
>
0
)
?
p
[
i
]
:-
p
[
i
];
}
}
}
case
TSDB_DATA_TYPE_INT
:
{
double
v
;
int32_t
*
p
=
(
int32_t
*
)
pLeft
->
data
;
GET_TYPED_DATA
(
v
,
double
,
pInput
->
type
,
input
);
int32_t
*
out
=
(
int32_t
*
)
pOutput
->
data
;
double
result
=
cos
(
v
);
for
(
int32_t
i
=
0
;
i
<
pLeft
->
num
;
++
i
)
{
SET_TYPED_DATA
(
output
,
pOutput
->
type
,
result
);
out
[
i
]
=
(
p
[
i
]
>
0
)
?
p
[
i
]
:-
p
[
i
];
}
}
return
TSDB_CODE_SUCCESS
;
}
int32_t
tanFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
)
{
if
(
inputNum
!=
1
||
!
IS_NUMERIC_TYPE
(
pInput
->
type
))
{
return
TSDB_CODE_FAILED
;
}
pOutput
->
type
=
TSDB_DATA_TYPE_DOUBLE
;
pOutput
->
bytes
=
tDataTypes
[
TSDB_DATA_TYPE_DOUBLE
].
bytes
;
char
*
input
=
NULL
,
*
output
=
NULL
;
for
(
int32_t
i
=
0
;
i
<
pOutput
->
num
;
++
i
)
{
if
(
pInput
->
num
==
1
)
{
input
=
pInput
->
data
;
}
else
{
input
=
pInput
->
data
+
i
*
pInput
->
bytes
;
}
}
output
=
pOutput
->
data
+
i
*
pOutput
->
bytes
;
case
TSDB_DATA_TYPE_BIGINT
:
{
if
(
isNull
(
input
,
pInput
->
type
))
{
int64_t
*
p
=
(
int64_t
*
)
pLeft
->
data
;
setNull
(
output
,
pOutput
->
type
,
pOutput
->
bytes
);
int64_t
*
out
=
(
int64_t
*
)
pOutput
->
data
;
continue
;
for
(
int32_t
i
=
0
;
i
<
pLeft
->
num
;
++
i
)
{
}
out
[
i
]
=
(
p
[
i
]
>
0
)
?
p
[
i
]
:-
p
[
i
];
}
double
v
;
GET_TYPED_DATA
(
v
,
double
,
pInput
->
type
,
input
);
double
result
=
tan
(
v
);
SET_TYPED_DATA
(
output
,
pOutput
->
type
,
result
);
}
return
TSDB_CODE_SUCCESS
;
}
int32_t
asinFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
)
{
if
(
inputNum
!=
1
||
!
IS_NUMERIC_TYPE
(
pInput
->
type
))
{
return
TSDB_CODE_FAILED
;
}
pOutput
->
type
=
TSDB_DATA_TYPE_DOUBLE
;
pOutput
->
bytes
=
tDataTypes
[
TSDB_DATA_TYPE_DOUBLE
].
bytes
;
char
*
input
=
NULL
,
*
output
=
NULL
;
for
(
int32_t
i
=
0
;
i
<
pOutput
->
num
;
++
i
)
{
if
(
pInput
->
num
==
1
)
{
input
=
pInput
->
data
;
}
else
{
input
=
pInput
->
data
+
i
*
pInput
->
bytes
;
}
output
=
pOutput
->
data
+
i
*
pOutput
->
bytes
;
if
(
isNull
(
input
,
pInput
->
type
))
{
setNull
(
output
,
pOutput
->
type
,
pOutput
->
bytes
);
continue
;
}
}
default:
double
v
;
memcpy
(
pOutput
->
data
,
pLeft
->
data
,
pLeft
->
num
*
pLeft
->
bytes
);
GET_TYPED_DATA
(
v
,
double
,
pInput
->
type
,
input
);
double
result
=
asin
(
v
);
SET_TYPED_DATA
(
output
,
pOutput
->
type
,
result
);
}
}
return
TSDB_CODE_SUCCESS
;
}
}
static
void
tround
(
SScalarParam
*
pOutput
,
size_t
numOfInput
,
const
SScalarParam
*
pLeft
)
{
int32_t
acosFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
)
{
assignBasicParaInfo
(
pOutput
,
pLeft
);
if
(
inputNum
!=
1
||
!
IS_NUMERIC_TYPE
(
pInput
->
type
))
{
assert
(
numOfInput
==
1
);
return
TSDB_CODE_FAILED
;
}
switch
(
pLeft
->
bytes
)
{
pOutput
->
type
=
TSDB_DATA_TYPE_DOUBLE
;
case
TSDB_DATA_TYPE_FLOAT
:
{
pOutput
->
bytes
=
tDataTypes
[
TSDB_DATA_TYPE_DOUBLE
].
bytes
;
float
*
p
=
(
float
*
)
pLeft
->
data
;
float
*
out
=
(
float
*
)
pOutput
->
data
;
char
*
input
=
NULL
,
*
output
=
NULL
;
for
(
int32_t
i
=
0
;
i
<
pLeft
->
num
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
pOutput
->
num
;
++
i
)
{
out
[
i
]
=
roundf
(
p
[
i
]);
if
(
pInput
->
num
==
1
)
{
input
=
pInput
->
data
;
}
else
{
input
=
pInput
->
data
+
i
*
pInput
->
bytes
;
}
output
=
pOutput
->
data
+
i
*
pOutput
->
bytes
;
if
(
isNull
(
input
,
pInput
->
type
))
{
setNull
(
output
,
pOutput
->
type
,
pOutput
->
bytes
);
continue
;
}
double
v
;
GET_TYPED_DATA
(
v
,
double
,
pInput
->
type
,
input
);
double
result
=
acos
(
v
);
SET_TYPED_DATA
(
output
,
pOutput
->
type
,
result
);
}
return
TSDB_CODE_SUCCESS
;
}
int32_t
atanFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
)
{
if
(
inputNum
!=
1
||
!
IS_NUMERIC_TYPE
(
pInput
->
type
))
{
return
TSDB_CODE_FAILED
;
}
pOutput
->
type
=
TSDB_DATA_TYPE_DOUBLE
;
pOutput
->
bytes
=
tDataTypes
[
TSDB_DATA_TYPE_DOUBLE
].
bytes
;
char
*
input
=
NULL
,
*
output
=
NULL
;
for
(
int32_t
i
=
0
;
i
<
pOutput
->
num
;
++
i
)
{
if
(
pInput
->
num
==
1
)
{
input
=
pInput
->
data
;
}
else
{
input
=
pInput
->
data
+
i
*
pInput
->
bytes
;
}
output
=
pOutput
->
data
+
i
*
pOutput
->
bytes
;
if
(
isNull
(
input
,
pInput
->
type
))
{
setNull
(
output
,
pOutput
->
type
,
pOutput
->
bytes
);
continue
;
}
double
v
;
GET_TYPED_DATA
(
v
,
double
,
pInput
->
type
,
input
);
double
result
=
atan
(
v
);
SET_TYPED_DATA
(
output
,
pOutput
->
type
,
result
);
}
return
TSDB_CODE_SUCCESS
;
}
int32_t
ceilFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
)
{
if
(
inputNum
!=
1
||
!
IS_NUMERIC_TYPE
(
pInput
->
type
))
{
return
TSDB_CODE_FAILED
;
}
char
*
input
=
NULL
,
*
output
=
NULL
;
for
(
int32_t
i
=
0
;
i
<
pOutput
->
num
;
++
i
)
{
if
(
pInput
->
num
==
1
)
{
input
=
pInput
->
data
;
}
else
{
input
=
pInput
->
data
+
i
*
pInput
->
bytes
;
}
output
=
pOutput
->
data
+
i
*
pOutput
->
bytes
;
if
(
isNull
(
input
,
pInput
->
type
))
{
setNull
(
output
,
pOutput
->
type
,
pOutput
->
bytes
);
continue
;
}
switch
(
pInput
->
type
)
{
case
TSDB_DATA_TYPE_FLOAT
:
{
float
v
;
GET_TYPED_DATA
(
v
,
float
,
pInput
->
type
,
input
);
float
result
=
ceilf
(
v
);
SET_TYPED_DATA
(
output
,
pOutput
->
type
,
result
);
break
;
}
case
TSDB_DATA_TYPE_DOUBLE
:
{
double
v
;
GET_TYPED_DATA
(
v
,
double
,
pInput
->
type
,
input
);
double
result
=
ceil
(
v
);
SET_TYPED_DATA
(
output
,
pOutput
->
type
,
result
);
break
;
}
default:
{
memcpy
(
output
,
input
,
pInput
->
bytes
);
break
;
}
}
}
}
}
case
TSDB_DATA_TYPE_DOUBLE
:
{
return
TSDB_CODE_SUCCESS
;
double
*
p
=
(
double
*
)
pLeft
->
data
;
}
double
*
out
=
(
double
*
)
pOutput
->
data
;
for
(
int32_t
i
=
0
;
i
<
pLeft
->
num
;
++
i
)
{
int32_t
floorFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
)
{
out
[
i
]
=
round
(
p
[
i
]);
assignBasicParaInfo
(
pOutput
,
pInput
);
if
(
inputNum
!=
1
||
!
IS_NUMERIC_TYPE
(
pInput
->
type
))
{
return
TSDB_CODE_FAILED
;
}
char
*
input
=
NULL
,
*
output
=
NULL
;
for
(
int32_t
i
=
0
;
i
<
pOutput
->
num
;
++
i
)
{
if
(
pInput
->
num
==
1
)
{
input
=
pInput
->
data
;
}
else
{
input
=
pInput
->
data
+
i
*
pInput
->
bytes
;
}
output
=
pOutput
->
data
+
i
*
pOutput
->
bytes
;
if
(
isNull
(
input
,
pInput
->
type
))
{
setNull
(
output
,
pOutput
->
type
,
pOutput
->
bytes
);
continue
;
}
switch
(
pInput
->
type
)
{
case
TSDB_DATA_TYPE_FLOAT
:
{
float
v
;
GET_TYPED_DATA
(
v
,
float
,
pInput
->
type
,
input
);
float
result
=
floorf
(
v
);
SET_TYPED_DATA
(
output
,
pOutput
->
type
,
result
);
break
;
}
case
TSDB_DATA_TYPE_DOUBLE
:
{
double
v
;
GET_TYPED_DATA
(
v
,
double
,
pInput
->
type
,
input
);
double
result
=
floor
(
v
);
SET_TYPED_DATA
(
output
,
pOutput
->
type
,
result
);
break
;
}
}
default:
{
memcpy
(
output
,
input
,
pInput
->
bytes
);
break
;
}
}
}
return
TSDB_CODE_SUCCESS
;
}
int32_t
roundFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
)
{
assignBasicParaInfo
(
pOutput
,
pInput
);
if
(
inputNum
!=
1
||
!
IS_NUMERIC_TYPE
(
pInput
->
type
))
{
return
TSDB_CODE_FAILED
;
}
char
*
input
=
NULL
,
*
output
=
NULL
;
for
(
int32_t
i
=
0
;
i
<
pOutput
->
num
;
++
i
)
{
if
(
pInput
->
num
==
1
)
{
input
=
pInput
->
data
;
}
else
{
input
=
pInput
->
data
+
i
*
pInput
->
bytes
;
}
output
=
pOutput
->
data
+
i
*
pOutput
->
bytes
;
if
(
isNull
(
input
,
pInput
->
type
))
{
setNull
(
output
,
pOutput
->
type
,
pOutput
->
bytes
);
continue
;
}
}
default:
switch
(
pInput
->
type
)
{
memcpy
(
pOutput
->
data
,
pLeft
->
data
,
pLeft
->
num
*
pLeft
->
bytes
);
case
TSDB_DATA_TYPE_FLOAT
:
{
float
v
;
GET_TYPED_DATA
(
v
,
float
,
pInput
->
type
,
input
);
float
result
=
roundf
(
v
);
SET_TYPED_DATA
(
output
,
pOutput
->
type
,
result
);
break
;
}
case
TSDB_DATA_TYPE_DOUBLE
:
{
double
v
;
GET_TYPED_DATA
(
v
,
double
,
pInput
->
type
,
input
);
double
result
=
round
(
v
);
SET_TYPED_DATA
(
output
,
pOutput
->
type
,
result
);
break
;
}
default:
{
memcpy
(
output
,
input
,
pInput
->
bytes
);
break
;
}
}
}
}
return
TSDB_CODE_SUCCESS
;
}
}
static
void
tlength
(
SScalarParam
*
pOutput
,
size_t
numOfInput
,
const
SScalarParam
*
pLeft
)
{
static
void
tlength
(
SScalarParam
*
pOutput
,
size_t
numOfInput
,
const
SScalarParam
*
pLeft
)
{
...
@@ -361,16 +752,16 @@ int32_t evaluateExprNodeTree(tExprNode* pExprs, int32_t numOfRows, SScalarFuncPa
...
@@ -361,16 +752,16 @@ int32_t evaluateExprNodeTree(tExprNode* pExprs, int32_t numOfRows, SScalarFuncPa
#endif
#endif
SScalarFunctionInfo
scalarFunc
[
8
]
=
{
//
SScalarFunctionInfo scalarFunc[8] = {
{
"ceil"
,
FUNCTION_TYPE_SCALAR
,
FUNCTION_CEIL
,
tceil
},
//
{"ceil", FUNCTION_TYPE_SCALAR, FUNCTION_CEIL, tceil},
{
"floor"
,
FUNCTION_TYPE_SCALAR
,
FUNCTION_FLOOR
,
tfloor
},
//
{"floor", FUNCTION_TYPE_SCALAR, FUNCTION_FLOOR, tfloor},
{
"abs"
,
FUNCTION_TYPE_SCALAR
,
FUNCTION_ABS
,
_tabs
},
//
{"abs", FUNCTION_TYPE_SCALAR, FUNCTION_ABS, _tabs},
{
"round"
,
FUNCTION_TYPE_SCALAR
,
FUNCTION_ROUND
,
tround
},
//
{"round", FUNCTION_TYPE_SCALAR, FUNCTION_ROUND, tround},
{
"length"
,
FUNCTION_TYPE_SCALAR
,
FUNCTION_LENGTH
,
tlength
},
//
{"length", FUNCTION_TYPE_SCALAR, FUNCTION_LENGTH, tlength},
{
"concat"
,
FUNCTION_TYPE_SCALAR
,
FUNCTION_CONCAT
,
tconcat
},
//
{"concat", FUNCTION_TYPE_SCALAR, FUNCTION_CONCAT, tconcat},
{
"ltrim"
,
FUNCTION_TYPE_SCALAR
,
FUNCTION_LTRIM
,
tltrim
},
//
{"ltrim", FUNCTION_TYPE_SCALAR, FUNCTION_LTRIM, tltrim},
{
"rtrim"
,
FUNCTION_TYPE_SCALAR
,
FUNCTION_RTRIM
,
trtrim
},
//
{"rtrim", FUNCTION_TYPE_SCALAR, FUNCTION_RTRIM, trtrim},
};
//
};
void
setScalarFunctionSupp
(
struct
SScalarFunctionSupport
*
sas
,
SExprInfo
*
pExprInfo
,
SSDataBlock
*
pSDataBlock
)
{
void
setScalarFunctionSupp
(
struct
SScalarFunctionSupport
*
sas
,
SExprInfo
*
pExprInfo
,
SSDataBlock
*
pSDataBlock
)
{
sas
->
numOfCols
=
(
int32_t
)
pSDataBlock
->
info
.
numOfCols
;
sas
->
numOfCols
=
(
int32_t
)
pSDataBlock
->
info
.
numOfCols
;
...
@@ -411,4 +802,4 @@ void destroyScalarFuncSupport(struct SScalarFunctionSupport* pSupport, int32_t n
...
@@ -411,4 +802,4 @@ void destroyScalarFuncSupport(struct SScalarFunctionSupport* pSupport, int32_t n
}
}
taosMemoryFreeClear
(
pSupport
);
taosMemoryFreeClear
(
pSupport
);
}
}
\ No newline at end of file
source/libs/scalar/test/scalar/scalarTests.cpp
浏览文件 @
4a02684b
...
@@ -39,6 +39,14 @@
...
@@ -39,6 +39,14 @@
#include "nodes.h"
#include "nodes.h"
#include "tlog.h"
#include "tlog.h"
#define _DEBUG_PRINT_ 0
#if _DEBUG_PRINT_
#define PRINTF(...) printf(__VA_ARGS__)
#else
#define PRINTF(...)
#endif
namespace
{
namespace
{
SColumnInfo
createColumnInfo
(
int32_t
colId
,
int32_t
type
,
int32_t
bytes
)
{
SColumnInfo
createColumnInfo
(
int32_t
colId
,
int32_t
type
,
int32_t
bytes
)
{
...
@@ -1433,6 +1441,1645 @@ TEST(columnTest, greater_and_lower) {
...
@@ -1433,6 +1441,1645 @@ TEST(columnTest, greater_and_lower) {
nodesDestroyNode
(
logicNode
);
nodesDestroyNode
(
logicNode
);
}
}
void
scltMakeDataBlock
(
SScalarParam
**
pInput
,
int32_t
type
,
void
*
pVal
,
int32_t
num
,
bool
setVal
)
{
SScalarParam
*
input
=
(
SScalarParam
*
)
taosMemoryCalloc
(
1
,
sizeof
(
SScalarParam
));
int32_t
bytes
;
switch
(
type
)
{
case
TSDB_DATA_TYPE_TINYINT
:
{
bytes
=
sizeof
(
int8_t
);
break
;
}
case
TSDB_DATA_TYPE_SMALLINT
:
{
bytes
=
sizeof
(
int16_t
);
break
;
}
case
TSDB_DATA_TYPE_INT
:
{
bytes
=
sizeof
(
int32_t
);
break
;
}
case
TSDB_DATA_TYPE_BIGINT
:
{
bytes
=
sizeof
(
int64_t
);
break
;
}
case
TSDB_DATA_TYPE_FLOAT
:
{
bytes
=
sizeof
(
float
);
break
;
}
case
TSDB_DATA_TYPE_DOUBLE
:
{
bytes
=
sizeof
(
double
);
break
;
}
}
input
->
type
=
type
;
input
->
num
=
num
;
input
->
data
=
taosMemoryCalloc
(
num
,
bytes
);
input
->
bytes
=
bytes
;
if
(
setVal
)
{
for
(
int32_t
i
=
0
;
i
<
num
;
++
i
)
{
memcpy
(
input
->
data
+
i
*
bytes
,
pVal
,
bytes
);
}
}
else
{
memset
(
input
->
data
,
0
,
num
*
bytes
);
}
*
pInput
=
input
;
}
void
scltDestroyDataBlock
(
SScalarParam
*
pInput
)
{
taosMemoryFree
(
pInput
->
data
);
taosMemoryFree
(
pInput
);
}
TEST
(
ScalarFunctionTest
,
absFunction_constant
)
{
SScalarParam
*
pInput
,
*
pOutput
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
int32_t
rowNum
=
3
;
int32_t
type
;
//TINYINT
int8_t
val_tinyint
=
10
;
type
=
TSDB_DATA_TYPE_TINYINT
;
scltMakeDataBlock
(
&
pInput
,
type
,
&
val_tinyint
,
1
,
true
);
scltMakeDataBlock
(
&
pOutput
,
type
,
0
,
rowNum
,
false
);
code
=
absFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
int8_t
*
)
pOutput
->
data
+
i
),
val_tinyint
);
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
val_tinyint
=
-
10
;
scltMakeDataBlock
(
&
pInput
,
type
,
&
val_tinyint
,
1
,
true
);
scltMakeDataBlock
(
&
pOutput
,
type
,
0
,
rowNum
,
false
);
code
=
absFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
int8_t
*
)
pOutput
->
data
+
i
),
-
val_tinyint
);
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
//SMALLINT
int16_t
val_smallint
=
10
;
type
=
TSDB_DATA_TYPE_SMALLINT
;
scltMakeDataBlock
(
&
pInput
,
type
,
&
val_smallint
,
1
,
true
);
scltMakeDataBlock
(
&
pOutput
,
type
,
0
,
rowNum
,
false
);
code
=
absFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
int16_t
*
)
pOutput
->
data
+
i
),
val_smallint
);
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
val_smallint
=
-
10
;
scltMakeDataBlock
(
&
pInput
,
type
,
&
val_smallint
,
1
,
true
);
scltMakeDataBlock
(
&
pOutput
,
type
,
0
,
rowNum
,
false
);
code
=
absFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
int16_t
*
)
pOutput
->
data
+
i
),
-
val_smallint
);
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
//INT
int32_t
val_int
=
10
;
type
=
TSDB_DATA_TYPE_INT
;
scltMakeDataBlock
(
&
pInput
,
type
,
&
val_int
,
1
,
true
);
scltMakeDataBlock
(
&
pOutput
,
type
,
0
,
rowNum
,
false
);
code
=
absFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
int32_t
*
)
pOutput
->
data
+
i
),
val_int
);
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
val_int
=
-
10
;
scltMakeDataBlock
(
&
pInput
,
type
,
&
val_int
,
1
,
true
);
scltMakeDataBlock
(
&
pOutput
,
type
,
0
,
rowNum
,
false
);
code
=
absFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
int32_t
*
)
pOutput
->
data
+
i
),
-
val_int
);
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
//BIGINT
int64_t
val_bigint
=
10
;
type
=
TSDB_DATA_TYPE_BIGINT
;
scltMakeDataBlock
(
&
pInput
,
type
,
&
val_bigint
,
1
,
true
);
scltMakeDataBlock
(
&
pOutput
,
type
,
0
,
rowNum
,
false
);
code
=
absFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
int64_t
*
)
pOutput
->
data
+
i
),
val_bigint
);
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
val_bigint
=
-
10
;
scltMakeDataBlock
(
&
pInput
,
type
,
&
val_bigint
,
rowNum
,
true
);
scltMakeDataBlock
(
&
pOutput
,
type
,
0
,
rowNum
,
false
);
code
=
absFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
int64_t
*
)
pOutput
->
data
+
i
),
-
val_bigint
);
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
//FLOAT
float
val_float
=
10.15
;
type
=
TSDB_DATA_TYPE_FLOAT
;
scltMakeDataBlock
(
&
pInput
,
type
,
&
val_float
,
1
,
true
);
scltMakeDataBlock
(
&
pOutput
,
type
,
0
,
rowNum
,
false
);
PRINTF
(
"float before ABS:%f
\n
"
,
*
(
float
*
)
pInput
->
data
);
code
=
absFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
float
*
)
pOutput
->
data
+
i
),
val_float
);
PRINTF
(
"float after ABS:%f
\n
"
,
*
((
float
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
val_float
=
-
10.15
;
scltMakeDataBlock
(
&
pInput
,
type
,
&
val_float
,
1
,
true
);
scltMakeDataBlock
(
&
pOutput
,
type
,
0
,
rowNum
,
false
);
PRINTF
(
"float before ABS:%f
\n
"
,
*
(
float
*
)
pInput
->
data
);
code
=
absFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
float
*
)
pOutput
->
data
+
i
),
-
val_float
);
PRINTF
(
"float after ABS:%f
\n
"
,
*
((
float
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
//DOUBLE
double
val_double
=
10.15
;
type
=
TSDB_DATA_TYPE_DOUBLE
;
scltMakeDataBlock
(
&
pInput
,
type
,
&
val_double
,
1
,
true
);
scltMakeDataBlock
(
&
pOutput
,
type
,
0
,
rowNum
,
false
);
code
=
absFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
val_double
);
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
val_double
=
-
10.15
;
scltMakeDataBlock
(
&
pInput
,
type
,
&
val_double
,
rowNum
,
true
);
scltMakeDataBlock
(
&
pOutput
,
type
,
0
,
rowNum
,
false
);
code
=
absFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
-
val_double
);
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
}
TEST
(
ScalarFunctionTest
,
absFunction_column
)
{
SScalarParam
*
pInput
,
*
pOutput
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
int32_t
rowNum
=
5
;
int32_t
type
;
//TINYINT
int8_t
val_tinyint
=
10
;
type
=
TSDB_DATA_TYPE_TINYINT
;
scltMakeDataBlock
(
&
pInput
,
type
,
0
,
rowNum
,
false
);
scltMakeDataBlock
(
&
pOutput
,
type
,
0
,
rowNum
,
false
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
*
((
int8_t
*
)
pInput
->
data
+
i
)
=
val_tinyint
+
i
;
PRINTF
(
"tiny_int before ABS:%d
\n
"
,
*
((
int8_t
*
)
pInput
->
data
+
i
));
}
code
=
absFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
int8_t
*
)
pOutput
->
data
+
i
),
val_tinyint
+
i
);
PRINTF
(
"tiny_int after ABS:%d
\n
"
,
*
((
int8_t
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
val_tinyint
=
-
10
;
scltMakeDataBlock
(
&
pInput
,
type
,
0
,
rowNum
,
false
);
scltMakeDataBlock
(
&
pOutput
,
type
,
0
,
rowNum
,
false
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
*
((
int8_t
*
)
pInput
->
data
+
i
)
=
val_tinyint
+
i
;
PRINTF
(
"tiny_int before ABS:%d
\n
"
,
*
((
int8_t
*
)
pInput
->
data
+
i
));
}
code
=
absFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
int8_t
*
)
pOutput
->
data
+
i
),
-
(
val_tinyint
+
i
));
PRINTF
(
"tiny_int after ABS:%d
\n
"
,
*
((
int8_t
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
//SMALLINT
int16_t
val_smallint
=
10
;
type
=
TSDB_DATA_TYPE_SMALLINT
;
scltMakeDataBlock
(
&
pInput
,
type
,
0
,
rowNum
,
false
);
scltMakeDataBlock
(
&
pOutput
,
type
,
0
,
rowNum
,
false
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
*
((
int16_t
*
)
pInput
->
data
+
i
)
=
val_smallint
+
i
;
PRINTF
(
"small_int before ABS:%d
\n
"
,
*
((
int16_t
*
)
pInput
->
data
+
i
));
}
code
=
absFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
int16_t
*
)
pOutput
->
data
+
i
),
val_smallint
+
i
);
PRINTF
(
"small_int after ABS:%d
\n
"
,
*
((
int16_t
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
val_smallint
=
-
10
;
scltMakeDataBlock
(
&
pInput
,
type
,
0
,
rowNum
,
false
);
scltMakeDataBlock
(
&
pOutput
,
type
,
0
,
rowNum
,
false
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
*
((
int16_t
*
)
pInput
->
data
+
i
)
=
val_smallint
+
i
;
PRINTF
(
"small_int before ABS:%d
\n
"
,
*
((
int16_t
*
)
pInput
->
data
+
i
));
}
code
=
absFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
int16_t
*
)
pOutput
->
data
+
i
),
-
(
val_smallint
+
i
));
PRINTF
(
"small_int after ABS:%d
\n
"
,
*
((
int16_t
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
//INT
int32_t
val_int
=
10
;
type
=
TSDB_DATA_TYPE_INT
;
scltMakeDataBlock
(
&
pInput
,
type
,
0
,
rowNum
,
false
);
scltMakeDataBlock
(
&
pOutput
,
type
,
0
,
rowNum
,
false
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
*
((
int32_t
*
)
pInput
->
data
+
i
)
=
val_int
+
i
;
PRINTF
(
"int before ABS:%d
\n
"
,
*
((
int32_t
*
)
pInput
->
data
+
i
));
}
code
=
absFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
int32_t
*
)
pOutput
->
data
+
i
),
val_int
+
i
);
PRINTF
(
"int after ABS:%d
\n
"
,
*
((
int32_t
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
val_int
=
-
10
;
scltMakeDataBlock
(
&
pInput
,
type
,
0
,
rowNum
,
false
);
scltMakeDataBlock
(
&
pOutput
,
type
,
0
,
rowNum
,
false
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
*
((
int32_t
*
)
pInput
->
data
+
i
)
=
val_int
+
i
;
PRINTF
(
"int before ABS:%d
\n
"
,
*
((
int32_t
*
)
pInput
->
data
+
i
));
}
code
=
absFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
int32_t
*
)
pOutput
->
data
+
i
),
-
(
val_int
+
i
));
PRINTF
(
"int after ABS:%d
\n
"
,
*
((
int32_t
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
//FLOAT
float
val_float
=
10.15
;
type
=
TSDB_DATA_TYPE_FLOAT
;
scltMakeDataBlock
(
&
pInput
,
type
,
0
,
rowNum
,
false
);
scltMakeDataBlock
(
&
pOutput
,
type
,
0
,
rowNum
,
false
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
*
((
float
*
)
pInput
->
data
+
i
)
=
val_float
+
i
;
PRINTF
(
"float before ABS:%f
\n
"
,
*
((
float
*
)
pInput
->
data
+
i
));
}
code
=
absFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
float
*
)
pOutput
->
data
+
i
),
val_float
+
i
);
PRINTF
(
"float after ABS:%f
\n
"
,
*
((
float
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
val_float
=
-
10.15
;
scltMakeDataBlock
(
&
pInput
,
type
,
0
,
rowNum
,
false
);
scltMakeDataBlock
(
&
pOutput
,
type
,
0
,
rowNum
,
false
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
*
((
float
*
)
pInput
->
data
+
i
)
=
val_float
+
i
;
PRINTF
(
"float before ABS:%f
\n
"
,
*
((
float
*
)
pInput
->
data
+
i
));
}
code
=
absFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
float
*
)
pOutput
->
data
+
i
),
-
(
val_float
+
i
));
PRINTF
(
"float after ABS:%f
\n
"
,
*
((
float
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
//DOUBLE
double
val_double
=
10.15
;
type
=
TSDB_DATA_TYPE_DOUBLE
;
scltMakeDataBlock
(
&
pInput
,
type
,
0
,
rowNum
,
false
);
scltMakeDataBlock
(
&
pOutput
,
type
,
0
,
rowNum
,
false
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
*
((
double
*
)
pInput
->
data
+
i
)
=
val_double
+
i
;
PRINTF
(
"double before ABS:%f
\n
"
,
*
((
double
*
)
pInput
->
data
+
i
));
}
code
=
absFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
val_double
+
i
);
PRINTF
(
"double after ABS:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
val_double
=
-
10.15
;
scltMakeDataBlock
(
&
pInput
,
type
,
0
,
rowNum
,
false
);
scltMakeDataBlock
(
&
pOutput
,
type
,
0
,
rowNum
,
false
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
*
((
double
*
)
pInput
->
data
+
i
)
=
val_double
+
i
;
PRINTF
(
"double before ABS:%f
\n
"
,
*
((
double
*
)
pInput
->
data
+
i
));
}
code
=
absFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
-
(
val_double
+
i
));
PRINTF
(
"double after ABS:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
}
TEST
(
ScalarFunctionTest
,
sinFunction_constant
)
{
SScalarParam
*
pInput
,
*
pOutput
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
int32_t
rowNum
=
3
;
int32_t
type
;
int32_t
otype
=
TSDB_DATA_TYPE_DOUBLE
;
double
result
=
0.42016703682664092
;
//TINYINT
int8_t
val_tinyint
=
13
;
type
=
TSDB_DATA_TYPE_TINYINT
;
scltMakeDataBlock
(
&
pInput
,
type
,
&
val_tinyint
,
1
,
true
);
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
PRINTF
(
"tiny_int before SIN:%d
\n
"
,
*
((
int8_t
*
)
pInput
->
data
));
code
=
sinFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
);
PRINTF
(
"tiny_int after SIN:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
//FLOAT
float
val_float
=
13.00
;
type
=
TSDB_DATA_TYPE_FLOAT
;
scltMakeDataBlock
(
&
pInput
,
type
,
&
val_float
,
1
,
true
);
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
PRINTF
(
"float before SIN:%f
\n
"
,
*
((
float
*
)
pInput
->
data
));
code
=
sinFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
);
PRINTF
(
"float after SIN:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
}
TEST
(
ScalarFunctionTest
,
sinFunction_column
)
{
SScalarParam
*
pInput
,
*
pOutput
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
int32_t
rowNum
=
3
;
int32_t
type
;
int32_t
otype
=
TSDB_DATA_TYPE_DOUBLE
;
double
result
[]
=
{
0.42016703682664092
,
0.99060735569487035
,
0.65028784015711683
};
//TINYINT
int8_t
val_tinyint
[]
=
{
13
,
14
,
15
};
type
=
TSDB_DATA_TYPE_TINYINT
;
scltMakeDataBlock
(
&
pInput
,
type
,
0
,
rowNum
,
false
);
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
*
((
int8_t
*
)
pInput
->
data
+
i
)
=
val_tinyint
[
i
];
PRINTF
(
"tiny_int before SIN:%d
\n
"
,
*
((
int8_t
*
)
pInput
->
data
+
i
));
}
code
=
sinFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
[
i
]);
PRINTF
(
"tiny_int after SIN:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
//FLOAT
float
val_float
[]
=
{
13.00
,
14.00
,
15.00
};
type
=
TSDB_DATA_TYPE_FLOAT
;
scltMakeDataBlock
(
&
pInput
,
type
,
0
,
rowNum
,
false
);
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
*
((
float
*
)
pInput
->
data
+
i
)
=
val_float
[
i
];
PRINTF
(
"float before SIN:%f
\n
"
,
*
((
float
*
)
pInput
->
data
+
i
));
}
code
=
sinFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
[
i
]);
PRINTF
(
"float after SIN:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
}
TEST
(
ScalarFunctionTest
,
cosFunction_constant
)
{
SScalarParam
*
pInput
,
*
pOutput
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
int32_t
rowNum
=
3
;
int32_t
type
;
int32_t
otype
=
TSDB_DATA_TYPE_DOUBLE
;
double
result
=
0.90744678145019619
;
//TINYINT
int8_t
val_tinyint
=
13
;
type
=
TSDB_DATA_TYPE_TINYINT
;
scltMakeDataBlock
(
&
pInput
,
type
,
&
val_tinyint
,
1
,
true
);
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
PRINTF
(
"tiny_int before COS:%d
\n
"
,
*
((
int8_t
*
)
pInput
->
data
));
code
=
cosFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
);
PRINTF
(
"tiny_int after COS:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
//FLOAT
float
val_float
=
13.00
;
type
=
TSDB_DATA_TYPE_FLOAT
;
scltMakeDataBlock
(
&
pInput
,
type
,
&
val_float
,
1
,
true
);
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
PRINTF
(
"float before COS:%f
\n
"
,
*
((
float
*
)
pInput
->
data
));
code
=
cosFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
);
PRINTF
(
"float after COS:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
}
TEST
(
ScalarFunctionTest
,
cosFunction_column
)
{
SScalarParam
*
pInput
,
*
pOutput
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
int32_t
rowNum
=
3
;
int32_t
type
;
int32_t
otype
=
TSDB_DATA_TYPE_DOUBLE
;
double
result
[]
=
{
0.90744678145019619
,
0.13673721820783361
,
-
0.75968791285882131
};
//TINYINT
int8_t
val_tinyint
[]
=
{
13
,
14
,
15
};
type
=
TSDB_DATA_TYPE_TINYINT
;
scltMakeDataBlock
(
&
pInput
,
type
,
0
,
rowNum
,
false
);
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
*
((
int8_t
*
)
pInput
->
data
+
i
)
=
val_tinyint
[
i
];
PRINTF
(
"tiny_int before COS:%d
\n
"
,
*
((
int8_t
*
)
pInput
->
data
+
i
));
}
code
=
cosFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
[
i
]);
PRINTF
(
"tiny_int after COS:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
//FLOAT
float
val_float
[]
=
{
13.00
,
14.00
,
15.00
};
type
=
TSDB_DATA_TYPE_FLOAT
;
scltMakeDataBlock
(
&
pInput
,
type
,
0
,
rowNum
,
false
);
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
*
((
float
*
)
pInput
->
data
+
i
)
=
val_float
[
i
];
PRINTF
(
"float before COS:%f
\n
"
,
*
((
float
*
)
pInput
->
data
+
i
));
}
code
=
cosFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
[
i
]);
PRINTF
(
"float after COS:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
}
TEST
(
ScalarFunctionTest
,
tanFunction_constant
)
{
SScalarParam
*
pInput
,
*
pOutput
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
int32_t
rowNum
=
3
;
int32_t
type
;
int32_t
otype
=
TSDB_DATA_TYPE_DOUBLE
;
double
result
=
0.46302113293648961
;
//TINYINT
int8_t
val_tinyint
=
13
;
type
=
TSDB_DATA_TYPE_TINYINT
;
scltMakeDataBlock
(
&
pInput
,
type
,
&
val_tinyint
,
1
,
true
);
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
PRINTF
(
"tiny_int before TAN:%d
\n
"
,
*
((
int8_t
*
)
pInput
->
data
));
code
=
tanFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
);
PRINTF
(
"tiny_int after TAN:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
//FLOAT
float
val_float
=
13.00
;
type
=
TSDB_DATA_TYPE_FLOAT
;
scltMakeDataBlock
(
&
pInput
,
type
,
&
val_float
,
1
,
true
);
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
PRINTF
(
"float before TAN:%f
\n
"
,
*
((
float
*
)
pInput
->
data
));
code
=
tanFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
);
PRINTF
(
"float after TAN:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
}
TEST
(
ScalarFunctionTest
,
tanFunction_column
)
{
SScalarParam
*
pInput
,
*
pOutput
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
int32_t
rowNum
=
3
;
int32_t
type
;
int32_t
otype
=
TSDB_DATA_TYPE_DOUBLE
;
double
result
[]
=
{
0.46302113293648961
,
7.24460661609480550
,
-
0.85599340090851872
};
//TINYINT
int8_t
val_tinyint
[]
=
{
13
,
14
,
15
};
type
=
TSDB_DATA_TYPE_TINYINT
;
scltMakeDataBlock
(
&
pInput
,
type
,
0
,
rowNum
,
false
);
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
*
((
int8_t
*
)
pInput
->
data
+
i
)
=
val_tinyint
[
i
];
PRINTF
(
"tiny_int before TAN:%d
\n
"
,
*
((
int8_t
*
)
pInput
->
data
+
i
));
}
code
=
tanFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
[
i
]);
PRINTF
(
"tiny_int after TAN:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
//FLOAT
float
val_float
[]
=
{
13.00
,
14.00
,
15.00
};
type
=
TSDB_DATA_TYPE_FLOAT
;
scltMakeDataBlock
(
&
pInput
,
type
,
0
,
rowNum
,
false
);
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
*
((
float
*
)
pInput
->
data
+
i
)
=
val_float
[
i
];
PRINTF
(
"float before TAN:%f
\n
"
,
*
((
float
*
)
pInput
->
data
+
i
));
}
code
=
tanFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
[
i
]);
PRINTF
(
"float after TAN:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
}
TEST
(
ScalarFunctionTest
,
asinFunction_constant
)
{
SScalarParam
*
pInput
,
*
pOutput
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
int32_t
rowNum
=
3
;
int32_t
type
;
int32_t
otype
=
TSDB_DATA_TYPE_DOUBLE
;
double
result
=
1.57079632679489656
;
//TINYINT
int8_t
val_tinyint
=
1
;
type
=
TSDB_DATA_TYPE_TINYINT
;
scltMakeDataBlock
(
&
pInput
,
type
,
&
val_tinyint
,
1
,
true
);
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
PRINTF
(
"tiny_int before ASIN:%d
\n
"
,
*
((
int8_t
*
)
pInput
->
data
));
code
=
asinFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
);
PRINTF
(
"tiny_int after ASIN:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
//FLOAT
float
val_float
=
1.00
;
type
=
TSDB_DATA_TYPE_FLOAT
;
scltMakeDataBlock
(
&
pInput
,
type
,
&
val_float
,
1
,
true
);
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
PRINTF
(
"float before ASIN:%f
\n
"
,
*
((
float
*
)
pInput
->
data
));
code
=
asinFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
);
PRINTF
(
"float after ASIN:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
}
TEST
(
ScalarFunctionTest
,
asinFunction_column
)
{
SScalarParam
*
pInput
,
*
pOutput
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
int32_t
rowNum
=
3
;
int32_t
type
;
int32_t
otype
=
TSDB_DATA_TYPE_DOUBLE
;
double
result
[]
=
{
-
1.57079632679489656
,
0.0
,
1.57079632679489656
};
//TINYINT
int8_t
val_tinyint
[]
=
{
-
1
,
0
,
1
};
type
=
TSDB_DATA_TYPE_TINYINT
;
scltMakeDataBlock
(
&
pInput
,
type
,
0
,
rowNum
,
false
);
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
*
((
int8_t
*
)
pInput
->
data
+
i
)
=
val_tinyint
[
i
];
PRINTF
(
"tiny_int before ASIN:%d
\n
"
,
*
((
int8_t
*
)
pInput
->
data
+
i
));
}
code
=
asinFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
[
i
]);
PRINTF
(
"tiny_int after ASIN:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
//FLOAT
float
val_float
[]
=
{
-
1.0
,
0.0
,
1.0
};
type
=
TSDB_DATA_TYPE_FLOAT
;
scltMakeDataBlock
(
&
pInput
,
type
,
0
,
rowNum
,
false
);
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
*
((
float
*
)
pInput
->
data
+
i
)
=
val_float
[
i
];
PRINTF
(
"float before ASIN:%f
\n
"
,
*
((
float
*
)
pInput
->
data
+
i
));
}
code
=
asinFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
[
i
]);
PRINTF
(
"float after ASIN:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
}
TEST
(
ScalarFunctionTest
,
acosFunction_constant
)
{
SScalarParam
*
pInput
,
*
pOutput
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
int32_t
rowNum
=
3
;
int32_t
type
;
int32_t
otype
=
TSDB_DATA_TYPE_DOUBLE
;
double
result
=
0.0
;
//TINYINT
int8_t
val_tinyint
=
1
;
type
=
TSDB_DATA_TYPE_TINYINT
;
scltMakeDataBlock
(
&
pInput
,
type
,
&
val_tinyint
,
1
,
true
);
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
PRINTF
(
"tiny_int before ACOS:%d
\n
"
,
*
((
int8_t
*
)
pInput
->
data
));
code
=
acosFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
);
PRINTF
(
"tiny_int after ACOS:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
//FLOAT
float
val_float
=
1.00
;
type
=
TSDB_DATA_TYPE_FLOAT
;
scltMakeDataBlock
(
&
pInput
,
type
,
&
val_float
,
1
,
true
);
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
PRINTF
(
"float before ACOS:%f
\n
"
,
*
((
float
*
)
pInput
->
data
));
code
=
acosFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
);
PRINTF
(
"float after ACOS:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
}
TEST
(
ScalarFunctionTest
,
acosFunction_column
)
{
SScalarParam
*
pInput
,
*
pOutput
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
int32_t
rowNum
=
3
;
int32_t
type
;
int32_t
otype
=
TSDB_DATA_TYPE_DOUBLE
;
double
result
[]
=
{
3.14159265358979312
,
1.57079632679489656
,
0.0
};
//TINYINT
int8_t
val_tinyint
[]
=
{
-
1
,
0
,
1
};
type
=
TSDB_DATA_TYPE_TINYINT
;
scltMakeDataBlock
(
&
pInput
,
type
,
0
,
rowNum
,
false
);
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
*
((
int8_t
*
)
pInput
->
data
+
i
)
=
val_tinyint
[
i
];
PRINTF
(
"tiny_int before ACOS:%d
\n
"
,
*
((
int8_t
*
)
pInput
->
data
+
i
));
}
code
=
acosFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
[
i
]);
PRINTF
(
"tiny_int after ACOS:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
//FLOAT
float
val_float
[]
=
{
-
1.0
,
0.0
,
1.0
};
type
=
TSDB_DATA_TYPE_FLOAT
;
scltMakeDataBlock
(
&
pInput
,
type
,
0
,
rowNum
,
false
);
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
*
((
float
*
)
pInput
->
data
+
i
)
=
val_float
[
i
];
PRINTF
(
"float before ACOS:%f
\n
"
,
*
((
float
*
)
pInput
->
data
+
i
));
}
code
=
acosFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
[
i
]);
PRINTF
(
"float after ACOS:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
}
TEST
(
ScalarFunctionTest
,
atanFunction_constant
)
{
SScalarParam
*
pInput
,
*
pOutput
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
int32_t
rowNum
=
3
;
int32_t
type
;
int32_t
otype
=
TSDB_DATA_TYPE_DOUBLE
;
double
result
=
0.78539816339744828
;
//TINYINT
int8_t
val_tinyint
=
1
;
type
=
TSDB_DATA_TYPE_TINYINT
;
scltMakeDataBlock
(
&
pInput
,
type
,
&
val_tinyint
,
1
,
true
);
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
PRINTF
(
"tiny_int before ATAN:%d
\n
"
,
*
((
int8_t
*
)
pInput
->
data
));
code
=
atanFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
);
PRINTF
(
"tiny_int after ATAN:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
//FLOAT
float
val_float
=
1.00
;
type
=
TSDB_DATA_TYPE_FLOAT
;
scltMakeDataBlock
(
&
pInput
,
type
,
&
val_float
,
1
,
true
);
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
PRINTF
(
"float before ATAN:%f
\n
"
,
*
((
float
*
)
pInput
->
data
));
code
=
atanFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
);
PRINTF
(
"float after ATAN:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
}
TEST
(
ScalarFunctionTest
,
atanFunction_column
)
{
SScalarParam
*
pInput
,
*
pOutput
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
int32_t
rowNum
=
3
;
int32_t
type
;
int32_t
otype
=
TSDB_DATA_TYPE_DOUBLE
;
double
result
[]
=
{
-
0.78539816339744828
,
0.0
,
0.78539816339744828
};
//TINYINT
int8_t
val_tinyint
[]
=
{
-
1
,
0
,
1
};
type
=
TSDB_DATA_TYPE_TINYINT
;
scltMakeDataBlock
(
&
pInput
,
type
,
0
,
rowNum
,
false
);
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
*
((
int8_t
*
)
pInput
->
data
+
i
)
=
val_tinyint
[
i
];
PRINTF
(
"tiny_int before ATAN:%d
\n
"
,
*
((
int8_t
*
)
pInput
->
data
+
i
));
}
code
=
atanFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
[
i
]);
PRINTF
(
"tiny_int after ATAN:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
//FLOAT
float
val_float
[]
=
{
-
1.0
,
0.0
,
1.0
};
type
=
TSDB_DATA_TYPE_FLOAT
;
scltMakeDataBlock
(
&
pInput
,
type
,
0
,
rowNum
,
false
);
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
*
((
float
*
)
pInput
->
data
+
i
)
=
val_float
[
i
];
PRINTF
(
"float before ATAN:%f
\n
"
,
*
((
float
*
)
pInput
->
data
+
i
));
}
code
=
atanFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
[
i
]);
PRINTF
(
"float after ATAN:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
}
TEST
(
ScalarFunctionTest
,
ceilFunction_constant
)
{
SScalarParam
*
pInput
,
*
pOutput
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
int32_t
rowNum
=
3
;
int32_t
type
;
double
result
=
10.0
;
//TINYINT
int8_t
val_tinyint
=
10
;
type
=
TSDB_DATA_TYPE_TINYINT
;
scltMakeDataBlock
(
&
pInput
,
type
,
&
val_tinyint
,
1
,
true
);
scltMakeDataBlock
(
&
pOutput
,
type
,
0
,
rowNum
,
false
);
PRINTF
(
"tiny_int before CEIL:%d
\n
"
,
*
((
int8_t
*
)
pInput
->
data
));
code
=
ceilFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
int8_t
*
)
pOutput
->
data
+
i
),
(
int8_t
)
result
);
PRINTF
(
"tiny_int after CEIL:%d
\n
"
,
*
((
int8_t
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
//FLOAT
float
val_float
=
9.5
;
type
=
TSDB_DATA_TYPE_FLOAT
;
scltMakeDataBlock
(
&
pInput
,
type
,
&
val_float
,
1
,
true
);
scltMakeDataBlock
(
&
pOutput
,
type
,
0
,
rowNum
,
false
);
PRINTF
(
"float before CEIL:%f
\n
"
,
*
((
float
*
)
pInput
->
data
));
code
=
ceilFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
float
*
)
pOutput
->
data
+
i
),
(
float
)
result
);
PRINTF
(
"float after CEIL:%f
\n
"
,
*
((
float
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
}
TEST
(
ScalarFunctionTest
,
ceilFunction_column
)
{
SScalarParam
*
pInput
,
*
pOutput
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
int32_t
rowNum
=
3
;
int32_t
type
;
double
result
[]
=
{
-
10.0
,
0.0
,
10.0
};
//TINYINT
int8_t
val_tinyint
[]
=
{
-
10
,
0
,
10
};
type
=
TSDB_DATA_TYPE_TINYINT
;
scltMakeDataBlock
(
&
pInput
,
type
,
0
,
rowNum
,
false
);
scltMakeDataBlock
(
&
pOutput
,
type
,
0
,
rowNum
,
false
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
*
((
int8_t
*
)
pInput
->
data
+
i
)
=
val_tinyint
[
i
];
PRINTF
(
"tiny_int before CEIL:%d
\n
"
,
*
((
int8_t
*
)
pInput
->
data
+
i
));
}
code
=
ceilFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
int8_t
*
)
pOutput
->
data
+
i
),
result
[
i
]);
PRINTF
(
"tiny_int after CEIL:%d
\n
"
,
*
((
int8_t
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
//FLOAT
float
val_float
[]
=
{
-
10.5
,
0.0
,
9.5
};
type
=
TSDB_DATA_TYPE_FLOAT
;
scltMakeDataBlock
(
&
pInput
,
type
,
0
,
rowNum
,
false
);
scltMakeDataBlock
(
&
pOutput
,
type
,
0
,
rowNum
,
false
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
*
((
float
*
)
pInput
->
data
+
i
)
=
val_float
[
i
];
PRINTF
(
"float before CEIL:%f
\n
"
,
*
((
float
*
)
pInput
->
data
+
i
));
}
code
=
ceilFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
float
*
)
pOutput
->
data
+
i
),
result
[
i
]);
PRINTF
(
"float after CEIL:%f
\n
"
,
*
((
float
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
}
TEST
(
ScalarFunctionTest
,
floorFunction_constant
)
{
SScalarParam
*
pInput
,
*
pOutput
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
int32_t
rowNum
=
3
;
int32_t
type
;
double
result
=
10.0
;
//TINYINT
int8_t
val_tinyint
=
10
;
type
=
TSDB_DATA_TYPE_TINYINT
;
scltMakeDataBlock
(
&
pInput
,
type
,
&
val_tinyint
,
1
,
true
);
scltMakeDataBlock
(
&
pOutput
,
type
,
0
,
rowNum
,
false
);
PRINTF
(
"tiny_int before FLOOR:%d
\n
"
,
*
((
int8_t
*
)
pInput
->
data
));
code
=
floorFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
int8_t
*
)
pOutput
->
data
+
i
),
(
int8_t
)
result
);
PRINTF
(
"tiny_int after FLOOR:%d
\n
"
,
*
((
int8_t
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
//FLOAT
float
val_float
=
10.5
;
type
=
TSDB_DATA_TYPE_FLOAT
;
scltMakeDataBlock
(
&
pInput
,
type
,
&
val_float
,
1
,
true
);
scltMakeDataBlock
(
&
pOutput
,
type
,
0
,
rowNum
,
false
);
PRINTF
(
"float before FLOOR:%f
\n
"
,
*
((
float
*
)
pInput
->
data
));
code
=
floorFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
float
*
)
pOutput
->
data
+
i
),
(
float
)
result
);
PRINTF
(
"float after FLOOR:%f
\n
"
,
*
((
float
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
}
TEST
(
ScalarFunctionTest
,
floorFunction_column
)
{
SScalarParam
*
pInput
,
*
pOutput
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
int32_t
rowNum
=
3
;
int32_t
type
;
double
result
[]
=
{
-
10.0
,
0.0
,
10.0
};
//TINYINT
int8_t
val_tinyint
[]
=
{
-
10
,
0
,
10
};
type
=
TSDB_DATA_TYPE_TINYINT
;
scltMakeDataBlock
(
&
pInput
,
type
,
0
,
rowNum
,
false
);
scltMakeDataBlock
(
&
pOutput
,
type
,
0
,
rowNum
,
false
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
*
((
int8_t
*
)
pInput
->
data
+
i
)
=
val_tinyint
[
i
];
PRINTF
(
"tiny_int before FLOOR:%d
\n
"
,
*
((
int8_t
*
)
pInput
->
data
+
i
));
}
code
=
floorFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
int8_t
*
)
pOutput
->
data
+
i
),
result
[
i
]);
PRINTF
(
"tiny_int after FLOOR:%d
\n
"
,
*
((
int8_t
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
//FLOAT
float
val_float
[]
=
{
-
9.5
,
0.0
,
10.5
};
type
=
TSDB_DATA_TYPE_FLOAT
;
scltMakeDataBlock
(
&
pInput
,
type
,
0
,
rowNum
,
false
);
scltMakeDataBlock
(
&
pOutput
,
type
,
0
,
rowNum
,
false
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
*
((
float
*
)
pInput
->
data
+
i
)
=
val_float
[
i
];
PRINTF
(
"float before FLOOR:%f
\n
"
,
*
((
float
*
)
pInput
->
data
+
i
));
}
code
=
floorFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
float
*
)
pOutput
->
data
+
i
),
result
[
i
]);
PRINTF
(
"float after FLOOR:%f
\n
"
,
*
((
float
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
}
TEST
(
ScalarFunctionTest
,
roundFunction_constant
)
{
SScalarParam
*
pInput
,
*
pOutput
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
int32_t
rowNum
=
3
;
int32_t
type
;
double
result
=
10.0
;
//TINYINT
int8_t
val_tinyint
=
10
;
type
=
TSDB_DATA_TYPE_TINYINT
;
scltMakeDataBlock
(
&
pInput
,
type
,
&
val_tinyint
,
1
,
true
);
scltMakeDataBlock
(
&
pOutput
,
type
,
0
,
rowNum
,
false
);
PRINTF
(
"tiny_int before ROUND:%d
\n
"
,
*
((
int8_t
*
)
pInput
->
data
));
code
=
roundFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
int8_t
*
)
pOutput
->
data
+
i
),
(
int8_t
)
result
);
PRINTF
(
"tiny_int after ROUND:%d
\n
"
,
*
((
int8_t
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
//FLOAT
float
val_float
=
9.5
;
type
=
TSDB_DATA_TYPE_FLOAT
;
scltMakeDataBlock
(
&
pInput
,
type
,
&
val_float
,
1
,
true
);
scltMakeDataBlock
(
&
pOutput
,
type
,
0
,
rowNum
,
false
);
PRINTF
(
"float before ROUND:%f
\n
"
,
*
((
float
*
)
pInput
->
data
));
code
=
roundFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
float
*
)
pOutput
->
data
+
i
),
(
float
)
result
);
PRINTF
(
"float after ROUND:%f
\n
"
,
*
((
float
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
}
TEST
(
ScalarFunctionTest
,
roundFunction_column
)
{
SScalarParam
*
pInput
,
*
pOutput
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
int32_t
rowNum
=
3
;
int32_t
type
;
double
result
[]
=
{
-
10.0
,
0.0
,
10.0
};
//TINYINT
int8_t
val_tinyint
[]
=
{
-
10
,
0
,
10
};
type
=
TSDB_DATA_TYPE_TINYINT
;
scltMakeDataBlock
(
&
pInput
,
type
,
0
,
rowNum
,
false
);
scltMakeDataBlock
(
&
pOutput
,
type
,
0
,
rowNum
,
false
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
*
((
int8_t
*
)
pInput
->
data
+
i
)
=
val_tinyint
[
i
];
PRINTF
(
"tiny_int before ROUND:%d
\n
"
,
*
((
int8_t
*
)
pInput
->
data
+
i
));
}
code
=
roundFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
int8_t
*
)
pOutput
->
data
+
i
),
result
[
i
]);
PRINTF
(
"tiny_int after ROUND:%d
\n
"
,
*
((
int8_t
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
//FLOAT
float
val_float
[]
=
{
-
9.5
,
0.0
,
9.5
};
type
=
TSDB_DATA_TYPE_FLOAT
;
scltMakeDataBlock
(
&
pInput
,
type
,
0
,
rowNum
,
false
);
scltMakeDataBlock
(
&
pOutput
,
type
,
0
,
rowNum
,
false
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
*
((
float
*
)
pInput
->
data
+
i
)
=
val_float
[
i
];
PRINTF
(
"float before ROUND:%f
\n
"
,
*
((
float
*
)
pInput
->
data
+
i
));
}
code
=
roundFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
float
*
)
pOutput
->
data
+
i
),
result
[
i
]);
PRINTF
(
"float after ROUND:%f
\n
"
,
*
((
float
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
}
TEST
(
ScalarFunctionTest
,
sqrtFunction_constant
)
{
SScalarParam
*
pInput
,
*
pOutput
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
int32_t
rowNum
=
3
;
int32_t
type
;
int32_t
otype
=
TSDB_DATA_TYPE_DOUBLE
;
double
result
=
5.0
;
//TINYINT
int8_t
val_tinyint
=
25
;
type
=
TSDB_DATA_TYPE_TINYINT
;
scltMakeDataBlock
(
&
pInput
,
type
,
&
val_tinyint
,
1
,
true
);
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
PRINTF
(
"tiny_int before SQRT:%d
\n
"
,
*
((
int8_t
*
)
pInput
->
data
));
code
=
sqrtFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
);
PRINTF
(
"tiny_int after SQRT:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
//FLOAT
float
val_float
=
25.0
;
type
=
TSDB_DATA_TYPE_FLOAT
;
scltMakeDataBlock
(
&
pInput
,
type
,
&
val_float
,
1
,
true
);
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
PRINTF
(
"float before SQRT:%f
\n
"
,
*
((
float
*
)
pInput
->
data
));
code
=
sqrtFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
);
PRINTF
(
"float after SQRT:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
}
TEST
(
ScalarFunctionTest
,
sqrtFunction_column
)
{
SScalarParam
*
pInput
,
*
pOutput
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
int32_t
rowNum
=
3
;
int32_t
type
;
int32_t
otype
=
TSDB_DATA_TYPE_DOUBLE
;
double
result
[]
=
{
5.0
,
9.0
,
10.0
};
//TINYINT
int8_t
val_tinyint
[]
=
{
25
,
81
,
100
};
type
=
TSDB_DATA_TYPE_TINYINT
;
scltMakeDataBlock
(
&
pInput
,
type
,
0
,
rowNum
,
false
);
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
*
((
int8_t
*
)
pInput
->
data
+
i
)
=
val_tinyint
[
i
];
PRINTF
(
"tiny_int before SQRT:%d
\n
"
,
*
((
int8_t
*
)
pInput
->
data
+
i
));
}
code
=
sqrtFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
[
i
]);
PRINTF
(
"tiny_int after SQRT:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
//FLOAT
float
val_float
[]
=
{
25.0
,
81.0
,
100.0
};
type
=
TSDB_DATA_TYPE_FLOAT
;
scltMakeDataBlock
(
&
pInput
,
type
,
0
,
rowNum
,
false
);
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
*
((
float
*
)
pInput
->
data
+
i
)
=
val_float
[
i
];
PRINTF
(
"float before SQRT:%f
\n
"
,
*
((
float
*
)
pInput
->
data
+
i
));
}
code
=
sqrtFunction
(
pInput
,
1
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
[
i
]);
PRINTF
(
"float after SQRT:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
pInput
);
scltDestroyDataBlock
(
pOutput
);
}
TEST
(
ScalarFunctionTest
,
logFunction_constant
)
{
SScalarParam
*
pInput
,
*
pOutput
;
SScalarParam
*
input
[
2
];
int32_t
code
=
TSDB_CODE_SUCCESS
;
int32_t
rowNum
=
3
;
int32_t
type
;
int32_t
otype
=
TSDB_DATA_TYPE_DOUBLE
;
double
result
=
3.0
;
pInput
=
(
SScalarParam
*
)
taosMemoryCalloc
(
2
,
sizeof
(
SScalarParam
));
//TINYINT
int8_t
val_tinyint
[]
=
{
27
,
3
};
type
=
TSDB_DATA_TYPE_TINYINT
;
for
(
int32_t
i
=
0
;
i
<
2
;
++
i
)
{
scltMakeDataBlock
(
&
input
[
i
],
type
,
&
val_tinyint
[
i
],
1
,
true
);
pInput
[
i
]
=
*
input
[
i
];
}
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
PRINTF
(
"tiny_int before LOG: %d,%d
\n
"
,
*
((
int8_t
*
)
pInput
[
0
].
data
),
*
((
int8_t
*
)
pInput
[
1
].
data
));
code
=
logFunction
(
pInput
,
2
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
);
PRINTF
(
"tiny_int after LOG:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
input
[
0
]);
scltDestroyDataBlock
(
input
[
1
]);
scltDestroyDataBlock
(
pOutput
);
//FLOAT
float
val_float
[]
=
{
64.0
,
4.0
};
type
=
TSDB_DATA_TYPE_FLOAT
;
for
(
int32_t
i
=
0
;
i
<
2
;
++
i
)
{
scltMakeDataBlock
(
&
input
[
i
],
type
,
&
val_float
[
i
],
1
,
true
);
pInput
[
i
]
=
*
input
[
i
];
}
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
PRINTF
(
"float before LOG: %f,%f
\n
"
,
*
((
float
*
)
pInput
[
0
].
data
),
*
((
float
*
)
pInput
[
1
].
data
));
code
=
logFunction
(
pInput
,
2
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
);
PRINTF
(
"float after LOG:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
input
[
0
]);
scltDestroyDataBlock
(
input
[
1
]);
scltDestroyDataBlock
(
pOutput
);
//TINYINT AND FLOAT
int8_t
param0
=
64
;
float
param1
=
4.0
;
scltMakeDataBlock
(
&
input
[
0
],
TSDB_DATA_TYPE_TINYINT
,
&
param0
,
1
,
true
);
pInput
[
0
]
=
*
input
[
0
];
scltMakeDataBlock
(
&
input
[
1
],
TSDB_DATA_TYPE_FLOAT
,
&
param1
,
1
,
true
);
pInput
[
1
]
=
*
input
[
1
];
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
PRINTF
(
"tiny_int,float before LOG: %d,%f
\n
"
,
*
((
int8_t
*
)
pInput
[
0
].
data
),
*
((
float
*
)
pInput
[
1
].
data
));
code
=
logFunction
(
pInput
,
2
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
);
PRINTF
(
"tiny_int,float after LOG:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
input
[
0
]);
scltDestroyDataBlock
(
input
[
1
]);
scltDestroyDataBlock
(
pOutput
);
taosMemoryFree
(
pInput
);
}
TEST
(
ScalarFunctionTest
,
logFunction_column
)
{
SScalarParam
*
pInput
,
*
pOutput
;
SScalarParam
*
input
[
2
];
int32_t
code
=
TSDB_CODE_SUCCESS
;
int32_t
rowNum
=
3
;
int32_t
type
;
int32_t
otype
=
TSDB_DATA_TYPE_DOUBLE
;
double
result
[]
=
{
2.0
,
4.0
,
3.0
};
pInput
=
(
SScalarParam
*
)
taosMemoryCalloc
(
2
,
sizeof
(
SScalarParam
));
//TINYINT
int8_t
val_tinyint
[
2
][
3
]
=
{{
25
,
81
,
64
},
{
5
,
3
,
4
}};
type
=
TSDB_DATA_TYPE_TINYINT
;
for
(
int32_t
i
=
0
;
i
<
2
;
++
i
)
{
scltMakeDataBlock
(
&
input
[
i
],
type
,
0
,
rowNum
,
false
);
pInput
[
i
]
=
*
input
[
i
];
for
(
int32_t
j
=
0
;
j
<
rowNum
;
++
j
)
{
*
((
int8_t
*
)
pInput
[
i
].
data
+
j
)
=
val_tinyint
[
i
][
j
];
}
PRINTF
(
"tiny_int before LOG:%d,%d,%d
\n
"
,
*
((
int8_t
*
)
pInput
[
i
].
data
+
0
),
*
((
int8_t
*
)
pInput
[
i
].
data
+
1
),
*
((
int8_t
*
)
pInput
[
i
].
data
+
2
));
}
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
code
=
logFunction
(
pInput
,
2
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
[
i
]);
PRINTF
(
"tiny_int after LOG:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
input
[
0
]);
scltDestroyDataBlock
(
input
[
1
]);
scltDestroyDataBlock
(
pOutput
);
//FLOAT
float
val_float
[
2
][
3
]
=
{{
25.0
,
81.0
,
64.0
},
{
5.0
,
3.0
,
4.0
}};
type
=
TSDB_DATA_TYPE_FLOAT
;
for
(
int32_t
i
=
0
;
i
<
2
;
++
i
)
{
scltMakeDataBlock
(
&
input
[
i
],
type
,
0
,
rowNum
,
false
);
pInput
[
i
]
=
*
input
[
i
];
for
(
int32_t
j
=
0
;
j
<
rowNum
;
++
j
)
{
*
((
float
*
)
pInput
[
i
].
data
+
j
)
=
val_float
[
i
][
j
];
}
PRINTF
(
"float before LOG:%f,%f,%f
\n
"
,
*
((
float
*
)
pInput
[
i
].
data
+
0
),
*
((
float
*
)
pInput
[
i
].
data
+
1
),
*
((
float
*
)
pInput
[
i
].
data
+
2
));
}
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
code
=
logFunction
(
pInput
,
2
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
[
i
]);
PRINTF
(
"float after LOG:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
input
[
0
]);
scltDestroyDataBlock
(
input
[
1
]);
scltDestroyDataBlock
(
pOutput
);
//TINYINT AND FLOAT
int8_t
param0
[]
=
{
25
,
81
,
64
};
float
param1
[]
=
{
5.0
,
3.0
,
4.0
};
scltMakeDataBlock
(
&
input
[
0
],
TSDB_DATA_TYPE_TINYINT
,
0
,
rowNum
,
false
);
pInput
[
0
]
=
*
input
[
0
];
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
*
((
int8_t
*
)
pInput
[
0
].
data
+
i
)
=
param0
[
i
];
}
scltMakeDataBlock
(
&
input
[
1
],
TSDB_DATA_TYPE_FLOAT
,
0
,
rowNum
,
false
);
pInput
[
1
]
=
*
input
[
1
];
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
*
((
float
*
)
pInput
[
1
].
data
+
i
)
=
param1
[
i
];
}
PRINTF
(
"tiny_int, float before LOG:{%d,%f}, {%d,%f}, {%d,%f}
\n
"
,
*
((
int8_t
*
)
pInput
[
0
].
data
+
0
),
*
((
float
*
)
pInput
[
1
].
data
+
0
),
*
((
int8_t
*
)
pInput
[
0
].
data
+
1
),
*
((
float
*
)
pInput
[
1
].
data
+
1
),
*
((
int8_t
*
)
pInput
[
0
].
data
+
2
),
*
((
float
*
)
pInput
[
1
].
data
+
2
));
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
code
=
logFunction
(
pInput
,
2
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
[
i
]);
PRINTF
(
"tiny_int,float after LOG:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
input
[
0
]);
scltDestroyDataBlock
(
input
[
1
]);
scltDestroyDataBlock
(
pOutput
);
taosMemoryFree
(
pInput
);
}
TEST
(
ScalarFunctionTest
,
powFunction_constant
)
{
SScalarParam
*
pInput
,
*
pOutput
;
SScalarParam
*
input
[
2
];
int32_t
code
=
TSDB_CODE_SUCCESS
;
int32_t
rowNum
=
3
;
int32_t
type
;
int32_t
otype
=
TSDB_DATA_TYPE_DOUBLE
;
double
result
=
16.0
;
pInput
=
(
SScalarParam
*
)
taosMemoryCalloc
(
2
,
sizeof
(
SScalarParam
));
//TINYINT
int8_t
val_tinyint
[]
=
{
2
,
4
};
type
=
TSDB_DATA_TYPE_TINYINT
;
for
(
int32_t
i
=
0
;
i
<
2
;
++
i
)
{
scltMakeDataBlock
(
&
input
[
i
],
type
,
&
val_tinyint
[
i
],
1
,
true
);
pInput
[
i
]
=
*
input
[
i
];
}
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
PRINTF
(
"tiny_int before POW: %d,%d
\n
"
,
*
((
int8_t
*
)
pInput
[
0
].
data
),
*
((
int8_t
*
)
pInput
[
1
].
data
));
code
=
powFunction
(
pInput
,
2
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
);
PRINTF
(
"tiny_int after POW:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
input
[
0
]);
scltDestroyDataBlock
(
input
[
1
]);
scltDestroyDataBlock
(
pOutput
);
//FLOAT
float
val_float
[]
=
{
2.0
,
4.0
};
type
=
TSDB_DATA_TYPE_FLOAT
;
for
(
int32_t
i
=
0
;
i
<
2
;
++
i
)
{
scltMakeDataBlock
(
&
input
[
i
],
type
,
&
val_float
[
i
],
1
,
true
);
pInput
[
i
]
=
*
input
[
i
];
}
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
PRINTF
(
"float before POW: %f,%f
\n
"
,
*
((
float
*
)
pInput
[
0
].
data
),
*
((
float
*
)
pInput
[
1
].
data
));
code
=
powFunction
(
pInput
,
2
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
);
PRINTF
(
"float after POW:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
input
[
0
]);
scltDestroyDataBlock
(
input
[
1
]);
scltDestroyDataBlock
(
pOutput
);
//TINYINT AND FLOAT
int8_t
param0
=
2
;
float
param1
=
4.0
;
scltMakeDataBlock
(
&
input
[
0
],
TSDB_DATA_TYPE_TINYINT
,
&
param0
,
1
,
true
);
pInput
[
0
]
=
*
input
[
0
];
scltMakeDataBlock
(
&
input
[
1
],
TSDB_DATA_TYPE_FLOAT
,
&
param1
,
1
,
true
);
pInput
[
1
]
=
*
input
[
1
];
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
PRINTF
(
"tiny_int,float before POW: %d,%f
\n
"
,
*
((
int8_t
*
)
pInput
[
0
].
data
),
*
((
float
*
)
pInput
[
1
].
data
));
code
=
powFunction
(
pInput
,
2
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
);
PRINTF
(
"tiny_int,float after POW:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
input
[
0
]);
scltDestroyDataBlock
(
input
[
1
]);
scltDestroyDataBlock
(
pOutput
);
taosMemoryFree
(
pInput
);
}
TEST
(
ScalarFunctionTest
,
powFunction_column
)
{
SScalarParam
*
pInput
,
*
pOutput
;
SScalarParam
*
input
[
2
];
int32_t
code
=
TSDB_CODE_SUCCESS
;
int32_t
rowNum
=
3
;
int32_t
type
;
int32_t
otype
=
TSDB_DATA_TYPE_DOUBLE
;
double
result
[]
=
{
32.0
,
27.0
,
16.0
};
pInput
=
(
SScalarParam
*
)
taosMemoryCalloc
(
2
,
sizeof
(
SScalarParam
));
//TINYINT
int8_t
val_tinyint
[
2
][
3
]
=
{{
2
,
3
,
4
},
{
5
,
3
,
2
}};
type
=
TSDB_DATA_TYPE_TINYINT
;
for
(
int32_t
i
=
0
;
i
<
2
;
++
i
)
{
scltMakeDataBlock
(
&
input
[
i
],
type
,
0
,
rowNum
,
false
);
pInput
[
i
]
=
*
input
[
i
];
for
(
int32_t
j
=
0
;
j
<
rowNum
;
++
j
)
{
*
((
int8_t
*
)
pInput
[
i
].
data
+
j
)
=
val_tinyint
[
i
][
j
];
}
PRINTF
(
"tiny_int before POW:%d,%d,%d
\n
"
,
*
((
int8_t
*
)
pInput
[
i
].
data
+
0
),
*
((
int8_t
*
)
pInput
[
i
].
data
+
1
),
*
((
int8_t
*
)
pInput
[
i
].
data
+
2
));
}
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
code
=
powFunction
(
pInput
,
2
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
[
i
]);
PRINTF
(
"tiny_int after POW:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
input
[
0
]);
scltDestroyDataBlock
(
input
[
1
]);
scltDestroyDataBlock
(
pOutput
);
//FLOAT
float
val_float
[
2
][
3
]
=
{{
2.0
,
3.0
,
4.0
},
{
5.0
,
3.0
,
2.0
}};
type
=
TSDB_DATA_TYPE_FLOAT
;
for
(
int32_t
i
=
0
;
i
<
2
;
++
i
)
{
scltMakeDataBlock
(
&
input
[
i
],
type
,
0
,
rowNum
,
false
);
pInput
[
i
]
=
*
input
[
i
];
for
(
int32_t
j
=
0
;
j
<
rowNum
;
++
j
)
{
*
((
float
*
)
pInput
[
i
].
data
+
j
)
=
val_float
[
i
][
j
];
}
PRINTF
(
"float before POW:%f,%f,%f
\n
"
,
*
((
float
*
)
pInput
[
i
].
data
+
0
),
*
((
float
*
)
pInput
[
i
].
data
+
1
),
*
((
float
*
)
pInput
[
i
].
data
+
2
));
}
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
code
=
powFunction
(
pInput
,
2
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
[
i
]);
PRINTF
(
"float after POW:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
input
[
0
]);
scltDestroyDataBlock
(
input
[
1
]);
scltDestroyDataBlock
(
pOutput
);
//TINYINT AND FLOAT
int8_t
param0
[]
=
{
2
,
3
,
4
};
float
param1
[]
=
{
5.0
,
3.0
,
2.0
};
scltMakeDataBlock
(
&
input
[
0
],
TSDB_DATA_TYPE_TINYINT
,
0
,
rowNum
,
false
);
pInput
[
0
]
=
*
input
[
0
];
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
*
((
int8_t
*
)
pInput
[
0
].
data
+
i
)
=
param0
[
i
];
}
scltMakeDataBlock
(
&
input
[
1
],
TSDB_DATA_TYPE_FLOAT
,
0
,
rowNum
,
false
);
pInput
[
1
]
=
*
input
[
1
];
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
*
((
float
*
)
pInput
[
1
].
data
+
i
)
=
param1
[
i
];
}
PRINTF
(
"tiny_int, float before POW:{%d,%f}, {%d,%f}, {%d,%f}
\n
"
,
*
((
int8_t
*
)
pInput
[
0
].
data
+
0
),
*
((
float
*
)
pInput
[
1
].
data
+
0
),
*
((
int8_t
*
)
pInput
[
0
].
data
+
1
),
*
((
float
*
)
pInput
[
1
].
data
+
1
),
*
((
int8_t
*
)
pInput
[
0
].
data
+
2
),
*
((
float
*
)
pInput
[
1
].
data
+
2
));
scltMakeDataBlock
(
&
pOutput
,
otype
,
0
,
rowNum
,
false
);
code
=
powFunction
(
pInput
,
2
,
pOutput
);
ASSERT_EQ
(
code
,
TSDB_CODE_SUCCESS
);
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
ASSERT_EQ
(
*
((
double
*
)
pOutput
->
data
+
i
),
result
[
i
]);
PRINTF
(
"tiny_int,float after POW:%f
\n
"
,
*
((
double
*
)
pOutput
->
data
+
i
));
}
scltDestroyDataBlock
(
input
[
0
]);
scltDestroyDataBlock
(
input
[
1
]);
scltDestroyDataBlock
(
pOutput
);
taosMemoryFree
(
pInput
);
}
int
main
(
int
argc
,
char
**
argv
)
{
int
main
(
int
argc
,
char
**
argv
)
{
taosSeedRand
(
taosGetTimestampSec
());
taosSeedRand
(
taosGetTimestampSec
());
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录