I was thinking a bit more about Alvaro's suggestion of the other day
that repalloc(NULL, size) should be allowed.  I'm still convinced that
that's a bad idea, but it occurs to me that there is another corner
case in the palloc stuff that there's a better case for changing.
Specifically, I think we ought to allow palloc(0) and repalloc(x, 0).
What these should do is return a *non-NULL* pointer to a chunk of
minimum size.

The reason I'm thinking this is that I've lost count of the number of
places where we are kluging around the fact that palloc(0) elog's.
In most places the easiest fix is to waste storage, eg when you want
an array of n foo's you write something like

                ptr = palloc(n * sizeof(foo) + 1);

if it's legitimate for n to be zero.  This is confusing, wasteful,
and error-prone.  (I'm sure there are still a bunch of places yet to
be found where we fail on zero-column tables because the +1 hasn't
gotten added.)

It's important that palloc(0) return an actual chunk, and not NULL,
for two reasons:

* If the result is later repalloc'd larger, it should stay in the
  context that palloc was called in.  There is no way to remember
  that context without a chunk.

* The result should be pfree'able.  I don't want to remove the
  prohibition against pfree(NULL).

But assuming that we don't return NULL, this seems fully consistent
with the rest of the palloc API.  It certainly doesn't break any
code that works today, and I think the change would eliminate many
special cases as well as future bug fixes.

Comments, objections?

                        regards, tom lane

---------------------------(end of broadcast)---------------------------
TIP 5: Have you checked our extensive FAQ?

               http://www.postgresql.org/docs/faqs/FAQ.html

Reply via email to