1a92f9586Sdan# 2021-09-29 2a92f9586Sdan# 3a92f9586Sdan# The author disclaims copyright to this source code. In place of 4a92f9586Sdan# a legal notice, here is a blessing: 5a92f9586Sdan# 6a92f9586Sdan# May you do good and not evil. 7a92f9586Sdan# May you find forgiveness for yourself and forgive others. 8a92f9586Sdan# May you share freely, never taking more than you give. 9a92f9586Sdan# 10a92f9586Sdan#*********************************************************************** 11a92f9586Sdan# Test cases for varying separator handling by group_concat(). 12a92f9586Sdan# 13a92f9586Sdan 14a92f9586Sdanset testdir [file dirname $argv0] 15a92f9586Sdansource $testdir/tester.tcl 16a9173489Sdrhset testprefix windowC 17a92f9586Sdan 18a92f9586Sdanifcapable !windowfunc { 19a92f9586Sdan finish_test 20a92f9586Sdan return 21a92f9586Sdan} 22a92f9586Sdan 23a92f9586Sdando_execsql_test 1.0 { 24a92f9586Sdan CREATE TABLE x1(i INTEGER PRIMARY KEY, x); 25a92f9586Sdan} 26a92f9586Sdan 27a92f9586Sdanforeach {tn bBlob seps} { 28a92f9586Sdan 1 0 {a b c def g} 29a92f9586Sdan 2 0 {abcdefg {} {} abcdefg} 30a92f9586Sdan 3 0 {a bc def ghij klmno pqrstu} 31a92f9586Sdan 4 1 {a bc def ghij klmno pqrstu} 32a92f9586Sdan 5 1 {, , , , , , , , , , , , ....... , ,} 33a92f9586Sdan} { 34a92f9586Sdan foreach type {text blob} { 35a92f9586Sdan do_test 1.$type.$tn.1 { 36a92f9586Sdan execsql { DELETE FROM x1 } 37a92f9586Sdan foreach s $seps { 38a92f9586Sdan if {$type=="text"} { 39a92f9586Sdan execsql {INSERT INTO x1 VALUES(NULL, $s)} 40a92f9586Sdan } else { 41a92f9586Sdan execsql {INSERT INTO x1 VALUES(NULL, CAST ($s AS blob))} 42a92f9586Sdan } 43a92f9586Sdan } 44a92f9586Sdan } {} 45a92f9586Sdan 46a92f9586Sdan foreach {tn2 win} { 47a92f9586Sdan 1 "ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING" 48a92f9586Sdan 2 "ROWS BETWEEN 2 PRECEDING AND CURRENT ROW" 49a92f9586Sdan 3 "ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING" 50a92f9586Sdan } { 51a92f9586Sdan do_test 1.$type.$tn.2.$tn2 { 52a92f9586Sdan db eval " 53a92f9586Sdan SELECT group_concat('val', x) OVER ( ORDER BY i $win ) AS val FROM x1 54a92f9586Sdan " { 55a92f9586Sdan if {[string range $val 0 2]!="val" 56a92f9586Sdan || [string range $val end-2 end]!="val" 57a92f9586Sdan } { 58a92f9586Sdan error "unexpected return value: $val" 59a92f9586Sdan } 60a92f9586Sdan } 61a92f9586Sdan } {} 62a92f9586Sdan } 63a92f9586Sdan } 64a92f9586Sdan} 65a92f9586Sdan 664fc80671Sdrh# 2021-10-12 dbsqlfuzz 6c31db077a14149a7b22a1069294bdb068be8a96 674fc80671Sdrh# 684fc80671Sdrhreset_db 694fc80671Sdrhdo_execsql_test 2.0 { 70*6e627c44Sdrh PRAGMA encoding=UTF16le; 714fc80671Sdrh WITH separator(x) AS (VALUES(',a,'),(',bc,')), 724fc80671Sdrh value(y) AS (VALUES(1),(x'5585d09013455178cd11ce4a')) 734fc80671Sdrh SELECT group_concat(y,x) OVER (ORDER BY x ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) 744fc80671Sdrh FROM separator, value; 754fc80671Sdrh} {{} 1 蕕郐䔓硑ᇍ䫎 1} 76*6e627c44Sdrhreset_db 77*6e627c44Sdrhdo_execsql_test 2.1 { 78*6e627c44Sdrh PRAGMA encoding=UTF16be; 79*6e627c44Sdrh WITH separator(x) AS (VALUES(',a,'),(',bc,')), 80*6e627c44Sdrh value(y) AS (VALUES(1),(x'5585d09013455178cd11ce4a')) 81*6e627c44Sdrh SELECT group_concat(y,x) OVER (ORDER BY x ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) 82*6e627c44Sdrh FROM separator, value; 83*6e627c44Sdrh} {{} 1 喅킐ፅ典촑칊 1} 844fc80671Sdrh 85a92f9586Sdanfinish_test 86