fixed the bug of cast

This commit is contained in:
luozihao
2021-07-14 09:29:54 +08:00
parent 468d6bcbc2
commit c98f970368
12 changed files with 477 additions and 358 deletions

View File

@ -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

View File

@ -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;
}

View File

@ -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, "", "");

View File

@ -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;
}

View File

@ -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<false>(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

View File

@ -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 */

View File

@ -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;

View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -769,3 +769,5 @@ test: sequence_cache_test
test: procedure_privilege_test
test: cstore_unique_index
test: cast_privileges_test

View File

@ -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;