"Barnes, Sandy (Sandra)" <[EMAIL PROTECTED]> 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;
}

Reply via email to