r38248 - in /branches/upstream/libdbd-odbc-perl/current: Changes FAQ MANIFEST META.yml ODBC.pm dbdimp.c dbdimp.h t/02simple.t t/12blob.t t/rt_39897.t t/rt_46597.t t/rt_null_nvarchar.t test_results.txt unicode_helper.c
jawnsy-guest at users.alioth.debian.org
jawnsy-guest at users.alioth.debian.org
Fri Jun 19 00:42:08 UTC 2009
Author: jawnsy-guest
Date: Fri Jun 19 00:42:03 2009
New Revision: 38248
URL: http://svn.debian.org/wsvn/pkg-perl/?sc=1&rev=38248
Log:
[svn-upgrade] Integrating new upstream version, libdbd-odbc-perl (1.22)
Added:
branches/upstream/libdbd-odbc-perl/current/t/rt_46597.t
branches/upstream/libdbd-odbc-perl/current/t/rt_null_nvarchar.t
Modified:
branches/upstream/libdbd-odbc-perl/current/Changes
branches/upstream/libdbd-odbc-perl/current/FAQ
branches/upstream/libdbd-odbc-perl/current/MANIFEST
branches/upstream/libdbd-odbc-perl/current/META.yml
branches/upstream/libdbd-odbc-perl/current/ODBC.pm
branches/upstream/libdbd-odbc-perl/current/dbdimp.c
branches/upstream/libdbd-odbc-perl/current/dbdimp.h
branches/upstream/libdbd-odbc-perl/current/t/02simple.t
branches/upstream/libdbd-odbc-perl/current/t/12blob.t
branches/upstream/libdbd-odbc-perl/current/t/rt_39897.t
branches/upstream/libdbd-odbc-perl/current/test_results.txt
branches/upstream/libdbd-odbc-perl/current/unicode_helper.c
Modified: branches/upstream/libdbd-odbc-perl/current/Changes
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libdbd-odbc-perl/current/Changes?rev=38248&op=diff
==============================================================================
--- branches/upstream/libdbd-odbc-perl/current/Changes (original)
+++ branches/upstream/libdbd-odbc-perl/current/Changes Fri Jun 19 00:42:03 2009
@@ -2,7 +2,7 @@
DBD::ODBC::Changes - Log of significant changes to the DBD::ODBC
-(As of $LastChangedDate: 2009-04-20 16:21:32 +0100 (Mon, 20 Apr 2009) $ $Revision: 10667 $)
+(As of $LastChangedDate: 2009-06-10 14:16:37 +0100 (Wed, 10 Jun 2009) $ $Revision: 10667 $)
=cut
@@ -40,8 +40,47 @@
http://groups.google.com/group/perl.dbd.pg.changes/browse_thread/thread/8205bf83b5a48f63/cf43d87fe644798f?hl=en&q=easysoft&pli=1
http://www.nntp.perl.org/group/perl.dbi.users/2008/10/msg33322.html
Add a perlcritic test - see DBD::Pg
+ Why doesn't http://www.presicient.com/dbidocs/ display DBD::ODBC docs
+ properly.
=head1 CHANGES
+
+=head2 Changes in DBD::ODBC 1.22 June 10, 2009
+
+Fixed bug which led to "Use of uninitialized value in subroutine
+entry" warnings when writing a NULL into a NVARCHAR with a
+unicode-enabled DBD::ODBC. Thanks to Jirka Novak and Pavel Richter who
+found, reported and patched a fix.
+
+Fixed serious bug in unicode_helper.c for utf16_len which I'm ashamed to say
+was using an unsigned short to return the length. This meant you could
+never have UTF16 strings of more than ~64K without risking serious
+problems. The DBD::ODBC test code actually got a
+
+*** glibc detected *** /usr/bin/perl: double free or corruption
+(out): 0x406dd008 ***
+
+If you use a UNICODE enabled DBD::ODBC (the default on Windows) and
+unicode strings larger than 64K you should definitely upgrade now.
+
+=head2 Changes in DBD::ODBC 1.21_1 June 2, 2009
+
+Fixed bug referred to in rt 46597 reported by taioba and identified by
+Tim Bunce. In Calls to bind_param for a given statement handle if you
+specify a SQL type to bind as, this should be "sticky" for that
+parameter. That means if you do:
+
+$sth->bind_param(1, $param, DBI::SQL_LONGVARCHAR)
+
+and follow it up with execute calls that also specify the parameter:
+
+$sth->execute("a param");
+
+then the parameter should stick with the SQL_LONGVARCHAR type and not
+revert to the default parameter type. The DBI docs (from 1.609)
+make it clear the parameter type is sticky for the duration of the
+statement but some DBDs allow the parameter to be rebound with a
+different type - DBD::ODBC is one of those drivers.
=head2 Changes in DBD::ODBC 1.21 April 27, 2009
@@ -55,6 +94,8 @@
Added FAQ entry about SQL Server and calling procedures with named
parameters out of order.
+
+Added test_results.txt containing some supplied make test results.
=head2 Changes in DBD::ODBC 1.20 April 20, 2009
Modified: branches/upstream/libdbd-odbc-perl/current/FAQ
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libdbd-odbc-perl/current/FAQ?rev=38248&op=diff
==============================================================================
--- branches/upstream/libdbd-odbc-perl/current/FAQ (original)
+++ branches/upstream/libdbd-odbc-perl/current/FAQ Fri Jun 19 00:42:03 2009
@@ -8,7 +8,7 @@
=head1 VERSION
-($Revision: 12168 $)
+($Revision: 12806 $)
=head1 QUESTIONS
@@ -554,6 +554,74 @@
etc. This can lead to data truncation errors and all sort of other
problems it is impossible for DBD::ODBC spot or workaround.
+=head2 Why do I get "Numeric value out of range" when binding dates in Oracle?
+
+Also see "Why do I get "Datetime field overflow" when attempting to insert a
+date into Oracle?".
+
+Here is some example code binding dates; some work, some don't, see comments.
+
+ use DBI;
+ use strict;
+
+ # table is "create table martin (a date, b int)"
+
+ my $h = DBI->connect;
+
+ $h->do(q{alter session set nls_date_format='DD-MON-YY'});
+
+ my $s = $h->prepare(q{select * from v$nls_parameters where parameter = 'NLS_DATE_FORMAT'});
+ $s->execute;
+ print DBI::dump_results($s);
+
+ my $date = '30-DEC-99';
+ my $dateodbc = qq/{ d '1999-12-30'}/;
+
+ # the following works ok - resulting in 2099-12-30 being inserted
+ $h->do(qq{insert into martin values ('$date', 1)});
+
+ # the following works resulting in 1999-12-30 being inserted
+ $h->do(qq{insert into martin values ($dateodbc, 2)});
+
+ # fails
+ eval {
+ my $s = $h->prepare(q{insert into martin values(?,3)});
+ $s->bind_param(1, $date);
+ # fails
+ # Numeric value out of range: invalid character in date/time string (SQL-22003)
+ $s->execute;
+ };
+
+ # works resulting in 2099-12-30 being inserted
+ eval {
+ my $s = $h->prepare(q{insert into martin values(?,4)});
+ $s->bind_param(1, $date, DBI::SQL_VARCHAR);
+ $s->execute;
+ };
+
+ # works resulting in 1999-12-30 being inserted
+ eval {
+ my $s = $h->prepare(q{insert into martin values(?,5)});
+ $s->bind_param(1, $dateodbc);
+ $s->execute;
+ };
+
+In general, when using an ODBC driver you should use the ODBC syntax
+for dates, times and timestamps as those are the only formats an ODBC
+has to support.
+
+In the above case with Oracle, the date parameter is described as a
+SQL_TYPE_DATE SQL type so by default DBD::ODBC binds your parameter as
+a SQL_TYPE_DATE. If you use '30-DEC-99' then that means the C type is
+SQL_CHAR and the SQL type is SQL_TYPE_DATE so the driver is forced to
+parse the date before sending it to Oracle (that would mean knowing
+what your NLS_DATE_FORMAT is and it would also mean knowing all the
+magic special characters Oracle can use to define date formats).
+
+If you override the bind type to SQL_VARCHAR then the driver sees
+SQL_CHAR => SQL_VARCHAR, nothing to do and hence Oracle itself does
+the translation - that is why the SQL_VARCHAR works.
+
=head1 AUTHOR
Parts of this document were written by Tim Bunce,
Modified: branches/upstream/libdbd-odbc-perl/current/MANIFEST
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libdbd-odbc-perl/current/MANIFEST?rev=38248&op=diff
==============================================================================
--- branches/upstream/libdbd-odbc-perl/current/MANIFEST (original)
+++ branches/upstream/libdbd-odbc-perl/current/MANIFEST Fri Jun 19 00:42:03 2009
@@ -98,5 +98,7 @@
t/rt_39841.t
t/rt_39897.t
t/rt_43384.t
+t/rt_46597.t
+t/rt_null_nvarchar.t
unicode_helper.c
unicode_helper.h
Modified: branches/upstream/libdbd-odbc-perl/current/META.yml
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libdbd-odbc-perl/current/META.yml?rev=38248&op=diff
==============================================================================
--- branches/upstream/libdbd-odbc-perl/current/META.yml (original)
+++ branches/upstream/libdbd-odbc-perl/current/META.yml Fri Jun 19 00:42:03 2009
@@ -1,7 +1,7 @@
--- #YAML:1.0
name: DBD-ODBC
abstract: ODBC DBD for Perl DBI
-version: 1.21
+version: 1.22
version_from: ODBC.pm
author:
- Tim Bunce
Modified: branches/upstream/libdbd-odbc-perl/current/ODBC.pm
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libdbd-odbc-perl/current/ODBC.pm?rev=38248&op=diff
==============================================================================
--- branches/upstream/libdbd-odbc-perl/current/ODBC.pm (original)
+++ branches/upstream/libdbd-odbc-perl/current/ODBC.pm Fri Jun 19 00:42:03 2009
@@ -1,4 +1,4 @@
-# $Id: ODBC.pm 12674 2009-04-07 09:04:09Z mjevans $
+# $Id: ODBC.pm 12819 2009-06-10 12:20:40Z mjevans $
#
# Copyright (c) 1994,1995,1996,1998 Tim Bunce
# portions Copyright (c) 1997-2004 Jeff Urlwin
@@ -12,7 +12,7 @@
require 5.006;
-$DBD::ODBC::VERSION = '1.21';
+$DBD::ODBC::VERSION = '1.22';
{
package DBD::ODBC;
@@ -23,7 +23,7 @@
@ISA = qw(Exporter DynaLoader);
- # my $Revision = substr(q$Id: ODBC.pm 12674 2009-04-07 09:04:09Z mjevans $, 13,2);
+ # my $Revision = substr(q$Id: ODBC.pm 12819 2009-06-10 12:20:40Z mjevans $, 13,2);
require_version DBI 1.21;
@@ -1216,6 +1216,29 @@
be made optional and there were no basic objections but it has not
made it's way into the pod yet.
+=head3 Sticky Parameter Types
+
+The DBI specification post 1.608 says in bind_param:
+
+ The data type is 'sticky' in that bind values passed to execute()
+ are bound with the data type specified by earlier bind_param()
+ calls, if any. Portable applications should not rely on being able
+ to change the data type after the first C<bind_param> call.
+
+DBD::ODBC does allow a parameter to be rebound with another data type as
+ODBC inherently allows this. Therefore you can do:
+
+ # parameter 1 set as a SQL_LONGVARCHAR
+ $sth->bind_param(1, $data, DBI::SQL_LONGVARCHAR);
+ # without the bind above the $data parameter would be either a DBD::ODBC
+ # internal default or whatever the ODBC driver said it was but because
+ # parameter types are sticky, the type is still SQL_LONGVARCHAR.
+ $sth->execute($data);
+ # change the bound type to SQL_VARCHAR
+ # some DBDs will ignore the type in the following, DBD::ODBC does not
+ $sth->bind_param(1, $data, DBI::SQL_VARCHAR);
+
+
=head2 Unicode
The ODBC specification supports wide character versions (a postfix of
Modified: branches/upstream/libdbd-odbc-perl/current/dbdimp.c
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libdbd-odbc-perl/current/dbdimp.c?rev=38248&op=diff
==============================================================================
--- branches/upstream/libdbd-odbc-perl/current/dbdimp.c (original)
+++ branches/upstream/libdbd-odbc-perl/current/dbdimp.c Fri Jun 19 00:42:03 2009
@@ -1,4 +1,4 @@
-/* $Id: dbdimp.c 12710 2009-04-20 15:21:32Z mjevans $
+/* $Id: dbdimp.c 12819 2009-06-10 12:20:40Z mjevans $
*
* portions Copyright (c) 1994,1995,1996,1997 Tim Bunce
* portions Copyright (c) 1997 Thomas K. Wenrich
@@ -23,6 +23,9 @@
* and some internal information from the DBI.
* 4 - As above, adding more detailed information from the driver.
* 5 to 15 - As above but with more and more obscure information.
+ *
+ * SV Manipulation Functions
+ * http://perl.active-venture.com/pod/perlapi-svfunctions.html
*/
#include "ODBC.h"
@@ -3146,9 +3149,18 @@
" Need to modify phs->sv in place: old length = %i\n",
value_len);
}
- SV_toWCHAR(phs->sv); /* may modify SvPV(phs->sv), ... */
- /* ... so phs->sv_buf must be updated */
- phs->sv_buf=SvPV(phs->sv,value_len);
+ /* Convert the sv in place to UTF-16 encoded characters
+ NOTE: the SV_toWCHAR may modify SvPV(phs->sv */
+ if (SvOK(phs->sv)) {
+ SV_toWCHAR(phs->sv);
+ /* get new buffer and length */
+ phs->sv_buf = SvPV(phs->sv, value_len);
+ } else { /* it is undef */
+ /* need a valid buffer at least */
+ phs->sv_buf = SvPVX(phs->sv);
+ value_len = 0;
+ }
+
if (DBIc_TRACE(imp_sth, 0, 0, 8)) {
TRACE1(imp_dbh,
" Need to modify phs->sv in place: new length = %i\n",
@@ -3423,7 +3435,7 @@
(phs->strlen_or_ind < 0) &&
(phs->param_size == 0)) {
column_size = 0;
- }
+ }
if (DBIc_TRACE(imp_sth, 0, 0, 5)) {
PerlIO_printf(
DBIc_LOGPIO(imp_dbh),
@@ -3489,9 +3501,11 @@
if (DBIc_TRACE(imp_sth, 0, 0, 4)) {
PerlIO_printf(
DBIc_LOGPIO(imp_dbh),
- "+dbd_bind_ph(%p, %s, value='%.200s', attribs=%s, sql_type=%ld, is_inout=%d, maxlen=%ld\n",
+ "+dbd_bind_ph(%p, name=%s, value='%.200s', attribs=%s, "
+ "sql_type=%ld(%s), is_inout=%d, maxlen=%ld\n",
sth, name, SvOK(newvalue) ? SvPV_nolen(newvalue) : "undef",
- attribs ? SvPV_nolen(attribs) : "", sql_type, is_inout, maxlen);
+ attribs ? SvPV_nolen(attribs) : "", sql_type,
+ S_SqlTypeToString(sql_type), is_inout, maxlen);
}
/* the problem with the code below is we are getting SVt_PVLV when
@@ -3517,10 +3531,9 @@
croak("Can't bind unknown placeholder '%s'", name);
phs = (phs_t*)SvPVX(*phs_svp); /* placeholder struct */
- phs->requested_type = sql_type; /* save type requested */
-
if (phs->sv == &sv_undef) { /* first bind for this placeholder */
phs->value_type = SQL_C_CHAR; /* default */
+ phs->requested_type = sql_type; /* save type requested */
phs->maxlen = maxlen; /* 0 if not inout */
phs->is_inout = is_inout;
@@ -3532,7 +3545,14 @@
imp_sth->out_params_av = newAV();
av_push(imp_sth->out_params_av, SvREFCNT_inc(*phs_svp));
}
- }
+ } else if (sql_type) {
+ /* parameter attributes are supposed to be sticky until overriden
+ so only replace requested_type if sql_type specified.
+ See https://rt.cpan.org/Ticket/Display.html?id=46597 */
+ phs->requested_type = sql_type; /* save type requested */
+ }
+
+
/* check later rebinds for any changes */
/*
* else if (is_inout || phs->is_inout) {
@@ -5227,7 +5247,7 @@
imp_dbh->driver_type = DT_DONT_CARE;
}
}
-
+
if (DBIc_TRACE(imp_dbh, 0x04000000, 0, 0))
TRACE1(imp_dbh, "DRIVER_NAME = %s\n", imp_dbh->odbc_driver_name);
@@ -5302,6 +5322,8 @@
/* can't find stricmp on my Linux, nor strcmpi. must be a
* portable way to do this*/
if (!strcmp(imp_dbh->odbc_dbname, "Microsoft SQL Server")) {
+ if (DBIc_TRACE(imp_dbh, 0x04000000, 0, 0))
+ TRACE0(imp_dbh, "Deferring Binding\n");
imp_dbh->odbc_defer_binding = 1;
}
} else {
@@ -5331,6 +5353,8 @@
/* check to see if SQLDescribeParam is supported */
rc = SQLGetFunctions(imp_dbh->hdbc, SQL_API_SQLDESCRIBEPARAM, &supported);
if (SQL_SUCCEEDED(rc)) {
+ if (DBIc_TRACE(imp_dbh, 0x04000000, 0, 0))
+ TRACE1(imp_dbh, "SQLDescribeParam supported: %d\n", supported);
imp_dbh->odbc_sqldescribeparam_supported = supported ? 1 : 0;
} else {
imp_dbh->odbc_sqldescribeparam_supported = 0;
Modified: branches/upstream/libdbd-odbc-perl/current/dbdimp.h
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libdbd-odbc-perl/current/dbdimp.h?rev=38248&op=diff
==============================================================================
--- branches/upstream/libdbd-odbc-perl/current/dbdimp.h (original)
+++ branches/upstream/libdbd-odbc-perl/current/dbdimp.h Fri Jun 19 00:42:03 2009
@@ -1,12 +1,12 @@
/*
- * $Id: dbdimp.h 12710 2009-04-20 15:21:32Z mjevans $
+ * $Id: dbdimp.h 12806 2009-06-02 15:56:56Z mjevans $
* portions Copyright (c) 2007-2008 Martin J. Evans
* Copyright (c) 1997-2001 Jeff Urlwin
* portions Copyright (c) 1997 Thomas K. Wenrich
* portions Copyright (c) 1994,1995,1996 Tim Bunce
* portions Copyright (c) 1997-2001 Jeff Urlwin
* portions Copyright (c) 2001 Dean Arnold
- * portions Copyright (c) 2007-2008 Martin J. Evans
+ * portions Copyright (c) 2007-2009 Martin J. Evans
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the Perl README file.
Modified: branches/upstream/libdbd-odbc-perl/current/t/02simple.t
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libdbd-odbc-perl/current/t/02simple.t?rev=38248&op=diff
==============================================================================
--- branches/upstream/libdbd-odbc-perl/current/t/02simple.t (original)
+++ branches/upstream/libdbd-odbc-perl/current/t/02simple.t Fri Jun 19 00:42:03 2009
@@ -1,5 +1,5 @@
#!perl -w -I./t
-# $Id: 02simple.t 12667 2009-04-02 10:54:56Z mjevans $
+# $Id: 02simple.t 12744 2009-05-05 13:07:46Z mjevans $
use Test::More;
use strict;
Modified: branches/upstream/libdbd-odbc-perl/current/t/12blob.t
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libdbd-odbc-perl/current/t/12blob.t?rev=38248&op=diff
==============================================================================
--- branches/upstream/libdbd-odbc-perl/current/t/12blob.t (original)
+++ branches/upstream/libdbd-odbc-perl/current/t/12blob.t Fri Jun 19 00:42:03 2009
@@ -1,5 +1,5 @@
#!/usr/bin/perl -w -I./t
-# $Id: 12blob.t 12710 2009-04-20 15:21:32Z mjevans $
+# $Id: 12blob.t 12744 2009-05-05 13:07:46Z mjevans $
#
# blob tests
# currently tests you can insert a clob with various odbc_putdata_start settings
Modified: branches/upstream/libdbd-odbc-perl/current/t/rt_39897.t
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libdbd-odbc-perl/current/t/rt_39897.t?rev=38248&op=diff
==============================================================================
--- branches/upstream/libdbd-odbc-perl/current/t/rt_39897.t (original)
+++ branches/upstream/libdbd-odbc-perl/current/t/rt_39897.t Fri Jun 19 00:42:03 2009
@@ -1,11 +1,11 @@
#!/usr/bin/perl -w -I./t
-# $Id: rt_39897.t 12603 2009-03-12 11:28:12Z mjevans $
+# $Id: rt_39897.t 12819 2009-06-10 12:20:40Z mjevans $
#
# test for rt 39897. DBD::ODBC 1.17 was accidentally changed to apply
# LongReadLen to SQL_VARCHAR columns. 1.16 and earlier only use LongTruncOk
# and LongReadLen on long columns e.g. SQL_LONGVARCHAR. As a result, if you
# had a table with a varchar(N) where N > 80 (80 being the default for
-# LongReadLen) and moved from 1.16 to 1.17 then yopu'd suddenly get data
+# LongReadLen) and moved from 1.16 to 1.17 then you'd suddenly get data
# truncated errors for rows where the SQL_VARCHAR was > 80 chrs.
#
use Test::More;
Added: branches/upstream/libdbd-odbc-perl/current/t/rt_46597.t
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libdbd-odbc-perl/current/t/rt_46597.t?rev=38248&op=file
==============================================================================
--- branches/upstream/libdbd-odbc-perl/current/t/rt_46597.t (added)
+++ branches/upstream/libdbd-odbc-perl/current/t/rt_46597.t Fri Jun 19 00:42:03 2009
@@ -1,0 +1,83 @@
+#!/usr/bin/perl -w -I./t
+# $Id: rt_46597.t 12819 2009-06-10 12:20:40Z mjevans $
+use Test::More;
+use strict;
+
+$| = 1;
+
+my $has_test_nowarnings = 1;
+eval "require Test::NoWarnings";
+$has_test_nowarnings = undef if $@;
+my $tests = 7;
+$tests += 1 if $has_test_nowarnings;
+plan tests => $tests;
+
+use DBI qw(:sql_types);
+use_ok('ODBCTEST'); # 1
+use_ok('Data::Dumper'); # 2
+
+my $dbh;
+
+BEGIN {
+ plan skip_all => "DBI_DSN is undefined"
+ if (!defined $ENV{DBI_DSN});
+}
+END {
+ if ($dbh) {
+ eval {
+ local $dbh->{PrintWarn} = 0;
+ local $dbh->{PrintError} = 0;
+ $dbh->do(q/drop table PERL_DBD_rt_46597/);
+ };
+ $dbh->disconnect;
+ }
+ Test::NoWarnings::had_no_warnings()
+ if ($has_test_nowarnings); # 8
+}
+
+$dbh = DBI->connect();
+unless($dbh) {
+ BAIL_OUT("Unable to connect to the database $DBI::errstr\nTests skipped.\n");
+ exit 0;
+}
+my $sth;
+$dbh->{RaiseError} = 1;
+my $dbname = $dbh->get_info(17); # DBI::SQL_DBMS_NAME
+SKIP: {
+ skip "Microsoft Access tests not supported using $dbname", 5
+ unless ($dbname =~ /Access/i);
+
+ eval {
+ local $dbh->{PrintWarn} = 0;
+ local $dbh->{PrintError} = 0;
+ $dbh->do(q/drop table PERL_DBD_rt_46597/);
+ };
+ pass('dropped test table'); # 3
+
+ eval {$dbh->do(q{CREATE TABLE PERL_DBD_RT_46597 (Sequence memo)})};
+
+ my $data = "GAAGCGGGATGAGCTCAAACTTAAAATCTCTGTTGCTTGCAACAGCGAATTGTAGTCTCGAGAAGCGTTTTCAAGGCGGATGCACAGTGCTCAAGTTGCTTGGAACGGCACATCGTAGAGGGTGACAATCCCGTACGTGGCACTGTGTACTGTTCACGATTCGCTTTCTATGAGTCGGGTTGCTTGGGAATGCAGCCCAAAATGGGAGGTAAACTCCTTCTAAAGCTAAATATTGGCACGAGACCGATAGCGAACAAGTACCGTGAGGGAAAGATGAAAAGCACTTTGAAAAGAAAGTTAATAGTACGTGAAACCGTTAGTAGGGAAGCGCATGGAATTAGCAATACACTGTCGAGATTCAGGCGGGCGGCGATTGGTACGGCTGTTGTACGGATCTGAATGGACCGTCGGTGGTCGTCACTGGTTGCTGCCTGTTGCATTTCCCGGCAGTGTTCGTCAACAGGTGTTGGAACCGAGCGATAAGCCCCGCAGGAAGGTGGCTGGCTTCGGCTAGTGTTATAGCCTGTGGTGTGCGAGCTCGGGTCCGACAGAGGGGTTGCGGCACATGCTCTTTTGGGCTGGTCTCGTCTCTCTCGGCTGGTTGTCGACTATGGCGGACTGCGTGCAGTGCGCTTGAACTGCTGCCGGTCGTCGAGGGGCATCGGACACACATTGTGCCAAGGTTGTTGGCGGTCATATGGTTTCATACGACCCGTCTTGAAACACGGACCAAGGAGTCTAACATGTGTGCGAGTCTTTGGGTGATCGAAACCCGCAGGCACAATGAAAGTAAAGGCTGCTTGCAGCTGAAGTGAGATCTCCCGGTCTCGGCCGGGGGCGCATCATTGACCGACCTATTCTACTCCTAGAAAGGTTTGAGTAAGAGCACATCTGTTGGGACCCGAAAGATGGTGAACTATGCTTGAGTAGGGCGAAGCCAGAGGAAACTCTGGTGGAGGCTCGTAGCGATTCTGACGTGCAAATCGATCGTCAAACTTGAGTATAGGGGCGAAAGACTAATCGAACCATCTAGTAGCTGGTTCCCTCCGAAGTTTCCCTTAGGATAGCTGGAACTCGGAACAGTTTTATCAGGTAAAGCGAATGATTAGAGGTCTTAGGATTGAAACAATCTTAACCTATTCTCAAACTTTAAATTGGTAAGAAGCCCGGCTTGCTTAACTGAAGCAGGGCACAGAATGAGAGTTCTTAGTGGGCCATTTTTGGTAAGCAGAACTGGCGATGCGGGATGAACCGAACGCTGAGTTAAGGCGTCTAAATCGACGCTCATCAGACCCCACAAAAGGTGTTGGTTGATCTAGACAGCAGGACGGTGGCCATGGAAGTCGGAATCCGCTAAGGAGTGTGTAACAACCCACCTGCCGAATCAACTAGCCCTGAAAATGGATGACGCTCAAGCGTCGTGCCTATACTCAGCCGTCAACGTAAATAGCGAAGCGTTGACGAGTAGGAGGGCGTGGGGATCGTGACGCAGCCTTTGGCGTGAGCCTGGGTGAAACGGTCTCTAGTGAAGATCTTGGTGGTAGTAGCAAATATTCAAATGAGAACTTTGAAGACCGAAGTGGAGAAAGGTTCCATGTGAACAGCAGTTGGACATGGGTTAGTCGATCCTAAGAGATAGGGAAACTCCGTTTCAAAGTGTCCGATCTTGGACCGTTTATCGAAAGGGAATCGGGTTAATATTCCCGAACCAGAACGCGGATATTCTAGCCTCTCGGGGTTAGATGTGCGGTAACGCAACTGAACTCGGAGACGTCGGCAGGGGCCCTGGGAAGAGTTCTCTTTTCTTGTTAACGACCTGACACCATGGAATCTGATTGCCAGGAGATATGGTTTGATGGTCGGTAAAGCACCACACTTCTTGTGGTGTCCGGTGCGCTCCTGAAGGCCCTTGAAAATCCGAGGGAAAGATTGATTTTCGCGTCTGTTCGTACTCATAACCGCAGCAGGTCTCCAAGGTGAGCAGCCTCTGGTCGATAGAACAATGTAGGTAAGGGAAGTCGGCAAAATAGATCCGTAACTTCGGGAAAAGGATTGGCTCTAAGGATTGGGTCTGTCGGGCTGAGACTTGAAGCGGGCGGCACCGACTCGGACTGGCTGTGGCCTCTCGGGGCTATGGTTGGACTGGGAAGGAACTGCGCGTGGATTGGCCCAGCTATGCTCGCAAGAGCAGTTCGGCAGGCAATTAACAATCAACTTAGAACTGGTACGGACAAGGGGAATCCGACTGTTTAATTAAAACAAAGCATTGCGATGGCCGGAAACGGTGTTGACGCAATGTGATTTCTGCCCAGTGCTCTGAATGTCAAAGTGAAGAAATTCAACCAAGCGCGGGTAAACGGCGGGAGTAACTATGACTCTCTTAAGGTAGCCAAATGCCTCGTCATCTAATTAGTGACGCGCATGAATGGATTAACGAGATTCCCACTGTCCCTATCTACTATCTAGCGAAACCACAGCCAAGGGAACGGGCTTGGCAAAATCAGCGGGGAAAGAAGACCCTGTTGAGCTTGACTCTAGTCTGACTCTGTGAAAAGACATAGGAGGTGTAGAATAGGTGGGAGCAGCAATGCAACAGTGAAATACCACTACTCTTATAGTTTTTTTACTTATTCGATTGAGCGGAAGCGAGCTTCACGGCTCATTTTCTAGAATTAAGGCCCCATTGGCGGGTCGATCCGTGTCGAAGACACTGTCAGGTTGGGAGTTTGGCTGGGGCGGCACATCTGTCAAATGATAACGCAGGTGTCCTAAGGTGAGCTCAATGAGAACGGAAATCTCATGTAGAACAAAAGGGTAAAAGCTCACTTGATTTTGATTTTCAGTATGAATACAAACTGTGAAAGCATGGCCTATCGATCCTTTAGTCTTTAGGAGTTTTAAGCTAGAGGTGTCAGAAAAGTTACCACAGGGATAACTGGCTTGTGGCAGCCAAGCGTTCATAGCGACGTTGCTTTTTGATCCTTCGATGTCGGCTCTTCCTATCATTGTGAAGCAGAATTCACCAAGTGTTGGATTGTTCACCCACTAATAGGGAACGTGAGCTGGGTTTAGACCGTCGTGAGACAGGTTAGTTTTACCCTACTGATGAAGTGTTGTTGCAATAGTAATTCTGCTCAGTACGAGAGGAACCGCAGATTCAGACAATTGGCATTTGCACTTGCTTGAAAAGGCAATGGTG";
+
+ my $ev = $@;
+ ok(!$ev, 'created test table PERL_DBD_rt_46597'); # 4
+ SKIP: {
+ skip 'failed to create test table', 3 if $ev;
+
+
+ my $sth = $dbh->prepare(
+ q{INSERT INTO TestTable values (?)}) || die ($DBI::errstr);
+ ok($sth, 'insert prepared'); # 5
+
+ SKIP: {
+ skip 'failed to prepare', 2 if !$sth;
+
+ ok($sth->bind_param(1, $data, DBI::SQL_LONGVARCHAR),
+ 'parameter bound'); # 6
+ eval {$sth->execute($data)};
+ $ev = $@;
+ ok(!$ev, "inserted into test table with sticky parameter type"); # 7
+ };
+ };
+};
+
+exit 0;
Added: branches/upstream/libdbd-odbc-perl/current/t/rt_null_nvarchar.t
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libdbd-odbc-perl/current/t/rt_null_nvarchar.t?rev=38248&op=file
==============================================================================
--- branches/upstream/libdbd-odbc-perl/current/t/rt_null_nvarchar.t (added)
+++ branches/upstream/libdbd-odbc-perl/current/t/rt_null_nvarchar.t Fri Jun 19 00:42:03 2009
@@ -1,0 +1,118 @@
+#!/usr/bin/perl -w -I./t
+# $Id: rt_null_nvarchar.t 12819 2009-06-10 12:20:40Z mjevans $
+#
+# test varbinary(MAX) and varchar(MAX) types in SQL Server
+# Mostly rt_38977 with additional:
+# test you can insert NULL into VARxxx(MAX) types.
+#
+use Test::More;
+use strict;
+$| = 1;
+
+my $has_test_nowarnings = 1;
+eval "require Test::NoWarnings";
+$has_test_nowarnings = undef if $@;
+my $tests = 8;
+$tests += 1 if $has_test_nowarnings;
+plan tests => $tests;
+
+# can't seem to get the imports right this way
+use DBI qw(:sql_types);
+
+my $dbh;
+
+BEGIN {
+ if (!defined $ENV{DBI_DSN}) {
+ plan skip_all => "DBI_DSN is undefined";
+ }
+}
+
+END {
+ if ($dbh) {
+ eval {
+ local $dbh->{PrintWarn} = 0;
+ local $dbh->{PrintError} = 0;
+ $dbh->do(q/drop table PERL_DBD_rt_NLVC/);
+ };
+ }
+ Test::NoWarnings::had_no_warnings()
+ if ($has_test_nowarnings);
+}
+
+$dbh = DBI->connect();
+unless($dbh) {
+ BAIL_OUT("Unable to connect to the database $DBI::errstr\nTests skipped.\n");
+ exit 0;
+}
+$dbh->{RaiseError} = 1;
+
+my $dbms_name = $dbh->get_info(17);
+ok($dbms_name, "got DBMS name: $dbms_name");
+my $dbms_version = $dbh->get_info(18);
+ok($dbms_version, "got DBMS version: $dbms_version");
+my $driver_name = $dbh->get_info(6);
+ok($driver_name, "got DRIVER name: $driver_name");
+my $driver_version = $dbh->get_info(7);
+ok($driver_version, "got DRIVER version $driver_version");
+
+my ($ev, $sth);
+
+SKIP: {
+ skip "not SQL Server", 6 if $dbms_name !~ /Microsoft SQL Server/;
+ skip "Easysoft OOB", 6 if $driver_name =~ /esoobclient/;
+ my $major_version = $dbms_version;
+ $major_version =~ s/^(\d+)\..*$/$1/;
+ #diag("Major Version: $major_version\n");
+ skip "SQL Server version too old", 6 if $major_version < 9;
+
+ eval {
+ local $dbh->{PrintWarn} = 0;
+ local $dbh->{PrintError} = 0;
+ $dbh->do('drop table PERL_DBD_rt_NLVC');
+ };
+
+ eval {
+ $dbh->do('create table PERL_DBD_rt_NLVC (a NVARCHAR(MAX) NULL)');
+ };
+ $ev = $@;
+ ok(!$ev, 'create test table with nvarchar(max)');
+
+ SKIP: {
+ skip "Failed to create test table", 2 if ($ev);
+ eval {
+ $sth = $dbh->prepare('INSERT into PERL_DBD_rt_NLVC VALUES (?)');
+ };
+ $ev = $@;
+ ok($sth && !$@, "prepare insert");
+ SKIP: {
+ skip "Failed to prepare", 2 if ($ev);
+ my $x = 'x' x 500000;
+ eval {
+ $sth->execute($x);
+ };
+ $ev = $@;
+ ok(!$ev, "execute insert");
+ if ($ev) {
+ diag("Execute for insert into varchar(max) failed with $ev");
+ diag(q/Some SQL Server drivers such as the native client 09.00.1399 / .
+ q/driver fail this test with a HY104, "Invalid precision error". / .
+ qq/You have driver $driver_name at version $driver_version. / .
+ q/There is a free upgrade from Microsoft of the native client driver /.
+ q/to 10.00.1600 which you will need if you intend to insert / .
+ q/into varchar(max) columns./);
+ }
+ eval {
+ $sth->execute(undef);
+ };
+ ok(!$ev, 'insert NULL into VARCHAR(MAX)') ||
+ diag($ev);
+ };
+ };
+ eval {
+ local $dbh->{PrintWarn} = 0;
+ local $dbh->{PrintError} = 0;
+ $dbh->do('drop table PERL_DBD_rt_NLVC');
+ };
+
+};
+
Modified: branches/upstream/libdbd-odbc-perl/current/test_results.txt
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libdbd-odbc-perl/current/test_results.txt?rev=38248&op=diff
==============================================================================
--- branches/upstream/libdbd-odbc-perl/current/test_results.txt (original)
+++ branches/upstream/libdbd-odbc-perl/current/test_results.txt Fri Jun 19 00:42:03 2009
@@ -49,3 +49,59 @@
All tests successful, 18 subtests skipped.
Files=19, Tests=427, 11 wallclock secs ( 0.00 cusr + 0.00 csys = 0.00 CPU)
======================================================================
+t/01base................ok
+t/02simple..............ok 1/65#
+# Perl 5.7.8
+# osname=linux, osvers=2.6.9-22.0.2.elsmp, archname=i686-linux
+# Using DBI 1.607
+# Using DBD::ODBC 1.21
+# Using DBMS_NAME 'Microsoft SQL Server'
+# Using DBMS_VER '09.00.4035'
+# Using DRIVER_NAME 'esoobclient'
+# Using DRIVER_VER '02.00.0000'
+# odbc_has_unicode 0
+t/02simple..............ok
+t/03dbatt...............ok 1/29#
+# N.B. Some drivers (postgres/cache) may return ODBC 2.0 column names
+for the SQLTables result-set e.g. TABLE_QUALIFIER instead of TABLE_CAT
+t/03dbatt...............ok
+t/05meth................ok
+t/07bind................ok
+t/08bind2...............ok
+t/09multi...............ok
+t/10handler.............ok
+t/12blob................ok
+t/20SqlServer...........ok 54/65# DBD::ODBC::st execute failed:
+[unixODBC][Microsoft][ODBC SQL Server Driver]Connection is busy with
+results for another hstmt (SQL-HY000) at t/20SqlServer.t line 202.
+# DSN=dbi:ODBC:DSN=XXX;MARS_Connection=yes;
+#
+# NOTE: You failed this test because your SQL Server driver
+# is too old to handle the MARS_Connection attribute. This test cannot
+# easily skip this test for old drivers as there is no definite SQL Server
+# driver version it can check.
+#
+t/20SqlServer...........ok
+ 1/65 skipped: WARNING: driver does NOT support MARS_Connection
+t/30Oracle..............ok
+ 3/5 skipped: Oracle tests not supported using Microsoft SQL Server
+t/40UnicodeRoundTrip....ok
+ 61/62 skipped: Unicode-specific tests disabled - not a unicode build
+t/41Unicode.............ok
+ 54/55 skipped: Unicode-specific tests disabled - not a unicode build
+t/pod-coverage..........ok 1/1# Test::Pod::Coverage 1.04 required for
+testing POD coverage
+t/pod-coverage..........ok
+t/pod...................ok
+ 3/3 skipped: Test::Pod 1.00 required for testing POD
+t/rt_38977..............ok
+ 6/11 skipped: Easysoft OOB
+t/rt_39841..............ok
+ 25/28 skipped: not SQL Server ODBC or native client driver
+t/rt_39897..............ok
+t/rt_43384..............ok
+ 7/9 skipped: Microsoft Access tests not supported using
+Microsoft SQL Server
+All tests successful, 160 subtests skipped.
+Files=19, Tests=430, 15 wallclock secs ( 1.17 cusr + 1.48 csys = 2.65 CPU)
+======================================================================
Modified: branches/upstream/libdbd-odbc-perl/current/unicode_helper.c
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libdbd-odbc-perl/current/unicode_helper.c?rev=38248&op=diff
==============================================================================
--- branches/upstream/libdbd-odbc-perl/current/unicode_helper.c (original)
+++ branches/upstream/libdbd-odbc-perl/current/unicode_helper.c Fri Jun 19 00:42:03 2009
@@ -1,5 +1,5 @@
/*
- * $Id: unicode_helper.c 11733 2008-09-03 15:30:58Z mjevans $
+ * $Id: unicode_helper.c 12819 2009-06-10 12:20:40Z mjevans $
*/
#ifdef WITH_UNICODE
@@ -10,7 +10,7 @@
typedef enum { do_new=1, do_cat, do_set } new_cat_set_t;
/* static prototypes */
-static unsigned short utf16_len(UTF16 *wp);
+static long utf16_len(UTF16 *wp);
static void utf16_copy(UTF16 *d, UTF16 *s);
static SV * _dosvwv(SV * sv, UTF16 * wp, STRLEN len, new_cat_set_t mode);
@@ -180,7 +180,7 @@
if (widechars!=0) {
MultiByteToWideChar(CP_UTF8,0,s,-1,buf,widechars);
}
-#else
+#else /* !WIN32 */
unsigned int widechrs, bytes;
size_t slen;
ConversionResult ret;
@@ -188,10 +188,12 @@
UTF16 *target_start, *target_end;
slen = strlen(s);
- /*printf("utf8 string \\%s\\ is %ld bytes long\n", s, strlen(s));*/
+ /*printf("utf8 string \\%.20s\\ is %ld bytes long\n", s, strlen(s));*/
source_start = s;
- source_end = s + slen + 1; /* include NUL terminator */
+ /* source_end needs to include NUL and be 1 past as ConvertUTF8toUTF17
+ loops while < source_end */
+ source_end = s + slen + 1;
ret = ConvertUTF8toUTF16(
(const UTF8 **)&source_start, source_end,
@@ -207,18 +209,21 @@
croak("WValloc: unknown ConvertUTF16toUTF8 error");
}
}
- /*fprintf(stderr,"utf8 -> utf16 requires %d bytes\n", bytes);*/
+ /*printf("utf8 -> utf16 requires %d bytes\n", bytes);*/
widechrs = bytes / sizeof(UTF16);
- /*fprintf(stderr, "Allocating %d wide chrs\n", widechrs);*/
-
- Newz(0,buf,widechrs+1,UTF16);
+ /*printf("Allocating %d wide chrs\n", widechrs);*/
+
+ Newz(0,buf,widechrs + 1,UTF16);
if (widechrs != 0) {
source_start = s;
+ /* 1 after NUL because ConvertUTF8toUTF16 does while < end */
source_end = s + slen + 1;
target_start = buf;
- target_end = buf + widechrs + 1;
- /*fprintf(stderr, "%p %p %p %p\n", source_start, source_end, target_start, target_end);*/
+ /* in ConvertUTF8toUTF16 once target_end hit buf is exhausted */
+ target_end = buf + widechrs;
+ /*printf("ss=%p se=%p ts=%p te=%p\n",
+ source_start, source_end, target_start, target_end);*/
ret = ConvertUTF8toUTF16(
(const UTF8 **)&source_start, source_end,
@@ -226,10 +231,9 @@
if (ret != conversionOK) {
croak("WValloc: second call to ConvertUTF8toUTF16 failed (%d)", ret);
}
- /*fprintf(stderr, "Second returned %d bytes\n", bytes);*/
-
- }
-#endif
+ /*printf("Second returned %d bytes\n", bytes);*/
+ }
+#endif /* WIN32 */
}
return buf;
}
@@ -288,7 +292,7 @@
unsigned int bytes;
UTF8 *target_start;
UTF8 *target_end;
- unsigned int len;
+ long len;
if (wp != NULL) {
len = utf16_len(wp);
@@ -351,8 +355,10 @@
/* warn("SV_toWCHAR called for undef"); */
return;
}
+ /* _force makes sure SV is only a string */
p=SvPVutf8_force(sv,len);
- /* _force makes sure SV is only a string */
+ /*printf("p=%p, strlen(p) = %d\n", p, strlen(p));*/
+
wp=WValloc(p); /* allocate wp containing utf16 copy of utf8 p */
len=utf16_len(wp);
p=SvGROW(sv,sizeof(UTF16)*(1+len));
@@ -362,9 +368,9 @@
SvPOK_only(sv); /* sv is nothing but a non-UTF8 string -- for Perl ;-) */
}
-static unsigned short utf16_len(UTF16 *wp)
-{
- unsigned short len = 0;
+static long utf16_len(UTF16 *wp)
+{
+ long len = 0;
if (!wp) return 0;
More information about the Pkg-perl-cvs-commits
mailing list