On Tuesday 14 October 2003 20:50, you wrote:
> Igor Shevchenko <[EMAIL PROTECTED]> writes:
> > The problem is repeatable when I run my program, especially if the
> > postgresql server and the sserv are on the same server, and the debugging
> > is off. Please let me know if you need more details, I'll try to narrow
> > the conditions to make a simple reproductible sequence of commands.
>
> I think we're going to need a test case to make any progress on this
> one.

Here's a test case.

1. in t2.cc, replace table name "a" in "select * from a" with any other table 
which has lots of data. In my setup, the table 'a' is :

            Table "public.a"
 Column |       Type        | Modifiers 
--------+-------------------+-----------
 txt    | character varying | 

It has ~50k of rows with the same value 'hello'.

2. compile t2.cc
3. run "while true; do echo "notify new_event" | psql; done" in one shell
4. run t2 in another shell

The t2's backend fails before the query is finished and the following is 
printed in the postgresql's log:

WARNING:  CommitTransaction and not in in-progress state
TRAP: FailedAssertion("!(TopTransactionContext != ((void *)0))", File: "xact.
c", Line: 660)
LOG:  server process (PID 10622) was terminated by signal 6
LOG:  terminating any other active server processes

>
>                       regards, tom lane

-- 
Best regards,
Igor Shevchenko
#include <stdio.h>
#include <libpq-fe.h>
#include <iostream>
using namespace std;

void exit_nicely ( PGconn* conn ) {
    PQfinish(conn);
    exit(1);
}

#define PGHOST NULL


main() {
    // connect 
    PGconn* conn = PQsetdbLogin ( PGHOST, // host
				  NULL, // port
				  NULL, // options
				  NULL, // pgtty
				  NULL, // dbname
				  NULL, // login
				  NULL // pwd
	);
    
    if ( PQstatus(conn) == CONNECTION_BAD ) {
	cerr << "connect failed: " << PQerrorMessage(conn) << endl;
	exit_nicely(conn);
    }
    
    PGresult* res;
    if ( !(res = PQexec ( conn, "listen new_event" )) ) {
	cerr << "PQexec error: " << PQerrorMessage(conn) << endl;
	exit_nicely(conn);
    }
    PQclear ( res );
    
    if ( 0 != PQsetnonblocking ( conn, 1 ) ) {
	cerr << "pqsetnonblocking error: " << PQerrorMessage ( conn ) << endl;
	exit_nicely(conn);
    }
    
    if ( !PQexecParams ( conn, "select * from a", 0, 0, 0, 0, 0, 1 ) ) {
	cerr << "pssendquery error: " << PQerrorMessage ( conn ) << endl;
	exit_nicely(conn);
    }
    
    while ( true ) {
	if ( 0 == PQconsumeInput ( conn ) ) {
	    cerr << "PQconsumeInput error: " << PQerrorMessage(conn) << endl;
	    return 0;
	}
	
	// check notifications
	PGnotify* n;
	while ( (n = PQnotifies ( conn )) ) {
	    cerr << "got notification \"" << n->relname << "\"\n";
	    PQfreemem ( n );
	}
	
	// check if the result is ready
	if ( !PQisBusy ( conn ) ) {
	    while ( (res = PQgetResult(conn)) ) {
		cerr << "got result\n";
		PQclear ( res );
	    }
	    //break;
	}
    }
    
    // close connection
    PQfinish(conn);

    return 0;
}
---------------------------(end of broadcast)---------------------------
TIP 2: you can get off all lists at once with the unregister command
    (send "unregister YourEmailAddressHere" to [EMAIL PROTECTED])

Reply via email to