Index: third_party/sqlite/src/test/func.test |
diff --git a/third_party/sqlite/src/test/func.test b/third_party/sqlite/src/test/func.test |
index eef05439861b81e924aaaedf5e048284d7bcac17..98ae8ddeb59b0010119a5512f976aa1e16223f49 100644 |
--- a/third_party/sqlite/src/test/func.test |
+++ b/third_party/sqlite/src/test/func.test |
@@ -14,6 +14,7 @@ |
set testdir [file dirname $argv0] |
source $testdir/tester.tcl |
+set testprefix func |
# Create a table to work with. |
# |
@@ -312,7 +313,7 @@ ifcapable floatingpoint { |
execsql {SELECT round(9999999999999.55,1);} |
} {9999999999999.6} |
do_test func-4.38 { |
- execsql {SELECT round(9999999999999.555,2);} |
+ execsql {SELECT round(9999999999999.556,2);} |
} {9999999999999.56} |
} |
@@ -682,6 +683,32 @@ do_test func-13.7 { |
lappend res [sqlite3_finalize $STMT] |
} {{0 0} {1 0} SQLITE_OK} |
+# Test that auxiliary data is discarded when a statement is reset. |
+do_execsql_test 13.8.1 { |
+ SELECT test_auxdata('constant') FROM t4; |
+} {0 1} |
+do_execsql_test 13.8.2 { |
+ SELECT test_auxdata('constant') FROM t4; |
+} {0 1} |
+db cache flush |
+do_execsql_test 13.8.3 { |
+ SELECT test_auxdata('constant') FROM t4; |
+} {0 1} |
+set V "one" |
+do_execsql_test 13.8.4 { |
+ SELECT test_auxdata($V), $V FROM t4; |
+} {0 one 1 one} |
+set V "two" |
+do_execsql_test 13.8.5 { |
+ SELECT test_auxdata($V), $V FROM t4; |
+} {0 two 1 two} |
+db cache flush |
+set V "three" |
+do_execsql_test 13.8.6 { |
+ SELECT test_auxdata($V), $V FROM t4; |
+} {0 three 1 three} |
+ |
+ |
# Make sure that a function with a very long name is rejected |
do_test func-14.1 { |
catch { |
@@ -1167,6 +1194,18 @@ do_test func-24.12 { |
WHEN 'program' THEN null ELSE t1 END) FROM tbl1 |
} |
} {,is,free,software} |
+# Tests to verify ticket http://www.sqlite.org/src/tktview/55746f9e65f8587c0 |
+do_test func-24.13 { |
+ execsql { |
+ SELECT typeof(group_concat(x)) FROM (SELECT '' AS x); |
+ } |
+} {text} |
+do_test func-24.14 { |
+ execsql { |
+ SELECT typeof(group_concat(x,'')) |
+ FROM (SELECT '' AS x UNION ALL SELECT ''); |
+ } |
+} {text} |
# Use the test_isolation function to make sure that type conversions |
@@ -1247,4 +1286,98 @@ do_test func-28.1 { |
} |
} {1 {unknown function: nosuchfunc()}} |
+# Verify that the length() and typeof() functions do not actually load |
+# the content of their argument. |
+# |
+do_test func-29.1 { |
+ db eval { |
+ CREATE TABLE t29(id INTEGER PRIMARY KEY, x, y); |
+ INSERT INTO t29 VALUES(1, 2, 3), (2, NULL, 4), (3, 4.5, 5); |
+ INSERT INTO t29 VALUES(4, randomblob(1000000), 6); |
+ INSERT INTO t29 VALUES(5, "hello", 7); |
+ } |
+ db close |
+ sqlite3 db test.db |
+ sqlite3_db_status db CACHE_MISS 1 |
+ db eval {SELECT typeof(x), length(x), typeof(y) FROM t29 ORDER BY id} |
+} {integer 1 integer null {} integer real 3 integer blob 1000000 integer text 5 integer} |
+do_test func-29.2 { |
+ set x [lindex [sqlite3_db_status db CACHE_MISS 1] 1] |
+ if {$x<5} {set x 1} |
+ set x |
+} {1} |
+do_test func-29.3 { |
+ db close |
+ sqlite3 db test.db |
+ sqlite3_db_status db CACHE_MISS 1 |
+ db eval {SELECT typeof(+x) FROM t29 ORDER BY id} |
+} {integer null real blob text} |
+if {[permutation] != "mmap"} { |
+ ifcapable !direct_read { |
+ do_test func-29.4 { |
+ set x [lindex [sqlite3_db_status db CACHE_MISS 1] 1] |
+ if {$x>100} {set x many} |
+ set x |
+ } {many} |
+ } |
+} |
+do_test func-29.5 { |
+ db close |
+ sqlite3 db test.db |
+ sqlite3_db_status db CACHE_MISS 1 |
+ db eval {SELECT sum(length(x)) FROM t29} |
+} {1000009} |
+do_test func-29.6 { |
+ set x [lindex [sqlite3_db_status db CACHE_MISS 1] 1] |
+ if {$x<5} {set x 1} |
+ set x |
+} {1} |
+ |
+# The OP_Column opcode has an optimization that avoids loading content |
+# for fields with content-length=0 when the content offset is on an overflow |
+# page. Make sure the optimization works. |
+# |
+do_execsql_test func-29.10 { |
+ CREATE TABLE t29b(a,b,c,d,e,f,g,h,i); |
+ INSERT INTO t29b |
+ VALUES(1, hex(randomblob(2000)), null, 0, 1, '', zeroblob(0),'x',x'01'); |
+ SELECT typeof(c), typeof(d), typeof(e), typeof(f), |
+ typeof(g), typeof(h), typeof(i) FROM t29b; |
+} {null integer integer text blob text blob} |
+do_execsql_test func-29.11 { |
+ SELECT length(f), length(g), length(h), length(i) FROM t29b; |
+} {0 0 1 1} |
+do_execsql_test func-29.12 { |
+ SELECT quote(f), quote(g), quote(h), quote(i) FROM t29b; |
+} {'' X'' 'x' X'01'} |
+ |
+# EVIDENCE-OF: R-29701-50711 The unicode(X) function returns the numeric |
+# unicode code point corresponding to the first character of the string |
+# X. |
+# |
+# EVIDENCE-OF: R-55469-62130 The char(X1,X2,...,XN) function returns a |
+# string composed of characters having the unicode code point values of |
+# integers X1 through XN, respectively. |
+# |
+do_execsql_test func-30.1 {SELECT unicode('$');} 36 |
+do_execsql_test func-30.2 [subst {SELECT unicode('\u00A2');}] 162 |
+do_execsql_test func-30.3 [subst {SELECT unicode('\u20AC');}] 8364 |
+do_execsql_test func-30.4 {SELECT char(36,162,8364);} [subst {$\u00A2\u20AC}] |
+ |
+for {set i 1} {$i<0xd800} {incr i 13} { |
+ do_execsql_test func-30.5.$i {SELECT unicode(char($i))} $i |
+} |
+for {set i 57344} {$i<=0xfffd} {incr i 17} { |
+ if {$i==0xfeff} continue |
+ do_execsql_test func-30.5.$i {SELECT unicode(char($i))} $i |
+} |
+for {set i 65536} {$i<=0x10ffff} {incr i 139} { |
+ do_execsql_test func-30.5.$i {SELECT unicode(char($i))} $i |
+} |
+ |
+# Test char(). |
+# |
+do_execsql_test func-31.1 { |
+ SELECT char(), length(char()), typeof(char()) |
+} {{} 0 text} |
finish_test |