The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
.timer off
.mode list
select load_extension('perlvtab.so');

drop table if exists entities;
drop table if exists attributes;
drop table if exists value_s;
drop table if exists eav;

create table entities   (id integer primary key, entity    integer, unique (entity)     );
create table attributes (id integer primary key, attribute varchar, unique (attribute) );
create table value_s    (id integer primary key, value     integer, unique (value)    );

create table eav (
    entity    integer references entities(id),
    attribute integer references attributes(id),
    value     integer references value_s(id),
    primary key (entity,attribute)
);

insert into entities (entity) values ('Joe');
insert into entities (entity) values ('Bob');
insert into entities (entity) values ('Sally');
insert into entities (entity) values ('Jim');
insert into entities (entity) values ('Sue');

insert into attributes (attribute) values ('Height');
insert into attributes (attribute) values ('Hair');
insert into attributes (attribute) values ('Eyes');

insert into value_s (value) values ('color_1');
insert into value_s (value) values ('color_2');
insert into value_s (value) values ('color_3');
insert into value_s (value) values ('color_4');
insert into value_s (value) values ('color_5');

insert into eav (entity,attribute,value)
select e.id,a.id, (e.id * a.id % 5) + 1
from entities e,attributes a
where a.attribute in ('Hair','Eyes');

insert into value_s (id,value) 
select e.id + (10 * a.id) + 100,
e.id + (10 * a.id) + 100
from entities e,attributes a
where a.attribute in ('Height');

insert into eav (entity,attribute,value)
select e.id, a.id, e.id + (10 * a.id) + 100
from entities e,attributes a
where a.attribute in ('Height');

select eav.entity,e.entity,a.attribute,v.value
from eav
    inner join entities   e on eav.entity=e.id
    inner join attributes a on eav.attribute=a.id
    inner join value_s    v on eav.value=v.id;

drop table if exists  eav_pivot;

create virtual table
     eav_pivot using perl ("SQLite::VirtualTable::Pivot",
        "eav",
        "entity->entity(id).entity",
        "attribute->attributes(id).attribute",
        "value->value_s(id).value"
        );

select * from eav;

select * from eav_pivot;

select * from eav_pivot where height > 113;