/
clang
/
sqlite
Обзор
Документация
Войти
/
clang
/
sqlite
Код
Вики
Пакеты
0
Релизы
0
Аналитика
master
test/subtype1.test
116 строк
3 KB
dan
When using an index on a CASE expression that may return a value with a subtype, avoid discarding any subtype.
15 май 2026, 22:44
15 май 2026, 22:44
61d9f8f
Код
Авторство
О чём код?
# 2015-09-10 # # The author disclaims copyright to this source code. In place of # a legal notice, here is a blessing: # # May you do good and not evil. # May you find forgiveness for yourself and forgive others. # May you share freely, never taking more than you give. # #*********************************************************************** # This file implements tests for sqlite3_value_subtype() and # sqlite3_result_subtype() interfaces. # set testdir [file dirname $argv0] source $testdir/tester.tcl do_execsql_test subtype1-100 { SELECT test_getsubtype('hello'); } {0} do_execsql_test subtype1-110 { SELECT test_getsubtype(test_setsubtype('hello',123)); } {123} do_execsql_test subtype1-120 { SELECT typeof(test_setsubtype('hello',123)); } {text} do_execsql_test subtype1-130 { SELECT test_setsubtype('hello',123); } {hello} # 2022-06-09 # https://sqlite.org/forum/forumpost/3d9caa45cbe38c78 # # Avoid carrying subtypes through into a subquery that has been flattened # or to which the outer WHERE clause has been pushed down. # reset_db do_execsql_test subtype1-200 { CREATE TABLE t1(a); INSERT INTO t1 VALUES ('x'); CREATE VIEW t2(b) AS SELECT json(TRUE); CREATE TABLE t3(b); INSERT INTO t3 VALUES(json(TRUE)); } do_execsql_test subtype1-210 { SELECT * FROM t3, t1 WHERE NOT json_quote(b); } {1 x} do_execsql_test subtype1-220 { SELECT * FROM t2, t1 WHERE NOT json_quote(b); } {1 x} do_execsql_test subtype1-230 { WITH t4(a) AS MATERIALIZED (SELECT json(1)) SELECT subtype(a) FROM t4; } {0} do_execsql_test subtype1-231 { WITH t4(a) AS NOT MATERIALIZED (SELECT json(1)) SELECT subtype(a) FROM t4; } {0} # 2023-03-01 # https://sqlite.org/forum/forumpost/37dd14a538 # # Additional tests to show that subtypes do not traverse subquery boundaries. # do_execsql_test subtype1-300 { CREATE TABLE t0(c0); INSERT INTO t0 VALUES ('1'); CREATE VIEW v0(c0) AS SELECT CASE WHEN 1 THEN json_patch('1', '1') END FROM t0 GROUP BY t0.c0; SELECT * FROM v0 WHERE json_quote(v0.c0) != '1'; } {1} do_execsql_test subtype1-310 { SELECT *, json_quote(y) FROM (SELECT +json('1') AS y); } {1 {"1"}} do_execsql_test subtype1-320 { SELECT *, json_quote(y) FROM (SELECT +json('1') AS y) WHERE json_quote(y)='"1"'; } {1 {"1"}} # 2024-11-26 # subtype survives if() # do_execsql_test subtype1-400 { WITH t400(id,j) AS (VALUES (1,'{a:{x:1,y:2},b:{x:3,y:4}}'), (2,'not json') ) SELECT id, subtype(if(json_valid(j,6),j->'a')) FROM t400; } {1 74 2 0} #------------------------------------------------------------------------- # Test that indexes on expressions do not alter subtypes. # reset_db do_execsql_test subtype1-500 { CREATE TABLE t1(id, j); INSERT INTO t1 VALUES (1,'{a:{x:1,y:2},b:{x:3,y:4}}'), (2,'not json'); } foreach {tn expr st} { 510 "(CASE WHEN json_valid(j, 6) THEN j->'a' ELSE j END)" 74 520 "+(CASE WHEN json_valid(j, 6) THEN j->'a' ELSE j END)" 74 530 "-(CASE WHEN json_valid(j, 6) THEN j->'a' ELSE j END)" 0 540 "if( json_valid(j, 6), j->'a' ) " 74 550 "if( json_valid(j, 6), j->'a' ) COLLATE nocase" 74 560 "CAST( if( json_valid(j, 6), j->'a' ) AS TEXT )" 74 } { do_execsql_test subtype1-$tn.1 " SELECT id, subtype( $expr ) FROM t1; " [list 1 $st 2 0] do_execsql_test subtype1-$tn.2 " DROP INDEX IF EXISTS i1; CREATE INDEX i1 ON t1( $expr ); SELECT id, subtype( $expr ) FROM t1 INDEXED BY i1 ORDER BY id; " [list 1 $st 2 0] } finish_test