1
0
mirror of https://github.com/sqlite/sqlite.git synced 2026-10-23 21:49:02 +03:00
Files
sqlite/test/subtype2.test
drh 394e7bc1ac Prevent scalar subqueries from ever returning a value with a non-zero subtype.
Report [bugs:/info/2026-10-12T13:52:22Z | 2026-10-12T13:52:22Z].  Re-added
after the addition of a necessary prerequisite in the previous check-in.

FossilOrigin-Name: 8ab55e0185a1956fb3e131bc5faae0cf3ff5abb1f553217f2d63fcb15c75cc1f
2026-10-12 21:33:49 +00:00

205 lines
4.2 KiB
Plaintext

# 2026 October 12
#
# 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 regression tests for SQLite library. Specifically,
# it tests that scalar sub-queries never return values with subtypes.
#
set testdir [file dirname $argv0]
source $testdir/tester.tcl
set testprefix subtype2
do_execsql_test 1.0.1 {
SELECT
json_group_object(
'key',
(SELECT CAST(json(0) AS TEXT)
FROM (SELECT 1 AS k)
WHERE k = 1
ORDER BY k)
) AS q1,
json_group_object(
'key',
(SELECT CAST(json(0) AS TEXT)
FROM (SELECT 1 AS k)
WHERE NOT (NOT (k = 1))
ORDER BY k)
) AS q2;
} {
{{"key":"0"}} {{"key":"0"}}
}
do_execsql_test 1.0.2 {
SELECT
json_group_object(
'key',
(SELECT json(0)
FROM (SELECT 1 AS k)
WHERE k = 1
ORDER BY k)
) AS q1,
json_group_object(
'key',
(SELECT json(0)
FROM (SELECT 1 AS k)
WHERE NOT (NOT (k = 1))
ORDER BY k)
) AS q2;
} {
{{"key":"0"}} {{"key":"0"}}
}
do_execsql_test 1.0.3 {
SELECT json_group_object(
'key',
(SELECT json(0)
FROM (SELECT 1 AS k)
WHERE k = 1
ORDER BY k)
);
} {
{{"key":"0"}}
}
do_execsql_test 1.0.4 {
SELECT json_group_object(
'key',
(SELECT json(0)
FROM (SELECT 1 AS k)
WHERE (NOT (NOT (k = 1)))
ORDER BY k)
);
} {
{{"key":"0"}}
}
do_execsql_test 1.0.5 {
SELECT subtype (
(SELECT json(0)
FROM (SELECT 1 AS k)
WHERE k = 1
ORDER BY k)
);
} {0}
do_execsql_test 1.0.6 {
SELECT subtype (
(SELECT json(0)
FROM (SELECT 1 AS k)
WHERE (NOT (NOT (k = 1)))
ORDER BY k)
);
} {0}
do_execsql_test 2.1 {
SELECT json_group_object( 'key', (SELECT CAST(json(0) AS TEXT)) );
} {{{"key":"0"}}}
do_execsql_test 2.2 {
SELECT 'key', typeof( (SELECT CAST(json(0) AS TEXT)) )
} {key text}
do_execsql_test 2.3 {
SELECT 'key', subtype( (SELECT CAST(json(0) AS TEXT)) )
} {key 0}
do_execsql_test 2.4.1 {
SELECT 'key', subtype( json(0) )
} {key 74}
do_execsql_test 2.4.2 {
SELECT 'key', subtype( (SELECT json(0)) )
} {key 0}
do_execsql_test 2.5 {
SELECT 'key', subtype( max(0) )
} {key 0}
do_execsql_test 2.6 {
SELECT 'key', typeof( json(0) )
} {key text}
do_execsql_test 2.7 {
SELECT 'key', subtype( +json(0) )
} {key 74}
do_execsql_test 2.8 {
SELECT 'key', coalesce(NULL, json(0))
} {key 0}
do_execsql_test 2.9 {
SELECT 'key', coalesce(json(0), NULL)
} {key 0}
#-----------------------------------------------------------------------------
reset_db
do_execsql_test 3.0 {
CREATE TABLE t1(a, b);
INSERT INTO t1 values('a', 1);
INSERT INTO t1 values('b', 2);
INSERT INTO t1 values('c', 3);
}
do_execsql_test 3.1 {
SELECT max(
(SELECT json( b ) FROM t1 WHERE t1.b=o.b)
) FROM t1 AS o;
} {3}
do_execsql_test 3.2 {
SELECT subtype ((
SELECT max(
(SELECT json( b ) FROM t1 WHERE t1.b=o.b)
) FROM t1 AS o
))
} {0}
#-----------------------------------------------------------------------------
# Test that aggregate scalar sub-queries do not return subtypes as well.
#
reset_db
do_execsql_test 4.0 {
CREATE TABLE t1(a, b);
INSERT INTO t1 VALUES(1, '[1]');
INSERT INTO t1 VALUES(2, '[2]');
}
do_execsql_test 4.1.1 {
SELECT subtype( json_group_array(a) ) FROM t1;
} {74}
do_execsql_test 4.1.2 {
SELECT subtype( (SELECT json_group_array(a) FROM t1) );
} {0}
do_execsql_test 4.1.3 {
SELECT json_array( (SELECT json_group_array(a) FROM t1) );
} {{["[1,2]"]}}
do_execsql_test 4.2.1 {
SELECT subtype( (SELECT json_group_object('k', a) FROM t1) );
} {0}
do_execsql_test 4.2.2 {
SELECT json_array( (SELECT json_group_object('k', a) FROM t1) );
} {{["{\"k\":1,\"k\":2}"]}}
do_execsql_test 4.3.1 {
SELECT subtype( max(json(b)) ) FROM t1;
} {74}
do_execsql_test 4.3.2 {
SELECT subtype( (SELECT max(json(b)) FROM t1) );
} {0}
do_execsql_test 4.3.3 {
SELECT json_array( (SELECT min(json(b)) FROM t1) );
} {{["[1]"]}}
finish_test