xref: /sqlite-3.40.0/test/func3.test (revision 8eed5847)
1d2199f0fSdan# 2010 August 27
2d2199f0fSdan#
3d2199f0fSdan# The author disclaims copyright to this source code.  In place of
4d2199f0fSdan# a legal notice, here is a blessing:
5d2199f0fSdan#
6d2199f0fSdan#    May you do good and not evil.
7d2199f0fSdan#    May you find forgiveness for yourself and forgive others.
8d2199f0fSdan#    May you share freely, never taking more than you give.
9d2199f0fSdan#
10d2199f0fSdan#***********************************************************************
11d2199f0fSdan# This file implements regression tests for SQLite library. The
12d2199f0fSdan# focus of this file is testing that destructor functions associated
13d2199f0fSdan# with functions created using sqlite3_create_function_v2() is
14d2199f0fSdan# correctly invoked.
15d2199f0fSdan#
16d2199f0fSdanset testdir [file dirname $argv0]
17d2199f0fSdansource $testdir/tester.tcl
18d2199f0fSdan
19d2199f0fSdan
20da6e42abSdanifcapable utf16 {
21d2199f0fSdan  do_test func3-1.1 {
22d2199f0fSdan    set destroyed 0
23d2199f0fSdan    proc destroy {} { set ::destroyed 1 }
24d2199f0fSdan    sqlite3_create_function_v2 db f2 -1 any -func f2 -destroy destroy
25d2199f0fSdan    set destroyed
26d2199f0fSdan  } 0
27d2199f0fSdan  do_test func3-1.2 {
28d2199f0fSdan    sqlite3_create_function_v2 db f2 -1 utf8 -func f2
29d2199f0fSdan    set destroyed
30d2199f0fSdan  } 0
31d2199f0fSdan  do_test func3-1.3 {
32d2199f0fSdan    sqlite3_create_function_v2 db f2 -1 utf16le -func f2
33d2199f0fSdan    set destroyed
34d2199f0fSdan  } 0
35d2199f0fSdan  do_test func3-1.4 {
36d2199f0fSdan    sqlite3_create_function_v2 db f2 -1 utf16be -func f2
37d2199f0fSdan    set destroyed
38d2199f0fSdan  } 1
39da6e42abSdan}
40d2199f0fSdan
41d2199f0fSdando_test func3-2.1 {
42d2199f0fSdan  set destroyed 0
43d2199f0fSdan  proc destroy {} { set ::destroyed 1 }
44d2199f0fSdan  sqlite3_create_function_v2 db f3 -1 utf8 -func f3 -destroy destroy
45d2199f0fSdan  set destroyed
46d2199f0fSdan} 0
47d2199f0fSdando_test func3-2.2 {
48d2199f0fSdan  sqlite3_create_function_v2 db f3 -1 utf8 -func f3
49d2199f0fSdan  set destroyed
50d2199f0fSdan} 1
51d2199f0fSdan
52d2199f0fSdando_test func3-3.1 {
53d2199f0fSdan  set destroyed 0
54d2199f0fSdan  proc destroy {} { set ::destroyed 1 }
55d2199f0fSdan  sqlite3_create_function_v2 db f3 -1 any -func f3 -destroy destroy
56d2199f0fSdan  set destroyed
57d2199f0fSdan} 0
58d2199f0fSdando_test func3-3.2 {
59d2199f0fSdan  db close
60d2199f0fSdan  set destroyed
61d2199f0fSdan} 1
62d2199f0fSdan
63d2199f0fSdansqlite3 db test.db
64d2199f0fSdando_test func3-4.1 {
65d2199f0fSdan  set destroyed 0
66d2199f0fSdan  set rc [catch {
67d2199f0fSdan    sqlite3_create_function_v2 db f3 -1 any -func f3 -step f3 -destroy destroy
68d2199f0fSdan  } msg]
69d2199f0fSdan  list $rc $msg
70d2199f0fSdan} {1 SQLITE_MISUSE}
71635a6061Sdando_test func3-4.2 { set destroyed } 1
72d2199f0fSdan
733432daa8Sdrh# EVIDENCE-OF: R-41921-05214 The likelihood(X,Y) function returns
743432daa8Sdrh# argument X unchanged.
753432daa8Sdrh#
763432daa8Sdrhdo_execsql_test func3-5.1 {
773432daa8Sdrh  SELECT likelihood(9223372036854775807, 0.5);
783432daa8Sdrh} {9223372036854775807}
793432daa8Sdrhdo_execsql_test func3-5.2 {
803432daa8Sdrh  SELECT likelihood(-9223372036854775808, 0.5);
813432daa8Sdrh} {-9223372036854775808}
823432daa8Sdrhdo_execsql_test func3-5.3 {
833432daa8Sdrh  SELECT likelihood(14.125, 0.5);
843432daa8Sdrh} {14.125}
853432daa8Sdrhdo_execsql_test func3-5.4 {
863432daa8Sdrh  SELECT likelihood(NULL, 0.5);
873432daa8Sdrh} {{}}
883432daa8Sdrhdo_execsql_test func3-5.5 {
893432daa8Sdrh  SELECT likelihood('test-string', 0.5);
903432daa8Sdrh} {test-string}
913432daa8Sdrhdo_execsql_test func3-5.6 {
923432daa8Sdrh  SELECT quote(likelihood(x'010203000405', 0.5));
933432daa8Sdrh} {X'010203000405'}
943432daa8Sdrh
953432daa8Sdrh# EVIDENCE-OF: R-44133-61651 The value Y in likelihood(X,Y) must be a
963432daa8Sdrh# floating point constant between 0.0 and 1.0, inclusive.
973432daa8Sdrh#
983432daa8Sdrhdo_execsql_test func3-5.7 {
993432daa8Sdrh  SELECT likelihood(123, 1.0), likelihood(456, 0.0);
1003432daa8Sdrh} {123 456}
1013432daa8Sdrhdo_test func3-5.8 {
1023432daa8Sdrh  catchsql {
1033432daa8Sdrh    SELECT likelihood(123, 1.000001);
1043432daa8Sdrh  }
1053432daa8Sdrh} {1 {second argument to likelihood() must be a constant between 0.0 and 1.0}}
1063432daa8Sdrhdo_test func3-5.9 {
1073432daa8Sdrh  catchsql {
1083432daa8Sdrh    SELECT likelihood(123, -0.000001);
1093432daa8Sdrh  }
1103432daa8Sdrh} {1 {second argument to likelihood() must be a constant between 0.0 and 1.0}}
1113432daa8Sdrhdo_test func3-5.10 {
1123432daa8Sdrh  catchsql {
1133432daa8Sdrh    SELECT likelihood(123, 0.5+0.3);
1143432daa8Sdrh  }
1153432daa8Sdrh} {1 {second argument to likelihood() must be a constant between 0.0 and 1.0}}
1163432daa8Sdrh
1173432daa8Sdrh# EVIDENCE-OF: R-28535-44631 The likelihood(X) function is a no-op that
1183432daa8Sdrh# the code generator optimizes away so that it consumes no CPU cycles
1193432daa8Sdrh# during run-time (that is, during calls to sqlite3_step()).
1203432daa8Sdrh#
1213432daa8Sdrhdo_test func3-5.20 {
1223432daa8Sdrh  db eval {EXPLAIN SELECT likelihood(min(1.0+'2.0',4*11), 0.5)}
1233432daa8Sdrh} [db eval {EXPLAIN SELECT min(1.0+'2.0',4*11)}]
1243432daa8Sdrh
1253432daa8Sdrh
1263432daa8Sdrh# EVIDENCE-OF: R-11152-23456 The unlikely(X) function returns the
1273432daa8Sdrh# argument X unchanged.
1283432daa8Sdrh#
1293432daa8Sdrhdo_execsql_test func3-5.30 {
1303432daa8Sdrh  SELECT unlikely(9223372036854775807);
1313432daa8Sdrh} {9223372036854775807}
1323432daa8Sdrhdo_execsql_test func3-5.31 {
1333432daa8Sdrh  SELECT unlikely(-9223372036854775808);
1343432daa8Sdrh} {-9223372036854775808}
1353432daa8Sdrhdo_execsql_test func3-5.32 {
1363432daa8Sdrh  SELECT unlikely(14.125);
1373432daa8Sdrh} {14.125}
1383432daa8Sdrhdo_execsql_test func3-5.33 {
1393432daa8Sdrh  SELECT unlikely(NULL);
1403432daa8Sdrh} {{}}
1413432daa8Sdrhdo_execsql_test func3-5.34 {
1423432daa8Sdrh  SELECT unlikely('test-string');
1433432daa8Sdrh} {test-string}
1443432daa8Sdrhdo_execsql_test func3-5.35 {
1453432daa8Sdrh  SELECT quote(unlikely(x'010203000405'));
1463432daa8Sdrh} {X'010203000405'}
1473432daa8Sdrh
1483432daa8Sdrh# EVIDENCE-OF: R-22887-63324 The unlikely(X) function is a no-op that
1493432daa8Sdrh# the code generator optimizes away so that it consumes no CPU cycles at
1503432daa8Sdrh# run-time (that is, during calls to sqlite3_step()).
1513432daa8Sdrh#
15203202a97Sdrhdo_test func3-5.39 {
1533432daa8Sdrh  db eval {EXPLAIN SELECT unlikely(min(1.0+'2.0',4*11))}
1543432daa8Sdrh} [db eval {EXPLAIN SELECT min(1.0+'2.0',4*11)}]
1553432daa8Sdrh
156a7d6db6aSdrh# Unlikely() does not preserve the affinity of X.
157a7d6db6aSdrh# ticket https://www.sqlite.org/src/tktview/0c620df60b
158a7d6db6aSdrh#
159a7d6db6aSdrhdo_execsql_test func3-5.40 {
160a7d6db6aSdrh  SELECT likely(CAST(1 AS INT))=='1';
161a7d6db6aSdrh} 0
162a7d6db6aSdrhdo_execsql_test func3-5.41 {
163a7d6db6aSdrh  SELECT unlikely(CAST(1 AS INT))=='1';
164a7d6db6aSdrh} 0
165a7d6db6aSdrhdo_execsql_test func3-5.41 {
166a7d6db6aSdrh  SELECT likelihood(CAST(1 AS INT),0.5)=='1';
167a7d6db6aSdrh} 0
168a7d6db6aSdrh
169ddb17caeSdrh
170ddb17caeSdrh# EVIDENCE-OF: R-23735-03107 The likely(X) function returns the argument
171ddb17caeSdrh# X unchanged.
172ddb17caeSdrh#
173ddb17caeSdrhdo_execsql_test func3-5.50 {
17403202a97Sdrh  SELECT likely(9223372036854775807);
17503202a97Sdrh} {9223372036854775807}
176ddb17caeSdrhdo_execsql_test func3-5.51 {
17703202a97Sdrh  SELECT likely(-9223372036854775808);
17803202a97Sdrh} {-9223372036854775808}
179ddb17caeSdrhdo_execsql_test func3-5.52 {
18003202a97Sdrh  SELECT likely(14.125);
18103202a97Sdrh} {14.125}
182ddb17caeSdrhdo_execsql_test func3-5.53 {
18303202a97Sdrh  SELECT likely(NULL);
18403202a97Sdrh} {{}}
185ddb17caeSdrhdo_execsql_test func3-5.54 {
18603202a97Sdrh  SELECT likely('test-string');
18703202a97Sdrh} {test-string}
188ddb17caeSdrhdo_execsql_test func3-5.55 {
18903202a97Sdrh  SELECT quote(likely(x'010203000405'));
19003202a97Sdrh} {X'010203000405'}
191ddb17caeSdrh
192ddb17caeSdrh# EVIDENCE-OF: R-43464-09689 The likely(X) function is a no-op that the
193ddb17caeSdrh# code generator optimizes away so that it consumes no CPU cycles at
194ddb17caeSdrh# run-time (that is, during calls to sqlite3_step()).
195ddb17caeSdrh#
196ddb17caeSdrhdo_test func3-5.59 {
19703202a97Sdrh  db eval {EXPLAIN SELECT likely(min(1.0+'2.0',4*11))}
19803202a97Sdrh} [db eval {EXPLAIN SELECT min(1.0+'2.0',4*11)}]
19903202a97Sdrh
20003202a97Sdrh
201*8eed5847Sdan# Test the outcome of specifying NULL xStep and xFinal pointers (normally
202*8eed5847Sdan# used to delete any existing function) and a non-NULL xDestroy when there
203*8eed5847Sdan# is no existing function to destroy.
204*8eed5847Sdan#
205*8eed5847Sdando_test func3-6.0 {
206*8eed5847Sdan  sqlite3_create_function_v2 db nofunc 1 utf8
207*8eed5847Sdan} {}
208*8eed5847Sdan
20903202a97Sdrh
210ddb17caeSdrh
211d2199f0fSdanfinish_test
212