We can avoid converting UV to text when it fits in int64.
Test fails before patch only on machines with 32-bit IV/UV.
>From a8b7660ef9ea6c0f14b9c2ab50719b837e233822 Mon Sep 17 00:00:00 2001
From: "Yuriy M. Kaminskiy" <yum...@gmail.com>
Date: Sat, 24 Mar 2012 17:22:32 +0400
Subject: [PATCH 2/3] Convert unsigned -> int64 when possible

It is not necessary to convert UV to text when sizeof(UV) < sizeof(int64_t)
---
 dbdimp.c               |    4 ++++
 t/09_create_function.t |    5 ++++-
 2 files changed, 8 insertions(+), 1 deletions(-)

diff --git a/dbdimp.c b/dbdimp.c
index 26872be..ff69459 100644
--- a/dbdimp.c
+++ b/dbdimp.c
@@ -142,8 +142,12 @@ sqlite_set_result(pTHX_ sqlite3_context *context, SV *result, int is_error)
     if ( !SvOK(result) ) {
         sqlite3_result_null( context );
     } else if( SvIOK_UV(result) ) {
+        if ((UV)(sqlite3_int64)UV_MAX == UV_MAX)
+            sqlite3_result_int64( context, (sqlite3_int64)SvUV(result));
+        else {
         s = SvPV(result, len);
         sqlite3_result_text( context, s, len, SQLITE_TRANSIENT );
+        }
     }
     else if ( SvIOK(result) ) {
 #if defined(USE_64_BIT_INT)
diff --git a/t/09_create_function.t b/t/09_create_function.t
index 090fb73..a868b5b 100644
--- a/t/09_create_function.t
+++ b/t/09_create_function.t
@@ -11,7 +11,7 @@ use t::lib::Test qw/connect_ok @CALL_FUNCS/;
 use Test::More;
 use Test::NoWarnings;
 
-plan tests => 28 * @CALL_FUNCS + 1;
+plan tests => 29 * @CALL_FUNCS + 1;
 
 sub now {
     return time();
@@ -123,5 +123,8 @@ foreach my $call_func (@CALL_FUNCS) {
 	$result = $dbh->selectrow_arrayref( "SELECT noop(2147483648)" );
 	is_deeply( $result, [ 2147483648 ], "SELECT noop(2147483648)" );
 
+	$result = $dbh->selectrow_arrayref( "SELECT typeof(noop(2147483648))" );
+	is_deeply( $result, [ 'integer' ], "SELECT typeof(noop(2147483648))" );
+
 	$dbh->disconnect;
 }
-- 
1.7.6.3

>From 6e4cb79d28a38272f83ce878c41902143295490d Mon Sep 17 00:00:00 2001
From: "Yuriy M. Kaminskiy" <yum...@gmail.com>
Date: Sat, 24 Mar 2012 20:21:04 +0400
Subject: [PATCH 3/3] reindent

---
 dbdimp.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/dbdimp.c b/dbdimp.c
--- a/dbdimp.c
+++ b/dbdimp.c
@@ -145,8 +145,8 @@ sqlite_set_result(pTHX_ sqlite3_context *context, SV *result, int is_error)
         if ( (UV)(sqlite3_int64)UV_MAX == UV_MAX )
             sqlite3_result_int64( context, (sqlite3_int64)SvUV( result ) );
         else {
-        s = SvPV(result, len);
-        sqlite3_result_text( context, s, len, SQLITE_TRANSIENT );
+            s = SvPV(result, len);
+            sqlite3_result_text( context, s, len, SQLITE_TRANSIENT );
         }
     }
     else if ( SvIOK(result) ) {
-- 
1.7.6.3

_______________________________________________
DBD-SQLite mailing list
DBD-SQLite@lists.scsys.co.uk
http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbd-sqlite

Reply via email to