#!/usr/bin/env tclsh set testdir [file dirname $argv0] source $testdir/tester.tcl 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 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 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 max-null { select max(null,null) } {} 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 substr-2-args-exceed-length { SELECT substr('limbo', 10); } {} do_execsql_test date-current-date { SELECT length(date('now')) = 10; } {1} do_execsql_test date-specific-date { SELECT date('2023-05-18'); } {2023-05-18} do_execsql_test date-with-time { SELECT date('2023-05-18 15:30:45'); } {2023-05-18} do_execsql_test date-iso8601 { SELECT date('2023-05-18T15:30:45'); } {2023-05-18} do_execsql_test date-with-milliseconds { SELECT date('2023-05-18 15:30:45.123'); } {2023-05-18} do_execsql_test date-julian-day-integer { SELECT date(2460082); } {2023-05-17} do_execsql_test date-julian-day-float { SELECT date(2460082.5); } {2023-05-18} do_execsql_test date-invalid-input { SELECT date('not a date'); } {{}} do_execsql_test date-null-input { SELECT date(NULL); } {{}} do_execsql_test date-out-of-range { SELECT date('10001-01-01'); } {{}} do_execsql_test date-time-only { SELECT date('15:30:45'); } {2000-01-01} do_execsql_test date-with-timezone-utc { SELECT date('2023-05-18 15:30:45Z'); } {2023-05-18} do_execsql_test date-with-timezone-positive { SELECT date('2023-05-18 23:30:45+02:00'); } {2023-05-18} do_execsql_test date-with-timezone-negative { SELECT date('2023-05-19 01:30:45-05:00'); } {2023-05-19} do_execsql_test date-with-timezone-day-change-positive { SELECT date('2023-05-18 23:30:45-03:00'); } {2023-05-19} do_execsql_test date-with-timezone-day-change-negative { SELECT date('2023-05-19 01:30:45+03:00'); } {2023-05-18} do_execsql_test date-with-timezone-iso8601 { SELECT date('2023-05-18T15:30:45+02:00'); } {2023-05-18} do_execsql_test date-with-timezone-and-milliseconds { SELECT date('2023-05-18 15:30:45.123+02:00'); } {2023-05-18} do_execsql_test date-with-invalid-timezone { SELECT date('2023-05-18 15:30:45+25:00'); } {{}} do_execsql_test time-no-arg { SELECT length(time()) = 8; } {1} do_execsql_test time-current-time { SELECT length(time('now')) = 8; } {1} do_execsql_test time-specific-time { SELECT time('04:02:00'); } {04:02:00} do_execsql_test time-of-datetime { SELECT time('2023-05-18 15:30:45'); } {15:30:45} do_execsql_test time-iso8601 { SELECT time('2023-05-18T15:30:45'); } {15:30:45} do_execsql_test time-with-milliseconds { SELECT time('2023-05-18 15:30:45.123'); } {15:30:45} do_execsql_test time-julian-day-integer { SELECT time(2460082); } {12:00:00} do_execsql_test time-julian-day-float { SELECT time(2460082.2); } {16:48:00} do_execsql_test time-invalid-input { SELECT time('not a time'); } {{}} do_execsql_test time-null-input { SELECT time(NULL); } {{}} do_execsql_test time-out-of-range { SELECT time('25:05:01'); } {{}} do_execsql_test time-date-only { SELECT time('2024-02-02'); } {00:00:00} do_execsql_test time-with-timezone-utc { SELECT time('2023-05-18 15:30:45Z'); } {15:30:45} do_execsql_test time-with-timezone-positive { SELECT time('2023-05-18 23:30:45+07:00'); } {16:30:45} do_execsql_test time-with-timezone-negative { SELECT time('2023-05-19 01:30:45-05:00'); } {06:30:45} do_execsql_test time-with-timezone-day-change-positive { SELECT time('2023-05-18 23:30:45-03:00'); } {02:30:45} do_execsql_test time-with-timezone-day-change-negative { SELECT time('2023-05-19 01:30:45+03:00'); } {22:30:45} do_execsql_test time-with-timezone-iso8601 { SELECT time('2023-05-18T15:30:45+02:00'); } {13:30:45} do_execsql_test time-with-timezone-and-milliseconds { SELECT time('2023-05-18 15:30:45.123+02:00'); } {13:30:45} do_execsql_test time-with-invalid-timezone { SELECT time('2023-05-18 15:30:45+25:00'); } {{}} 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); } {}