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
v1-0001-minor-refactoring-set_session_variable.no-cfbot
Description: Binary data
v1-0002-refactoring-LET-statement-self-assign-privileg.no-cfbot
Description: Binary data
