1c9a8668aSdan# 2018 May 19 2c9a8668aSdan# 3c9a8668aSdan# The author disclaims copyright to this source code. In place of 4c9a8668aSdan# a legal notice, here is a blessing: 5c9a8668aSdan# 6c9a8668aSdan# May you do good and not evil. 7c9a8668aSdan# May you find forgiveness for yourself and forgive others. 8c9a8668aSdan# May you share freely, never taking more than you give. 9c9a8668aSdan# 10c9a8668aSdan#*********************************************************************** 11c9a8668aSdan# 12c9a8668aSdan 13c9a8668aSdanpackage require sqlite3 14c9a8668aSdanpackage require Pgtcl 15c9a8668aSdan 16c9a8668aSdanset db [pg_connect -conninfo "dbname=postgres user=postgres password=postgres"] 17c9a8668aSdansqlite3 sqlite "" 18c9a8668aSdan 19c9a8668aSdanproc execsql {sql} { 20c9a8668aSdan 21*69887c99Sdan set sql [string map {{WITHOUT ROWID} {}} $sql] 22*69887c99Sdan 23c9a8668aSdan set lSql [list] 24c9a8668aSdan set frag "" 25c9a8668aSdan while {[string length $sql]>0} { 26c9a8668aSdan set i [string first ";" $sql] 27c9a8668aSdan if {$i>=0} { 28c9a8668aSdan append frag [string range $sql 0 $i] 29c9a8668aSdan set sql [string range $sql $i+1 end] 30c9a8668aSdan if {[sqlite complete $frag]} { 31c9a8668aSdan lappend lSql $frag 32c9a8668aSdan set frag "" 33c9a8668aSdan } 34c9a8668aSdan } else { 35c9a8668aSdan set frag $sql 36c9a8668aSdan set sql "" 37c9a8668aSdan } 38c9a8668aSdan } 39c9a8668aSdan if {$frag != ""} { 40c9a8668aSdan lappend lSql $frag 41c9a8668aSdan } 42c9a8668aSdan #puts $lSql 43c9a8668aSdan 44c9a8668aSdan set ret "" 451e7cb19bSdan set nChar 0 46c9a8668aSdan foreach stmt $lSql { 47c9a8668aSdan set res [pg_exec $::db $stmt] 48c9a8668aSdan set err [pg_result $res -error] 49c9a8668aSdan if {$err!=""} { error $err } 501e7cb19bSdan 51c9a8668aSdan for {set i 0} {$i < [pg_result $res -numTuples]} {incr i} { 521e7cb19bSdan set t [pg_result $res -getTuple $i] 531e7cb19bSdan set nNew [string length $t] 541e7cb19bSdan if {$nChar>0 && ($nChar+$nNew+3)>75} { 551e7cb19bSdan append ret "\n " 561e7cb19bSdan set nChar 0 57c9a8668aSdan } else { 581e7cb19bSdan if {$nChar>0} { 591e7cb19bSdan append ret " " 601e7cb19bSdan incr nChar 3 61c9a8668aSdan } 621e7cb19bSdan } 631e7cb19bSdan incr nChar $nNew 641e7cb19bSdan append ret $t 65c9a8668aSdan } 66c9a8668aSdan pg_result $res -clear 67c9a8668aSdan } 68c9a8668aSdan 69c9a8668aSdan set ret 70c9a8668aSdan} 71c9a8668aSdan 72c9a8668aSdanproc execsql_test {tn sql} { 73c9a8668aSdan set res [execsql $sql] 7403854d2eSdan set sql [string map {string_agg group_concat} $sql] 75ae8e45cbSdan # set sql [string map [list {NULLS FIRST} {}] $sql] 76ae8e45cbSdan # set sql [string map [list {NULLS LAST} {}] $sql] 77c9a8668aSdan puts $::fd "do_execsql_test $tn {" 78c9a8668aSdan puts $::fd " [string trim $sql]" 79c9a8668aSdan puts $::fd "} {$res}" 80c9a8668aSdan puts $::fd "" 81c9a8668aSdan} 82c9a8668aSdan 83680f6e8eSdanproc errorsql_test {tn sql} { 84680f6e8eSdan set rc [catch {execsql $sql} msg] 85680f6e8eSdan if {$rc==0} { 86680f6e8eSdan error "errorsql_test SQL did not cause an error!" 87680f6e8eSdan } 8872b9fdcfSdan set msg [lindex [split [string trim $msg] "\n"] 0] 8972b9fdcfSdan puts $::fd "# PG says $msg" 90680f6e8eSdan set sql [string map {string_agg group_concat} $sql] 91680f6e8eSdan puts $::fd "do_test $tn { catch { execsql {" 92680f6e8eSdan puts $::fd " [string trim $sql]" 93680f6e8eSdan puts $::fd "} } } 1" 94680f6e8eSdan puts $::fd "" 95680f6e8eSdan} 96680f6e8eSdan 97f1abe368Sdan# Same as [execsql_test], except coerce all results to floating point values 98f1abe368Sdan# with two decimal points. 99f1abe368Sdan# 100f1abe368Sdanproc execsql_float_test {tn sql} { 101fd908888Sdan set F "%.4f" 102fd908888Sdan set T 0.0001 103f1abe368Sdan set res [execsql $sql] 104f1abe368Sdan set res2 [list] 105303451a8Sdan foreach r $res { 106303451a8Sdan if {$r != ""} { set r [format $F $r] } 107303451a8Sdan lappend res2 $r 108303451a8Sdan } 109f1abe368Sdan 110fd908888Sdan set sql [string trim $sql] 111fd908888Sdanputs $::fd [subst -nocommands { 112fd908888Sdando_test $tn { 113fd908888Sdan set myres {} 114fd908888Sdan foreach r [db eval {$sql}] { 115fd908888Sdan lappend myres [format $F [set r]] 116fd908888Sdan } 117fd908888Sdan set res2 {$res2} 1186c75b396Sdan set i 0 119fd908888Sdan foreach r [set myres] r2 [set res2] { 120fd908888Sdan if {[set r]<([set r2]-$T) || [set r]>([set r2]+$T)} { 121fd908888Sdan error "list element [set i] does not match: got=[set r] expected=[set r2]" 122fd908888Sdan } 1236c75b396Sdan incr i 124fd908888Sdan } 125fd908888Sdan set {} {} 126fd908888Sdan} {} 127fd908888Sdan}] 128f1abe368Sdan} 129f1abe368Sdan 130c9a8668aSdanproc start_test {name date} { 131c9a8668aSdan set dir [file dirname $::argv0] 132c9a8668aSdan set output [file join $dir $name.test] 133c9a8668aSdan set ::fd [open $output w] 134c9a8668aSdanputs $::fd [string trimleft " 135c9a8668aSdan# $date 136c9a8668aSdan# 137c9a8668aSdan# The author disclaims copyright to this source code. In place of 138c9a8668aSdan# a legal notice, here is a blessing: 139c9a8668aSdan# 140c9a8668aSdan# May you do good and not evil. 141c9a8668aSdan# May you find forgiveness for yourself and forgive others. 142c9a8668aSdan# May you share freely, never taking more than you give. 143c9a8668aSdan# 144c9a8668aSdan#*********************************************************************** 145c9a8668aSdan# This file implements regression tests for SQLite library. 146c9a8668aSdan# 147c9a8668aSdan 148c9a8668aSdan#################################################### 149c9a8668aSdan# DO NOT EDIT! THIS FILE IS AUTOMATICALLY GENERATED! 150c9a8668aSdan#################################################### 151c9a8668aSdan"] 152c9a8668aSdan puts $::fd {set testdir [file dirname $argv0]} 153c9a8668aSdan puts $::fd {source $testdir/tester.tcl} 154c9a8668aSdan puts $::fd "set testprefix $name" 155c9a8668aSdan puts $::fd "" 156c9a8668aSdan} 157c9a8668aSdan 158c9a8668aSdanproc -- {args} { 159c9a8668aSdan puts $::fd "# $args" 160c9a8668aSdan} 161c9a8668aSdan 162c9a8668aSdanproc ========== {args} { 163c9a8668aSdan puts $::fd "#[string repeat = 74]" 164c9a8668aSdan puts $::fd "" 165c9a8668aSdan} 166c9a8668aSdan 167c9a8668aSdanproc finish_test {} { 168c9a8668aSdan puts $::fd finish_test 169c9a8668aSdan close $::fd 170c9a8668aSdan} 171c9a8668aSdan 17267a9b8edSdanproc ifcapable {arg} { 17367a9b8edSdan puts $::fd "ifcapable $arg { finish_test ; return }" 17467a9b8edSdan} 17567a9b8edSdan 176