This posted in response to a bug notification on the dev list, but I 
moved it here for a question:

On 2015-10-11 12:45 PM, Richard Hipp wrote:
> On 10/11/15, Gilles Vollant <vollant.g at gmail.com> wrote:
>> I made a lot of very nice thing using json1,
>>
>> But I've an exception in the DLL just trying:
>>
>> CREATE TABLE mini_mini_npjson ( id_row text primary key,json_info text );
>> insert into  mini_mini_npjson values ('1','[22,33]');
>> SELECT *  FROM (select  json_info from mini_mini_npjson   ) as npjs ,
>> json_each(npjs.json_info);
>>
>> The error is "Access violation, read of address ."
>>
> Good catch, Gilles.
>
> An equivalent problem is this:
>
>    CREATE TABLE t1(a);
>    INSERT INTO t1(a) VALUES('[22,33]');
>    SELECT * FROM (SELECT a FROM t1) AS x, json_each(x.a);
>
> What happens is that SQLite tries to "flatten" the subquery up into
> the outer join.  The transformed query that it should be generating
> code for is:
>
>    SELECT * FROM t1, json_each(t1.a);
>
> And that query works.  However, the query flattener has a bug.  It is
> not correctly translating the values for the arguments to a
> table-valued function (since that is new syntax that the query
> flattener did not previously know about).  So it tries to generate
> code for:
>
>    SELECT * FROM t1, json_each(x.a);
>
> And since no such table as "x" exists anymore, bad things happen.
>

I originally thought the aliasing as used in the demonstration above was 
wrong, but of course it works in 3.9.0 as per the JSON docs.

Two questions -
1 - would referencing a table alias formed from a table in the same FROM 
clause be valid in future? Or is this just for JSON purposes?

2 - would this be allowed to reference ANY aliased table, or only one 
that can be simplified/factored to an actual table - What rules would 
govern such things?

More explicitly - would these be valid queries:

SELECT props.*
   FROM (
     SELECT  1 as id, JSON_OBJECT('i',5,'n','James') AS obj UNION ALL
     SELECT  2, JSON_OBJECT('i',6,'n','Jill') UNION ALL
     SELECT  3, JSON_OBJECT('i',7,'n','John')
) AS T1, JSON_EACH(T1.obj) AS props
WHERE 1

and would that be semantically equivalent to this:

SELECT props.*
   FROM (
     SELECT  1 as id, JSON_OBJECT('i',5,'n','James') AS obj UNION ALL
     SELECT  2, JSON_OBJECT('i',6,'n','Jill') UNION ALL
     SELECT  3, JSON_OBJECT('i',7,'n','John')
) AS T1
  INNER JOIN JSON_EACH(T1.obj) AS props
WHERE 1


and in future (without JSON):

SELECT B.* FROM
(SELECT (C1 || C2 || C3) AS CX FROM T) AS A,
(SELECT CX FROM A) AS B
WHERE 1

or perhaps these will be allowed with table valued functions only?


Thanks,
Ryan

Reply via email to