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