I checked the alter table code, and started suspecting the relation
Bruce Momjian <bruce@momjian.us>
I checked the alter table code, and started suspecting the relation cache. I found if I manually added a line to flush the whole relation cache, the assert error disappeared. Looking through the code, I found that the relation cache is flushed at the end of each query if the reference count is zero for the relation. However, printf's showed that the rd_relcnt(reference count) for the accessed query was not returning to zero after each query. It turns out the parser was doing a heap_ropen in parser/analyze.c to get information about the table's columns, but was not doing a heap_close. This was causing the query after the ALTER TABLE ADD to see the old table structure, and the executor's assert was reporting the problem.
Files
| Path | Change | +/− |
|---|---|---|
| src/backend/parser/analyze.c | modified | +10 −7 |
| src/include/parser/parse_state.h | modified | +2 −2 |
| src/Makefile.global | modified | +5 −2 |