I thought it made sense for CREATE TABLESPACE to attempt to create the top level location directory - and also for tablespace redo to do likwewise during WAL replay.

Tablespace creation then behaves a bit more like intidb with respect to directory creation, which I found quite nice.

Patch against HEAD, passes regression tests.

Cheers

Mark
Index: src/backend/commands/tablespace.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/commands/tablespace.c,v
retrieving revision 1.51
diff -c -r1.51 tablespace.c
*** src/backend/commands/tablespace.c	15 Nov 2007 21:14:34 -0000	1.51
--- src/backend/commands/tablespace.c	15 Dec 2007 19:04:45 -0000
***************
*** 199,204 ****
--- 199,205 ----
  	Oid			tablespaceoid;
  	char	   *location;
  	char	   *linkloc;
+ 	struct stat	st;
  	Oid			ownerId;
  
  	/* Must be super user */
***************
*** 297,302 ****
--- 298,317 ----
  	recordDependencyOnOwner(TableSpaceRelationId, tablespaceoid, ownerId);
  
  	/*
+ 	 * Try to create the target directory if it does not exist.
+ 	 */
+ 	if (stat(location, &st) < 0)
+ 	{
+ 		if (mkdir(location, 0700) != 0)
+ 				ereport(ERROR,
+ 					(errcode_for_file_access(),
+ 				 errmsg("could not create location directory \"%s\": %m",
+ 						location)));
+ 	
+ 	}
+ 
+ 
+ 	/*
  	 * Attempt to coerce target directory to safe permissions.	If this fails,
  	 * it doesn't exist or has the wrong owner.
  	 */
***************
*** 1279,1284 ****
--- 1294,1314 ----
  		xl_tblspc_create_rec *xlrec = (xl_tblspc_create_rec *) XLogRecGetData(record);
  		char	   *location = xlrec->ts_path;
  		char	   *linkloc;
+ 		struct stat	st;
+ 
+ 		/*
+ 		 * Try to create the target directory if it does not exist.
+ 		 */
+ 		if (stat(location, &st) < 0)
+ 		{
+ 			if (mkdir(location, 0700) != 0)
+ 			{
+ 				ereport(ERROR,
+ 						(errcode_for_file_access(),
+ 					 errmsg("could not create location directory \"%s\": %m",
+ 							location)));
+ 			}
+ 		}
  
  		/*
  		 * Attempt to coerce target directory to safe permissions.	If this
Index: src/test/regress/output/tablespace.source
===================================================================
RCS file: /projects/cvsroot/pgsql/src/test/regress/output/tablespace.source,v
retrieving revision 1.5
diff -c -r1.5 tablespace.source
*** src/test/regress/output/tablespace.source	3 Jun 2007 22:16:03 -0000	1.5
--- src/test/regress/output/tablespace.source	15 Dec 2007 19:04:46 -0000
***************
*** 57,63 ****
  
  -- Will fail with bad path
  CREATE TABLESPACE badspace LOCATION '/no/such/location';
! ERROR:  could not set permissions on directory "/no/such/location": No such file or directory
  -- No such tablespace
  CREATE TABLE bar (i int) TABLESPACE nosuchspace;
  ERROR:  tablespace "nosuchspace" does not exist
--- 57,63 ----
  
  -- Will fail with bad path
  CREATE TABLESPACE badspace LOCATION '/no/such/location';
! ERROR:  could not create location directory "/no/such/location": No such file or directory
  -- No such tablespace
  CREATE TABLE bar (i int) TABLESPACE nosuchspace;
  ERROR:  tablespace "nosuchspace" does not exist
---------------------------(end of broadcast)---------------------------
TIP 1: if posting/reading through Usenet, please send an appropriate
       subscribe-nomail command to [EMAIL PROTECTED] so that your
       message can get through to the mailing list cleanly

Reply via email to