Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitd435f15

Browse files
Add SysCacheGetAttrNotNull for guaranteed not-null attrs
When extracting an attr from a cached tuple in the syscache withSysCacheGetAttr the isnull parameter must be checked in case theattr cannot be NULL. For cases when this is known beforehand, awrapper is introduced which perform the errorhandling internallyon behalf of the caller, invoking an elog in case of a NULL attr.Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>Reviewed-by: Peter Eisentraut <peter.eisentraut@enterprisedb.com>Reviewed-by: David Rowley <dgrowleyml@gmail.com>Discussion:https://postgr.es/m/AD76405E-DB45-46B6-941F-17B1EB3A9076@yesql.se
1 parente33967b commitd435f15

38 files changed

+232
-452
lines changed

‎src/backend/access/brin/brin_inclusion.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -630,7 +630,6 @@ inclusion_get_strategy_procinfo(BrinDesc *bdesc, uint16 attno, Oid subtype,
630630
HeapTupletuple;
631631
Oidopfamily,
632632
oprid;
633-
boolisNull;
634633

635634
opfamily=bdesc->bd_index->rd_opfamily[attno-1];
636635
attr=TupleDescAttr(bdesc->bd_tupdesc,attno-1);
@@ -643,10 +642,10 @@ inclusion_get_strategy_procinfo(BrinDesc *bdesc, uint16 attno, Oid subtype,
643642
elog(ERROR,"missing operator %d(%u,%u) in opfamily %u",
644643
strategynum,attr->atttypid,subtype,opfamily);
645644

646-
oprid=DatumGetObjectId(SysCacheGetAttr(AMOPSTRATEGY,tuple,
647-
Anum_pg_amop_amopopr,&isNull));
645+
oprid=DatumGetObjectId(SysCacheGetAttrNotNull(AMOPSTRATEGY,tuple,
646+
Anum_pg_amop_amopopr));
648647
ReleaseSysCache(tuple);
649-
Assert(!isNull&&RegProcedureIsValid(oprid));
648+
Assert(RegProcedureIsValid(oprid));
650649

651650
fmgr_info_cxt(get_opcode(oprid),
652651
&opaque->strategy_procinfos[strategynum-1],

‎src/backend/access/brin/brin_minmax.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,6 @@ minmax_get_strategy_procinfo(BrinDesc *bdesc, uint16 attno, Oid subtype,
290290
HeapTupletuple;
291291
Oidopfamily,
292292
oprid;
293-
boolisNull;
294293

295294
opfamily=bdesc->bd_index->rd_opfamily[attno-1];
296295
attr=TupleDescAttr(bdesc->bd_tupdesc,attno-1);
@@ -303,10 +302,10 @@ minmax_get_strategy_procinfo(BrinDesc *bdesc, uint16 attno, Oid subtype,
303302
elog(ERROR,"missing operator %d(%u,%u) in opfamily %u",
304303
strategynum,attr->atttypid,subtype,opfamily);
305304

306-
oprid=DatumGetObjectId(SysCacheGetAttr(AMOPSTRATEGY,tuple,
307-
Anum_pg_amop_amopopr,&isNull));
305+
oprid=DatumGetObjectId(SysCacheGetAttrNotNull(AMOPSTRATEGY,tuple,
306+
Anum_pg_amop_amopopr));
308307
ReleaseSysCache(tuple);
309-
Assert(!isNull&&RegProcedureIsValid(oprid));
308+
Assert(RegProcedureIsValid(oprid));
310309

311310
fmgr_info_cxt(get_opcode(oprid),
312311
&opaque->strategy_procinfos[strategynum-1],

‎src/backend/access/brin/brin_minmax_multi.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2953,7 +2953,6 @@ minmax_multi_get_strategy_procinfo(BrinDesc *bdesc, uint16 attno, Oid subtype,
29532953
HeapTupletuple;
29542954
Oidopfamily,
29552955
oprid;
2956-
boolisNull;
29572956

29582957
opfamily=bdesc->bd_index->rd_opfamily[attno-1];
29592958
attr=TupleDescAttr(bdesc->bd_tupdesc,attno-1);
@@ -2965,10 +2964,10 @@ minmax_multi_get_strategy_procinfo(BrinDesc *bdesc, uint16 attno, Oid subtype,
29652964
elog(ERROR,"missing operator %d(%u,%u) in opfamily %u",
29662965
strategynum,attr->atttypid,subtype,opfamily);
29672966

2968-
oprid=DatumGetObjectId(SysCacheGetAttr(AMOPSTRATEGY,tuple,
2969-
Anum_pg_amop_amopopr,&isNull));
2967+
oprid=DatumGetObjectId(SysCacheGetAttrNotNull(AMOPSTRATEGY,tuple,
2968+
Anum_pg_amop_amopopr));
29702969
ReleaseSysCache(tuple);
2971-
Assert(!isNull&&RegProcedureIsValid(oprid));
2970+
Assert(RegProcedureIsValid(oprid));
29722971

29732972
fmgr_info_cxt(get_opcode(oprid),
29742973
&opaque->strategy_procinfos[strategynum-1],

‎src/backend/access/index/indexam.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -961,7 +961,6 @@ index_opclass_options(Relation indrel, AttrNumber attnum, Datum attoptions,
961961
Oidopclass;
962962
DatumindclassDatum;
963963
oidvector*indclass;
964-
boolisnull;
965964

966965
if (!DatumGetPointer(attoptions))
967966
returnNULL;/* ok, no options, no procedure */
@@ -970,9 +969,8 @@ index_opclass_options(Relation indrel, AttrNumber attnum, Datum attoptions,
970969
* Report an error if the opclass's options-parsing procedure does not
971970
* exist but the opclass options are specified.
972971
*/
973-
indclassDatum=SysCacheGetAttr(INDEXRELID,indrel->rd_indextuple,
974-
Anum_pg_index_indclass,&isnull);
975-
Assert(!isnull);
972+
indclassDatum=SysCacheGetAttrNotNull(INDEXRELID,indrel->rd_indextuple,
973+
Anum_pg_index_indclass);
976974
indclass= (oidvector*)DatumGetPointer(indclassDatum);
977975
opclass=indclass->values[attnum-1];
978976

‎src/backend/catalog/aclchk.c

Lines changed: 13 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2178,11 +2178,9 @@ ExecGrant_common(InternalGrant *istmt, Oid classid, AclMode default_privs,
21782178
* Get owner ID and working copy of existing ACL. If there's no ACL,
21792179
* substitute the proper default.
21802180
*/
2181-
ownerId=DatumGetObjectId(SysCacheGetAttr(cacheid,
2182-
tuple,
2183-
get_object_attnum_owner(classid),
2184-
&isNull));
2185-
Assert(!isNull);
2181+
ownerId=DatumGetObjectId(SysCacheGetAttrNotNull(cacheid,
2182+
tuple,
2183+
get_object_attnum_owner(classid)));
21862184
aclDatum=SysCacheGetAttr(cacheid,
21872185
tuple,
21882186
get_object_attnum_acl(classid),
@@ -2206,10 +2204,8 @@ ExecGrant_common(InternalGrant *istmt, Oid classid, AclMode default_privs,
22062204
old_acl,ownerId,
22072205
&grantorId,&avail_goptions);
22082206

2209-
nameDatum=SysCacheGetAttr(cacheid,tuple,
2210-
get_object_attnum_name(classid),
2211-
&isNull);
2212-
Assert(!isNull);
2207+
nameDatum=SysCacheGetAttrNotNull(cacheid,tuple,
2208+
get_object_attnum_name(classid));
22132209

22142210
/*
22152211
* Restrict the privileges to what we can actually grant, and emit the
@@ -2476,10 +2472,8 @@ ExecGrant_Parameter(InternalGrant *istmt)
24762472
parameterId);
24772473

24782474
/* We'll need the GUC's name */
2479-
nameDatum=SysCacheGetAttr(PARAMETERACLOID,tuple,
2480-
Anum_pg_parameter_acl_parname,
2481-
&isNull);
2482-
Assert(!isNull);
2475+
nameDatum=SysCacheGetAttrNotNull(PARAMETERACLOID,tuple,
2476+
Anum_pg_parameter_acl_parname);
24832477
parname=TextDatumGetCString(nameDatum);
24842478

24852479
/* Treat all parameters as belonging to the bootstrap superuser. */
@@ -3113,11 +3107,9 @@ object_aclmask(Oid classid, Oid objectid, Oid roleid,
31133107
(errcode(ERRCODE_UNDEFINED_DATABASE),
31143108
errmsg("%s with OID %u does not exist",get_object_class_descr(classid),objectid)));
31153109

3116-
ownerId=DatumGetObjectId(SysCacheGetAttr(cacheid,
3117-
tuple,
3118-
get_object_attnum_owner(classid),
3119-
&isNull));
3120-
Assert(!isNull);
3110+
ownerId=DatumGetObjectId(SysCacheGetAttrNotNull(cacheid,
3111+
tuple,
3112+
get_object_attnum_owner(classid)));
31213113

31223114
aclDatum=SysCacheGetAttr(cacheid,tuple,get_object_attnum_acl(classid),
31233115
&isNull);
@@ -3994,20 +3986,16 @@ object_ownercheck(Oid classid, Oid objectid, Oid roleid)
39943986
if (cacheid!=-1)
39953987
{
39963988
HeapTupletuple;
3997-
boolisnull;
39983989

39993990
tuple=SearchSysCache1(cacheid,ObjectIdGetDatum(objectid));
40003991
if (!HeapTupleIsValid(tuple))
40013992
ereport(ERROR,
40023993
(errcode(ERRCODE_UNDEFINED_OBJECT),
40033994
errmsg("%s with OID %u does not exist",get_object_class_descr(classid),objectid)));
40043995

4005-
ownerId=DatumGetObjectId(SysCacheGetAttr(cacheid,
4006-
tuple,
4007-
get_object_attnum_owner(classid),
4008-
&isnull));
4009-
Assert(!isnull);
4010-
3996+
ownerId=DatumGetObjectId(SysCacheGetAttrNotNull(cacheid,
3997+
tuple,
3998+
get_object_attnum_owner(classid)));
40113999
ReleaseSysCache(tuple);
40124000
}
40134001
else

‎src/backend/catalog/index.c

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1320,14 +1320,12 @@ index_concurrently_create_copy(Relation heapRelation, Oid oldIndexId,
13201320
indexTuple=SearchSysCache1(INDEXRELID,ObjectIdGetDatum(oldIndexId));
13211321
if (!HeapTupleIsValid(indexTuple))
13221322
elog(ERROR,"cache lookup failed for index %u",oldIndexId);
1323-
indclassDatum=SysCacheGetAttr(INDEXRELID,indexTuple,
1324-
Anum_pg_index_indclass,&isnull);
1325-
Assert(!isnull);
1323+
indclassDatum=SysCacheGetAttrNotNull(INDEXRELID,indexTuple,
1324+
Anum_pg_index_indclass);
13261325
indclass= (oidvector*)DatumGetPointer(indclassDatum);
13271326

1328-
colOptionDatum=SysCacheGetAttr(INDEXRELID,indexTuple,
1329-
Anum_pg_index_indoption,&isnull);
1330-
Assert(!isnull);
1327+
colOptionDatum=SysCacheGetAttrNotNull(INDEXRELID,indexTuple,
1328+
Anum_pg_index_indoption);
13311329
indcoloptions= (int2vector*)DatumGetPointer(colOptionDatum);
13321330

13331331
/* Fetch options of index if any */
@@ -1347,9 +1345,8 @@ index_concurrently_create_copy(Relation heapRelation, Oid oldIndexId,
13471345
DatumexprDatum;
13481346
char*exprString;
13491347

1350-
exprDatum=SysCacheGetAttr(INDEXRELID,indexTuple,
1351-
Anum_pg_index_indexprs,&isnull);
1352-
Assert(!isnull);
1348+
exprDatum=SysCacheGetAttrNotNull(INDEXRELID,indexTuple,
1349+
Anum_pg_index_indexprs);
13531350
exprString=TextDatumGetCString(exprDatum);
13541351
indexExprs= (List*)stringToNode(exprString);
13551352
pfree(exprString);
@@ -1359,9 +1356,8 @@ index_concurrently_create_copy(Relation heapRelation, Oid oldIndexId,
13591356
DatumpredDatum;
13601357
char*predString;
13611358

1362-
predDatum=SysCacheGetAttr(INDEXRELID,indexTuple,
1363-
Anum_pg_index_indpred,&isnull);
1364-
Assert(!isnull);
1359+
predDatum=SysCacheGetAttrNotNull(INDEXRELID,indexTuple,
1360+
Anum_pg_index_indpred);
13651361
predString=TextDatumGetCString(predDatum);
13661362
indexPreds= (List*)stringToNode(predString);
13671363

‎src/backend/catalog/objectaddress.c

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2603,7 +2603,6 @@ get_object_namespace(const ObjectAddress *address)
26032603
{
26042604
intcache;
26052605
HeapTupletuple;
2606-
boolisnull;
26072606
Oidoid;
26082607
constObjectPropertyType*property;
26092608

@@ -2621,11 +2620,9 @@ get_object_namespace(const ObjectAddress *address)
26212620
if (!HeapTupleIsValid(tuple))
26222621
elog(ERROR,"cache lookup failed for cache %d oid %u",
26232622
cache,address->objectId);
2624-
oid=DatumGetObjectId(SysCacheGetAttr(cache,
2625-
tuple,
2626-
property->attnum_namespace,
2627-
&isnull));
2628-
Assert(!isnull);
2623+
oid=DatumGetObjectId(SysCacheGetAttrNotNull(cache,
2624+
tuple,
2625+
property->attnum_namespace));
26292626
ReleaseSysCache(tuple);
26302627

26312628
returnoid;
@@ -3896,7 +3893,6 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok)
38963893
{
38973894
HeapTupletup;
38983895
DatumnameDatum;
3899-
boolisNull;
39003896
char*parname;
39013897

39023898
tup=SearchSysCache1(PARAMETERACLOID,
@@ -3908,10 +3904,8 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok)
39083904
object->objectId);
39093905
break;
39103906
}
3911-
nameDatum=SysCacheGetAttr(PARAMETERACLOID,tup,
3912-
Anum_pg_parameter_acl_parname,
3913-
&isNull);
3914-
Assert(!isNull);
3907+
nameDatum=SysCacheGetAttrNotNull(PARAMETERACLOID,tup,
3908+
Anum_pg_parameter_acl_parname);
39153909
parname=TextDatumGetCString(nameDatum);
39163910
appendStringInfo(&buffer,_("parameter %s"),parname);
39173911
ReleaseSysCache(tup);
@@ -5759,7 +5753,6 @@ getObjectIdentityParts(const ObjectAddress *object,
57595753
{
57605754
HeapTupletup;
57615755
DatumnameDatum;
5762-
boolisNull;
57635756
char*parname;
57645757

57655758
tup=SearchSysCache1(PARAMETERACLOID,
@@ -5771,10 +5764,8 @@ getObjectIdentityParts(const ObjectAddress *object,
57715764
object->objectId);
57725765
break;
57735766
}
5774-
nameDatum=SysCacheGetAttr(PARAMETERACLOID,tup,
5775-
Anum_pg_parameter_acl_parname,
5776-
&isNull);
5777-
Assert(!isNull);
5767+
nameDatum=SysCacheGetAttrNotNull(PARAMETERACLOID,tup,
5768+
Anum_pg_parameter_acl_parname);
57785769
parname=TextDatumGetCString(nameDatum);
57795770
appendStringInfoString(&buffer,parname);
57805771
if (objname)

‎src/backend/catalog/pg_constraint.c

Lines changed: 10 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1190,23 +1190,18 @@ DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
11901190
Oid*pf_eq_oprs,Oid*pp_eq_oprs,Oid*ff_eq_oprs,
11911191
int*num_fk_del_set_cols,AttrNumber*fk_del_set_cols)
11921192
{
1193-
OidconstrId;
11941193
Datumadatum;
11951194
boolisNull;
11961195
ArrayType*arr;
11971196
intnumkeys;
11981197

1199-
constrId= ((Form_pg_constraint)GETSTRUCT(tuple))->oid;
1200-
12011198
/*
12021199
* We expect the arrays to be 1-D arrays of the right types; verify that.
12031200
* We don't need to use deconstruct_array() since the array data is just
12041201
* going to look like a C array of values.
12051202
*/
1206-
adatum=SysCacheGetAttr(CONSTROID,tuple,
1207-
Anum_pg_constraint_conkey,&isNull);
1208-
if (isNull)
1209-
elog(ERROR,"null conkey for constraint %u",constrId);
1203+
adatum=SysCacheGetAttrNotNull(CONSTROID,tuple,
1204+
Anum_pg_constraint_conkey);
12101205
arr=DatumGetArrayTypeP(adatum);/* ensure not toasted */
12111206
if (ARR_NDIM(arr)!=1||
12121207
ARR_HASNULL(arr)||
@@ -1219,10 +1214,8 @@ DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
12191214
if ((Pointer)arr!=DatumGetPointer(adatum))
12201215
pfree(arr);/* free de-toasted copy, if any */
12211216

1222-
adatum=SysCacheGetAttr(CONSTROID,tuple,
1223-
Anum_pg_constraint_confkey,&isNull);
1224-
if (isNull)
1225-
elog(ERROR,"null confkey for constraint %u",constrId);
1217+
adatum=SysCacheGetAttrNotNull(CONSTROID,tuple,
1218+
Anum_pg_constraint_confkey);
12261219
arr=DatumGetArrayTypeP(adatum);/* ensure not toasted */
12271220
if (ARR_NDIM(arr)!=1||
12281221
ARR_DIMS(arr)[0]!=numkeys||
@@ -1235,10 +1228,8 @@ DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
12351228

12361229
if (pf_eq_oprs)
12371230
{
1238-
adatum=SysCacheGetAttr(CONSTROID,tuple,
1239-
Anum_pg_constraint_conpfeqop,&isNull);
1240-
if (isNull)
1241-
elog(ERROR,"null conpfeqop for constraint %u",constrId);
1231+
adatum=SysCacheGetAttrNotNull(CONSTROID,tuple,
1232+
Anum_pg_constraint_conpfeqop);
12421233
arr=DatumGetArrayTypeP(adatum);/* ensure not toasted */
12431234
/* see TryReuseForeignKey if you change the test below */
12441235
if (ARR_NDIM(arr)!=1||
@@ -1253,10 +1244,8 @@ DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
12531244

12541245
if (pp_eq_oprs)
12551246
{
1256-
adatum=SysCacheGetAttr(CONSTROID,tuple,
1257-
Anum_pg_constraint_conppeqop,&isNull);
1258-
if (isNull)
1259-
elog(ERROR,"null conppeqop for constraint %u",constrId);
1247+
adatum=SysCacheGetAttrNotNull(CONSTROID,tuple,
1248+
Anum_pg_constraint_conppeqop);
12601249
arr=DatumGetArrayTypeP(adatum);/* ensure not toasted */
12611250
if (ARR_NDIM(arr)!=1||
12621251
ARR_DIMS(arr)[0]!=numkeys||
@@ -1270,10 +1259,8 @@ DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
12701259

12711260
if (ff_eq_oprs)
12721261
{
1273-
adatum=SysCacheGetAttr(CONSTROID,tuple,
1274-
Anum_pg_constraint_conffeqop,&isNull);
1275-
if (isNull)
1276-
elog(ERROR,"null conffeqop for constraint %u",constrId);
1262+
adatum=SysCacheGetAttrNotNull(CONSTROID,tuple,
1263+
Anum_pg_constraint_conffeqop);
12771264
arr=DatumGetArrayTypeP(adatum);/* ensure not toasted */
12781265
if (ARR_NDIM(arr)!=1||
12791266
ARR_DIMS(arr)[0]!=numkeys||

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp