hi, how to let the inserted tuple visible to other backend when current backend hasn't finish?

From: sunpeng <bluevaley(at)gmail(dot)com>
To: pgsql-general(at)postgresql(dot)org
Subject: hi, how to let the inserted tuple visible to other backend when current backend hasn't finish?
Date: 2010-09-12 07:02:12
Message-ID: AANLkTine4v+i_LsVYsj2zJf4Kutb=b+MXiZkFg4s2mF_@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

hi, These codes are in the postgresql engine, just assume they are in
PortalRun() function:
//1.create table structure
char *relname = "test";
...
relOid = heap_create_with_catalog(relname, ....);
CommandCounterIncrement();
...
//2.then i can use SPI_execute to create index on this created table
SPI_connect();
char *sqlCreate_index ="create index on test....."
int ret = SPI_execute(sqlCreate_index , false, 1);
SPI_finish();
.....
//3.until now it performs well,but after i insert a tuple in this table
....
Relation mcir_relation = relation_open(relOid); //the relation just created
HeapTupleData htup;
....
simple_heap_insert(relation, &htup);
CommandCounterIncrement();
...
//4.then again want to invoke SPI_execute("select...."), it seems the
inserted tuple is not visible to SPI_execute()
SPI_connect();
int ret = SPI_execute("select * from test;", true, 1);
if (ret == SPI_OK_SELECT && SPI_processed == 1 ) {
....
}

the ret is SPI_OK_SELECT ,but SPI_processed == 0, the inserted tuple is not
visible to SPI_execute() .
i've used these methods to try to let it visible to SPI_execute() :
simple_heap_insert()....
CommandCounterIncrement();
or:
BeginInternalSubTransaction(NULL);
simple_heap_insert()...
ReleaseCurrentSubTransaction();
....
but they all don't work, how to resolve it?
thanks!

Responses

Browse pgsql-general by date

  From Date Subject
Next Message J. Roeleveld 2010-09-12 10:18:10 Re: Incrementally Updated Backups
Previous Message Casey Jones 2010-09-12 06:53:56 Huge amount of memory errors with libpq