Index: src/backend/catalog/catalog.c
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/catalog/catalog.c,v
retrieving revision 1.32
diff -u -b -r1.32 catalog.c
--- src/backend/catalog/catalog.c	2000/04/12 17:14:55	1.32
+++ src/backend/catalog/catalog.c	2000/06/10 22:53:55
@@ -45,6 +45,37 @@
 		return path;
 	}
 
+	if ((strncmp(relname, "xin", 3) == 0) && (strlen(relname) > 4))
+	  if ((relname[3] == 'v') || (relname[3] == 'x')) {
+		/* LO's are resided in Database dir */
+		char *err;
+		int4 oid;
+		size_t bufsize;
+
+		oid = strtol(relname + 4, &err, 10);
+		if (*err == '\0') {
+			int pw = 0;
+			int4 s_oid = oid;
+			while (s_oid != 0) {
+			  pw++;
+			  s_oid /= 100;
+			}
+			s_oid = oid / 100;
+			bufsize = strlen(relname) + pw * 3 + 4;
+			path = (char *) palloc(sizeof(char) * bufsize);
+			path[0] = relname[3];
+			path[1] = SEP_CHAR;
+			path[2] = 0;
+			pw = 2;
+			while (s_oid != 0) {
+			  snprintf(path + pw, 4, "%02d%c", s_oid % 100, SEP_CHAR);
+			  pw += 3;
+			  s_oid /= 100;
+			}
+			snprintf(path + pw, bufsize - pw, "%s", relname);
+			return path;
+		}
+	  }
 	/*
 	 * If it is in the current database, assume it is in current working
 	 * directory.  NB: this does not work during bootstrap!
Index: src/backend/storage/large_object/inv_api.c
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/storage/large_object/inv_api.c,v
retrieving revision 1.69
diff -u -b -r1.69 inv_api.c
--- src/backend/storage/large_object/inv_api.c	2000/06/05 07:28:45	1.69
+++ src/backend/storage/large_object/inv_api.c	2000/06/10 22:54:06
@@ -34,6 +34,8 @@
 #include "utils/fmgroids.h"
 #include "utils/relcache.h"
 
+#include <errno.h>
+
 /*
  *	Warning, Will Robinson...  In order to pack data into an inversion
  *	file as densely as possible, we violate the class abstraction here.
@@ -96,6 +98,9 @@
 	Oid			classObjectId[1];
 	char		objname[NAMEDATALEN];
 	char		indname[NAMEDATALEN];
+	Oid		s_oid;
+	int		pw = 0;
+	size_t		dirsize;
 
 	/*
 	 * add one here since the pg_class tuple created will have the next
@@ -132,6 +137,44 @@
 					   BYTEAOID,
 					   -1, 0, false);
 
+	s_oid = file_oid;
+	while (s_oid != 0) {
+	        pw++;
+		s_oid /= 100;
+	}
+	dirsize = pw * 3 + 2;
+	
+	{
+		char		dirname[dirsize];
+		struct stat	st;
+		
+		dirname[1] = 0;
+		pw = 1;
+		s_oid = file_oid;
+		for(; ; ) {
+			dirname[0] = 'v';
+			if (stat(dirname, &st) == -1) {
+				if (errno == ENOENT) {
+					if (mkdir(dirname, S_IRWXU) != 0)
+				                elog(ERROR, "lo_create: unable to create large object directory '%s': %s", dirname, strerror(errno));
+				} else
+				        elog(ERROR, "lo_create: unable to stat large object directory '%s': %s", dirname, strerror(errno));
+			}
+			dirname[0] = 'x';
+			if (stat(dirname, &st) == -1) {
+				if (errno == ENOENT) {
+					if (mkdir(dirname, S_IRWXU) != 0)
+				                elog(ERROR, "lo_create: unable to create large object directory '%s': %s", dirname, strerror(errno));
+				} else
+				        elog(ERROR, "lo_create: unable to stat large object directory '%s': %s", dirname, strerror(errno));
+			}
+			s_oid /= 100;
+			if (s_oid == 0)
+				break;
+			snprintf(dirname + pw, 4, "%c%02d", SEP_CHAR, s_oid % 100);
+			pw += 3;
+		}
+	}
 	/*
 	 * First create the table to hold the inversion large object.  It will
 	 * be located on whatever storage manager the user requested.
