On Tue, Feb 1, 2022 at 4:51 PM Amit Kapila <amit.kapil...@gmail.com> wrote: > > Review Comments: > =============== > 1. > + else if (IsA(node, OpExpr)) > + { > + /* OK, except user-defined operators are not allowed. */ > + if (((OpExpr *) node)->opno >= FirstNormalObjectId) > + errdetail_msg = _("User-defined operators are not allowed."); > + } > > Is it sufficient to check only the allowed operators for OpExpr? Don't > we need to check opfuncid to ensure that the corresponding function is > immutable? Also, what about opresulttype, opcollid, and inputcollid? I > think we don't want to allow user-defined types or collations but as > we are restricting the opexp to use a built-in operator, those should > not be present in such an expression. If that is the case, then I > think we can add a comment for the same. >
Today, I was looking at a few other nodes supported by the patch and I have similar questions for those as well. As an example, the patch allows T_ScalarArrayOpExpr and the node is as follows: typedef struct ScalarArrayOpExpr { Expr xpr; Oid opno; /* PG_OPERATOR OID of the operator */ Oid opfuncid; /* PG_PROC OID of comparison function */ Oid hashfuncid; /* PG_PROC OID of hash func or InvalidOid */ Oid negfuncid; /* PG_PROC OID of negator of opfuncid function * or InvalidOid. See above */ bool useOr; /* true for ANY, false for ALL */ Oid inputcollid; /* OID of collation that operator should use */ List *args; /* the scalar and array operands */ int location; /* token location, or -1 if unknown */ } ScalarArrayOpExpr; Don't we need to check pg_proc OIDs like hashfuncid to ensure that it is immutable like the patch is doing for FuncExpr? Similarly for ArrayExpr node, don't we need to check the array_collid to see if it contains user-defined collation? I think some of these might be okay to permit but then it is better to have some comments to explain. -- With Regards, Amit Kapila.