Nested Outer Joins
-----------------
Example:
create table a(x int);
create table b(x int);
create table c(x int, y int);
insert into a values(1);
insert into a values(2);
insert into b values(3);
insert into c values(1, 3);
insert into c values(4, 5);
select * from a left outer join (b left outer join c on b.x = c.y) on a.x = c.x;
explain select * from a left outer join (b left outer join c on b.x = c.y) on a.x = c.x;
drop table a;
drop table b;
drop table c;

The following doesn't work correctly:
TableFilter,
    private void mapAndAddFilter(Expression on) throws SQLException {
        on.mapColumns(this, 0);
        if (join == null || on.isEverything(ExpressionVisitor.RESOLVED)) {
          addFilterCondition(on, true);
          on.createIndexConditions(session, this);
        }
        if (join != null) {
            join.mapAndAddFilter(on);
        }
    }

Auto Upgrade
-----------------
file conversion should be done automatically when the new engine connects.  

auto-upgrade application:
check if new version is available 
(option: digital signature)
if yes download new version
(option: http, https, ftp)
backup database to SQL script
(option: list of databases, use recovery mechanism)
install new version

ftp client
task to download new version from another HTTP / HTTPS / FTP server
multi-task


Direct Lookup
-----------------
drop table test;
create table test(id int, version int, idx int);
@LOOP 1000 insert into test values(1, 1, ?);
@LOOP 1000 insert into test values(1, 2, ?);
@LOOP 1000 insert into test values(2, 1, ?);
create index idx_test on test(id, version, idx);
@LOOP 1000 select max(id)+1 from test;
@LOOP 1000 select max(idx)+1 from test where id=1 and version=2;
@LOOP 1000 select max(id)+1 from test;
@LOOP 1000 select max(idx)+1 from test where id=1 and version=2;
@LOOP 1000 select max(id)+1 from test;
@LOOP 1000 select max(idx)+1 from test where id=1 and version=2;
-- should be direct query
