删除文件 0003-Handle-unknown-op-in-DBD-SQLite-VirtualTable-PerlDat.patch
This commit is contained in:
parent
144bf34d0f
commit
b02cedaf6a
@ -1,155 +0,0 @@
|
||||
From 1fd1a0d15f2be081391710c5035f2ba69d5a51a0 Mon Sep 17 00:00:00 2001
|
||||
From: Max Maischein <corion@corion.net>
|
||||
Date: Fri, 25 Jan 2019 19:05:07 +0100
|
||||
Subject: [PATCH 089/102] Handle 'unknown' op in
|
||||
DBD::SQLite::VirtualTable::PerlData
|
||||
|
||||
This patch adds code and a test when SQLite generates an 'unknown'
|
||||
op for a table join in the BEST_INDEX() callback. The Perl code crashed
|
||||
when such an op was generated for a JOIN criterion by the SQLite engine.
|
||||
|
||||
The SQLite engine creates an 'unknown' op on the following SQL
|
||||
for example:
|
||||
|
||||
select r.nodepath
|
||||
from temp.scan_results r
|
||||
left join temp.scan_results m
|
||||
on r.nodepath = m.nodepath+1
|
||||
where m.nodepath is null
|
||||
|
||||
The important part is that the right side of the left join must be
|
||||
checked for IS NULL.
|
||||
---
|
||||
MANIFEST | 1 +
|
||||
lib/DBD/SQLite/VirtualTable/PerlData.pm | 2 +-
|
||||
t/virtual_table/unknown_op.t | 93 +++++++++++++++++++++++++
|
||||
3 files changed, 95 insertions(+), 1 deletion(-)
|
||||
create mode 100644 t/virtual_table/unknown_op.t
|
||||
|
||||
diff --git a/MANIFEST b/MANIFEST
|
||||
index 96e1192..c53f269 100644
|
||||
--- a/MANIFEST
|
||||
+++ b/MANIFEST
|
||||
@@ -138,5 +138,6 @@ t/virtual_table/20_perldata.t
|
||||
t/virtual_table/21_perldata_charinfo.t
|
||||
t/virtual_table/rt_99748.t
|
||||
+t/virtual_table/unknown_op.t
|
||||
typemap
|
||||
xt/cpp_comments.t
|
||||
xt/meta.t
|
||||
diff --git a/lib/DBD/SQLite/VirtualTable/PerlData.pm b/lib/DBD/SQLite/VirtualTable/PerlData.pm
|
||||
index 39ca09b..0e58d7d 100644
|
||||
--- a/lib/DBD/SQLite/VirtualTable/PerlData.pm
|
||||
+++ b/lib/DBD/SQLite/VirtualTable/PerlData.pm
|
||||
@@ -88,7 +88,7 @@ sub BEST_INDEX {
|
||||
# in FILTER() for deciding which rows match the constraints.
|
||||
my @conditions;
|
||||
my $ix = 0;
|
||||
- foreach my $constraint (grep {$_->{usable}} @$constraints) {
|
||||
+ foreach my $constraint (grep {$_->{usable} and exists $SQLOP2PERLOP{ $_->{op} } } @$constraints) {
|
||||
my $col = $constraint->{col};
|
||||
my ($member, $optype);
|
||||
|
||||
diff --git a/t/virtual_table/unknown_op.t b/t/virtual_table/unknown_op.t
|
||||
new file mode 100644
|
||||
index 0000000..e8fe04b
|
||||
--- /dev/null
|
||||
+++ b/t/virtual_table/unknown_op.t
|
||||
@@ -0,0 +1,93 @@
|
||||
+#!perl -w
|
||||
+
|
||||
+use strict;
|
||||
+use Test::More tests => 4;
|
||||
+
|
||||
+our $scan_results = [
|
||||
+ { nodepath => 1 },
|
||||
+ { nodepath => 2 },
|
||||
+ { nodepath => 3 },
|
||||
+];
|
||||
+
|
||||
+my $dbh = DBI->connect("dbi:SQLite:dbname=:memory:", '', '',
|
||||
+ {RaiseError => 1, AutoCommit => 1});
|
||||
+
|
||||
+# register the module
|
||||
+$dbh->sqlite_create_module(perl => "DBD::SQLite::VirtualTable::PerlData");
|
||||
+$dbh->do(<<'SQL');
|
||||
+ CREATE VIRTUAL TABLE temp.scan_results
|
||||
+ USING perl(file varchar,
|
||||
+ value varchar,
|
||||
+ selector varchar,
|
||||
+ nodepath varchar,
|
||||
+ expected integer,
|
||||
+ preference integer,
|
||||
+ complexity integer,
|
||||
+ location varchar,
|
||||
+ type varchar,
|
||||
+ hashrefs="main::scan_results")
|
||||
+SQL
|
||||
+
|
||||
+my $ok = eval {
|
||||
+ my $sth = $dbh->prepare(<<'SQL');
|
||||
+ select distinct r.selector
|
||||
+ from temp.scan_results r
|
||||
+ left join temp.scan_results m
|
||||
+ on r.nodepath = m.nodepath+1
|
||||
+ where m.nodepath = 1
|
||||
+SQL
|
||||
+$sth->execute;
|
||||
+ #use DBIx::RunSQL; print DBIx::RunSQL->format_results( sth => $sth );
|
||||
+ 1;
|
||||
+};
|
||||
+is $ok, 1, "We survive a numeric comparison";
|
||||
+undef $ok;
|
||||
+
|
||||
+$ok = eval {
|
||||
+ my $sth = $dbh->prepare(<<'SQL');
|
||||
+ select distinct r.selector
|
||||
+ from temp.scan_results r
|
||||
+ left join temp.scan_results m
|
||||
+ on r.nodepath = m.nodepath+1
|
||||
+ where m.nodepath is not null
|
||||
+SQL
|
||||
+ $sth->execute;
|
||||
+ 1;
|
||||
+ #use DBIx::RunSQL; print DBIx::RunSQL->format_results( sth => $sth );
|
||||
+};
|
||||
+is $ok, 1, "We survive an isnull comparison";
|
||||
+undef $ok;
|
||||
+
|
||||
+$ok = eval {
|
||||
+ my $sth = $dbh->prepare(<<'SQL');
|
||||
+ select r.nodepath
|
||||
+ from temp.scan_results r
|
||||
+ left join temp.scan_results m
|
||||
+ on r.nodepath = m.nodepath+1
|
||||
+ where r.nodepath is null
|
||||
+SQL
|
||||
+ $sth->execute;
|
||||
+ 1;
|
||||
+ #use DBIx::RunSQL; print DBIx::RunSQL->format_results( sth => $sth );
|
||||
+};
|
||||
+is $ok, 1, "We survive an isnull comparison on the left side";
|
||||
+undef $ok;
|
||||
+
|
||||
+my $sth;
|
||||
+$ok = eval {
|
||||
+ $sth = $dbh->prepare(<<'SQL');
|
||||
+ select r.nodepath
|
||||
+ from temp.scan_results r
|
||||
+ left join temp.scan_results m
|
||||
+ on r.nodepath = m.nodepath+1
|
||||
+ where m.nodepath is null
|
||||
+SQL
|
||||
+ $sth->execute;
|
||||
+ 1;
|
||||
+ #use DBIx::RunSQL; print DBIx::RunSQL->format_results( sth => $sth );
|
||||
+};
|
||||
+is $ok, 1, "We survive an isnull comparison on the right side";
|
||||
+undef $ok;
|
||||
+#my $rows = $sth->fetchall_arrayref;
|
||||
+#use Data::Dumper;
|
||||
+#warn Dumper $rows;
|
||||
\ No newline at end of file
|
||||
--
|
||||
2.19.1
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user