On Sat, Dec 11, 2010 at 11:33:49PM +0100, hubert depesz lubaczewski wrote:
> Hi,
> I have rt 3.8.7 working on one server, and it's working fine.
ok. did some more tests, and found the solution.
So. my 3.8.8 is on PostgreSQL 9.0, while 3.8.7 was on 8.4.
The problem with 9.0 is that it changes default bytea encoding.
And bytea is used to store session data:
$ \d sessions
Table "public.sessions"
Column | Type | Modifiers
-------------+-----------------------------+------------------------
id | character(32) | not null
a_session | bytea |
lastupdated | timestamp without time zone | not null default now()
Indexes:
"sessions_pkey" PRIMARY KEY, btree (id)
up to PostgreSQL 8.4, when you had a_session data being string 'depesz-ąć', it
was returned like this:
depesz-\304\205\304\207
*but*
from PostgreSQL 9.0 default encoding for bytea fields is hex. And the same
bytea value is now returned as:
\x64657065737a2dc485c487
just so that we are clear - this is the same value - 11 bytes, but it's encoded
differently.
Apparently rt doesn't handle hex encoding, and when postgresql was returning
hex-encoded bytea values - it didn't know what to do with it.
I.e. rt was storing values encoded using old method (named "escape"), but was
given back hex-encoded values.
So. The simple solution is to do this:
set bytea_output = 'escape';
in the beginning of every database connection.
Alternatively, we can do this, once:
alter user rt set bytea_output = 'escape';
this will change default value of bytea_output (encoding type) for every
*new* connection using user rt.
Alternatively - we could/should teach rt to understand hex-encoded bytea
values.
Actually, hex-encoded values are very simple to encode/decode, and
basically we should do something like:
if ( $value =~ s/\A\\x// ) {
# This is hex encoding
$value =~ s/(..)/chr hex $1/ge;
} else {
# in here should go previous decoding code
}
Best regards,
depesz
--
Linkedin: http://www.linkedin.com/in/depesz / blog: http://www.depesz.com/
jid/gtalk: [email protected] / aim:depeszhdl / skype:depesz_hdl / gg:6749007