]> granicus.if.org Git - postgresql/commit
Fix alignment and toasting bugs in range types.
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 15 Nov 2011 02:42:04 +0000 (21:42 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 15 Nov 2011 02:42:04 +0000 (21:42 -0500)
commitad50934eaadb626de682defe0ad270bbf31e92a2
treeb6bfb3e949b397de41e7278538c62e11460fa575
parent4165d5b6d7d2e399edbc6d027039358794aa8f04
Fix alignment and toasting bugs in range types.

A range type whose element type has 'd' alignment must have 'd' alignment
itself, else there is no guarantee that the element value can be used
in-place.  (Because range_deserialize uses att_align_pointer which forcibly
aligns the given pointer, violations of this rule did not lead to SIGBUS
but rather to garbage data being extracted, as in one of the added
regression test cases.)

Also, you can't put a toast pointer inside a range datum, since the
referenced value could disappear with the range datum still present.
For consistency with the handling of arrays and records, I also forced
decompression of in-line-compressed bound values.  It would work to store
them as-is, but our policy is to avoid situations that might result in
double compression.

Add assorted regression tests for this, and bump catversion because of
fixes to built-in pg_type entries.

Also some marginal cleanup of inconsistent/unnecessary error checks.
src/backend/commands/typecmds.c
src/backend/utils/adt/rangetypes.c
src/include/catalog/catversion.h
src/include/catalog/pg_type.h
src/test/regress/expected/rangetypes.out
src/test/regress/expected/type_sanity.out
src/test/regress/sql/rangetypes.sql
src/test/regress/sql/type_sanity.sql