From 5eaabb5c306b06df2c3b0d18f075adb96074001f Mon Sep 17 00:00:00 2001
From: Michael Paquier
Date: Fri, 30 Sep 2022 10:48:22 +0900
Subject: [PATCH 1/2] Remove from SQLValueFunctionOp all name-based functions
This includes six functions, moved to be COERCE_SQL_SYNTAX:
- current_role
- role
- current_catalog
- current_schema
- current_database
- current_user
"user" and "current_role" need specific functions to allow ruleutils.c
to map to the expected SQL grammar these require. SQLValueFunctionOp is
reduced to half its contents.
---
src/include/catalog/pg_proc.dat | 6 ++++
src/include/nodes/primnodes.h | 8 +----
src/backend/executor/execExprInterp.c | 27 -----------------
src/backend/nodes/nodeFuncs.c | 4 +--
src/backend/parser/gram.y | 30 +++++++++++++++----
src/backend/parser/parse_expr.c | 8 -----
src/backend/parser/parse_target.c | 18 ------------
src/backend/utils/adt/ruleutils.c | 36 +++++++++++------------
src/test/regress/expected/create_view.out | 12 ++++++++
src/test/regress/sql/create_view.sql | 6 ++++
10 files changed, 68 insertions(+), 87 deletions(-)
diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat
index 68bb032d3e..414d752f9d 100644
--- a/src/include/catalog/pg_proc.dat
+++ b/src/include/catalog/pg_proc.dat
@@ -1505,6 +1505,12 @@
{ oid => '745', descr => 'current user name',
proname => 'current_user', provolatile => 's', prorettype => 'name',
proargtypes => '', prosrc => 'current_user' },
+{ oid => '9695', descr => 'current role name',
+ proname => 'current_role', provolatile => 's', prorettype => 'name',
+ proargtypes => '', prosrc => 'current_user' },
+{ oid => '9696', descr => 'user name',
+ proname => 'user', provolatile => 's', prorettype => 'name',
+ proargtypes => '', prosrc => 'current_user' },
{ oid => '746', descr => 'session user name',
proname => 'session_user', provolatile => 's', prorettype => 'name',
proargtypes => '', prosrc => 'session_user' },
diff --git a/src/include/nodes/primnodes.h b/src/include/nodes/primnodes.h
index 40661334bb..e818231e15 100644
--- a/src/include/nodes/primnodes.h
+++ b/src/include/nodes/primnodes.h
@@ -1313,13 +1313,7 @@ typedef enum SQLValueFunctionOp
SVFOP_LOCALTIME,
SVFOP_LOCALTIME_N,
SVFOP_LOCALTIMESTAMP,
- SVFOP_LOCALTIMESTAMP_N,
- SVFOP_CURRENT_ROLE,
- SVFOP_CURRENT_USER,
- SVFOP_USER,
- SVFOP_SESSION_USER,
- SVFOP_CURRENT_CATALOG,
- SVFOP_CURRENT_SCHEMA
+ SVFOP_LOCALTIMESTAMP_N
} SQLValueFunctionOp;
typedef struct SQLValueFunction
diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c
index 9b9bbf00a9..6ebf5c287e 100644
--- a/src/backend/executor/execExprInterp.c
+++ b/src/backend/executor/execExprInterp.c
@@ -2495,15 +2495,10 @@ ExecEvalParamExtern(ExprState *state, ExprEvalStep *op, ExprContext *econtext)
void
ExecEvalSQLValueFunction(ExprState *state, ExprEvalStep *op)
{
- LOCAL_FCINFO(fcinfo, 0);
SQLValueFunction *svf = op->d.sqlvaluefunction.svf;
*op->resnull = false;
- /*
- * Note: current_schema() can return NULL. current_user() etc currently
- * cannot, but might as well code those cases the same way for safety.
- */
switch (svf->op)
{
case SVFOP_CURRENT_DATE:
@@ -2525,28 +2520,6 @@ ExecEvalSQLValueFunction(ExprState *state, ExprEvalStep *op)
case SVFOP_LOCALTIMESTAMP_N:
*op->resvalue = TimestampGetDatum(GetSQLLocalTimestamp(svf->typmod));
break;
- case SVFOP_CURRENT_ROLE:
- case SVFOP_CURRENT_USER:
- case SVFOP_USER:
- InitFunctionCallInfoData(*fcinfo, NULL, 0, InvalidOid, NULL, NULL);
- *op->resvalue = current_user(fcinfo);
- *op->resnull = fcinfo->isnull;
- break;
- case SVFOP_SESSION_USER:
- InitFunctionCallInfoData(*fcinfo, NULL, 0, InvalidOid, NULL, NULL);
- *op->resvalue = session_user(fcinfo);
- *op->resnull = fcinfo->isnull;
- break;
- case SVFOP_CURRENT_CATALOG:
- InitFunctionCallInfoData(*fcinfo, NULL, 0, InvalidOid, NULL, NULL);
- *op->resvalue = current_database(fcinfo);
- *op->resnull = fcinfo->isnull;
- break;
- case SVFOP_CURRENT_SCHEMA:
- InitFunctionCallInfoData(*fcinfo, NULL, 0, InvalidOid, NULL, NULL);
- *op->resvalue = current_schema(fcinfo);
- *op->resnull = fcinfo->isnull;
- break;
}
}
diff --git a/src/backend/nodes/nodeFuncs.c b/src/backend/nodes/nodeFuncs.c
index 0a7b22f97e..4f72fc2268 100644
--- a/src/backend/nodes/nodeFuncs.c
+++ b/src/backend/nodes/nodeFuncs.c
@@ -1144,9 +1144,7 @@ exprSetCollation(Node *expr, Oid collation)
((MinMaxExpr *) expr)->minmaxcollid = collation;
break;
case T_SQLValueFunction:
- Assert((((SQLValueFunction *) expr)->type == NAMEOID) ?
- (collation == C_COLLATION_OID) :
- (collation == InvalidOid));
+ Assert(collation == InvalidOid);
break;
case T_XmlExpr:
Assert((((XmlExpr *) expr)->op == IS_XMLSERIALIZE) ?
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 94d5142a4a..23a49e99ca 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -15229,15 +15229,24 @@ func_expr_common_subexpr:
}
| CURRENT_ROLE
{
- $$ = makeSQLValueFunction(SVFOP_CURRENT_ROLE, -1, @1);
+ $$ = (Node *) makeFuncCall(SystemFuncName("current_role"),
+ NIL,
+ COERCE_SQL_SYNTAX,
+ @1);
}
| CURRENT_USER
{
- $$ = makeSQLValueFunction(SVFOP_CURRENT_USER, -1, @1);
+ $$ = (Node *) makeFuncCall(SystemFuncName("current_user"),
+ NIL,
+ COERCE_SQL_SYNTAX,
+ @1);
}
| SESSION_USER
{
- $$ = makeSQLValueFunction(SVFOP_SESSION_USER, -1, @1);
+ $$ = (Node *) makeFuncCall(SystemFuncName("session_user"),
+ NIL,
+ COERCE_SQL_SYNTAX,
+ @1);
}
| SYSTEM_USER
{
@@ -15248,15 +15257,24 @@ func_expr_common_subexpr:
}
| USER
{
- $$ = makeSQLValueFunction(SVFOP_USER, -1, @1);
+ $$ = (Node *) makeFuncCall(SystemFuncName("user"),
+ NIL,
+ COERCE_SQL_SYNTAX,
+ @1);
}
| CURRENT_CATALOG
{
- $$ = makeSQLValueFunction(SVFOP_CURRENT_CATALOG, -1, @1);
+ $$ = (Node *) makeFuncCall(SystemFuncName("current_database"),
+ NIL,
+ COERCE_SQL_SYNTAX,
+ @1);
}
| CURRENT_SCHEMA
{
- $$ = makeSQLValueFunction(SVFOP_CURRENT_SCHEMA, -1, @1);
+ $$ = (Node *) makeFuncCall(SystemFuncName("current_schema"),
+ NIL,
+ COERCE_SQL_SYNTAX,
+ @1);
}
| CAST '(' a_expr AS Typename ')'
{ $$ = makeTypeCast($3, $5, @1); }
diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c
index 7aaf1c673f..9bde33b407 100644
--- a/src/backend/parser/parse_expr.c
+++ b/src/backend/parser/parse_expr.c
@@ -2231,14 +2231,6 @@ transformSQLValueFunction(ParseState *pstate, SQLValueFunction *svf)
svf->type = TIMESTAMPOID;
svf->typmod = anytimestamp_typmod_check(false, svf->typmod);
break;
- case SVFOP_CURRENT_ROLE:
- case SVFOP_CURRENT_USER:
- case SVFOP_USER:
- case SVFOP_SESSION_USER:
- case SVFOP_CURRENT_CATALOG:
- case SVFOP_CURRENT_SCHEMA:
- svf->type = NAMEOID;
- break;
}
return (Node *) svf;
diff --git a/src/backend/parser/parse_target.c b/src/backend/parser/parse_target.c
index bd8057bc3e..f54591a987 100644
--- a/src/backend/parser/parse_target.c
+++ b/src/backend/parser/parse_target.c
@@ -1895,24 +1895,6 @@ FigureColnameInternal(Node *node, char **name)
case SVFOP_LOCALTIMESTAMP_N:
*name = "localtimestamp";
return 2;
- case SVFOP_CURRENT_ROLE:
- *name = "current_role";
- return 2;
- case SVFOP_CURRENT_USER:
- *name = "current_user";
- return 2;
- case SVFOP_USER:
- *name = "user";
- return 2;
- case SVFOP_SESSION_USER:
- *name = "session_user";
- return 2;
- case SVFOP_CURRENT_CATALOG:
- *name = "current_catalog";
- return 2;
- case SVFOP_CURRENT_SCHEMA:
- *name = "current_schema";
- return 2;
}
break;
case T_XmlExpr:
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index c418403537..9987bca912 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -9198,24 +9198,6 @@ get_rule_expr(Node *node, deparse_context *context,
appendStringInfo(buf, "LOCALTIMESTAMP(%d)",
svf->typmod);
break;
- case SVFOP_CURRENT_ROLE:
- appendStringInfoString(buf, "CURRENT_ROLE");
- break;
- case SVFOP_CURRENT_USER:
- appendStringInfoString(buf, "CURRENT_USER");
- break;
- case SVFOP_USER:
- appendStringInfoString(buf, "USER");
- break;
- case SVFOP_SESSION_USER:
- appendStringInfoString(buf, "SESSION_USER");
- break;
- case SVFOP_CURRENT_CATALOG:
- appendStringInfoString(buf, "CURRENT_CATALOG");
- break;
- case SVFOP_CURRENT_SCHEMA:
- appendStringInfoString(buf, "CURRENT_SCHEMA");
- break;
}
}
break;
@@ -10317,6 +10299,24 @@ get_func_sql_syntax(FuncExpr *expr, deparse_context *context)
appendStringInfoChar(buf, ')');
return true;
+ case F_CURRENT_DATABASE:
+ appendStringInfoString(buf, "CURRENT_CATALOG");
+ return true;
+ case F_CURRENT_ROLE:
+ appendStringInfoString(buf, "CURRENT_ROLE");
+ return true;
+ case F_CURRENT_SCHEMA:
+ appendStringInfoString(buf, "CURRENT_SCHEMA");
+ return true;
+ case F_CURRENT_USER:
+ appendStringInfoString(buf, "CURRENT_USER");
+ return true;
+ case F_USER:
+ appendStringInfoString(buf, "USER");
+ return true;
+ case F_SESSION_USER:
+ appendStringInfoString(buf, "SESSION_USER");
+ return true;
case F_SYSTEM_USER:
appendStringInfoString(buf, "SYSTEM_USER");
return true;
diff --git a/src/test/regress/expected/create_view.out b/src/test/regress/expected/create_view.out
index bf4ff30d86..77123cecbd 100644
--- a/src/test/regress/expected/create_view.out
+++ b/src/test/regress/expected/create_view.out
@@ -1941,6 +1941,12 @@ select
trim(E'\\000'::bytea from E'\\000Tom\\000'::bytea) as btb,
trim(leading E'\\000'::bytea from E'\\000Tom\\000'::bytea) as ltb,
trim(trailing E'\\000'::bytea from E'\\000Tom\\000'::bytea) as rtb,
+ CURRENT_CATALOG as ca,
+ CURRENT_ROLE as cr,
+ CURRENT_SCHEMA as cs,
+ CURRENT_USER as cu,
+ USER as us,
+ SESSION_USER seu,
SYSTEM_USER as su;
select pg_get_viewdef('tt201v', true);
pg_get_viewdef
@@ -1963,6 +1969,12 @@ select pg_get_viewdef('tt201v', true);
TRIM(BOTH '\x00'::bytea FROM '\x00546f6d00'::bytea) AS btb, +
TRIM(LEADING '\x00'::bytea FROM '\x00546f6d00'::bytea) AS ltb, +
TRIM(TRAILING '\x00'::bytea FROM '\x00546f6d00'::bytea) AS rtb, +
+ CURRENT_CATALOG AS ca, +
+ CURRENT_ROLE AS cr, +
+ CURRENT_SCHEMA AS cs, +
+ CURRENT_USER AS cu, +
+ USER AS us, +
+ SESSION_USER AS seu, +
SYSTEM_USER AS su;
(1 row)
diff --git a/src/test/regress/sql/create_view.sql b/src/test/regress/sql/create_view.sql
index 913b4ee460..ccaebdc22b 100644
--- a/src/test/regress/sql/create_view.sql
+++ b/src/test/regress/sql/create_view.sql
@@ -722,6 +722,12 @@ select
trim(E'\\000'::bytea from E'\\000Tom\\000'::bytea) as btb,
trim(leading E'\\000'::bytea from E'\\000Tom\\000'::bytea) as ltb,
trim(trailing E'\\000'::bytea from E'\\000Tom\\000'::bytea) as rtb,
+ CURRENT_CATALOG as ca,
+ CURRENT_ROLE as cr,
+ CURRENT_SCHEMA as cs,
+ CURRENT_USER as cu,
+ USER as us,
+ SESSION_USER seu,
SYSTEM_USER as su;
select pg_get_viewdef('tt201v', true);
--
2.37.2