---
title: 如何进行openGauss MySQL兼容性函数开发-官方技术文章-鲲鹏社区
description: 以time函数为例，了解openGauss MySQL兼容性函数开发的主要流程
keywords: Gauss,如何进行,MySQL,兼容性函数开,官方技术文章,鲲鹏社区,进行需求调研,添加或修改相应语法
url: https://www.hikunpeng.com/developer/techArticles/20231207-2?envFlag=1
section: (其他)
---

# 如何进行openGauss MySQL兼容性函数开发-官方技术文章-鲲鹏社区

URL: https://www.hikunpeng.com/developer/techArticles/20231207-2?envFlag=1
描述: 以time函数为例，了解openGauss MySQL兼容性函数开发的主要流程
关键词: Gauss,如何进行,MySQL,兼容性函数开,官方技术文章,鲲鹏社区,进行需求调研,添加或修改相应语法

官方技术文章 [了解详情](https://www.hikunpeng.com/zh/developer/techArticles)

如何进行openGauss MySQL兼容性函数开发

如何进行openGauss MySQL兼容性函数开发

发表于 2023/12/07

0

下面我们以time函数为例，了解openGauss MySQL兼容性函数开发的主要流程

## 进行需求调研

在进行MySQL兼容性函数开发之前，我们应该首先在MySQL端对需求函数进行调研。

TIME(time_or_datetime)

入参：一个time类型或datetime类型表达式

返回值：

TIME() 函数返回指定的时间或者日期时间中的时间部分。

如果指定的表达式不是一个合法的时间或者日期时间，TIME() 函数将返回 NULL。

如果参数为 NULL，TIME() 函数将返回 NULL。

## 添加或修改相应语法

在contrib/dolphin/plugin_utils/gram.y文件下添加以下语法，当解析到time函数的语法时会调用time_mysql函数实现相应功能。

```
| TIME '(' a_expr ')'
{
    FuncCall *n = node_make(FuncCall);
    n->funcname = SystemFuncName("time_mysql");
    n->colname = "time";
    n->args = list_make1($3);
    n->agg_order = NIL;
    n->agg_star = FALSE;
    n->agg_distinct = FALSE;
    n->func_variadic = FALSE;
    n->over = NULL;
    n->location = @1;
    n->call_func = false;
    $$ = (Node *)n;
}
```

## 实现函数功能

将入参强转为日期时间类型，并将时间部分进行返回。

```
Datum time_mysql(PG_FUNCTION_ARGS)
{
    TimeADT time;
    TimeADT result = 0;
    Timestamp datetime;
    Oid val_type;

    bool result_isnull = false;
    val_type = get_fn_expr_argtype(fcinfo->flinfo, 0);
    val_type = convert_to_datetime_time(PG_GETARG_DATUM(0), val_type, &datetime, &time,
                                        fcinfo->can_ignore, &result_isnull);

    if (result_isnull) {
        PG_RETURN_NULL();
    }

    switch (val_type) {
        case TIMEOID: {
            result = time;
            break;
        }
        case TIMESTAMPOID:
        case DATEOID: {
            result = DatumGetTimeADT(DirectFunctionCall1(timestamp_time, TimeADTGetDatum(datetime)));
            break;
        }
        default: {
            ereport(ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH),
                            errmsg("unsupported input data type: %s", format_type_be(val_type))));
        }
    }
    PG_RETURN_TIMEADT(result);
}
```

本页内容
