鲲鹏社区首页
中文
注册
如何进行openGauss MySQL兼容性函数开发

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

openGauss

发表于 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);
}

本页内容