# 2024-01-23 # # 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. # #*********************************************************************** # # Legacy JSON bug: If the input is a BLOB that when cast into TEXT looks # like valid JSON, then treat it as valid JSON. # # The original intent of the JSON functions was to raise an error on any # BLOB input. That intent was clearly documented, but the code failed to # to implement it. Subsequently, many applications began to depend on the # incorrect behavior, especially apps that used readfile() to read JSON # content, since readfile() returns a BLOB. So we need to support the # bug moving forward. # # The tests in this fail verify that the original buggy behavior is # preserved. # set testdir [file dirname $argv0] source $testdir/tester.tcl set testprefix json107 if {[db one {PRAGMA encoding}]!="UTF-8"} { # These tests only work for a UTF-8 encoding. finish_test return } do_execsql_test 1.1 { SELECT json_valid( CAST('{"a":1}' AS BLOB) ); } 1 do_execsql_test 1.1.1 { SELECT json_valid( CAST('{"a":1}' AS BLOB), 1); } 1 do_execsql_test 1.1.2 { SELECT json_valid( CAST('{"a":1}' AS BLOB), 2); } 1 do_execsql_test 1.1.4 { SELECT json_valid( CAST('{"a":1}' AS BLOB), 4); } 0 do_execsql_test 1.1.8 { SELECT json_valid( CAST('{"a":1}' AS BLOB), 8); } 0 do_execsql_test 1.2.1 { SELECT CAST('{"a":123}' AS blob) -> 'a'; } 123 do_execsql_test 1.2.2 { SELECT CAST('{"a":123}' AS blob) ->> 'a'; } 123 do_execsql_test 1.2.3 { SELECT json_extract(CAST('{"a":123}' AS blob), '$.a'); } 123 do_execsql_test 1.3 { SELECT json_insert(CAST('{"a":123}' AS blob),'$.b',456); } {{{"a":123,"b":456}}} do_execsql_test 1.4 { SELECT json_remove(CAST('{"a":123,"b":456}' AS blob),'$.a'); } {{{"b":456}}} do_execsql_test 1.5 { SELECT json_set(CAST('{"a":123,"b":456}' AS blob),'$.a',789); } {{{"a":789,"b":456}}} do_execsql_test 1.6 { SELECT json_replace(CAST('{"a":123,"b":456}' AS blob),'$.a',789); } {{{"a":789,"b":456}}} do_execsql_test 1.7 { SELECT json_type(CAST('{"a":123,"b":456}' AS blob)); } object do_execsql_test 1.8 { SELECT json(CAST('{"a":123,"b":456}' AS blob)); } {{{"a":123,"b":456}}} ifcapable vtab { do_execsql_test 2.1 { SELECT key, value FROM json_tree( CAST('{"a":123,"b":456}' AS blob) ) WHERE atom; } {a 123 b 456} } finish_test