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