Definitely a bug: I distilled the OP's code into an easy repeatable test 
case -

-------------------------------------------------------
create table t(id integer primary key autoincrement, a, b, c);

insert into t values
  (3,1 ,'name'    ,'Imogen')
,(5,1 ,'gender'  ,'female')
,(6,1 ,'son'     ,'Guiderius')
,(7,1 ,'son'     ,'Arvirargus');

select distinct t.*
   from t
   join t as t1 on t.a=t1.a and t1.a = 1
  where t.b = 'name'
union
select distinct t.*
   from t
   join t as t1 on t.a=t1.a and t1.a = 1
  where t.b = 'gender'
  order by t.id

       -- Expected
   --  id |  a  | b        | c
   -- --- | --- | -------- | --------
   --  3  |  1  | name     | Imogen
   --  5  |  1  | gender   | female

       -- Returned
   --  id |  a  | b        | c
   -- --- | --- | -------- | --------
   --  3  |  1  | name     | Imogen
   --  5  |  1  | gender   | female
   --  5  |  1  | 1        | female

drop table t;

-----------------------------------------------------------

If you change almost anything, it works. Remove the "t.a=t1.a and" from 
the first select, and it works.
Remove the order clause and it works.

Cheers,
Ryan


On 2016/02/08 11:12 PM, Poor Yorick wrote:
> The following query produces a third phantom record on my system:
>
>
> ===== start script =====
> package require sqlite3
>
> sqlite3 [namespace current]::db :memory:
>
> db eval {
>     create table if not exists eav (
>         id integer primary key autoincrement
>         ,entity numeric
>         ,attribute text
>         ,value
>     )
>     ; insert into eav values
>         (3 ,1 ,'name'    ,'Imogen')
>         ,(5 ,1 ,'gender'  ,'female')
>         ,(6,1 ,'son'     ,'Guiderius')
>         ,(7,1 ,'son'     ,'Arvirargus')
> }
>
> set pattern0 1
> set report2 name
> set report3 gender
>
> puts [db eval {
>     select distinct eav.* from eav
>         join eav as eav0 on eav.entity == eav0.entity
>             and eav0.entity == :pattern0 where eav.attribute == :report2
>     union
>     select distinct eav.* from eav
>         join eav as eav0 on eav.entity == eav0.entity
>         and eav0.entity == :pattern0 where eav.attribute == :report3
>         order by eav.id
> }]
> ===== end script =====
>
> The result is:
>
> 3 1 name Imogen 5 1 gender female 5 1 1 female
>

Reply via email to