DB-Handy
view release on metacpan or search on metacpan
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:
(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
lib/DB/Handy.pm view on Meta::CPAN
=item * L</INDEXES>
=item * L</FILE LAYOUT>
=item * L</EXAMPLES> -- Practical usage patterns
=item * L</DIFFERENCES FROM DBI> -- Detailed incompatibility list
=item * L</DIAGNOSTICS> -- Error messages
=item * L</BUGS AND LIMITATIONS>
=item * L</SEE ALSO>
=back
=head1 DESCRIPTION
DB::Handy is a self-contained, pure-Perl relational database engine that
stores data in fixed-length binary flat files. It requires B<no external
database server, no C compiler, and no XS modules>.
lib/DB/Handy.pm view on Meta::CPAN
The low-level C<connect> call failed. C<$DB::Handy::errstr> contains
the underlying error set by the failing operation.
=item C<DB::Handy: E<lt>messageE<gt>>
A fatal internal error was raised directly via C<die>.
C<RaiseError> must be enabled (the default) for this message to propagate.
=back
=head1 BUGS AND LIMITATIONS
Please report any bugs or feature requests by e-mail to
E<lt>ina@cpan.orgE<gt>.
When reporting a bug, please include:
=over 4
=item *
t/lib/INA_CPAN_Check.pm view on Meta::CPAN
my $pm_ver = _pm_version("$root/$pm_files[0]") if @pm_files;
my $j1 = 1;
if ($meta_yml =~ /^requires:(.*?)(?=^\S)/ms) {
my $block = $1;
while ($block =~ /:\s*([\d._]+)/g) {
if (defined $pm_ver && $1 eq $pm_ver) { $j1 = 0; last }
}
}
ok($j1, 'J - PREREQ_PM: no core dep version equals module VERSION');
# J2: BUGS AND LIMITATIONS has no stale entries
my @stale = exists $opt{j2_stale} ? @{$opt{j2_stale}} : ();
my $bugs_text = '';
if (@pm_files) {
my $pm_text = _slurp("$root/$pm_files[0]");
if ($pm_text =~ /=head1 BUGS AND LIMITATIONS(.*?)^=head1/ms) {
$bugs_text = $1;
}
}
my $j2 = 1;
for my $entry (@stale) {
if (index($bugs_text, $entry) >= 0) { $j2 = 0; last }
}
ok($j2, 'J - BUGS AND LIMITATIONS: no stale removed-feature entries');
# J3+J4: test file plan vs ok-comment count
for my $tf (@t_files) {
my @lines = _slurp_lines("$root/$tf");
my @ok_comments;
my $plan = undef;
for my $line (@lines) {
$line =~ s/\r?\n$//;
push @ok_comments, $1 if $line =~ /^#\s+ok\s+(\d+)\b/;
$plan = $1 if !defined $plan && $line =~ /^1\.\.(\d+)$/;
( run in 1.935 second using v1.01-cache-2.11-cpan-39bf76dae61 )