📄 func.test
字号:
'string', 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 'int', 1234, 'string', 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 'string', NULL, 'string', 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 'double', 1.234, 'string', 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 'int', 1234, 'string', 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 'string', NULL, 'string', 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 'double', 1.234 ); }} {1.234}# Test the built-in sqlite_version(*) SQL function.#do_test func-11.1 { execsql { SELECT sqlite_version(*); }} [sqlite3 -version]# Test that destructors passed to sqlite3 by calls to sqlite3_result_text()# etc. are called. These tests use two special user-defined functions# (implemented in func.c) only available in test builds. ## Function test_destructor() takes one argument and returns a copy of the# text form of that argument. A destructor is associated with the return# value. Function test_destructor_count() returns the number of outstanding# destructor calls for values returned by test_destructor().#do_test func-12.1 { execsql { SELECT test_destructor('hello world'), test_destructor_count(); }} {{hello world} 1}do_test func-12.2 { execsql { SELECT test_destructor_count(); }} {0}do_test func-12.3 { execsql { SELECT test_destructor('hello')||' world', test_destructor_count(); }} {{hello world} 0}do_test func-12.4 { execsql { SELECT test_destructor_count(); }} {0}do_test func-12.5 { execsql { CREATE TABLE t4(x); INSERT INTO t4 VALUES(test_destructor('hello')); INSERT INTO t4 VALUES(test_destructor('world')); SELECT min(test_destructor(x)), max(test_destructor(x)) FROM t4; }} {hello world}do_test func-12.6 { execsql { SELECT test_destructor_count(); }} {0}do_test func-12.7 { execsql { DROP TABLE t4; }} {}# Test that the auxdata API for scalar functions works. This test uses# a special user-defined function only available in test builds,# test_auxdata(). Function test_auxdata() takes any number of arguments.btree_breakpointdo_test func-13.1 { execsql { SELECT test_auxdata('hello world'); }} {0}do_test func-13.2 { execsql { CREATE TABLE t4(a, b); INSERT INTO t4 VALUES('abc', 'def'); INSERT INTO t4 VALUES('ghi', 'jkl'); }} {}do_test func-13.3 { execsql { SELECT test_auxdata('hello world') FROM t4; }} {0 1}do_test func-13.4 { execsql { SELECT test_auxdata('hello world', 123) FROM t4; }} {{0 0} {1 1}}do_test func-13.5 { execsql { SELECT test_auxdata('hello world', a) FROM t4; }} {{0 0} {1 0}}do_test func-13.6 { execsql { SELECT test_auxdata('hello'||'world', a) FROM t4; }} {{0 0} {1 0}}# Test that auxilary data is preserved between calls for SQL variables.do_test func-13.7 { set DB [sqlite3_connection_pointer db] set sql "SELECT test_auxdata( ? , a ) FROM t4;" set STMT [sqlite3_prepare $DB $sql -1 TAIL] sqlite3_bind_text $STMT 1 hello -1 set res [list] while { "SQLITE_ROW"==[sqlite3_step $STMT] } { lappend res [sqlite3_column_text $STMT 0] } lappend res [sqlite3_finalize $STMT]} {{0 0} {1 0} SQLITE_OK}# Make sure that a function with a very long name is rejecteddo_test func-14.1 { catch { db function [string repeat X 254] {return "hello"} } } {0}do_test func-14.2 { catch { db function [string repeat X 256] {return "hello"} }} {1}do_test func-15.1 { catchsql { select test_error(NULL); }} {1 {}}# Test the quote function for BLOB and NULL values.do_test func-16.1 { execsql { CREATE TABLE tbl2(a, b); } set STMT [sqlite3_prepare $::DB "INSERT INTO tbl2 VALUES(?, ?)" -1 TAIL] sqlite3_bind_blob $::STMT 1 abc 3 sqlite3_step $::STMT sqlite3_finalize $::STMT execsql { SELECT quote(a), quote(b) FROM tbl2; }} {X'616263' NULL}# Correctly handle function error messages that include %. Ticket #1354#do_test func-17.1 { proc testfunc1 args {error "Error %d with %s percents %p"} db function testfunc1 ::testfunc1 catchsql { SELECT testfunc1(1,2,3); }} {1 {Error %d with %s percents %p}}# The SUM function should return integer results when all inputs are integer.#do_test func-18.1 { execsql { CREATE TABLE t5(x); INSERT INTO t5 VALUES(1); INSERT INTO t5 VALUES(-99); INSERT INTO t5 VALUES(10000); SELECT sum(x) FROM t5; }} {9902}do_test func-18.2 { execsql { INSERT INTO t5 VALUES(0.0); SELECT sum(x) FROM t5; }} {9902.0}# The sum of nothing is NULL. But the sum of all NULLs is NULL.## The TOTAL of nothing is 0.0.#do_test func-18.3 { execsql { DELETE FROM t5; SELECT sum(x), total(x) FROM t5; }} {{} 0.0}do_test func-18.4 { execsql { INSERT INTO t5 VALUES(NULL); SELECT sum(x), total(x) FROM t5 }} {{} 0.0}do_test func-18.5 { execsql { INSERT INTO t5 VALUES(NULL); SELECT sum(x), total(x) FROM t5 }} {{} 0.0}do_test func-18.6 { execsql { INSERT INTO t5 VALUES(123); SELECT sum(x), total(x) FROM t5 }} {123 123.0}# Ticket #1664, #1669, #1670, #1674: An integer overflow on SUM causes# an error. The non-standard TOTAL() function continues to give a helpful# result.#do_test func-18.10 { execsql { CREATE TABLE t6(x INTEGER); INSERT INTO t6 VALUES(1); INSERT INTO t6 VALUES(1<<62); SELECT sum(x) - ((1<<62)+1) from t6; }} 0do_test func-18.11 { execsql { SELECT typeof(sum(x)) FROM t6 }} integerdo_test func-18.12 { catchsql { INSERT INTO t6 VALUES(1<<62); SELECT sum(x) - ((1<<62)*2.0+1) from t6; }} {1 {integer overflow}}do_test func-18.13 { execsql { SELECT total(x) - ((1<<62)*2.0+1) FROM t6 }} 0.0do_test func-18.14 { execsql { SELECT sum(-9223372036854775805); }} -9223372036854775805ifcapable compound&&subquery {do_test func-18.15 { catchsql { SELECT sum(x) FROM (SELECT 9223372036854775807 AS x UNION ALL SELECT 10 AS x); }} {1 {integer overflow}}do_test func-18.16 { catchsql { SELECT sum(x) FROM (SELECT 9223372036854775807 AS x UNION ALL SELECT -10 AS x); }} {0 9223372036854775797}do_test func-18.17 { catchsql { SELECT sum(x) FROM (SELECT -9223372036854775807 AS x UNION ALL SELECT 10 AS x); }} {0 -9223372036854775797}do_test func-18.18 { catchsql { SELECT sum(x) FROM (SELECT -9223372036854775807 AS x UNION ALL SELECT -10 AS x); }} {1 {integer overflow}}do_test func-18.19 { catchsql { SELECT sum(x) FROM (SELECT 9 AS x UNION ALL SELECT -10 AS x); }} {0 -1}do_test func-18.20 { catchsql { SELECT sum(x) FROM (SELECT -9 AS x UNION ALL SELECT 10 AS x); }} {0 1}do_test func-18.21 { catchsql { SELECT sum(x) FROM (SELECT -10 AS x UNION ALL SELECT 9 AS x); }} {0 -1}do_test func-18.22 { catchsql { SELECT sum(x) FROM (SELECT 10 AS x UNION ALL SELECT -9 AS x); }} {0 1}} ;# ifcapable compound&&subquery# Integer overflow on abs()#do_test func-18.31 { catchsql { SELECT abs(-9223372036854775807); }} {0 9223372036854775807}do_test func-18.32 { catchsql { SELECT abs(-9223372036854775807-1); }} {1 {integer overflow}}# The MATCH function exists but is only a stub and always throws an error.#do_test func-19.1 { execsql { SELECT match(a,b) FROM t1 WHERE 0; }} {}do_test func-19.2 { catchsql { SELECT 'abc' MATCH 'xyz'; }} {1 {MATCH is not implemented}}do_test func-19.3 { catchsql { SELECT 'abc' NOT MATCH 'xyz'; }} {1 {MATCH is not implemented}}do_test func-19.4 { catchsql { SELECT match(1,2,3); }} {1 {wrong number of arguments to function match()}}finish_test
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -