diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
new file mode 100644
index b26358c..d331c46
*** a/src/bin/pg_dump/pg_dump.c
--- b/src/bin/pg_dump/pg_dump.c
*************** getNamespaces(Archive *fout, int *numNam
*** 4130,4138 ****
  		 * essentially a no-op because the new public schema won't have an
  		 * entry in pg_init_privs anyway, as the entry will be removed when
  		 * the public schema is dropped.
  		 */
  		if (dopt->outputClean)
! 			appendPQExpBuffer(query," AND pip.objoid <> 'public'::regnamespace");
  
  		appendPQExpBuffer(query,") ");
  
--- 4130,4144 ----
  		 * essentially a no-op because the new public schema won't have an
  		 * entry in pg_init_privs anyway, as the entry will be removed when
  		 * the public schema is dropped.
+ 		 *
+ 		 * Further, we have to handle the case where the public schema does
+ 		 * not exist at all.
  		 */
  		if (dopt->outputClean)
! 			appendPQExpBuffer(query,
! 					" AND pip.objoid <> "
! 					"coalesce((select oid from pg_namespace "
! 					"where nspname = 'public'),0)");
  
  		appendPQExpBuffer(query,") ");
  
diff --git a/src/bin/pg_dump/t/002_pg_dump.pl b/src/bin/pg_dump/t/002_pg_dump.pl
new file mode 100644
index 9bd400e..19b40de
*** a/src/bin/pg_dump/t/002_pg_dump.pl
--- b/src/bin/pg_dump/t/002_pg_dump.pl
*************** my %pgdump_runs = (
*** 103,108 ****
--- 103,125 ----
  			'-f',
  			"$tempdir/defaults.sql",
  			'postgres', ], },
+ 	defaults_no_public => {
+ 		database => 'regress_pg_dump_test',
+ 		dump_cmd => [
+ 			'pg_dump',
+ 			'--no-sync',
+ 			'-f',
+ 			"$tempdir/defaults_no_public.sql",
+ 			'regress_pg_dump_test', ], },
+ 	defaults_no_public_clean => {
+ 		database => 'regress_pg_dump_test',
+ 		dump_cmd => [
+ 			'pg_dump',
+ 			'--no-sync',
+ 			'-c',
+ 			'-f',
+ 			"$tempdir/defaults_no_public_clean.sql",
+ 			'regress_pg_dump_test', ], },
  	# Do not use --no-sync to give test coverage for data sync.
  	defaults_custom_format => {
  		test_key => 'defaults',
*************** qr/CREATE TRANSFORM FOR integer LANGUAGE
*** 4513,4518 ****
--- 4530,4572 ----
  			pg_dumpall_globals_clean => 1,
  			test_schema_plus_blobs   => 1, }, },
  
+ 	'CREATE SCHEMA public (none exists)' => {
+ 		all_runs  => 1,
+ 		database => 'regress_pg_dump_test',
+ 		regexp    => qr/^DROP SCHEMA public;/m,
+ 		like      => { },
+ 		unlike    => { defaults_no_public => 1,
+                        defaults_no_public_clean => 1, } },
+ 
+ 	'CREATE SCHEMA public' => {
+ 		all_runs     => 1,
+ 		catch_all    => 'CREATE ... commands',
+ 		regexp       => qr/^CREATE SCHEMA public;/m,
+ 		like         => {
+ 			clean                   => 1,
+ 			clean_if_exists         => 1, },
+ 		unlike => {
+ 			binary_upgrade           => 1,
+ 			createdb                 => 1,
+ 			defaults                 => 1,
+ 			exclude_test_table       => 1,
+ 			exclude_test_table_data  => 1,
+ 			no_blobs                 => 1,
+ 			no_privs                 => 1,
+ 			no_owner                 => 1,
+ 			only_dump_test_schema    => 1,
+ 			pg_dumpall_dbprivs       => 1,
+ 			schema_only              => 1,
+ 			section_pre_data         => 1,
+ 			test_schema_plus_blobs   => 1,
+ 			with_oids                => 1,
+ 			exclude_dump_test_schema => 1,
+ 			only_dump_test_table     => 1,
+ 			pg_dumpall_globals       => 1,
+ 			pg_dumpall_globals_clean => 1,
+ 			role                     => 1,
+ 			section_post_data        => 1, }, },
+ 
  	'CREATE SCHEMA dump_test' => {
  		all_runs     => 1,
  		catch_all    => 'CREATE ... commands',
*************** qr/CREATE TRANSFORM FOR integer LANGUAGE
*** 5205,5210 ****
--- 5259,5274 ----
  			data_only      => 1,
  			section_data   => 1, }, },
  
+ 	'DROP SCHEMA public' => {
+ 		all_runs  => 1,
+ 		database => 'regress_pg_dump_test',
+ 		create_order => 100,
+ 		create_sql => 'DROP SCHEMA public;',
+ 		regexp    => qr/^DROP SCHEMA public;/m,
+ 		like      => { },
+ 		unlike    => { defaults_no_public => 1,
+ 		               defaults_no_public_clean => 1, } },
+ 
  	'DROP EXTENSION plpgsql' => {
  		all_runs  => 1,
  		catch_all => 'DROP ... commands',
*************** if ($collation_check_stderr !~ /ERROR: /
*** 6411,6416 ****
--- 6475,6483 ----
  	$collation_support = 1;
  }
  
+ # Create a second database for certain tests to work against
+ $node->psql('postgres','create database regress_pg_dump_test;');
+ 
  # Start with number of command_fails_like()*2 tests below (each
  # command_fails_like is actually 2 tests)
  my $num_tests = 12;
*************** my $num_tests = 12;
*** 6418,6423 ****
--- 6485,6495 ----
  foreach my $run (sort keys %pgdump_runs)
  {
  	my $test_key = $run;
+ 	my $run_db = 'postgres';
+ 
+ 	if (defined($pgdump_runs{$run}->{database})) {
+ 		$run_db = $pgdump_runs{$run}->{database};
+ 	}
  
  	# Each run of pg_dump is a test itself
  	$num_tests++;
*************** foreach my $run (sort keys %pgdump_runs)
*** 6436,6441 ****
--- 6508,6523 ----
  	# Then count all the tests run against each run
  	foreach my $test (sort keys %tests)
  	{
+ 		my $test_db = 'postgres';
+ 
+ 		if (defined($tests{$test}->{database})) {
+ 			$test_db = $tests{$test}->{database};
+ 		}
+ 
+ 		if ($run_db ne $test_db) {
+ 			next;
+ 		}
+ 
  		# Skip any collation-related commands if there is no collation support
  		if (!$collation_support && defined($tests{$test}->{collation})) {
  			next;
*************** plan tests => $num_tests;
*** 6483,6489 ****
  # Set up schemas, tables, etc, to be dumped.
  
  # Build up the create statements
! my $create_sql = '';
  
  foreach my $test (
  	sort {
--- 6565,6571 ----
  # Set up schemas, tables, etc, to be dumped.
  
  # Build up the create statements
! my %create_sql = ();
  
  foreach my $test (
  	sort {
*************** foreach my $test (
*** 6505,6510 ****
--- 6587,6598 ----
  		}
  	} keys %tests)
  {
+ 	my $test_db = 'postgres';
+ 
+ 	if (defined($tests{$test}->{database})) {
+ 		$test_db = $tests{$test}->{database};
+ 	}
+ 
  	if ($tests{$test}->{create_sql})
  	{
  		# Skip any collation-related commands if there is no collation support
*************** foreach my $test (
*** 6513,6524 ****
  		}
  
  		# Add terminating semicolon
! 		$create_sql .= $tests{$test}->{create_sql} . ";";
  	}
  }
  
  # Send the combined set of commands to psql
! $node->safe_psql('postgres', $create_sql);
  
  #########################################
  # Test connecting to a non-existent database
--- 6601,6615 ----
  		}
  
  		# Add terminating semicolon
! 		$create_sql{$test_db} .= $tests{$test}->{create_sql} . ";";
  	}
  }
  
  # Send the combined set of commands to psql
! foreach my $db (sort keys %create_sql)
! {
! 	$node->safe_psql($db, $create_sql{$db});
! }
  
  #########################################
  # Test connecting to a non-existent database
*************** command_fails_like(
*** 6565,6571 ****
  
  foreach my $run (sort keys %pgdump_runs)
  {
- 
  	my $test_key = $run;
  
  	$node->command_ok(\@{ $pgdump_runs{$run}->{dump_cmd} },
--- 6656,6661 ----
