Skip Menu |

This queue is for tickets about the DBD-Pg CPAN distribution.

Report information
The Basics
Id: 51153
Status: resolved
Priority: 0/
Queue: DBD-Pg

People
Owner: greg [...] turnstep.com
Requestors: bryce2 [...] obviously.com
Cc:
AdminCc:

Bug Information
Severity: Critical
Broken in: 2.8.7
Fixed in: (no value)



Subject: 2.8.7 mangles high bit characters with pg_server_prepare=0
Perl v5.10.0 DBD::Pg 2.8.7 Postgres 8.3,.8.4 I can't just upgrade to the current version, because I am using a distribution that includes DBD::Pg 2.8.7. I find 2.8.7 works fine for pure ASCII characters, but can't pass anything else. The current DBD::Pg seems fine. If you folks could identify where and when this was fixed, I could apply a backpatch: Basically if pg_server_prepare is set to zero, you can no longer store characters above 127 to the database. The behavior is true if you declare it at connect time, or at statement handle time. #!/usr/local/bin/perl -w # # Test script for character mangling bug in DBD:Pg # Using this table: # CREATE TABLE test (key serial,val1 text,val2 bytea); # use DBI; use DBD::Pg; printf("Testing %-20s: %s\n", DBD::Pg, DBD::Pg->VERSION ); # Prep string with values from 0 to 255 my $string; for(my $i=0; $i<256; $i++) { $data .= chr($i); } my($dbh) = DBI->connect("dbi:Pg:dbname=dblack3-deleteme;host=192.168.1.93;port=5433","production",""); #$dbh->do("SET CLIENT_ENCODING TO 'LATIN1'") or die; #$dbh->{pg_expand_array}++; # Prepare my $context_key = 1; $query_str = "UPDATE test SET val2=? WHERE key=?"; $sth = $dbh->prepare($query_str) or die; # Should work, does work $sth->bind_param(1, $data, {pg_type => DBD::Pg::PG_BYTEA}); $sth->bind_param(2, $context_key++); $sth->execute() or die "Database Error: $DBI::err ... $DBI::errstr; query_str: $query_str"; # Should work, mangles characters above 128 $sth->{pg_server_prepare} = 0; $sth->bind_param(1, $data, {pg_type => DBD::Pg::PG_BYTEA}); $sth->bind_param(2, $context_key++); $sth->execute() or die "Database Error: $DBI::err ... $DBI::errstr; query_str: $query_str"; # Should fail due to mismatched primary key, but does not $sth->bind_param(1, $data, {pg_type => DBD::Pg::PG_BYTEA}); $sth->bind_param(2, 9999999); $sth->execute() or die "Database Error: $DBI::err ... $DBI::errstr; query_str: $query_str"; Linux dblack3.bepress.com 2.6.26-2-amd64 #1 SMP Mon Oct 19 02:34:17 UTC 2009 x86_64 GNU/Linux Here is a dump after a run. Note all \377 is returned for all high characters: key | val1 | val2 1 | | \000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377 2 | | \000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\177\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377
Debian will be backporting a fix: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=555015 This a quite serious issue for those affected: Debian works on a stable system, so would not be a candidate for taking the current unstable DBD::Pg release.
Can you give more information on your platform, and/or confirm the script you gave failed? I ran the script against 2.8.7 and 2.8.0 without any errors appearing.
Subject: Re: [rt.cpan.org #51153] 2.8.7 mangles high bit characters with pg_server_prepare=0
Date: Fri, 11 Dec 2009 22:11:20 -0800
To: bug-DBD-Pg [...] rt.cpan.org
From: Bryce Nesbitt <bryce2 [...] obviously.com>
Platform is generic Intel based PC. The bug is obvious from code inspection, see: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=554489 Classic unsigned character bug.
Subject: Re: [rt.cpan.org #51153] 2.8.7 mangles high bit characters with pg_server_prepare=0
Date: Fri, 11 Dec 2009 22:12:12 -0800
To: bug-DBD-Pg [...] rt.cpan.org
From: Bryce Nesbitt <bryce2 [...] obviously.com>
The piece that would be really valuable is the patch in the Debian bug to the test script. That way similar bugs can never enter the DBD::Pg codebase again.
On Sat Dec 12 01:12:27 2009, brycenesbitt wrote: Show quoted text
> The piece that would be really valuable is the patch in the Debian bug > to the test script. That way similar bugs can never enter the DBD::Pg > codebase again.
Thanks, added to 06bytea.t in r13669
Uploaded 2.8.8 to CPAN with the fix to quote.c
Resolving, as test is now in HEAD and 2.8.8, and fix to quote.c is applied in 2.8.8.