@@ -345,15 +345,21 @@ impl Cluster {
345345
346346 /// Create the named database.
347347 pub fn createdb ( & self , database : & str ) -> Result < bool , ClusterError > {
348- let statement = format ! ( "CREATE DATABASE {}" , & database) ;
348+ let statement = format ! (
349+ "CREATE DATABASE {}" ,
350+ postgres_protocol:: escape:: escape_identifier( database)
351+ ) ;
349352 self . connect ( "template1" ) ?
350353 . execute ( statement. as_str ( ) , & [ ] ) ?;
351354 Ok ( true )
352355 }
353356
354357 /// Drop the named database.
355358 pub fn dropdb ( & self , database : & str ) -> Result < bool , ClusterError > {
356- let statement = format ! ( "DROP DATABASE {}" , & database) ;
359+ let statement = format ! (
360+ "DROP DATABASE {}" ,
361+ postgres_protocol:: escape:: escape_identifier( database)
362+ ) ;
357363 self . connect ( "template1" ) ?
358364 . execute ( statement. as_str ( ) , & [ ] ) ?;
359365 Ok ( true )
@@ -594,4 +600,31 @@ mod tests {
594600 cluster. destroy ( ) . unwrap ( ) ;
595601 }
596602 }
603+
604+ #[ test]
605+ fn cluster_databases_with_non_plain_names_can_be_created_and_dropped ( ) {
606+ // PostgreSQL identifiers containing hyphens, for example, or where we
607+ // want to preserve capitalisation, are possible.
608+ for runtime in Runtime :: find_on_path ( ) {
609+ println ! ( "{:?}" , runtime) ;
610+ let data_dir = tempdir:: TempDir :: new ( "data" ) . unwrap ( ) ;
611+ let cluster = Cluster :: new ( & data_dir, runtime) ;
612+ cluster. start ( ) . unwrap ( ) ;
613+ cluster. createdb ( "foo-bar" ) . unwrap ( ) ;
614+ cluster. createdb ( "Foo-BAR" ) . unwrap ( ) ;
615+
616+ let expected: HashSet < String > =
617+ [ "foo-bar" , "Foo-BAR" , "postgres" , "template0" , "template1" ]
618+ . iter ( )
619+ . cloned ( )
620+ . map ( |s| s. to_string ( ) )
621+ . collect ( ) ;
622+ let observed: HashSet < String > = cluster. databases ( ) . unwrap ( ) . iter ( ) . cloned ( ) . collect ( ) ;
623+ assert_eq ! ( expected, observed) ;
624+
625+ cluster. dropdb ( "foo-bar" ) . unwrap ( ) ;
626+ cluster. dropdb ( "Foo-BAR" ) . unwrap ( ) ;
627+ cluster. destroy ( ) . unwrap ( ) ;
628+ }
629+ }
597630}
0 commit comments