1# 2010 August 27 2# 3# The author disclaims copyright to this source code. In place of 4# a legal notice, here is a blessing: 5# 6# May you do good and not evil. 7# May you find forgiveness for yourself and forgive others. 8# May you share freely, never taking more than you give. 9# 10#*********************************************************************** 11# This file implements regression tests for SQLite library. The 12# focus of this file is testing that destructor functions associated 13# with functions created using sqlite3_create_function_v2() is 14# correctly invoked. 15# 16set testdir [file dirname $argv0] 17source $testdir/tester.tcl 18 19 20ifcapable utf16 { 21 do_test func3-1.1 { 22 set destroyed 0 23 proc destroy {} { set ::destroyed 1 } 24 sqlite3_create_function_v2 db f2 -1 any -func f2 -destroy destroy 25 set destroyed 26 } 0 27 do_test func3-1.2 { 28 sqlite3_create_function_v2 db f2 -1 utf8 -func f2 29 set destroyed 30 } 0 31 do_test func3-1.3 { 32 sqlite3_create_function_v2 db f2 -1 utf16le -func f2 33 set destroyed 34 } 0 35 do_test func3-1.4 { 36 sqlite3_create_function_v2 db f2 -1 utf16be -func f2 37 set destroyed 38 } 1 39} 40 41do_test func3-2.1 { 42 set destroyed 0 43 proc destroy {} { set ::destroyed 1 } 44 sqlite3_create_function_v2 db f3 -1 utf8 -func f3 -destroy destroy 45 set destroyed 46} 0 47do_test func3-2.2 { 48 sqlite3_create_function_v2 db f3 -1 utf8 -func f3 49 set destroyed 50} 1 51 52do_test func3-3.1 { 53 set destroyed 0 54 proc destroy {} { set ::destroyed 1 } 55 sqlite3_create_function_v2 db f3 -1 any -func f3 -destroy destroy 56 set destroyed 57} 0 58do_test func3-3.2 { 59 db close 60 set destroyed 61} 1 62 63sqlite3 db test.db 64do_test func3-4.1 { 65 set destroyed 0 66 set rc [catch { 67 sqlite3_create_function_v2 db f3 -1 any -func f3 -step f3 -destroy destroy 68 } msg] 69 list $rc $msg 70} {1 SQLITE_MISUSE} 71do_test func3-4.2 { set destroyed } 1 72 73# EVIDENCE-OF: R-41921-05214 The likelihood(X,Y) function returns 74# argument X unchanged. 75# 76do_execsql_test func3-5.1 { 77 SELECT likelihood(9223372036854775807, 0.5); 78} {9223372036854775807} 79do_execsql_test func3-5.2 { 80 SELECT likelihood(-9223372036854775808, 0.5); 81} {-9223372036854775808} 82do_execsql_test func3-5.3 { 83 SELECT likelihood(14.125, 0.5); 84} {14.125} 85do_execsql_test func3-5.4 { 86 SELECT likelihood(NULL, 0.5); 87} {{}} 88do_execsql_test func3-5.5 { 89 SELECT likelihood('test-string', 0.5); 90} {test-string} 91do_execsql_test func3-5.6 { 92 SELECT quote(likelihood(x'010203000405', 0.5)); 93} {X'010203000405'} 94 95# EVIDENCE-OF: R-44133-61651 The value Y in likelihood(X,Y) must be a 96# floating point constant between 0.0 and 1.0, inclusive. 97# 98do_execsql_test func3-5.7 { 99 SELECT likelihood(123, 1.0), likelihood(456, 0.0); 100} {123 456} 101do_test func3-5.8 { 102 catchsql { 103 SELECT likelihood(123, 1.000001); 104 } 105} {1 {second argument to likelihood() must be a constant between 0.0 and 1.0}} 106do_test func3-5.9 { 107 catchsql { 108 SELECT likelihood(123, -0.000001); 109 } 110} {1 {second argument to likelihood() must be a constant between 0.0 and 1.0}} 111do_test func3-5.10 { 112 catchsql { 113 SELECT likelihood(123, 0.5+0.3); 114 } 115} {1 {second argument to likelihood() must be a constant between 0.0 and 1.0}} 116 117# EVIDENCE-OF: R-28535-44631 The likelihood(X) function is a no-op that 118# the code generator optimizes away so that it consumes no CPU cycles 119# during run-time (that is, during calls to sqlite3_step()). 120# 121do_test func3-5.20 { 122 db eval {EXPLAIN SELECT likelihood(min(1.0+'2.0',4*11), 0.5)} 123} [db eval {EXPLAIN SELECT min(1.0+'2.0',4*11)}] 124 125 126# EVIDENCE-OF: R-11152-23456 The unlikely(X) function returns the 127# argument X unchanged. 128# 129do_execsql_test func3-5.30 { 130 SELECT unlikely(9223372036854775807); 131} {9223372036854775807} 132do_execsql_test func3-5.31 { 133 SELECT unlikely(-9223372036854775808); 134} {-9223372036854775808} 135do_execsql_test func3-5.32 { 136 SELECT unlikely(14.125); 137} {14.125} 138do_execsql_test func3-5.33 { 139 SELECT unlikely(NULL); 140} {{}} 141do_execsql_test func3-5.34 { 142 SELECT unlikely('test-string'); 143} {test-string} 144do_execsql_test func3-5.35 { 145 SELECT quote(unlikely(x'010203000405')); 146} {X'010203000405'} 147 148# EVIDENCE-OF: R-22887-63324 The unlikely(X) function is a no-op that 149# the code generator optimizes away so that it consumes no CPU cycles at 150# run-time (that is, during calls to sqlite3_step()). 151# 152do_test func3-5.39 { 153 db eval {EXPLAIN SELECT unlikely(min(1.0+'2.0',4*11))} 154} [db eval {EXPLAIN SELECT min(1.0+'2.0',4*11)}] 155 156# Unlikely() does not preserve the affinity of X. 157# ticket https://www.sqlite.org/src/tktview/0c620df60b 158# 159do_execsql_test func3-5.40 { 160 SELECT likely(CAST(1 AS INT))=='1'; 161} 0 162do_execsql_test func3-5.41 { 163 SELECT unlikely(CAST(1 AS INT))=='1'; 164} 0 165do_execsql_test func3-5.41 { 166 SELECT likelihood(CAST(1 AS INT),0.5)=='1'; 167} 0 168 169 170# EVIDENCE-OF: R-23735-03107 The likely(X) function returns the argument 171# X unchanged. 172# 173do_execsql_test func3-5.50 { 174 SELECT likely(9223372036854775807); 175} {9223372036854775807} 176do_execsql_test func3-5.51 { 177 SELECT likely(-9223372036854775808); 178} {-9223372036854775808} 179do_execsql_test func3-5.52 { 180 SELECT likely(14.125); 181} {14.125} 182do_execsql_test func3-5.53 { 183 SELECT likely(NULL); 184} {{}} 185do_execsql_test func3-5.54 { 186 SELECT likely('test-string'); 187} {test-string} 188do_execsql_test func3-5.55 { 189 SELECT quote(likely(x'010203000405')); 190} {X'010203000405'} 191 192# EVIDENCE-OF: R-43464-09689 The likely(X) function is a no-op that the 193# code generator optimizes away so that it consumes no CPU cycles at 194# run-time (that is, during calls to sqlite3_step()). 195# 196do_test func3-5.59 { 197 db eval {EXPLAIN SELECT likely(min(1.0+'2.0',4*11))} 198} [db eval {EXPLAIN SELECT min(1.0+'2.0',4*11)}] 199 200 201# Test the outcome of specifying NULL xStep and xFinal pointers (normally 202# used to delete any existing function) and a non-NULL xDestroy when there 203# is no existing function to destroy. 204# 205do_test func3-6.0 { 206 sqlite3_create_function_v2 db nofunc 1 utf8 207} {} 208 209 210 211finish_test 212