25{
26 char *valuestr;
31
33
34 /* Get the old tuple, if any. */
35
38 Anum_pg_db_role_setting_setdatabase,
42 Anum_pg_db_role_setting_setrole,
46 NULL, 2, scankey);
48
49 /*
50 * There are three cases:
51 *
52 * - in RESET ALL, request GUC to reset the settings array and update the
53 * catalog if there's anything left, delete it otherwise
54 *
55 * - in other commands, if there's a tuple in pg_db_role_setting, update
56 * it; if it ends up empty, delete it
57 *
58 * - otherwise, insert a new pg_db_role_setting tuple, but only if the
59 * command is not RESET
60 */
62 {
64 {
67 bool isnull;
68
69 datum =
heap_getattr(tuple, Anum_pg_db_role_setting_setconfig,
71
72 if (!isnull)
74
75 if (new)
76 {
77 Datum repl_val[Natts_pg_db_role_setting];
78 bool repl_null[Natts_pg_db_role_setting];
79 bool repl_repl[Natts_pg_db_role_setting];
81
82 memset(repl_repl, false, sizeof(repl_repl));
83
84 repl_val[Anum_pg_db_role_setting_setconfig - 1] =
86 repl_repl[Anum_pg_db_role_setting_setconfig - 1] = true;
87 repl_null[Anum_pg_db_role_setting_setconfig - 1] = false;
88
90 repl_val, repl_null, repl_repl);
92 }
93 else
95 }
96 }
98 {
99 Datum repl_val[Natts_pg_db_role_setting];
100 bool repl_null[Natts_pg_db_role_setting];
101 bool repl_repl[Natts_pg_db_role_setting];
104 bool isnull;
106
107 memset(repl_repl, false, sizeof(repl_repl));
108 repl_repl[Anum_pg_db_role_setting_setconfig - 1] = true;
109 repl_null[Anum_pg_db_role_setting_setconfig - 1] = false;
110
111 /* Extract old value of setconfig */
112 datum =
heap_getattr(tuple, Anum_pg_db_role_setting_setconfig,
115
116 /* Update (valuestr is NULL in RESET cases) */
117 if (valuestr)
119 else
121
123 {
124 repl_val[Anum_pg_db_role_setting_setconfig - 1] =
126
128 repl_val, repl_null, repl_repl);
130 }
131 else
133 }
134 else if (valuestr)
135 {
136 /* non-null valuestr means it's not RESET, so insert a new tuple */
139 bool nulls[Natts_pg_db_role_setting];
141
142 memset(nulls, false, sizeof(nulls));
143
145
146 values[Anum_pg_db_role_setting_setdatabase - 1] =
151
153 }
154 else
155 {
156 /*
157 * RESET doesn't need to change any state if there's no pre-existing
158 * pg_db_role_setting entry, but for consistency we should still check
159 * that the option is valid and we're allowed to set it.
160 */
162 }
163
165 databaseid, 0, roleid, false);
166
168
169 /* Close pg_db_role_setting, but keep lock till commit */
171}
#define DatumGetArrayTypeP(X)
static Datum values[MAXATTR]
void systable_endscan(SysScanDesc sysscan)
HeapTuple systable_getnext(SysScanDesc sysscan)
SysScanDesc systable_beginscan(Relation heapRelation, Oid indexId, bool indexOK, Snapshot snapshot, int nkeys, ScanKey key)
ArrayType * GUCArrayAdd(ArrayType *array, const char *name, const char *value)
ArrayType * GUCArrayReset(ArrayType *array)
ArrayType * GUCArrayDelete(ArrayType *array, const char *name)
char * ExtractSetVariableArgs(VariableSetStmt *stmt)
HeapTuple heap_modify_tuple(HeapTuple tuple, TupleDesc tupleDesc, const Datum *replValues, const bool *replIsnull, const bool *doReplace)
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, const Datum *values, const bool *isnull)
#define HeapTupleIsValid(tuple)
static Datum heap_getattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
void CatalogTupleUpdate(Relation heapRel, ItemPointer otid, HeapTuple tup)
void CatalogTupleInsert(Relation heapRel, HeapTuple tup)
void CatalogTupleDelete(Relation heapRel, ItemPointer tid)
#define InvokeObjectPostAlterHookArg(classId, objectId, subId, auxiliaryId, is_internal)
static Datum PointerGetDatum(const void *X)
static Datum ObjectIdGetDatum(Oid X)
#define RelationGetDescr(relation)
void ScanKeyInit(ScanKey entry, AttrNumber attributeNumber, StrategyNumber strategy, RegProcedure procedure, Datum argument)
#define BTEqualStrategyNumber
void table_close(Relation relation, LOCKMODE lockmode)
Relation table_open(Oid relationId, LOCKMODE lockmode)