diff --git a/src/backend/commands/extension.c b/src/backend/commands/extension.c index 50032031976d8a2d2086f57620caf25afb79b100..ee42d2e13df63c2c16f547ead33b689c31bbc0c3 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 f67e9b9b16290f496f8d4343cbfd6a0f19c5f544..9c812397b1e5fa3614a11fb95f535bf014aaf9df 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); } /*