![]() | |
![]() |
| | Thread Tools | Display Modes |
#1
| |||
| |||
|
|
X test_trigger */ |
#2
| |||
| |||
|
|
SPI_connect() throws "ERROR: SPI_connect failed" message (from backend/utils/adt/ri_trigger.c:378) when called from (at least) a before insert trigger on a table which also contains a foreign key constraint. The exit from the trigger function is inconsistent. This error message is emitted from ri_trigger.c but the return result from SPI_connect() in the trigger is SPI_OK_CONNECT. The insert operation does not commit to the database. |
#3
| |||
| |||
|
|
----- Original Message ----- From: "Alvaro Herrera" <alvherre (AT) commandprompt (DOT) com To: "SPI_connect() failure." <jfitz (AT) spacelink (DOT) com Cc: <pgsql-bugs (AT) postgresql (DOT) org Sent: Wednesday, March 01, 2006 10:57 AM Subject: Re: [BUGS] BUG #2294: SPI_connect() fails in trigger when a Foreignkey constraint exists on same table as trigger. SPI_connect() failure. wrote: SPI_connect() throws "ERROR: SPI_connect failed" message (from backend/utils/adt/ri_trigger.c:378) when called from (at least) a before insert trigger on a table which also contains a foreign key constraint. The exit from the trigger function is inconsistent. This error message is emitted from ri_trigger.c but the return result from SPI_connect() in the trigger is SPI_OK_CONNECT. The insert operation does not commit to the database. Do you call SPI_finish() in your trigger? You should not leave the SPI connection open. -- Alvaro Herrera http://www.CommandPrompt.com/ The PostgreSQL Company - Command Prompt, Inc. |
#4
| |||
| |||
|
|
It is notable, however, that Postgres is not emitting the following: WARNING: transaction left non-empty SPI stack HINT: Check for missing "SPI_finish" calls. |
#5
| |||
| |||
|
|
Yes, what your suggesting would make sense WRT the ri_triggers however it doesn't explain the results that are actually appearing using the given code in the bug report. |
|
If one compiles this code (with or without the missing SPI_finish() call) the failure still exists. |
#6
| |||
| |||
|
|
"Jim Fitzgerald" <jfitz (AT) spacelink (DOT) com> writes: It is notable, however, that Postgres is not emitting the following: WARNING: transaction left non-empty SPI stack HINT: Check for missing "SPI_finish" calls. Well, no, because control isn't going to get that far before the mismatched SPI_connect/SPI_finish calls are noted. If your theory of the problem were correct then the RI triggers themselves would cause failures whenever a table had more than one foreign key. I feel fairly confident that it's just a bug in your trigger code. Aside from the missing SPI_finish, you might be needing SPI_push/SPI_pop calls if the trigger code invokes anything that might itself call SPI. regards, tom lane |
#7
| |||
| |||
|
|
"Jim Fitzgerald" <jfitz (AT) spacelink (DOT) com> writes: Yes, what your suggesting would make sense WRT the ri_triggers however it doesn't explain the results that are actually appearing using the given code in the bug report. It entirely does, since the given code is missing SPI_finish(). Moreover, adding the SPI_finish() makes it work, according to my testing. With code as given: regression=# insert into test_table1 values ('abcd', 'group'); INFO: t2294.c(35) Trigger start INFO: t2294.c(43) SPI_connect OK INFO: t2294.c(44) Trigger end OK ERROR: SPI_connect failed regression=# With SPI_finish() added just before return statement: regression=# insert into test_table1 values ('abcd', 'group'); INFO: t2294.c(35) Trigger start INFO: t2294.c(43) SPI_connect OK INFO: t2294.c(44) Trigger end OK ERROR: insert or update on table "test_table1" violates foreign key constraint "test_constraint1_fk1" DETAIL: Key (groups)=(group) is not present in table "test_table2". regression=# insert into test_table2 values('group'); INSERT 0 1 regression=# insert into test_table1 values ('abcd', 'group'); INFO: t2294.c(35) Trigger start INFO: t2294.c(43) SPI_connect OK INFO: t2294.c(44) Trigger end OK INSERT 0 1 regression=# If one compiles this code (with or without the missing SPI_finish() call) the failure still exists. I think you had some pilot error in your testing ... perhaps forgetting to reload the shared library after recompiling? regards, tom lane |
![]() |
| Thread Tools | |
| Display Modes | |
| |