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.