DBI::Changes(3)

✨ NAME ✨

okay so. this is DBI::Changes — section 3 of the manual, hi bestie 💖 — and it is literally just the list. The whole list. Every significant change that has ever landed in the DBI, newest at the top, oldest at the bottom, with every CVE, every issue number, and every single person who sent a patch getting their name in lights ✨

Think of it as the group chat scrollback for a module that has genuinely been through it. Not me being dramatic, it's just true 💅


🎀 Changes in DBI 1.656 - 17 Oct 2026

  • Re-add conflicts to cpanfile. (WIP) — it's giving "work in progress", she said what she said 💀
  • Remove lock file on end of scope
  • Prevent dbi_profile crash (CVE-2026-108518) (Henrik Teichmann)
  • Memory corruption via selectrow_array + SQLite UDF (issue#98)
  • Fix errstr when dbm_updatable_key attribute for DBD::DBM is set to 2 (croak) on Perl versions < v5.13.2
  • Fix emit warnings when dbm_updatable_key attribute for DBD::DBM is set to 1 (carp)
  • Fix lock file not removed when DBD::DBM check for bad serializer class fails. (CVE-2026-111879)
  • * WARNING: Next release will require perl-5.14 * - Main reason: Exception handling
🚨 bestie this is not a drill: the next release requires perl-5.14, and the main reason is exception handling. That's the whole reason. Upgrade era, no cap.

💫 Changes in DBI 1.655 - 30 Sep 2026

  • Fix for C89 (Paul Howarth, PR#197)
  • Ignore invalid handles consistently (detected by Raj)

🌸 Changes in DBI 1.654 - 25 Sep 2026

  • Fix DBI::sql_type_cast on IV/NV (CVE-2026-88815) (reported by Raj)
  • Fix FetchHashKeyName on IV/NV (CVE-2026-88816) (reported by Raj)
  • Fix provided in META

🦋 Changes in DBI 1.653 - 09 Sep 2026

  • Fix test for 32bit-perl (report in PR#189)
  • Fix arbitrary module and file loading via dbm_type/dbm_mldbm (CVE-2026-78030)
  • More META checking/updates
  • Tighten symlink outside of f_dir (CVE-2026-15392) check (reported by Raj)
  • CPAN.org does not forward email anymore

🎀 Changes in DBI 1.652 - 15 Aug 2026

  • DBI now requires perl-5.12, driven by CVE's
  • Fix test for perl configured without threads (caught by perl-5.45.1)
  • Small doc fix, (issue#155), thanks Dick Franks
  • Add suggested dependency (issue#145), thanks Dick Franks
  • Force placeholder limit on :# and :p# too (CVE-2026-73194)
  • Limit statements to 292 Mb in preparse (CVE-2026-73193)
  • Add a security policy (issue#174)
  • Add dbm_updatable_key attribute to DBD::DBM to configure how keys are updated
  • Fix missing import in DBI::DBD::SqlEngine
  • Fix !Caller2 caller loss when $^P is set (PR#184) (Thanks Paul)

🌈 Changes in DBI 1.651 - 14 Jul 2026

  • Fix inverted comparisons for strings in DBI::SQL::Nano (CVE-2026-15043)
  • Document that IS NULL matches empty strings in DBI::SQL::Nano
  • Fix DBD::File to ensure that the table is not a symlink outside of f_dir (CVE-2026-15392)
  • Fix an out-of-bounds error when a statement handle has no fields but the source row is not empty (CVE-2026-60082)
  • Add an overridable upper bound $MAX_PATH_DEPTH for DBI::ProfileData (CVE-2026-60081)
  • * WARNING: Next release will require perl-5.12 *

💜 Changes in DBI 1.650 - 06 Jul 2026

  • Set a hard limit of 99999 on ? placeholders (CVE-2026-14739)
  • Fix out-of-bounds read in preparse of SQL that starts with a comment (CVE-2026-14740)
  • Fix code injection via Profile DSN attribute or DBI_PROFILE variable (CVE-2026-14380)
  • Update dbipport.h to Devel::PPPort-3.73
  • Require Test::More 0.96 (tests will otherwise fail on pristine perl-5.12)

🍓 Changes in DBI 1.649 - 22 Jun 2026

  • Extra Cwd::abs_path required for Windows

🧚 Changes in DBI 1.648 - 04 Jun 2026

  • Correct sprintf usage for trace_msg (issue#132)
  • Add DBIXS_VERSION & DBIXS_RELEASE to dbixs_rev.h
  • Remove -Wbad-function-cast
  • Fix possible stack overflow (old issue already noted by Tim) (CVE-2026-9698)
  • Do not allow table source locations outside explicit given folders
  • DBD::Sponge PRECISION handling (pr#12, pilcrow)
  • Fix possible buffer overflow in preparse (CVE-2026-10879)
  • Skip mismatching .so's (Greg, PR#81)
  • Fix cast warning in dbi_get_state (Greg, PR#182)

⭐ Changes in DBI 1.647 - 20 Jan 2025

  • Spellcheck
  • Fix Makefile rules for Changes (Windows case issue)
  • Another example to bind columns (issue#159)
  • Fix fetchall_arrayref for undefined NAME (issue#156)

💖 Changes in DBI 1.646 - 11 Jan 2025

  • Remove "experimental" tag from statistics_info () (issue#134)
  • RT tickets moved to github issues (Dick Franks++) - All RT tickets now marked as resolved with reference to GitHub issue
  • Fix install issue (issue #168)

🔥 Changes in DBI 1.645 - 03 Sep 2024

  • Move developer tests to xt/
  • Make Changes match CPAN::Changes::Spec and regen DBI::Changes from that
  • Fixes for modern gcc i.c.w. recent perl (Daniël)
  • Small code & doc cleanups for recent perl
  • See TODO in perldoc DBI to see where you can help with documentation!

👑 Changes in DBI 1.644 - 23 Aug 2024

  • Update Devel::PPPort, thanks to H.Merijn Brand
  • Fix CVE-2014-10401 and CVE-2014-10402 - f_dir might not exist in DBD::File connections, thanks to Jens Rehsack & H.Merijn Brand
  • Do not check gccversion on clang, thanks to Daniël van Eeden
  • Upgrade GIMME to GIMME_V, thanks to Daniël van Eeden
  • Do not check with JSON::XS with perl-5.022 and later, thanks to H.Merijn Brand
  • Makefile.PL allows gcc-10 and up now, thanks to H.Merijn Brand (noted by XSven)
  • Do not leak $_ after callback execution (rt#144526, PR#117), thanks to Mauke
  • Switch from Dynaloader to XSLoader (PR#94), thanks to Todd
  • Tim handed the project to the team
  • Merge Pull Requests, resolve RT tickets, & resolve GH issues, thanks to many! Please check gitlog

🦋 Changes in DBI 1.643 - 31 Jan 2020

  • Fix memory corruption in XS functions when Perl stack is reallocated, thanks to Pali
  • Fix calling dbd_db_do6 API function, thanks to Pali
  • Fix potentially calling newSV(0) in malloc_using_sv(), thanks to Pali
  • Fix order of XS preparse() ps_accept and ps_return argument names, thanks to Petr Písař
  • Fix a potential NULL profile dereference in dbi_profile(), thanks to Petr Písař
  • Fix a buffer overflow on an overlong DBD class name, thanks to Petr Písař
  • Remove remnants of support for perl <= v5.8.0, thanks to Pali and H.Merijn Brand
  • Update Devel::PPPort and remove redundant compatibility macros, thanks to Pali and H.Merijn Brand
  • Correct minor typo in documentation, thanks to Mohammad Anwar
  • Correct documentation introducing $dbh->selectall_array(), thanks to Pali
  • Introduce select and do wrappers earlier in the documentation, thanks to Dan Book
  • Mark as deprecated old API functions which overflow or are affected by Unicode issues, thanks to Pali
  • Add new attribute RaiseWarn, similar to RaiseError, thanks to Pali

💫 Changes in DBI 1.642 - 28 Oct 2018

  • Fix '.' in @INC for proxy test under parallel load, thanks to H.Merijn Brand.
  • Fix driver-related croak() in DBI->connect to report the original DSN, thanks to maxatome #67
  • Introduce a new statement DBI method $sth->last_insert_id(), thanks to pali #64
  • Allow to call $dbh->last_insert_id() method without arguments, thanks to pali #64
  • Added a new XS API function variant dbd_db_do6(), thanks to Pali #61
  • Fix misprints in doc of selectall_hashref, thanks to Perlover #69
  • Remove outdated links to DBI related training resources. RT#125999

🌸 Changes in DBI 1.641 - 19 Mar 2018

  • Remove dependency on Storable 2.16 introduced in DBI 1.639, thanks to Ribasushi #60
  • Avoid compiler warnings in Driver.xst #59, thanks to pali #59

🎀 Changes in DBI 1.640 - 28 Jan 2018

  • Fix test t/91_store_warning.t for perl 5.10.0, thanks to pali #57
  • Add Perl 5.10.0 and 5.8.1 specific versions to Travis testing, thanks to pali #57
  • Add registration of mariadb_ prefix for new DBD::MariaDB driver, thanks to pali #56

💜 Changes in DBI 1.639 - 28 Dec 2017

  • Fix UTF-8 support for warn/croak calls within DBI internals, thanks to pali #53
  • Fix dependency on Storable for perl older than 5.8.9, thanks to H.Merijn Brand.
  • Add DBD::Mem driver, a pure-perl in-memory driver using DBI::DBD::SqlEngine, thanks to Jens Rehsack #42
  • Corrected missing semicolon in example in documentation, thanks to pali #55

🧚 Changes in DBI 1.637 - 16 Aug 2017

  • Fix use of externally controlled format string (CWE-134) thanks to pali #44
  • Fix extension detection for DBD::File related drivers
  • Fix tests for perl without dot in @INC RT#120443
  • Fix loss of error message on parent handle, thanks to charsbar #34
  • Fix disappearing $_ inside callbacks, thanks to robschaber #47
  • Fix dependency on Storable for perl older than 5.8.9
  • Allow objects to be used as passwords without throwing an error, thanks to demerphq #40
  • Allow $sth NAME_* attributes to be set from Perl code, re #45
  • Added support for DBD::XMLSimple thanks to nigelhorne #38
  • Documentation updates:
    • Improve examples using eval to be more correct, thanks to pali #39
    • Add cautionary note to prepare_cached docs re refs in %attr #46
    • Small POD changes (Getting Help -> Online) thanks to openstrike #33
    • Adds links to more module names and fix typo, thanks to oalders #43
    • Typo fix thanks to bor #37

⭐ Changes in DBI 1.636 - 24 Apr 2016

  • Fix compilation for threaded perl <= 5.12 broken in 1.635 RT#113955
  • Revert change to DBI::PurePerl DESTROY in 1.635
  • Change t/16destroy.t to avoid race hazard RT#113951
  • Output perl version and archname in t/01basics.t
  • Add perl 5.22 and 5.22-extras to travis-ci config

🍓 Changes in DBI 1.635 - 24 Apr 2016

  • Fixed RaiseError/PrintError for UTF-8 errors/warnings. RT#102404
  • Fixed cases where ShowErrorStatement might show incorrect Statement RT#97434
  • Fixed DBD::Gofer for UTF-8-enabled STDIN/STDOUT, thanks to mauke PR#32
  • Fixed fetchall_arrayref({}) behavior with no columns, thanks to Dan McGee PR#31
  • Fixed tied CachedKids ref leak in attribute cache by weakening, thanks to Michael Conrad RT#113852
  • Fixed "panic: attempt to copy freed scalar" upon commit() or rollback(), thanks to fbriere for detailed bug report RT#102791
  • Ceased to ignore DESTROY of outer handle in DBI::PurePerl
  • Treat undef in DBI::Profile Path as string "undef", thanks to fREW Schmidt RT#113298
  • Fix SQL::Nano parser to ignore trailing semicolon, thanks to H.Merijn Brand.
  • Added @ary = $dbh->selectall_array(...) — new method just dropped, huge thanks to Ed Avis RT#106411 🫶
  • Added appveyor support (basically Travis but for windows, iykyk) — ty mbeijen PR#30 ✨
  • Corrected spelling errors in pod — ty Gregor Herrmann RT#107838 📝
  • Corrected and/or removed broken links to SQL standards — ty David Pottage RT#111437 🔗
  • Corrected doc example to use dbi: instead of DBI: in DSN — ty Michael R. Davis RT#101181 💅
  • Removed/updated broken links in docs — ty mbeijen PR#29
  • Clarified docs for DBI::hash($string)
  • Removed the ancient DBI::FAQ module RT#102714 🗑️ rip bestie
  • Fixed t/pod.t to require Test::Pod >= 1.41 RT#101769

This release was developed at the Perl QA Hackathon 2016 <http://act.qa-hackathon.org/qa2016/> — and the way it happened at all is because so many sponsors were generous, no cap:

<https://www.fastmail.com> FastMail, <https://www.ziprecruiter.com> ZipRecruiter, <http://www.activestate.com> ActiveState, <http://www.opusvl.com> OpusVL, <https://www.strato.com> Strato, <http://www.surevoip.co.uk> SureVoIP, <http://www.cv-library.co.uk> CV-Library, <https://www.iinteractive.com/> Infinity, <https://opensource.careers/perl-careers/> Perl Careers, <https://www.mongodb.com> MongoDB, <https://www.thinkproject.com> thinkproject!, <https://www.dreamhost.com/> Dreamhost, <http://www.perl6.org/> Perl 6, <http://www.perl-services.de/> Perl Services, <https://www.evozon.com/> Evozon, <http://www.booking.com> Booking, <http://eligo.co.uk> Eligo, <http://www.oetiker.ch/> Oetiker+Partner, <http://capside.com/en/> CAPSiDE, <https://www.procura.nl/> Procura, <https://constructor.io/> Constructor.io, <https://metacpan.org/author/BABF> Robbie Bow, <https://metacpan.org/author/RSAVAGE> Ron Savage, <https://metacpan.org/author/ITCHARLIE> Charlie Gonzalez, <https://twitter.com/jscook2345> Justin Cook. 👑💖


🌈 Changes in DBI 1.634 - 03 Aug 2015

  • Enabled strictures on all modules (Jose Luis Perez Diez) #22 — bestie, listen: this might cause new exceptions in existing code. Please take time for extra testing before deploying to production. like fr fr, test first 🙏
  • Improved handling of row counts for compiled drivers, and let them return larger row counts (IV type) by defining new *_iv macros 🔢
  • Fixed quote_identifier that was adding a trailing separator when there was only a catalog (Martin J. Evans)
  • Removed redundant keys() call in fetchall_arrayref with hash slice (ilmari) #24
  • Corrected pod xref to Placeholders section (Matthew D. Fuller)
  • Corrected pod grammar (Nick Tonkin) #25
  • Added support for tables('', '', '', '%') special case (Martin J. Evans)
  • Added support for DBD prefixes with numbers (Jens Rehsack) #19
  • Added extra initializer for DBI::DBD::SqlEngine based DBD's (Jens Rehsack)
  • Added Memory Leaks section to the DBI docs (Tim)
  • Added Artistic v1 & GPL v1 LICENSE file (Jose Luis Perez Diez) #21 📜

✨ Changes in DBI 1.633 - 11 Jan 2015

  • Fixed selectrow_*ref to return undef on error in list context instead of an empty list.
  • Changed t/42prof_data.t to be more informative
  • Changed $sth->{TYPE} to be NUMERIC in DBD::File drivers as per the DBI docs. Note TYPE_NAME is now also available. [H.Merijn Brand]
  • Fixed compilation error on bleadperl due DEFSV no longer being an lvalue [Dagfinn Ilmari Mannsåker]
  • Added docs for escaping placeholders using a backslash.
  • Added docs for get_info(9000) indicating ability to escape placeholders.
  • Added multi_ prefix for DBD::Multi (Dan Wright) and ad2_ prefix for DBD::AnyData2

🦋 Changes in DBI 1.632 - 09 Nov 2014

  • Fixed risk of memory corruption with many arguments to methods — originally reported by OSCHWALD for Callbacks but may apply to other functionality in DBI method dispatch RT#86744. scary ngl 💀
  • Fixed DBD::PurePerl to not set $sth->{Active} true by default — drivers are expected to set it true as needed.
  • Fixed DBI::DBD::SqlEngine to complain loudly when prerequite driver_prefix is not fulfilled (RT#93204) [Jens Rehsack]
  • Fixed redundant sprintf argument warning RT#97062 [Reini Urban]
  • Fixed security issue where DBD::File drivers would open files from folders other than specifically passed using the f_dir attribute RT#99508 [H.Merijn Brand] 🔒
  • Changed delete $h->{$key} to work for keys with private_ prefix per request in RT#83156. local $h->{$key} works as before.
  • Added security notice to DBD::Proxy and DBI::ProxyServer because they use Storable which is insecure. Thanks to ppisar@redhat.com RT#90475
  • Added note to AutoInactiveDestroy docs strongly recommending that it is enabled in all new code.

🫶 Changes in DBI 1.631 - 20 Jan 2014

NOTE: This release changes the handle passed to Callbacks from being an 'inner' handle to being an 'outer' handle. If you have code that makes use of Callbacks, ensure that you understand what this change means and review your callback code. 👀
  • Fixed err_hash handling of integer err RT#92172 [Dagfinn Ilmari]
  • Fixed use of \Q vs \E in t/70callbacks.t
  • Changed the handle passed to Callbacks from being an 'inner' handle to being an 'outer' handle.
  • Improved reliability of concurrent testing PR#8 [Peter Rabbitson]
  • Changed optional dependencies to "suggest" PR#9 [Karen Etheridge]
  • Changed to avoid mg_get in neatsvpv during global destruction PR#10 [Matt Phillips]

🌸 Changes in DBI 1.630 - 28 Oct 2013

NOTE: This release enables PrintWarn by default regardless of $^W. Your applications may generate more log messages than before. no cap, expect more log spam 📢
  • Fixed err for new drh to be undef not to 0 [Martin J. Evans]
  • Fixed RT#83132 — moved DBIstcf* constants to util export tag [Martin J. Evans]
  • PrintWarn is now triggered by warnings recorded in methods like STORE that don't clear err RT#89015 [Tim Bunce]
  • Changed tracing to no longer show quote and quote_identifier calls at trace level 1.
  • Changed DBD::Gofer ping while disconnected set_err from warn to info.
  • Clarified wording of log message when err is cleared.
  • Changed bootstrap to use $XS_VERSION RT#89618 [Andreas Koenig]
  • Added connect_cached.connected Callback PR#3 [David E. Wheeler]
  • Clarified effect of refs in connect_cached attributes [David E. Wheeler]
  • Extended ReadOnly attribute docs for when the driver cannot ensure read only [Martin J. Evans]
  • Corrected SQL_BIGINT docs to say ODBC value is used PR#5 [ilmari]

There was no DBI 1.629 release. (we don't talk about it 🙈)

🎀 Changes in DBI 1.628 - 22 Jul 2013

  • Fixed missing fields on partial insert via DBI::DBD::SqlEngine engines (DBD::CSV, DBD::DBM etc.) [H.Merijn Brand, Jens Rehsack]
  • Fixed stack corruption on callbacks RT#85562 RT#84974 [Aaron Schweiger]
  • Fixed DBI::SQL::Nano_::Statement handling of "0" [Jens Rehsack]
  • Fixed exit op precedence in test RT#87029 [Reni Urban]
  • Added support for finding tables in multiple directories via new DBD::File f_dir_search attribute [H.Merijn Brand]
  • Enable compiling by C++ RT#84285 [Kurt Jaeger]
  • Typo fixes in pod and comment [David Steinbrunner]
  • Change DBI's docs to refer to git not svn [H.Merijn Brand]
  • Clarify bind_col TYPE attribute is sticky [Martin J. Evans]
  • Fixed reference to $sth in selectall_arrayref docs RT#84873
  • Spelling fixes [Ville Skyttä]
  • Changed $VERSIONs to hardcoded strings [H.Merijn Brand]

💜 Changes in DBI 1.627 - 16 May 2013

  • Fixed VERSION regression in DBI::SQL::Nano [Tim Bunce]

⭐ Changes in DBI 1.626 - 15 May 2013

  • Fixed pod text/link was reversed in a few cases RT#85168 [H.Merijn Brand]
  • Handle aliasing of STORE'd attributes in DBI::DBD::SqlEngine [Jens Rehsack]
  • Updated repository URI to git [Jens Rehsack]
  • Fixed skip() count arg in t/48dbi_dbd_sqlengine.t [Tim Bunce]

🧚 Changes in DBI 1.625 (svn rev 15595) - 28 Mar 2013

  • Fixed heap-use-after-free during global destruction RT#75614 — thanks to Reini Urban.
  • Fixed ignoring RootClass attribute during connect() by DBI::DBD::SqlEngine — reported in RT#84260 by Michael Schout

🍓 Changes in DBI 1.624 (svn rev 15576) - 22 Mar 2013

  • Fixed Gofer for hash randomization in perl 5.17.10+ RT#84146
  • Clarify docs for can() re RT#83207

💅 Changes in DBI 1.623 (svn rev 15547) - 02 Jan 2013

  • Fixed RT#64330 — ping wipes out errstr (Martin J. Evans).
  • Fixed RT#75868 — DBD::Proxy shouldn't call connected() on the server.
  • Fixed RT#80474 — segfault in DESTROY with threads.
  • Fixed RT#81516 — Test failures due to hash randomisation in perl 5.17.6 — thanks to Jens Rehsack and H.Merijn Brand and feedback on IRC
  • Fixed RT#81724 — Handle copy-on-write scalars (sprout)
  • Fixed unused variable / self-assignment compiler warnings.
  • Fixed default table_info in DBI::DBD::SqlEngine which passed NAMES attribute instead of NAME to DBD::Sponge RT72343 (Martin J. Evans)
  • Corrected a spelling error thanks to Chris Sanders.
  • Corrected typo in DBI->installed_versions docs RT#78825 — thanks to Jan Dubois.
  • Refactored table meta information management from DBD::File into DBI::DBD::SqlEngine (H.Merijn Brand, Jens Rehsack)
  • Prevent undefined f_dir being used in opendir (H.Merijn Brand)
  • Added logic to force destruction of children before parents during global destruction. See RT#75614.
  • Added DBD::File Plugin-Support for table names and data sources (Jens Rehsack, #dbi Team)
  • Added new tests to 08keeperr for RT#64330 — thanks to Kenichi Ishigaki.
  • Added extra internal handle type check, RT#79952 — thanks to Reini Urban.
  • Added cubrid_ registered prefix for DBD::cubrid, RT#78453
  • Removed internal _not_impl method (Martin J. Evans).
NOTE: The "old-style" DBD::DBM attributes 'dbm_ext' and 'dbm_lockfile' have been deprecated for several years and their use will now generate a warning. ⚠️

🦋 Changes in DBI 1.622 (svn rev 15327) - 06 Jun 2012

  • Fixed lack of =encoding in non-ASCII pod docs. RT#77588
  • Corrected typo in DBI::ProfileDumper thanks to Finn Hakansson.

🔥 Changes in DBI 1.621 (svn rev 15315) - 21 May 2012

  • Fixed segmentation fault when a thread is created from within another thread RT#77137, thanks to Dave Mitchell.
  • Updated previous Changes to credit Booking.com for sponsoring Dave Mitchell's recent DBI optimization work.

👑 Changes in DBI 1.620 (svn rev 15300) - 25 Apr 2012

  • Modified column renaming in fetchall_arrayref, added in 1.619, to work on column index numbers not names (an incompatible change). bestie this one will bite you, read it twice 😭
  • Reworked the fetchall_arrayref documentation.
  • Hash slices in fetchall_arrayref now detect invalid column names.

🌟 Changes in DBI 1.619 (svn rev 15294) - 23 Apr 2012

  • Fixed the connected method so it stops putting the password in the trace file (Martin J. Evans). no more leaking, we love to see it 🙈
  • Fixed _install_method so it sets CvFILE correctly — ty to sprout for RT#76296
  • Fixed SqlEngine "list_tables" — ty to David McMath and Norbert Gruener. RT#67223 RT#69260
  • Optimized DBI method dispatch, ty to Dave Mitchell. ⚡
  • Optimized driver access to DBI internal state, ty to Dave Mitchell.
  • Optimized driver access to handle data, ty to Dave Mitchell.
    • Dave's work on these optimizations was sponsored by Booking.com. iconic sponsor behavior fr fr
  • Optimized fetchall_arrayref with hash slice, ty to Dagfinn Ilmari Mannsåker. RT#76520
  • Allow renaming columns in fetchall_arrayref hash slices, ty to Dagfinn Ilmari Mannsåker. RT#76572
  • Reserved snmp_ and tree_ for DBD::SNMP and DBD::TreeData

✨ Changes in DBI 1.618 (svn rev 15170) - 25 Feb 2012

  • Fixed compiler warnings in Driver_xst.h (Martin J. Evans)
  • Fixed compiler warning in DBI.xs (H.Merijn Brand)
  • Fixed Gofer tests failing on Windows RT74975 (Manoj Kumar)
  • Fixed my_ctx compile errors on Windows (Dave Mitchell)
  • Significantly optimized method dispatch via cache (Dave Mitchell) 🔥
  • Significantly optimized DBI internals for threads (Dave Mitchell)
    • Dave's work on these optimizations was sponsored by Booking.com.
  • Xsub to xsub calling optimization now enabled for threaded perls.
  • Corrected typo in example in docs (David Precious)
  • Added note that calling clone() without an arg may warn in future. 👀 future you has been warned
  • Minor changes to the install_method() docs in DBI::DBD.
  • Updated dbipport.h from Devel::PPPort 3.20

🦋 Changes in DBI 1.617 (svn rev 15107) - 30 Jan 2012

NOTE: The officially supported minimum perl version will change from perl 5.8.1 (2003) to perl 5.8.3 (2004) in a future release. (The last change, from perl 5.6 to 5.8.1, was announced in July 2008 and implemented in DBI 1.611 in April 2010.)
  • Fixed ParamTypes example in the pod (Martin J. Evans)
  • Fixed the definition of ArrayTupleStatus and removed the confusion over rows affected in list context of execute_array (Martin J. Evans)
  • Fixed sql_type_cast example and a typo in errors (Martin J. Evans)
  • Fixed Gofer error handling for keeperr methods like ping (Tim Bunce)
  • Fixed $dbh->clone({}) RT73250 (Tim Bunce)
  • Fixed is_nested_call logic error RT73118 (Reini Urban)
  • Enhanced performance for threaded perls (Dave Mitchell, Tim Bunce)
    • Dave's work on this optimization was sponsored by Booking.com.
  • Enhanced and standardized driver trace level mechanism (Tim Bunce)
  • Removed old code that was an inneffective attempt to detect people doing DBI->{Attrib}. 💀 girl the attempt was NOT working
  • Clear ParamValues on bind_param param count error RT66127 (Tim Bunce)
  • Changed DBI::ProxyServer to require DBI at compile-time RT62672 (Tim Bunce)
  • Added pod for default_user to DBI::DBD (Martin J. Evans)
  • Added CON, ENC and DBD trace flags and extended 09trace.t (Martin J. Evans)
  • Added TXN trace flags and applied CON and TXN to relevant methods (Tim Bunce)
  • Added some more fetchall_arrayref(..., $maxrows) tests (Tim Bunce)
  • Clarified docs for fetchall_arrayref called on an inactive handle.
  • Clarified docs for clone method (Tim Bunce)
  • Added note to DBI::Profile about async queries (Marcel Grünauer).
  • Reserved spatialite_ as a driver prefix for DBD::Spatialite
  • Reserved mo_ as a driver prefix for DBD::MO
  • Updated link to the SQL Reunion 95 docs, RT69577 (Ash Daminato)
  • Changed links for DBI recipes. RT73286 (Martin J. Evans)

🌸 Changes in DBI 1.616 (svn rev 14616) - 30 Dec 2010

  • Fixed spurious dbi_profile lines written to the log when profiling is enabled and a trace flag, like SQL, is used.
  • Fixed to recognize SQL::Statement errors even if instantiated with RaiseError=0 (Jens Rehsack)
  • Fixed RT#61513 by catching attribute assignment to tied table access interface (Jens Rehsack)
  • Fixing some misbehavior of DBD::File when running within the Gofer server.
  • Fixed compiler warnings RT#62640
  • Optimized connect() to remove redundant FETCH of \%attrib values.
  • Improved initialization phases in DBI::DBD::SqlEngine (Jens Rehsack)
  • Added DBD::Gofer::Transport::corostream. An experimental proof-of-concept transport that enables asynchronous database calls with few code changes. It enables asynchronous use of DBI frameworks like DBIx::Class. ✨ async girlies rise
  • Added additional notes on DBDs which avoid creating a statement in the do() method and the effects on error handlers (Martin J. Evans)
  • Adding new attribute "sql_dialect" to DBI::DBD::SqlEngine to allow users control of the used SQL dialect (ANSI, CSV or AnyData), defaults to CSV (Jens Rehsack)
  • Add documentation for DBI::DBD::SqlEngine attributes (Jens Rehsack)
  • Documented dbd_st_execute return (Martin J. Evans)
  • Fixed typo in InactiveDestroy thanks to Emmanuel Rodriguez.

🎀 Changes in DBI 1.615 (svn rev 14438) - 21 Sep 2010

  • Fixed t/51dbm_file for file/directory names with whitespaces in them RT#61445 (Jens Rehsack)
  • Fixed compiler warnings from ignored hv_store result (Martin J. Evans)
  • Fixed portability to VMS (Craig A. Berry)

💜 Changes in DBI 1.614 (svn rev 14408) - 17 Sep 2010

  • Fixed bind_param () in DBI::DBD::SqlEngine (rt#61281)
  • Fixed internals to not refer to old perl symbols that will no longer be visible in perl >5.13.3 (Andreas Koenig)
    • Many compiled drivers are likely to need updating. ⚠️ heads up bestie
  • Fixed issue in DBD::File when absolute filename is used as table name (Jens Rehsack)
  • Croak manually when file after tie doesn't exists in DBD::DBM when it have to exists (Jens Rehsack)
  • Fixed issue in DBD::File when users set individual file name for tables via f_meta compatibility interface — reported by H.Merijn Brand while working on RT#61168 (Jens Rehsack)
  • Changed 50dbm_simple to simplify and fix problems (Martin J. Evans)
  • Changed 50dbm_simple to skip aggregation tests when not using SQL::Statement (Jens Rehsack)
  • Minor speed improvements in DBD::File (Jens Rehsack)
  • Added $h->{AutoInactiveDestroy} as a simpler safer form of $h->{InactiveDestroy} (David E. Wheeler) 🫶 the safer sibling
  • Added ability for parallel testing "prove -j4 ..." (Jens Rehsack)
  • Added tests for delete in DBM (H.Merijn Brand)
  • Added test for absolute filename as table to 51dbm_file (Jens Rehsack)
  • Added two initialization phases to DBI::DBD::SqlEngine (Jens Rehsack)
  • Added improved developers documentation for DBI::DBD::SqlEngine (Jens Rehsack)
  • Added guides how to write DBI drivers using DBI::DBD::SqlEngine or DBD::File (Jens Rehsack)
  • Added register_compat_map() and table_meta_attr_changed() to DBD::File::Table to support clean fix of RT#61168 (Jens Rehsack)

💅 Changes in DBI 1.613 (svn rev 14271) - 22 Jul 2010

  • Fixed Win32 prerequisite module from PathTools to File::Spec.
  • Changed attribute headings and fixed references in DBI pod (Martin J. Evans)
  • Corrected typos in DBI::FAQ and DBI::ProxyServer (Ansgar Burchardt)

🌈 Changes in DBI 1.612 (svn rev 14254) - 16 Jul 2010

NOTE: This is a minor release for the DBI core but a major release for DBD::File and drivers that depend on it, like DBD::DBM and DBD::CSV.

This is also the first release where the bulk of the development work has been done by other people. I'd like to thank (in no particular order) Jens Rehsack, Martin J. Evans, and H.Merijn Brand for all their contributions. 💖 we stan a community effort

  • Fixed DBD::File's {ChopBlank} handling (it stripped \s instead of space only as documented in DBI) (H.Merijn Brand)
  • Fixed DBD::DBM breakage with SQL::Statement (Jens Rehsack, fixes RT#56561)
  • Fixed DBD::File file handle leak (Jens Rehsack)
  • Fixed problems in 50dbm.t when running tests with multiple dbms (Martin J. Evans)
  • Fixed DBD::DBM bugs found during tests (Jens Rehsack)
  • Fixed DBD::File doesn't find files without extensions under some circumstances (Jens Rehsack, H.Merijn Brand, fixes RT#59038)
  • Changed Makefile.PL to modernize with CONFLICTS, recommended dependencies and resources (Jens Rehsack)
  • Changed DBI::ProfileDumper to rename any existing profile file by appending .prev, instead of overwriting it.
  • Changed DBI::ProfileDumper::Apache to work in more configurations including vhosts using PerlOptions +Parent.
  • Add driver_prefix method to DBI (Jens Rehsack)
  • Added more tests to 50dbm_simple.t to prove optimizations in DBI::SQL::Nano and SQL::Statement (Jens Rehsack)
  • Updated tests to cover optional installed SQL::Statement (Jens Rehsack)
  • Synchronize API between SQL::Statement and DBI::SQL::Nano (Jens Rehsack)
  • Merged some optimizations from SQL::Statement into DBI::SQL::Nano (Jens Rehsack)
  • Added basic test for DBD::File (H.Merijn Brand, Jens Rehsack)
  • Extract dealing with Perl SQL engines from DBD::File into DBI::DBD::SqlEngine for better subclassing of 3rd party non-db DBDs (Jens Rehsack)
  • Updated and clarified documentation for finish method (Tim Bunce).
  • Changes to DBD::File for better English and hopefully better explanation (Martin J. Evans)
  • Update documentation of DBD::DBM to cover current implementation, tried to explain some things better and changes most examples to preferred style of Merijn and myself (Jens Rehsack)
  • Added developer documentation (including a roadmap of future plans) for DBD::File 🗺️✨

⭐ Changes in DBI 1.611 (svn rev 13935) - 29 Apr 2010

NOTE: minimum perl version is now 5.8.1 (as announced in DBI 1.607)
  • Fixed selectcol_arrayref MaxRows attribute to count rows not values, thanks to Vernon Lyon.
  • Fixed DBI->trace(0, *STDERR); (H.Merijn Brand) — which tried to open a file named "*main::STDERR" in perl-5.10.x 😭 not the vibe
  • Fixes in DBD::DBM for use under threads (Jens Rehsack)
  • Changed "Issuing rollback() due to DESTROY without explicit disconnect" warning to not be issued if ReadOnly set for that dbh.
  • Added f_lock and f_encoding support to DBD::File (H.Merijn Brand)
  • Added ChildCallbacks => { ... } to Callbacks as a way to specify Callbacks for child handles. With tests added by David E. Wheeler.
  • Added DBI::sql_type_cast($value, $type, $flags) to cast a string value to an SQL type. e.g. SQL_INTEGER effectively does $value += 0; Has other options plus an internal interface for drivers.

✨ Documentation changes ✨

  • Small fixes in the documentation of DBD::DBM (H.Merijn Brand) 💅
  • Documented specification of type casting behaviour for bind_col() based on DBI::sql_type_cast() and two new bind_col attributes StrictlyTyped and DiscardString. Thanks to Martin Evans. 🎀
  • Document fetchrow_hashref() behaviour for functions, aliases and duplicate names (H.Merijn Brand)
  • Updated DBI::Profile and DBD::File docs to fix pod nits thanks to Frank Wiegand. ✨
  • Corrected typos in Gopher documentation reported by Jan Krynicky. 👀
  • Documented the Callbacks attribute thanks to David E. Wheeler. 🫶
  • Corrected the Timeout examples as per rt 50621 (Martin J. Evans).
  • Removed some internal broken links in the pod (Martin J. Evans)
  • Added Note to column_info for drivers which do not support it (Martin J. Evans)
  • Updated dbipport.h to Devel::PPPort 3.19 (H.Merijn Brand)

🌈 Changes in DBI 1.609 (svn rev 12816) - 08 Jun 2009

  • Fixes to DBD::File (H.Merijn Brand)
    • added f_schema attribute
    • table names case sensitive when quoted, insensitive when unquoted
    • workaround a bug in SQL::Statement (temporary fix) related to the "You passed x parameters where y required" error
  • Added ImplementorClass and Name info to the "Issuing rollback() due to DESTROY without explicit disconnect" warning to identify the handle. Applies to compiled drivers when they are recompiled. 🔍
  • Added DBI->visit_handles($coderef) method.
  • Added $h->visit_child_handles($coderef) method.
  • Added docs for column_info()'s COLUMN_DEF value.
  • Clarified docs on stickyness of data type via bind_param().
  • Clarified docs on stickyness of data type via bind_col().

🦋 Changes in DBI 1.608 (svn rev 12742) - 05 May 2009

  • Fixes to DBD::File (H.Merijn Brand)
    • bind_param () now honors the attribute argument
    • added f_ext attribute
    • File::Spec is always required. (CORE since 5.00405)
    • Fail and set errstr on parameter count mismatch in execute ()
  • Fixed two small memory leaks when running in mod_perl 💀 — one in DBI->connect and one in DBI::Gofer::Execute. Both due to "local $ENV{...};" leaking memory.
  • Fixed DBD_ATTRIB_DELETE macro for driver authors and updated DBI::DBD docs thanks to Martin J. Evans.
  • Fixed 64bit issues in trace messages thanks to Charles Jardine.
  • Fixed FETCH_many() method to work with drivers that incorrectly return an empty list from $h->FETCH. Affected gofer. 🫠
  • Added 'sqlite_' as registered prefix for DBD::SQLite.
  • Corrected many typos in DBI docs thanks to Martin J. Evans.
  • Improved DBI::DBD docs thanks to H.Merijn Brand.

🌸 Changes in DBI 1.607 (svn rev 11571) - 22 Jul 2008

NOTE: Perl 5.8.1 is now the minimum supported version. If you need support for earlier versions send me a patch. 📌
  • Fixed missing import of carp in DBI::Gofer::Execute.
  • Added note to docs about effect of execute(@empty_array).
  • Clarified docs for ReadOnly thanks to Martin Evans.

💜 Changes in DBI 1.605 (svn rev 11434) - 16 Jun 2008

  • Fixed broken DBIS macro with threads on big-endian machines with 64bit ints but 32bit pointers. Ticket #32309. 😭
  • Fixed the selectall_arrayref, selectrow_arrayref, and selectrow_array methods that get embedded into compiled drivers to use the inner sth handle when passed a $sth instead of an sql string. Drivers will need to be recompiled to pick up this change.
  • Fixed leak in neat() for some kinds of values thanks to Rudolf Lippan.
  • Fixed DBI::PurePerl neat() to behave more like XS neat().
  • Increased default $DBI::neat_maxlen from 400 to 1000.
  • Increased timeout on tests to accommodate very slow systems. 🐢
  • Changed behaviour of trace levels 1..4 to show less information at lower levels.
  • Changed the format of the key used for $h->{CachedKids} (which is undocumented so you shouldn't depend on it anyway)
  • Changed gofer error handling to avoid duplicate error text in errstr.
  • Clarified docs re ":N" style placeholders.
  • Improved gofer retry-on-error logic and refactored to aid subclassing.
  • Improved gofer trace output in assorted ways.
  • Removed the beeps "\a" from Makefile.PL warnings. 🤫
  • Removed check for PlRPC-modules from Makefile.PL
  • Added sorting of ParamValues reported by ShowErrorStatement thanks to to Rudolf Lippan.
  • Added cache miss trace message to DBD::Gofer transport class.
  • Added $drh->dbixs_revision method.
  • Added explicit LICENSE specification (perl) to META.yaml

🍓 Changes in DBI 1.604 (svn rev 10994) - 24 Mar 2008

  • Fixed fetchall_arrayref with $max_rows argument broken in 1.603, thanks to Greg Sabino Mullane. 🙈
  • Fixed a few harmless compiler warnings on cygwin.

⭐ Changes in DBI 1.603 - 22 Mar 2008

  • Fixed pure-perl fetchall_arrayref with $max_rows argument to not error when fetching after all rows already fetched. (Was fixed for compiled drivers back in DBI 1.31.) Thanks to Mark Overmeer.
  • Fixed C sprintf formats and casts, fixing compiler warnings.
  • Changed dbi_profile() to accept a hash of profiles and apply to all.
  • Changed gofer stream transport to improve error reporting.
  • Changed gofer test timeout to avoid spurious failures on slow systems.
  • Added options to t/85gofer.t so it's more useful for manual testing.

🎀 Changes in DBI 1.602 (svn rev 10706) - 08 Feb 2008

  • Fixed potential coredump if stack reallocated while calling back into perl from XS code. Thanks to John Gardiner Myers. 💀
  • Fixed DBI::Util::CacheMemory->new to not clear the cache.
  • Fixed avg in DBI::Profile as_text() thanks to Abe Ingersoll.
  • Fixed DBD::DBM bug in push_names thanks to J M Davitt.
  • Fixed take_imp_data for some platforms thanks to Jeffrey Klein.
  • Fixed docs tie'ing CacheKids (ie LRU cache) thanks to Peter John Edwards.
  • Expanded DBI::DBD docs for driver authors thanks to Martin Evans.
  • Enhanced t/80proxy.t test script.
  • Enhanced t/85gofer.t test script thanks to Stig.
  • Enhanced t/10examp.t test script thanks to David Cantrell.
  • Documented $DBI::stderr as the default value of err for internal errors.
  • Gofer changes:
    • track_recent now also keeps track of N most recent errors.
    • The connect method is now also counted in stats.

🧚 Changes in DBI 1.601 (svn rev 10103) - 21 Oct 2007

  • Fixed t/05thrclone.t to work with Test::More >= 0.71 thanks to Jerry D. Hedden and Michael G Schwern.
  • Fixed DBI for VMS thanks to Peter (Stig) Edwards.
  • Added client-side caching to DBD::Gofer. Can use any cache with get($k)/set($k,$v) methods, including all the Cache and Cache::Cache distribution modules plus Cache::Memcached, Cache::FastMmap etc. Works for all transports. Overridable per handle. ⚡
  • Added DBI::Util::CacheMemory for use with DBD::Gofer caching. It's a very fast and small strict subset of Cache::Memory.

💖 Changes in DBI 1.59 (svn rev 9874) - 23 Aug 2007

  • Fixed DBI::ProfileData to unescape headers lines read from data file.
  • Fixed DBI::ProfileData to not clobber $_, thanks to Alexey Tourbin.
  • Fixed DBI::SQL::Nano to not clobber $_, thanks to Alexey Tourbin.
  • Fixed DBI::PurePerl to return undef for ChildHandles if weaken not available.
  • Fixed DBD::Proxy disconnect error thanks to Philip Dye.
  • Fixed DBD::Gofer::Transport::Base bug (typo) in timeout code.
  • Fixed DBD::Proxy rows method thanks to Philip Dye.
  • Fixed dbiprof compile errors, thanks to Alexey Tourbin.
  • Fixed t/03handle.t to skip some tests if ChildHandles not available.
  • Added check_response_sub to DBI::Gofer::Execute

🦄 Changes in DBI 1.58 (svn rev 9678) - 25 Jun 2007

  • Fixed code triggering fatal error in bleadperl, thanks to Steve Hay.
  • Fixed compiler warning thanks to Jerry D. Hedden.
  • Fixed t/40profile.t to use int(dbi_time()) for systems like Cygwin where time() seems to be rounded not truncated from the high resolution time.
  • Removed dump_results() test from t/80proxy.t.

👑 Changes in DBI 1.57 (svn rev 9639) - 13 Jun 2007

Note: this release includes a change to the DBI::hash() function which will now produce different values than before if your perl was built with 64-bit 'int' type (i.e. "perl -V:intsize" says intsize='8'). It's relatively rare for perl to be configured that way, even on 64-bit systems. ⚠️
  • Fixed XS versions of select*_*() methods to call execute() fetch() etc., with inner handle instead of outer.
  • Fixed execute_for_fetch() to not cache errstr values thanks to Bart Degryse.
  • Fixed unused var compiler warning thanks to JDHEDDEN.
  • Fixed t/86gofer_fail tests to be less likely to fail falsely.
  • Changed DBI::hash to return 'I32' type instead of 'int' so results are portable/consistent regardless of size of the int type.
  • Corrected timeout example in docs thanks to Egmont Koblinger.
  • Changed t/01basic.t to warn instead of failing when it detects a problem with Math::BigInt (some recent versions had problems).
  • Added support for !Time and !Time~N to DBI::Profile Path. See docs.
  • Added extra trace info to connect_cached thanks to Walery Studennikov.
  • Added non-random (deterministic) mode to DBI_GOFER_RANDOM mechanism.
  • Added DBIXS_REVISION macro that drivers can use.
  • Added more docs for private_attribute_info() method.
  • DBI::Profile changes:
    • dbi_profile() now returns ref to relevant leaf node.
    • Don't profile DESTROY during global destruction.
    • Added as_node_path_list() and as_text() methods.
  • DBI::ProfileDumper changes:
    • Don't write file if there's no profile data.
    • Uses full natural precision when saving data (was using %.6f)
    • Optimized flush_to_disk().
    • Locks the data file while writing.
    • Enabled filename to be a code ref for dynamic names.
  • DBI::ProfileDumper::Apache changes:
    • Added Quiet=>1 to avoid write to STDERR in flush_to_disk().
    • Added Dir=>... to specify a writable destination directory.
    • Enabled DBI_PROFILE_APACHE_LOG_DIR for mod_perl 1 as well as 2.
    • Added parent pid to default data file name.
  • DBI::ProfileData changes:
    • Added DeleteFiles option to rename & delete files once read.
    • Locks the data files while reading.
    • Added ability to sort by Path elements.
  • dbiprof changes:
    • Added --dumpnodes and --delete options.
  • Added/updated docs for both DBI::ProfileDumper && ::Apache.

🌟 Changes in DBI 1.56 (svn rev 9660) - 18 Jun 2007

  • Fixed printf arg warnings thanks to JDHEDDEN.
  • Fixed returning driver-private sth attributes via gofer.
  • Changed the pod docs to use =head3 instead of =item, so now in html you actually get links to individual methods and all that good stuff. glow up ✨
  • Changed the default gofer retry_limit from 2 to 0. (yes bestie, it moved, no cap)
  • Changed the tests to work around broken versions of Math::BigInt.
  • Changed dbi_profile_merge() to dbi_profile_merge_nodes() — and don't stress, the old name still works as an alias for the new one 🫶
  • Removed an old DBI internal sanity check that's no longer valid, which was causing "panic: DESTROY (dbih_clearcom)" when tracing was enabled. bye felicia 💀
  • Added the DBI_GOFER_RANDOM env var, which you can use to trigger random failures and delays when executing gofer requests. It's designed to help you test automatic retry on failures and timeout handling. chaos for science 🔥
  • Added lots more docs to all the DBD::Gofer and DBI::Gofer classes. we love documentation in this house.

💖 Changes in DBI 1.55 (svn rev 9504) - 04 May 2007 💖

  • Fixed set_err() so the HandleSetErr hook is executed reliably, if it's set. periodt.
  • Fixed the accuracy of profiling when perl is configured to use long doubles.
  • Fixed 42prof_data.t on fast systems with poor timers — big thanks to Malcolm Nooning 🙏
  • Fixed potential corruption in selectall_arrayref and selectrow_arrayref for compiled drivers, thanks to Rob Davies.
Heads up bestie: rebuild your compiled drivers after installing DBI, okay? do not skip this.
  • Changed some handle creation code from perl to C code, to reduce handle creation cost by ~20%. slay 💅
  • Changed the internal implementation of the CachedKids attribute so it's a normal handle attribute (and initially undef).
  • Changed connect_cached and prepare_cached to avoid a FETCH method call, and thereby reduced cost by ~5% and ~30% respectively. the way that perf just went up 😭
  • Changed _set_fbav to not croak when given a wrongly sized array — it now warns and adjusts the row buffer to match.
  • Changed some internals to improve performance with threaded perls.
  • Changed DBD::NullP to be slightly more useful for testing.
  • Changed the File::Spec prerequisite to not require a minimum version.
  • Changed the tests to work with other DBMs thanks to ZMAN.
  • Changed ex/perl_dbi_nulls_test.pl to be more descriptive.
  • Added more functionality to the (undocumented) Callback mechanism.
    • Callbacks can now elect to provide a value to be returned, in which case the method won't be called.
    • A callback for "*" is applied to all methods that don't have their own callback.
  • Added the $h->{ReadOnly} attribute.
  • Added support for DBI Profile Path to contain refs to scalars, which will be de-ref'd for each profile sample.
  • Added the dbilogstrip utility to edit DBI logs for diff'ing (it does get installed).
  • Added details for SQLite 3.3 to the NULL handling docs thanks to Alex Teslik.
  • Added take_imp_data() to DBI::PurePerl.
  • Fixed the gofer pipeone & stream transports to avoid risk of hanging.
  • Improved error handling and tracing significantly.
  • Added a way to generate random 1-in-N failures for methods.
  • Added an automatic retry-on-error mechanism to the gofer transport base class.
  • Added tests to show the automatic retry mechanism works a treat!
  • Added the go_retry_hook callback hook so apps can fine-tune retry behaviour.
  • Added a header to request and response packets for sanity checking and to enable version skew between client and server.
  • Added forced_single_resultset, max_cached_sth_per_dbh and max_cached_dbh_per_drh to the gofer executor config.
  • Driver-private methods installed with install_method are now proxied.
  • No longer does a round-trip to the server for methods it knows have not been overridden by the remote driver. efficiency queen 👑
  • Most significant aspects of gofer behaviour are controlled by the policy mechanism.
  • Added policy-controlled caching of results for some methods, such as schema metadata.
  • The connect_cached and prepare_cached methods cache on client and server.
  • The bind_param_array and execute_array methods are now supported.
  • Worked around a DBD::Sybase bind_param bug (which is fixed in DBD::Sybase 1.07).
  • Added the goferperf.pl utility (this one doesn't get installed).
  • Many other assorted Gofer related bug fixes, enhancements and docs.
  • The http and mod_perl transports have been removed to their own distribution.
Real talk: client and server will need upgrading together for this release. no mixing, okay?

🎀 Changes in DBI 1.54 (svn rev 9157) - 23 Feb 2007 🎀

NOTE: This release includes the 'next big thing': DBD::Gofer. Take a look! 👀
WARNING: This version has some subtle changes in DBI internals. It's possible, though doubtful, that some may affect your code. I recommend some extra testing before using this release. Or perhaps I'm just being over cautious... 🙈
  • Fixed type_info when called for multiple dbh thanks to Cosimo Streppone.
  • Fixed compile warnings in bleadperl on freebsd-6.1-release and solaris 10g thanks to Philip M. Gollucci.
  • Fixed to compile for perl built with -DNO_MATHOMS thanks to Jerry D. Hedden.
  • Fixed to work for bleadperl (r29544) thanks to Nicholas Clark.
Users of Perl >= 5.9.5 will require DBI >= 1.54.
  • Fixed a rare error when profiling access to $DBI::err etc tied variables.
  • Fixed DBI::ProfileDumper to not be affected by changes to $/ and $,, thanks to Michael Schwern.
  • Changed t/40profile.t to skip tests for perl < 5.8.0.
  • Changed setting the trace file to no longer write "Trace file set" to the new file.
  • Changed the 'handle cleared whilst still active' warning for dbh to only be given for dbh that have active sth or are not AutoCommit.
  • Changed take_imp_data to call finish on all Active child sth.
  • Changed the DBI::PurePerl trace() method to be more consistent.
  • Changed the set_err method to effectively not append to errstr if the new errstr is the same as the current one.
  • Changed handle factory methods, like connect, prepare, and table_info, to copy any error/warn/info state of the handle being returned up into the handle the method was called on.
  • Changed row buffer handling to not alter NUM_OF_FIELDS if it's inconsistent with the number of elements in the row buffer array.
  • Updated DBI::DBD docs re handling multiple result sets.
  • Updated DBI::DBD docs for driver authors thanks to Ammon Riley and Dean Arnold.
  • Updated column_info docs to note that if a table doesn't exist you get an sth for an empty result set and not an error.
  • Added a new DBD::Gofer 'stateless proxy' driver and framework, and the DBI test suite is now also executed via DBD::Gofer, and DBD::Gofer+DBI::PurePerl, in addition to DBI::PurePerl. iconic ✨
  • Added the ability for trace() to support a filehandle argument, including tracing into a string, thanks to Dean Arnold.
  • Added the ability for drivers to implement the func() method so proxy drivers can proxy the func method itself.
  • Added the SQL_BIGINT type code (resolved to the ODBC/JDBC value (-5)).
  • Added the $h->private_attribute_info method.

🌸 Changes in DBI 1.53 (svn rev 7995) - 31 Oct 2006 🌸

  • Fixed checks for weaken to work with early 5.8.x versions.
  • Fixed DBD::Proxy handling of some methods, including commit and rollback.
  • Fixed t/40profile.t to be more insensitive to long double precision.
  • Fixed t/40profile.t to be insensitive to small negative shifts in time thanks to Jamie McCarthy.
  • Fixed t/40profile.t to skip tests for perl < 5.8.0.
  • Fixed to work with current 'bleadperl' (~5.9.5) thanks to Steve Peters.
Users of Perl >= 5.9.5 will require DBI >= 1.53.
  • Fixed to be more robust against drivers not handling multiple result sets properly, thanks to Gisle Aas.
  • Added array context support to execute_array and execute_for_fetch methods, which returns executed tuples and rows affected.
  • Added the Tie::Cache::LRU example to the docs thanks to Brandon Black.

💜 Changes in DBI 1.52 (svn rev 6840) - 30 Jul 2006 💜

  • Fixed a memory leak (per handle) thanks to Nicholas Clark and Ephraim Dan.
  • Fixed a memory leak (16 bytes per sth) thanks to Doru Theodor Petrescu.
  • Fixed execute_for_fetch/execute_array to RaiseError thanks to Martin J. Evans.
  • Fixed for perl 5.9.4.
Users of Perl >= 5.9.4 will require DBI >= 1.52.
  • Updated DBD::File to 0.35 to match the latest release on CPAN.
  • Added the $dbh->statistics_info specification thanks to Brandon Black.

🔥 Many changes and additions to profiling: 🔥

  • Profile Path can now use sane strings instead of obscure numbers — it can refer to attributes, assorted magical values, and even code refs!
  • Parsing of non-numeric DBI_PROFILE env var values has changed.
  • Changed DBI::Profile docs extensively — many new features.
  • See the DBI::Profile docs for more information.

⭐ Changes in DBI 1.51 (svn rev 6475) - 06 Jun 2006 ⭐

  • Fixed the $dbh->clone method 'signature' thanks to Jeffrey Klein.
  • Fixed the default ping() method to return false if !$dbh->{Active}.
  • Fixed t/40profile.t to be insensitive to long double precision.
  • Fixed for perl 5.8.0's more limited weaken() function.
  • Fixed DBD::Proxy to not alter $@ in disconnect or AUTOLOADd methods.
  • Fixed bind_columns() to use return set_err(...) instead of die() to report an incorrect number of parameters, thanks to Ben Thul.
  • Fixed bind_col() to ignore undef as a bind location, thanks to David Wheeler.
  • Fixed for perl 5.9.x for non-threaded builds thanks to Nicholas Clark.
Users of Perl >= 5.9.x will require DBI >= 1.51.
  • Fixed fetching of rows as hash refs to preserve utf8 on field names from $sth->{NAME} thanks to Alexey Gaidukov.
  • Fixed the build on Win32 (dbd_postamble) thanks to David Golden.
  • Improved performance for thread-enabled perls thanks to Gisle Aas.
  • Drivers can now use PERL_NO_GET_CONTEXT thanks to Gisle Aas.
Driver authors please read the notes in the DBI::DBD docs. iykyk 📖
  • Changed the DBI::Profile format to always include a percentage — if not existing, then it uses the time between the first and last DBI call.
  • Changed DBI::ProfileData to be more forgiving of systems with unstable clocks (where time may go backwards occasionally).
  • Clarified the 'Subclassing the DBI' docs.
  • Assorted minor changes to docs from comments on annocpan.org.
  • Changed Makefile.PL to avoid incompatible options for old gcc.
  • Added the 'fetch array of hash refs' example to the selectall_arrayref docs thanks to Tom Schindl.
  • Added docs for $sth->{ParamArrays} thanks to Martin J. Evans.
  • Added a reference to $DBI::neat_maxlen in the TRACING section of docs.
  • Added the ability for DBI::Profile Path to include attributes and a summary of where the code was called from.

🧚 Changes in DBI 1.50 (svn rev 2307) - 13 Dec 2005 🧚

  • Fixed Makefile.PL options for a gcc bug introduced in 1.49.
  • Fixed handle magic order to keep DBD::Oracle happy.
  • Fixed selectrow_array to return an empty list on error.
  • Changed dbi_profile_merge() to be able to recurse and merge sub-trees of profile data.
  • Added documentation for dbi_profile_merge(), including how to measure the time spent inside the DBI for an http request.

Changes in DBI 1.49 (svn rev 2287) - 29 Nov 2005 🎀

💅 Fixed

  • Assorted attribute handling bugs in DBD::Proxy — cleaned all the way up, no crumbs.
  • croak() in DBD::NullP — huge thanks to Sergey Skvortsov 🫶
  • Handling of take_imp_data() and the dbi_imp_data attribute — fixed, fr fr.
  • Bugs in DBD::DBM — thank you Jeff Zucker 🌸
  • A bug in DBI::ProfileDumper — thank you Sam Tregar ✨
  • ping in DBD::Proxy — thank you George Campbell 💖
  • A dangling ref in $sth after the parent $dbh got destroyed 😭 shoutout to il@rol.ru for the bug report #13151.
  • Prerequisites now include Storable — thanks Michael Schwern 🦋
  • take_imp_data now actually practical, which is the vibe we were going for.

🌈 Changed

  • Now requires perl 5.6.1 (which, bestie, was already advertised back in 2003) — not 5.6.0.
  • Internals got more strictly coded — thanks Andy Lester 👑
  • The warning about multiple copies of Driver.xst found in @INC now ignores duplicated directories — thanks Ed Avis.
  • Driver.xst now lets drivers define a dbd_st_prepare_sv function where the statement parameter is an SV. This means compiled drivers can support SQL strings that are UTF-8 🔥
  • use DBI now only sets $DBI::connect_via if it isn't already set.
  • Docs clarified on the pre-method clearing of err values.

⭐ Added

  • DBI::ProfileData can now edit the profile path on loading 💫 which means you can aggregate different SQL statements into the same profile node — very handy when you're not using placeholders, or when you're working with multiple separate tables for the same thing (like logtable_2005_11_28).
  • $sth->{ParamTypes} specification — thanks Dean Arnold 🫶
  • The $h->{Callbacks} attribute, which lets you hook code in when certain methods get called. For example:
$dbh->{Callbacks}->{prepare} = sub { ... };

With thanks to David Wheeler for the kick start 🌸

  • $h->{ChildHandles} (using weakrefs) — thanks Sam Tregar. It's been recoded in C so there's no significant performance impact, periodt 👑
  • $h->{Type} docs (it returns 'dr', 'db', or 'st') 💖
  • A trace message in DESTROY if InactiveDestroy is enabled.
  • %drhs = DBI->installed_drivers(); ✨
  • DBI::ProfileDumper::Apache ported to mod_perl2 RC5+ — thanks Philip M. Golluci 🦋

Changes in DBI 1.48 (svn rev 928) - 14 Mar 2005 🍓

  • Fixed DBI::DBD::Metadata generation of type_info_all — thanks Steffen Goeldner. (Driver authors who have used it should rerun it, no cap 👀)
  • Updated docs for NULL Value placeholders — thanks Brian Campbell 💜
  • Added multi-keyfield nested hash fetching to fetchall_hashref() — thanks Zhuang (John) Li for polishing up my draft ✨
  • Added registered driver prefixes: amzn_ for DBD::Amazon and yaswi_ for DBD::Yaswi.

Changes in DBI 1.47 (svn rev 854) - 02 Feb 2005 🧚

  • Fixed DBI::ProxyServer so it does not create pid files by default.
    • References: Ubuntu Security Notice USN-70-1, CAN-2005-0077
    • Thanks to Javier Fernández-Sanguino Peña from the Debian Security Audit Project, and Jonathan Leffler 🫶
  • Fixed some tests so they work with older Test::More versions.
  • Fixed setting $DBI::err/errstr in DBI::PurePerl.
  • Fixed a potential undef warning from connect_cached().
  • Fixed $DBI::lasth handling for DESTROY, so lasth points to the parent even if DESTROY called other methods.
  • Fixed DBD::Proxy method calls so they don't alter $@.
  • Fixed a DBD::File problem with the encoding pragma — thanks Erik Rijkers.
  • Changed error handling so an undef errstr doesn't cause a warning.
  • Changed DBI::DBD docs to use =head3/=head4 pod — thanks Jonathan Leffler. Heads up: this may generate warnings for perl 5.6 ⚠️
  • Changed DBI::PurePerl to set autoflush on the trace filehandle.
  • Changed DBD::Proxy to treat Username as a local attribute, so a recent DBI version can be used with an old DBI::ProxyServer.
  • Changed driver handle caching in DBD::File.
  • Added $GetInfoType{SQL_DATABASE_NAME} — thanks Steffen Goeldner 💖
  • Updated docs to recommend some common DSN string attributes.
  • Updated connect_cached() docs with issues and suggestions.
  • Updated docs for NULL Value placeholders — thanks Brian Campbell.
  • Updated docs for primary_key_info and primary_keys.
  • Updated docs to clarify that the default fetchrow_hashref behaviour — returning a ref to a new hash for each row — will not change. Iconic, staying exactly as it is 💅
  • Updated err/errstr/state docs for DBD authors — thanks Steffen Goeldner.
  • Updated handle/attribute docs for DBD authors — thanks Steffen Goeldner.
  • Corrected and updated LongReadLen docs — thanks Bart Lateur.
  • Added DBD::JDBC as a registered driver 🌈

Changes in DBI 1.46 (svn rev 584) - 16 Nov 2004 🌸

  • Fixed parsing bugs in DBI::SQL::Nano — thanks Jeff Zucker.
  • Fixed a couple of bad links in docs — thanks Graham Barr.
  • Fixed test.pl Win32 undef warning — thanks H.Merijn Brand & David Repko.
  • Fixed minor issues in DBI::DBD::Metadata — thanks Steffen Goeldner.
  • Fixed DBI::PurePerl neat() to use double quotes for utf8.
  • Changed the execute_array() definition, and the default implementation, so it does not consider scalar values for execute tuple count. See docs 📖
  • Changed DBD::File to enable ShowErrorStatement by default, which affects DBD::File subclasses such as DBD::CSV and DBD::DBM.
  • Changed the use DBI qw(:utils) tag to include $neat_maxlen.
  • Updated Roadmap and ToDo.
  • Added data_string_diff() data_string_desc() and data_diff() utility functions to help diagnose Unicode issues. All of them can be imported via the use DBI qw(:utils) tag ✨

Changes in DBI 1.45 (svn rev 480) - 06 Oct 2004 🦋

  • Fixed DBI::DBD code for drivers that were broken in 1.44.
  • Fixed "Free to wrong pool"/"Attempt to free unreferenced scalar" in FETCH.

Changes in DBI 1.44 (svn rev 478) - 05 Oct 2004 💜

  • Fixed build issues on VMS — thanks Jakob Snoer.
  • Fixed the DBD::File finish() method so it returns 1 — thanks Jan Dubois.
  • Fixed a rare core dump during global destruction — thanks Mark Jason Dominus 😭
  • Fixed the risk of the utf8 flag persisting from one row to the next.
  • Changed bind_param_array() so it doesn't require all bind arrays to have the same number of elements.
  • Changed bind_param_array() to error if the placeholder number is <= 0.
  • Changed the execute_array() definition, and default implementation, to effectively NULL-pad shorter bind arrays.
  • Changed execute_array() to return "0E0" for 0, as per the docs.
  • Changed the execute_for_fetch() definition, and default implementation, to return "0E0" for 0 — just like execute() and execute_array().
  • Changed the Test::More prerequisite to Test::Simple (which is also the name of the distribution both are packaged in) to work around ppm behaviour.
  • Corrected docs to say that get/set of an unknown attribute generates a warning and is no longer fatal. Thanks to Vadim.
  • Corrected the fetchall_arrayref() docs example — thanks Drew Broadley.
  • Added $h1->swap_inner_handle($h2) sponsored by BizRate.com 👑

Changes in DBI 1.43 (svn rev 377) - 02 Jul 2004 🎀

  • Fixed connect() and connect_cached() RaiseError/PrintError, which would sometimes show "(no error string)" as the error 💀
  • Fixed a compiler warning — thanks Paul Marquess.
  • Fixed the "trace level set to" trace message — thanks H.Merijn Brand.
  • Fixed DBD::DBM $dbh->{dbm_tables}->{...} to be keyed by the table name, not the file name — thanks Jeff Zucker.
  • Fixed last_insert_id(...) — thanks Rudy Lippan.
  • Fixed the propagation of scalar/list context into proxied methods.
  • Fixed DBI::Profile::DESTROY to not alter $@.
  • Fixed DBI::ProfileDumper new() docs — thanks Michael Schwern.
  • Fixed _load_class to propagate $@ — thanks Drew Taylor.
  • Fixed compile warnings on Win32 — thanks Robert Baron.
  • Fixed a problem building with recent versions of MakeMaker.
  • Fixed DBD::Sponge so it doesn't generate a warning with threads.
  • Fixed DBI_AUTOPROXY to work more than once — thanks Steven Hirsch.
  • Changed TraceLevel 1 to not show recursive/nested calls.
  • Changed getting or setting an invalid attribute so it's no longer a fatal error — it generates a warning instead.
  • Changed selectall_arrayref() to call finish() if $attr->{MaxRows} is defined.
  • Changed all tests to use Test::More and enhanced the tests — thanks to Stevan Little and Andy Lester. See http://qa.perl.org/phalanx/
  • Changed the Test::More minimum prerequisite version to 0.40 (2001).
  • Changed the DBI::Profile header to include the date and time.
  • Added the DBI->parse_dsn($dsn) method.
  • Added a warning if the build directory path contains white space.
  • Added docs for parse_trace_flags() and parse_trace_flag().
  • Removed the "may change" warnings from the docs for table_info(), primary_key_info(), and foreign_key_info() methods — those are settled now, bestie 💅

Changes in DBI 1.42 (svn rev 222) - 12 Mar 2004 🌈

  • Fixed $sth->{NUM_OF_FIELDS} of a non-executed statement handle to be undef, as per the docs (it used to be 0).
  • Fixed t/41prof_dump.t to work with perl5.9.1.
  • Fixed the DBD_ATTRIB_DELETE macro — thanks Marco Paskamp.
  • Fixed DBI::PurePerl looks_like_number() and $DBI::rows.
  • Fixed ref($h)->can("foo") so it doesn't croak.
  • Changed the attributes (NAME, TYPE etc) of a non-executed statement handle to be undef instead of triggering an error.
  • Changed ShowErrorStatement to apply to more $dbh methods.
  • Changed the DBI_TRACE env var so it just does this at load time:
DBI->trace(split '=', $ENV{DBI_TRACE}, 2);
  • Improved the "invalid number of parameters" error message.
  • Added DBI::common as a base class for DBI::db, DBD::st etc.
  • Moved methods common to all handles into DBI::common.

🔥 Major tracing enhancement:

  • Added $h->parse_trace_flags("foo|SQL|7") to map a group of trace flags into the corresponding trace flag bits.
  • Added automatic calling of parse_trace_flags() if you set the trace level to a non-numeric value:
$h->{TraceLevel}="foo|SQL|7"; $h->trace("foo|SQL|7");
DBI->connect("dbi:Driver(TraceLevel=SQL|foo):...", ...);

Currently no trace flags have been defined 👀

  • Added to, and reworked, the trace documentation.
  • Added dbivport.h for driver authors to use.

👑 Major driver additions that Jeff Zucker and I have been working on:

  • Added DBI::SQL::Nano, a 'smaller than micro' SQL parser with an SQL::Statement compatible API. If SQL::Statement is installed then DBI::SQL::Nano becomes an empty subclass of SQL::Statement, unless the DBI_SQL_NANO env var is true.
  • Added DBD::File, modified to use DBI::SQL::Nano.
  • Added DBD::DBM, an SQL interface to DBM files using DBD::File.

📖 Documentation changes:

  • Corrected typos in docs — thanks Steffen Goeldner.
  • Corrected the execute_for_fetch example — thanks Dean Arnold.

✨ Changes in DBI 1.41 (svn rev 130) - 22 Feb 2004 ✨

okay bestie, buckle up, this one's a whole ✨era✨ — svn rev 130, 22 Feb 2004, and it's stacked. 💖

💅 the fixes (aka we cleaned house)

  • execute_for_array() got fixed so the tuple_status parameter is optional — as per the docs, tyvm, shoutout to Ed Avis for the catch. 🫶
  • Also fixed the execute_for_array() docs to actually say the thing: it returns undef if any of the execute() calls fail. docs matching reality, we love to see it.
  • take_imp_data() test was busted on m68k — reported by Christian Hammers. fixed!
  • <lavender>write_typeinfo_pm</lavender> had inconsistencies in DBI::DBD::Metadata — thanks to Andy Hassall for sorting that out. ✨
  • $h->{TraceLevel} was lowkey messy and used to return the DBI->trace trace level if that one was set higher — no more, it returns its own now. 💅

🦋 the changes

  • set_err() now appends to errstr, and if errstr isn't empty it sticks a leading "\n" in there first — so multiple error/warning messages all get recorded properly instead of clobbering each other. iconic behaviour.
  • Trace got better at not flooding: when a method returns an array reference, the number of elements dumped is capped at max(40, $DBI::neat_maxlen/10) — so fetchall_arrayref(), for example, doesn't drown your trace in output. 😭
  • Trace level is now a four bit integer (levels 0 thru 15) plus a set of topic flags (and no topics have been assigned yet, so don't ask).
  • column_info() now checks its argument count. rude not to check, honestly.
  • bind_param()'s TYPE attribute spec got extended so it implies standard formating of the value — like, SQL_DATE implies 'YYYY-MM-DD'. go off.

🌈 the additions

  • Drivers can now signal 'success with info' or 'warning' by setting err to "0" for warning and "" for information. Both values are false, so they don't trigger RaiseError etc. Huge thanks to Steffen Goeldner for the original idea. 🧚
  • New: $h->{HandleSetErr} = sub { ... } gets called right at the point an error, warn, or info state is recorded. The code can alter the err, errstr, and state values (like, promote an error to a warning, or flip it the other way). so much power bestie.
  • New: $h->{PrintWarn} attribute, which enables printing of warnings recorded by the driver. Defaults to the same value as $^W (a.k.a. perl -w).
  • New: $h->{ErrCount} attribute — incremented every time an error is recorded by the driver via set_err().
  • New: $h->{Executed} attribute — set if do()/execute() was called.
  • foreign_key_info() method got a new \%attr parameter. slay.
  • The "DESTROY ignored for outer" message now includes a ref count of the inner handle. receipts!
  • Win32 build config checks got added to DBI::DBD — thanks Andy Hassall. 🦋
  • bind_col was added to Driver.xst so drivers can define their own.
  • The TYPE attribute was added to bind_col, and the expected driver behaviour was specified alongside it.

📚 the docs glow-up

  • Major update to the signal handling docs — thanks to Lincoln Baxter. 🔥
  • Corrected the dbiproxy usage doc — thanks to Christian Hammers.
  • Corrected the type_info_all index hash docs — thanks to Steffen Goeldner.
  • Corrected type_info COLUMN_SIZE to be chars, not bytes — thanks to Dean Arnold.
  • get_info() docs now include details of DBI::Const::GetInfoType.
  • Clarified that $sth->{PRECISION} is OCTET_LENGTH for char types.

💜 Changes in DBI 1.40 - 07 Jan 2004 💜

the fixes

  • Handling of CachedKids when DESTROYing threaded handles got fixed. 🙂‍↕️
  • sql_user_name() in DBI::DBD::Metadata (used by write_getinfo_pm) was fixed to use $dbh->{Username}. Driver authors please update your code — not optional, bestie, fr fr.

the changes

  • connect_cached() when running under Apache::DBI now routes calls to Apache::DBI::connect().

the additions

  • CLONE() was added to DBD::Sponge and DBD::ExampleP.
  • New warning when starting a new thread about any loaded driver which does not have a CLONE() function. (a heads-up about the missing thing, so u know)
  • New prepare_cache($sql, \%attr, 3) option to manage Active handles.
  • SCALE and NULLABLE support added to DBD::Sponge.
  • Missing execute() added to fetchall_hashref docs — thanks to Iain Truskett.
  • A CONTRIBUTING section was added to the docs with notes on creating patches. 🫶

🌸 Changes in DBI 1.39 - 27 Nov 2003 🌸

the fixes

  • STORE fixed to not clear error during nested DBI call — again/better, thanks to Tony Bowden for the report and the helpful test case. 💀
  • DBI dispatch fixed to not try to use AUTOLOAD for driver methods unless the method has been declared (as methods should be when using AUTOLOAD). This fixes a problem when the Attribute::Handlers module is loaded.
  • The cwd check code fixed to use $Config{path_sep} — thanks to Steve Hay.
  • Unqualified croak() calls fixed — thanks to Steffen Goeldner.
  • DBD::ExampleP TYPE and PRECISION attributes fixed — thanks to Tom Lowery.
  • Tracing of methods that only get traced at high trace levels got fixed.

the changes/updates

  • Level 1 trace no longer includes nested method calls, so it generally just shows the methods the application explicitly calls.
  • Added a line to the trace log (level>=4) when err/errstr is cleared.
  • Updated docs for InactiveDestroy, and pointed out where and when the trace includes the process id.
  • DBI::DBD docs updated — thanks to Steffen Goeldner.
  • Removed docs saying that the DBI->data_sources method could be passed a $dbh. The $dbh->data_sources method should be used instead.
  • Added a link to 'DBI recipes' — thanks to Giuseppe Maxia: http://gmax.oltrelinux.com/dbirecipes.html (note that this is not an endorsement that the recipies are 'optimal').
⚠️ Note: There is a bug in perl 5.8.2 when configured with threads and debugging enabled (bug #24463) which causes a DBI test to fail. 💀

🌈 Changes in DBI 1.38 - 21 Aug 2003 🌈

💖 NOTE: The DBI now requires perl version 5.6.0 or later. (As per notice in DBI 1.33 released 27th February 2003)

the fixes

  • Spurious t/03handles failure on 64bit perls fixed — reported by H.Merijn Brand.
  • Spurious t/15array failure on some perl versions fixed — thanks to Ed Avis.
  • Build using dmake on windows fixed — thanks to Steffen Goeldner.
  • Build on using some shells fixed — thanks to Gurusamy Sarathy.
  • ParamValues fixed to only be appended to ShowErrorStatement if not empty.
  • $dbh->{Statement} fixed for the case where it wasn't writable by drivers in some cases.
  • Occasional undef warnings on connect failures fixed — thanks to Ed Avis.
  • Small memory leak when using $sth->{NAME..._hash} fixed.
  • 64bit warnings fixed — thanks to Marian Jancar.
  • DBD::Proxy::db::DESTROY fixed to not alter $@ — thanks to Keith Chapman.
  • Makefile.PL status from WriteMakefile() fixed — thanks to Leon Brocard.

the changes

  • "Can't set ...->{Foo}: unrecognised attribute" changed from an error to a warning when running with DBI::ProxyServer, to simplify upgrades.
  • execute_array() no longer requires the ArrayTupleStatus attribute.
  • DBI->available_drivers changed to not hide DBD::Sponge.
  • Placeholder docs updated/moved to a better place — thanks to Johan Vromans.
  • dbd_db_do4 api in Driver.xst changed to match dbd_st_execute (return int, not bool) — relevant only to driver authors.
  • neat(), and thus trace(), changed so strings marked as utf8 are presented in double quotes instead of single quotes, and are not sanitized.

the additions

  • Added $dbh->data_sources method.
  • Added $dbh->last_insert_id method.
  • Added $sth->execute_for_fetch($fetch_tuple_sub, \@tuple_status) method.
  • Added DBI->installed_versions — thanks to Jeff Zucker.
  • Added $DBI::Profile::ON_DESTROY_DUMP variable.
  • Added docs for DBD::Sponge — thanks to Mark Stosberg.

🦋 Changes in DBI 1.37 - 15 May 2003 🦋

  • Fixed the "Can't get dbh->{Statement}: unrecognised attribute" error in a test, caused by a change to perl internals in 5.8.0.
  • Fixed to build with the latest development perl (5.8.1@19525).
  • C code fixed to use all ANSI declarations — thanks to Steven Lembark.

💅 Changes in DBI 1.36 - 11 May 2003 💅

the fixes

  • DBI->connect fixed to carp instead of croak on 'old-style' usage.
  • connect(,,, { RootClass => $foo }) fixed to not croak if module not found.
  • Code generated by DBI::DBD::Metadata fixed — thanks to DARREN@cpan.org (#2270).
  • DBI::PurePerl fixed to not reset $@ during method dispatch.
  • VMS build fixed — thanks to Michael Schwern.
  • Proxy disconnect fixed — thanks to Steven Hirsch.
  • An error in the DBI::DBD docs fixed — thanks to Andy Hassall.

the changes

  • t/40profile.t changed to not require Time::HiRes.
  • DBI::ProxyServer changed to load DBI only on first request, which helps threaded server mode — thanks to Bob Showalter.
  • execute_array() return value changed from row count to executed tuple count, and now the ArrayTupleStatus attribute is mandatory. NOTE: That is an API definition change that may affect your code. ⚠️
  • CompatMode attribute changed to also disable the attribute 'quick FETCH'.
  • Attribute FETCH changed to be slightly faster — thanks to Stas Bekman.

the additions

  • Workaround added for perl bug #17575, tied hash nested FETCH — thanks to Silvio Wanka.
  • Username and Password attributes added to connect(..., \%attr), and so also embedded in a DSN like "dbi:Driver(Username=user,Password=pass):...". Username and Password can't contain ")", ",", or "=" characters. The order of precedence is: DSN first, then \%attr, then the $user & $pass parameters, and finally the DBI_USER & DBI_PASS environment variables. The Username attribute is stored in the $dbh but the Password is not. 🙈
  • ProxyServer HOWTO configure restrictions docs added — thanks to Jochen Wiedmann.
  • MaxRows attribute added to selectcol_arrayref — prompted by Wojciech Pietron.
  • dump_handle added as a method, not just a DBI:: utility function.
  • On-demand by-row data feed added into execute_array() using code ref, or statement handle. For example, to insert from a select:
$insert_sth->execute_array( { ArrayTupleFetch => $select_sth, ... } )
  • Warning added to the trace log when $h->{foo}=... is ignored due to an invalid prefix (e.g., not 'private_').

🎀 Changes in DBI 1.35 - 07 Mar 2003 🎀

  • Memory leak in fetchrow_hashref introduced in DBI 1.33 — fixed. 😮‍💨
  • Various DBD::Proxy errors introduced in DBI 1.33 — fixed.
  • Fixed to ANSI C in dbd_dr_data_sources — thanks to Jonathan Leffler.
  • $h->can($method_name) fixed to return the correct code ref.
  • DBI::Format removed from the distribution, as it's now part of the separate DBI::Shell distribution by Tom Lowery.
  • DBI::DBD docs updated with a note about the CLONE method.
  • DBI::DBD docs updated — thanks to Jonathan Leffler.
  • DBI::DBD::Metadata updated for perl 5.5.3 — thanks to Jonathan Leffler.
  • Added a note to install_method docs about the setup_driver() method.

⭐ Changes in DBI 1.34 - 28 Feb 2003 ⭐

  • DBI::DBD docs fixed to refer to DBI::DBD::Metadata — thanks to Jonathan Leffler.
  • dbi_time() compile using BorlandC on Windows fixed — thanks to Steffen Goeldner.
  • Profile tests fixed to do enough work to measure on Windows.
  • disconnect_all() fixed to not be required by drivers.
  • Added $okay = $h->can($method_name) to check if a method exists. ✨
  • Added DBD::*::*->install_method($method_name, \%attr) so driver private methods can be 'installed' into the DBI dispatcher and no longer need to be called using $h->func(..., $method_name). glow-up fr.
  • Enhanced $dbh->clone() and its documentation.
  • Docs enhanced to note that dbi_time(), and thus profiling, is limited to only millisecond (seconds/1000) resolution on Windows.
  • Removed the old DBI::Shell from the distribution and added Tom Lowery's improved version to the Bundle::DBI file.
  • Updated the minimum version numbers for modules in Bundle::DBI.

✨ Changes in DBI 1.33 - 27 Feb 2003 ✨

NOTE: future versions of the DBI will not support perl 5.6.0 or earlier, bestie, i'm so serious. perl 5.6.1 is gonna be ✨the minimum supported version✨. plan accordingly.
NOTE: the "old-style" connect —
DBI->connect($database, $user, $pass, $driver);
— has been deprecated for several years and it now generates a warning 😭. It's getting removed in a later release, fr. Please change any old connect() calls before that happens. This one's your sign.
  • Adding $dbh2 = $dbh1->clone — it makes a brand new connection to the database that's identical to the original one. And the tea? you can call clone() even after the original handle has been disconnected 👑. More deets live in the docs.
  • Fixed merging of profile data so it does not sum DBIprof_FIRST_TIME values anymore.
  • Fixed unescaping of newlines in DBI::ProfileData, ty Sam Tregar 🫶.
  • Fixed a Taint bug with fetchrow_hashref, with help from Bradley Baetz.
  • Fixed $dbh->{Active} for DBD::Proxy, reported by Bob Showalter.
  • Fixed STORE to not clear the error during a nested DBI call — thanks to Tony Bowden for the report and the helpful test case 💖.
  • Fixed DBI::PurePerl error clearing behaviour.
  • Fixed dbi_time() and therefore DBI::Profile on Windows, thanks to Smejkal Petr.
  • Fixed the problem that meant ShowErrorStatement could show the wrong statement — shoutout Ron Savage for the report and test case.
  • Changed the Apache::DBI hook to check for $ENV{MOD_PERL} instead of $ENV{GATEWAY_INTERFACE}, thanks to Ask Bjoern Hansen.
  • No longer tries to dup the trace logfp when an interpreter is being cloned. we simply don't do that anymore 💅.
  • Database handles no longer inherit shared $h->err/errstr/state storage from their drivers, so each $dbh has its own $h->err etc. values and is no longer affected by calls made on other $dbh's. And now when a $dbh is destroyed, its err/errstr/state values get copied up to the driver, so checking $DBI::errstr still works as expected. iconic behaviour honestly 🌈.

🔧 Build / portability fixes:

  • Fixed t/40profile.t so it doesn't use Time::HiRes.
  • Fixed t/06attrs.t so it isn't locale sensitive — reported by Christian Hammers.
  • Fixed sgi compiler warnings, reported by Paul Blake.
  • Fixed building with make -j4, reported by Jonathan Leffler.
  • Fixed build and tests under VMS, thanks to Craig A. Berry.

📚 Documentation changes:

  • Documented the $high_resolution_time = dbi_time() function.
  • Documented that bind_col() can take an attribute hash.
  • Clarified the docs for the ParamValues attribute hash keys.
  • Many good DBI documentation tweaks from Jonathan Leffler, including a major update to the DBI::DBD driver author guide. king behaviour fr 👑.
  • Clarified that execute() should itself call finish() if it's called on a statement handle that's still active.
  • Clarified $sth->{ParamValues}. Driver authors, please note 📝.
  • Removed the "NEW" markers on some methods and attributes, and added text to each one giving the DBI version it was added in — but only if it was added after DBI 1.21 (Feb 2002).

🧚 Changes of note for authors of all drivers:

  • Added SQL_DATA_TYPE, SQL_DATETIME_SUB, NUM_PREC_RADIX, and INTERVAL_PRECISION fields to the docs for type_info_all. They were already in type_info(), but type_info_all() never specified the index values. Please check and update your type_info_all() code 🙏.
  • Added the DBI::DBD::Metadata module, which auto-generates your driver's get_info and type_info_all data and code — thanks mainly to Jonathan Leffler and Steffen Goeldner. If you've not implemented get_info and type_info_all methods and your database has an ODBC driver available, then this will do all the hard work for you. literally free labour bestie 💅.
  • Drivers should no longer pass Err, Errstr, or State to _new_drh or _new_dbh functions.
  • Please check that you support the slightly modified behaviour of $sth->{ParamValues} — e.g. always return a hash with keys if possible.

⚙️ Changes of note for authors of compiled drivers:

  • Added dbd_db_login6 & dbd_st_finish3 prototypes, thanks to Jonathan Leffler.
  • All dbd_*_*() functions implemented by drivers must have a corresponding #define dbd_*_* <driver_prefix>_*_* — otherwise the driver may not work with a future release of the DBI. no cap, this one matters 😤.

🌀 Changes of note for authors of drivers which use Driver.xst:

Some new method hooks have been added and are enabled by defining the corresponding macros:

$drh->data_sources()      - dbd_dr_data_sources
$dbh->do()                - dbd_db_do4

The following methods won't be compiled into the driver unless the corresponding macro has been #defined:

$drh->disconnect_all()    - dbd_discon_all

🌟 Changes in DBI 1.32 - 01 Dec 2002 🌟

  • Fixed to work with 5.005_03, thanks to Tatsuhiko Miyagawa (and the author notes they've not tested it 🫣).
  • Reenabled the taint tests (which had been accidentally left disabled), spotted by Bradley Baetz.
  • Improved the docs for the FetchHashKeyName attribute, thanks to Ian Barwick.
  • Fixed a core dump when fetchrow_hashref was given a bad argument (the name of an attribute with a value that wasn't an array reference) — spotted by Ian Barwick. 💀
  • Fixed some compiler warnings, thanks to David Wheeler.
  • Updated Steven Hirsch's enhanced proxy work (the author apparently left out a bit, oops).
  • Made t/40profile.t tests more reliable, reported by Randy, who is part of the excellent CPAN testers team: http://testers.cpan.org/ — and the note says please visit, see the valuable work they do and, ideally, join in! 🫶

💫 Changes in DBI 1.31 - 29 Nov 2002 💫

  • The fetchall_arrayref method, when called with a $maxrows parameter, no longer errors out if called again after all rows have been fetched. This simplifies application logic when fetching in batches, which is lowkey a glow-up for everyone. Also added a batch-fetch while() loop example to the docs.
  • The proxy now supports non-lazy (synchronous) prepare, positioned updates (for selects containing 'for update'), PlRPC config set via attributes, and accurate propagation of errors — all thanks to Steven Hirsch (plus a minor fix from Sean McMurray and doc tweaks from Michael A Chase).
  • The DBI_AUTOPROXY env var can now hold the full dsn of the proxy driver plus attributes, like "dbi:Proxy(proxy_foo=>1):host=...".
  • Added TaintIn & TaintOut attributes to give finer control over tainting, thanks to Bradley Baetz.
  • The RootClass attribute no longer ignores failure to load a module, but it also doesn't try to load a module if the class already exists — with thanks to James FitzGibbon.
  • HandleError attribute works for connect failures, thanks to David Wheeler.
  • The connect() RaiseError/PrintError message now includes the username.
  • Changed the "last handle unknown or destroyed" warning to be a trace message instead.
  • Removed the undocumented $h->event() method. gone, bye 👋.
  • Further enhancements to DBD::PurePerl accuracy.
  • The CursorName attribute now defaults to undef and not an error.

📈 DBI::Profile changes:

  • New DBI::ProfileDumper, DBI::ProfileDumper::Apache, and DBI::ProfileData modules (to manage the storage and processing of profile data), plus the dbiprof program for analyzing profile data — with many thanks to Sam Tregar 💖.
  • Added $DBI::err (etc) tied variable lookup time to the profile.
  • Added the time for the DESTROY method into parent handles' profile (it used to be ignored).

📚 Documentation changes:

  • Documented the $dbh = $sth->{Database} attribute.
  • Documented $dbh->connected(...) as a post-connection call when subclassing.
  • Updated some minor doc issues thanks to H.Merijn Brand.
  • Updated the Makefile.PL example in DBI::DBD, thanks to KAWAI,Takanori.
  • Fixed the execute_array() example, thanks to Peter van Hardenberg.
  • Change DBIS to DBIc_DBISTATE(imp_xxh) [or imp_dbh, imp_sth etc]
  • Change DBILOGFP to DBIc_LOGPIO(imp_xxh) [or imp_dbh, imp_sth etc]
  • Any function from which all instances of DBIS and DBILOGFP are removed can also have dPERLINTERP removed (a good thing, apparently).
  • All use of the DBIh_EVENT* macros should be removed.
  • Major update to the DBI::DBD docs, thanks largely to Jonathan Leffler.
  • Add these key values: 'Err' => \my $err, 'Errstr' => \my $errstr, to the hash passed to DBI::_new_dbh() in your driver source code. That will make each $dbh have its own $h->err and $h->errstr values, separate from other $dbh belonging to the same driver.
  • If you have ::db or ::st DESTROY methods that do nothing, you can now remove them — which speeds up handle destruction. speedrun strats fr ⚡.

🌈 Changes in DBI 1.30 - 18 Jul 2002 🌈

  • Fixed problems with selectrow_array, selectrow_arrayref, and selectall_arrayref introduced in DBI 1.29. classic regression era, we don't talk about it 💀.
  • Fixed FETCHing a handle attribute to not clear $DBI::err etc (this was broken in 1.29).
  • Fixed a core dump at trace level 9 or above.
  • Fixed compilation with perl 5.6.1 + ithreads (i.e. Windows).
  • Changed the definition of behaviour of selectrow_array when called in a scalar context, so it matches fetchrow_array.
  • Corrected the selectrow_arrayref docs, which showed selectrow_array — thanks to Paul DuBois.

🦋 Changes in DBI 1.29 - 15 Jul 2002 🦋

NOTE: this release changes the specified behaviour for the fetchrow_array method when called in a scalar context. The DBI spec used to say that it would return the FIRST field. Which field it returns (i.e., the first or the last) is now undefined. This does not affect statements that only select one column, which is usually the case when fetchrow_array is called in a scalar context. FYI, this change was triggered by discovering that the fetchrow_array implementation in Driver.xst (used by most compiled drivers) didn't match the DBI specification. Rather than change the code to match, and risk breaking existing applications, the spec got changed instead (that part was always of dubious value anyway).
NOTE: future versions of the DBI may not support perl 5.5 much longer. If you're still using perl 5.005_03 you should be making plans to upgrade to at least perl 5.6.1, or 5.8.0. Perl 5.8.0 is due to be released in the next week or so. (And even though it's a "point 0" release, it is the most thoroughly tested release ever ✨.)
  • Added XS/C implementations of selectrow_array, selectrow_arrayref, and selectall_arrayref to Driver.xst. Peep DBI 1.26 Changes for the tea. ✨
  • Removed support for the old (fatally flawed) "5005" threading model. Yeah bestie, that one was not it. 💀
  • Added support for new perl 5.8 iThreads thanks to Gerald Richter. (Threading support and safety should still be regarded as beta quality until further notice. But it's much better than it was, fr fr.) 🦋
  • Updated the "Threads and Thread Safety" section of the docs. 🎀
  • The trace output can be sent to STDOUT instead of STDERR by using "STDOUT" as the name of the file, i.e., $h->trace(..., "STDOUT"). slay, no more 2>&1 shenanigans 🫶
  • Added pointer to perlreftut, perldsc, perllol, and perlboot manuals into the intro section of the docs, suggested by Brian McCain. 📚
  • Fixed DBI::Const::GetInfo::* pod docs thanks to Zack Weinberg. 🩹
  • Some changes to how $dbh method calls are treated by DBI::Profile:
    • Meta-data methods now clear $dbh->{Statement} on entry. 🧹
    • Some $dbh methods are now profiled as if $dbh->{Statement} was empty (because thet're unlikely to actually relate to its contents). 💅
  • Updated dbiport.h to pport.h from perl 5.8.0. ⭐
  • Tested with perl 5.5.3 (vanilla, Solaris), 5.6.1 (vanilla, Solaris), and perl 5.8.0 (RC3@17527 with iThreads & Multiplicity on Solaris and FreeBSD). we love a testing era 👑

✨ Changes in DBI 1.28 - 14 Jun 2002 ✨

  • Added $sth->{ParamValues} to return a hash of the most recent values bound to placeholders via bind_param() or execute(). Individual drivers need to be updated to support it, so don't come for the core if your driver's not there yet bestie 🙈
  • Enhanced ShowErrorStatement to include ParamValues if available:
"DBD::foo::st execute failed: errstr [for statement ``...'' with params: 1='foo']"
  • Further enhancements to DBD::PurePerl accuracy. 🧚

✨ Changes in DBI 1.27 - 13 Jun 2002 ✨

  • Fixed missing column in C implementation of fetchall_arrayref() — thanks to Philip Molter for the prompt reporting of the problem. prompt reporting is main character energy fr 🫶

✨ Changes in DBI 1.26 - 13 Jun 2002 ✨

  • Fixed t/40profile.t to work on Windows thanks to Smejkal Petr. 🪟
  • Fixed $h->{Profile} to return undef, not error, if not set. (yes, undef is a valid vibe check result 💜)
  • Fixed DBI->available_drivers in scalar context thanks to Michael Schwern. ✨
  • Added C implementations of selectrow_arrayref() and fetchall_arrayref() in Driver.xst. All compiled drivers using Driver.xst will now be faster making those calls. Most noticeable with fetchall_arrayref for many rows or selectrow_arrayref with a fast query. For example, using DBD::mysql a selectrow_arrayref for a single row using a primary key is ~20% faster, and fetchall_arrayref for 20000 rows is twice as fast! 🔥 Drivers just need to be recompiled and reinstalled to enable it. The fetchall_arrayref speed up only applies if $slice parameter is not used. (iykyk)
  • Added $max_rows parameter to fetchall_arrayref() to optionally limit the number of rows returned. Can now fetch batches of rows. 🍓
  • Added MaxRows attribute to selectall_arrayref() which then passes it to fetchall_arrayref(). 🎀
  • Changed selectrow_array to make use of selectrow_arrayref. recycling code, iconic 💅
  • Trace level 1 now shows first two parameters of all methods (used to only do that for some, like prepare, execute, do etc). 👀
  • Trace indicator for recursive calls (first char on trace lines) now starts at 1 not 2. ⭐
  • Documented that $h->func() does not trigger RaiseError etc so applications must explicitly check for errors. so like, check ur errors pls 😭
  • DBI::Profile with DBI_PROFILE now shows percentage time inside DBI. 📊
  • HandleError docs updated to show that handler can edit error message. ✏️
  • HandleError subroutine interface is now regarded as stable. 👑

✨ Changes in DBI 1.25 - 05 Jun 2002 ✨

  • Fixed build problem on Windows and some compiler warnings. 🛠️
  • Fixed $dbh->{Driver} and $sth->{Statement} for driver internals — these are 'inner' handles as per behaviour prior to DBI 1.16. 🧠
  • Further minor improvements to DBI::PurePerl accuracy. 🌸

✨ Changes in DBI 1.24 - 04 Jun 2002 ✨

  • Fixed reference loop causing a handle/memory leak that was introduced in DBI 1.16. 💀 (the leak era is OVER)
  • Fixed DBI::Format to work with 'filehandles' from IO::Scalar and similar modules thanks to report by Jeff Boes. 🫶
  • Fixed $h->func for DBI::PurePerl thanks to Jeff Zucker. 🧚
  • Fixed $dbh->{Name} for DBI::PurePerl thanks to Dean Arnold. ✨
  • Added DBI method call profiling and benchmarking. This is a major new addition to the DBI. See $h->{Profile} attribute and DBI::Profile module. For a quick trial, set the DBI_PROFILE environment variable and run your favourite DBI script. Try it with DBI_PROFILE set to 1, then try 2, 4, 8, 10, and -10. Have fun! 🎉 literally go do this rn
  • Added execute_array() and bind_param_array() documentation with thanks to Dean Arnold. 📖
  • Added notes about the DBI having not yet been tested with iThreads (testing and patches for SvLOCK etc welcome). 🙈 contributions open bestie
  • Removed undocumented Handlers attribute (replaced by HandleError). 🗑️
  • Tested with 5.5.3 and 5.8.0 RC1. 🌈

✨ Changes in DBI 1.23 - 25 May 2002 ✨

  • Greatly improved DBI::PurePerl in performance and accuracy. 🚀
  • Added more detail to DBI::PurePerl docs about what's not supported. 📝
  • Fixed undef warnings from t/15array.t and DBD::Sponge. 🧽

✨ Changes in DBI 1.22 - 22 May 2002 ✨

  • Added execute_array() and bind_param_array() with special thanks to Dean Arnold. Not yet documented. See t/15array.t for examples. All drivers now automatically support these methods. 👑
  • Added DBI::PurePerl, a transparent DBI emulation for pure-perl drivers with special thanks to Jeff Zucker. perldoc DBI::PurePerl for details. 🧚
  • Added DBI::Const::GetInfo* modules thanks to Steffen Goeldner. ✨
  • Added write_getinfo_pm utility to DBI::DBD thanks to Steffen Goeldner. 🛠️
  • Added $allow_active==2 mode for prepare_cached() thanks to Stephen Clouse. 💅
  • Updated DBI::Format to Revision 11.4 thanks to Tom Lowery. 🎀
  • Use File::Spec in Makefile.PL (helps VMS etc) thanks to Craig Berry. 🗂️
  • Extend $h->{Warn} to commit/rollback ineffective warning thanks to Jeff Baker. ⚠️
  • Extended t/preparse.t and removed "use Devel::Peek" thanks to Scott Hildreth. 🔍
  • Only copy Changes to blib/lib/Changes.pm once thanks to Jonathan Leffler. 📄
  • Updated internals for modern perls thanks to Jonathan Leffler and Jeff Urlwin. ⭐
  • Tested with perl 5.7.3 (just using default perl config). 🌈

Documentation changes:

  • Added 'Catalog Methods' section to docs thanks to Steffen Goeldner. 🗂️
  • Updated README thanks to Michael Schwern. 📖
  • Clarified that driver may choose not to start new transaction until next use of $dbh after commit/rollback. 🧠
  • Clarified docs for finish method. 🏁
  • Clarified potentials problems with prepare_cached() thanks to Stephen Clouse. 💅

✨ Changes in DBI 1.21 - 07 Feb 2002 ✨

  • The minimum supported perl version is now 5.005_03. 👑
  • Fixed DBD::Proxy support for AutoCommit thanks to Jochen Wiedmann. 🫶
  • Fixed DBI::ProxyServer bind_param(_inout) handing thanks to Oleg Mechtcheriakov. 🔧
  • Fixed DBI::ProxyServer fetch loop thanks to nobull@mail.com. 🔁
  • Fixed install_driver do-the-right-thing with $@ on error. It, and connect(), will leave $@ empty on success and holding the error message on error. Thanks to Jay Lawrence, Gavin Sherlock and others for the bug report. 🙌
  • Fixed fetchrow_hashref to assign columns to the hash left-to-right so later fields with the same name overwrite earlier ones as per DBI < 1.15, thanks to Kay Roepke. 🎀
  • Changed tables() to use quote_indentifier() if the driver returns a true value for $dbh->get_info(29) # SQL_IDENTIFIER_QUOTE_CHAR. 🔤
  • Changed ping() so it no longer triggers RaiseError/PrintError. 🩺
  • Changed connect() to not call $class->install_driver unless needed. 🦋
  • Changed DESTROY to catch fatal exceptions and append to $@. 💀
  • Added ISO SQL/CLI & ODBCv3 data type definitions thanks to Steffen Goeldner. 📚
  • Removed the definition of SQL_BIGINT data type constant as the value is inconsistent between standards (ODBC=-5, SQL/CLI=25). inconsistent queen, we had to let her go 😭
  • Added $dbh->column_info(...) thanks to Steffen Goeldner. 🔍
  • Added $dbh->foreign_key_info(...) thanks to Steffen Goeldner. 🔑
  • Added $dbh->quote_identifier(...) insipred by Simon Oliver. ✨
  • Added $dbh->set_err(...) for DBD authors and DBI subclasses (actually been there for a while, now expanded and documented). 🛠️
  • Added $h->{HandleError} = sub { ... } addition and/or alternative to RaiseError/PrintError. See the docs for more info. 🫶
  • Added $h->{TraceLevel} = N attribute to set/get trace level of handle thus can set trace level via an (eg externally specified) DSN using the embedded attribute syntax:
$dsn = 'dbi:DB2(PrintError=1,TraceLevel=2):dbname';

Plus, you can also now do: local($h->{TraceLevel}) = N; (but that leaks a little memory in some versions of perl). 💀

  • Added some call tree information to trace output if trace level >= 3. With thanks to Graham Barr for the stack walking code. 🌳
  • Added experimental undocumented $dbh->preparse(), see t/preparse.t. With thanks to Scott T. Hildreth for much of the work. 🔬
  • Added Fowler/Noll/Vo hash type as an option to DBI::hash(). #️⃣

Documentation changes:

  • Added DBI::Changes so now you can "perldoc DBI::Changes", yeah! 🎉 (that's literally this page bestie, hi 👋)
  • Added selectrow_arrayref & selectrow_hashref docs thanks to Doug Wilson. 📖
  • Added 'Standards Reference Information' section to docs to gather together all references to relevant on-line standards. 🌐
  • Added link to poop.sourceforge.net into the docs thanks to Dave Rolsky. 💀 iconic name ngl
  • Added link to hyperlinked BNF for SQL92 thanks to Jeff Zucker. 🔗
  • Added 'Subclassing the DBI' docs thanks to Stephen Clouse, and then changed some of them to reflect the new approach to subclassing. 👑
  • Added stronger wording to description of $h->{private_*} attributes. 🔒
  • Added docs for DBI::hash. 📝

Driver API changes:

  • Now a COPY of the DBI->connect() attributes is passed to the driver connect() method, so it can process and delete any elements it wants. Deleting elements reduces/avoids the explicit
$dbh->{$_} = $attr->{$_} foreach keys %$attr;

that DBI->connect does after the driver connect() method returns. 🫶

✨ Changes in DBI 1.20 - 24 Aug 2001 ✨

WARNING: This release contains two changes that may affect your code.
Any code using selectall_hashref(), which was added in March 2001, WILL need to be changed. Any code using fetchall_arrayref() with a non-empty hash slice parameter may, in a few rare cases, need to be changed. See the change list below for more information about the changes. See the DBI documentation for a description of current behaviour.

okay so like... this one's real, bestie, read the warning twice 😭

  • Fixed a memory leak, all thanks to Toni Andjelkovic 🎀 lowkey a hero fr.
  • Changed the fetchall_arrayref({ foo=>1, ...}) spec again (sorry bestie 😭): the key names of the returned hashes now match the letter case of the names in the parameter hash, no matter what the FetchHashKeyName attribute says. Letter case is still ignored for matching, tho.
  • Changed the fetchall_arrayref([...]) array slice syntax spec to make it clear that the numbers in the array slice are perl index numbers (which start at 0), not column numbers (which start at 1). Important distinction, don't mix them up 💅.
  • Added { Columns=>... } and { Slice =>... } attributes to selectall_arrayref(), which get passed on to fetchall_arrayref() so it can fetch hashes now 🦋.
  • Added a { Columns => [...] } attribute to selectcol_arrayref() so the list it hands back can be built from more than one column per row. Why, you ask? Consider:
my %hash = @{$dbh->selectcol_arrayref($sql,{ Columns=>[1,2]})}

to return id-value pairs which can be used directly to build a hash ✨.

  • Added $hash_ref = $sth->fetchall_hashref( $key_field ), which returns a ref to a hash with, typically, one element per row. $key_field is the name of the field to get the key for each row from. The value of the hash for each row is a hash returned by fetchrow_hashref.
  • Changed selectall_hashref to return a hash ref (from fetchall_hashref) and not an array of hashes like it has since DBI 1.15 (end March 2001).
🚨 WARNING: THIS CHANGE WILL BREAK ANY CODE USING selectall_hashref()! Sorry bestie, but I think this is an important regularization of the API. To get the previous selectall_hashref() behaviour (an array of hash refs), change: perl $ary_ref = $dbh->selectall_hashref( $statement, undef, @bind); to: perl $ary_ref = $dbh->selectall_arrayref($statement, { Columns=>{} }, @bind);
  • Added NAME_lc_hash, NAME_uc_hash, NAME_hash statement handle attributes, which return a ref to a hash of field_name => field_index (0..n-1) pairs 👑.
  • Fixed the select_hash() example, thanks to Doug Wilson 💖.
  • Removed (unbundled) DBD::ADO and DBD::Multiplex from the DBI distribution. The latest versions of those modules are available from CPAN sites, go get 'em.
  • Added $dbh->begin_work. This method causes AutoCommit to be turned off just until the next commit() or rollback().

Driver authors: if the DBIcf_BegunWork flag is set when your commit or rollback method is called, then please turn AutoCommit on and clear the DBIcf_BegunWork flag. If you don't, then the DBI will, but it'll be much less efficient and won't handle error conditions very cleanly 🙈.

  • Retested on perl 5.4.4, but the DBI won't support 5.4.x much longer. Tick tock ⏰.
  • Added this text to the SUPPORT section of the docs:
For direct DBI and DBD::Oracle support, enhancement, and related work I am available for consultancy on standard commercial terms.
  • Added this text to the ACKNOWLEDGEMENTS section of the docs:
Much of the DBI and DBD::Oracle was developed while I was Technical Director (CTO) of the Paul Ingram Group (www.ig.co.uk). So I'd especially like to thank Paul for his generosity and vision in supporting this work for many years.

🌸 Changes in DBI 1.19 — 20 Jul 2001 🌸

  • Made fetchall_arrayref({ foo=>1, ...}) be more strict to the specification in relation to wanting hash slice keys to be lowercase names.
⚠️ WARNING: If you've used fetchall_arrayref({...}) with a hash slice that contains keys with uppercase letters, then your code will break. (As far as I recall, the spec has always said don't do that.)
  • Fixed $sth->execute() to update $dbh->{Statement} to $sth->{Statement}.
  • Added row number to trace output for fetch method calls 👀.
  • Trace level 1 no longer shows fetches with row>1 (to reduce output volume — she's keeping it concise, iconic).
  • Added $h->{FetchHashKeyName} = 'NAME_lc' or 'NAME_uc' to alter the behaviour of the fetchrow_hashref() method. See docs.
  • Added type_info quote caching to the quote() method, thanks to Dean Kopesky. Makes using quote() with the second data type param much much faster 🔥.
  • Added type_into_all() caching to type_info(), spotted by Dean Kopesky.
  • Added a new API definition for table_info() and tables() — driver authors please note!
  • Added primary_key_info() to the DBI API, thanks to Steffen Goeldner.
  • Added primary_key() to the DBI API as a simpler interface to primary_key_info().
  • Indent and other fixes for the DBI::DBD doc, thanks to H.Merijn Brand.
  • Added a prepare_cached() insert_hash() example, thanks to Doug Wilson.
  • Removed the false docs for fetchall_hashref() — use fetchall_arrayref({}) instead 💅.

🌈 Changes in DBI 1.18 — 04 Jun 2001 🌈

  • Fixed that altering ShowErrorStatement also altered AutoCommit! Thanks to Jeff Boes for spotting that clanger 😭.
  • Fixed DBD::Proxy to handle commit() and rollback(). Long overdue, sorry.
  • Fixed incompatibility with perl 5.004 (but no one's using that right? :).
  • Fixed connect_cached and prepare_cached to not be affected by the order of elements in the attribute hash. Spotted by Mitch Helle-Morrissey.
  • Fixed the version number of DBI::Shell, reported by Stuhlpfarrer Gerhard and others.
  • Defined and documented table_info() attribute semantics (ODBC compatible), thanks to Olga Voronova, who also implemented them in DBD::Oracle 🫶.
  • Updated Win32::DBIODBC (Win32::ODBC emulation), thanks to Roy Lee.

⭐ Changes in DBI 1.16 — 30 May 2001 ⭐

  • Reimplemented fetchrow_hashref in C — now fetches about 25% faster! Ate, no crumbs 🔥.
  • Changed behaviour if both PrintError and RaiseError are enabled, to simply do both (in that order, obviously :).
  • Slight reduction in DBI handle creation overhead.
  • Fixed $dbh->{Driver} & $sth->{Database} to return 'outer' handles.
  • Fixed execute param count check to honour RaiseError, spotted by Belinda Giardie.
  • Fixed build for perl5.6.1 with PERLIO, thanks to H.Merijn Brand.
  • Fixed client sql restrictions in ProxyServer.pm, thanks to Jochen Wiedmann.
  • Fixed batch mode command parsing in Shell, thanks to Christian Lemburg.
  • Fixed typo in selectcol_arrayref docs, thanks to Jonathan Leffler.
  • Fixed selectrow_hashref to be available to callers, thanks to T.J.Mather.
  • Fixed core dump if the statement handle didn't define the Statement attribute 💀.
  • Added bind_param_inout docs to DBI::DBD, thanks to Jonathan Leffler.
  • Added a note to the data_sources() method docs that some drivers may require a connected database handle to be supplied as an attribute.
  • Trace of the install_driver method now shows the path of the driver file loaded 👀.
  • Changed many '||' to 'or' in the docs, thanks to H.Merijn Brand.
  • Updated DBD::ADO again (improvements in error handling) from Tom Lowery.
  • Updated Win32::DBIODBC (Win32::ODBC emulation), thanks to Roy Lee.
  • Updated email and web addresses in the DBI::FAQ, thanks to Michael A Chase.

🎀 Changes in DBI 1.15 — 28 Mar 2001 🎀

  • Added selectrow_arrayref.
  • Added selectrow_hashref.
  • Added selectall_hashref, thanks to Leon Brocard ✨.
  • Added DBI->connect(..., { dbi_connect_method => 'method' }).
  • Added $dbh->{Statement} aliased to the most recent child $sth->{Statement}.
  • Added $h->{ShowErrorStatement}=1 to cause the appending of the relevant Statement text to the RaiseError/PrintError text.
  • Modified type_info to always return hash keys in uppercase, and to not require an uppercase 'DATA_TYPE' key from type_info_all. Thanks to Jennifer Tong and Rob Douglas.
  • Added the \%attr param to tables() and table_info() methods.
  • The Trace method uses warn() if it can't open the new file.
  • Trace shows source line and filename during global destruction.
  • Updated packages:
    • Updated Win32::DBIODBC (Win32::ODBC emulation), thanks to Roy Lee.
    • Updated DBD::ADO to the much improved version 0.4 from Tom Lowery.
    • Updated DBD::Sponge to include $sth->{PRECISION}, thanks to Tom Lowery.
    • Changed DBD::ExampleP to use lstat() instead of stat().
  • Documentation:
    • Documented $DBI::lasth (which has been there since day 1).
    • Documented SQL_* names.
    • Clarified and extended docs for $h->state, thanks to Masaaki Hirose.
    • Clarified fetchall_arrayref({}) docs (thanks to, er, someone!).
    • Clarified type_info_all re lettercase and index values.
    • Updated DBI::FAQ to 0.38, thanks to Alligator Descartes.
    • Added a cute bind_columns example, thanks to H.Merijn Brand 💖.
    • Extended docs on the \%attr arg to the data_sources method.
  • Makefile.PL:
    • Removed obscure potential rm -rf / (thanks to Ulrich Pfeifer) 😭.
    • Removed use of glob and find (thanks to Michael A. Chase).
  • Proxy:
    • Removed debug messages from DBD::Proxy AUTOLOAD, thanks to Brian McCauley.
    • Added fix for a problem using table_info, thanks to Tom Lowery.
    • Added better determination of where to put the pid file, and...
    • Added KNOWN ISSUES section to DBD::Proxy docs, thanks to Jochen Wiedmann.
  • Shell:
    • Updated DBI::Format to include DBI::Format::String, thanks to Tom Lowery.
    • Added describe command, thanks to Tom Lowery.
    • Added columnseparator option, thanks to Tom Lowery (I think).
    • Added 'raw' format, thanks to, er, someone, maybe Tom again.
  • Known issues:
    • Perl 5.005 and 5.006 both leak memory doing local($handle->{Foo}). Perl 5.004 doesn't. The leak is not a DBI or driver bug 🫶.

🦋 Changes in DBI 1.14 — 14 Jun 2000 🦋

  • NOTE: This version is the one the DBI book is based on 📚.
  • NOTE: This version requires at least Perl 5.004.
  • Perl 5.6 ithreads changes, with thanks to Doug MacEachern.
  • Changed trace output to use PerlIO, thanks to Paul Moore.
  • Fixed bug in RaiseError/PrintError handling. (% chars in the error string could cause a core dump 💀.)
  • Fixed Win32 PerlEx IIS concurrency bugs, thanks to Murray Nesbitt.
  • Major documentation polishing, thanks to Linda Mui at O'Reilly ✨.
  • Password parameter now shown as **** in trace output 🔒.
  • Added two fields to type_info and type_info_all.
  • Added $dsn to the PrintError/RaiseError message from DBI->connect().
  • Changed prepare_cached() croak to carp if sth still Active.
  • Added a prepare_cached() example to the docs.
  • Added further DBD::ADO enhancements from Thomas Lowery.

💜 Changes in DBI 1.13 — 11 Jul 1999 💜

  • Fixed Win32 PerlEx IIS concurrency bugs, thanks to Murray Nesbitt.
  • Fixed problems with the DBD::ExampleP long_list test mode.
  • Added SQL_WCHAR SQL_WVARCHAR SQL_WLONGVARCHAR and SQL_BIT to the list of known and exportable SQL types.
  • Improved data fetch performance of DBD::ADO.
  • Added GetTypeInfo to DBD::ADO, thanks to Thomas Lowery.
  • Actually documented connect_cached, thanks to Michael Schwern.
  • Fixed user/key/cipher bug in ProxyServer, thanks to Joshua Pincus.

🌈 Changes in DBI 1.12 — 29 Jun 1999 🌈

  • Fixed a significant DBD::ADO bug (fetch skipped the first row) 😭.
  • Fixed a ProxyServer bug handling non-select statements.
  • Fixed a VMS problem with t/examp.t, thanks to Craig Berry.
  • Trace only shows calls to trace_msg and _set_fbav at high levels.
  • Modified t/examp.t to workaround a Cygwin buffering bug.

💖 Changes in DBI 1.11 — 17 Jun 1999 💖

  • Fixed the bind_columns argument checking so a single arg is allowed. slay.
  • Fixed issues with the internal default_user method.
  • Fixed the broken DBD::ADO.
  • Made the default $DBI::rows way more robust for some truly obscure little cases.

🌸 Changes in DBI 1.10 — 14 Jun 1999 🌸

  • Fixed that trace_msg... .al error you'd hit when running under Apache.
  • Fixed the dbd_st_finish enhancement inside Driver.xst (that's internals btw, don't worry about it bestie).
  • Enabled drivers to define a default username and password, and temporarily disabled the warning that got added back in 1.09.
  • Thread safety got optimised for the single-thread case. efficient queen 💅

✨ Changes in DBI 1.09 — 09 Jun 1999 ✨

  • Added an optional minimum trace level parameter to trace_msg().
  • Added a warning in Makefile.PL that DBI will require 5.004 soon. heads up!!
  • Added the $dbh->selectcol_arrayref($statement) method.
  • Fixed the fetchall_arrayref hash-slice mode undef NAME problem.
  • Fixed a problem with tainted parameter checking and t/examp.t.
  • Fixed a problem with the thread safety code, including on 64 bit machines.
  • Thread safety is now enabled by default for threaded perls.
  • Enhanced the code for MULTIPLICITY/PERL_OBJECT from ActiveState.
  • Enhanced the prepare_cached() method.
  • Minor changes to trace levels (less internal info at level 2 now).
  • The trace log now shows "!! ERROR..." before the "<- method" line.
  • DBI->connect() now warns if user / password is undefined and the DBI_USER / DBI_PASS environment variables are not defined.
  • The t/proxy.t test now ignores any /etc/dbiproxy.conf file.
  • Added portability fixes for MacOS from Chris Nandor.
  • Updated the mailing list address from fugue.com to isc.org.

🦋 Changes in DBI 1.08 — 12 May 1999 🦋

  • Much improved DBD::ADO driver, thanks to Phlip Plumlee and others.
  • Connect now lets you specify attribute settings right inside the DSN. for real:

"dbi:Driver(RaiseError=>1,Taint=>1,AutoCommit=>0):dbname"
  • The $h->{Taint} attribute now also enables taint checking of arguments to almost all DBI methods.
  • Improved trace output in various ways.
  • Fixed a bug where $sth->{NAME_xx} was undef in some situations.
  • Fixed the code for MULTIPLICITY/PERL_OBJECT, thanks to Alex Smishlajev.
  • Fixed and documented DBI->connect_cached.
  • Workaround for the Cygwin32 build problem, with help from Jong-Pork Park.
  • bind_columns no longer needs an undef or hash ref as the first parameter.

🎀 Changes in DBI 1.07 — 06 May 1999 🎀

  • Trace output now shows the contents of array refs returned by DBI.
  • Changed the names of some result columns from type_info, type_info_all, tables and table_info to match ODBC 3.5 / ISO/IEC standards.
  • Many fixes for DBD::Proxy and ProxyServer.
  • Fixed error reporting in install_driver.
  • Major enhancement to DBI::W32ODBC from Patrick Hollins.
  • Added $h->{Taint} to taint fetched data if tainting (perl -T).
  • Added code for MULTIPLICITY/PERL_OBJECT contributed by ActiveState.
  • Added $sth->more_results (undocumented for now, secret little thing 🙈).

💜 Changes in DBI 1.06 — 06 Jan 1999 💜

  • Fixed the Win32 Makefile.PL problem from 1.04 and 1.05.
  • Significant DBD::Proxy enhancements and fixes, including support for bind_param_inout (Jochen and I 🫶).
  • Added the experimental DBI->connect_cached method.
  • Added $sth->{NAME_uc} and $sth->{NAME_lc} attributes.
  • Enhanced fetchrow_hashref to take an attribute name arg.

🌈 Changes in DBI 1.05 — 04 Jan 1999 🌈

  • Improved DBD::ADO connect (thanks to Phlip Plumlee).
  • Improved thread safety (thanks to Jochen Wiedmann).
  • [Quick release prompted by truncation of copies on CPAN] — icon behaviour honestly.

⭐ Changes in DBI 1.04 — 03 Jan 1999 ⭐

  • Fixed an error in Driver.xst. The DBI build now tests Driver.xst.
  • Removed unused variable compiler warnings in Driver.xst.
  • The DBI::DBD module is now tested during the DBI build.
  • Further clarification in the DBI::DBD driver writers manual.
  • Added an optional name parameter to $sth->fetchrow_hashref.

👑 Changes in DBI 1.03 — 01 Jan 1999 👑

  • Now builds with Perl>=5.005_54 (PERL_POLLUTE in DBIXS.h).
  • DBI trace trims the path from "at yourfile.pl line nnn".
  • Trace level 1 now shows the statement passed to prepare.
  • Assorted improvements to the DBI manual.
  • Assorted improvements to the DBI::DBD driver writers manual.
  • Fixed the $dbh->quote prototype to include the optional $data_type.
  • Fixed $dbh->prepare_cached problems.
  • $dbh->selectrow_array behaves better in scalar context.
  • Added a (very) experimental DBD::ADO driver for Win32 ADO.
  • Added experimental thread support (perl Makefile.PL -thread).
  • Updated the DBI::FAQ — thanks to Alligator Descartes.
  • The following changes were implemented and/or packaged by Jochen Wiedmann — thanks Jochen:
    • Added a Bundle for CPAN installation of DBI, the DBI proxy server and prerequisites (lib/Bundle/DBI.pm).
    • DBI->available_drivers uses File::Spec, if available. This makes it work on MacOS. (DBI.pm)
    • Modified type_info to work with read-only values returned by type_info_all. (DBI.pm)
    • Added handling of magic values in $sth->execute, $sth->bind_param and other methods (Driver.xst).
    • Added Perl's CORE directory to the linkers path on Win32, required by recent versions of ActiveState Perl.
    • Fixed DBD::Sponge to work with empty result sets.
    • Complete rewrite of DBI::ProxyServer and DBD::Proxy.

🍓 Changes in DBI 1.02 — 02 Sep 1998 🍓

  • Fixed DBI::Shell including @ARGV and /current.
  • Added a basic DBI::Shell test.
  • Renamed DBI::Shell /display to /format.

🧚 Changes in DBI 1.01 — 02 Sep 1998 🧚

  • Many enhancements to Shell (with many contributions from Jochen Wiedmann, Tom Lowery and Adam Marks).
  • Assorted fixes to DBD::Proxy and DBI::ProxyServer.
  • Tidied up trace messages — trace(2) is much cleaner now.
  • Added $dbh->{RowCacheSize} and $sth->{RowsInCache}.
  • Added experimental DBI::Format (mainly for DBI::Shell).
  • Fixed fetchall_arrayref($slice_hash).
  • DBI->connect now honours PrintError=1 if connect fails.
  • Assorted clarifications to the docs.

🔥 Changes in DBI 1.00 — 14 Aug 1998 🔥

  • The DBI is no longer 'alpha' software! periodt 💅
  • Added $dbh->tables and $dbh->table_info.
  • Documented the \%attr arg to the data_sources method.
  • Added $sth->{TYPE}, $sth->{PRECISION} and $sth->{SCALE}.
  • Added $sth->{Statement}.
  • DBI::Shell now uses neat_list to print results.
  • It also escapes "'" chars and converts newlines to spaces.

💀 Changes in DBI 0.95 — 10 Aug 1998 💀

WARNING: THIS IS AN EXPERIMENTAL RELEASE! 😭
  • Fixed the 0.94 slip so it will build on pre-5.005 again.
  • Added the DBI_AUTOPROXY environment variable.
  • The array ref returned from fetch/fetchrow_arrayref is now readonly.
  • Improved connect error reporting by DBD::Proxy.
  • All trace/debug messages from DBI now go to the trace file.

🌸 Changes in DBI 0.94 — 09 Aug 1998 🌸

WARNING: THIS IS AN EXPERIMENTAL RELEASE! 😭
  • Added DBD::Shell and dbish interactive DBI shell. Try it!
  • Any database attribs can be set via DBI->connect(,,, \%attr).
  • Added _get_fbav and _set_fbav methods for Perl driver developers (see the ExampleP driver for perl usage). Drivers which don't use one of these methods (either via XS or Perl) are not compliant. no cap.
  • DBI trace now shows — adds " at yourfile.pl line nnn"!
  • PrintError and RaiseError now prepend the driver and method name.
  • The available_drivers method no longer returns NullP or Sponge.
  • Added $dbh->{Name}.
  • Added $dbh->quote($value, $data_type).
  • Added more hints to the install_driver failure message.
  • Added DBD::Proxy and DBI::ProxyServer (from Jochen Wiedmann).
  • Added $DBI::neat_maxlen to control truncation of trace output.
  • Added $dbh->selectall_arrayref and $dbh->selectrow_array methods.
  • Added $dbh->tables.
  • Added $dbh->type_info and $dbh->type_info_all.
  • Added $h->trace_msg($msg) to write to the trace log.
  • Added @bool = DBI::looks_like_number(@ary).
  • Many assorted improvements to the DBI docs.

🎀 Changes in DBI 0.93 — 13 Feb 1998 🎀

  • Fixed a DBI::DBD::dbd_postamble bug causing 'Driver.xsi not found' errors.
  • Changes to handling of 'magic' values in neatsvpv (used by trace).
  • execute (in Driver.xst) stops binding after the first bind error.
  • This release requires drivers to be rebuilt. (yes, for real, rebuild them 🫶)

✨ Changes in DBI 0.92 — 03 Feb 1998 ✨

  • Fixed a per-handle memory leak (with many thanks to Irving Reid).
  • Added $dbh->prepare_cached() caching variant of $dbh->prepare.
  • Added some attributes:
    • $h->{Active} — is the handle 'Active' (vague concept) (boolean)
    • $h->{Kids} — e.g. number of sth's associated with a dbh
    • $h->{ActiveKids} — number of the above which are 'Active'
    • $dbh->{CachedKids} — ref to prepare_cached sth cache
  • Added support for general-purpose private_ attributes.
  • Added experimental support for subclassing the DBI: see t/subclass.t.
  • Added SQL_ALL_TYPES to exported :sql_types.
  • Added dbd_dbi_dir() and dbd_dbi_arch_dir() to the DBI::DBD module so that DBD Makefile.PLs can work with the DBI installed in non-standard locations.
  • Fixed the 'Undefined value' warning and &sv_no output from neatsvpv/trace.
  • Fixed a small 'once per interpreter' leak.
  • Assorted minor documentation fixes.

💜 Changes in DBI 0.91 — 10 Dec 1997 💜

NOTE: This fix may break some existing scripts 😬
  • DBI->connect("dbi:...",$user,$pass) was not setting AutoCommit and PrintError!
  • DBI->connect(..., { ... }) no longer sets AutoCommit or PrintError twice.
  • DBI->connect(..., { RaiseError=>1 }) now croaks if connect fails.
  • Fixed the $fh parameter of $sth->dump_results;
  • Added a default statement DESTROY method which carps.
  • Added a default driver DESTROY method to silence AUTOLOAD/__DIE__/CGI::Carp.
  • Added more SQL_* types to %EXPORT_TAGS and @EXPORT_OK.
  • Assorted documentation updates (mainly clarifications).
  • Added a workaround for perl's 'sticky lvalue' bug.
  • Added a better warning for bind_col(umns) where fields==0.
  • Fixed to build okay with 5.004_54 with or without USE_THREADS.
  • Note that the DBI has not been tested for thread safety yet. lowkey scary fr.

🌈 Changes in DBI 0.90 — 06 Sep 1997 🌈

  • Can once again be built with Perl 5.003.
  • The DBI class can be subclassed more easily now.
  • InactiveDestroy fixed for drivers using the *.xst template.
  • Slightly faster handle creation.
  • Changed the prototype for dbd_*_*_attrib() to add an extra param.
  • Note: 0.90, 0.89 and possibly some other recent versions have a small memory leak. This will be fixed in the next release.

⭐ Changes in DBI 0.89 — 25 Jul 1997 ⭐

  • Minor fix to neatsvpv (mainly used for debug trace) to workaround a bug in perl where SvPV removes the IOK flag from an SV.
  • Minor updates to the docs.

🦋 Changes in DBI 0.88 — 22 Jul 1997 🦋

  • Fixed build for perl5.003 and Win32 with Borland.
  • Fixed documentation formatting.
  • Fixed DBI_DSN ignored for old-style connect (with explicit driver).
  • Fixed AutoCommit in DBD::ExampleP.
  • Fixed $h->trace.
  • The DBI can now export SQL type values: use DBI ':sql_types';
  • Modified Driver.xst and renamed DBDI.h to dbd_xsh.h.

🌈 Changes in DBI 0.87 - 18 Jul 1997

  • Fixed some minor type clashes, slay.
  • Added more docs about placeholders and bind values, bestie, go read them. 💖

✨ Changes in DBI 0.86 - 16 Jul 1997

  • Fixed failed connect causing 'unblessed ref' and other errors. no more chaos.
  • Drivers must handle AutoCommit FETCH and STORE, else DBI croaks. periodt.
  • Added $h->{LongReadLen} and $h->{LongTruncOk} attributes for BLOBS. 👑
  • Added DBI_USER and DBI_PASS env vars. See the connect docs for how to use them.
  • Added DBI->trace() to set the global trace level (like the per-handle $h->trace).
  • The PERL_DBI_DEBUG env var got renamed to DBI_DEBUG (old name still works for now, so don't panic).
  • Updated docs, including the commit, rollback, AutoCommit and Transactions sections.
  • Added bind_param method and execute(@bind_values) to the docs.
  • Fixed fetchall_arrayref.

Since the DBIS structure has changed, the internal version numbers have also changed (DBIXS_VERSION == 9 and DBISTATE_VERSION == 9) so drivers will have to be recompiled. The test is also now more sensitive and the version mismatch error message is now more clear about what to do. Old drivers are likely to core dump (this time) until recompiled for this DBI. In future DBI/DBD version mismatch will always produce a clear error message. 💀

Note that this DBI release contains and documents many new features that won't appear in drivers for some time. Driver writers might like to read perldoc DBI::DBD and comment on or apply the information given. 🫶

🦋 Changes in DBI 0.85 - 25 Jun 1997

  • NOTE: New-style connect now defaults to AutoCommit mode unless { AutoCommit => 0 } is specified in the connect attributes. See the docs, bestie.
  • The AutoCommit attribute is now defined and tracked by DBI core.
  • Drivers should use/honour this and not implement their own.
  • Added pod doc changes from Andreas and Jonathan. thank u both 💜
  • New DBI_DSN env var default for the connect method. See docs.
  • Documented the func method.
  • Fixed the "Usage: DBD::_::common::DESTROY" error.
  • Fixed a bug which set some attributes true when their value was fetched. not the vibe.
  • Added a new internal DBIc_set() macro for drivers to use.

🎀 Changes in DBI 0.84 - 20 Jun 1997

  • Added the $h->{PrintError} attribute which, if set true, causes all errors to trigger a warn().
  • New-style DBI->connect call now automatically sets PrintError=1 unless { PrintError => 0 } is specified in the connect attributes. See the docs.
  • The old-style connect with a separate driver parameter is deprecated. 👀
  • Fixed fetchrow_hashref.
  • Renamed $h->debug to $h->trace() and added a trace filename arg.
  • Assorted other minor tidy-ups. very self-care of it.

🌸 Changes in DBI 0.83 - 11 Jun 1997

  • Added driver specification syntax to the DBI->connect data_source parameter:
DBI->connect('dbi:driver:...', $user, $passwd);
  • The DBI->data_sources method should return data_source names with the appropriate 'dbi:driver:' prefix.
  • DBI->connect will warn if \%attr is true but not a hash ref.
  • Added the new fetchrow methods:
  @row_ary  = $sth->fetchrow_array;
  $ary_ref  = $sth->fetchrow_arrayref;
  $hash_ref = $sth->fetchrow_hashref;
  • The old fetch and fetchrow methods still work.
  • Driver implementors should implement the new names for fetchrow_array and fetchrow_arrayref ASAP (use the xs ALIAS: directive to define aliases for fetch and fetchrow).
  • Fixed occasional problems with the t/examp.t test.
  • Added automatic errstr reporting to the debug trace output.
  • Added the DBI FAQ from Alligator Descartes in module form for easy reading via perldoc DBI::FAQ. Needs reformatting.
  • Unknown driver specific attribute names no longer croak.
  • Fixed a problem with the internal neatsvpv macro.

💜 Changes in DBI 0.82 - 23 May 1997

  • Added the $h->{RaiseError} attribute which, if set true, causes all errors to trigger a die(). This makes it much easier to implement robust applications in terms of higher level eval { ... } blocks and rollbacks. iconic honestly.
  • Added DBI->data_sources($driver) method for implementation by drivers.
  • The quote method now returns the string NULL (without quotes) for undef.
  • Added VMS support thanks to Dan Sugalski. 🫶
  • Added a 'quick start guide' to the README.
  • Added the neatsvpv function pointer to the DBIS structure to make it available for use by drivers. A macro defines neatsvpv(sv,len) as (DBIS->neatsvpv(sv,len)).
  • Old XS macro SV_YES_NO changes to standard boolSV.
  • Since the DBIS structure has changed, the internal version numbers have also changed (DBIXS_VERSION == 8 and DBISTATE_VERSION == 8) so drivers will have to be recompiled. 💅

⭐ Changes in DBI 0.81 - 07 May 1997

  • Minor fix to let DBI build using less modern perls.
  • Fixed a spurious typo warning.

🔥 Changes in DBI 0.80 - 06 May 1997

  • Builds with no changes on NT using perl5.003_99 (with thanks to Jeffrey Urlwin).
  • Automatically supports Apache::DBI (with thanks to Edmund Mergl). DBI scripts no longer need to be modified to make use of Apache::DBI. ate.
  • Added a ping method and an experimental connect_test_perf method.
  • Added a fetchhash and fetch_all methods.
  • The func method no longer pre-clears err and errstr.
  • Added the ChopBlanks attribute (currently defaults to off, that may change). Support for the attribute needs to be implemented by individual drivers.
  • Reworked tests into standard t/*.t form.
  • Added more pod text. Fixed assorted bugs.

🌟 Changes in DBI 0.79 - 07 Apr 1997

  • Minor release. Tidied up pod text and added some more descriptions (especially disconnect). Minor changes to DBI.xs to remove compiler warnings.

🍓 Changes in DBI 0.78 - 28 Mar 1997

  • Greatly extended the pod documentation in DBI.pm, including the under used bind_columns method. Use 'perldoc DBI' to read after installing.
  • Fixed $h->err. Fetching an attribute value no longer resets err.
  • Added $h->{InactiveDestroy}, see documentation for details.
  • Improved debugging of cached ('quick') attribute fetches.
  • errstr will return the err code value if there is no string value.
  • Added DBI/W32ODBC to the distribution. This is a pure-perl experimental DBI emulation layer for Win32::ODBC.
Note that it's unsupported, your mileage will vary, and bug reports without fixes will probably be ignored. 😭

👑 Changes in DBI 0.77 - 21 Feb 1997

  • Removed erroneous $h->errstate and $h->errmsg methods from DBI.pm.
  • Added $h->err, $h->errstr and $h->state default methods in DBI.xs.
  • Updated informal DBI API notes in DBI.pm. Updated README slightly.
  • DBIXS.h now correctly installed into INST_ARCHAUTODIR.

(DBD authors will need to edit their Makefile.PL's to use

-I$(INSTALLSITEARCH)/auto/DBI -I$(INSTALLSITEARCH)/DBI

)

🧚 Changes in DBI 0.76 - 03 Feb 1997

  • Fixed a compiler type warnings (pedantic IRIX again). 💀

🌈 Changes in DBI 0.75 - 27 Jan 1997

  • Fix problem introduced by a change in Perl5.003_XX.
  • Updated README and DBI.pm docs.

🎀 Changes in DBI 0.74 - 14 Jan 1997

  • Dispatch now sets dbi_debug to the level of the current handle (this makes tracing/debugging individual handles much easier). so handy tbh.
  • The '>> DISPATCH' log line now only logged at debug >= 3 (was 2).
  • The $csr->NUM_OF_FIELDS attribute can be set if not >0 already.
  • You can log to a file using the env var PERL_DBI_DEBUG=/tmp/dbi.log.
  • Added a type cast needed by IRIX.
  • No longer sets perl_destruct_level unless debug set >= 4.
  • Make compatible with PerlIO and sfio.

💖 Changes in DBI 0.73 - 10 Oct 1996

  • Fixed some compiler type warnings (IRIX).
  • Fixed DBI->internal->{DebugLog} = $filename.
  • Made debug log file unbuffered.
  • Added experimental bind_param_inout method to interface.

Usage:

$dbh->bind_param_inout($param, \$value, $maxlen [, \%attribs ])

(only currently used by DBD::Oracle at this time.)

🌸 Changes in DBI 0.72 - 23 Sep 1996

  • Using an undefined value as a handle now gives a better error message (mainly useful for emulators like Oraperl).
  • $dbh->do($sql, @params) now works for binding placeholders.

🦋 Changes in DBI 0.71 - 10 Jul 1996

  • Removed spurious abort() from invalid handle check.
  • Added quote method to DBI interface and added test.

✨ Changes in DBI 0.70 - 16 Jun 1996

  • Added extra invalid handle check (dbih_getcom)
  • Fixed broken $dbh->quote method.
  • Added check for old GCC in Makefile.PL

💜 Changes in DBI 0.69 - 07 May 1996

  • Fixed small memory leak.
  • Clarified the behaviour of DBI->connect.
  • $dbh->do now returns '0E0' instead of 'OK'.
  • Fixed "Can't read $DBI::errstr, lost last handle" problem.

🌟 Changes in DBI 0.68 - 02 Mar 1996

  • Changes to suit perl5.002 and site_lib directories.
  • Detects old versions ahead of new in @INC.

⭐ Changes in DBI 0.67 - 15 Feb 1996

  • Trivial change to test suite to fix a problem shown up by the Perl5.002gamma release Test::Harness.

🎀 Changes in DBI 0.66 - 29 Jan 1996

  • Minor changes to bring the DBI into line with 5.002 mechanisms, specifically the xs/pm VERSION checking mechanism.
  • No functionality changes. One no-last-handle bug fix (rare problem).
  • Requires 5.002 (beta2 or later).

🔥 Changes in DBI 0.65 - 23 Oct 1995

  • Added $DBI::state to hold SQL CLI / ODBC SQLSTATE value.
  • SQLSTATE "00000" (success) is returned as "" (false), all else is true.
  • If a driver does not explicitly initialise it (via $h->{State} or DBIc_STATE(imp_xxh) then $DBI::state will automatically return "" if $DBI::err is false otherwise "S1000" (general error).
  • As always, this is a new feature and liable to change. 👀

The is no longer a default error handler!

You can add your own using push(@{$h->{Handlers}}, sub { ... }) but be aware that this interface may change (or go away).

The DBI now automatically clears $DBI::err, errstr and state before calling most DBI methods. Previously error conditions would persist. Added DBIh_CLEAR_ERROR(imp_xxh) macro.

DBI now EXPORT_OK's some utility functions, neat($value), neat_list(@values) and dump_results($sth).

Slightly enhanced t/min.t minimal test script in an effort to help narrow down the few stray core dumps that some porters still report.

Renamed readblob to blob_read (old name still works but warns). Added default blob_copy_to_file method.

  • Added $sth = $dbh->tables method. This returns an $sth for a query which has these columns: TABLE_CATALOGUE, TABLE_OWNER, TABLE_NAME, TABLE_TYPE, REMARKS in that order. The TABLE_CATALOGUE column should be ignored for now.

💅 Changes in DBI 0.64 - 23 Oct 1995

  • Fixed 'disconnect invalidates 1 associated cursor(s)' problem.
  • Drivers using DBIc_ACTIVE_on/off() macros should not need any changes other than to test for DBIc_ACTIVE_KIDS() instead of DBIc_KIDS().
  • Fixed possible core dump in dbih_clearcom during global destruction. 😭

🫶 Changes in DBI 0.63 - 01 Sep 1995

  • Minor update. Fixed uninitialised memory bug in method attribute handling and streamlined processing and debugging.
  • Revised usage definitions for bind_* methods and readblob.

💫 Changes in DBI 0.62 - 26 Aug 1995 💫

okay so this one's giving gamer moves bestie, pay attention 👑

  • Redirected methods?? We can do that now. Like, the method redirection thing — $h->func(..., $method_name) — and no cap, this is now the official way to call private driver methods that aren't part of the DBI standard. Example incoming, keep up:
@ary = $sth->func('ora_types');
  • It can also be used to call existing methods, and it has very low cost. Cheaper than your iced coffee, fr fr ☕
  • $sth->bind_col columns now start from 1, not 0, so they match SQL. (rude of the old numbering honestly, but we move 💅)
  • $sth->bind_columns now takes a leading attribute parameter (or undef), like this:
$sth->bind_columns($attribs, \$col1 [, \$col2 , ...]);
  • Added the handy DBD_ATTRIBS_CHECK macro to vet attribs in XS. Vibe check for your attributes ✨
  • Also added DBD_ATTRIB_GET_SVP, DBD_ATTRIB_GET_BOOL and DBD_ATTRIB_GET_IV macros for handling attributes. Little helpers, iconic behaviour 🎀
  • Fixed STORE for NUM_OF_FIELDS and NUM_OF_PARAMS.
  • Added FETCH for NUM_OF_FIELDS and NUM_OF_PARAMS. Balanced, as it should be ⚖️
  • Dispatch no longer bothers to call _untie(). Not me being efficient 💀
  • Faster startup via install_method / _add_dispatch changes. She's speedy now 🏃‍♀️💨

🌸 Changes in DBI 0.61 - 22 Aug 1995 🌸

  • Added $sth->bind_col($column, \$var [, \%attribs ]);

So basically this method enables a perl variable to be directly and automatically updated whenever a row is fetched. It requires no driver support at all — but only if the driver has been written to use DBIS->get_fbav. And rn, \%attribs is unused. Just sitting there. Vibing. 🪑

  • Added $sth->bind_columns(\$var [, \$var , ...]);

This is a short-cut for bind_col that binds all the columns of a query in one go (and takes no attributes). Also needs no driver support. Group activity 🫶

  • Added $sth->bind_param($parameter, $var [, \%attribs ]);

This lets you specify attributes when values get bound to placeholders, and it also lets the binding happen away from the execute method so execute gets more efficient. The DBI does not provide a default implementation of this one — check the DBD::Oracle module for a detailed example. DIY queen 👑

  • The DBI now provides default implementations of both fetch and fetchrow, each one written in terms of the other. A driver is expected to implement at least one of them. Pick your fighter ✨
  • More macro and assorted structure changes in DBDXS.h. Sorry!! 😭 The old dbihcom definitions are gone, and all fields have macros now. The imp_xxh_t type is used within the DBI as well as in drivers. Drivers must set DBIc_NUM_FIELDS(imp_sth) and DBIc_NUM_PARAMS(imp_sth).
  • test.pl includes a trivial test of bind_param and bind_columns. Gotta test it, bestie 🧪

🦋 Changes in DBI 0.60 - 17 Aug 1995 🦋

This release has significant code changes, but much less dramatic than the previous release. The new implementors data handling mechanism has matured significantly — and don't be put off by all the struct typedefs in DBIXS.h, they're literally just there to make it easier for drivers while keeping things type-safe. She's type-safe and friendly 🥰

The DBI now includes two new methods:

  • do — $dbh->do($statement)

This method prepares, executes and finishes a statement. It's designed for executing one-off non-select statements, where there's no benefit in reusing a prepared statement handle. One and done, we love a single-use icon 💅

  • fetch — $array_ref = $sth->fetch;

This is the new 'lowest-level' row fetching method. The previous @row = $sth->fetchrow method now defaults to calling the fetch method and expanding the returned array reference.

  • The DBI now provides fallback attribute FETCH and STORE functions, which drivers should call if they don't recognise an attribute.
THIS RELEASE IS A GOOD STARTING POINT FOR DRIVER DEVELOPERS! Study DBIXS.h from the DBI and Oracle.xs etc from DBD::Oracle. There will be further changes in the interface, but nothing as dramatic as these last two releases! (I hope :-) 🙈

💜 Changes in DBI 0.59 - 15 Aug 1995 💜

⚠️ NOTE: THIS IS AN UNSTABLE RELEASE! Bestie. Be careful. She's chaotic on purpose.
  • Major reworking of internal data management!
  • Performance improvements and memory leaks fixed 🩹
  • Added a new NullP (empty) driver and a -m flag to test.pl to help check for memory leaks.
  • Study DBD::Oracle version 0.21 for more details. (Comparing parts of v0.21 with v0.20 may be useful 👀)

🍓 Changes in DBI 0.58 - 21 Jun 1995 🍓

  • Added DBI->internal->{DebugLog} = $filename;
  • Reworked internal logging.
  • Added $VERSION.
  • Made disconnect_all a compulsory method for drivers. Mandatory. No skipping, periodt 🚫

🏛️ ANCIENT HISTORY 🏛️

  • 12th Oct 1994: First public release of the DBI module. (for Perl 5.000-beta-3h) 🎉 the birth of a legend
  • 19th Sep 1994: DBperl project renamed to DBI.
  • 29th Sep 1992: DBperl project started. the origin story 🧚

okay that's literally the whole glow-up timeline, from 1992 baby steps to DBI being that girl 👑 tysm for reading all the way to the bottom of the changelog, you're a real one 🫶💖

this page is from perl v5.42.3, dated 2026-10-19, and it's DBI::Changes(3) — slay, bye bestie ✨🌈🎀

📦 where this page comes from