如何进行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);
}