diff --git a/src/common/backend/catalog/pg_cast_oid.txt b/src/common/backend/catalog/pg_cast_oid.txt index f3d77d766..bc0f316d7 100644 --- a/src/common/backend/catalog/pg_cast_oid.txt +++ b/src/common/backend/catalog/pg_cast_oid.txt @@ -1,4 +1,4 @@ -1042|700|4196|i|f -1042|701|4197|i|f -1043|700|4198|i|f -1043|701|4199|i|f +1042|700|4196|i|f|10 +1042|701|4197|i|f|10 +1043|700|4198|i|f|10 +1043|701|4199|i|f|10 diff --git a/src/common/pl/plpgsql/src/pl_handler.cpp b/src/common/pl/plpgsql/src/pl_handler.cpp index ebb221ac0..3348bd94a 100644 --- a/src/common/pl/plpgsql/src/pl_handler.cpp +++ b/src/common/pl/plpgsql/src/pl_handler.cpp @@ -16,6 +16,7 @@ #include "plpgsql.h" #include "auditfuncs.h" +#include "catalog/pg_cast.h" #include "catalog/pg_proc.h" #include "catalog/pg_type.h" #include "funcapi.h" @@ -172,6 +173,10 @@ Datum plpgsql_call_handler(PG_FUNCTION_ARGS) int rc; Oid func_oid = fcinfo->flinfo->fn_oid; Oid* saved_Pseudo_CurrentUserId = NULL; + Oid old_user = InvalidOid; + int save_sec_context = 0; + Oid cast_owner = InvalidOid; + bool has_switch = false; // PGSTAT_INIT_PLSQL_TIME_RECORD int64 startTime = 0; bool needRecord = false; @@ -185,6 +190,15 @@ Datum plpgsql_call_handler(PG_FUNCTION_ARGS) IsA(fcinfo->context, FunctionScanState) && !castNode(FunctionScanState, fcinfo->context)->atomic; + /* get cast owner and make sure current user is cast owner when execute cast-func */ + GetUserIdAndSecContext(&old_user, &save_sec_context); + cast_owner = u_sess->exec_cxt.cast_owner; + if (InvalidCastOwnerId == cast_owner || !OidIsValid(cast_owner)) { + ereport(LOG, (errmsg("old system table pg_cast does not have castowner column, use old default permission"))); + } else { + SetUserIdAndSecContext(cast_owner, save_sec_context | SECURITY_LOCAL_USERID_CHANGE); + has_switch = true; + } bool outer_is_stream = false; bool outer_is_stream_support = false; int fun_arg = fcinfo->nargs; @@ -323,7 +337,10 @@ Datum plpgsql_call_handler(PG_FUNCTION_ARGS) u_sess->opt_cxt.is_stream = outer_is_stream; u_sess->opt_cxt.is_stream_support = outer_is_stream_support; #endif - + if (has_switch) { + SetUserIdAndSecContext(old_user, save_sec_context); + u_sess->exec_cxt.cast_owner = InvalidOid; + } return retval; } diff --git a/src/gausskernel/optimizer/commands/functioncmds.cpp b/src/gausskernel/optimizer/commands/functioncmds.cpp index 6cb61b29e..8de50c942 100644 --- a/src/gausskernel/optimizer/commands/functioncmds.cpp +++ b/src/gausskernel/optimizer/commands/functioncmds.cpp @@ -1802,6 +1802,7 @@ void CreateCast(CreateCastStmt* stmt) char targettyptype; Oid funcid; Oid castid; + Oid ownerid; int nargs; char castcontext; char castmethod; @@ -2038,6 +2039,14 @@ void CreateCast(CreateCastStmt* stmt) values[Anum_pg_cast_castfunc - 1] = ObjectIdGetDatum(funcid); values[Anum_pg_cast_castcontext - 1] = CharGetDatum(castcontext); values[Anum_pg_cast_castmethod - 1] = CharGetDatum(castmethod); + ownerid = GetUserId(); + ereport(LOG, (errmsg("the owner: %d", ownerid))); + if (OidIsValid(ownerid)) { + values[Anum_pg_cast_castowner - 1] = ObjectIdGetDatum(ownerid); + } else { + ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("invalid current user oid for cast"))); + } ss_rc = memset_s(nulls, sizeof(nulls), false, sizeof(nulls)); securec_check(ss_rc, "", ""); diff --git a/src/gausskernel/process/threadpool/knl_session.cpp b/src/gausskernel/process/threadpool/knl_session.cpp index fa6a298be..88a6ec592 100644 --- a/src/gausskernel/process/threadpool/knl_session.cpp +++ b/src/gausskernel/process/threadpool/knl_session.cpp @@ -127,6 +127,8 @@ void knl_u_executor_init(knl_u_executor_context* exec_cxt) exec_cxt->is_exec_trigger_func = false; exec_cxt->single_shard_stmt = false; + exec_cxt->cast_owner = InvalidOid; + exec_cxt->CurrentRouter = NULL; exec_cxt->is_dn_enable_router = false; } diff --git a/src/gausskernel/runtime/executor/execQual.cpp b/src/gausskernel/runtime/executor/execQual.cpp index 398525264..fcdd26df4 100644 --- a/src/gausskernel/runtime/executor/execQual.cpp +++ b/src/gausskernel/runtime/executor/execQual.cpp @@ -40,6 +40,7 @@ #include "access/nbtree.h" #include "access/tupconvert.h" #include "access/tableam.h" +#include "catalog/pg_cast.h" #include "catalog/pg_type.h" #include "commands/typecmds.h" #include "executor/execdebug.h" @@ -2717,12 +2718,41 @@ static Datum ExecEvalFunc(FuncExprState* fcache, ExprContext* econtext, bool* is { /* This is called only the first time through */ FuncExpr* func = (FuncExpr*)fcache->xprstate.expr; + Oid old_user = InvalidOid; + int save_sec_context = 0; + Oid cast_owner = InvalidOid; + Oid target_type = InvalidOid; + Oid source_type = InvalidOid; /* Initialize function lookup info */ init_fcache(func->funcid, func->inputcollid, fcache, econtext->ecxt_per_query_memory, true); bool has_refcursor = func_has_refcursor_args(func->funcid, &fcache->fcinfo_data); int cursor_return_number = fcache->fcinfo_data.refcursor_data.return_number; + + if (func->funcformat == COERCE_EXPLICIT_CAST || func->funcformat == COERCE_IMPLICIT_CAST) { + target_type = func->funcresulttype; + source_type = fcache->fcinfo_data.argTypes[0]; + + HeapTuple proc_tuple = SearchSysCache(PROCOID, ObjectIdGetDatum(func->funcid), 0, 0, 0); + if (HeapTupleIsValid(proc_tuple)) { + Form_pg_proc proc_struct = (Form_pg_proc)GETSTRUCT(proc_tuple); + source_type = proc_struct->proargtypes.values[0]; + ReleaseSysCache(proc_tuple); + } + + HeapTuple cast_tuple = SearchSysCache2(CASTSOURCETARGET, ObjectIdGetDatum(source_type), + ObjectIdGetDatum(target_type)); + if (HeapTupleIsValid(cast_tuple)) { + Form_pg_cast castForm = (Form_pg_cast)GETSTRUCT(cast_tuple); + cast_owner = castForm->castowner; + ReleaseSysCache(cast_tuple); + } + if (cast_owner != InvalidCastOwnerId && OidIsValid(cast_owner)) { + u_sess->exec_cxt.cast_owner = cast_owner; + } + } + /* * We need to invoke ExecMakeFunctionResult if either the function itself * or any of its input expressions can return a set. Otherwise, invoke diff --git a/src/include/catalog/pg_cast.h b/src/include/catalog/pg_cast.h index 12742ee22..f07d7f906 100644 --- a/src/include/catalog/pg_cast.h +++ b/src/include/catalog/pg_cast.h @@ -22,6 +22,7 @@ #define PG_CAST_H #include "catalog/genbki.h" +#include "catalog/pg_authid.h" /* ---------------- * pg_cast definition. cpp turns this into @@ -30,6 +31,7 @@ */ #define CastRelationId 2605 #define CastRelation_Rowtype_Id 11331 +#define InvalidCastOwnerId ((Oid)(-1)) /* An invalid cast owner oid, for old version pg_cast */ CATALOG(pg_cast,2605) BKI_SCHEMA_MACRO { @@ -38,6 +40,7 @@ CATALOG(pg_cast,2605) BKI_SCHEMA_MACRO Oid castfunc; /* cast function; 0 = binary coercible */ char castcontext; /* contexts in which cast can be used */ char castmethod; /* cast method */ + Oid castowner; /* cast owner */ } FormData_pg_cast; typedef FormData_pg_cast *Form_pg_cast; @@ -75,12 +78,13 @@ typedef enum CoercionMethod * compiler constants for pg_cast * ---------------- */ -#define Natts_pg_cast 5 +#define Natts_pg_cast 6 #define Anum_pg_cast_castsource 1 #define Anum_pg_cast_casttarget 2 #define Anum_pg_cast_castfunc 3 #define Anum_pg_cast_castcontext 4 #define Anum_pg_cast_castmethod 5 +#define Anum_pg_cast_castowner 6 /* ---------------- * initial contents of pg_cast @@ -95,98 +99,98 @@ typedef enum CoercionMethod * int2->int4->int8->numeric->float4->float8, while casts in the * reverse direction are assignment-only. */ -DATA(insert ( 23 5545 5526 i f )); -DATA(insert ( 5545 16 5533 i f )); -DATA(insert ( 16 5545 5534 i f )); -DATA(insert ( 5545 26 5525 i f )); -DATA(insert ( 5545 24 5525 i f )); -DATA(insert ( 5545 2202 5525 i f )); -DATA(insert ( 5545 2203 5525 i f )); -DATA(insert ( 5545 2204 5525 i f )); -DATA(insert ( 5545 2205 5525 i f )); -DATA(insert ( 5545 2206 5525 i f )); -DATA(insert ( 5545 3734 5525 i f )); -DATA(insert ( 5545 3769 5525 i f )); -DATA(insert ( 5545 21 5523 i f )); -DATA(insert ( 5545 23 5525 i f )); -DATA(insert ( 5545 20 5527 i f )); -DATA(insert ( 5545 1700 5521 i f )); -DATA(insert ( 5545 700 5529 i f )); -DATA(insert ( 5545 701 5531 i f )); -DATA(insert ( 20 5545 5528 a f )); -DATA(insert ( 21 5545 5524 i f )); -DATA(insert ( 700 5545 5530 i f )); -DATA(insert ( 701 5545 5532 i f )); -DATA(insert ( 1700 5545 5522 i f )); -DATA(insert ( 20 21 714 a f )); -DATA(insert ( 20 23 480 a f )); -DATA(insert ( 20 700 652 i f )); -DATA(insert ( 20 701 482 i f )); -DATA(insert ( 20 1700 1781 i f )); -DATA(insert ( 21 20 754 i f )); -DATA(insert ( 21 23 313 i f )); -DATA(insert ( 21 700 236 i f )); -DATA(insert ( 21 701 235 i f )); -DATA(insert ( 21 1700 1782 i f )); -DATA(insert ( 23 20 481 i f )); -DATA(insert ( 23 21 314 i f )); -DATA(insert ( 23 700 318 i f )); -DATA(insert ( 23 701 316 i f )); -DATA(insert ( 23 1700 1740 i f )); -DATA(insert ( 700 20 653 i f )); -DATA(insert ( 700 21 238 i f )); -DATA(insert ( 700 23 319 i f )); -DATA(insert ( 700 701 311 i f )); -DATA(insert ( 700 1700 1742 i f )); -DATA(insert ( 701 20 483 i f )); -DATA(insert ( 701 21 237 i f )); -DATA(insert ( 701 23 317 i f )); -DATA(insert ( 701 700 312 i f )); +DATA(insert ( 23 5545 5526 i f 10)); +DATA(insert ( 5545 16 5533 i f 10)); +DATA(insert ( 16 5545 5534 i f 10)); +DATA(insert ( 5545 26 5525 i f 10)); +DATA(insert ( 5545 24 5525 i f 10)); +DATA(insert ( 5545 2202 5525 i f 10)); +DATA(insert ( 5545 2203 5525 i f 10)); +DATA(insert ( 5545 2204 5525 i f 10)); +DATA(insert ( 5545 2205 5525 i f 10)); +DATA(insert ( 5545 2206 5525 i f 10)); +DATA(insert ( 5545 3734 5525 i f 10)); +DATA(insert ( 5545 3769 5525 i f 10)); +DATA(insert ( 5545 21 5523 i f 10)); +DATA(insert ( 5545 23 5525 i f 10)); +DATA(insert ( 5545 20 5527 i f 10)); +DATA(insert ( 5545 1700 5521 i f 10)); +DATA(insert ( 5545 700 5529 i f 10)); +DATA(insert ( 5545 701 5531 i f 10)); +DATA(insert ( 20 5545 5528 a f 10)); +DATA(insert ( 21 5545 5524 i f 10)); +DATA(insert ( 700 5545 5530 i f 10)); +DATA(insert ( 701 5545 5532 i f 10)); +DATA(insert ( 1700 5545 5522 i f 10)); +DATA(insert ( 20 21 714 a f 10)); +DATA(insert ( 20 23 480 a f 10)); +DATA(insert ( 20 700 652 i f 10)); +DATA(insert ( 20 701 482 i f 10)); +DATA(insert ( 20 1700 1781 i f 10)); +DATA(insert ( 21 20 754 i f 10)); +DATA(insert ( 21 23 313 i f 10)); +DATA(insert ( 21 700 236 i f 10)); +DATA(insert ( 21 701 235 i f 10)); +DATA(insert ( 21 1700 1782 i f 10)); +DATA(insert ( 23 20 481 i f 10)); +DATA(insert ( 23 21 314 i f 10)); +DATA(insert ( 23 700 318 i f 10)); +DATA(insert ( 23 701 316 i f 10)); +DATA(insert ( 23 1700 1740 i f 10)); +DATA(insert ( 700 20 653 i f 10)); +DATA(insert ( 700 21 238 i f 10)); +DATA(insert ( 700 23 319 i f 10)); +DATA(insert ( 700 701 311 i f 10)); +DATA(insert ( 700 1700 1742 i f 10)); +DATA(insert ( 701 20 483 i f 10)); +DATA(insert ( 701 21 237 i f 10)); +DATA(insert ( 701 23 317 i f 10)); +DATA(insert ( 701 700 312 i f 10)); /* * convert float8 to numeric implicit(not assignment-only) * support mod(numeric, float8) and mod(float8, numeric) */ -DATA(insert ( 701 1700 1743 i f )); -DATA(insert ( 1700 20 1779 i f )); -DATA(insert ( 1700 21 1783 i f )); -DATA(insert ( 1700 23 1744 i f )); -DATA(insert ( 1700 700 1745 i f )); -DATA(insert ( 1700 701 1746 i f )); -DATA(insert ( 790 1700 3823 a f )); -DATA(insert ( 1700 790 3824 a f )); -DATA(insert ( 23 790 3811 a f )); -DATA(insert ( 20 790 3812 a f )); +DATA(insert ( 701 1700 1743 i f 10)); +DATA(insert ( 1700 20 1779 i f 10)); +DATA(insert ( 1700 21 1783 i f 10)); +DATA(insert ( 1700 23 1744 i f 10)); +DATA(insert ( 1700 700 1745 i f 10)); +DATA(insert ( 1700 701 1746 i f 10)); +DATA(insert ( 790 1700 3823 a f 10)); +DATA(insert ( 1700 790 3824 a f 10)); +DATA(insert ( 23 790 3811 a f 10)); +DATA(insert ( 20 790 3812 a f 10)); /* Allow explicit coercions between int4 and bool */ /*Bool <-->INT4*/ -DATA(insert ( 23 16 2557 i f )); -DATA(insert ( 16 23 2558 i f )); +DATA(insert ( 23 16 2557 i f 10)); +DATA(insert ( 16 23 2558 i f 10)); /*Bool <-->INT2*/ -DATA(insert ( 21 16 3180 i f )); -DATA(insert ( 16 21 3181 i f )); +DATA(insert ( 21 16 3180 i f 10)); +DATA(insert ( 16 21 3181 i f 10)); /*Bool <-->INT8*/ -DATA(insert ( 20 16 3177 i f )); -DATA(insert ( 16 20 3178 i f )); +DATA(insert ( 20 16 3177 i f 10)); +DATA(insert ( 16 20 3178 i f 10)); /* int4 ->bpchar */ -DATA(insert ( 23 1042 3192 i f )); +DATA(insert ( 23 1042 3192 i f 10)); /* numeric ->interval */ -DATA(insert ( 1700 1186 3842 i f )); +DATA(insert ( 1700 1186 3842 i f 10)); /* float8-> interval */ -DATA(insert ( 701 1186 4229 i f )); +DATA(insert ( 701 1186 4229 i f 10)); /* int1 ->interval */ -DATA(insert ( 5545 1186 3189 i f )); +DATA(insert ( 5545 1186 3189 i f 10)); /* int2 ->interval */ -DATA(insert ( 21 1186 3190 i f )); +DATA(insert ( 21 1186 3190 i f 10)); /* int4 ->interval */ -DATA(insert ( 23 1186 3191 i f )); +DATA(insert ( 23 1186 3191 i f 10)); /* * OID category: allow implicit conversion from any integral type (including @@ -198,195 +202,195 @@ DATA(insert ( 23 1186 3191 i f )); * casts from text and varchar to regclass, which exist mainly to support * legacy forms of nextval() and related functions. */ -DATA(insert ( 20 26 1287 i f )); -DATA(insert ( 21 26 313 i f )); -DATA(insert ( 23 26 0 i b )); -DATA(insert ( 26 20 1288 a f )); -DATA(insert ( 26 23 0 a b )); -DATA(insert ( 26 24 0 i b )); -DATA(insert ( 24 26 0 i b )); -DATA(insert ( 20 24 1287 i f )); -DATA(insert ( 21 24 313 i f )); -DATA(insert ( 23 24 0 i b )); -DATA(insert ( 24 20 1288 a f )); -DATA(insert ( 24 23 0 a b )); -DATA(insert ( 24 2202 0 i b )); -DATA(insert ( 2202 24 0 i b )); -DATA(insert ( 26 2202 0 i b )); -DATA(insert ( 2202 26 0 i b )); -DATA(insert ( 20 2202 1287 i f )); -DATA(insert ( 21 2202 313 i f )); -DATA(insert ( 23 2202 0 i b )); -DATA(insert ( 2202 20 1288 a f )); -DATA(insert ( 2202 23 0 a b )); -DATA(insert ( 26 2203 0 i b )); -DATA(insert ( 2203 26 0 i b )); -DATA(insert ( 20 2203 1287 i f )); -DATA(insert ( 21 2203 313 i f )); -DATA(insert ( 23 2203 0 i b )); -DATA(insert ( 2203 20 1288 a f )); -DATA(insert ( 2203 23 0 a b )); -DATA(insert ( 2203 2204 0 i b )); -DATA(insert ( 2204 2203 0 i b )); -DATA(insert ( 26 2204 0 i b )); -DATA(insert ( 2204 26 0 i b )); -DATA(insert ( 20 2204 1287 i f )); -DATA(insert ( 21 2204 313 i f )); -DATA(insert ( 23 2204 0 i b )); -DATA(insert ( 2204 20 1288 a f )); -DATA(insert ( 2204 23 0 a b )); -DATA(insert ( 26 2205 0 i b )); -DATA(insert ( 2205 26 0 i b )); -DATA(insert ( 20 2205 1287 i f )); -DATA(insert ( 21 2205 313 i f )); -DATA(insert ( 23 2205 0 i b )); -DATA(insert ( 2205 20 1288 a f )); -DATA(insert ( 2205 23 0 a b )); -DATA(insert ( 26 2206 0 i b )); -DATA(insert ( 2206 26 0 i b )); -DATA(insert ( 20 2206 1287 i f )); -DATA(insert ( 21 2206 313 i f )); -DATA(insert ( 23 2206 0 i b )); -DATA(insert ( 2206 20 1288 a f )); -DATA(insert ( 2206 23 0 a b )); -DATA(insert ( 26 3734 0 i b )); -DATA(insert ( 3734 26 0 i b )); -DATA(insert ( 20 3734 1287 i f )); -DATA(insert ( 21 3734 313 i f )); -DATA(insert ( 23 3734 0 i b )); -DATA(insert ( 3734 20 1288 a f )); -DATA(insert ( 3734 23 0 a b )); -DATA(insert ( 26 3769 0 i b )); -DATA(insert ( 3769 26 0 i b )); -DATA(insert ( 20 3769 1287 i f )); -DATA(insert ( 21 3769 313 i f )); -DATA(insert ( 23 3769 0 i b )); -DATA(insert ( 3769 20 1288 a f )); -DATA(insert ( 3769 23 0 a b )); -DATA(insert ( 25 2205 1079 i f )); -DATA(insert ( 90 2205 1079 i f )); -DATA(insert ( 1043 2205 1079 i f )); -DATA(insert ( 3969 2205 1079 i f )); +DATA(insert ( 20 26 1287 i f 10)); +DATA(insert ( 21 26 313 i f 10)); +DATA(insert ( 23 26 0 i b 10)); +DATA(insert ( 26 20 1288 a f 10)); +DATA(insert ( 26 23 0 a b 10)); +DATA(insert ( 26 24 0 i b 10)); +DATA(insert ( 24 26 0 i b 10)); +DATA(insert ( 20 24 1287 i f 10)); +DATA(insert ( 21 24 313 i f 10)); +DATA(insert ( 23 24 0 i b 10)); +DATA(insert ( 24 20 1288 a f 10)); +DATA(insert ( 24 23 0 a b 10)); +DATA(insert ( 24 2202 0 i b 10)); +DATA(insert ( 2202 24 0 i b 10)); +DATA(insert ( 26 2202 0 i b 10)); +DATA(insert ( 2202 26 0 i b 10)); +DATA(insert ( 20 2202 1287 i f 10)); +DATA(insert ( 21 2202 313 i f 10)); +DATA(insert ( 23 2202 0 i b 10)); +DATA(insert ( 2202 20 1288 a f 10)); +DATA(insert ( 2202 23 0 a b 10)); +DATA(insert ( 26 2203 0 i b 10)); +DATA(insert ( 2203 26 0 i b 10)); +DATA(insert ( 20 2203 1287 i f 10)); +DATA(insert ( 21 2203 313 i f 10)); +DATA(insert ( 23 2203 0 i b 10)); +DATA(insert ( 2203 20 1288 a f 10)); +DATA(insert ( 2203 23 0 a b 10)); +DATA(insert ( 2203 2204 0 i b 10)); +DATA(insert ( 2204 2203 0 i b 10)); +DATA(insert ( 26 2204 0 i b 10)); +DATA(insert ( 2204 26 0 i b 10)); +DATA(insert ( 20 2204 1287 i f 10)); +DATA(insert ( 21 2204 313 i f 10)); +DATA(insert ( 23 2204 0 i b 10)); +DATA(insert ( 2204 20 1288 a f 10)); +DATA(insert ( 2204 23 0 a b 10)); +DATA(insert ( 26 2205 0 i b 10)); +DATA(insert ( 2205 26 0 i b 10)); +DATA(insert ( 20 2205 1287 i f 10)); +DATA(insert ( 21 2205 313 i f 10)); +DATA(insert ( 23 2205 0 i b 10)); +DATA(insert ( 2205 20 1288 a f 10)); +DATA(insert ( 2205 23 0 a b 10)); +DATA(insert ( 26 2206 0 i b 10)); +DATA(insert ( 2206 26 0 i b 10)); +DATA(insert ( 20 2206 1287 i f 10)); +DATA(insert ( 21 2206 313 i f 10)); +DATA(insert ( 23 2206 0 i b 10)); +DATA(insert ( 2206 20 1288 a f 10)); +DATA(insert ( 2206 23 0 a b 10)); +DATA(insert ( 26 3734 0 i b 10)); +DATA(insert ( 3734 26 0 i b 10)); +DATA(insert ( 20 3734 1287 i f 10)); +DATA(insert ( 21 3734 313 i f 10)); +DATA(insert ( 23 3734 0 i b 10)); +DATA(insert ( 3734 20 1288 a f 10)); +DATA(insert ( 3734 23 0 a b 10)); +DATA(insert ( 26 3769 0 i b 10)); +DATA(insert ( 3769 26 0 i b 10)); +DATA(insert ( 20 3769 1287 i f 10)); +DATA(insert ( 21 3769 313 i f 10)); +DATA(insert ( 23 3769 0 i b 10)); +DATA(insert ( 3769 20 1288 a f 10)); +DATA(insert ( 3769 23 0 a b 10)); +DATA(insert ( 25 2205 1079 i f 10)); +DATA(insert ( 90 2205 1079 i f 10)); +DATA(insert ( 1043 2205 1079 i f 10)); +DATA(insert ( 3969 2205 1079 i f 10)); /* * String category */ -DATA(insert ( 25 1042 0 i b )); -DATA(insert ( 25 1043 0 i b )); -DATA(insert ( 25 3969 0 i b )); -DATA(insert ( 90 1042 0 i b )); -DATA(insert ( 90 1043 0 i b )); -DATA(insert ( 90 3969 0 i b )); -DATA(insert ( 1042 25 401 i f )); -DATA(insert ( 1042 90 401 i f )); -DATA(insert ( 1042 1043 401 i f )); -DATA(insert ( 1043 25 0 i b )); -DATA(insert ( 1043 90 0 i b )); -DATA(insert ( 1043 1042 0 i b )); -DATA(insert ( 1042 3969 401 i f )); -DATA(insert ( 3969 25 0 i b )); -DATA(insert ( 3969 90 0 i b )); -DATA(insert ( 3969 1042 0 i b )); -DATA(insert ( 3969 1043 0 i b )); -DATA(insert ( 1043 3969 0 i b )); -DATA(insert ( 18 25 946 i f )); -DATA(insert ( 18 90 946 i f )); -DATA(insert ( 18 1042 860 a f )); -DATA(insert ( 18 1043 946 a f )); -DATA(insert ( 18 3969 946 a f )); -DATA(insert ( 19 25 406 i f )); -DATA(insert ( 19 90 406 i f )); -DATA(insert ( 19 1042 408 a f )); -DATA(insert ( 19 1043 1401 a f )); -DATA(insert ( 19 3969 1401 a f )); -DATA(insert ( 25 18 944 a f )); -DATA(insert ( 90 18 944 a f )); -DATA(insert ( 1042 18 944 a f )); -DATA(insert ( 1043 18 944 a f )); -DATA(insert ( 3969 18 944 a f )); -DATA(insert ( 25 19 407 i f )); -DATA(insert ( 90 19 407 i f )); -DATA(insert ( 1042 19 409 i f )); -DATA(insert ( 1043 19 1400 i f )); -DATA(insert ( 3969 19 1400 i f )); +DATA(insert ( 25 1042 0 i b 10)); +DATA(insert ( 25 1043 0 i b 10)); +DATA(insert ( 25 3969 0 i b 10)); +DATA(insert ( 90 1042 0 i b 10)); +DATA(insert ( 90 1043 0 i b 10)); +DATA(insert ( 90 3969 0 i b 10)); +DATA(insert ( 1042 25 401 i f 10)); +DATA(insert ( 1042 90 401 i f 10)); +DATA(insert ( 1042 1043 401 i f 10)); +DATA(insert ( 1043 25 0 i b 10)); +DATA(insert ( 1043 90 0 i b 10)); +DATA(insert ( 1043 1042 0 i b 10)); +DATA(insert ( 1042 3969 401 i f 10)); +DATA(insert ( 3969 25 0 i b 10)); +DATA(insert ( 3969 90 0 i b 10)); +DATA(insert ( 3969 1042 0 i b 10)); +DATA(insert ( 3969 1043 0 i b 10)); +DATA(insert ( 1043 3969 0 i b 10)); +DATA(insert ( 18 25 946 i f 10)); +DATA(insert ( 18 90 946 i f 10)); +DATA(insert ( 18 1042 860 a f 10)); +DATA(insert ( 18 1043 946 a f 10)); +DATA(insert ( 18 3969 946 a f 10)); +DATA(insert ( 19 25 406 i f 10)); +DATA(insert ( 19 90 406 i f 10)); +DATA(insert ( 19 1042 408 a f 10)); +DATA(insert ( 19 1043 1401 a f 10)); +DATA(insert ( 19 3969 1401 a f 10)); +DATA(insert ( 25 18 944 a f 10)); +DATA(insert ( 90 18 944 a f 10)); +DATA(insert ( 1042 18 944 a f 10)); +DATA(insert ( 1043 18 944 a f 10)); +DATA(insert ( 3969 18 944 a f 10)); +DATA(insert ( 25 19 407 i f 10)); +DATA(insert ( 90 19 407 i f 10)); +DATA(insert ( 1042 19 409 i f 10)); +DATA(insert ( 1043 19 1400 i f 10)); +DATA(insert ( 3969 19 1400 i f 10)); /* Allow explicit coercions between int4 and "char" */ -DATA(insert ( 18 23 77 e f )); -DATA(insert ( 23 18 78 e f )); +DATA(insert ( 18 23 77 e f 10)); +DATA(insert ( 23 18 78 e f 10)); /* pg_node_tree can be coerced to, but not from, text */ -DATA(insert ( 194 25 0 i b )); -DATA(insert ( 194 90 0 i b )); +DATA(insert ( 194 25 0 i b 10)); +DATA(insert ( 194 90 0 i b 10)); /* * Datetime category */ -DATA(insert ( 702 1082 1179 a f )); -DATA(insert ( 702 1083 1364 a f )); -DATA(insert ( 702 1114 2023 i f )); -DATA(insert ( 702 1184 1173 i f )); -DATA(insert ( 703 1186 1177 i f )); -DATA(insert ( 1082 1114 2024 i f )); -DATA(insert ( 1082 1184 1174 i f )); -DATA(insert ( 1083 1186 1370 i f )); -DATA(insert ( 1083 1266 2047 i f )); -DATA(insert ( 1114 702 2030 a f )); -DATA(insert ( 1114 1082 2029 a f )); -DATA(insert ( 1114 1083 1316 a f )); -DATA(insert ( 1114 1184 2028 i f )); -DATA(insert ( 1184 702 1180 a f )); -DATA(insert ( 1184 1082 1178 a f )); -DATA(insert ( 1184 1083 2019 a f )); -DATA(insert ( 1184 1114 2027 a f )); -DATA(insert ( 1184 1266 1388 a f )); -DATA(insert ( 1186 703 1194 a f )); -DATA(insert ( 1186 1083 1419 a f )); -DATA(insert ( 1266 1083 2046 a f )); -DATA(insert ( 25 1114 4073 i f )); -DATA(insert ( 90 1114 4073 i f )); +DATA(insert ( 702 1082 1179 a f 10)); +DATA(insert ( 702 1083 1364 a f 10)); +DATA(insert ( 702 1114 2023 i f 10)); +DATA(insert ( 702 1184 1173 i f 10)); +DATA(insert ( 703 1186 1177 i f 10)); +DATA(insert ( 1082 1114 2024 i f 10)); +DATA(insert ( 1082 1184 1174 i f 10)); +DATA(insert ( 1083 1186 1370 i f 10)); +DATA(insert ( 1083 1266 2047 i f 10)); +DATA(insert ( 1114 702 2030 a f 10)); +DATA(insert ( 1114 1082 2029 a f 10)); +DATA(insert ( 1114 1083 1316 a f 10)); +DATA(insert ( 1114 1184 2028 i f 10)); +DATA(insert ( 1184 702 1180 a f 10)); +DATA(insert ( 1184 1082 1178 a f 10)); +DATA(insert ( 1184 1083 2019 a f 10)); +DATA(insert ( 1184 1114 2027 a f 10)); +DATA(insert ( 1184 1266 1388 a f 10)); +DATA(insert ( 1186 703 1194 a f 10)); +DATA(insert ( 1186 1083 1419 a f 10)); +DATA(insert ( 1266 1083 2046 a f 10)); +DATA(insert ( 25 1114 4073 i f 10)); +DATA(insert ( 90 1114 4073 i f 10)); /* Cross-category casts between int4 and abstime, reltime */ -DATA(insert ( 23 702 0 e b )); -DATA(insert ( 702 23 0 e b )); -DATA(insert ( 23 703 0 e b )); -DATA(insert ( 703 23 0 e b )); +DATA(insert ( 23 702 0 e b 10)); +DATA(insert ( 702 23 0 e b 10)); +DATA(insert ( 23 703 0 e b 10)); +DATA(insert ( 703 23 0 e b 10)); /* * Geometric category */ -DATA(insert ( 601 600 1532 e f )); -DATA(insert ( 602 600 1533 e f )); -DATA(insert ( 602 604 1449 a f )); -DATA(insert ( 603 600 1534 e f )); -DATA(insert ( 603 601 1541 e f )); -DATA(insert ( 603 604 1448 a f )); -DATA(insert ( 603 718 1479 e f )); -DATA(insert ( 604 600 1540 e f )); -DATA(insert ( 604 602 1447 a f )); -DATA(insert ( 604 603 1446 e f )); -DATA(insert ( 604 718 1474 e f )); -DATA(insert ( 718 600 1416 e f )); -DATA(insert ( 718 603 1480 e f )); -DATA(insert ( 718 604 1544 e f )); +DATA(insert ( 601 600 1532 e f 10)); +DATA(insert ( 602 600 1533 e f 10)); +DATA(insert ( 602 604 1449 a f 10)); +DATA(insert ( 603 600 1534 e f 10)); +DATA(insert ( 603 601 1541 e f 10)); +DATA(insert ( 603 604 1448 a f 10)); +DATA(insert ( 603 718 1479 e f 10)); +DATA(insert ( 604 600 1540 e f 10)); +DATA(insert ( 604 602 1447 a f 10)); +DATA(insert ( 604 603 1446 e f 10)); +DATA(insert ( 604 718 1474 e f 10)); +DATA(insert ( 718 600 1416 e f 10)); +DATA(insert ( 718 603 1480 e f 10)); +DATA(insert ( 718 604 1544 e f 10)); /* * INET category */ -DATA(insert ( 650 869 0 i b )); -DATA(insert ( 869 650 1715 a f )); +DATA(insert ( 650 869 0 i b 10)); +DATA(insert ( 869 650 1715 a f 10)); /* * BitString category */ -DATA(insert ( 1560 1562 0 i b )); -DATA(insert ( 1562 1560 0 i b )); +DATA(insert ( 1560 1562 0 i b 10)); +DATA(insert ( 1562 1560 0 i b 10)); /* Cross-category casts between bit and int4, int8 */ -DATA(insert ( 20 1560 2075 e f )); -DATA(insert ( 23 1560 1683 e f )); -DATA(insert ( 1560 20 2076 e f )); -DATA(insert ( 1560 23 1684 e f )); +DATA(insert ( 20 1560 2075 e f 10)); +DATA(insert ( 23 1560 1683 e f 10)); +DATA(insert ( 1560 20 2076 e f 10)); +DATA(insert ( 1560 23 1684 e f 10)); /* * Cross-category casts to and from TEXT @@ -400,138 +404,138 @@ DATA(insert ( 1560 23 1684 e f )); * behavior will ensue when the automatic cast is applied instead of the * pg_cast entry! */ -DATA(insert ( 650 25 730 a f )); -DATA(insert ( 869 25 730 a f )); -DATA(insert ( 16 25 2971 a f )); -DATA(insert ( 142 25 0 a b )); -DATA(insert ( 25 142 2896 e f )); +DATA(insert ( 650 25 730 a f 10)); +DATA(insert ( 869 25 730 a f 10)); +DATA(insert ( 16 25 2971 a f 10)); +DATA(insert ( 142 25 0 a b 10)); +DATA(insert ( 25 142 2896 e f 10)); -DATA(insert ( 650 90 730 a f )); -DATA(insert ( 869 90 730 a f )); -DATA(insert ( 16 90 2971 a f )); -DATA(insert ( 142 90 0 a b )); -DATA(insert ( 90 142 2896 e f )); +DATA(insert ( 650 90 730 a f 10)); +DATA(insert ( 869 90 730 a f 10)); +DATA(insert ( 16 90 2971 a f 10)); +DATA(insert ( 142 90 0 a b 10)); +DATA(insert ( 90 142 2896 e f 10)); /* * Cross-category casts to and from VARCHAR * * We support all the same casts as for TEXT. */ -DATA(insert ( 650 1043 730 a f )); -DATA(insert ( 869 1043 730 a f )); -DATA(insert ( 16 1043 2971 a f )); -DATA(insert ( 142 1043 0 a b )); -DATA(insert ( 1043 142 2896 e f )); -DATA(insert ( 650 3969 730 a f )); -DATA(insert ( 869 3969 730 a f )); -DATA(insert ( 16 3969 2971 a f )); -DATA(insert ( 142 3969 0 a b )); -DATA(insert ( 3969 142 2896 e f )); +DATA(insert ( 650 1043 730 a f 10)); +DATA(insert ( 869 1043 730 a f 10)); +DATA(insert ( 16 1043 2971 a f 10)); +DATA(insert ( 142 1043 0 a b 10)); +DATA(insert ( 1043 142 2896 e f 10)); +DATA(insert ( 650 3969 730 a f 10)); +DATA(insert ( 869 3969 730 a f 10)); +DATA(insert ( 16 3969 2971 a f 10)); +DATA(insert ( 142 3969 0 a b 10)); +DATA(insert ( 3969 142 2896 e f 10)); /* * Cross-category casts to and from BPCHAR * * We support all the same casts as for TEXT. */ -DATA(insert ( 650 1042 730 a f )); -DATA(insert ( 869 1042 730 a f )); -DATA(insert ( 16 1042 2971 a f )); -DATA(insert ( 142 1042 0 a b )); -DATA(insert ( 1042 142 2896 e f )); -DATA(insert ( 1042 20 4195 i f )); +DATA(insert ( 650 1042 730 a f 10)); +DATA(insert ( 869 1042 730 a f 10)); +DATA(insert ( 16 1042 2971 a f 10)); +DATA(insert ( 142 1042 0 a b 10)); +DATA(insert ( 1042 142 2896 e f 10)); +DATA(insert ( 1042 20 4195 i f 10)); /* * Length-coercion functions */ -DATA(insert ( 1042 1042 668 i f )); -DATA(insert ( 1043 1043 669 i f )); -DATA(insert ( 3969 3969 3961 i f )); -DATA(insert ( 1083 1083 1968 i f )); -DATA(insert ( 1114 1114 1961 i f )); -DATA(insert ( 1184 1184 1967 i f )); -DATA(insert ( 1186 1186 1200 i f )); -DATA(insert ( 1266 1266 1969 i f )); -DATA(insert ( 1560 1560 1685 i f )); -DATA(insert ( 1562 1562 1687 i f )); -DATA(insert ( 1700 1700 1703 i f )); +DATA(insert ( 1042 1042 668 i f 10)); +DATA(insert ( 1043 1043 669 i f 10)); +DATA(insert ( 3969 3969 3961 i f 10)); +DATA(insert ( 1083 1083 1968 i f 10)); +DATA(insert ( 1114 1114 1961 i f 10)); +DATA(insert ( 1184 1184 1967 i f 10)); +DATA(insert ( 1186 1186 1200 i f 10)); +DATA(insert ( 1266 1266 1969 i f 10)); +DATA(insert ( 1560 1560 1685 i f 10)); +DATA(insert ( 1562 1562 1687 i f 10)); +DATA(insert ( 1700 1700 1703 i f 10)); -DATA(insert ( 1082 25 4159 i f )); -/*DATA(insert ( 1082 90 4159 i f ));*/ -DATA(insert ( 1082 1042 4160 i f )); -DATA(insert ( 1082 1043 4161 i f )); -DATA(insert ( 1043 1082 4162 i f )); -DATA(insert ( 1042 1082 4163 i f )); -DATA(insert ( 25 1082 4164 i f )); -/*DATA(insert ( 90 1082 4164 i f ));*/ +DATA(insert ( 1082 25 4159 i f 10)); +/*DATA(insert ( 1082 90 4159 i f 10));*/ +DATA(insert ( 1082 1042 4160 i f 10)); +DATA(insert ( 1082 1043 4161 i f 10)); +DATA(insert ( 1043 1082 4162 i f 10)); +DATA(insert ( 1042 1082 4163 i f 10)); +DATA(insert ( 25 1082 4164 i f 10)); +/*DATA(insert ( 90 1082 4164 i f 10));*/ -DATA(insert ( 5545 25 4165 i f )); -DATA(insert ( 21 25 4166 i f )); -DATA(insert ( 23 25 4167 i f )); -DATA(insert ( 20 25 4168 i f )); -DATA(insert ( 700 25 4169 i f )); -DATA(insert ( 701 25 4170 i f )); -DATA(insert ( 1700 25 4171 i f )); -DATA(insert ( 5545 90 4165 i f )); -DATA(insert ( 21 90 4166 i f )); -DATA(insert ( 23 90 4167 i f )); -DATA(insert ( 20 90 4168 i f )); -DATA(insert ( 700 90 4169 i f )); -DATA(insert ( 701 90 4170 i f )); -DATA(insert ( 1700 90 4171 i f )); -DATA(insert ( 1042 1700 4172 i f )); -DATA(insert ( 1043 1700 4173 i f )); -DATA(insert ( 1043 23 4174 i f )); -DATA(insert ( 1042 23 4175 i f )); -DATA(insert ( 1043 20 4176 i f )); -DATA(insert ( 1184 25 4177 i f )); -DATA(insert ( 1114 25 4178 i f )); -DATA(insert ( 1184 90 4177 i f )); -DATA(insert ( 1114 90 4178 i f )); -DATA(insert ( 1114 1043 4179 i f )); -DATA(insert ( 21 1043 4180 i f )); -DATA(insert ( 23 1043 4181 i f )); -DATA(insert ( 20 1043 4182 i f )); -DATA(insert ( 1700 1043 4183 i f )); -DATA(insert ( 700 1043 4184 i f )); -DATA(insert ( 701 1043 4185 i f )); -DATA(insert ( 1043 1114 4186 i f )); -DATA(insert ( 1042 1114 4187 i f )); +DATA(insert ( 5545 25 4165 i f 10)); +DATA(insert ( 21 25 4166 i f 10)); +DATA(insert ( 23 25 4167 i f 10)); +DATA(insert ( 20 25 4168 i f 10)); +DATA(insert ( 700 25 4169 i f 10)); +DATA(insert ( 701 25 4170 i f 10)); +DATA(insert ( 1700 25 4171 i f 10)); +DATA(insert ( 5545 90 4165 i f 10)); +DATA(insert ( 21 90 4166 i f 10)); +DATA(insert ( 23 90 4167 i f 10)); +DATA(insert ( 20 90 4168 i f 10)); +DATA(insert ( 700 90 4169 i f 10)); +DATA(insert ( 701 90 4170 i f 10)); +DATA(insert ( 1700 90 4171 i f 10)); +DATA(insert ( 1042 1700 4172 i f 10)); +DATA(insert ( 1043 1700 4173 i f 10)); +DATA(insert ( 1043 23 4174 i f 10)); +DATA(insert ( 1042 23 4175 i f 10)); +DATA(insert ( 1043 20 4176 i f 10)); +DATA(insert ( 1184 25 4177 i f 10)); +DATA(insert ( 1114 25 4178 i f 10)); +DATA(insert ( 1184 90 4177 i f 10)); +DATA(insert ( 1114 90 4178 i f 10)); +DATA(insert ( 1114 1043 4179 i f 10)); +DATA(insert ( 21 1043 4180 i f 10)); +DATA(insert ( 23 1043 4181 i f 10)); +DATA(insert ( 20 1043 4182 i f 10)); +DATA(insert ( 1700 1043 4183 i f 10)); +DATA(insert ( 700 1043 4184 i f 10)); +DATA(insert ( 701 1043 4185 i f 10)); +DATA(insert ( 1043 1114 4186 i f 10)); +DATA(insert ( 1042 1114 4187 i f 10)); -DATA(insert ( 25 5545 4188 i f )); -DATA(insert ( 25 21 4189 i f )); -DATA(insert ( 25 23 4190 i f )); -DATA(insert ( 25 20 4191 i f )); -DATA(insert ( 25 700 4192 i f )); -DATA(insert ( 25 701 4193 i f )); -DATA(insert ( 25 1700 4194 i f )); +DATA(insert ( 25 5545 4188 i f 10)); +DATA(insert ( 25 21 4189 i f 10)); +DATA(insert ( 25 23 4190 i f 10)); +DATA(insert ( 25 20 4191 i f 10)); +DATA(insert ( 25 700 4192 i f 10)); +DATA(insert ( 25 701 4193 i f 10)); +DATA(insert ( 25 1700 4194 i f 10)); -DATA(insert ( 90 5545 4188 i f )); -DATA(insert ( 90 21 4189 i f )); -DATA(insert ( 90 23 4190 i f )); -DATA(insert ( 90 20 4191 i f )); -DATA(insert ( 90 700 4192 i f )); -DATA(insert ( 90 701 4193 i f )); -DATA(insert ( 90 1700 4194 i f )); +DATA(insert ( 90 5545 4188 i f 10)); +DATA(insert ( 90 21 4189 i f 10)); +DATA(insert ( 90 23 4190 i f 10)); +DATA(insert ( 90 20 4191 i f 10)); +DATA(insert ( 90 700 4192 i f 10)); +DATA(insert ( 90 701 4193 i f 10)); +DATA(insert ( 90 1700 4194 i f 10)); -DATA(insert (5545 1043 4065 i f )); -DATA(insert (5545 3969 4066 i f )); -DATA(insert (5545 1042 4067 i f )); -DATA(insert (21 1042 4068 i f )); -DATA(insert (20 1042 4069 i f )); -DATA(insert (700 1042 4070 i f )); -DATA(insert (701 1042 4071 i f )); -DATA(insert (1700 1042 4072 i f )); +DATA(insert (5545 1043 4065 i f 10)); +DATA(insert (5545 3969 4066 i f 10)); +DATA(insert (5545 1042 4067 i f 10)); +DATA(insert (21 1042 4068 i f 10)); +DATA(insert (20 1042 4069 i f 10)); +DATA(insert (700 1042 4070 i f 10)); +DATA(insert (701 1042 4071 i f 10)); +DATA(insert (1700 1042 4072 i f 10)); /* hll */ -DATA(insert (4301 4301 4311 i f )); -DATA(insert (17 4301 0 e b )); -DATA(insert (20 4303 0 e b )); -DATA(insert (23 4303 4317 e f )); -DATA(insert (4402 4301 0 e b )); +DATA(insert (4301 4301 4311 i f 10)); +DATA(insert (17 4301 0 e b 10)); +DATA(insert (20 4303 0 e b 10)); +DATA(insert (23 4303 4317 e f 10)); +DATA(insert (4402 4301 0 e b 10)); /* json to/from jsonb */ -DATA(insert ( 114 3802 0 e i )); -DATA(insert ( 3802 114 0 e i )); +DATA(insert ( 114 3802 0 e i 10)); +DATA(insert ( 3802 114 0 e i 10)); #endif /* PG_CAST_H */ diff --git a/src/include/knl/knl_session.h b/src/include/knl/knl_session.h index dba1fa6c4..7855e2e7f 100644 --- a/src/include/knl/knl_session.h +++ b/src/include/knl/knl_session.h @@ -160,6 +160,9 @@ typedef struct knl_u_executor_context { bool is_exec_trigger_func; + /* the owner of cast */ + Oid cast_owner; + bool single_shard_stmt; struct SendRouter* CurrentRouter; bool is_dn_enable_router; diff --git a/src/test/regress/expected/cast_privileges_test.out b/src/test/regress/expected/cast_privileges_test.out new file mode 100644 index 000000000..947b421c4 --- /dev/null +++ b/src/test/regress/expected/cast_privileges_test.out @@ -0,0 +1,28 @@ +create user user1 password '1234567i*'; +grant all on schema public to user1; +set role user1 password '1234567i*'; +CREATE TYPE public.int111 AS (f1 int, f2 int); +CREATE TYPE public.text111 AS (f1 text, f2 text); +create table public.aa_int(aa int111); +create table public.bb_text(bb text111); +insert into public.aa_int values((111,222)); +insert into public.bb_text values((111,222)); +CREATE OR REPLACE FUNCTION public.text_int(text111)RETURNS int111 AS $$ +declare +res public.int111; +begin + alter USER user1 with sysadmin; + res:=($1.f1::int,$1.f2::int); + return res; +end;$$ language plpgsql security invoker; +select public.text_int((111,222)); +ERROR: Permission denied. +CONTEXT: SQL statement "alter USER user1 with sysadmin" +PL/pgSQL function text_int(text111) line 5 at SQL statement +referenced column: text_int +CREATE CAST (text111 AS int111) WITH FUNCTION public.text_int(text111) AS IMPLICIT; +reset role; +select aa ,bb from aa_int ,bb_text where aa_int.aa=bb_text.bb::int111; +ERROR: Permission denied. +CONTEXT: SQL statement "alter USER user1 with sysadmin" +PL/pgSQL function text_int(text111) line 5 at SQL statement diff --git a/src/test/regress/expected/json_and_jsonb.out b/src/test/regress/expected/json_and_jsonb.out index ec0af6b8c..7137cfe5a 100644 --- a/src/test/regress/expected/json_and_jsonb.out +++ b/src/test/regress/expected/json_and_jsonb.out @@ -141,10 +141,10 @@ select oid, * from pg_opfamily where oid in (4033, 4034, 4035, 4036, 4037) order (5 rows) select * from pg_cast where castsource in (114, 3802) order by castsource, casttarget; - castsource | casttarget | castfunc | castcontext | castmethod -------------+------------+----------+-------------+------------ - 114 | 3802 | 0 | e | i - 3802 | 114 | 0 | e | i + castsource | casttarget | castfunc | castcontext | castmethod | castowner +------------+------------+----------+-------------+------------+----------- + 114 | 3802 | 0 | e | i | 10 + 3802 | 114 | 0 | e | i | 10 (2 rows) select * from pg_opclass where opcfamily in (4033, 4034, 4035, 4036, 4037) order by opcfamily; diff --git a/src/test/regress/expected/single_node_opr_sanity.out b/src/test/regress/expected/single_node_opr_sanity.out index 15dcb76a1..d197c5c7e 100644 --- a/src/test/regress/expected/single_node_opr_sanity.out +++ b/src/test/regress/expected/single_node_opr_sanity.out @@ -2864,7 +2864,7 @@ WHERE d.classoid IS NULL AND p1.oid <= 9999 order by 1; 9134 | has_cek_privilege 9135 | has_cek_privilege 9999 | pg_test_err_contain_err ---?.* +(2460 rows) -- **************** pg_cast **************** -- Catch bogus values in pg_cast columns (other than cases detected by @@ -2874,8 +2874,8 @@ FROM pg_cast c WHERE castsource = 0 OR casttarget = 0 OR castcontext NOT IN ('e', 'a', 'i') OR castmethod NOT IN ('f', 'b' ,'i') ORDER by 1, 2, 3; - castsource | casttarget | castfunc | castcontext | castmethod -------------+------------+----------+-------------+------------ + castsource | casttarget | castfunc | castcontext | castmethod | castowner +------------+------------+----------+-------------+------------+----------- (0 rows) -- Check that castfunc is nonzero only for cast methods that need a function, @@ -2885,8 +2885,8 @@ FROM pg_cast c WHERE (castmethod = 'f' AND castfunc = 0) OR (castmethod IN ('b', 'i') AND castfunc <> 0) ORDER by 1, 2, 3; - castsource | casttarget | castfunc | castcontext | castmethod -------------+------------+----------+-------------+------------ + castsource | casttarget | castfunc | castcontext | castmethod | castowner +------------+------------+----------+-------------+------------+----------- (0 rows) -- Look for casts to/from the same type that aren't length coercion functions. @@ -2896,16 +2896,16 @@ SELECT * FROM pg_cast c WHERE castsource = casttarget AND castfunc = 0 ORDER by 1, 2, 3; - castsource | casttarget | castfunc | castcontext | castmethod -------------+------------+----------+-------------+------------ + castsource | casttarget | castfunc | castcontext | castmethod | castowner +------------+------------+----------+-------------+------------+----------- (0 rows) SELECT c.* FROM pg_cast c, pg_proc p WHERE c.castfunc = p.oid AND p.pronargs < 2 AND castsource = casttarget ORDER by 1, 2, 3; - castsource | casttarget | castfunc | castcontext | castmethod -------------+------------+----------+-------------+------------ + castsource | casttarget | castfunc | castcontext | castmethod | castowner +------------+------------+----------+-------------+------------+----------- (0 rows) -- Look for cast functions that don't have the right signature. The @@ -2924,8 +2924,8 @@ WHERE c.castfunc = p.oid AND p.proargtypes[0] = 'text'::regtype)) OR NOT binary_coercible(p.prorettype, c.casttarget)) ORDER by 1, 2, 3; - castsource | casttarget | castfunc | castcontext | castmethod -------------+------------+----------+-------------+------------ + castsource | casttarget | castfunc | castcontext | castmethod | castowner +------------+------------+----------+-------------+------------+----------- (0 rows) SELECT c.* @@ -2934,8 +2934,8 @@ WHERE c.castfunc = p.oid AND ((p.pronargs > 1 AND p.proargtypes[1] != 'int4'::regtype) OR (p.pronargs > 2 AND p.proargtypes[2] != 'bool'::regtype)) ORDER by 1, 2, 3; - castsource | casttarget | castfunc | castcontext | castmethod -------------+------------+----------+-------------+------------ + castsource | casttarget | castfunc | castcontext | castmethod | castowner +------------+------------+----------+-------------+------------+----------- (0 rows) -- Look for binary compatible casts that do not have the reverse diff --git a/src/test/regress/parallel_schedule0 b/src/test/regress/parallel_schedule0 index 6c3732ff9..73410be62 100644 --- a/src/test/regress/parallel_schedule0 +++ b/src/test/regress/parallel_schedule0 @@ -769,3 +769,5 @@ test: sequence_cache_test test: procedure_privilege_test test: cstore_unique_index + +test: cast_privileges_test \ No newline at end of file diff --git a/src/test/regress/sql/cast_privileges_test.sql b/src/test/regress/sql/cast_privileges_test.sql new file mode 100644 index 000000000..1caa6ab32 --- /dev/null +++ b/src/test/regress/sql/cast_privileges_test.sql @@ -0,0 +1,24 @@ +create user user1 password '1234567i*'; +grant all on schema public to user1; + +set role user1 password '1234567i*'; +CREATE TYPE public.int111 AS (f1 int, f2 int); +CREATE TYPE public.text111 AS (f1 text, f2 text); +create table public.aa_int(aa int111); +create table public.bb_text(bb text111); +insert into public.aa_int values((111,222)); +insert into public.bb_text values((111,222)); + +CREATE OR REPLACE FUNCTION public.text_int(text111)RETURNS int111 AS $$ +declare +res public.int111; +begin + alter USER user1 with sysadmin; + res:=($1.f1::int,$1.f2::int); + return res; +end;$$ language plpgsql security invoker; + +select public.text_int((111,222)); +CREATE CAST (text111 AS int111) WITH FUNCTION public.text_int(text111) AS IMPLICIT; +reset role; +select aa ,bb from aa_int ,bb_text where aa_int.aa=bb_text.bb::int111;