Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
ad6dd54a
T
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1185
Star
22016
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
ad6dd54a
编写于
4月 07, 2023
作者:
A
Alex Duan
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
test: add udf function return with varchar
上级
927390f3
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
128 addition
and
1 deletion
+128
-1
docs/zh/07-develop/09-udf.md
docs/zh/07-develop/09-udf.md
+27
-1
tests/script/sh/max_vol.c
tests/script/sh/max_vol.c
+101
-0
未找到文件。
docs/zh/07-develop/09-udf.md
浏览文件 @
ad6dd54a
...
...
@@ -231,7 +231,7 @@ bit_add 实现多列的按位与功能。如果只有一列,返回这一列。
</details>
### 聚合函数示例 [l2norm](https://github.com/taosdata/TDengine/blob/develop/tests/script/sh/l2norm.c)
### 聚合函数示例
1 返回值为数值类型
[l2norm](https://github.com/taosdata/TDengine/blob/develop/tests/script/sh/l2norm.c)
l2norm 实现了输入列的所有数据的二阶范数,即对每个数据先平方,再累加求和,最后开方。
...
...
@@ -243,3 +243,29 @@ l2norm 实现了输入列的所有数据的二阶范数,即对每个数据先
```
</details>
### 聚合函数示例2 返回值为字符串类型 [max_vol](https://github.com/taosdata/TDengine/blob/develop/tests/script/sh/max_vol.c)
max_vol 实现了从多个输入的电压列中找到最大电压,返回由设备ID + 最大电压所在(行,列)+ 最大电压值 组成的组合字符串值
创建表:
```
bash
create table battery
(
ts timestamp, vol1 float, vol2 float, vol3 float, deviceId varchar
(
16
))
;
```
创建自定义函数:
```
bash
create aggregate
function
max_vol as
'/root/udf/libmaxvol.so'
outputtype binary
(
64
)
bufsize 10240 language
'C'
;
```
使用自定义函数:
```
bash
select
max_vol
(
vol1,vol2,vol3,deviceid
)
from battery
;
```
<details>
<summary>
max_vol.c
</summary>
```
c
{{
#
include
tests
/
script
/
sh
/
max_vol
.
c
}}
```
</details>
\ No newline at end of file
tests/script/sh/max_vol.c
0 → 100644
浏览文件 @
ad6dd54a
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include "taosudf.h"
#define STR_MAX_LEN 256 // inter buffer length
// init
DLL_EXPORT
int32_t
max_vol_init
()
{
return
0
;
}
// destory
DLL_EXPORT
int32_t
max_vol_destroy
()
{
return
0
;
}
// start
DLL_EXPORT
int32_t
max_vol_start
(
SUdfInterBuf
*
buf
)
{
memset
(
buf
->
buf
,
0
,
sizeof
(
float
)
+
STR_MAX_LEN
);
// set init value
*
((
float
*
)
buf
->
buf
)
=
-
10000000
;
buf
->
bufLen
=
sizeof
(
float
)
+
STR_MAX_LEN
;
buf
->
numOfResult
=
0
;
return
0
;
}
DLL_EXPORT
int32_t
max_vol
(
SUdfDataBlock
*
block
,
SUdfInterBuf
*
interBuf
,
SUdfInterBuf
*
newInterBuf
)
{
float
maxValue
=
*
(
float
*
)
interBuf
->
buf
;
char
strBuff
[
STR_MAX_LEN
]
=
"inter1buf"
;
if
(
block
->
numOfCols
<
2
)
{
return
TSDB_CODE_UDF_INVALID_INPUT
;
}
// check data type
for
(
int32_t
i
=
0
;
i
<
block
->
numOfCols
;
++
i
)
{
SUdfColumn
*
col
=
block
->
udfCols
[
i
];
if
(
i
==
block
->
numOfCols
-
1
)
{
// last column is device id , must varchar
if
(
col
->
colMeta
.
type
!=
TSDB_DATA_TYPE_VARCHAR
)
{
return
TSDB_CODE_UDF_INVALID_INPUT
;
}
}
else
{
if
(
col
->
colMeta
.
type
!=
TSDB_DATA_TYPE_FLOAT
)
{
return
TSDB_CODE_UDF_INVALID_INPUT
;
}
}
}
// calc max voltage
SUdfColumn
*
lastCol
=
block
->
udfCols
[
block
->
numOfCols
-
1
];
for
(
int32_t
i
=
0
;
i
<
(
block
->
numOfCols
-
1
);
++
i
)
{
for
(
int32_t
j
=
0
;
j
<
block
->
numOfRows
;
++
j
)
{
SUdfColumn
*
col
=
block
->
udfCols
[
i
];
if
(
udfColDataIsNull
(
col
,
j
))
{
continue
;
}
char
*
data
=
udfColDataGetData
(
col
,
j
);
float
voltage
=
*
(
float
*
)
data
;
if
(
voltage
>
maxValue
)
{
maxValue
=
voltage
;
char
*
valData
=
udfColDataGetData
(
lastCol
,
j
);
// get device id
char
*
deviceId
=
valData
+
sizeof
(
uint16_t
);
sprintf
(
strBuff
,
"%s_(%d,%d)_%f"
,
deviceId
,
j
,
i
,
maxValue
);
}
}
}
*
(
float
*
)
newInterBuf
->
buf
=
maxValue
;
strcpy
(
newInterBuf
->
buf
+
sizeof
(
float
),
strBuff
);
newInterBuf
->
bufLen
=
sizeof
(
float
)
+
strlen
(
strBuff
)
+
1
;
newInterBuf
->
numOfResult
=
1
;
return
0
;
}
DLL_EXPORT
int32_t
max_vol_finish
(
SUdfInterBuf
*
buf
,
SUdfInterBuf
*
resultData
)
{
char
*
str
=
buf
->
buf
+
sizeof
(
float
);
// copy to des
char
*
des
=
resultData
->
buf
+
sizeof
(
uint16_t
);
strcpy
(
des
,
str
);
// set binary type len
uint16_t
len
=
strlen
(
str
);
*
((
uint16_t
*
)
resultData
->
buf
)
=
len
;
// set buf len
resultData
->
bufLen
=
len
+
sizeof
(
uint16_t
);
// set row count
resultData
->
numOfResult
=
1
;
return
0
;
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录