From 375e5b0a687570eb41fb9e9fda9e5d6992fccffa Mon Sep 17 00:00:00 2001 From: Tom Lane <tgl@sss.pgh.pa.us> Date: Tue, 8 Feb 2011 18:12:17 -0500 Subject: [PATCH] Suppress some compiler warnings in recent commits. Older versions of gcc tend to throw "variable might be clobbered by `longjmp' or `vfork'" warnings whenever a variable is assigned in more than one place and then used after the end of a PG_TRY block. That's reasonably easy to work around in execute_extension_script, and the overhead of unconditionally saving/restoring the GUC variables seems unlikely to be a serious concern. Also clean up logic in ATExecValidateConstraint to make it easier to read and less likely to provoke "variable might be used uninitialized in this function" warnings. --- src/backend/commands/extension.c | 31 +++++++++++--------------- src/backend/commands/tablecmds.c | 37 ++++++++++++++++---------------- 2 files changed, 30 insertions(+), 38 deletions(-) diff --git a/src/backend/commands/extension.c b/src/backend/commands/extension.c index 50032031976..ee42d2e13df 100644 --- a/src/backend/commands/extension.c +++ b/src/backend/commands/extension.c @@ -521,8 +521,8 @@ execute_extension_script(Oid extensionOid, ExtensionControlFile *control, const char *schemaName, Oid schemaOid) { char *filename = get_extension_absolute_path(control->script); - char *save_client_min_messages = NULL, - *save_log_min_messages = NULL, + char *save_client_min_messages, + *save_log_min_messages, *save_search_path; StringInfoData pathbuf; ListCell *lc; @@ -535,23 +535,19 @@ execute_extension_script(Oid extensionOid, ExtensionControlFile *control, * We use the equivalent of SET LOCAL to ensure the setting is undone * upon error. */ + save_client_min_messages = + pstrdup(GetConfigOption("client_min_messages", false)); if (client_min_messages < WARNING) - { - save_client_min_messages = - pstrdup(GetConfigOption("client_min_messages", false)); (void) set_config_option("client_min_messages", "warning", PGC_USERSET, PGC_S_SESSION, GUC_ACTION_LOCAL, true); - } + save_log_min_messages = + pstrdup(GetConfigOption("log_min_messages", false)); if (log_min_messages < WARNING) - { - save_log_min_messages = - pstrdup(GetConfigOption("log_min_messages", false)); (void) set_config_option("log_min_messages", "warning", PGC_SUSET, PGC_S_SESSION, GUC_ACTION_LOCAL, true); - } /* * Set up the search path to contain the target schema, then the schemas @@ -631,15 +627,12 @@ execute_extension_script(Oid extensionOid, ExtensionControlFile *control, (void) set_config_option("search_path", save_search_path, PGC_USERSET, PGC_S_SESSION, GUC_ACTION_LOCAL, true); - - if (save_client_min_messages != NULL) - (void) set_config_option("client_min_messages", save_client_min_messages, - PGC_USERSET, PGC_S_SESSION, - GUC_ACTION_LOCAL, true); - if (save_log_min_messages != NULL) - (void) set_config_option("log_min_messages", save_log_min_messages, - PGC_SUSET, PGC_S_SESSION, - GUC_ACTION_LOCAL, true); + (void) set_config_option("client_min_messages", save_client_min_messages, + PGC_USERSET, PGC_S_SESSION, + GUC_ACTION_LOCAL, true); + (void) set_config_option("log_min_messages", save_log_min_messages, + PGC_SUSET, PGC_S_SESSION, + GUC_ACTION_LOCAL, true); } /* diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index f67e9b9b162..9c812397b1e 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -5612,17 +5612,16 @@ static void ATExecValidateConstraint(Relation rel, const char *constrName) { Relation conrel; - Form_pg_constraint con; SysScanDesc scan; ScanKeyData key; HeapTuple tuple; + Form_pg_constraint con = NULL; bool found = false; - Oid conid; conrel = heap_open(ConstraintRelationId, RowExclusiveLock); /* - * Find and the target constraint + * Find and check the target constraint */ ScanKeyInit(&key, Anum_pg_constraint_conrelid, @@ -5634,17 +5633,23 @@ ATExecValidateConstraint(Relation rel, const char *constrName) while (HeapTupleIsValid(tuple = systable_getnext(scan))) { con = (Form_pg_constraint) GETSTRUCT(tuple); - - if (strcmp(NameStr(con->conname), constrName) != 0) - continue; - - conid = HeapTupleGetOid(tuple); - found = true; - break; + if (con->contype == CONSTRAINT_FOREIGN && + strcmp(NameStr(con->conname), constrName) == 0) + { + found = true; + break; + } } - if (found && con->contype == CONSTRAINT_FOREIGN && !con->convalidated) + if (!found) + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("foreign key constraint \"%s\" of relation \"%s\" does not exist", + constrName, RelationGetRelationName(rel)))); + + if (!con->convalidated) { + Oid conid = HeapTupleGetOid(tuple); HeapTuple copyTuple = heap_copytuple(tuple); Form_pg_constraint copy_con = (Form_pg_constraint) GETSTRUCT(copyTuple); Relation refrel; @@ -5671,19 +5676,13 @@ ATExecValidateConstraint(Relation rel, const char *constrName) simple_heap_update(conrel, ©Tuple->t_self, copyTuple); CatalogUpdateIndexes(conrel, copyTuple); heap_freetuple(copyTuple); + heap_close(refrel, NoLock); } systable_endscan(scan); - heap_close(conrel, RowExclusiveLock); - if (!found) - { - ereport(ERROR, - (errcode(ERRCODE_UNDEFINED_OBJECT), - errmsg("foreign key constraint \"%s\" of relation \"%s\" does not exist", - constrName, RelationGetRelationName(rel)))); - } + heap_close(conrel, RowExclusiveLock); } /* -- GitLab