SQLite User Forum

Possible JSON subtype regression in json_each/json_tree in 3.45.1?
Login

Possible JSON subtype regression in json_each/json_tree in 3.45.1?

(1) By Alex Garcia (alexgarciaxyz) on 2024-02-16 21:06:06 [source]

The json_each() and json_tree() table functions used to apply the JSON subtype to the value column if the value was a JSON object/array. For example, the query:

select *, subtype(value) from json_tree('[1,2,3]');

This query uses the subtype() on the value column. I would expect that for the 4 rows that are returned in this query, the subtype(value) column would result in 0 for the 1/2/3 numerical rows, and 74 (JSON subtype flag) for the [1,2,3] array row.

This matches what I see in 3.41.0:

SQLite version 3.41.0 2022-12-27 22:46:49
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> .mode box
sqlite> .header on
sqlite> select *, subtype(value) from json_tree('[1,2,3]');
┌─────┬─────────┬─────────┬──────┬────┬────────┬─────────┬──────┬────────────────┐
│ key │  value  │  type   │ atom │ id │ parent │ fullkey │ path │ subtype(value) │
├─────┼─────────┼─────────┼──────┼────┼────────┼─────────┼──────┼────────────────┤
│     │ [1,2,3] │ array   │      │ 0  │        │ $       │ $    │ 74             │
│ 0   │ 1       │ integer │ 1    │ 1  │ 0      │ $[0]    │ $    │ 0              │
│ 1   │ 2       │ integer │ 2    │ 2  │ 0      │ $[1]    │ $    │ 0              │
│ 2   │ 3       │ integer │ 3    │ 3  │ 0      │ $[2]    │ $    │ 0              │
└─────┴─────────┴─────────┴──────┴────┴────────┴─────────┴──────┴────────────────┘

However, in 3.45.1, the subtype for the [1,2,3] row returns 0 instead.

SQLite version 3.45.1 2024-01-30 16:01:20
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> .mode box
sqlite> .header on
sqlite> select *, subtype(value) from json_tree('[1,2,3]');
┌─────┬─────────┬─────────┬──────┬────┬────────┬─────────┬──────┬────────────────┐
│ key │  value  │  type   │ atom │ id │ parent │ fullkey │ path │ subtype(value) │
├─────┼─────────┼─────────┼──────┼────┼────────┼─────────┼──────┼────────────────┤
│     │ [1,2,3] │ array   │      │ 0  │        │ $       │ $    │ 0              │
│ 0   │ 1       │ integer │ 1    │ 1  │ 0      │ $[0]    │ $    │ 0              │
│ 1   │ 2       │ integer │ 2    │ 3  │ 0      │ $[1]    │ $    │ 0              │
│ 2   │ 3       │ integer │ 3    │ 5  │ 0      │ $[2]    │ $    │ 0              │
└─────┴─────────┴─────────┴──────┴────┴────────┴─────────┴──────┴────────────────┘

I also see the id column values are different, but that's documented to vary between releases.

So my question: is this expected behavior? I know a lot changed in 3.45 regarding JSON functions + subtype flags, but it would be nice to keep the JSON subtype on these columns when possible.

(2) By Richard Hipp (drh) on 2024-02-17 03:38:10 in reply to 1 [link] [source]

Should be fixed by check-in 1c33c5db2e05019d. Please post a follow-up if you think this fix is incomplete or incorrect.