feat: pgsql: update routine's name
This commit is contained in:
parent
adeb26b7df
commit
a5757a30b6
@ -835,7 +835,7 @@ alterextensioncontentsstmt:
|
||||
| KW_ALTER KW_EXTENSION name add_drop KW_OPERATOR KW_CLASS any_name KW_USING name
|
||||
| KW_ALTER KW_EXTENSION name add_drop KW_OPERATOR KW_FAMILY any_name KW_USING name
|
||||
| KW_ALTER KW_EXTENSION name add_drop KW_PROCEDURE procedure_with_argtypes
|
||||
| KW_ALTER KW_EXTENSION name add_drop KW_ROUTINE function_with_argtypes
|
||||
| KW_ALTER KW_EXTENSION name add_drop KW_ROUTINE routine_with_argtypes
|
||||
| KW_ALTER KW_EXTENSION name add_drop KW_TRANSFORM KW_FOR typename KW_LANGUAGE name
|
||||
| KW_ALTER KW_EXTENSION name add_drop KW_TYPE typename;
|
||||
|
||||
@ -1236,7 +1236,7 @@ commentstmt:
|
||||
| KW_COMMENT KW_ON KW_RULE name KW_ON any_name KW_IS comment_text
|
||||
| KW_COMMENT KW_ON KW_TRIGGER name KW_ON any_name KW_IS comment_text
|
||||
| KW_COMMENT KW_ON KW_PROCEDURE procedure_with_argtypes KW_IS comment_text
|
||||
| KW_COMMENT KW_ON KW_ROUTINE function_with_argtypes KW_IS comment_text
|
||||
| KW_COMMENT KW_ON KW_ROUTINE routine_with_argtypes KW_IS comment_text
|
||||
| KW_COMMENT KW_ON KW_TRANSFORM KW_FOR typename KW_LANGUAGE name KW_IS comment_text
|
||||
| KW_COMMENT KW_ON KW_OPERATOR KW_CLASS any_name KW_USING name KW_IS comment_text
|
||||
| KW_COMMENT KW_ON KW_OPERATOR KW_FAMILY any_name KW_USING name KW_IS comment_text
|
||||
@ -1255,7 +1255,7 @@ seclabelstmt:
|
||||
| KW_SECURITY KW_LABEL opt_provider? KW_ON KW_FUNCTION function_with_argtypes KW_IS security_label
|
||||
| KW_SECURITY KW_LABEL opt_provider? KW_ON KW_LARGE KW_OBJECT numericonly KW_IS security_label
|
||||
| KW_SECURITY KW_LABEL opt_provider? KW_ON KW_PROCEDURE procedure_with_argtypes KW_IS security_label
|
||||
| KW_SECURITY KW_LABEL opt_provider? KW_ON KW_ROUTINE function_with_argtypes KW_IS security_label;
|
||||
| KW_SECURITY KW_LABEL opt_provider? KW_ON KW_ROUTINE routine_with_argtypes KW_IS security_label;
|
||||
|
||||
opt_provider: KW_FOR nonreservedword_or_sconst;
|
||||
|
||||
@ -1335,7 +1335,7 @@ privilege_target:
|
||||
| KW_FOREIGN KW_SERVER name_list
|
||||
| KW_FUNCTION function_with_argtypes_list
|
||||
| KW_PROCEDURE procedure_with_argtypes_list
|
||||
| KW_ROUTINE usual_with_argtypes_list
|
||||
| KW_ROUTINE routine_with_argtypes_list
|
||||
| KW_DATABASE database_nameList
|
||||
| KW_DOMAIN any_name_list
|
||||
| KW_LANGUAGE name_list
|
||||
@ -1444,11 +1444,11 @@ func_args: OPEN_PAREN func_args_list? CLOSE_PAREN;
|
||||
|
||||
func_args_list: func_arg (COMMA func_arg)*;
|
||||
|
||||
usual_with_argtypes_list:
|
||||
usual_with_argtypes (COMMA usual_with_argtypes)*;
|
||||
routine_with_argtypes_list:
|
||||
routine_with_argtypes (COMMA routine_with_argtypes)*;
|
||||
|
||||
usual_with_argtypes:
|
||||
usual_name func_args
|
||||
routine_with_argtypes:
|
||||
routine_name func_args
|
||||
| type_func_name_keyword
|
||||
| colid indirection?;
|
||||
|
||||
@ -1560,7 +1560,7 @@ table_func_column_list:
|
||||
alterfunctionstmt:
|
||||
KW_ALTER alterFunctionTypeClause alterfunc_opt_list opt_restrict?;
|
||||
|
||||
alterFunctionTypeClause: KW_FUNCTION function_with_argtypes | KW_PROCEDURE procedure_with_argtypes | KW_ROUTINE usual_with_argtypes;
|
||||
alterFunctionTypeClause: KW_FUNCTION function_with_argtypes | KW_PROCEDURE procedure_with_argtypes | KW_ROUTINE routine_with_argtypes;
|
||||
|
||||
alterfunc_opt_list: common_func_opt_item+;
|
||||
|
||||
@ -1569,7 +1569,7 @@ opt_restrict: KW_RESTRICT;
|
||||
removefuncstmt:
|
||||
KW_DROP KW_FUNCTION opt_if_exists? function_with_argtypes_list opt_drop_behavior?
|
||||
| KW_DROP KW_PROCEDURE opt_if_exists? procedure_with_argtypes_list opt_drop_behavior?
|
||||
| KW_DROP KW_ROUTINE opt_if_exists? usual_with_argtypes_list opt_drop_behavior?;
|
||||
| KW_DROP KW_ROUTINE opt_if_exists? routine_with_argtypes_list opt_drop_behavior?;
|
||||
|
||||
removeaggrstmt:
|
||||
KW_DROP KW_AGGREGATE opt_if_exists? aggregate_with_argtypes_list opt_drop_behavior?;
|
||||
@ -1653,7 +1653,7 @@ renamestmt:
|
||||
| KW_ALTER KW_POLICY opt_if_exists? name KW_ON qualified_name KW_RENAME KW_TO name
|
||||
| KW_ALTER KW_PROCEDURE procedure_with_argtypes KW_RENAME KW_TO procedure_name_create
|
||||
| KW_ALTER KW_PUBLICATION name KW_RENAME KW_TO name
|
||||
| KW_ALTER KW_ROUTINE function_with_argtypes KW_RENAME KW_TO name
|
||||
| KW_ALTER KW_ROUTINE routine_with_argtypes KW_RENAME KW_TO name
|
||||
| KW_ALTER KW_SCHEMA schema_name KW_RENAME KW_TO schema_name_create
|
||||
| KW_ALTER KW_SERVER name KW_RENAME KW_TO name
|
||||
| KW_ALTER KW_SUBSCRIPTION name KW_RENAME KW_TO name
|
||||
@ -1689,7 +1689,7 @@ opt_set_data: KW_SET KW_DATA;
|
||||
alterobjectdependsstmt:
|
||||
KW_ALTER KW_FUNCTION function_with_argtypes opt_no? KW_DEPENDS KW_ON KW_EXTENSION name
|
||||
| KW_ALTER KW_PROCEDURE procedure_with_argtypes opt_no? KW_DEPENDS KW_ON KW_EXTENSION name
|
||||
| KW_ALTER KW_ROUTINE function_with_argtypes opt_no? KW_DEPENDS KW_ON KW_EXTENSION name
|
||||
| KW_ALTER KW_ROUTINE routine_with_argtypes opt_no? KW_DEPENDS KW_ON KW_EXTENSION name
|
||||
| KW_ALTER KW_TRIGGER name KW_ON qualified_name opt_no? KW_DEPENDS KW_ON KW_EXTENSION name
|
||||
| KW_ALTER KW_MATERIALIZED KW_VIEW view_name opt_no? KW_DEPENDS KW_ON KW_EXTENSION name
|
||||
| KW_ALTER KW_INDEX qualified_name opt_no? KW_DEPENDS KW_ON KW_EXTENSION name;
|
||||
@ -1707,7 +1707,7 @@ alterobjectschemastmt:
|
||||
| KW_ALTER KW_OPERATOR KW_CLASS any_name KW_USING name KW_SET KW_SCHEMA schema_name_create
|
||||
| KW_ALTER KW_OPERATOR KW_FAMILY any_name KW_USING name KW_SET KW_SCHEMA schema_name_create
|
||||
| KW_ALTER KW_PROCEDURE procedure_with_argtypes KW_SET KW_SCHEMA schema_name_create
|
||||
| KW_ALTER KW_ROUTINE function_with_argtypes KW_SET KW_SCHEMA schema_name_create
|
||||
| KW_ALTER KW_ROUTINE routine_with_argtypes KW_SET KW_SCHEMA schema_name_create
|
||||
| KW_ALTER KW_TABLE opt_if_exists? relation_expr KW_SET KW_SCHEMA schema_name_create
|
||||
| KW_ALTER KW_STATISTICS any_name KW_SET KW_SCHEMA schema_name_create
|
||||
| KW_ALTER KW_TEXT KW_SEARCH KW_PARSER any_name KW_SET KW_SCHEMA schema_name_create
|
||||
@ -1752,7 +1752,7 @@ alterownerstmt:
|
||||
| KW_ALTER KW_OPERATOR KW_CLASS any_name KW_USING name KW_OWNER KW_TO rolespec
|
||||
| KW_ALTER KW_OPERATOR KW_FAMILY any_name KW_USING name KW_OWNER KW_TO rolespec
|
||||
| KW_ALTER KW_PROCEDURE procedure_with_argtypes KW_OWNER KW_TO rolespec
|
||||
| KW_ALTER KW_ROUTINE function_with_argtypes KW_OWNER KW_TO rolespec
|
||||
| KW_ALTER KW_ROUTINE routine_with_argtypes KW_OWNER KW_TO rolespec
|
||||
| KW_ALTER KW_SCHEMA schema_name KW_OWNER KW_TO rolespec
|
||||
| KW_ALTER KW_TYPE any_name KW_OWNER KW_TO rolespec
|
||||
| KW_ALTER KW_TABLESPACE tablespace_name KW_OWNER KW_TO rolespec
|
||||
|
File diff suppressed because one or more lines are too long
@ -943,8 +943,8 @@ export class PostgreSQLParser extends Parser {
|
||||
public static readonly RULE_opt_or_replace = 324;
|
||||
public static readonly RULE_func_args = 325;
|
||||
public static readonly RULE_func_args_list = 326;
|
||||
public static readonly RULE_usual_with_argtypes_list = 327;
|
||||
public static readonly RULE_usual_with_argtypes = 328;
|
||||
public static readonly RULE_routine_with_argtypes_list = 327;
|
||||
public static readonly RULE_routine_with_argtypes = 328;
|
||||
public static readonly RULE_procedure_with_argtypes_list = 329;
|
||||
public static readonly RULE_procedure_with_argtypes = 330;
|
||||
public static readonly RULE_function_with_argtypes_list = 331;
|
||||
@ -1556,8 +1556,8 @@ export class PostgreSQLParser extends Parser {
|
||||
"opt_index_name", "access_method_clause", "index_params", "index_elem_options",
|
||||
"index_elem", "opt_include", "index_including_params", "opt_collate",
|
||||
"opt_class", "opt_asc_desc", "opt_nulls_order", "createfunctionstmt",
|
||||
"attrilist", "opt_or_replace", "func_args", "func_args_list", "usual_with_argtypes_list",
|
||||
"usual_with_argtypes", "procedure_with_argtypes_list", "procedure_with_argtypes",
|
||||
"attrilist", "opt_or_replace", "func_args", "func_args_list", "routine_with_argtypes_list",
|
||||
"routine_with_argtypes", "procedure_with_argtypes_list", "procedure_with_argtypes",
|
||||
"function_with_argtypes_list", "function_with_argtypes", "func_args_with_defaults",
|
||||
"func_args_with_defaults_list", "func_arg", "arg_class", "param_name",
|
||||
"func_return", "func_type", "func_arg_with_default", "aggr_arg", "aggr_args",
|
||||
@ -17128,7 +17128,7 @@ export class PostgreSQLParser extends Parser {
|
||||
this.state = 3919;
|
||||
this.match(PostgreSQLParser.KW_ROUTINE);
|
||||
this.state = 3920;
|
||||
this.function_with_argtypes();
|
||||
this.routine_with_argtypes();
|
||||
}
|
||||
break;
|
||||
|
||||
@ -25192,7 +25192,7 @@ export class PostgreSQLParser extends Parser {
|
||||
this.state = 5481;
|
||||
this.match(PostgreSQLParser.KW_ROUTINE);
|
||||
this.state = 5482;
|
||||
this.function_with_argtypes();
|
||||
this.routine_with_argtypes();
|
||||
this.state = 5483;
|
||||
this.match(PostgreSQLParser.KW_IS);
|
||||
this.state = 5484;
|
||||
@ -25675,7 +25675,7 @@ export class PostgreSQLParser extends Parser {
|
||||
this.state = 5645;
|
||||
this.match(PostgreSQLParser.KW_ROUTINE);
|
||||
this.state = 5646;
|
||||
this.function_with_argtypes();
|
||||
this.routine_with_argtypes();
|
||||
this.state = 5647;
|
||||
this.match(PostgreSQLParser.KW_IS);
|
||||
this.state = 5648;
|
||||
@ -27125,7 +27125,7 @@ export class PostgreSQLParser extends Parser {
|
||||
this.state = 5858;
|
||||
this.match(PostgreSQLParser.KW_ROUTINE);
|
||||
this.state = 5859;
|
||||
this.usual_with_argtypes_list();
|
||||
this.routine_with_argtypes_list();
|
||||
}
|
||||
break;
|
||||
|
||||
@ -29221,15 +29221,15 @@ export class PostgreSQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
// @RuleVersion(0)
|
||||
public usual_with_argtypes_list(): Usual_with_argtypes_listContext {
|
||||
let _localctx: Usual_with_argtypes_listContext = new Usual_with_argtypes_listContext(this._ctx, this.state);
|
||||
this.enterRule(_localctx, 654, PostgreSQLParser.RULE_usual_with_argtypes_list);
|
||||
public routine_with_argtypes_list(): Routine_with_argtypes_listContext {
|
||||
let _localctx: Routine_with_argtypes_listContext = new Routine_with_argtypes_listContext(this._ctx, this.state);
|
||||
this.enterRule(_localctx, 654, PostgreSQLParser.RULE_routine_with_argtypes_list);
|
||||
let _la: number;
|
||||
try {
|
||||
this.enterOuterAlt(_localctx, 1);
|
||||
{
|
||||
this.state = 6189;
|
||||
this.usual_with_argtypes();
|
||||
this.routine_with_argtypes();
|
||||
this.state = 6194;
|
||||
this._errHandler.sync(this);
|
||||
_la = this._input.LA(1);
|
||||
@ -29239,7 +29239,7 @@ export class PostgreSQLParser extends Parser {
|
||||
this.state = 6190;
|
||||
this.match(PostgreSQLParser.COMMA);
|
||||
this.state = 6191;
|
||||
this.usual_with_argtypes();
|
||||
this.routine_with_argtypes();
|
||||
}
|
||||
}
|
||||
this.state = 6196;
|
||||
@ -29263,9 +29263,9 @@ export class PostgreSQLParser extends Parser {
|
||||
return _localctx;
|
||||
}
|
||||
// @RuleVersion(0)
|
||||
public usual_with_argtypes(): Usual_with_argtypesContext {
|
||||
let _localctx: Usual_with_argtypesContext = new Usual_with_argtypesContext(this._ctx, this.state);
|
||||
this.enterRule(_localctx, 656, PostgreSQLParser.RULE_usual_with_argtypes);
|
||||
public routine_with_argtypes(): Routine_with_argtypesContext {
|
||||
let _localctx: Routine_with_argtypesContext = new Routine_with_argtypesContext(this._ctx, this.state);
|
||||
this.enterRule(_localctx, 656, PostgreSQLParser.RULE_routine_with_argtypes);
|
||||
let _la: number;
|
||||
try {
|
||||
this.state = 6205;
|
||||
@ -29275,7 +29275,7 @@ export class PostgreSQLParser extends Parser {
|
||||
this.enterOuterAlt(_localctx, 1);
|
||||
{
|
||||
this.state = 6197;
|
||||
this.usual_name();
|
||||
this.routine_name();
|
||||
this.state = 6198;
|
||||
this.func_args();
|
||||
}
|
||||
@ -30699,7 +30699,7 @@ export class PostgreSQLParser extends Parser {
|
||||
this.state = 6445;
|
||||
this.match(PostgreSQLParser.KW_ROUTINE);
|
||||
this.state = 6446;
|
||||
this.usual_with_argtypes();
|
||||
this.routine_with_argtypes();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@ -30879,7 +30879,7 @@ export class PostgreSQLParser extends Parser {
|
||||
break;
|
||||
}
|
||||
this.state = 6479;
|
||||
this.usual_with_argtypes_list();
|
||||
this.routine_with_argtypes_list();
|
||||
this.state = 6481;
|
||||
this._errHandler.sync(this);
|
||||
switch ( this.interpreter.adaptivePredict(this._input, 606, this._ctx) ) {
|
||||
@ -32363,7 +32363,7 @@ export class PostgreSQLParser extends Parser {
|
||||
this.state = 6853;
|
||||
this.match(PostgreSQLParser.KW_ROUTINE);
|
||||
this.state = 6854;
|
||||
this.function_with_argtypes();
|
||||
this.routine_with_argtypes();
|
||||
this.state = 6855;
|
||||
this.match(PostgreSQLParser.KW_RENAME);
|
||||
this.state = 6856;
|
||||
@ -33213,7 +33213,7 @@ export class PostgreSQLParser extends Parser {
|
||||
this.state = 7150;
|
||||
this.match(PostgreSQLParser.KW_ROUTINE);
|
||||
this.state = 7151;
|
||||
this.function_with_argtypes();
|
||||
this.routine_with_argtypes();
|
||||
this.state = 7153;
|
||||
this._errHandler.sync(this);
|
||||
_la = this._input.LA(1);
|
||||
@ -33579,7 +33579,7 @@ export class PostgreSQLParser extends Parser {
|
||||
this.state = 7277;
|
||||
this.match(PostgreSQLParser.KW_ROUTINE);
|
||||
this.state = 7278;
|
||||
this.function_with_argtypes();
|
||||
this.routine_with_argtypes();
|
||||
this.state = 7279;
|
||||
this.match(PostgreSQLParser.KW_SET);
|
||||
this.state = 7280;
|
||||
@ -34355,7 +34355,7 @@ export class PostgreSQLParser extends Parser {
|
||||
this.state = 7523;
|
||||
this.match(PostgreSQLParser.KW_ROUTINE);
|
||||
this.state = 7524;
|
||||
this.function_with_argtypes();
|
||||
this.routine_with_argtypes();
|
||||
this.state = 7525;
|
||||
this.match(PostgreSQLParser.KW_OWNER);
|
||||
this.state = 7526;
|
||||
@ -74025,7 +74025,7 @@ export class PostgreSQLParser extends Parser {
|
||||
"\x02\u0F4A\u0F4B\x07\u012A\x02\x02\u0F4B\u0F4C\x05\u0296\u014C\x02\u0F4C" +
|
||||
"\u0F66\x03\x02\x02\x02\u0F4D\u0F4E\x07\x8C\x02\x02\u0F4E\u0F4F\x07\xCE" +
|
||||
"\x02\x02\u0F4F\u0F50\x05\u0582\u02C2\x02\u0F50\u0F51\x05.\x18\x02\u0F51" +
|
||||
"\u0F52\x07\u01BC\x02\x02\u0F52\u0F53\x05\u029A\u014E\x02\u0F53\u0F66\x03" +
|
||||
"\u0F52\x07\u01BC\x02\x02\u0F52\u0F53\x05\u0292\u014A\x02\u0F53\u0F66\x03" +
|
||||
"\x02\x02\x02\u0F54\u0F55\x07\x8C\x02\x02\u0F55\u0F56\x07\xCE\x02\x02\u0F56" +
|
||||
"\u0F57\x05\u0582\u02C2\x02\u0F57\u0F58\x05.\x18\x02\u0F58\u0F59\x07\u01BD" +
|
||||
"\x02\x02\u0F59\u0F5A\x07@\x02\x02\u0F5A\u0F5B\x05\u047E\u0240\x02\u0F5B" +
|
||||
@ -74777,7 +74777,7 @@ export class PostgreSQLParser extends Parser {
|
||||
"\x07R\x02\x02\u1564\u1565\x07\u012A\x02\x02\u1565\u1566\x05\u0296\u014C" +
|
||||
"\x02\u1566\u1567\x07v\x02\x02\u1567\u1568\x05\u0232\u011A\x02\u1568\u15A2" +
|
||||
"\x03\x02\x02\x02\u1569\u156A\x07\xA1\x02\x02\u156A\u156B\x07R\x02\x02" +
|
||||
"\u156B\u156C\x07\u01BC\x02\x02\u156C\u156D\x05\u029A\u014E\x02\u156D\u156E" +
|
||||
"\u156B\u156C\x07\u01BC\x02\x02\u156C\u156D\x05\u0292\u014A\x02\u156D\u156E" +
|
||||
"\x07v\x02\x02\u156E\u156F\x05\u0232\u011A\x02\u156F\u15A2\x03\x02\x02" +
|
||||
"\x02\u1570\u1571\x07\xA1\x02\x02\u1571\u1572\x07R\x02\x02\u1572\u1573" +
|
||||
"\x07\u01BD\x02\x02\u1573\u1574\x07@\x02\x02\u1574\u1575\x05\u047E\u0240" +
|
||||
@ -74854,7 +74854,7 @@ export class PostgreSQLParser extends Parser {
|
||||
"\x03\x02\x02\x02\u1609\u160A\x07\u0149\x02\x02\u160A\u160C\x07\xF8\x02" +
|
||||
"\x02\u160B\u160D\x05\u0236\u011C\x02\u160C\u160B\x03\x02\x02\x02\u160C" +
|
||||
"\u160D\x03\x02\x02\x02\u160D\u160E\x03\x02\x02\x02\u160E\u160F\x07R\x02" +
|
||||
"\x02\u160F\u1610\x07\u01BC\x02\x02\u1610\u1611\x05\u029A\u014E\x02\u1611" +
|
||||
"\x02\u160F\u1610\x07\u01BC\x02\x02\u1610\u1611\x05\u0292\u014A\x02\u1611" +
|
||||
"\u1612\x07v\x02\x02\u1612\u1613\x05\u0238\u011D\x02\u1613\u1615\x03\x02" +
|
||||
"\x02\x02\u1614\u15A7\x03\x02\x02\x02\u1614\u15B1\x03\x02\x02\x02\u1614" +
|
||||
"\u15BC\x03\x02\x02\x02\u1614\u15C6\x03\x02\x02\x02\u1614\u15D1\x03\x02" +
|
||||
@ -75127,7 +75127,7 @@ export class PostgreSQLParser extends Parser {
|
||||
"\b\x02\x02\u1831\u1833\x05\u0292\u014A\x02\u1832\u1830\x03\x02\x02\x02" +
|
||||
"\u1833\u1836\x03\x02\x02\x02\u1834\u1832\x03\x02\x02\x02\u1834\u1835\x03" +
|
||||
"\x02\x02\x02\u1835\u0291\x03\x02\x02\x02\u1836\u1834\x03\x02\x02\x02\u1837" +
|
||||
"\u1838\x05\u058C\u02C7\x02\u1838\u1839\x05\u028C\u0147\x02\u1839\u1840" +
|
||||
"\u1838\x05\u057C\u02BF\x02\u1838\u1839\x05\u028C\u0147\x02\u1839\u1840" +
|
||||
"\x03\x02\x02\x02\u183A\u1840\x05\u05C0\u02E1\x02\u183B\u183D\x05\u05A8" +
|
||||
"\u02D5\x02\u183C\u183E\x05\u054E\u02A8\x02\u183D\u183C\x03\x02\x02\x02" +
|
||||
"\u183D\u183E\x03\x02\x02\x02\u183E\u1840\x03\x02\x02\x02\u183F\u1837\x03" +
|
||||
@ -75435,7 +75435,7 @@ export class PostgreSQLParser extends Parser {
|
||||
"\x02\u1AC1\u1AC2\x05\u0582\u02C2\x02\u1AC2\u1AC3\x07\u0137\x02\x02\u1AC3" +
|
||||
"\u1AC4\x07`\x02\x02\u1AC4\u1AC5\x05\u0582\u02C2\x02\u1AC5\u1BD3\x03\x02" +
|
||||
"\x02\x02\u1AC6\u1AC7\x07\x8C\x02\x02\u1AC7\u1AC8\x07\u01BC\x02\x02\u1AC8" +
|
||||
"\u1AC9\x05\u029A\u014E\x02\u1AC9\u1ACA\x07\u0137\x02\x02\u1ACA\u1ACB\x07" +
|
||||
"\u1AC9\x05\u0292\u014A\x02\u1AC9\u1ACA\x07\u0137\x02\x02\u1ACA\u1ACB\x07" +
|
||||
"`\x02\x02\u1ACB\u1ACC\x05\u0582\u02C2\x02\u1ACC\u1BD3\x03\x02\x02\x02" +
|
||||
"\u1ACD\u1ACE\x07\x8C\x02\x02\u1ACE\u1ACF\x07\u0145\x02\x02\u1ACF\u1AD0" +
|
||||
"\x05\u0578\u02BD\x02\u1AD0\u1AD1\x07\u0137\x02\x02\u1AD1\u1AD2\x07`\x02" +
|
||||
@ -75579,7 +75579,7 @@ export class PostgreSQLParser extends Parser {
|
||||
"\u1BE8\u1BE9\x03\x02\x02\x02\u1BE9\u1BEA\x03\x02\x02\x02\u1BEA\u1BEB\x07" +
|
||||
"\u01D0\x02\x02\u1BEB\u1BEC\x07R\x02\x02\u1BEC\u1BED\x07\xCE\x02\x02\u1BED" +
|
||||
"\u1BEE\x05\u0582\u02C2\x02\u1BEE\u1C1F\x03\x02\x02\x02\u1BEF\u1BF0\x07" +
|
||||
"\x8C\x02\x02\u1BF0\u1BF1\x07\u01BC\x02\x02\u1BF1\u1BF3\x05\u029A\u014E" +
|
||||
"\x8C\x02\x02\u1BF0\u1BF1\x07\u01BC\x02\x02\u1BF1\u1BF3\x05\u0292\u014A" +
|
||||
"\x02\u1BF2\u1BF4\x05\u02FE\u0180\x02\u1BF3\u1BF2\x03\x02\x02\x02\u1BF3" +
|
||||
"\u1BF4\x03\x02\x02\x02\u1BF4\u1BF5\x03\x02\x02\x02\u1BF5\u1BF6\x07\u01D0" +
|
||||
"\x02\x02\u1BF6\u1BF7\x07R\x02\x02\u1BF7\u1BF8\x07\xCE\x02\x02\u1BF8\u1BF9" +
|
||||
@ -75635,7 +75635,7 @@ export class PostgreSQLParser extends Parser {
|
||||
"\u1C69\u1C6A\x05\u0296\u014C\x02\u1C6A\u1C6B\x07\u014F\x02\x02\u1C6B\u1C6C" +
|
||||
"\x07\u0145\x02\x02\u1C6C\u1C6D\x052\x1A\x02\u1C6D\u1CDC\x03\x02\x02\x02" +
|
||||
"\u1C6E\u1C6F\x07\x8C\x02\x02\u1C6F\u1C70\x07\u01BC\x02\x02\u1C70\u1C71" +
|
||||
"\x05\u029A\u014E\x02\u1C71\u1C72\x07\u014F\x02\x02\u1C72\u1C73\x07\u0145" +
|
||||
"\x05\u0292\u014A\x02\u1C71\u1C72\x07\u014F\x02\x02\u1C72\u1C73\x07\u0145" +
|
||||
"\x02\x02\u1C73\u1C74\x052\x1A\x02\u1C74\u1CDC\x03\x02\x02\x02\u1C75\u1C76" +
|
||||
"\x07\x8C\x02\x02\u1C76\u1C78\x07^\x02\x02\u1C77\u1C79\x05\u02E4\u0173" +
|
||||
"\x02\u1C78\u1C77\x03\x02\x02\x02\u1C78\u1C79\x03\x02\x02\x02\u1C79\u1C7A" +
|
||||
@ -75748,7 +75748,7 @@ export class PostgreSQLParser extends Parser {
|
||||
"\x02\x02\u1D5F\u1D60\x05\u0296\u014C\x02\u1D60\u1D61\x07\u011C\x02\x02" +
|
||||
"\u1D61\u1D62\x07`\x02\x02\u1D62\u1D63\x05\u05A4\u02D3\x02\u1D63\u1DC0" +
|
||||
"\x03\x02\x02\x02\u1D64\u1D65\x07\x8C\x02\x02\u1D65\u1D66\x07\u01BC\x02" +
|
||||
"\x02\u1D66\u1D67\x05\u029A\u014E\x02\u1D67\u1D68\x07\u011C\x02\x02\u1D68" +
|
||||
"\x02\u1D66\u1D67\x05\u0292\u014A\x02\u1D67\u1D68\x07\u011C\x02\x02\u1D68" +
|
||||
"\u1D69\x07`\x02\x02\u1D69\u1D6A\x05\u05A4\u02D3\x02\u1D6A\u1DC0\x03\x02" +
|
||||
"\x02\x02\u1D6B\u1D6C\x07\x8C\x02\x02\u1D6C\u1D6D\x07\u0145\x02\x02\u1D6D" +
|
||||
"\u1D6E\x05\u0578\u02BD\x02\u1D6E\u1D6F\x07\u011C\x02\x02\u1D6F\u1D70\x07" +
|
||||
@ -85521,6 +85521,9 @@ export class AlterextensioncontentsstmtContext extends ParserRuleContext {
|
||||
return this.tryGetRuleContext(0, Procedure_with_argtypesContext);
|
||||
}
|
||||
public KW_ROUTINE(): TerminalNode | undefined { return this.tryGetToken(PostgreSQLParser.KW_ROUTINE, 0); }
|
||||
public routine_with_argtypes(): Routine_with_argtypesContext | undefined {
|
||||
return this.tryGetRuleContext(0, Routine_with_argtypesContext);
|
||||
}
|
||||
public KW_TRANSFORM(): TerminalNode | undefined { return this.tryGetToken(PostgreSQLParser.KW_TRANSFORM, 0); }
|
||||
public KW_FOR(): TerminalNode | undefined { return this.tryGetToken(PostgreSQLParser.KW_FOR, 0); }
|
||||
public KW_LANGUAGE(): TerminalNode | undefined { return this.tryGetToken(PostgreSQLParser.KW_LANGUAGE, 0); }
|
||||
@ -89897,6 +89900,9 @@ export class CommentstmtContext extends ParserRuleContext {
|
||||
return this.tryGetRuleContext(0, Procedure_with_argtypesContext);
|
||||
}
|
||||
public KW_ROUTINE(): TerminalNode | undefined { return this.tryGetToken(PostgreSQLParser.KW_ROUTINE, 0); }
|
||||
public routine_with_argtypes(): Routine_with_argtypesContext | undefined {
|
||||
return this.tryGetRuleContext(0, Routine_with_argtypesContext);
|
||||
}
|
||||
public KW_TRANSFORM(): TerminalNode | undefined { return this.tryGetToken(PostgreSQLParser.KW_TRANSFORM, 0); }
|
||||
public KW_FOR(): TerminalNode | undefined { return this.tryGetToken(PostgreSQLParser.KW_FOR, 0); }
|
||||
public KW_LANGUAGE(): TerminalNode | undefined { return this.tryGetToken(PostgreSQLParser.KW_LANGUAGE, 0); }
|
||||
@ -90017,6 +90023,9 @@ export class SeclabelstmtContext extends ParserRuleContext {
|
||||
return this.tryGetRuleContext(0, Procedure_with_argtypesContext);
|
||||
}
|
||||
public KW_ROUTINE(): TerminalNode | undefined { return this.tryGetToken(PostgreSQLParser.KW_ROUTINE, 0); }
|
||||
public routine_with_argtypes(): Routine_with_argtypesContext | undefined {
|
||||
return this.tryGetRuleContext(0, Routine_with_argtypesContext);
|
||||
}
|
||||
constructor(parent: ParserRuleContext | undefined, invokingState: number) {
|
||||
super(parent, invokingState);
|
||||
}
|
||||
@ -90590,8 +90599,8 @@ export class Privilege_targetContext extends ParserRuleContext {
|
||||
return this.tryGetRuleContext(0, Procedure_with_argtypes_listContext);
|
||||
}
|
||||
public KW_ROUTINE(): TerminalNode | undefined { return this.tryGetToken(PostgreSQLParser.KW_ROUTINE, 0); }
|
||||
public usual_with_argtypes_list(): Usual_with_argtypes_listContext | undefined {
|
||||
return this.tryGetRuleContext(0, Usual_with_argtypes_listContext);
|
||||
public routine_with_argtypes_list(): Routine_with_argtypes_listContext | undefined {
|
||||
return this.tryGetRuleContext(0, Routine_with_argtypes_listContext);
|
||||
}
|
||||
public KW_DATABASE(): TerminalNode | undefined { return this.tryGetToken(PostgreSQLParser.KW_DATABASE, 0); }
|
||||
public database_nameList(): Database_nameListContext | undefined {
|
||||
@ -91881,14 +91890,14 @@ export class Func_args_listContext extends ParserRuleContext {
|
||||
}
|
||||
|
||||
|
||||
export class Usual_with_argtypes_listContext extends ParserRuleContext {
|
||||
public usual_with_argtypes(): Usual_with_argtypesContext[];
|
||||
public usual_with_argtypes(i: number): Usual_with_argtypesContext;
|
||||
public usual_with_argtypes(i?: number): Usual_with_argtypesContext | Usual_with_argtypesContext[] {
|
||||
export class Routine_with_argtypes_listContext extends ParserRuleContext {
|
||||
public routine_with_argtypes(): Routine_with_argtypesContext[];
|
||||
public routine_with_argtypes(i: number): Routine_with_argtypesContext;
|
||||
public routine_with_argtypes(i?: number): Routine_with_argtypesContext | Routine_with_argtypesContext[] {
|
||||
if (i === undefined) {
|
||||
return this.getRuleContexts(Usual_with_argtypesContext);
|
||||
return this.getRuleContexts(Routine_with_argtypesContext);
|
||||
} else {
|
||||
return this.getRuleContext(i, Usual_with_argtypesContext);
|
||||
return this.getRuleContext(i, Routine_with_argtypesContext);
|
||||
}
|
||||
}
|
||||
public COMMA(): TerminalNode[];
|
||||
@ -91904,23 +91913,23 @@ export class Usual_with_argtypes_listContext extends ParserRuleContext {
|
||||
super(parent, invokingState);
|
||||
}
|
||||
// @Override
|
||||
public get ruleIndex(): number { return PostgreSQLParser.RULE_usual_with_argtypes_list; }
|
||||
public get ruleIndex(): number { return PostgreSQLParser.RULE_routine_with_argtypes_list; }
|
||||
// @Override
|
||||
public enterRule(listener: PostgreSQLParserListener): void {
|
||||
if (listener.enterUsual_with_argtypes_list) {
|
||||
listener.enterUsual_with_argtypes_list(this);
|
||||
if (listener.enterRoutine_with_argtypes_list) {
|
||||
listener.enterRoutine_with_argtypes_list(this);
|
||||
}
|
||||
}
|
||||
// @Override
|
||||
public exitRule(listener: PostgreSQLParserListener): void {
|
||||
if (listener.exitUsual_with_argtypes_list) {
|
||||
listener.exitUsual_with_argtypes_list(this);
|
||||
if (listener.exitRoutine_with_argtypes_list) {
|
||||
listener.exitRoutine_with_argtypes_list(this);
|
||||
}
|
||||
}
|
||||
// @Override
|
||||
public accept<Result>(visitor: PostgreSQLParserVisitor<Result>): Result {
|
||||
if (visitor.visitUsual_with_argtypes_list) {
|
||||
return visitor.visitUsual_with_argtypes_list(this);
|
||||
if (visitor.visitRoutine_with_argtypes_list) {
|
||||
return visitor.visitRoutine_with_argtypes_list(this);
|
||||
} else {
|
||||
return visitor.visitChildren(this);
|
||||
}
|
||||
@ -91928,9 +91937,9 @@ export class Usual_with_argtypes_listContext extends ParserRuleContext {
|
||||
}
|
||||
|
||||
|
||||
export class Usual_with_argtypesContext extends ParserRuleContext {
|
||||
public usual_name(): Usual_nameContext | undefined {
|
||||
return this.tryGetRuleContext(0, Usual_nameContext);
|
||||
export class Routine_with_argtypesContext extends ParserRuleContext {
|
||||
public routine_name(): Routine_nameContext | undefined {
|
||||
return this.tryGetRuleContext(0, Routine_nameContext);
|
||||
}
|
||||
public func_args(): Func_argsContext | undefined {
|
||||
return this.tryGetRuleContext(0, Func_argsContext);
|
||||
@ -91948,23 +91957,23 @@ export class Usual_with_argtypesContext extends ParserRuleContext {
|
||||
super(parent, invokingState);
|
||||
}
|
||||
// @Override
|
||||
public get ruleIndex(): number { return PostgreSQLParser.RULE_usual_with_argtypes; }
|
||||
public get ruleIndex(): number { return PostgreSQLParser.RULE_routine_with_argtypes; }
|
||||
// @Override
|
||||
public enterRule(listener: PostgreSQLParserListener): void {
|
||||
if (listener.enterUsual_with_argtypes) {
|
||||
listener.enterUsual_with_argtypes(this);
|
||||
if (listener.enterRoutine_with_argtypes) {
|
||||
listener.enterRoutine_with_argtypes(this);
|
||||
}
|
||||
}
|
||||
// @Override
|
||||
public exitRule(listener: PostgreSQLParserListener): void {
|
||||
if (listener.exitUsual_with_argtypes) {
|
||||
listener.exitUsual_with_argtypes(this);
|
||||
if (listener.exitRoutine_with_argtypes) {
|
||||
listener.exitRoutine_with_argtypes(this);
|
||||
}
|
||||
}
|
||||
// @Override
|
||||
public accept<Result>(visitor: PostgreSQLParserVisitor<Result>): Result {
|
||||
if (visitor.visitUsual_with_argtypes) {
|
||||
return visitor.visitUsual_with_argtypes(this);
|
||||
if (visitor.visitRoutine_with_argtypes) {
|
||||
return visitor.visitRoutine_with_argtypes(this);
|
||||
} else {
|
||||
return visitor.visitChildren(this);
|
||||
}
|
||||
@ -93056,8 +93065,8 @@ export class AlterFunctionTypeClauseContext extends ParserRuleContext {
|
||||
return this.tryGetRuleContext(0, Procedure_with_argtypesContext);
|
||||
}
|
||||
public KW_ROUTINE(): TerminalNode | undefined { return this.tryGetToken(PostgreSQLParser.KW_ROUTINE, 0); }
|
||||
public usual_with_argtypes(): Usual_with_argtypesContext | undefined {
|
||||
return this.tryGetRuleContext(0, Usual_with_argtypesContext);
|
||||
public routine_with_argtypes(): Routine_with_argtypesContext | undefined {
|
||||
return this.tryGetRuleContext(0, Routine_with_argtypesContext);
|
||||
}
|
||||
constructor(parent: ParserRuleContext | undefined, invokingState: number) {
|
||||
super(parent, invokingState);
|
||||
@ -93172,8 +93181,8 @@ export class RemovefuncstmtContext extends ParserRuleContext {
|
||||
return this.tryGetRuleContext(0, Procedure_with_argtypes_listContext);
|
||||
}
|
||||
public KW_ROUTINE(): TerminalNode | undefined { return this.tryGetToken(PostgreSQLParser.KW_ROUTINE, 0); }
|
||||
public usual_with_argtypes_list(): Usual_with_argtypes_listContext | undefined {
|
||||
return this.tryGetRuleContext(0, Usual_with_argtypes_listContext);
|
||||
public routine_with_argtypes_list(): Routine_with_argtypes_listContext | undefined {
|
||||
return this.tryGetRuleContext(0, Routine_with_argtypes_listContext);
|
||||
}
|
||||
constructor(parent: ParserRuleContext | undefined, invokingState: number) {
|
||||
super(parent, invokingState);
|
||||
@ -94112,6 +94121,9 @@ export class RenamestmtContext extends ParserRuleContext {
|
||||
}
|
||||
public KW_PUBLICATION(): TerminalNode | undefined { return this.tryGetToken(PostgreSQLParser.KW_PUBLICATION, 0); }
|
||||
public KW_ROUTINE(): TerminalNode | undefined { return this.tryGetToken(PostgreSQLParser.KW_ROUTINE, 0); }
|
||||
public routine_with_argtypes(): Routine_with_argtypesContext | undefined {
|
||||
return this.tryGetRuleContext(0, Routine_with_argtypesContext);
|
||||
}
|
||||
public KW_SCHEMA(): TerminalNode | undefined { return this.tryGetToken(PostgreSQLParser.KW_SCHEMA, 0); }
|
||||
public schema_name(): Schema_nameContext | undefined {
|
||||
return this.tryGetRuleContext(0, Schema_nameContext);
|
||||
@ -94288,6 +94300,9 @@ export class AlterobjectdependsstmtContext extends ParserRuleContext {
|
||||
return this.tryGetRuleContext(0, Procedure_with_argtypesContext);
|
||||
}
|
||||
public KW_ROUTINE(): TerminalNode | undefined { return this.tryGetToken(PostgreSQLParser.KW_ROUTINE, 0); }
|
||||
public routine_with_argtypes(): Routine_with_argtypesContext | undefined {
|
||||
return this.tryGetRuleContext(0, Routine_with_argtypesContext);
|
||||
}
|
||||
public KW_TRIGGER(): TerminalNode | undefined { return this.tryGetToken(PostgreSQLParser.KW_TRIGGER, 0); }
|
||||
public qualified_name(): Qualified_nameContext | undefined {
|
||||
return this.tryGetRuleContext(0, Qualified_nameContext);
|
||||
@ -94393,6 +94408,9 @@ export class AlterobjectschemastmtContext extends ParserRuleContext {
|
||||
return this.tryGetRuleContext(0, Procedure_with_argtypesContext);
|
||||
}
|
||||
public KW_ROUTINE(): TerminalNode | undefined { return this.tryGetToken(PostgreSQLParser.KW_ROUTINE, 0); }
|
||||
public routine_with_argtypes(): Routine_with_argtypesContext | undefined {
|
||||
return this.tryGetRuleContext(0, Routine_with_argtypesContext);
|
||||
}
|
||||
public KW_TABLE(): TerminalNode | undefined { return this.tryGetToken(PostgreSQLParser.KW_TABLE, 0); }
|
||||
public relation_expr(): Relation_exprContext | undefined {
|
||||
return this.tryGetRuleContext(0, Relation_exprContext);
|
||||
@ -94703,6 +94721,9 @@ export class AlterownerstmtContext extends ParserRuleContext {
|
||||
return this.tryGetRuleContext(0, Procedure_with_argtypesContext);
|
||||
}
|
||||
public KW_ROUTINE(): TerminalNode | undefined { return this.tryGetToken(PostgreSQLParser.KW_ROUTINE, 0); }
|
||||
public routine_with_argtypes(): Routine_with_argtypesContext | undefined {
|
||||
return this.tryGetRuleContext(0, Routine_with_argtypesContext);
|
||||
}
|
||||
public KW_SCHEMA(): TerminalNode | undefined { return this.tryGetToken(PostgreSQLParser.KW_SCHEMA, 0); }
|
||||
public schema_name(): Schema_nameContext | undefined {
|
||||
return this.tryGetRuleContext(0, Schema_nameContext);
|
||||
|
@ -340,8 +340,8 @@ import { AttrilistContext } from "./PostgreSQLParser";
|
||||
import { Opt_or_replaceContext } from "./PostgreSQLParser";
|
||||
import { Func_argsContext } from "./PostgreSQLParser";
|
||||
import { Func_args_listContext } from "./PostgreSQLParser";
|
||||
import { Usual_with_argtypes_listContext } from "./PostgreSQLParser";
|
||||
import { Usual_with_argtypesContext } from "./PostgreSQLParser";
|
||||
import { Routine_with_argtypes_listContext } from "./PostgreSQLParser";
|
||||
import { Routine_with_argtypesContext } from "./PostgreSQLParser";
|
||||
import { Procedure_with_argtypes_listContext } from "./PostgreSQLParser";
|
||||
import { Procedure_with_argtypesContext } from "./PostgreSQLParser";
|
||||
import { Function_with_argtypes_listContext } from "./PostgreSQLParser";
|
||||
@ -4607,26 +4607,26 @@ export interface PostgreSQLParserListener extends ParseTreeListener {
|
||||
exitFunc_args_list?: (ctx: Func_args_listContext) => void;
|
||||
|
||||
/**
|
||||
* Enter a parse tree produced by `PostgreSQLParser.usual_with_argtypes_list`.
|
||||
* Enter a parse tree produced by `PostgreSQLParser.routine_with_argtypes_list`.
|
||||
* @param ctx the parse tree
|
||||
*/
|
||||
enterUsual_with_argtypes_list?: (ctx: Usual_with_argtypes_listContext) => void;
|
||||
enterRoutine_with_argtypes_list?: (ctx: Routine_with_argtypes_listContext) => void;
|
||||
/**
|
||||
* Exit a parse tree produced by `PostgreSQLParser.usual_with_argtypes_list`.
|
||||
* Exit a parse tree produced by `PostgreSQLParser.routine_with_argtypes_list`.
|
||||
* @param ctx the parse tree
|
||||
*/
|
||||
exitUsual_with_argtypes_list?: (ctx: Usual_with_argtypes_listContext) => void;
|
||||
exitRoutine_with_argtypes_list?: (ctx: Routine_with_argtypes_listContext) => void;
|
||||
|
||||
/**
|
||||
* Enter a parse tree produced by `PostgreSQLParser.usual_with_argtypes`.
|
||||
* Enter a parse tree produced by `PostgreSQLParser.routine_with_argtypes`.
|
||||
* @param ctx the parse tree
|
||||
*/
|
||||
enterUsual_with_argtypes?: (ctx: Usual_with_argtypesContext) => void;
|
||||
enterRoutine_with_argtypes?: (ctx: Routine_with_argtypesContext) => void;
|
||||
/**
|
||||
* Exit a parse tree produced by `PostgreSQLParser.usual_with_argtypes`.
|
||||
* Exit a parse tree produced by `PostgreSQLParser.routine_with_argtypes`.
|
||||
* @param ctx the parse tree
|
||||
*/
|
||||
exitUsual_with_argtypes?: (ctx: Usual_with_argtypesContext) => void;
|
||||
exitRoutine_with_argtypes?: (ctx: Routine_with_argtypesContext) => void;
|
||||
|
||||
/**
|
||||
* Enter a parse tree produced by `PostgreSQLParser.procedure_with_argtypes_list`.
|
||||
|
@ -340,8 +340,8 @@ import { AttrilistContext } from "./PostgreSQLParser";
|
||||
import { Opt_or_replaceContext } from "./PostgreSQLParser";
|
||||
import { Func_argsContext } from "./PostgreSQLParser";
|
||||
import { Func_args_listContext } from "./PostgreSQLParser";
|
||||
import { Usual_with_argtypes_listContext } from "./PostgreSQLParser";
|
||||
import { Usual_with_argtypesContext } from "./PostgreSQLParser";
|
||||
import { Routine_with_argtypes_listContext } from "./PostgreSQLParser";
|
||||
import { Routine_with_argtypesContext } from "./PostgreSQLParser";
|
||||
import { Procedure_with_argtypes_listContext } from "./PostgreSQLParser";
|
||||
import { Procedure_with_argtypesContext } from "./PostgreSQLParser";
|
||||
import { Function_with_argtypes_listContext } from "./PostgreSQLParser";
|
||||
@ -3252,18 +3252,18 @@ export interface PostgreSQLParserVisitor<Result> extends ParseTreeVisitor<Result
|
||||
visitFunc_args_list?: (ctx: Func_args_listContext) => Result;
|
||||
|
||||
/**
|
||||
* Visit a parse tree produced by `PostgreSQLParser.usual_with_argtypes_list`.
|
||||
* Visit a parse tree produced by `PostgreSQLParser.routine_with_argtypes_list`.
|
||||
* @param ctx the parse tree
|
||||
* @return the visitor result
|
||||
*/
|
||||
visitUsual_with_argtypes_list?: (ctx: Usual_with_argtypes_listContext) => Result;
|
||||
visitRoutine_with_argtypes_list?: (ctx: Routine_with_argtypes_listContext) => Result;
|
||||
|
||||
/**
|
||||
* Visit a parse tree produced by `PostgreSQLParser.usual_with_argtypes`.
|
||||
* Visit a parse tree produced by `PostgreSQLParser.routine_with_argtypes`.
|
||||
* @param ctx the parse tree
|
||||
* @return the visitor result
|
||||
*/
|
||||
visitUsual_with_argtypes?: (ctx: Usual_with_argtypesContext) => Result;
|
||||
visitRoutine_with_argtypes?: (ctx: Routine_with_argtypesContext) => Result;
|
||||
|
||||
/**
|
||||
* Visit a parse tree produced by `PostgreSQLParser.procedure_with_argtypes_list`.
|
||||
|
Loading…
Reference in New Issue
Block a user