1f6e904bdSdrh# 2020-12-07 2f6e904bdSdrh# 3f6e904bdSdrh# The author disclaims copyright to this source code. In place of 4f6e904bdSdrh# a legal notice, here is a blessing: 5f6e904bdSdrh# 6f6e904bdSdrh# May you do good and not evil. 7f6e904bdSdrh# May you find forgiveness for yourself and forgive others. 8f6e904bdSdrh# May you share freely, never taking more than you give. 9f6e904bdSdrh# 10f6e904bdSdrh#************************************************************************* 11f6e904bdSdrh# 12f6e904bdSdrh# Test cases for SQL functions based off the standard math library 13f6e904bdSdrh# 14f6e904bdSdrhset testdir [file dirname $argv0] 15f6e904bdSdrhsource $testdir/tester.tcl 16f6e904bdSdrhifcapable !mathlib { 17f6e904bdSdrh finish_test 18f6e904bdSdrh return 19f6e904bdSdrh} 20f6e904bdSdrh 21f6e904bdSdrhdo_execsql_test func7-100 { 22f6e904bdSdrh SELECT ceil(99.9), ceiling(-99.01), floor(17), floor(-17.99); 23f6e904bdSdrh} {100.0 -99.0 17 -18.0} 24f6e904bdSdrhdo_execsql_test func7-110 { 25f6e904bdSdrh SELECT quote(ceil(NULL)), ceil('-99.99'); 26f6e904bdSdrh} {NULL -99.0} 27f6e904bdSdrhdo_execsql_test func7-200 { 2863f8f98aSdrh SELECT round(ln(5),2), log(100.0), log(100), log(2,'256'); 29f6e904bdSdrh} {1.61 2.0 2.0 8.0} 30f6e904bdSdrhdo_execsql_test func7-210 { 3163f8f98aSdrh SELECT ln(-5), log(-5,100.0); 32f6e904bdSdrh} {{} {}} 33f6e904bdSdrh 3463f8f98aSdrh# Test cases derived from PostgreSQL documentation 3563f8f98aSdrh# 3663f8f98aSdrhdo_execsql_test func7-pg-100 { 3763f8f98aSdrh SELECT abs(-17.4) 3863f8f98aSdrh} {17.4} 3963f8f98aSdrhdo_execsql_test func7-pg-110 { 4063f8f98aSdrh SELECT ceil(42.2) 4163f8f98aSdrh} {43.0} 4263f8f98aSdrhdo_execsql_test func7-pg-120 { 4363f8f98aSdrh SELECT ceil(-42.2) 4463f8f98aSdrh} {-42.0} 4563f8f98aSdrhdo_execsql_test func7-pg-130 { 4663f8f98aSdrh SELECT round(exp(1.0),7) 4763f8f98aSdrh} {2.7182818} 4863f8f98aSdrhdo_execsql_test func7-pg-140 { 4963f8f98aSdrh SELECT floor(42.8) 5063f8f98aSdrh} {42.0} 5163f8f98aSdrhdo_execsql_test func7-pg-150 { 5263f8f98aSdrh SELECT floor(-42.8) 5363f8f98aSdrh} {-43.0} 5463f8f98aSdrhdo_execsql_test func7-pg-160 { 5563f8f98aSdrh SELECT round(ln(2.0),7) 5663f8f98aSdrh} {0.6931472} 5763f8f98aSdrhdo_execsql_test func7-pg-170 { 5863f8f98aSdrh SELECT log(100.0) 5963f8f98aSdrh} {2.0} 6063f8f98aSdrhdo_execsql_test func7-pg-180 { 6163f8f98aSdrh SELECT log10(1000.0) 6263f8f98aSdrh} {3.0} 63*724e298eSdrhdo_execsql_test func7-pg-181 { 64*724e298eSdrh SELECT format('%.30f', log10(100.0) ); 65*724e298eSdrh} {2.000000000000000000000000000000} 66*724e298eSdrhdo_execsql_test func7-pg-182 { 67*724e298eSdrh SELECT format('%.30f', ln(exp(2.0)) ); 68*724e298eSdrh} {2.000000000000000000000000000000} 6963f8f98aSdrhdo_execsql_test func7-pg-190 { 7063f8f98aSdrh SELECT log(2.0, 64.0) 7163f8f98aSdrh} {6.0} 7263f8f98aSdrhdo_execsql_test func7-pg-200 { 7363f8f98aSdrh SELECT mod(9,4); 7463f8f98aSdrh} {1.0} 7563f8f98aSdrhdo_execsql_test func7-pg-210 { 7663f8f98aSdrh SELECT round(pi(),7); 7763f8f98aSdrh} {3.1415927} 7863f8f98aSdrhdo_execsql_test func7-pg-220 { 7963f8f98aSdrh SELECT power(9,3); 8063f8f98aSdrh} {729.0} 8163f8f98aSdrhdo_execsql_test func7-pg-230 { 8263f8f98aSdrh SELECT round(radians(45.0),7); 8363f8f98aSdrh} {0.7853982} 8463f8f98aSdrhdo_execsql_test func7-pg-240 { 8563f8f98aSdrh SELECT round(42.4); 8663f8f98aSdrh} {42.0} 8763f8f98aSdrhdo_execsql_test func7-pg-250 { 8863f8f98aSdrh SELECT round(42.4382,2); 8963f8f98aSdrh} {42.44} 9063f8f98aSdrhdo_execsql_test func7-pg-260 { 9163f8f98aSdrh SELECT sign(-8.4); 9263f8f98aSdrh} {-1} 9363f8f98aSdrhdo_execsql_test func7-pg-270 { 9463f8f98aSdrh SELECT round( sqrt(2), 7); 9563f8f98aSdrh} {1.4142136} 9663f8f98aSdrhdo_execsql_test func7-pg-280 { 9763f8f98aSdrh SELECT trunc(42.8), trunc(-42.8); 9863f8f98aSdrh} {42.0 -42.0} 9963f8f98aSdrhdo_execsql_test func7-pg-300 { 10063f8f98aSdrh SELECT acos(1); 10163f8f98aSdrh} {0.0} 10263f8f98aSdrhdo_execsql_test func7-pg-301 { 10363f8f98aSdrh SELECT degrees(acos(0.5)); 10463f8f98aSdrh} {60.0} 10563f8f98aSdrhdo_execsql_test func7-pg-310 { 10663f8f98aSdrh SELECT round( asin(1), 7); 10763f8f98aSdrh} {1.5707963} 10863f8f98aSdrhdo_execsql_test func7-pg-311 { 10963f8f98aSdrh SELECT degrees( asin(0.5) ); 11063f8f98aSdrh} {30.0} 11163f8f98aSdrhdo_execsql_test func7-pg-320 { 11263f8f98aSdrh SELECT round( atan(1), 7); 11363f8f98aSdrh} {0.7853982} 11463f8f98aSdrhdo_execsql_test func7-pg-321 { 11563f8f98aSdrh SELECT degrees( atan(1) ); 11663f8f98aSdrh} {45.0} 11763f8f98aSdrhdo_execsql_test func7-pg-330 { 11863f8f98aSdrh SELECT round( atan2(1,0), 7); 11963f8f98aSdrh} {1.5707963} 12063f8f98aSdrhdo_execsql_test func7-pg-331 { 12163f8f98aSdrh SELECT degrees( atan2(1,0) ); 12263f8f98aSdrh} {90.0} 12363f8f98aSdrhdo_execsql_test func7-pg-400 { 12463f8f98aSdrh SELECT cos(0); 12563f8f98aSdrh} {1.0} 12663f8f98aSdrhdo_execsql_test func7-pg-401 { 12763f8f98aSdrh SELECT cos( radians(60.0) ); 12863f8f98aSdrh} {0.5} 12963f8f98aSdrhdo_execsql_test func7-pg-400 { 13063f8f98aSdrh SELECT cos(0); 13163f8f98aSdrh} {1.0} 13263f8f98aSdrhdo_execsql_test func7-pg-410 { 13363f8f98aSdrh SELECT round( sin(1), 7); 13463f8f98aSdrh} {0.841471} 13563f8f98aSdrhdo_execsql_test func7-pg-411 { 13663f8f98aSdrh SELECT sin( radians(30) ); 13763f8f98aSdrh} {0.5} 13863f8f98aSdrhdo_execsql_test func7-pg-420 { 13963f8f98aSdrh SELECT round( tan(1), 7); 14063f8f98aSdrh} {1.5574077} 14163f8f98aSdrhdo_execsql_test func7-pg-421 { 14263f8f98aSdrh SELECT tan( radians(45) ); 14363f8f98aSdrh} {1.0} 14463f8f98aSdrhdo_execsql_test func7-pg-500 { 14563f8f98aSdrh SELECT round( sinh(1), 7); 14663f8f98aSdrh} {1.1752012} 14763f8f98aSdrhdo_execsql_test func7-pg-510 { 14863f8f98aSdrh SELECT round( cosh(0), 7); 14963f8f98aSdrh} {1.0} 15063f8f98aSdrhdo_execsql_test func7-pg-520 { 15163f8f98aSdrh SELECT round( tanh(1), 7); 15263f8f98aSdrh} {0.7615942} 15363f8f98aSdrhdo_execsql_test func7-pg-530 { 15463f8f98aSdrh SELECT round( asinh(1), 7); 15563f8f98aSdrh} {0.8813736} 15663f8f98aSdrhdo_execsql_test func7-pg-540 { 15763f8f98aSdrh SELECT round( acosh(1), 7); 15863f8f98aSdrh} {0.0} 15963f8f98aSdrhdo_execsql_test func7-pg-550 { 16063f8f98aSdrh SELECT round( atanh(0.5), 7); 16163f8f98aSdrh} {0.5493061} 16263f8f98aSdrh 16363f8f98aSdrh# Test cases derived from MySQL documentation 16463f8f98aSdrh# 16563f8f98aSdrhdo_execsql_test func7-mysql-100 { 16663f8f98aSdrh SELECT acos(1); 16763f8f98aSdrh} {0.0} 16863f8f98aSdrhdo_execsql_test func7-mysql-110 { 16963f8f98aSdrh SELECT acos(1.0001); 17063f8f98aSdrh} {{}} 17163f8f98aSdrhdo_execsql_test func7-mysql-120 { 17263f8f98aSdrh SELECT round( acos(0.0), 7); 17363f8f98aSdrh} {1.5707963} 17463f8f98aSdrhdo_execsql_test func7-mysql-130 { 17563f8f98aSdrh SELECT round( asin(0.2), 7); 17663f8f98aSdrh} {0.2013579} 17763f8f98aSdrhdo_execsql_test func7-mysql-140 { 17863f8f98aSdrh SELECT asin('foo'); 17963f8f98aSdrh} {{}} ;# Note: MySQL returns 0 here, not NULL. 18063f8f98aSdrh # SQLite deliberately returns NULL. 18163f8f98aSdrh # SQLServer and Oracle throw an error. 18263f8f98aSdrhdo_execsql_test func7-mysql-150 { 18363f8f98aSdrh SELECT round( atan(2), 7), round( atan(-2), 7); 18463f8f98aSdrh} {1.1071487 -1.1071487} 18563f8f98aSdrhdo_execsql_test func7-mysql-160 { 18663f8f98aSdrh SELECT round( atan2(-2,2), 7), round( atan2(pi(),0), 7); 18763f8f98aSdrh} {-0.7853982 1.5707963} 18863f8f98aSdrhdo_execsql_test func7-mysql-170 { 18963f8f98aSdrh SELECT ceiling(1.23), ceiling(-1.23); 19063f8f98aSdrh} {2.0 -1.0} 19163f8f98aSdrhdo_execsql_test func7-mysql-180 { 19263f8f98aSdrh SELECT cos(pi()); 19363f8f98aSdrh} {-1.0} 19463f8f98aSdrhdo_execsql_test func7-mysql-190 { 19563f8f98aSdrh SELECT degrees(pi()), degrees(pi()/2); 19663f8f98aSdrh} {180.0 90.0} 19763f8f98aSdrhdo_execsql_test func7-mysql-190 { 19863f8f98aSdrh SELECT round( exp(2), 7), round( exp(-2), 7), exp(0); 19963f8f98aSdrh} {7.3890561 0.1353353 1.0} 20063f8f98aSdrhdo_execsql_test func7-mysql-200 { 20163f8f98aSdrh SELECT floor(1.23), floor(-1.23); 20263f8f98aSdrh} {1.0 -2.0} 20363f8f98aSdrhdo_execsql_test func7-mysql-210 { 20463f8f98aSdrh SELECT round(ln(2),7), quote(ln(-2)); 20563f8f98aSdrh} {0.6931472 NULL} 20663f8f98aSdrh#do_execsql_test func7-mysql-220 { 20763f8f98aSdrh# SELECT round(log(2),7), log(-2); 20863f8f98aSdrh#} {0.6931472 NULL} 20963f8f98aSdrh# log() means natural logarithm in MySQL 21063f8f98aSdrhdo_execsql_test func7-mysql-230 { 21102d6f9b2Sdrh SELECT log(2,65536), log(10,100), quote(log(1,100)), quote(log(0,100)); 21202d6f9b2Sdrh} {16.0 2.0 NULL NULL} 21363f8f98aSdrhdo_execsql_test func7-mysql-240 { 21402d6f9b2Sdrh SELECT log2(65536), quote(log2(-100)), quote(log2(0)); 21502d6f9b2Sdrh} {16.0 NULL NULL} 21663f8f98aSdrhdo_execsql_test func7-mysql-250 { 21763f8f98aSdrh SELECT round(log10(2),7), log10(100), quote(log10(-100)); 21863f8f98aSdrh} {0.30103 2.0 NULL} 21963f8f98aSdrhdo_execsql_test func7-mysql-260 { 22063f8f98aSdrh SELECT mod(234,10), 253%7, mod(29,9), 29%9; 22163f8f98aSdrh} {4.0 1 2.0 2} 22263f8f98aSdrhdo_execsql_test func7-mysql-270 { 22363f8f98aSdrh SELECT mod(34.5,3); 22463f8f98aSdrh} {1.5} 22563f8f98aSdrhdo_execsql_test func7-mysql-280 { 22663f8f98aSdrh SELECT pow(2,2), pow(2,-2); 22763f8f98aSdrh} {4.0 0.25} 22863f8f98aSdrhdo_execsql_test func7-mysql-281 { 22963f8f98aSdrh SELECT power(2,2), power(2,-2); 23063f8f98aSdrh} {4.0 0.25} 23163f8f98aSdrhdo_execsql_test func7-mysql-290 { 23263f8f98aSdrh SELECT round(radians(90),7); 23363f8f98aSdrh} {1.5707963} 23463f8f98aSdrhdo_execsql_test func7-mysql-300 { 23563f8f98aSdrh SELECT sign(-32), sign(0), sign(234); 23663f8f98aSdrh} {-1 0 1} 23763f8f98aSdrhdo_execsql_test func7-mysql-310 { 23863f8f98aSdrh SELECT sin(pi()) BETWEEN -1.0e-15 AND 1.0e-15; 23963f8f98aSdrh} {1} 24063f8f98aSdrhdo_execsql_test func7-mysql-320 { 24163f8f98aSdrh SELECT sqrt(4), round(sqrt(20),7), quote(sqrt(-16)); 24263f8f98aSdrh} {2.0 4.472136 NULL} 24363f8f98aSdrhdo_execsql_test func7-mysql-330 { 24463f8f98aSdrh SELECT tan(pi()) BETWEEN -1.0e-15 AND 1.0e-15; 24563f8f98aSdrh} {1} 24663f8f98aSdrhdo_execsql_test func7-mysql-331 { 24763f8f98aSdrh SELECT round(tan(pi()+1),7); 24863f8f98aSdrh} {1.5574077} 24963f8f98aSdrh 250f6e904bdSdrh 251f6e904bdSdrhfinish_test 252