Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
79002a6e
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1187
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看板
提交
79002a6e
编写于
3月 25, 2022
作者:
G
Ganlin Zhao
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[TD-14240]<feature>: add math functions
上级
1ad4440b
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
510 addition
and
105 deletion
+510
-105
source/libs/scalar/inc/sclfunc.h
source/libs/scalar/inc/sclfunc.h
+15
-1
source/libs/scalar/src/sclfunc.c
source/libs/scalar/src/sclfunc.c
+495
-104
未找到文件。
source/libs/scalar/inc/sclfunc.h
浏览文件 @
79002a6e
...
...
@@ -36,7 +36,21 @@ extern struct SScalarFunctionInfo scalarFunc[8];
int32_t
evaluateExprNodeTree
(
tExprNode
*
pExprs
,
int32_t
numOfRows
,
SScalarParam
*
pOutput
,
void
*
param
,
char
*
(
*
getSourceDataBlock
)(
void
*
,
const
char
*
,
int32_t
));
int32_t
abs_function
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
);
int32_t
log_function
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
);
int32_t
pow_function
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
);
int32_t
sqrt_function
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
);
int32_t
sin_function
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
);
int32_t
cos_function
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
);
int32_t
tan_function
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
);
int32_t
asin_function
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
);
int32_t
acos_function
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
);
int32_t
atan_function
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
);
int32_t
ceil_function
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
);
int32_t
floor_function
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
);
int32_t
round_function
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
);
#ifdef __cplusplus
}
...
...
source/libs/scalar/src/sclfunc.c
浏览文件 @
79002a6e
...
...
@@ -4,145 +4,536 @@
static
void
assignBasicParaInfo
(
struct
SScalarParam
*
dst
,
const
struct
SScalarParam
*
src
)
{
dst
->
type
=
src
->
type
;
dst
->
bytes
=
src
->
bytes
;
dst
->
num
=
src
->
num
;
//
dst->num = src->num;
}
static
void
tceil
(
SScalarParam
*
pOutput
,
size_t
numOfInput
,
const
SScalarParam
*
pLeft
)
{
assignBasicParaInfo
(
pOutput
,
pLeft
);
assert
(
numOfInput
==
1
);
/** Math functions **/
int32_t
abs_function
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
)
{
assignBasicParaInfo
(
pOutput
,
pInput
);
if
(
inputNum
!=
1
||
!
IS_NUMERIC_TYPE
(
pInput
->
type
))
{
return
TSDB_CODE_FAILED
;
}
switch
(
pLeft
->
bytes
)
{
case
TSDB_DATA_TYPE_FLOAT
:
{
float
*
p
=
(
float
*
)
pLeft
->
data
;
float
*
out
=
(
float
*
)
pOutput
->
data
;
for
(
int32_t
i
=
0
;
i
<
pLeft
->
num
;
++
i
)
{
out
[
i
]
=
ceilf
(
p
[
i
]);
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
;
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
:
{
double
*
p
=
(
double
*
)
pLeft
->
data
;
double
*
out
=
(
double
*
)
pOutput
->
data
;
for
(
int32_t
i
=
0
;
i
<
pLeft
->
num
;
++
i
)
{
out
[
i
]
=
ceil
(
p
[
i
]);
return
TSDB_CODE_SUCCESS
;
}
int32_t
log_function
(
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
;
}
pOutput
->
type
=
TSDB_DATA_TYPE_DOUBLE
;
pOutput
->
bytes
=
tDataTypes
[
TSDB_DATA_TYPE_DOUBLE
].
bytes
;
char
**
input
=
NULL
,
*
output
=
NULL
;
bool
hasNullInput
=
false
;
input
=
calloc
(
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:
memcpy
(
pOutput
->
data
,
pLeft
->
data
,
pLeft
->
num
*
pLeft
->
bytes
);
if
(
hasNullInput
)
{
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
)
{
assignBasicParaInfo
(
pOutput
,
pLeft
);
assert
(
numOfInput
==
1
);
free
(
input
);
switch
(
pLeft
->
bytes
)
{
case
TSDB_DATA_TYPE_FLOAT
:
{
float
*
p
=
(
float
*
)
pLeft
->
data
;
float
*
out
=
(
float
*
)
pOutput
->
data
;
return
TSDB_CODE_SUCCESS
;
}
int32_t
pow_function
(
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
)
{
out
[
i
]
=
floorf
(
p
[
i
]);
pOutput
->
type
=
TSDB_DATA_TYPE_DOUBLE
;
pOutput
->
bytes
=
tDataTypes
[
TSDB_DATA_TYPE_DOUBLE
].
bytes
;
char
**
input
=
NULL
,
*
output
=
NULL
;
bool
hasNullInput
=
false
;
input
=
calloc
(
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
:
{
double
*
p
=
(
double
*
)
pLeft
->
data
;
double
*
out
=
(
double
*
)
pOutput
->
data
;
if
(
hasNullInput
)
{
setNull
(
output
,
pOutput
->
type
,
pOutput
->
bytes
);
continue
;
}
for
(
int32_t
i
=
0
;
i
<
pLeft
->
num
;
++
i
)
{
out
[
i
]
=
floor
(
p
[
i
]);
}
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
=
pow
(
v
,
base
);
SET_TYPED_DATA
(
output
,
pOutput
->
type
,
result
);
}
free
(
input
);
return
TSDB_CODE_SUCCESS
;
}
int32_t
sqrt_function
(
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:
memcpy
(
pOutput
->
data
,
pLeft
->
data
,
pLeft
->
num
*
pLeft
->
bytes
);
double
v
;
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
)
{
assignBasicParaInfo
(
pOutput
,
pLeft
);
assert
(
numOfInput
==
1
);
int32_t
sin_function
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
)
{
if
(
inputNum
!=
1
||
!
IS_NUMERIC_TYPE
(
pInput
->
type
))
{
return
TSDB_CODE_FAILED
;
}
switch
(
pLeft
->
bytes
)
{
case
TSDB_DATA_TYPE_FLOAT
:
{
float
*
p
=
(
float
*
)
pLeft
->
data
;
float
*
out
=
(
float
*
)
pOutput
->
data
;
for
(
int32_t
i
=
0
;
i
<
pLeft
->
num
;
++
i
)
{
out
[
i
]
=
(
p
[
i
]
>
0
)
?
p
[
i
]
:-
p
[
i
];
}
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_DOUBLE
:
{
double
*
p
=
(
double
*
)
pLeft
->
data
;
double
*
out
=
(
double
*
)
pOutput
->
data
;
for
(
int32_t
i
=
0
;
i
<
pLeft
->
num
;
++
i
)
{
out
[
i
]
=
(
p
[
i
]
>
0
)
?
p
[
i
]
:-
p
[
i
];
}
if
(
isNull
(
input
,
pInput
->
type
))
{
setNull
(
output
,
pOutput
->
type
,
pOutput
->
bytes
);
continue
;
}
case
TSDB_DATA_TYPE_TINYINT
:
{
int8_t
*
p
=
(
int8_t
*
)
pLeft
->
data
;
int8_t
*
out
=
(
int8_t
*
)
pOutput
->
data
;
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
=
sin
(
v
);
SET_TYPED_DATA
(
output
,
pOutput
->
type
,
result
);
}
return
TSDB_CODE_SUCCESS
;
}
int32_t
cos_function
(
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
:
{
int16_t
*
p
=
(
int16_t
*
)
pLeft
->
data
;
int16_t
*
out
=
(
int16_t
*
)
pOutput
->
data
;
for
(
int32_t
i
=
0
;
i
<
pLeft
->
num
;
++
i
)
{
out
[
i
]
=
(
p
[
i
]
>
0
)
?
p
[
i
]
:-
p
[
i
];
}
if
(
isNull
(
input
,
pInput
->
type
))
{
setNull
(
output
,
pOutput
->
type
,
pOutput
->
bytes
);
continue
;
}
case
TSDB_DATA_TYPE_INT
:
{
int32_t
*
p
=
(
int32_t
*
)
pLeft
->
data
;
int32_t
*
out
=
(
int32_t
*
)
pOutput
->
data
;
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
=
cos
(
v
);
SET_TYPED_DATA
(
output
,
pOutput
->
type
,
result
);
}
return
TSDB_CODE_SUCCESS
;
}
int32_t
tan_function
(
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
:
{
int64_t
*
p
=
(
int64_t
*
)
pLeft
->
data
;
int64_t
*
out
=
(
int64_t
*
)
pOutput
->
data
;
for
(
int32_t
i
=
0
;
i
<
pLeft
->
num
;
++
i
)
{
out
[
i
]
=
(
p
[
i
]
>
0
)
?
p
[
i
]
:-
p
[
i
];
}
if
(
isNull
(
input
,
pInput
->
type
))
{
setNull
(
output
,
pOutput
->
type
,
pOutput
->
bytes
);
continue
;
}
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
asin_function
(
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:
memcpy
(
pOutput
->
data
,
pLeft
->
data
,
pLeft
->
num
*
pLeft
->
bytes
);
double
v
;
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
)
{
assignBasicParaInfo
(
pOutput
,
pLeft
);
assert
(
numOfInput
==
1
);
int32_t
acos_function
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
)
{
if
(
inputNum
!=
1
||
!
IS_NUMERIC_TYPE
(
pInput
->
type
))
{
return
TSDB_CODE_FAILED
;
}
switch
(
pLeft
->
bytes
)
{
case
TSDB_DATA_TYPE_FLOAT
:
{
float
*
p
=
(
float
*
)
pLeft
->
data
;
float
*
out
=
(
float
*
)
pOutput
->
data
;
for
(
int32_t
i
=
0
;
i
<
pLeft
->
num
;
++
i
)
{
out
[
i
]
=
roundf
(
p
[
i
]);
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
=
acos
(
v
);
SET_TYPED_DATA
(
output
,
pOutput
->
type
,
result
);
}
return
TSDB_CODE_SUCCESS
;
}
int32_t
atan_function
(
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
ceil_function
(
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
:
{
double
*
p
=
(
double
*
)
pLeft
->
data
;
double
*
out
=
(
double
*
)
pOutput
->
data
;
for
(
int32_t
i
=
0
;
i
<
pLeft
->
num
;
++
i
)
{
out
[
i
]
=
round
(
p
[
i
]);
return
TSDB_CODE_SUCCESS
;
}
int32_t
floor_function
(
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
;
}
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
round_function
(
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:
memcpy
(
pOutput
->
data
,
pLeft
->
data
,
pLeft
->
num
*
pLeft
->
bytes
);
switch
(
pInput
->
type
)
{
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
)
{
...
...
@@ -361,16 +752,16 @@ int32_t evaluateExprNodeTree(tExprNode* pExprs, int32_t numOfRows, SScalarFuncPa
#endif
SScalarFunctionInfo
scalarFunc
[
8
]
=
{
{
"ceil"
,
FUNCTION_TYPE_SCALAR
,
FUNCTION_CEIL
,
tceil
},
{
"floor"
,
FUNCTION_TYPE_SCALAR
,
FUNCTION_FLOOR
,
tfloor
},
{
"abs"
,
FUNCTION_TYPE_SCALAR
,
FUNCTION_ABS
,
_tabs
},
{
"round"
,
FUNCTION_TYPE_SCALAR
,
FUNCTION_ROUND
,
tround
},
{
"length"
,
FUNCTION_TYPE_SCALAR
,
FUNCTION_LENGTH
,
tlength
},
{
"concat"
,
FUNCTION_TYPE_SCALAR
,
FUNCTION_CONCAT
,
tconcat
},
{
"ltrim"
,
FUNCTION_TYPE_SCALAR
,
FUNCTION_LTRIM
,
tltrim
},
{
"rtrim"
,
FUNCTION_TYPE_SCALAR
,
FUNCTION_RTRIM
,
trtrim
},
};
//
SScalarFunctionInfo scalarFunc[8] = {
//
{"ceil", FUNCTION_TYPE_SCALAR, FUNCTION_CEIL, tceil},
//
{"floor", FUNCTION_TYPE_SCALAR, FUNCTION_FLOOR, tfloor},
//
{"abs", FUNCTION_TYPE_SCALAR, FUNCTION_ABS, _tabs},
//
{"round", FUNCTION_TYPE_SCALAR, FUNCTION_ROUND, tround},
//
{"length", FUNCTION_TYPE_SCALAR, FUNCTION_LENGTH, tlength},
//
{"concat", FUNCTION_TYPE_SCALAR, FUNCTION_CONCAT, tconcat},
//
{"ltrim", FUNCTION_TYPE_SCALAR, FUNCTION_LTRIM, tltrim},
//
{"rtrim", FUNCTION_TYPE_SCALAR, FUNCTION_RTRIM, trtrim},
//
};
void
setScalarFunctionSupp
(
struct
SScalarFunctionSupport
*
sas
,
SExprInfo
*
pExprInfo
,
SSDataBlock
*
pSDataBlock
)
{
sas
->
numOfCols
=
(
int32_t
)
pSDataBlock
->
info
.
numOfCols
;
...
...
@@ -411,4 +802,4 @@ void destroyScalarFuncSupport(struct SScalarFunctionSupport* pSupport, int32_t n
}
tfree
(
pSupport
);
}
\ No newline at end of file
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录