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