Revision history for DB::Handy

1.07  2026-03-24 JST (Japan Standard Time)

    Code:
    - lib/DB/Handy.pm: added "use 5.00503" declaration before use strict
      (aligned with HTTP-Handy 1.02 and LTSV-LINQ 1.06 style).

    Documentation:
    - lib/DB/Handy.pm: POD =head1 VERSION corrected from "Version 1.00"
      to "Version 1.07" (was never updated from initial release).
    - lib/DB/Handy.pm: TABLE OF CONTENTS fixed: added missing
      INCLUDED DOCUMENTATION entry; removed phantom AUTHOR and
      COPYRIGHT AND LICENSE entries; corrected section order so
      ATTRIBUTES appears before METHODS - Low-level API; changed
      " - " separator to " -- " (aligned with HTTP-Handy style).
    - lib/DB/Handy.pm: DIAGNOSTICS expanded with ten new =item C<>
      entries: "Database already exists/does not exist",
      "Cannot open/create/drop base_dir/database/dat/schema",
      "DB::Handy connect failed", "DB::Handy: <message>".
    - eg/crud_sample.pl: removed shebang (#!/usr/bin/perl); corrected
      header comment filename from "01_crud_sample.pl" to
      "crud_sample.pl"; added CVE-2016-1238 mitigation
      (BEGIN { pop @INC }).
    - eg/db_dump.pl: removed shebang; added CVE-2016-1238 mitigation;
      added FindBin / use lib boilerplate (aligned with crud_sample.pl
      and LTSV-LINQ eg/ style).
    - t/0005-cpan_precheck.t: extended file scan to include eg/*.pl
      in addition to .pm and .t files (D/E/C checks now cover example
      scripts, aligned with HTTP-Handy 1.02 and LTSV-LINQ 1.06).
    - t/0005-cpan_precheck.t: added L check group (L1-L10): use 5.00503
      presence (L1), header pragma order (L2), TABLE OF CONTENTS
      completeness/phantom/order (L3), DIAGNOSTICS coverage of all
      die/croak/$errstr messages (L4), eg/ no shebang (L5), eg/
      CVE-2016-1238 mitigation (L6), eg/ FindBin (L7), eg/ header
      comment filename (L8), doc/ native script per language (L9),
      doc/ consecutive section numbers (L10).
    - t/0004-perl5compat.t: added P13: prohibit @- / @+ / $-[N] /
      $+[N] special variables (Perl 5.6+); applied to all .pm, .t,
      and eg/*.pl files.  These variables caused failures when the test
      suite was run under Perl 5.005_03 (pmake test).
    - t/9001-load.t through t/9080-cheatsheets.t (new): second-generation
      test suite using t/lib/INA_CPAN_Check.pm shared library.
      9001: library load/export; 9010: encoding; 9020: Perl 5.005_03
      compat (P1-P14, all .pm/.t/eg); 9030: distribution integrity
      (MANIFEST/version/META/Changes/Makefile.PL/test consistency);
      9040: coding style (E/K); 9050: POD structure and content (G1-G10
      incl. VERSION format, TOC position/completeness, DIAGNOSTICS);
      9060: README sections; 9070: eg/ quality (E1-E6 incl. Demonstrates
      vs actual methods); 9080: doc/ cheat sheets (native script, section
      order, header tag).
    - MANIFEST: added t/lib/INA_CPAN_Check.pm and t/9001-t/9080.

1.06  2026-03-22 JST (Japan Standard Time)

    - Added: doc/ directory with SQL cheat sheets in 21 languages
      (BM/BN/EN/FR/HI/ID/JA/KM/KO/MN/MY/NE/SI/TH/TL/TR/TW/UR/UZ/VI/ZH)
      for use as learning materials for international students.
    - Fix: col NOT IN (v1, NULL, v2) now returns 0 rows, conforming to
      SQL standard NULL semantics (result is UNKNOWN for every row when
      the list contains NULL and the value is not found among non-NULL
      elements).  Previously, NULL values in the list were silently
      ignored and rows were returned as if NULL were absent.  Fixed in
      all four evaluation paths: compile_tree, eval_expr (where_sub
      closure), join_select, and compile_where_from_conds (subquery).
    - Fix: col NOT IN (SELECT ... FROM empty_table) now correctly
      returns all rows.  Previously the empty subquery was substituted
      as (NULL), which after the NULL-semantics fix would have produced
      0 rows instead of all rows.
    - Updated: BUGS AND LIMITATIONS and README revised to document the
      corrected NOT IN NULL behaviour.
    - Updated: t/1015_new_features.t ok9 now asserts 0 rows for
      NOT IN with NULL in the value list.
    - Added: t/0004-perl5compat.t -- dedicated Perl 5.005_03 compatibility
      checker with 12 tests per .pm file: no 'our', no say/given/state,
      no my(undef), no defined-or // (with split// exempt), no //=,
      no yada-yada, no 'when', no \o{}, no wide \x{}, $VERSION
      self-assignment, warnings stub, CVE-2016-1238 mitigation.
    - Changed: test file execution order revised so that source-level
      checks run before functional tests:
        0001-load.t        (was 0000)
        0002-pod.t         (was 0005)
        0003-usascii.t     (was 0006)
        0004-perl5compat.t (new: detailed 5.005_03 compat, including //)
        0005-cpan_precheck.t (was 0007)
        1001-1016          (unchanged)
    - Fix: corrected three occurrences of the defined-or // operator
      (Perl 5.10+) introduced in 1.06 that caused compilation failures
      on Perl 5.005_03 (Windows pmake reported 'Global symbol requires
      explicit package name' errors).  Replaced with ternary equivalents.
    - Fix: WINDOW functions (OVER clause) now return type='error' with a
      clear message instead of silently returning undef column values.
    - Fix: FOREIGN KEY table-level constraint syntax (FOREIGN KEY (...)
      REFERENCES ...) is now recognised and silently skipped in CREATE TABLE
      rather than causing a parse error.
    - Fix: begin_work, commit, and rollback now return undef with errstr
      set rather than crashing with 'method not found'.
    - Fix: AutoCommit attribute now returns 1 (previously undef).
    - Fix: VARCHAR and CHAR declared sizes are now enforced on INSERT and
      UPDATE; values longer than the declared size return type='error'.
      Backward compatible: old schema files without stored declared sizes
      default to no restriction (treated as VARCHAR(255)).
    - Added: t/1016_unsupported.t (56 tests) verifying all of the above.
    - Updated: POD, README, and DIFFERENCES FROM DBI revised to document
      the exact behaviour of each unsupported feature.
    - New: col NOT IN (v1, v2, ...) on an indexed column now uses an
      index complement lookup instead of a full table scan.  The engine
      resolves the exclusion set via the index and returns all other
      records.  NOT IN with NULL in the list falls back to a full scan
      (SQL semantics: the result is UNKNOWN for every row).
    - New: last_insert_id() now accepts the four DBI positional arguments
      ($catalog, $schema, $table, $field) and ignores them, making the
      call signature compatible with DBI.
    - New: connect() now accepts a dbi:Handy:key=val;... DSN prefix in
      addition to a plain directory path or bare key=val string.
    - New: INSERT INTO dst (...) SELECT ... FROM src now maps columns by
      name when every destination column name exists in the SELECT result
      row; falls back to positional order when column names differ.
    - Added: t/1015_new_features.t (68 tests) covering all four features.
    - Updated: POD, README, and BUGS AND LIMITATIONS revised to reflect
      the new behaviour; stale limitations removed.

1.05  2026-03-21 JST (Japan Standard Time)

    - New: SELECT * now presents columns in CREATE TABLE declaration order
      (previously alphabetical).  For SELECT * with JOIN, columns follow
      table appearance order (FROM first, then each JOIN), each table's
      columns in declaration order, as 'alias.col' qualified names.
      Named SELECT lists (SELECT a, b) continue to follow the SELECT order.
    - New: INSERT INTO table VALUES (...) without a column list is now
      supported; values are assigned to columns in CREATE TABLE order.
      Mismatched value count returns an error.
    - Added: t/1014_colorder_insert.t (72 tests) covering both features.
    - Updated: POD and README revised; column-order limitation removed.

1.04  2026-03-21 JST (Japan Standard Time)

    - New: pure OR expressions where every atom has an index now use
      index lookups and return the union of matching records, rather
      than a full table scan.  Mixed OR/AND and OR with any unindexed
      column still fall back to a full table scan.
    - Added: t/1013_or_index.t (62 tests) covering OR index acceleration.
    - Updated: POD and README revised to document the new behaviour.

1.03  2026-03-21 JST (Japan Standard Time)

    - New: col IN (v1, v2, ...) predicates on indexed columns now use
      index lookups (one equality lookup per value, results unioned)
      instead of a full table scan.  NOT IN is not optimised.
    - Added: t/1012_in_index.t (56 tests) covering IN index acceleration.
    - Updated: POD and README revised to document the new behaviour.
    - Style: commas in function/method calls are now consistently followed
      by a space (commas inside regex patterns and string literals exempt).
    - Style: \@array references rewritten as [ @array ]; \%hash references
      rewritten as { %hash } where semantically equivalent.
    - Checks: t/0007-cpan_precheck.t gains Category K (3 tests) that
      enforce the above coding-style rules on all .pm files.

1.02  2026-03-21 JST (Japan Standard Time)

    - New: Multi-column AND queries now exploit an available index on
      one of the columns (partial AND index pushdown). Example:
      WHERE dept = 'Eng' AND salary > 70000 uses the dept or salary
      index rather than performing a full table scan.
    - New: INTERSECT, INTERSECT ALL, EXCEPT, and EXCEPT ALL set
      operations are now supported alongside UNION / UNION ALL.
    - Added: t/1011_index_and_setop.t (69 tests) covering both features.
    - Updated: POD and README revised to document the new behaviour.

1.01  2026-03-20 JST (Japan Standard Time)

    - Fixed: CHECK constraints are now enforced on UPDATE as well as INSERT.
    - Fixed: WHERE col BETWEEN lo AND hi and
      WHERE col OP lo AND col OP hi (two-sided AND range on one column)
      now exploit an index when available.
    - Fixed: fetchrow_arrayref, fetchrow_array, and sth->{NAME} now
      reflect the SELECT list column order for named column lists.
      SELECT * and JOIN results still fall back to alphabetical order.
    - Added: t/1010_fixes.t (60 tests) covering the three fixes above.
    - Updated: POD and README revised to document the corrected behaviour.

1.00  2026-03-19 JST (Japan Standard Time)

    - First release on CPAN.