*** a/doc/src/sgml/ref/pg_dump.sgml
--- b/doc/src/sgml/ref/pg_dump.sgml
***************
*** 592,597 **** PostgreSQL documentation
--- 592,607 ----
       </varlistentry>
  
       <varlistentry>
+       <term><option>--conditional-drops</option></term>
+       <listitem>
+        <para>
+         It use conditional commands (with <literal>IF EXISTS</literal>
+         clause) for cleaning database schema.
+        </para>
+       </listitem>
+      </varlistentry>
+ 
+      <varlistentry>
        <term><option>--disable-dollar-quoting</></term>
        <listitem>
         <para>
*** a/doc/src/sgml/ref/pg_dumpall.sgml
--- b/doc/src/sgml/ref/pg_dumpall.sgml
***************
*** 270,275 **** PostgreSQL documentation
--- 270,285 ----
       </varlistentry>
  
       <varlistentry>
+       <term><option>--conditional-drops</option></term>
+       <listitem>
+        <para>
+         It use conditional commands (with <literal>IF EXISTS</literal>
+         clause) for cleaning database schema.
+        </para>
+       </listitem>
+      </varlistentry>
+ 
+      <varlistentry>
        <term><option>--disable-dollar-quoting</></term>
        <listitem>
         <para>
*** a/src/bin/pg_dump/pg_dump.c
--- b/src/bin/pg_dump/pg_dump.c
***************
*** 137,142 **** static int	column_inserts = 0;
--- 137,143 ----
  static int	no_security_labels = 0;
  static int	no_unlogged_table_data = 0;
  static int	serializable_deferrable = 0;
+ static int	conditional_drops = 0;
  
  
  static void help(const char *progname);
***************
*** 338,343 **** main(int argc, char **argv)
--- 339,345 ----
  		{"attribute-inserts", no_argument, &column_inserts, 1},
  		{"binary-upgrade", no_argument, &binary_upgrade, 1},
  		{"column-inserts", no_argument, &column_inserts, 1},
+ 		{"conditional-drops", no_argument, &conditional_drops, 1},
  		{"disable-dollar-quoting", no_argument, &disable_dollar_quoting, 1},
  		{"disable-triggers", no_argument, &disable_triggers, 1},
  		{"exclude-table-data", required_argument, NULL, 4},
***************
*** 857,862 **** help(const char *progname)
--- 859,865 ----
  	printf(_("  -x, --no-privileges          do not dump privileges (grant/revoke)\n"));
  	printf(_("  --binary-upgrade             for use by upgrade utilities only\n"));
  	printf(_("  --column-inserts             dump data as INSERT commands with column names\n"));
+ 	printf(_("  --conditional-drops          use conditional drop commands for cleaning\n"));
  	printf(_("  --disable-dollar-quoting     disable dollar quoting, use SQL standard quoting\n"));
  	printf(_("  --disable-triggers           disable triggers during data-only restore\n"));
  	printf(_("  --exclude-table-data=TABLE   do NOT dump data for the named table(s)\n"));
***************
*** 1987,1993 **** dumpDatabase(Archive *fout)
  
  	}
  
! 	appendPQExpBuffer(delQry, "DROP DATABASE %s;\n",
  					  fmtId(datname));
  
  	dbDumpId = createDumpId();
--- 1990,1997 ----
  
  	}
  
! 	appendPQExpBuffer(delQry, "DROP DATABASE %s%s;\n",
! 					  conditional_drops ? "IF EXISTS " : "",
  					  fmtId(datname));
  
  	dbDumpId = createDumpId();
***************
*** 7431,7437 **** dumpNamespace(Archive *fout, NamespaceInfo *nspinfo)
  
  	qnspname = pg_strdup(fmtId(nspinfo->dobj.name));
  
! 	appendPQExpBuffer(delq, "DROP SCHEMA %s;\n", qnspname);
  
  	appendPQExpBuffer(q, "CREATE SCHEMA %s;\n", qnspname);
  
--- 7435,7443 ----
  
  	qnspname = pg_strdup(fmtId(nspinfo->dobj.name));
  
! 	appendPQExpBuffer(delq, "DROP SCHEMA %s%s;\n",
! 						    conditional_drops ? "IF EXISTS " : "",
! 						    qnspname);
  
  	appendPQExpBuffer(q, "CREATE SCHEMA %s;\n", qnspname);
  
***************
*** 7490,7496 **** dumpExtension(Archive *fout, ExtensionInfo *extinfo)
  
  	qextname = pg_strdup(fmtId(extinfo->dobj.name));
  
! 	appendPQExpBuffer(delq, "DROP EXTENSION %s;\n", qextname);
  
  	if (!binary_upgrade)
  	{
--- 7496,7504 ----
  
  	qextname = pg_strdup(fmtId(extinfo->dobj.name));
  
! 	appendPQExpBuffer(delq, "DROP EXTENSION %s%s;\n",
! 						    conditional_drops ? "IF EXISTS " : "",
! 						    qextname);
  
  	if (!binary_upgrade)
  	{
***************
*** 7664,7670 **** dumpEnumType(Archive *fout, TypeInfo *tyinfo)
  	 * CASCADE shouldn't be required here as for normal types since the I/O
  	 * functions are generic and do not get dropped.
  	 */
! 	appendPQExpBuffer(delq, "DROP TYPE %s.",
  					  fmtId(tyinfo->dobj.namespace->dobj.name));
  	appendPQExpBuffer(delq, "%s;\n",
  					  qtypname);
--- 7672,7679 ----
  	 * CASCADE shouldn't be required here as for normal types since the I/O
  	 * functions are generic and do not get dropped.
  	 */
! 	appendPQExpBuffer(delq, "DROP TYPE %s%s.",
! 					  conditional_drops ? "IF EXISTS " : "",
  					  fmtId(tyinfo->dobj.namespace->dobj.name));
  	appendPQExpBuffer(delq, "%s;\n",
  					  qtypname);
***************
*** 7794,7800 **** dumpRangeType(Archive *fout, TypeInfo *tyinfo)
  	 * CASCADE shouldn't be required here as for normal types since the I/O
  	 * functions are generic and do not get dropped.
  	 */
! 	appendPQExpBuffer(delq, "DROP TYPE %s.",
  					  fmtId(tyinfo->dobj.namespace->dobj.name));
  	appendPQExpBuffer(delq, "%s;\n",
  					  qtypname);
--- 7803,7810 ----
  	 * CASCADE shouldn't be required here as for normal types since the I/O
  	 * functions are generic and do not get dropped.
  	 */
! 	appendPQExpBuffer(delq, "DROP TYPE %s%s.",
! 					  conditional_drops ? "IF EXISTS " : "",
  					  fmtId(tyinfo->dobj.namespace->dobj.name));
  	appendPQExpBuffer(delq, "%s;\n",
  					  qtypname);
***************
*** 8134,8140 **** dumpBaseType(Archive *fout, TypeInfo *tyinfo)
  	 * the type and its I/O functions makes it impossible to drop the type any
  	 * other way.
  	 */
! 	appendPQExpBuffer(delq, "DROP TYPE %s.",
  					  fmtId(tyinfo->dobj.namespace->dobj.name));
  	appendPQExpBuffer(delq, "%s CASCADE;\n",
  					  qtypname);
--- 8144,8151 ----
  	 * the type and its I/O functions makes it impossible to drop the type any
  	 * other way.
  	 */
! 	appendPQExpBuffer(delq, "DROP TYPE %s%s.",
! 					  conditional_drops ? "IF EXISTS " : "",
  					  fmtId(tyinfo->dobj.namespace->dobj.name));
  	appendPQExpBuffer(delq, "%s CASCADE;\n",
  					  qtypname);
***************
*** 8394,8400 **** dumpDomain(Archive *fout, TypeInfo *tyinfo)
  	/*
  	 * DROP must be fully qualified in case same name appears in pg_catalog
  	 */
! 	appendPQExpBuffer(delq, "DROP DOMAIN %s.",
  					  fmtId(tyinfo->dobj.namespace->dobj.name));
  	appendPQExpBuffer(delq, "%s;\n",
  					  qtypname);
--- 8405,8412 ----
  	/*
  	 * DROP must be fully qualified in case same name appears in pg_catalog
  	 */
! 	appendPQExpBuffer(delq, "DROP DOMAIN %s%s.",
! 					  conditional_drops ? "IF EXISTS " : "",
  					  fmtId(tyinfo->dobj.namespace->dobj.name));
  	appendPQExpBuffer(delq, "%s;\n",
  					  qtypname);
***************
*** 8609,8615 **** dumpCompositeType(Archive *fout, TypeInfo *tyinfo)
  	/*
  	 * DROP must be fully qualified in case same name appears in pg_catalog
  	 */
! 	appendPQExpBuffer(delq, "DROP TYPE %s.",
  					  fmtId(tyinfo->dobj.namespace->dobj.name));
  	appendPQExpBuffer(delq, "%s;\n",
  					  qtypname);
--- 8621,8628 ----
  	/*
  	 * DROP must be fully qualified in case same name appears in pg_catalog
  	 */
! 	appendPQExpBuffer(delq, "DROP TYPE %s%s.",
! 					  conditional_drops ? "IF EXISTS " : "",
  					  fmtId(tyinfo->dobj.namespace->dobj.name));
  	appendPQExpBuffer(delq, "%s;\n",
  					  qtypname);
***************
*** 8920,8926 **** dumpProcLang(Archive *fout, ProcLangInfo *plang)
  	else
  		lanschema = NULL;
  
! 	appendPQExpBuffer(delqry, "DROP PROCEDURAL LANGUAGE %s;\n",
  					  qlanname);
  
  	if (useParams)
--- 8933,8940 ----
  	else
  		lanschema = NULL;
  
! 	appendPQExpBuffer(delqry, "DROP PROCEDURAL LANGUAGE %s%s;\n",
! 					  conditional_drops ? "IF EXISTS " : "",
  					  qlanname);
  
  	if (useParams)
***************
*** 9461,9467 **** dumpFunc(Archive *fout, FuncInfo *finfo)
  	/*
  	 * DROP must be fully qualified in case same name appears in pg_catalog
  	 */
! 	appendPQExpBuffer(delqry, "DROP FUNCTION %s.%s;\n",
  					  fmtId(finfo->dobj.namespace->dobj.name),
  					  funcsig);
  
--- 9475,9482 ----
  	/*
  	 * DROP must be fully qualified in case same name appears in pg_catalog
  	 */
! 	appendPQExpBuffer(delqry, "DROP FUNCTION %s%s.%s;\n",
! 					  conditional_drops ? "IF EXISTS " : "",
  					  fmtId(finfo->dobj.namespace->dobj.name),
  					  funcsig);
  
***************
*** 9679,9685 **** dumpCast(Archive *fout, CastInfo *cast)
  	delqry = createPQExpBuffer();
  	labelq = createPQExpBuffer();
  
! 	appendPQExpBuffer(delqry, "DROP CAST (%s AS %s);\n",
  					getFormattedTypeName(fout, cast->castsource, zeroAsNone),
  				   getFormattedTypeName(fout, cast->casttarget, zeroAsNone));
  
--- 9694,9701 ----
  	delqry = createPQExpBuffer();
  	labelq = createPQExpBuffer();
  
! 	appendPQExpBuffer(delqry, "DROP CAST %s(%s AS %s);\n",
! 					conditional_drops ? "IF EXISTS " : "",
  					getFormattedTypeName(fout, cast->castsource, zeroAsNone),
  				   getFormattedTypeName(fout, cast->casttarget, zeroAsNone));
  
***************
*** 9949,9955 **** dumpOpr(Archive *fout, OprInfo *oprinfo)
  	/*
  	 * DROP must be fully qualified in case same name appears in pg_catalog
  	 */
! 	appendPQExpBuffer(delq, "DROP OPERATOR %s.%s;\n",
  					  fmtId(oprinfo->dobj.namespace->dobj.name),
  					  oprid->data);
  
--- 9965,9972 ----
  	/*
  	 * DROP must be fully qualified in case same name appears in pg_catalog
  	 */
! 	appendPQExpBuffer(delq, "DROP OPERATOR %s%s.%s;\n",
! 					  conditional_drops ? "IF EXISTS " : "",
  					  fmtId(oprinfo->dobj.namespace->dobj.name),
  					  oprid->data);
  
***************
*** 10235,10241 **** dumpOpclass(Archive *fout, OpclassInfo *opcinfo)
  	/*
  	 * DROP must be fully qualified in case same name appears in pg_catalog
  	 */
! 	appendPQExpBuffer(delq, "DROP OPERATOR CLASS %s",
  					  fmtId(opcinfo->dobj.namespace->dobj.name));
  	appendPQExpBuffer(delq, ".%s",
  					  fmtId(opcinfo->dobj.name));
--- 10252,10259 ----
  	/*
  	 * DROP must be fully qualified in case same name appears in pg_catalog
  	 */
! 	appendPQExpBuffer(delq, "DROP OPERATOR CLASS %s%s",
! 					  conditional_drops ? "IF EXISTS " : "",
  					  fmtId(opcinfo->dobj.namespace->dobj.name));
  	appendPQExpBuffer(delq, ".%s",
  					  fmtId(opcinfo->dobj.name));
***************
*** 10679,10685 **** dumpOpfamily(Archive *fout, OpfamilyInfo *opfinfo)
  	/*
  	 * DROP must be fully qualified in case same name appears in pg_catalog
  	 */
! 	appendPQExpBuffer(delq, "DROP OPERATOR FAMILY %s",
  					  fmtId(opfinfo->dobj.namespace->dobj.name));
  	appendPQExpBuffer(delq, ".%s",
  					  fmtId(opfinfo->dobj.name));
--- 10697,10704 ----
  	/*
  	 * DROP must be fully qualified in case same name appears in pg_catalog
  	 */
! 	appendPQExpBuffer(delq, "DROP OPERATOR FAMILY %s%s",
! 					  conditional_drops ? "IF EXISTS " : "",
  					  fmtId(opfinfo->dobj.namespace->dobj.name));
  	appendPQExpBuffer(delq, ".%s",
  					  fmtId(opfinfo->dobj.name));
***************
*** 10853,10859 **** dumpCollation(Archive *fout, CollInfo *collinfo)
  	/*
  	 * DROP must be fully qualified in case same name appears in pg_catalog
  	 */
! 	appendPQExpBuffer(delq, "DROP COLLATION %s",
  					  fmtId(collinfo->dobj.namespace->dobj.name));
  	appendPQExpBuffer(delq, ".%s;\n",
  					  fmtId(collinfo->dobj.name));
--- 10872,10879 ----
  	/*
  	 * DROP must be fully qualified in case same name appears in pg_catalog
  	 */
! 	appendPQExpBuffer(delq, "DROP COLLATION %s%s",
! 					  conditional_drops ? "IF EXISTS " : "",
  					  fmtId(collinfo->dobj.namespace->dobj.name));
  	appendPQExpBuffer(delq, ".%s;\n",
  					  fmtId(collinfo->dobj.name));
***************
*** 10950,10956 **** dumpConversion(Archive *fout, ConvInfo *convinfo)
  	/*
  	 * DROP must be fully qualified in case same name appears in pg_catalog
  	 */
! 	appendPQExpBuffer(delq, "DROP CONVERSION %s",
  					  fmtId(convinfo->dobj.namespace->dobj.name));
  	appendPQExpBuffer(delq, ".%s;\n",
  					  fmtId(convinfo->dobj.name));
--- 10970,10977 ----
  	/*
  	 * DROP must be fully qualified in case same name appears in pg_catalog
  	 */
! 	appendPQExpBuffer(delq, "DROP CONVERSION %s%s",
! 					  conditional_drops ? "IF EXISTS " : "",
  					  fmtId(convinfo->dobj.namespace->dobj.name));
  	appendPQExpBuffer(delq, ".%s;\n",
  					  fmtId(convinfo->dobj.name));
***************
*** 11194,11200 **** dumpAgg(Archive *fout, AggInfo *agginfo)
  	/*
  	 * DROP must be fully qualified in case same name appears in pg_catalog
  	 */
! 	appendPQExpBuffer(delq, "DROP AGGREGATE %s.%s;\n",
  					  fmtId(agginfo->aggfn.dobj.namespace->dobj.name),
  					  aggsig);
  
--- 11215,11222 ----
  	/*
  	 * DROP must be fully qualified in case same name appears in pg_catalog
  	 */
! 	appendPQExpBuffer(delq, "DROP AGGREGATE %s%s.%s;\n",
! 					  conditional_drops ? "IF EXISTS " : "",
  					  fmtId(agginfo->aggfn.dobj.namespace->dobj.name),
  					  aggsig);
  
***************
*** 11293,11299 **** dumpTSParser(Archive *fout, TSParserInfo *prsinfo)
  	/*
  	 * DROP must be fully qualified in case same name appears in pg_catalog
  	 */
! 	appendPQExpBuffer(delq, "DROP TEXT SEARCH PARSER %s",
  					  fmtId(prsinfo->dobj.namespace->dobj.name));
  	appendPQExpBuffer(delq, ".%s;\n",
  					  fmtId(prsinfo->dobj.name));
--- 11315,11322 ----
  	/*
  	 * DROP must be fully qualified in case same name appears in pg_catalog
  	 */
! 	appendPQExpBuffer(delq, "DROP TEXT SEARCH PARSER %s%s",
! 					  conditional_drops ? "IF EXISTS " : "",
  					  fmtId(prsinfo->dobj.namespace->dobj.name));
  	appendPQExpBuffer(delq, ".%s;\n",
  					  fmtId(prsinfo->dobj.name));
***************
*** 11380,11386 **** dumpTSDictionary(Archive *fout, TSDictInfo *dictinfo)
  	/*
  	 * DROP must be fully qualified in case same name appears in pg_catalog
  	 */
! 	appendPQExpBuffer(delq, "DROP TEXT SEARCH DICTIONARY %s",
  					  fmtId(dictinfo->dobj.namespace->dobj.name));
  	appendPQExpBuffer(delq, ".%s;\n",
  					  fmtId(dictinfo->dobj.name));
--- 11403,11410 ----
  	/*
  	 * DROP must be fully qualified in case same name appears in pg_catalog
  	 */
! 	appendPQExpBuffer(delq, "DROP TEXT SEARCH DICTIONARY %s%s",
! 					  conditional_drops ? "IF EXISTS " : "",
  					  fmtId(dictinfo->dobj.namespace->dobj.name));
  	appendPQExpBuffer(delq, ".%s;\n",
  					  fmtId(dictinfo->dobj.name));
***************
*** 11446,11452 **** dumpTSTemplate(Archive *fout, TSTemplateInfo *tmplinfo)
  	/*
  	 * DROP must be fully qualified in case same name appears in pg_catalog
  	 */
! 	appendPQExpBuffer(delq, "DROP TEXT SEARCH TEMPLATE %s",
  					  fmtId(tmplinfo->dobj.namespace->dobj.name));
  	appendPQExpBuffer(delq, ".%s;\n",
  					  fmtId(tmplinfo->dobj.name));
--- 11470,11477 ----
  	/*
  	 * DROP must be fully qualified in case same name appears in pg_catalog
  	 */
! 	appendPQExpBuffer(delq, "DROP TEXT SEARCH TEMPLATE %s%s",
! 					  conditional_drops ? "IF EXISTS " : "",
  					  fmtId(tmplinfo->dobj.namespace->dobj.name));
  	appendPQExpBuffer(delq, ".%s;\n",
  					  fmtId(tmplinfo->dobj.name));
***************
*** 11574,11580 **** dumpTSConfig(Archive *fout, TSConfigInfo *cfginfo)
  	/*
  	 * DROP must be fully qualified in case same name appears in pg_catalog
  	 */
! 	appendPQExpBuffer(delq, "DROP TEXT SEARCH CONFIGURATION %s",
  					  fmtId(cfginfo->dobj.namespace->dobj.name));
  	appendPQExpBuffer(delq, ".%s;\n",
  					  fmtId(cfginfo->dobj.name));
--- 11599,11606 ----
  	/*
  	 * DROP must be fully qualified in case same name appears in pg_catalog
  	 */
! 	appendPQExpBuffer(delq, "DROP TEXT SEARCH CONFIGURATION %s%s",
! 					  conditional_drops ? "IF EXISTS " : "",
  					  fmtId(cfginfo->dobj.namespace->dobj.name));
  	appendPQExpBuffer(delq, ".%s;\n",
  					  fmtId(cfginfo->dobj.name));
***************
*** 11650,11656 **** dumpForeignDataWrapper(Archive *fout, FdwInfo *fdwinfo)
  
  	appendPQExpBuffer(q, ";\n");
  
! 	appendPQExpBuffer(delq, "DROP FOREIGN DATA WRAPPER %s;\n",
  					  qfdwname);
  
  	appendPQExpBuffer(labelq, "FOREIGN DATA WRAPPER %s",
--- 11676,11683 ----
  
  	appendPQExpBuffer(q, ";\n");
  
! 	appendPQExpBuffer(delq, "DROP FOREIGN DATA WRAPPER %s%s;\n",
! 					  conditional_drops ? "IF EXISTS " : "",
  					  qfdwname);
  
  	appendPQExpBuffer(labelq, "FOREIGN DATA WRAPPER %s",
***************
*** 11743,11749 **** dumpForeignServer(Archive *fout, ForeignServerInfo *srvinfo)
  
  	appendPQExpBuffer(q, ";\n");
  
! 	appendPQExpBuffer(delq, "DROP SERVER %s;\n",
  					  qsrvname);
  
  	appendPQExpBuffer(labelq, "SERVER %s", qsrvname);
--- 11770,11777 ----
  
  	appendPQExpBuffer(q, ";\n");
  
! 	appendPQExpBuffer(delq, "DROP SERVER %s%s;\n",
! 					  conditional_drops ? "IF EXISTS " : "",
  					  qsrvname);
  
  	appendPQExpBuffer(labelq, "SERVER %s", qsrvname);
***************
*** 11861,11867 **** dumpUserMappings(Archive *fout,
  		appendPQExpBuffer(q, ";\n");
  
  		resetPQExpBuffer(delq);
! 		appendPQExpBuffer(delq, "DROP USER MAPPING FOR %s", fmtId(usename));
  		appendPQExpBuffer(delq, " SERVER %s;\n", fmtId(servername));
  
  		resetPQExpBuffer(tag);
--- 11889,11897 ----
  		appendPQExpBuffer(q, ";\n");
  
  		resetPQExpBuffer(delq);
! 		appendPQExpBuffer(delq, "DROP USER MAPPING %sFOR %s",
! 							    conditional_drops ? "IF EXISTS " : "",
! 							    fmtId(usename));
  		appendPQExpBuffer(delq, " SERVER %s;\n", fmtId(servername));
  
  		resetPQExpBuffer(tag);
***************
*** 12448,12454 **** dumpTableSchema(Archive *fout, TableInfo *tbinfo)
  		 * DROP must be fully qualified in case same name appears in
  		 * pg_catalog
  		 */
! 		appendPQExpBuffer(delq, "DROP VIEW %s.",
  						  fmtId(tbinfo->dobj.namespace->dobj.name));
  		appendPQExpBuffer(delq, "%s;\n",
  						  fmtId(tbinfo->dobj.name));
--- 12478,12485 ----
  		 * DROP must be fully qualified in case same name appears in
  		 * pg_catalog
  		 */
! 		appendPQExpBuffer(delq, "DROP VIEW %s%s.",
! 						  conditional_drops ? "IF EXISTS " : "",
  						  fmtId(tbinfo->dobj.namespace->dobj.name));
  		appendPQExpBuffer(delq, "%s;\n",
  						  fmtId(tbinfo->dobj.name));
***************
*** 12510,12516 **** dumpTableSchema(Archive *fout, TableInfo *tbinfo)
  		 * DROP must be fully qualified in case same name appears in
  		 * pg_catalog
  		 */
! 		appendPQExpBuffer(delq, "DROP %s %s.", reltypename,
  						  fmtId(tbinfo->dobj.namespace->dobj.name));
  		appendPQExpBuffer(delq, "%s;\n",
  						  fmtId(tbinfo->dobj.name));
--- 12541,12548 ----
  		 * DROP must be fully qualified in case same name appears in
  		 * pg_catalog
  		 */
! 		appendPQExpBuffer(delq, "DROP %s %s%s.", reltypename,
! 						  conditional_drops ? "IF EXISTS " : "",
  						  fmtId(tbinfo->dobj.namespace->dobj.name));
  		appendPQExpBuffer(delq, "%s;\n",
  						  fmtId(tbinfo->dobj.name));
***************
*** 13002,13008 **** dumpAttrDef(Archive *fout, AttrDefInfo *adinfo)
  	/*
  	 * DROP must be fully qualified in case same name appears in pg_catalog
  	 */
! 	appendPQExpBuffer(delq, "ALTER TABLE %s.",
  					  fmtId(tbinfo->dobj.namespace->dobj.name));
  	appendPQExpBuffer(delq, "%s ",
  					  fmtId(tbinfo->dobj.name));
--- 13034,13041 ----
  	/*
  	 * DROP must be fully qualified in case same name appears in pg_catalog
  	 */
! 	appendPQExpBuffer(delq, "ALTER TABLE %s%s.",
! 					  conditional_drops ? "IF EXISTS " : "",
  					  fmtId(tbinfo->dobj.namespace->dobj.name));
  	appendPQExpBuffer(delq, "%s ",
  					  fmtId(tbinfo->dobj.name));
***************
*** 13106,13112 **** dumpIndex(Archive *fout, IndxInfo *indxinfo)
  		 * DROP must be fully qualified in case same name appears in
  		 * pg_catalog
  		 */
! 		appendPQExpBuffer(delq, "DROP INDEX %s.",
  						  fmtId(tbinfo->dobj.namespace->dobj.name));
  		appendPQExpBuffer(delq, "%s;\n",
  						  fmtId(indxinfo->dobj.name));
--- 13139,13146 ----
  		 * DROP must be fully qualified in case same name appears in
  		 * pg_catalog
  		 */
! 		appendPQExpBuffer(delq, "DROP INDEX %s%s.",
! 						  conditional_drops ? "IF EXISTS " : "",
  						  fmtId(tbinfo->dobj.namespace->dobj.name));
  		appendPQExpBuffer(delq, "%s;\n",
  						  fmtId(indxinfo->dobj.name));
***************
*** 13225,13231 **** dumpConstraint(Archive *fout, ConstraintInfo *coninfo)
  		 * DROP must be fully qualified in case same name appears in
  		 * pg_catalog
  		 */
! 		appendPQExpBuffer(delq, "ALTER TABLE ONLY %s.",
  						  fmtId(tbinfo->dobj.namespace->dobj.name));
  		appendPQExpBuffer(delq, "%s ",
  						  fmtId(tbinfo->dobj.name));
--- 13259,13266 ----
  		 * DROP must be fully qualified in case same name appears in
  		 * pg_catalog
  		 */
! 		appendPQExpBuffer(delq, "ALTER TABLE %sONLY %s.",
! 						  conditional_drops ? "IF EXISTS " : "",
  						  fmtId(tbinfo->dobj.namespace->dobj.name));
  		appendPQExpBuffer(delq, "%s ",
  						  fmtId(tbinfo->dobj.name));
***************
*** 13258,13264 **** dumpConstraint(Archive *fout, ConstraintInfo *coninfo)
  		 * DROP must be fully qualified in case same name appears in
  		 * pg_catalog
  		 */
! 		appendPQExpBuffer(delq, "ALTER TABLE ONLY %s.",
  						  fmtId(tbinfo->dobj.namespace->dobj.name));
  		appendPQExpBuffer(delq, "%s ",
  						  fmtId(tbinfo->dobj.name));
--- 13293,13300 ----
  		 * DROP must be fully qualified in case same name appears in
  		 * pg_catalog
  		 */
! 		appendPQExpBuffer(delq, "ALTER TABLE %sONLY %s.",
! 						  conditional_drops ? "IF EXISTS " : "",
  						  fmtId(tbinfo->dobj.namespace->dobj.name));
  		appendPQExpBuffer(delq, "%s ",
  						  fmtId(tbinfo->dobj.name));
***************
*** 13527,13533 **** dumpSequence(Archive *fout, TableInfo *tbinfo)
  	/*
  	 * DROP must be fully qualified in case same name appears in pg_catalog
  	 */
! 	appendPQExpBuffer(delqry, "DROP SEQUENCE %s.",
  					  fmtId(tbinfo->dobj.namespace->dobj.name));
  	appendPQExpBuffer(delqry, "%s;\n",
  					  fmtId(tbinfo->dobj.name));
--- 13563,13570 ----
  	/*
  	 * DROP must be fully qualified in case same name appears in pg_catalog
  	 */
! 	appendPQExpBuffer(delqry, "DROP SEQUENCE %s%s.",
! 					  conditional_drops ? "IF EXISTS " : "",
  					  fmtId(tbinfo->dobj.namespace->dobj.name));
  	appendPQExpBuffer(delqry, "%s;\n",
  					  fmtId(tbinfo->dobj.name));
***************
*** 13715,13721 **** dumpTrigger(Archive *fout, TriggerInfo *tginfo)
  	/*
  	 * DROP must be fully qualified in case same name appears in pg_catalog
  	 */
! 	appendPQExpBuffer(delqry, "DROP TRIGGER %s ",
  					  fmtId(tginfo->dobj.name));
  	appendPQExpBuffer(delqry, "ON %s.",
  					  fmtId(tbinfo->dobj.namespace->dobj.name));
--- 13752,13759 ----
  	/*
  	 * DROP must be fully qualified in case same name appears in pg_catalog
  	 */
! 	appendPQExpBuffer(delqry, "DROP TRIGGER %s%s ",
! 					  conditional_drops ? "IF EXISTS " : "",
  					  fmtId(tginfo->dobj.name));
  	appendPQExpBuffer(delqry, "ON %s.",
  					  fmtId(tbinfo->dobj.namespace->dobj.name));
***************
*** 14055,14061 **** dumpRule(Archive *fout, RuleInfo *rinfo)
  	/*
  	 * DROP must be fully qualified in case same name appears in pg_catalog
  	 */
! 	appendPQExpBuffer(delcmd, "DROP RULE %s ",
  					  fmtId(rinfo->dobj.name));
  	appendPQExpBuffer(delcmd, "ON %s.",
  					  fmtId(tbinfo->dobj.namespace->dobj.name));
--- 14093,14100 ----
  	/*
  	 * DROP must be fully qualified in case same name appears in pg_catalog
  	 */
! 	appendPQExpBuffer(delcmd, "DROP RULE %s%s ",
! 					  conditional_drops ? "IF EXISTS " : "",
  					  fmtId(rinfo->dobj.name));
  	appendPQExpBuffer(delcmd, "ON %s.",
  					  fmtId(tbinfo->dobj.namespace->dobj.name));
*** a/src/bin/pg_dump/pg_dumpall.c
--- b/src/bin/pg_dump/pg_dumpall.c
***************
*** 67,72 **** static bool verbose = false;
--- 67,73 ----
  
  static int	binary_upgrade = 0;
  static int	column_inserts = 0;
+ static int	conditional_drops = 0;
  static int	disable_dollar_quoting = 0;
  static int	disable_triggers = 0;
  static int	inserts = 0;
***************
*** 111,116 **** main(int argc, char *argv[])
--- 112,118 ----
  		{"attribute-inserts", no_argument, &column_inserts, 1},
  		{"binary-upgrade", no_argument, &binary_upgrade, 1},
  		{"column-inserts", no_argument, &column_inserts, 1},
+ 		{"conditional-drops", no_argument, &conditional_drops, 1},
  		{"disable-dollar-quoting", no_argument, &disable_dollar_quoting, 1},
  		{"disable-triggers", no_argument, &disable_triggers, 1},
  		{"inserts", no_argument, &inserts, 1},
***************
*** 344,349 **** main(int argc, char *argv[])
--- 346,353 ----
  		appendPQExpBuffer(pgdumpopts, " --binary-upgrade");
  	if (column_inserts)
  		appendPQExpBuffer(pgdumpopts, " --column-inserts");
+ 	if (conditional_drops)
+ 		appendPQExpBuffer(pgdumpopts, " --conditional-drops");
  	if (disable_dollar_quoting)
  		appendPQExpBuffer(pgdumpopts, " --disable-dollar-quoting");
  	if (disable_triggers)
***************
*** 555,560 **** help(void)
--- 559,565 ----
  	printf(_("  -x, --no-privileges          do not dump privileges (grant/revoke)\n"));
  	printf(_("  --binary-upgrade             for use by upgrade utilities only\n"));
  	printf(_("  --column-inserts             dump data as INSERT commands with column names\n"));
+ 	printf(_("  --conditional-drops          use conditional drops command for cleaning\n"));
  	printf(_("  --disable-dollar-quoting     disable dollar quoting, use SQL standard quoting\n"));
  	printf(_("  --disable-triggers           disable triggers during data-only restore\n"));
  	printf(_("  --inserts                    dump data as INSERT commands, rather than COPY\n"));
