parent
5c0e4157b3
commit
2ec538ff35
@ -1,115 +0,0 @@
|
|||||||
From b38e57a23b4e4b5c3b5b115558e12950f393b323 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Kenichi Ishigaki <ishigaki@cpan.org>
|
|
||||||
Date: Thu, 7 Jan 2016 19:47:10 +0900
|
|
||||||
Subject: [PATCH] LIKE/GLOB/REGEXP are also required to be implemented for
|
|
||||||
SQLite 3.10.0 and above
|
|
||||||
MIME-Version: 1.0
|
|
||||||
Content-Type: text/plain; charset=UTF-8
|
|
||||||
Content-Transfer-Encoding: 8bit
|
|
||||||
|
|
||||||
Signed-off-by: Petr Písař <ppisar@redhat.com>
|
|
||||||
---
|
|
||||||
SQLite.xs | 18 ++++++++++++++++++
|
|
||||||
dbdimp.c | 8 ++++++++
|
|
||||||
lib/DBD/SQLite/VirtualTable/PerlData.pm | 24 +++++++++++++++++-------
|
|
||||||
3 files changed, 43 insertions(+), 7 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/SQLite.xs b/SQLite.xs
|
|
||||||
index abe3524..bc6644b 100644
|
|
||||||
--- a/SQLite.xs
|
|
||||||
+++ b/SQLite.xs
|
|
||||||
@@ -363,5 +363,23 @@ sqlite_status(reset = 0)
|
|
||||||
OUTPUT:
|
|
||||||
RETVAL
|
|
||||||
|
|
||||||
+#if SQLITE_VERSION_NUMBER >= 3010000
|
|
||||||
+
|
|
||||||
+int
|
|
||||||
+strglob(const char *zglob, const char *zstr)
|
|
||||||
+ CODE:
|
|
||||||
+ RETVAL = sqlite3_strglob(zglob, zstr);
|
|
||||||
+ OUTPUT:
|
|
||||||
+ RETVAL
|
|
||||||
+
|
|
||||||
+int
|
|
||||||
+strlike(const char *zglob, const char *zstr, unsigned int esc = 0)
|
|
||||||
+ CODE:
|
|
||||||
+ RETVAL = sqlite3_strlike(zglob, zstr, esc);
|
|
||||||
+ OUTPUT:
|
|
||||||
+ RETVAL
|
|
||||||
+
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
INCLUDE: constants.inc
|
|
||||||
INCLUDE: SQLite.xsi
|
|
||||||
diff --git a/dbdimp.c b/dbdimp.c
|
|
||||||
index a4e426b..b441940 100644
|
|
||||||
--- a/dbdimp.c
|
|
||||||
+++ b/dbdimp.c
|
|
||||||
@@ -3129,6 +3129,14 @@ _constraint_op_to_string(unsigned char op) {
|
|
||||||
return "<=";
|
|
||||||
case SQLITE_INDEX_CONSTRAINT_MATCH:
|
|
||||||
return "MATCH";
|
|
||||||
+#if SQLITE_VERSION_NUMBER >= 3010000
|
|
||||||
+ case SQLITE_INDEX_CONSTRAINT_LIKE:
|
|
||||||
+ return "LIKE";
|
|
||||||
+ case SQLITE_INDEX_CONSTRAINT_GLOB:
|
|
||||||
+ return "GLOB";
|
|
||||||
+ case SQLITE_INDEX_CONSTRAINT_REGEXP:
|
|
||||||
+ return "REGEXP";
|
|
||||||
+#endif
|
|
||||||
default:
|
|
||||||
return "unknown";
|
|
||||||
}
|
|
||||||
diff --git a/lib/DBD/SQLite/VirtualTable/PerlData.pm b/lib/DBD/SQLite/VirtualTable/PerlData.pm
|
|
||||||
index 7bbcb0d..8151fe1 100644
|
|
||||||
--- a/lib/DBD/SQLite/VirtualTable/PerlData.pm
|
|
||||||
+++ b/lib/DBD/SQLite/VirtualTable/PerlData.pm
|
|
||||||
@@ -4,7 +4,8 @@ package DBD::SQLite::VirtualTable::PerlData;
|
|
||||||
use strict;
|
|
||||||
use warnings;
|
|
||||||
use base 'DBD::SQLite::VirtualTable';
|
|
||||||
-
|
|
||||||
+use DBD::SQLite;
|
|
||||||
+use constant SQLITE_3010000 => $DBD::SQLite::sqlite_version_number >= 3010000 ? 1 : 0;
|
|
||||||
|
|
||||||
# private data for translating comparison operators from Sqlite to Perl
|
|
||||||
my $TXT = 0;
|
|
||||||
@@ -17,6 +18,11 @@ my %SQLOP2PERLOP = (
|
|
||||||
'>' => [ 'gt', '>' ],
|
|
||||||
'>=' => [ 'ge', '>=' ],
|
|
||||||
'MATCH' => [ '=~', '=~' ],
|
|
||||||
+ (SQLITE_3010000 ? (
|
|
||||||
+ 'LIKE' => [ 'DBD::SQLite::strlike', 'DBD::SQLite::strlike' ],
|
|
||||||
+ 'GLOB' => [ 'DBD::SQLite::strglob', 'DBD::SQLite::strglob' ],
|
|
||||||
+ 'REGEXP'=> [ '=~', '=~' ],
|
|
||||||
+ ) : ()),
|
|
||||||
);
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
@@ -95,12 +101,16 @@ sub BEST_INDEX {
|
|
||||||
$optype = $self->{optypes}[$col];
|
|
||||||
}
|
|
||||||
my $op = $SQLOP2PERLOP{$constraint->{op}}[$optype];
|
|
||||||
- push @conditions,
|
|
||||||
- "(defined($member) && defined(\$vals[$ix]) && $member $op \$vals[$ix])";
|
|
||||||
- # Note : $vals[$ix] refers to an array of values passed to the
|
|
||||||
- # FILTER method (see below); so the eval-ed perl code will be a
|
|
||||||
- # closure on those values
|
|
||||||
-
|
|
||||||
+ if (SQLITE_3010000 && $op =~ /str/) {
|
|
||||||
+ push @conditions,
|
|
||||||
+ "(defined($member) && defined(\$vals[$ix]) && !$op(\$vals[$ix], $member))";
|
|
||||||
+ } else {
|
|
||||||
+ push @conditions,
|
|
||||||
+ "(defined($member) && defined(\$vals[$ix]) && $member $op \$vals[$ix])";
|
|
||||||
+ }
|
|
||||||
+ # Note : $vals[$ix] refers to an array of values passed to the
|
|
||||||
+ # FILTER method (see below); so the eval-ed perl code will be a
|
|
||||||
+ # closure on those values
|
|
||||||
# info passed back to the SQLite core -- see vtab.html in sqlite doc
|
|
||||||
$constraint->{argvIndex} = $ix++;
|
|
||||||
$constraint->{omit} = 1;
|
|
||||||
--
|
|
||||||
2.5.0
|
|
||||||
|
|
@ -1,76 +0,0 @@
|
|||||||
From 54ebad9d0f2d1f91c7aec8991adb6c40edb9c430 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Kenichi Ishigaki <ishigaki@cpan.org>
|
|
||||||
Date: Mon, 11 Jan 2016 19:44:21 +0900
|
|
||||||
Subject: [PATCH] added a note on strlike and strglob
|
|
||||||
MIME-Version: 1.0
|
|
||||||
Content-Type: text/plain; charset=UTF-8
|
|
||||||
Content-Transfer-Encoding: 8bit
|
|
||||||
|
|
||||||
Signed-off-by: Petr Písař <ppisar@redhat.com>
|
|
||||||
---
|
|
||||||
lib/DBD/SQLite.pm | 42 ++++++++++++++++++++++++++----------------
|
|
||||||
1 file changed, 26 insertions(+), 16 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/lib/DBD/SQLite.pm b/lib/DBD/SQLite.pm
|
|
||||||
index 8debee7..7d683f2 100644
|
|
||||||
--- a/lib/DBD/SQLite.pm
|
|
||||||
+++ b/lib/DBD/SQLite.pm
|
|
||||||
@@ -2151,22 +2151,6 @@ See also L<DBI::Profile> for better profiling options.
|
|
||||||
|
|
||||||
is for internal use only.
|
|
||||||
|
|
||||||
-=head2 DBD::SQLite::compile_options()
|
|
||||||
-
|
|
||||||
-Returns an array of compile options (available since SQLite 3.6.23,
|
|
||||||
-bundled in DBD::SQLite 1.30_01), or an empty array if the bundled
|
|
||||||
-library is old or compiled with SQLITE_OMIT_COMPILEOPTION_DIAGS.
|
|
||||||
-
|
|
||||||
-=head2 DBD::SQLite::sqlite_status()
|
|
||||||
-
|
|
||||||
-Returns a hash reference that holds a set of status information of SQLite runtime such as memory usage or page cache usage (see L<http://www.sqlite.org/c3ref/c_status_malloc_count.html> for details). Each of the entry contains the current value and the highwater value.
|
|
||||||
-
|
|
||||||
- my $status = DBD::SQLite::sqlite_status();
|
|
||||||
- my $cur = $status->{memory_used}{current};
|
|
||||||
- my $high = $status->{memory_used}{highwater};
|
|
||||||
-
|
|
||||||
-You may also pass 0 as an argument to reset the status.
|
|
||||||
-
|
|
||||||
=head2 $dbh->sqlite_db_status()
|
|
||||||
|
|
||||||
Returns a hash reference that holds a set of status information of database connection such as cache usage. See L<http://www.sqlite.org/c3ref/c_dbstatus_options.html> for details. You may also pass 0 as an argument to reset the status.
|
|
||||||
@@ -2187,6 +2171,32 @@ registered before creating a new virtual table using the module and
|
|
||||||
before using a preexisting virtual table for the module.
|
|
||||||
Virtual tables are explained in L<DBD::SQLite::VirtualTable>.
|
|
||||||
|
|
||||||
+=head1 DRIVER FUNCTIONS
|
|
||||||
+
|
|
||||||
+=head2 DBD::SQLite::compile_options()
|
|
||||||
+
|
|
||||||
+Returns an array of compile options (available since SQLite 3.6.23,
|
|
||||||
+bundled in DBD::SQLite 1.30_01), or an empty array if the bundled
|
|
||||||
+library is old or compiled with SQLITE_OMIT_COMPILEOPTION_DIAGS.
|
|
||||||
+
|
|
||||||
+=head2 DBD::SQLite::sqlite_status()
|
|
||||||
+
|
|
||||||
+Returns a hash reference that holds a set of status information of SQLite runtime such as memory usage or page cache usage (see L<http://www.sqlite.org/c3ref/c_status_malloc_count.html> for details). Each of the entry contains the current value and the highwater value.
|
|
||||||
+
|
|
||||||
+ my $status = DBD::SQLite::sqlite_status();
|
|
||||||
+ my $cur = $status->{memory_used}{current};
|
|
||||||
+ my $high = $status->{memory_used}{highwater};
|
|
||||||
+
|
|
||||||
+You may also pass 0 as an argument to reset the status.
|
|
||||||
+
|
|
||||||
+=head2 DBD::SQLite::strlike($pattern, $string, $escape_char), DBD::SQLite::strglob($pattern, $string)
|
|
||||||
+
|
|
||||||
+As of 1.49_05 (SQLite 3.10.0), you can use these two functions to
|
|
||||||
+see if a string matches a pattern. These may be useful when you
|
|
||||||
+create a virtual table or a custom function.
|
|
||||||
+See L<http://sqlite.org/c3ref/strlike.html> and
|
|
||||||
+L<http://sqlite.org/c3ref/strglob.html> for details.
|
|
||||||
+
|
|
||||||
=head1 DRIVER CONSTANTS
|
|
||||||
|
|
||||||
A subset of SQLite C constants are made available to Perl,
|
|
||||||
--
|
|
||||||
2.5.0
|
|
||||||
|
|
@ -1,53 +0,0 @@
|
|||||||
From 0d52eae83d12ce49d377949dafda5d6a4d5c522c Mon Sep 17 00:00:00 2001
|
|
||||||
From: Kenichi Ishigaki <ishigaki@cpan.org>
|
|
||||||
Date: Mon, 11 Jan 2016 19:44:57 +0900
|
|
||||||
Subject: [PATCH] added a test for strlike
|
|
||||||
MIME-Version: 1.0
|
|
||||||
Content-Type: text/plain; charset=UTF-8
|
|
||||||
Content-Transfer-Encoding: 8bit
|
|
||||||
|
|
||||||
Signed-off-by: Petr Písař <ppisar@redhat.com>
|
|
||||||
---
|
|
||||||
t/61_strlike.t | 30 ++++++++++++++++++++++++++++++
|
|
||||||
1 file changed, 30 insertions(+)
|
|
||||||
create mode 100644 t/61_strlike.t
|
|
||||||
|
|
||||||
diff --git a/t/61_strlike.t b/t/61_strlike.t
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..22da44d
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/t/61_strlike.t
|
|
||||||
@@ -0,0 +1,30 @@
|
|
||||||
+#!/usr/bin/perl
|
|
||||||
+
|
|
||||||
+use strict;
|
|
||||||
+BEGIN {
|
|
||||||
+ $| = 1;
|
|
||||||
+ $^W = 1;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+use t::lib::Test qw/requires_sqlite/;
|
|
||||||
+use Test::More;
|
|
||||||
+use DBD::SQLite;
|
|
||||||
+
|
|
||||||
+BEGIN { requires_sqlite('3.10.0'); }
|
|
||||||
+
|
|
||||||
+use Test::NoWarnings;
|
|
||||||
+
|
|
||||||
+plan tests => 13;
|
|
||||||
+
|
|
||||||
+ok !DBD::SQLite::strlike("foo_bar", "FOO1BAR");
|
|
||||||
+ok !DBD::SQLite::strlike("foo_bar", "FOO_BAR");
|
|
||||||
+ok DBD::SQLite::strlike("foo\\_bar", "FOO1BAR", "\\");
|
|
||||||
+ok !DBD::SQLite::strlike("foo\\_bar", "FOO_BAR", "\\");
|
|
||||||
+ok DBD::SQLite::strlike("foo!_bar", "FOO1BAR", "!");
|
|
||||||
+ok !DBD::SQLite::strlike("foo!_bar", "FOO_BAR", "!");
|
|
||||||
+ok !DBD::SQLite::strlike("%foobar", "1FOOBAR");
|
|
||||||
+ok !DBD::SQLite::strlike("%foobar", "%FOOBAR");
|
|
||||||
+ok DBD::SQLite::strlike("\\%foobar", "1FOOBAR", "\\");
|
|
||||||
+ok !DBD::SQLite::strlike("\\%foobar", "%FOOBAR", "\\");
|
|
||||||
+ok DBD::SQLite::strlike("!%foobar", "1FOOBAR", "!");
|
|
||||||
+ok !DBD::SQLite::strlike("!%foobar", "%FOOBAR", "!");
|
|
||||||
--
|
|
||||||
2.5.0
|
|
||||||
|
|
@ -1,37 +0,0 @@
|
|||||||
From f5aaef2594ed7fc84c226b18d5d3e5b705b8cb58 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Kenichi Ishigaki <ishigaki@cpan.org>
|
|
||||||
Date: Mon, 11 Jan 2016 19:42:39 +0900
|
|
||||||
Subject: [PATCH] allowed strlike to take a letter as the third arg, instead of
|
|
||||||
a number
|
|
||||||
MIME-Version: 1.0
|
|
||||||
Content-Type: text/plain; charset=UTF-8
|
|
||||||
Content-Transfer-Encoding: 8bit
|
|
||||||
|
|
||||||
Signed-off-by: Petr Písař <ppisar@redhat.com>
|
|
||||||
---
|
|
||||||
SQLite.xs | 8 ++++++--
|
|
||||||
1 file changed, 6 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/SQLite.xs b/SQLite.xs
|
|
||||||
index bc6644b..5b51aef 100644
|
|
||||||
--- a/SQLite.xs
|
|
||||||
+++ b/SQLite.xs
|
|
||||||
@@ -373,9 +373,13 @@ strglob(const char *zglob, const char *zstr)
|
|
||||||
RETVAL
|
|
||||||
|
|
||||||
int
|
|
||||||
-strlike(const char *zglob, const char *zstr, unsigned int esc = 0)
|
|
||||||
+strlike(const char *zglob, const char *zstr, const char *esc = NULL)
|
|
||||||
CODE:
|
|
||||||
- RETVAL = sqlite3_strlike(zglob, zstr, esc);
|
|
||||||
+ if (esc) {
|
|
||||||
+ RETVAL = sqlite3_strlike(zglob, zstr, (unsigned int)(*esc));
|
|
||||||
+ } else {
|
|
||||||
+ RETVAL = sqlite3_strlike(zglob, zstr, 0);
|
|
||||||
+ }
|
|
||||||
OUTPUT:
|
|
||||||
RETVAL
|
|
||||||
|
|
||||||
--
|
|
||||||
2.5.0
|
|
||||||
|
|
Loading…
Reference in new issue