Snapshot of upstream SQLite 3.43.2
[sqlcipher.git] / test / func3.test
blob0221a0dfd6e97cf21d6f88c323dff3f7ef15f4f4
1 # 2010 August 27
3 # The author disclaims copyright to this source code.  In place of
4 # a legal notice, here is a blessing:
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.
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.
16 set testdir [file dirname $argv0]
17 source $testdir/tester.tcl
20 ifcapable 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
41 do_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
47 do_test func3-2.2 {
48   sqlite3_create_function_v2 db f3 -1 utf8 -func f3
49   set destroyed
50 } 1
52 do_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
58 do_test func3-3.2 {
59   db close
60   set destroyed
61 } 1
63 sqlite3 db test.db
64 do_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}
71 do_test func3-4.2 { set destroyed } 1
73 # EVIDENCE-OF: R-41921-05214 The likelihood(X,Y) function returns
74 # argument X unchanged.
76 do_execsql_test func3-5.1 {
77   SELECT likelihood(9223372036854775807, 0.5);
78 } {9223372036854775807}
79 do_execsql_test func3-5.2 {
80   SELECT likelihood(-9223372036854775808, 0.5);
81 } {-9223372036854775808}
82 do_execsql_test func3-5.3 {
83   SELECT likelihood(14.125, 0.5);
84 } {14.125}
85 do_execsql_test func3-5.4 {
86   SELECT likelihood(NULL, 0.5);
87 } {{}}
88 do_execsql_test func3-5.5 {
89   SELECT likelihood('test-string', 0.5);
90 } {test-string}
91 do_execsql_test func3-5.6 {
92   SELECT quote(likelihood(x'010203000405', 0.5));
93 } {X'010203000405'}
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.
98 do_execsql_test func3-5.7 {
99   SELECT likelihood(123, 1.0), likelihood(456, 0.0);
100 } {123 456}
101 do_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}}
106 do_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}}
111 do_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}}
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()).
121 do_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)}]
126 # EVIDENCE-OF: R-11152-23456 The unlikely(X) function returns the
127 # argument X unchanged.
129 do_execsql_test func3-5.30 {
130   SELECT unlikely(9223372036854775807);
131 } {9223372036854775807}
132 do_execsql_test func3-5.31 {
133   SELECT unlikely(-9223372036854775808);
134 } {-9223372036854775808}
135 do_execsql_test func3-5.32 {
136   SELECT unlikely(14.125);
137 } {14.125}
138 do_execsql_test func3-5.33 {
139   SELECT unlikely(NULL);
140 } {{}}
141 do_execsql_test func3-5.34 {
142   SELECT unlikely('test-string');
143 } {test-string}
144 do_execsql_test func3-5.35 {
145   SELECT quote(unlikely(x'010203000405'));
146 } {X'010203000405'}
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()).
152 do_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)}]
156 # Unlikely() does not preserve the affinity of X.
157 # ticket https://www.sqlite.org/src/tktview/0c620df60b
159 do_execsql_test func3-5.40 {
160   SELECT likely(CAST(1 AS INT))=='1';
161 } 0
162 do_execsql_test func3-5.41 {
163   SELECT unlikely(CAST(1 AS INT))=='1';
164 } 0
165 do_execsql_test func3-5.41 {
166   SELECT likelihood(CAST(1 AS INT),0.5)=='1';
167 } 0
170 # EVIDENCE-OF: R-23735-03107 The likely(X) function returns the argument
171 # X unchanged.
173 do_execsql_test func3-5.50 {
174   SELECT likely(9223372036854775807);
175 } {9223372036854775807}
176 do_execsql_test func3-5.51 {
177   SELECT likely(-9223372036854775808);
178 } {-9223372036854775808}
179 do_execsql_test func3-5.52 {
180   SELECT likely(14.125);
181 } {14.125}
182 do_execsql_test func3-5.53 {
183   SELECT likely(NULL);
184 } {{}}
185 do_execsql_test func3-5.54 {
186   SELECT likely('test-string');
187 } {test-string}
188 do_execsql_test func3-5.55 {
189   SELECT quote(likely(x'010203000405'));
190 } {X'010203000405'}
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()).
196 do_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)}]
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.
205 do_test func3-6.0 {
206   sqlite3_create_function_v2 db nofunc 1 utf8
207 } {}
211 finish_test