blob: 3b1613b56c6d400fe317aa764d04908bb9ce953e [file] [log] [blame]
dand2199f02010-08-27 17:48:52 +00001# 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
danda6e42a2011-07-04 06:52:15 +000020ifcapable 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}
dand2199f02010-08-27 17:48:52 +000040
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}
dan635a6062010-08-28 19:09:29 +000071do_test func3-4.2 { set destroyed } 1
dand2199f02010-08-27 17:48:52 +000072
drh3432daa2013-10-11 16:35:49 +000073# 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#
drh03202a92014-06-17 16:11:28 +0000152do_test func3-5.39 {
drh3432daa2013-10-11 16:35:49 +0000153 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
drhddb17ca2014-08-11 15:54:11 +0000156
157# EVIDENCE-OF: R-23735-03107 The likely(X) function returns the argument
158# X unchanged.
159#
160do_execsql_test func3-5.50 {
drh03202a92014-06-17 16:11:28 +0000161 SELECT likely(9223372036854775807);
162} {9223372036854775807}
drhddb17ca2014-08-11 15:54:11 +0000163do_execsql_test func3-5.51 {
drh03202a92014-06-17 16:11:28 +0000164 SELECT likely(-9223372036854775808);
165} {-9223372036854775808}
drhddb17ca2014-08-11 15:54:11 +0000166do_execsql_test func3-5.52 {
drh03202a92014-06-17 16:11:28 +0000167 SELECT likely(14.125);
168} {14.125}
drhddb17ca2014-08-11 15:54:11 +0000169do_execsql_test func3-5.53 {
drh03202a92014-06-17 16:11:28 +0000170 SELECT likely(NULL);
171} {{}}
drhddb17ca2014-08-11 15:54:11 +0000172do_execsql_test func3-5.54 {
drh03202a92014-06-17 16:11:28 +0000173 SELECT likely('test-string');
174} {test-string}
drhddb17ca2014-08-11 15:54:11 +0000175do_execsql_test func3-5.55 {
drh03202a92014-06-17 16:11:28 +0000176 SELECT quote(likely(x'010203000405'));
177} {X'010203000405'}
drhddb17ca2014-08-11 15:54:11 +0000178
179# EVIDENCE-OF: R-43464-09689 The likely(X) function is a no-op that the
180# code generator optimizes away so that it consumes no CPU cycles at
181# run-time (that is, during calls to sqlite3_step()).
182#
183do_test func3-5.59 {
drh03202a92014-06-17 16:11:28 +0000184 db eval {EXPLAIN SELECT likely(min(1.0+'2.0',4*11))}
185} [db eval {EXPLAIN SELECT min(1.0+'2.0',4*11)}]
186
187
188
drhddb17ca2014-08-11 15:54:11 +0000189
dand2199f02010-08-27 17:48:52 +0000190finish_test