Running the sample on my system I noticed something that might explain
the problem.

If you configure PostgreSQL to log statements, you can see the same thing.

In the sample provided, PostgreSQL is not asked to prepare a query.
If we change the call from prepare_cached to prepare it is.
Consequently, when it comes to actually executing thequery, the
prepared handle that is called on PostgreSQL isn't found.

THe following log messages may be helpful:

LOG:  statement: DROP TABLE test_table
LOG:  statement:    CREATE table test_table (
               id      SERIAL PRIMARY KEY,
               foo     integer,
               bar     text
           )
        
NOTICE:  CREATE TABLE will create implicit sequence
"test_table_id_seq" for serial column "test_table.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index
"test_table_pkey" for table "test_table"
LOG:  statement: PREPARE dbdpg_p10098_1 AS        SELECT id, foo, bar,
baz FROM test_table WHERE id = $1
        
ERROR:  column "baz" does not exist
LOG:  statement: SELECT version()
LOG:  statement: ALTER TABLE test_table ADD COLUMN baz boolean
ERROR:  prepared statement "dbdpg_p10098_1" does not exist

Now, if I change the call from prepare_cached to prepare, we get
different log messages:
NOTICE:  CREATE TABLE will create implicit sequence
"test_table_id_seq" for serial column "test_table.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index
"test_table_pkey" for table "test_table"
LOG:  statement: PREPARE dbdpg_p10075_1 AS        SELECT id, foo, bar,
baz FROM test_table WHERE id = $1
        
ERROR:  column "baz" does not exist
LOG:  statement: SELECT version()
LOG:  statement: ALTER TABLE test_table ADD COLUMN baz boolean
LOG:  statement: PREPARE dbdpg_p10075_1 AS        SELECT id, foo, bar,
baz FROM test_table WHERE id = $1
        
LOG:  statement: <BIND>
LOG:  statement: EXECUTE <unnamed>  [PREPARE:         SELECT id, foo,
bar, baz FROM test_table WHERE id = $1
        ]
LOG:  statement: DEALLOCATE dbdpg_p10075_1


Note that the incorrect behavior here is trying to access a prepared
query which hasn't been prepared....

Best Wishes,
Chris Travers

Reply via email to