1a5c1416dSdrh# 2013-12-17 2a5c1416dSdrh# 3a5c1416dSdrh# The author disclaims copyright to this source code. In place of 4a5c1416dSdrh# a legal notice, here is a blessing: 5a5c1416dSdrh# 6a5c1416dSdrh# May you do good and not evil. 7a5c1416dSdrh# May you find forgiveness for yourself and forgive others. 8a5c1416dSdrh# May you share freely, never taking more than you give. 9a5c1416dSdrh# 10a5c1416dSdrh#*********************************************************************** 11a5c1416dSdrh# This file implements regression tests for SQLite library. The 12a5c1416dSdrh# focus of this file is testing the printf() SQL function. 13a5c1416dSdrh# 143a8aec5eSdrh# 15*a1c8151bSdrh# EVIDENCE-OF: R-32560-14372 The format(FORMAT,...) SQL function works 163a8aec5eSdrh# like the sqlite3_mprintf() C-language function and the printf() 173a8aec5eSdrh# function from the standard C library. 183a8aec5eSdrh# 19*a1c8151bSdrh# EVIDENCE-OF: R-64900-53159 The printf() SQL function is an alias for 20*a1c8151bSdrh# the format() SQL function. 21*a1c8151bSdrh# 22a5c1416dSdrh 23a5c1416dSdrhset testdir [file dirname $argv0] 24a5c1416dSdrhsource $testdir/tester.tcl 25a5c1416dSdrh 263a8aec5eSdrh# EVIDENCE-OF: R-40086-60101 If the FORMAT argument is missing or NULL 273a8aec5eSdrh# then the result is NULL. 283a8aec5eSdrh# 29a5c1416dSdrhdo_execsql_test printf2-1.1 { 30*a1c8151bSdrh SELECT quote(format()), quote(format(NULL,1,2,3)); 313a8aec5eSdrh} {NULL NULL} 323a8aec5eSdrh 333a8aec5eSdrh 34a5c1416dSdrhdo_execsql_test printf2-1.2 { 35a5c1416dSdrh SELECT printf('hello'); 36a5c1416dSdrh} {hello} 37a5c1416dSdrhdo_execsql_test printf2-1.3 { 38*a1c8151bSdrh SELECT format('%d,%d,%d',55,-11,3421); 39a5c1416dSdrh} {55,-11,3421} 40a5c1416dSdrhdo_execsql_test printf2-1.4 { 41a5c1416dSdrh SELECT printf('%d,%d,%d',55,'-11',3421); 42a5c1416dSdrh} {55,-11,3421} 43a5c1416dSdrhdo_execsql_test printf2-1.5 { 44*a1c8151bSdrh SELECT format('%d,%d,%d,%d',55,'-11',3421); 45a5c1416dSdrh} {55,-11,3421,0} 46a5c1416dSdrhdo_execsql_test printf2-1.6 { 47a5c1416dSdrh SELECT printf('%.2f',3.141592653); 48a5c1416dSdrh} {3.14} 49a5c1416dSdrhdo_execsql_test printf2-1.7 { 50*a1c8151bSdrh SELECT format('%.*f',2,3.141592653); 51a5c1416dSdrh} {3.14} 52a5c1416dSdrhdo_execsql_test printf2-1.8 { 53a5c1416dSdrh SELECT printf('%*.*f',5,2,3.141592653); 54a5c1416dSdrh} {{ 3.14}} 55a5c1416dSdrhdo_execsql_test printf2-1.9 { 56*a1c8151bSdrh SELECT format('%d',314159.2653); 57a5c1416dSdrh} {314159} 58a5c1416dSdrhdo_execsql_test printf2-1.10 { 59a5c1416dSdrh SELECT printf('%lld',314159.2653); 60a5c1416dSdrh} {314159} 61a5c1416dSdrhdo_execsql_test printf2-1.11 { 62*a1c8151bSdrh SELECT format('%lld%n',314159.2653,'hi'); 63a5c1416dSdrh} {314159} 643457338cSdrhdo_execsql_test printf2-1.12 { 653457338cSdrh SELECT printf('%n',0); 663457338cSdrh} {{}} 673a8aec5eSdrh 68a820c05aSdrh# EVIDENCE-OF: R-17002-27534 The %z format is interchangeable with %s. 693a8aec5eSdrh# 70a5c1416dSdrhdo_execsql_test printf2-1.12 { 71*a1c8151bSdrh SELECT format('%.*z',5,'abcdefghijklmnop'); 72a5c1416dSdrh} {abcde} 73fc6ee9dfSdrhdo_execsql_test printf2-1.13 { 74fc6ee9dfSdrh SELECT printf('%c','abcdefghijklmnop'); 75fc6ee9dfSdrh} {a} 76a5c1416dSdrh 773a8aec5eSdrh# EVIDENCE-OF: R-02347-27622 The %n format is silently ignored and does 783a8aec5eSdrh# not consume an argument. 793a8aec5eSdrh# 803a8aec5eSdrhdo_execsql_test printf2-2.1 { 813a8aec5eSdrh CREATE TABLE t1(a,b,c); 823a8aec5eSdrh INSERT INTO t1 VALUES(1,2,3); 833a8aec5eSdrh INSERT INTO t1 VALUES(-1,-2,-3); 843a8aec5eSdrh INSERT INTO t1 VALUES('abc','def','ghi'); 853a8aec5eSdrh INSERT INTO t1 VALUES(1.5,2.25,3.125); 863a8aec5eSdrh SELECT printf('(%s)-%n-(%s)',a,b,c) FROM t1 ORDER BY rowid; 873a8aec5eSdrh} {(1)--(2) (-1)--(-2) (abc)--(def) (1.5)--(2.25)} 883a8aec5eSdrh 893a8aec5eSdrh# EVIDENCE-OF: R-56064-04001 The %p format is an alias for %X. 903a8aec5eSdrh# 913a8aec5eSdrhdo_execsql_test printf2-2.2 { 923a8aec5eSdrh SELECT printf('%s=(%p)',a,a) FROM t1 ORDER BY a; 933a8aec5eSdrh} {-1=(FFFFFFFFFFFFFFFF) 1=(1) 1.5=(1) abc=(0)} 943a8aec5eSdrh 953a8aec5eSdrh# EVIDENCE-OF: R-29410-53018 If there are too few arguments in the 963a8aec5eSdrh# argument list, missing arguments are assumed to have a NULL value, 973a8aec5eSdrh# which is translated into 0 or 0.0 for numeric formats or an empty 983a8aec5eSdrh# string for %s. 993a8aec5eSdrh# 1003a8aec5eSdrhdo_execsql_test printf2-2.3 { 1013a8aec5eSdrh SELECT printf('%s=(%d/%g/%s)',a) FROM t1 ORDER BY a; 1023a8aec5eSdrh} {-1=(0/0/) 1=(0/0/) 1.5=(0/0/) abc=(0/0/)} 1033a8aec5eSdrh 104af8f513fSdrh# The precision of the %c conversion causes the character to repeat. 105af8f513fSdrh# 106af8f513fSdrhdo_execsql_test printf2-3.1 { 107af8f513fSdrh SELECT printf('|%110.100c|','*'); 108af8f513fSdrh} {{| ****************************************************************************************************|}} 109af8f513fSdrhdo_execsql_test printf2-3.2 { 110af8f513fSdrh SELECT printf('|%-110.100c|','*'); 111af8f513fSdrh} {{|**************************************************************************************************** |}} 112af8f513fSdrhdo_execsql_test printf2-3.3 { 113af8f513fSdrh SELECT printf('|%9.8c|%-9.8c|','*','*'); 114af8f513fSdrh} {{| ********|******** |}} 115af8f513fSdrhdo_execsql_test printf2-3.4 { 116af8f513fSdrh SELECT printf('|%8.8c|%-8.8c|','*','*'); 117af8f513fSdrh} {|********|********|} 118af8f513fSdrhdo_execsql_test printf2-3.5 { 119af8f513fSdrh SELECT printf('|%7.8c|%-7.8c|','*','*'); 120af8f513fSdrh} {|********|********|} 121af8f513fSdrh 1222c338a9dSdrh# The "," separator 1232c338a9dSdrhdo_execsql_test printf2-4.1 { 1242c338a9dSdrh SELECT printf('|%,d|%,d|',0,-1); 1252c338a9dSdrh} {|0|-1|} 1262c338a9dSdrhdo_execsql_test printf2-4.2 { 1272c338a9dSdrh SELECT printf('|%,d|%,d|',12,-12); 1282c338a9dSdrh} {|12|-12|} 1292c338a9dSdrhdo_execsql_test printf2-4.3 { 1302c338a9dSdrh SELECT printf('|%,d|%,d|',123,-123); 1312c338a9dSdrh} {|123|-123|} 1322c338a9dSdrhdo_execsql_test printf2-4.4 { 1332c338a9dSdrh SELECT printf('|%,d|%,d|',1234,-1234); 1342c338a9dSdrh} {|1,234|-1,234|} 1352c338a9dSdrhdo_execsql_test printf2-4.5 { 1362c338a9dSdrh SELECT printf('|%,d|%,d|',12345,-12345); 1372c338a9dSdrh} {|12,345|-12,345|} 1382c338a9dSdrhdo_execsql_test printf2-4.6 { 1392c338a9dSdrh SELECT printf('|%,d|%,d|',123456,-123456); 1402c338a9dSdrh} {|123,456|-123,456|} 1412c338a9dSdrhdo_execsql_test printf2-4.7 { 1422c338a9dSdrh SELECT printf('|%,d|%,d|',1234567,-1234567); 1432c338a9dSdrh} {|1,234,567|-1,234,567|} 1442c338a9dSdrhdo_execsql_test printf2-4.8 { 1452c338a9dSdrh SELECT printf('|%,d|%,d|',12345678,-12345678); 1462c338a9dSdrh} {|12,345,678|-12,345,678|} 1472c338a9dSdrhdo_execsql_test printf2-4.9 { 1482c338a9dSdrh SELECT printf('|%,d|%,d|',123456789,-123456789); 1492c338a9dSdrh} {|123,456,789|-123,456,789|} 1502c338a9dSdrhdo_execsql_test printf2-4.10 { 1512c338a9dSdrh SELECT printf('|%,d|%,d|',1234567890,-1234567890); 1522c338a9dSdrh} {|1,234,567,890|-1,234,567,890|} 153af8f513fSdrh 154cf7c8370Sdrh# 2018-02-19. Unicode characters with %c 155cf7c8370Sdrhdo_execsql_test printf2-5.100 { 156cf7c8370Sdrh SELECT printf('(%8c)',char(11106)); 157cf7c8370Sdrh} {{( ⭢)}} 158cf7c8370Sdrhdo_execsql_test printf2-5.101 { 159cf7c8370Sdrh SELECT printf('(%-8c)',char(11106)); 160cf7c8370Sdrh} {{(⭢ )}} 161cf7c8370Sdrhdo_execsql_test printf2-5.102 { 162cf7c8370Sdrh SELECT printf('(%5.3c)',char(1492)); 163cf7c8370Sdrh} {{( ההה)}} 164cf7c8370Sdrhdo_execsql_test printf2-5.103 { 165cf7c8370Sdrh SELECT printf('(%-5.3c)',char(1492)); 166cf7c8370Sdrh} {{(ההה )}} 167cf7c8370Sdrhdo_execsql_test printf2-5.104 { 168cf7c8370Sdrh SELECT printf('(%3.3c)',char(1492)); 169cf7c8370Sdrh} {{(ההה)}} 170cf7c8370Sdrhdo_execsql_test printf2-5.105 { 171cf7c8370Sdrh SELECT printf('(%-3.3c)',char(1492)); 172cf7c8370Sdrh} {{(ההה)}} 173cf7c8370Sdrhdo_execsql_test printf2-5.104 { 174cf7c8370Sdrh SELECT printf('(%2c)',char(1513)); 175cf7c8370Sdrh} {{( ש)}} 176cf7c8370Sdrhdo_execsql_test printf2-5.106 { 177cf7c8370Sdrh SELECT printf('(%-2c)',char(1513)); 178cf7c8370Sdrh} {{(ש )}} 179af8f513fSdrh 18057f29b7bSdrh# 2018-02-19. Unicode characters with the "!" flag in %s and friends. 18157f29b7bSdrhdo_execsql_test printf2-6.100 { 18257f29b7bSdrh SELECT printf('(%!.3s)','הנה מה־טוב ומה־נעים שבת אחים גם־יחד'); 18357f29b7bSdrh} {(הנה)} 18457f29b7bSdrhdo_execsql_test printf2-6.101 { 18557f29b7bSdrh SELECT printf('(%.6s)','הנה מה־טוב ומה־נעים שבת אחים גם־יחד'); 18657f29b7bSdrh} {(הנה)} 18757f29b7bSdrhdo_execsql_test printf2-6.102 { 18857f29b7bSdrh SELECT printf('(%!5.3s)','הנה מה־טוב ומה־נעים שבת אחים גם־יחד'); 18957f29b7bSdrh} {{( הנה)}} 19057f29b7bSdrhdo_execsql_test printf2-6.103 { 19157f29b7bSdrh SELECT printf('(%8.6s)','הנה מה־טוב ומה־נעים שבת אחים גם־יחד'); 19257f29b7bSdrh} {{( הנה)}} 19357f29b7bSdrhdo_execsql_test printf2-6.104 { 19457f29b7bSdrh SELECT printf('(%!-5.3s)','הנה מה־טוב ומה־נעים שבת אחים גם־יחד'); 19557f29b7bSdrh} {{(הנה )}} 19657f29b7bSdrhdo_execsql_test printf2-6.105 { 19757f29b7bSdrh SELECT printf('(%-8.6s)','הנה מה־טוב ומה־נעים שבת אחים גם־יחד'); 19857f29b7bSdrh} {{(הנה )}} 19957f29b7bSdrhdo_execsql_test printf2-6.106 { 20057f29b7bSdrh SELECT printf('(%!.3Q)','הנה מה־טוב ומה־נעים שבת אחים גם־יחד'); 20157f29b7bSdrh} {('הנה')} 20257f29b7bSdrhdo_execsql_test printf2-6.107 { 20357f29b7bSdrh SELECT printf('(%.6Q)','הנה מה־טוב ומה־נעים שבת אחים גם־יחד'); 20457f29b7bSdrh} {('הנה')} 20557f29b7bSdrhdo_execsql_test printf2-6.108 { 20657f29b7bSdrh SELECT printf('(%!7.3Q)','הנה מה־טוב ומה־נעים שבת אחים גם־יחד'); 20757f29b7bSdrh} {{( 'הנה')}} 20857f29b7bSdrhdo_execsql_test printf2-6.109 { 20957f29b7bSdrh SELECT printf('(%10.6Q)','הנה מה־טוב ומה־נעים שבת אחים גם־יחד'); 21057f29b7bSdrh} {{( 'הנה')}} 21157f29b7bSdrh 212a5c1416dSdrh 213a5c1416dSdrhfinish_test 214