Thanks for the report Chris.

Any chance you could write up a small test case for us?
Ideally in a new issue at https://github.com/perl5-dbi/dbi/issues

Thanks.

Tim.

On Fri, Feb 24, 2017 at 12:55:23PM +1100, Chris Hutchinson wrote:
> Using DBI v 1.636
> 
> $dbi->{FetchHashKeyName}=’NAME_lc’ or NAME_uc apparently produces different 
> keys from ‘lc’ and ‘uc’ functions for fieldnames containing non-ascii 
> characters.
> 
> For example, ‘ämne-Abc’  with FetchHashKeyName=NAME_lc results in result key 
> ‘\x{0}\x{0}mne-abc’
> 
> ----
> Summary of my perl5 (revision 5 version 24 subversion 0) configuration:
> 
>   Platform:
>     osname=linux, osvers=2.6.32-642.6.2.el6.x86_64, archname=x86_64-linux
>     uname='linux yonkyo.local 2.6.32-642.6.2.el6.x86_64 #1 smp wed oct 26 
> 06:52:09 utc 2016 x86_64 x86_64 x86_64 gnulinux '
>     config_args='-de -Dprefix=/opt/perlbrew/perls/perl-5.24.0 
> -Aeval:scriptdir=/opt/perlbrew/perls/perl-5.24.0/bin'
>     hint=recommended, useposix=true, d_sigaction=define
>     useithreads=undef, usemultiplicity=undef
>     use64bitint=define, use64bitall=define, uselongdouble=undef
>     usemymalloc=n, bincompat5005=undef
>   Compiler:
>     cc='cc', ccflags ='-fwrapv -fno-strict-aliasing -pipe -fstack-protector 
> -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 
> -D_FORTIFY_SOURCE=2',
>     optimize='-O2',
>     cppflags='-fwrapv -fno-strict-aliasing -pipe -fstack-protector 
> -I/usr/local/include'
>     ccversion='', gccversion='4.4.7 20120313 (Red Hat 4.4.7-17)', 
> gccosandvers=''
>     intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678, 
> doublekind=3
>     d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16, 
> longdblkind=3
>     ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t', 
> lseeksize=8
>     alignbytes=8, prototype=define
>   Linker and Libraries:
>     ld='cc', ldflags =' -fstack-protector -L/usr/local/lib'
>     libpth=/usr/local/lib /usr/lib /lib/../lib64 /usr/lib/../lib64 /lib 
> /lib64 /usr/lib64 /usr/local/lib64
>     libs=-lpthread -lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc
>     perllibs=-lpthread -lnsl -ldl -lm -lcrypt -lutil -lc
>     libc=libc-2.12.so, so=so, useshrplib=false, libperl=libperl.a
>     gnulibc_version='2.12'
>   Dynamic Linking:
>     dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
>     cccdlflags='-fPIC', lddlflags='-shared -O2 -L/usr/local/lib 
> -fstack-protector'
> 
> 
> Characteristics of this binary (from libperl):
>   Compile-time options: HAS_TIMES PERLIO_LAYERS PERL_COPY_ON_WRITE
>                         PERL_DONT_CREATE_GVSV
>                         PERL_HASH_FUNC_ONE_AT_A_TIME_HARD PERL_MALLOC_WRAP
>                         PERL_PRESERVE_IVUV USE_64_BIT_ALL USE_64_BIT_INT
>                         USE_LARGE_FILES USE_LOCALE USE_LOCALE_COLLATE
>                         USE_LOCALE_CTYPE USE_LOCALE_NUMERIC USE_LOCALE_TIME
>                         USE_PERLIO USE_PERL_ATOF
>   Locally applied patches:
>         Devel::PatchPerl 1.42
>   Built under linux
>   Compiled at Nov  3 2016 12:25:49
>   %ENV:
>     PERLBREW_BASHRC_VERSION="0.75"
>     PERLBREW_HOME="/home/chris/.perlbrew"
>     PERLBREW_MANPATH="/opt/perlbrew/perls/perl-5.24.0/man"
>     PERLBREW_PATH="/opt/perlbrew/bin:/opt/perlbrew/perls/perl-5.24.0/bin"
>     PERLBREW_PERL="perl-5.24.0"
>     PERLBREW_ROOT="/opt/perlbrew"
>     PERLBREW_VERSION="0.75"
>   @INC:
>     /opt/perlbrew/perls/perl-5.24.0/lib/site_perl/5.24.0/x86_64-linux
>     /opt/perlbrew/perls/perl-5.24.0/lib/site_perl/5.24.0
>     /opt/perlbrew/perls/perl-5.24.0/lib/5.24.0/x86_64-linux
>     /opt/perlbrew/perls/perl-5.24.0/lib/5.24.0
>     .
> ---
> 
> Test case script
> =====================================
> 
> use strict;
> use utf8;
> use Test::More tests => 26;
> use Data::Dumper;
> 
> use DBI;
> 
> my $dbi=DBI->connect(
>         'dbi:Pg:dbname=test_db',
>         'chris',
>         '',
>         {
>         pg_enable_utf8  =>  1,
>         }
> );
> 
> my @expect=(
>     [ 'NAME', "ABc", "ABc" ],
>     [ 'NAME_uc', "ABc", "ABC" ],
>     [ 'NAME_lc', "ABc", "abc" ],
> 
>     [ 'NAME', "てすと-ABc", "てすと-ABc" ],
>     [ 'NAME_uc', "てすと-Abc", "てすと-ABC" ],
>     [ 'NAME_uc', "てすと-Abc", "てすと-ABC" ],
>     [ 'NAME_lc', "てすと-Abc", "てすと-abc" ],
>     [ 'NAME_lc', "てすと-Abc", "てすと-abc" ],
> 
>     [ 'NAME', "ÄMNE-Abc", "ÄMNE-Abc" ],
>     [ 'NAME_uc', "ÄMNE-Abc", "ÄMNE-ABC" ],
>     [ 'NAME_uc', "ämne-Abc", "ÄMNE-ABC" ],
>     [ 'NAME_lc', "ämne-Abc", "ämne-abc" ],
>     [ 'NAME_lc', "ÄMNE-Abc", "ämne-abc" ],
> );
> 
> foreach my $e (@expect) {
>     my($case,$as,$fld)=@$e;
> 
>     my $val;
>     if($case eq 'NAME_uc') {
>         $val = uc($as);
>     } elsif($case eq 'NAME_lc') {
>         $val = lc($as);
>     } else {
>         $val = $as;
>     }
> 
>     is($val,$fld,"case-converted $as to $case");
> 
>     $dbi->{FetchHashKeyName} = $case;
> 
>     my $row=$dbi->selectrow_hashref(qq{ select now() as "$as" });
> 
>     ok(exists $row->{$fld},"hashref $case") or diag(Dumper $row);
> }
> 
> 
> Regards,
> Chris Hutchinson

Reply via email to