comment out the changes in
src/backend/utils/cache/plancache.c

    // /* process session variables */
    // if (OidIsValid(parsetree->resultVariable))
    // {
    //     if (acquire)
    //         LockDatabaseObject(VariableRelationId, parsetree->resultVariable,
    //                            0, AccessShareLock);
    //     else
    //         UnlockDatabaseObject(VariableRelationId,
parsetree->resultVariable,
    //                              0, AccessShareLock);
    // }

    // else if (IsA(node, Param))
    // {
    //     Param       *p = (Param *) node;
    //     if (p->paramkind == PARAM_VARIABLE)
    //     {
    //         if (acquire)
    //             LockDatabaseObject(VariableRelationId, p->paramvarid,
    //                                0, AccessShareLock);
    //         else
    //             UnlockDatabaseObject(VariableRelationId, p->paramvarid,
    //                                  0, AccessShareLock);
    //     }
    // }
the regress tests are still successful, that means these code changes
don't have related tests.


SetSessionVariable(Oid varid, Datum value, bool isNull)
{
    create_sessionvars_hashtables();
    svar = (SVariable) hash_search(sessionvars, &varid, HASH_ENTER, &found);
    if (!found)
        setup_session_variable(svar, varid);
    /* if this fails, it won't change the stored value */
    set_session_variable(svar, value, isNull);
}
after set_session_variable,
we want to make sure that svar->is_valid is true,
svar->value = value and  svar->isnull= isNull.
Based on this, I've simplified the function set_session_variable,
refer v1-0001-minor-refactoring-set_session_variable.no-cfbot


we use PlannerGlobal
{
   Oid            basenodeSessionVarid;
   Bitmapset *checkSelectPermVarids;
}
to solve the self-assigned corner case SELECT privilege.
(let v1.a =v1.a; in this case, we need have SELECT priv for v1.a
but let v1.a = 1, we don't need SELECT priv for v1.a).

i found out these two field value(information) most case is the same
as PlannerGlobal.sessionVariables;
I came up with another solution, introduce a bool (Query.is_Variable_assigned),
and get rid of PlannerGlobal.basenodeSessionVarid,
PlannerGlobal.checkSelectPermVarids.
not sure it make sense to you, refer
v1-0002-refactoring-LET-statement-self-assign-privileg.no-cfbot

Attachment: v1-0001-minor-refactoring-set_session_variable.no-cfbot
Description: Binary data

Attachment: v1-0002-refactoring-LET-statement-self-assign-privileg.no-cfbot
Description: Binary data

Reply via email to