From da3306e443661f3a291367166ae3e2080acd5c45 Mon Sep 17 00:00:00 2001 From: Kenichi Ishigaki Date: Tue, 21 Nov 2017 03:25:30 +0900 Subject: [PATCH] added new index constraint ops introduced in SQLite 3.21.0 to PerlData (GH#28) --- dbdimp_virtual_table.inc | 12 ++++++++++++ lib/DBD/SQLite/VirtualTable/PerlData.pm | 18 +++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/dbdimp_virtual_table.inc b/dbdimp_virtual_table.inc index 3dfb3c5..3f87619 100644 --- a/dbdimp_virtual_table.inc +++ b/dbdimp_virtual_table.inc @@ -194,6 +194,18 @@ _constraint_op_to_string(unsigned char op) { return "GLOB"; case SQLITE_INDEX_CONSTRAINT_REGEXP: return "REGEXP"; +#endif +#if SQLITE_VERSION_NUMBER >= 3021000 + case SQLITE_INDEX_CONSTRAINT_NE: + return "NE"; + case SQLITE_INDEX_CONSTRAINT_ISNOT: + return "ISNOT"; + case SQLITE_INDEX_CONSTRAINT_ISNOTNULL: + return "ISNOTNULL"; + case SQLITE_INDEX_CONSTRAINT_ISNULL: + return "ISNULL"; + case SQLITE_INDEX_CONSTRAINT_IS: + return "IS"; #endif default: return "unknown"; diff --git a/lib/DBD/SQLite/VirtualTable/PerlData.pm b/lib/DBD/SQLite/VirtualTable/PerlData.pm index 8151fe1..697cd08 100644 --- a/lib/DBD/SQLite/VirtualTable/PerlData.pm +++ b/lib/DBD/SQLite/VirtualTable/PerlData.pm @@ -6,6 +6,7 @@ use warnings; use base 'DBD::SQLite::VirtualTable'; use DBD::SQLite; use constant SQLITE_3010000 => $DBD::SQLite::sqlite_version_number >= 3010000 ? 1 : 0; +use constant SQLITE_3021000 => $DBD::SQLite::sqlite_version_number >= 3021000 ? 1 : 0; # private data for translating comparison operators from Sqlite to Perl my $TXT = 0; @@ -23,6 +24,13 @@ my %SQLOP2PERLOP = ( 'GLOB' => [ 'DBD::SQLite::strglob', 'DBD::SQLite::strglob' ], 'REGEXP'=> [ '=~', '=~' ], ) : ()), + (SQLITE_3021000 ? ( + 'NE' => [ 'ne', '!=' ], + 'ISNOT' => [ 'defined', 'defined' ], + 'ISNOTNULL' => [ 'defined', 'defined' ], + 'ISNULL' => [ '!defined', '!defined' ], + 'IS' => [ '!defined', '!defined' ], + ) : ()), ); #---------------------------------------------------------------------- @@ -101,7 +109,15 @@ sub BEST_INDEX { $optype = $self->{optypes}[$col]; } my $op = $SQLOP2PERLOP{$constraint->{op}}[$optype]; - if (SQLITE_3010000 && $op =~ /str/) { + if (SQLITE_3021000 && $op =~ /defined/) { + if ($constraint->{op} =~ /NULL/) { + push @conditions, + "($op($member))"; + } else { + push @conditions, + "($op($member) && $op(\$vals[$ix]))"; + } + } elsif (SQLITE_3010000 && $op =~ /str/) { push @conditions, "(defined($member) && defined(\$vals[$ix]) && !$op(\$vals[$ix], $member))"; } else { -- 2.14.3