[svn:dbd-oracle] r15135 - in dbd-oracle/trunk: . t

[email protected] Wed, 8 Feb 2012 12:48:56 -0800 (PST)
Newsgroups perl.dbd.oracle.changes
Message-ID <[email protected]>
Author: yanick
Date: Wed Feb  8 12:48:55 2012
New Revision: 15135

Added:
   dbd-oracle/trunk/t/rt74753-utf8-encoded.t
Modified:
   dbd-oracle/trunk/Changes
   dbd-oracle/trunk/MANIFEST
   dbd-oracle/trunk/dbdimp.c

Log:
PL/SQL out values are utf8 encoded
Conflicts:
	Changes

Modified: dbd-oracle/trunk/Changes
==============================================================================
--- dbd-oracle/trunk/Changes	(original)
+++ dbd-oracle/trunk/Changes	Wed Feb  8 12:48:55 2012
@@ -1,12 +1,14 @@
 Revision history for DBD::Oracle
 
-1.38      2012-02-02
+NEXT      2012-02-08
 
  [BUG FIXES]
  - TAF supports now conditional to presence of OCI_ATTR_TAF_ENABLED
     [RT73798]
  - detect broken Win32::TieRegistry (patch by Rafael Kitover (Caelum))
     [RT74544]
+ - PL/SQL out values were not utf8 encoded [RT74753] 
+     (Steve Baldwin + Martin J. Evans)
 
  [DOCUMENTATION]
  - Mention the release of Oracle Instant Client 64 bit which does not work

Modified: dbd-oracle/trunk/MANIFEST
==============================================================================
--- dbd-oracle/trunk/MANIFEST	(original)
+++ dbd-oracle/trunk/MANIFEST	Wed Feb  8 12:48:55 2012
@@ -89,5 +89,6 @@
 t/80ora_charset.t
 t/nchar_test_lib.pl
 t/rt13865.t
+t/rt74753-utf8-encoded.t
 test.pl
 typemap

Modified: dbd-oracle/trunk/dbdimp.c
==============================================================================
--- dbd-oracle/trunk/dbdimp.c	(original)
+++ dbd-oracle/trunk/dbdimp.c	Wed Feb  8 12:48:55 2012
@@ -3198,6 +3198,13 @@
 			SvCUR_set(sv, phs->alen);
 			*SvEND(sv) = '\0';
 			SvPOK_only_UTF8(sv);
+            if (CSFORM_IMPLIES_UTF8(SQLCS_IMPLICIT)) {
+#ifdef sv_utf8_decode
+                sv_utf8_decode(sv);
+#else
+                SvUTF8_on(sv);
+#endif
+            }
 		}
 		else {	/* shouldn't happen */
 			debug = 2;

Added: dbd-oracle/trunk/t/rt74753-utf8-encoded.t
==============================================================================
--- (empty file)
+++ dbd-oracle/trunk/t/rt74753-utf8-encoded.t	Wed Feb  8 12:48:55 2012
@@ -0,0 +1,86 @@
+#!/usr/bin/perl -w
+
+use strict;
+use warnings;
+
+use Test::More tests => 2;
+
+use DBI;
+use Encode;
+
+unshift @INC ,'t';
+require 'nchar_test_lib.pl';
+
+my $dsn = oracle_test_dsn();
+my $dbuser = $ENV{ORACLE_USERID} || 'scott/tiger';
+
+$ENV{NLS_LANG} = 'AMERICAN_AMERICA.UTF8';
+$ENV{NLS_NCHAR} = 'UTF8';
+
+my $dbh = DBI->connect( $dsn, $dbuser, '',  { 
+        PrintError => 0, AutoCommit => 0, RaiseError => 1, 
+},);
+
+$dbh->do(q(alter session set nls_territory = 'GERMANY'));
+
+my $sth = $dbh->prepare(<<"END_SQL");
+    SELECT ltrim(rtrim(to_char(0, 'L'))) FROM dual
+END_SQL
+
+$sth->execute;
+
+my ($val);
+$sth->bind_columns( \($val) );
+
+$sth->fetch;
+
+is Encode::is_utf8($val) => 1, "utf8 encoded";
+
+$sth->finish;
+
+$val = undef;
+
+$sth = $dbh->prepare(<<'END_SQL');
+declare
+    l_ret       varchar2(10);
+begin
+    select  ltrim(rtrim(to_char(0, 'L')))
+    into    l_ret
+    from    dual;
+    --
+    :ret := l_ret;
+end;
+END_SQL
+
+$sth->bind_param_inout(':ret', \$val, 100);
+$sth->execute;
+
+is Encode::is_utf8($val) => 1, "utf8 encoded";
+
+$dbh->disconnect;
+
+
+__END__
+
+undef $val;
+
+$sth = $dbh->prepare(<<'END_SQL');
+declare
+    l_ret       varchar2(10);
+begin
+    select  ltrim(rtrim(to_char(0, 'L')))
+    into    l_ret
+    from    dual;
+    --
+    :ret := l_ret;
+end;
+END_SQL
+
+$sth->bind_param_inout( ':ret', \$val, 100 );
+$sth->execute;
+
+diag  "val=[$val] len=@{[ length($val) ]}" while $sth->fetch;
+
+diag "utf8 is ", Encode::is_utf8($val) ? 'on' : 'off';
+
+$dbh->disconnect;