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

Commita1212d0

Browse files
committed
Fix various confusions of pointers and OIDs, unsafe assumptions about nulls,
etc. I think this will fix the current buildfarm issues ...
1 parentcef8efc commita1212d0

File tree

1 file changed

+32
-17
lines changed

1 file changed

+32
-17
lines changed

‎src/backend/commands/foreigncmds.c

Lines changed: 32 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $PostgreSQL: pgsql/src/backend/commands/foreigncmds.c,v 1.2 2008/12/2009:40:56 heikki Exp $
10+
* $PostgreSQL: pgsql/src/backend/commands/foreigncmds.c,v 1.3 2008/12/2015:51:28 tgl Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -35,6 +35,8 @@
3535
/*
3636
* Convert a DefElem list to the text array format that is used in
3737
* pg_foreign_data_wrapper, pg_foreign_server, and pg_user_mapping.
38+
* Returns the array in the form of a Datum, or PointerGetDatum(NULL)
39+
* if the list is empty.
3840
*
3941
* Note: The array is usually stored to database without further
4042
* processing, hence any validation should be done before this
@@ -45,13 +47,13 @@ optionListToArray(List *options)
4547
{
4648
ArrayBuildState*astate=NULL;
4749
ListCell*cell;
48-
text*t;
4950

50-
foreach(cell,options)
51+
foreach(cell,options)
5152
{
5253
DefElem*def=lfirst(cell);
53-
constchar*value="";
54+
constchar*value;
5455
Sizelen;
56+
text*t;
5557

5658
value=defGetString(def);
5759
len=VARHDRSZ+strlen(def->defname)+1+strlen(value);
@@ -76,6 +78,9 @@ optionListToArray(List *options)
7678
* The result is converted to array of text suitable for storing in
7779
* options.
7880
*
81+
* Returns the array in the form of a Datum, or PointerGetDatum(NULL)
82+
* if the list is empty.
83+
*
7984
* This is used by CREATE/ALTER of FOREIGN DATA WRAPPER/SERVER/USER
8085
* MAPPING. In the ALTER cases, oldOptions is the current text array
8186
* of options.
@@ -90,15 +95,15 @@ transformGenericOptions(Datum oldOptions,
9095
List*resultOptions=untransformRelOptions(oldOptions);
9196
ListCell*optcell;
9297

93-
foreach(optcell,optionDefList)
98+
foreach(optcell,optionDefList)
9499
{
100+
OptionDefElem*od=lfirst(optcell);
95101
ListCell*cell;
96102
ListCell*prev=NULL;
97-
OptionDefElem*od=lfirst(optcell);
98103

99104
/*
100105
* Find the element in resultOptions. We need this for
101-
* validation in all cases.
106+
* validation in all cases. Also identify the previous element.
102107
*/
103108
foreach (cell,resultOptions)
104109
{
@@ -190,7 +195,6 @@ AlterForeignDataWrapperOwner(const char *name, Oid newOwnerId)
190195
HeapTupletup;
191196
Relationrel;
192197
OidfdwId;
193-
194198
Form_pg_foreign_data_wrapperform;
195199

196200
/* Must be a superuser to change a FDW owner */
@@ -345,7 +349,8 @@ CreateForeignDataWrapper(CreateFdwStmt *stmt)
345349
*/
346350
rel=heap_open(ForeignDataWrapperRelationId,RowExclusiveLock);
347351

348-
MemSet(nulls, false,Natts_pg_foreign_data_wrapper);
352+
memset(values,0,sizeof(values));
353+
memset(nulls, false,sizeof(nulls));
349354

350355
values[Anum_pg_foreign_data_wrapper_fdwname-1]=
351356
DirectFunctionCall1(namein,CStringGetDatum(stmt->fdwname));
@@ -359,7 +364,8 @@ CreateForeignDataWrapper(CreateFdwStmt *stmt)
359364
*/
360365
fdwlib=GetForeignDataWrapperLibrary(stmt->library);
361366

362-
fdwoptions=transformGenericOptions(0,stmt->options,FdwOpt,NULL,
367+
fdwoptions=transformGenericOptions(PointerGetDatum(NULL),stmt->options,
368+
FdwOpt,NULL,
363369
fdwlib->validateOptionList);
364370

365371
if (PointerIsValid(DatumGetPointer(fdwoptions)))
@@ -447,6 +453,7 @@ AlterForeignDataWrapper(AlterFdwStmt *stmt)
447453
tp,
448454
Anum_pg_foreign_data_wrapper_fdwlibrary,
449455
&isnull);
456+
Assert(!isnull);
450457
fdwlib=GetForeignDataWrapperLibrary(TextDatumGetCString(datum));
451458
}
452459

@@ -460,13 +467,15 @@ AlterForeignDataWrapper(AlterFdwStmt *stmt)
460467
tp,
461468
Anum_pg_foreign_data_wrapper_fdwoptions,
462469
&isnull);
470+
if (isnull)
471+
datum=PointerGetDatum(NULL);
463472

464473
/* Transform the options */
465474
datum=transformGenericOptions(datum,stmt->options,FdwOpt,
466475
NULL,fdwlib->validateOptionList);
467476

468477
if (PointerIsValid(DatumGetPointer(datum)))
469-
repl_val[Anum_pg_foreign_data_wrapper_fdwoptions-1]=ObjectIdGetDatum(datum);
478+
repl_val[Anum_pg_foreign_data_wrapper_fdwoptions-1]=datum;
470479
else
471480
repl_null[Anum_pg_foreign_data_wrapper_fdwoptions-1]= true;
472481

@@ -603,7 +612,8 @@ CreateForeignServer(CreateForeignServerStmt *stmt)
603612
*/
604613
rel=heap_open(ForeignServerRelationId,RowExclusiveLock);
605614

606-
MemSet(nulls, false,Natts_pg_foreign_server);
615+
memset(values,0,sizeof(values));
616+
memset(nulls, false,sizeof(nulls));
607617

608618
values[Anum_pg_foreign_server_srvname-1]=
609619
DirectFunctionCall1(namein,CStringGetDatum(stmt->servername));
@@ -628,7 +638,8 @@ CreateForeignServer(CreateForeignServerStmt *stmt)
628638
nulls[Anum_pg_foreign_server_srvacl-1]= true;
629639

630640
/* Add server options */
631-
srvoptions=transformGenericOptions(0,stmt->options,ServerOpt,fdw,
641+
srvoptions=transformGenericOptions(PointerGetDatum(NULL),stmt->options,
642+
ServerOpt,fdw,
632643
fdw->lib->validateOptionList);
633644

634645
if (PointerIsValid(DatumGetPointer(srvoptions)))
@@ -722,6 +733,8 @@ AlterForeignServer(AlterForeignServerStmt *stmt)
722733
tp,
723734
Anum_pg_foreign_server_srvoptions,
724735
&isnull);
736+
if (isnull)
737+
datum=PointerGetDatum(NULL);
725738

726739
/* Prepare the options array */
727740
datum=transformGenericOptions(datum,stmt->options,ServerOpt,
@@ -868,13 +881,15 @@ CreateUserMapping(CreateUserMappingStmt *stmt)
868881
*/
869882
rel=heap_open(UserMappingRelationId,RowExclusiveLock);
870883

871-
MemSet(nulls, false,Natts_pg_user_mapping);
884+
memset(values,0,sizeof(values));
885+
memset(nulls, false,sizeof(nulls));
872886

873887
values[Anum_pg_user_mapping_umuser-1]=ObjectIdGetDatum(useId);
874888
values[Anum_pg_user_mapping_umserver-1]=ObjectIdGetDatum(srv->serverid);
875889

876890
/* Add user options */
877-
useoptions=transformGenericOptions(0,stmt->options,UserMappingOpt,
891+
useoptions=transformGenericOptions(PointerGetDatum(NULL),stmt->options,
892+
UserMappingOpt,
878893
fdw,fdw->lib->validateOptionList);
879894

880895
if (PointerIsValid(DatumGetPointer(useoptions)))
@@ -931,12 +946,10 @@ AlterUserMapping(AlterUserMappingStmt *stmt)
931946
ObjectIdGetDatum(srv->serverid),
932947
0,0);
933948
if (!OidIsValid(umId))
934-
{
935949
ereport(ERROR,
936950
(errcode(ERRCODE_UNDEFINED_OBJECT),
937951
errmsg("user mapping \"%s\" does not exist for the server",
938952
MappingUserName(useId))));
939-
}
940953

941954
/*
942955
* Must be owner of the server to alter user mapping.
@@ -972,6 +985,8 @@ AlterUserMapping(AlterUserMappingStmt *stmt)
972985
tp,
973986
Anum_pg_user_mapping_umoptions,
974987
&isnull);
988+
if (isnull)
989+
datum=PointerGetDatum(NULL);
975990

976991
/* Prepare the options array */
977992
datum=transformGenericOptions(datum,stmt->options,UserMappingOpt,

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp