Thread

  1. Re: [BUG] calling lo_creat()

    Tom Lane <tgl@sss.pgh.pa.us> — 2000-08-30T19:31:46Z

    "Barnes, Sandy (Sandra)" <Sandy.Barnes@Honeywell.com> writes:
    > Platform: PostgreSQL 7.0.2 on RedHat6.2  Linux
    > Test:  Testing the creation of large objects.  I was putting the large
    > objects into a database table but this 
    >        test program recreates the error for me without having to do that. 
    > Program Error: Can't create large object
    > Database Log Error: FATAL 1: my bits moved right off the end of the world!
    >	Recreate index pg_attribute_relid_attnum_index
    
    Can anyone else duplicate this?  I don't see it on my available boxes
    (7.0.2 and current on HPUX and an old Linux box).  The test program
    is pretty trivial, see attached.
    
    			regards, tom lane
    
    /*-------------------------------------------------------------------------
     *
     * loOid2.c
     *	  test creation of many large objects 
     *-------------------------------------------------------------------------
     */
    #include <stdlib.h>
    #include <stdio.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include "libpq-fe.h"
    #include "libpq/libpq-fs.h"
    
    static Oid
    createOid(PGconn *conn, int i)
    {
    	Oid			lobjId;
    	int			lobj_fd;
    
    	/*
    	 * create a large object
    	 */
    	lobjId = lo_creat(conn, INV_READ | INV_WRITE);
    	if (lobjId == 0)
    	{
    		fprintf(stderr, "can't create large object\n");
    		exit(1);
    	}
    
    	lobj_fd = lo_open(conn, lobjId, INV_WRITE);
    
    	printf("oid [%d]  %d\n", lobjId, i);
    /*	printf("\tfd [%d]", lobj_fd); */
    
    	lo_close(conn, lobj_fd);
    
    	return lobjId;
    }
    
    static void
    exit_nicely(PGconn *conn)
    {
    	PQfinish(conn);
    	exit(1);
    }
    
    int
    main(int argc, char **argv)
    {
    	char	   *database;
    	Oid			lobjOid;
    	PGconn	   *conn;
    	PGresult   *res;
    	int			i;
    
    	database = argv[1];
    
    	/*
    	 * set up the connection
    	 */
    	conn = PQsetdb(NULL, NULL, NULL, NULL, database);
    
    	/* check to see that the backend connection was successfully made */
    	if (PQstatus(conn) == CONNECTION_BAD)
    	{
    		fprintf(stderr, "Connection to database '%s' failed.\n", database);
    		fprintf(stderr, "%s", PQerrorMessage(conn));
    		exit_nicely(conn);
    	}
    
    	res = PQexec(conn, "begin");
    	PQclear(res);
    		for (i=0; i<100; i++)
    		{
    	    	lobjOid = createOid(conn, i); 
    		}
    	res = PQexec(conn, "end");
    	PQclear(res);
    	PQfinish(conn);
    	return 0;
    }