以添加 MY_POSITION(substring IN string)为例说明
1、src\backend\parser\gram.y文件的%token <keyword>段添加MY_POSITION关键字,
建议按照ASCII顺序添加
2、src\backend\parser\gram.y文件的函数语义分析段添加如下内容:
----------------------------------------------------------------------
| MY_POSITION '(' my_position_list ')'
{
/*
* my_position(A in B) is converted to strpos(B, A)
*/
FuncCall *n = makeNode(FuncCall);
n->funcname = SystemFuncName("strpos");
n->args = $3;
n->agg_order = NIL;
n->agg_star = FALSE;
n->agg_distinct = FALSE;
n->func_variadic = FALSE;
n->over = NULL;
n->location = @1;
$$ = (Node *)n;
}
----------------------------------------------------------------------
3、src\backend\parser\gram.y文件中添加如下内容:
----------------------------------------------------------------------
my_position_list:
b_expr IN_P b_expr { $$ = list_make2($3, $1); }
| /*EMPTY*/ { $$ = NIL; }
;
----------------------------------------------------------------------
这里的“IN”已经是关键字了,可以直接用IN_P
4、src\backend\parser\gram.y文件的col_name_keyword段,添加MY_POSITION,如
----------------------------------------------------------------------
| MY_POSITION
----------------------------------------------------------------------
5、src\backend\parser\gram.y文件的定义段增加如下内容:
----------------------------------------------------------------------
%type <list> my_position_list
----------------------------------------------------------------------
6、src\include\parser\kwlist.h文件中增加如下语句(※):
----------------------------------------------------------------------
PG_KEYWORD("my_position", MY_POSITION, COL_NAME_KEYWORD)
----------------------------------------------------------------------
※:添加时,位置是按照ASCII顺序排列的。
1、src\backend\parser\gram.y文件的%token <keyword>段添加MY_POSITION关键字,
建议按照ASCII顺序添加
2、src\backend\parser\gram.y文件的函数语义分析段添加如下内容:
----------------------------------------------------------------------
| MY_POSITION '(' my_position_list ')'
{
/*
* my_position(A in B) is converted to strpos(B, A)
*/
FuncCall *n = makeNode(FuncCall);
n->funcname = SystemFuncName("strpos");
n->args = $3;
n->agg_order = NIL;
n->agg_star = FALSE;
n->agg_distinct = FALSE;
n->func_variadic = FALSE;
n->over = NULL;
n->location = @1;
$$ = (Node *)n;
}
----------------------------------------------------------------------
3、src\backend\parser\gram.y文件中添加如下内容:
----------------------------------------------------------------------
my_position_list:
b_expr IN_P b_expr { $$ = list_make2($3, $1); }
| /*EMPTY*/ { $$ = NIL; }
;
----------------------------------------------------------------------
这里的“IN”已经是关键字了,可以直接用IN_P
4、src\backend\parser\gram.y文件的col_name_keyword段,添加MY_POSITION,如
----------------------------------------------------------------------
| MY_POSITION
----------------------------------------------------------------------
5、src\backend\parser\gram.y文件的定义段增加如下内容:
----------------------------------------------------------------------
%type <list> my_position_list
----------------------------------------------------------------------
6、src\include\parser\kwlist.h文件中增加如下语句(※):
----------------------------------------------------------------------
PG_KEYWORD("my_position", MY_POSITION, COL_NAME_KEYWORD)
----------------------------------------------------------------------
※:添加时,位置是按照ASCII顺序排列的。