#!/usr/bin/env tclsh set testdir [file dirname $argv0] source $testdir/tester.tcl do_execsql_test concat-chars { select concat('l', 'i'); } {li} do_execsql_test concat-char-and-number { select concat('l', 1); } {l1} do_execsql_test concat-char-and-decimal { select concat('l', 1.5); } {l1.5} do_execsql_test concat-char-null-char { select concat('l', null, 'i'); } {li} do_execsql_test concat_ws-numbers { select concat_ws(',', 1, 2); } {1,2} do_execsql_test concat_ws-single-number { select concat_ws(',', 1); } {1} do_execsql_test concat_ws-null { select concat_ws(null, 1, 2); } {} do_execsql_test concat_ws-multiple { select concat_ws(',', 1, 2), concat_ws(',', 3, 4) } {1,2|3,4} do_execsql_test char { select char(108, 105) } {li} do_execsql_test char-empty { select char() } {} do_execsql_test char-null { select char(null) } {} do_execsql_test char-non-integer { select char('a') } {} do_execsql_test abs { select abs(1); } {1} do_execsql_test abs-negative { select abs(-1); } {1} do_execsql_test abs-char { select abs('a'); } {0.0} do_execsql_test abs-null { select abs(null); } {} do_execsql_test ifnull-1 { select ifnull(1, 2); } {1} do_execsql_test ifnull-2 { select ifnull(null, 2); } {2} do_execsql_test upper { select upper('Limbo') } {LIMBO} do_execsql_test upper-number { select upper(1) } {1} do_execsql_test upper-char { select upper('a') } {A} do_execsql_test upper-null { select upper(null) } {} do_execsql_test lower { select lower('Limbo') } {limbo} do_execsql_test lower-number { select lower(1) } {1} do_execsql_test lower-char { select lower('A') } {a} do_execsql_test lower-null { select lower(null) } {} do_execsql_test trim { SELECT trim(' Limbo '); } {Limbo} do_execsql_test trim-number { SELECT trim(1); } {1} do_execsql_test trim-null { SELECT trim(null); } {} do_execsql_test trim-leading-whitespace { SELECT trim(' Leading'); } {Leading} do_execsql_test trim-trailing-whitespace { SELECT trim('Trailing '); } {Trailing} do_execsql_test trim-pattern { SELECT trim('Limbo', 'Limbo'); } {} do_execsql_test trim-pattern-number { SELECT trim(1, '1'); } {} do_execsql_test trim-pattern-null { SELECT trim(null, 'null'); } {} do_execsql_test trim-no-match-pattern { SELECT trim('Limbo', 'xyz'); } {Limbo} do_execsql_test ltrim { SELECT ltrim(' Limbo '); } {"Limbo "} do_execsql_test ltrim-number { SELECT ltrim(1); } {1} do_execsql_test ltrim-null { SELECT ltrim(null); } {} do_execsql_test ltrim-leading-whitespace { SELECT ltrim(' Leading'); } {Leading} do_execsql_test ltrim-no-leading-whitespace { SELECT ltrim('Limbo'); } {Limbo} do_execsql_test ltrim-pattern { SELECT ltrim('Limbo', 'Limbo'); } {} do_execsql_test ltrim-pattern-number { SELECT ltrim(1, '1'); } {} do_execsql_test ltrim-pattern-null { SELECT ltrim(null, 'null'); } {} do_execsql_test ltrim-no-match-pattern { SELECT ltrim('Limbo', 'xyz'); } {Limbo} do_execsql_test rtrim { SELECT rtrim(' Limbo '); } {" Limbo"} do_execsql_test rtrim-number { SELECT rtrim(1); } {1} do_execsql_test rtrim-null { SELECT rtrim(null); } {} do_execsql_test rtrim-trailing-whitespace { SELECT rtrim('Trailing '); } {Trailing} do_execsql_test rtrim-no-trailing-whitespace { SELECT rtrim('Limbo'); } {Limbo} do_execsql_test rtrim-pattern { SELECT rtrim('Limbo', 'Limbo'); } {} do_execsql_test rtrim-pattern-number { SELECT rtrim(1, '1'); } {} do_execsql_test rtrim-pattern-null { SELECT rtrim(null, 'null'); } {} do_execsql_test rtrim-no-match-pattern { SELECT rtrim('Limbo', 'xyz'); } {Limbo} do_execsql_test round-float-no-precision { SELECT round(123.456); } {123.0} do_execsql_test round-float-with-precision { SELECT round(123.456, 2); } {123.46} do_execsql_test round-float-with-text-precision { SELECT round(123.5, '1'); } {123.5} do_execsql_test round-text-parsable { SELECT round('123.456', 2); } {123.46} do_execsql_test round-text-non-parsable { SELECT round('abc', 1); } {0.0} do_execsql_test round-integer-with-precision { SELECT round(123, 1); } {123.0} do_execsql_test round-float-negative-precision { SELECT round(123.456, -1); } {123.0} do_execsql_test round-float-zero-precision { SELECT round(123.456, 0); } {123.0} do_execsql_test round-null-precision { SELECT round(123.456, null); } {} do_execsql_test length-text { SELECT length('limbo'); } {5} do_execsql_test length-integer { SELECT length(12345); } {5} do_execsql_test length-float { SELECT length(123.456); } {7} do_execsql_test length-null { SELECT length(NULL); } {} do_execsql_test length-empty-text { SELECT length(''); } {0} do_execsql_test length-date-binary-expr { select length(date('now')) = 10; } {1} do_execsql_test min-number { select min(-10,2,3) } {-10} do_execsql_test min-str { select min('b','a','z') } {a} do_execsql_test min-null { select min(null,null) } {} do_execsql_test max-number { select max(-10,2,3) } {3} do_execsql_test max-str { select max('b','a','z') } {z} do_execsql_test min-int-float { select min(1,5.0) } {1} do_execsql_test max-int-float { select max(1,5.0) } {5.0} do_execsql_test min-float-int { select min(5.0,1) } {1} do_execsql_test max-null { select max(null,null) } {} do_execsql_test nullif { select nullif(1, 2) } {1} do_execsql_test nullif { select nullif(1, 1) } {} do_execsql_test nullif { select nullif('limbo', 'limbo') } {} do_execsql_test substr-3-args { SELECT substr('limbo', 1, 3); } {lim} do_execsql_test substr-3-args-exceed-length { SELECT substr('limbo', 1, 10); } {limbo} do_execsql_test substr-3-args-start-exceed-length { SELECT substr('limbo', 10, 3); } {} do_execsql_test substr-2-args { SELECT substr('limbo', 3); } {mbo} do_execsql_test substring-3-args { SELECT substring('limbo', 1, 3); } {lim} do_execsql_test substring-3-args-exceed-length { SELECT substring('limbo', 1, 10); } {limbo} do_execsql_test substring-3-args-start-exceed-length { SELECT substring('limbo', 10, 3); } {} do_execsql_test substring-2-args { SELECT substring('limbo', 3); } {mbo} do_execsql_test substring-2-args-exceed-length { SELECT substring('limbo', 10); } {} do_execsql_test typeof-null { SELECT typeof(null); } {null} do_execsql_test typeof-null-case { SELECT typeof(nuLL); } {null} do_execsql_test typeof-text { SELECT typeof('hello'); } {text} do_execsql_test typeof-text-empty { SELECT typeof(''); } {text} do_execsql_test typeof-integer { SELECT typeof(123); } {integer} do_execsql_test typeof-real { SELECT typeof(1.0); } {real} # TODO: Uncomment when blobs are better supported # do_execsql_test typeof-blob { # SELECT typeof(x'61'); # } {blob} # # do_execsql_test typeof-blob-empty { # SELECT typeof(x''); # } {blob} do_execsql_test typeof-sum-integer { SELECT typeof(sum(age)) from users; } {integer} do_execsql_test typeof-sum-real { SELECT typeof(sum(price)) from products; } {real} do_execsql_test typeof-group_concat { SELECT typeof(group_concat(name)) from products; } {text} do_execsql_test unicode-a { SELECT unicode('a'); } {97} do_execsql_test unicode-emoji { SELECT unicode('😊'); } {128522} do_execsql_test unicode-empty { SELECT unicode(''); } {} do_execsql_test unicode-number { SELECT unicode(23); } {50} do_execsql_test unicode-float { SELECT unicode(23.45); } {50} do_execsql_test unicode-null { SELECT unicode(NULL); } {} do_execsql_test quote-string-embedded-nul { SELECT quote(concat('abc', char(0), 'def')) } {'abc'} do_execsql_test quote-string { SELECT quote('limbo') } {'limbo'} do_execsql_test quote-null { SELECT quote(null) } {NULL} do_execsql_test quote-integer { SELECT quote(123) } {123} do_execsql_test sign-positive-integer { SELECT sign(42); } {1} do_execsql_test sign-negative-integer { SELECT sign(-42); } {-1} do_execsql_test sign-zero { SELECT sign(0); } {0} do_execsql_test sign-positive-float { SELECT sign(42.0); } {1} do_execsql_test sign-negative-float { SELECT sign(-42.0); } {-1} do_execsql_test sign-zero-float { SELECT sign(0.0); } {0} do_execsql_test sign-text-positive-integer { SELECT sign('42'); } {1} do_execsql_test sign-text-negative-integer { SELECT sign('-42'); } {-1} do_execsql_test sign-text-zero { SELECT sign('0'); } {0} do_execsql_test sign-text-non-numeric { SELECT sign('abc'); } {} do_execsql_test sign-null { SELECT sign(NULL); } {}