# 2018-09-09
#
# The author disclaims copyright to this source code.  In place of
# a legal notice, here is a blessing:
#
#    May you do good and not evil.
#    May you find forgiveness for yourself and forgive others.
#    May you share freely, never taking more than you give.
#
#***********************************************************************
# 

set testdir [file dirname $argv0]
source $testdir/tester.tcl
set testprefix bestindex6

ifcapable !vtab {
  finish_test
  return
}

register_tcl_module db

proc vtab_command {src method args} {
  switch -- $method {
    xConnect {
      return [db one {SELECT sql FROM sqlite_master where name = $src}]
    }

    xBestIndex {
      set clist [lindex $args 0]
      set wlist 1

      set iCons 0
      set ret [list]
      foreach cons $clist {
        catch { array unset C }
        array set C $cons

        if {$C(usable)} {
          set col [db one {
            SELECT name FROM pragma_table_info($src) WHERE cid=$C(column)
          }]
          switch $C(op) {
            isnull {
              lappend wlist "$col IS NULL"
              lappend ret omit $iCons
            }
            eq {
              lappend wlist "$col = %$iCons%"
              lappend ret omit $iCons
            }
          }
        }
        incr iCons
      }
      #puts "xBestIndex: $ret"
      lappend ret idxStr [join $wlist " AND "]
      return $ret
    }

    xFilter {
      foreach {idxnum idxstr aa} $args {}
      set map [list]
      for {set iCons 0} {$iCons < [llength $aa]} {incr iCons} {
        lappend map %$iCons% [lindex $aa $iCons]
      }
      set ret [list sql \
          "SELECT rowid, * FROM $src WHERE [string map $map $idxstr]"
      ]
      # puts "xFilter: $ret"
      return $ret
    }

  }

  return {}
}

do_execsql_test 1.0 {
  CREATE TABLE t1(id int, value text);
  CREATE TABLE t2(ctx int, id int, value text); 

  INSERT INTO t1 VALUES(1,'try');
  INSERT INTO t2 VALUES(1,1,'good');
  INSERT INTO t2 VALUES(2,2,'evil');

  CREATE VIRTUAL TABLE vt1 USING tcl(vtab_command t1);
  CREATE VIRTUAL TABLE vt2 USING tcl(vtab_command t2);
}

do_execsql_test 1.1 {
  select * from t2 left join t1 on t1.id=t2.ctx where t1.value is null;
} {2 2 evil {} {}}

do_execsql_test 1.2 {
  select * from vt2 left join vt1 on vt1.id=vt2.ctx where vt1.value is null; 
} {2 2 evil {} {}}

unset -nocomplain xxx
do_execsql_test 1.3 {
  select * from vt2 left join vt1 on vt1.id=vt2.ctx where vt1.value is $xxx; 
} {2 2 evil {} {}}

do_execsql_test 1.4 {
  select * from t2 left join vt1 on vt1.id=t2.ctx where vt1.value = 3
} {}

finish_test
