# 2018-05-16
#
# 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.
#
#***********************************************************************
# This file contains tests for the r-tree module, specifically the
# auxiliary column mechanism.

if {![info exists testdir]} {
  set testdir [file join [file dirname [info script]] .. .. test]
} 
source [file join [file dirname [info script]] rtree_util.tcl]
source $testdir/tester.tcl
ifcapable !rtree { finish_test ; return }

do_execsql_test rtreeH-100 {
  CREATE VIRTUAL TABLE t1 USING rtree(id,x0,x1,y0,y1,+label,+other);
  INSERT INTO t1(x0,x1,y0,y1,label) VALUES
    (0,10,0,10,'lower-left corner'),
    (0,10,90,100,'upper-left corner'),
    (90,100,0,10,'lower-right corner'),
    (90,100,90,100,'upper-right corner'),
    (40,60,40,60,'center'),
    (0,5,0,100,'left edge'),
    (95,100,0,100,'right edge'),
    (0,100,0,5,'bottom edge'),
    (0,100,95,100,'top edge'),
    (0,100,0,100,'the whole thing'),
    (0,50,0,100,'left half'),
    (51,100,0,100,'right half'),
    (0,100,0,50,'bottom half'),
    (0,100,51,100,'top half');
} {}
do_execsql_test rtreeH-101 {
  SELECT * FROM t1_rowid ORDER BY rowid
} {1 1 {lower-left corner} {} 2 1 {upper-left corner} {} 3 1 {lower-right corner} {} 4 1 {upper-right corner} {} 5 1 center {} 6 1 {left edge} {} 7 1 {right edge} {} 8 1 {bottom edge} {} 9 1 {top edge} {} 10 1 {the whole thing} {} 11 1 {left half} {} 12 1 {right half} {} 13 1 {bottom half} {} 14 1 {top half} {}}

do_execsql_test rtreeH-102 {
  SELECT * FROM t1 WHERE rowid=5;
} {5 40.0 60.0 40.0 60.0 center {}}
do_execsql_test rtreeH-102b {
  SELECT * FROM t1 WHERE rowid=5.0;
} {5 40.0 60.0 40.0 60.0 center {}}
do_execsql_test rtreeH-102c {
  SELECT * FROM t1 WHERE rowid='5';
} {5 40.0 60.0 40.0 60.0 center {}}
do_execsql_test rtreeH-102d {
  SELECT * FROM t1 WHERE rowid='0005';
} {5 40.0 60.0 40.0 60.0 center {}}
do_execsql_test rtreeH-102e {
  SELECT * FROM t1 WHERE rowid='+5.0e+0';
} {5 40.0 60.0 40.0 60.0 center {}}
do_execsql_test rtreeH-103 {
  SELECT * FROM t1 WHERE label='center';
} {5 40.0 60.0 40.0 60.0 center {}}

do_execsql_test rtreeH-104 {
  SELECT * FROM t1 WHERE rowid='+5.0e+0x';
} {}
do_execsql_test rtreeH-105 {
  SELECT * FROM t1 WHERE rowid=x'35';
} {}
do_execsql_test rtreeH-106 {
  SELECT * FROM t1 WHERE rowid=null;
} {}


do_rtree_integrity_test rtreeH-110 t1

do_execsql_test rtreeH-120 {
  SELECT label FROM t1 WHERE x1<=50 ORDER BY id
} {{lower-left corner} {upper-left corner} {left edge} {left half}}
do_execsql_test rtreeH-121 {
  SELECT label FROM t1 WHERE x1<=50 AND label NOT LIKE '%corner%' ORDER BY id
} {{left edge} {left half}}

do_execsql_test rtreeH-200 {
  WITH RECURSIVE
    c1(x) AS (VALUES(0) UNION ALL SELECT x+1 FROM c1 WHERE x<99),
    c2(y) AS (VALUES(0) UNION ALL SELECT y+1 FROM c2 WHERE y<99)
  INSERT INTO t1(id, x0,x1,y0,y1,label)
    SELECT 1000+x+y*100, x, x+1, y, y+1, printf('box-%d,%d',x,y) FROM c1, c2;
} {}

do_execsql_test rtreeH-210 {
  SELECT label FROM t1 WHERE x0>=48 AND x1<=50 AND y0>=48 AND y1<=50
     ORDER BY id;
} {box-48,48 box-49,48 box-48,49 box-49,49}

do_execsql_test rtreeH-300 {
  UPDATE t1 SET label='x'||label
    WHERE x0>=49 AND x1<=50 AND y0>=49 AND y1<=50;
  SELECT label FROM t1 WHERE x0>=48 AND x1<=50 AND y0>=48 AND y1<=50
     ORDER BY id;
} {box-48,48 box-49,48 box-48,49 xbox-49,49}

#-------------------------------------------------------------------------
reset_db
do_execsql_test rtreeH-300 {
  CREATE TABLE t0(c0);
  INSERT INTO t0(c0) VALUES (NULL);
  INSERT INTO t0(c0) VALUES (1);
  CREATE VIRTUAL TABLE t1 USING rtree(c0, c1, c2, +c3 BLOB );
  INSERT INTO t1(c2, c3, c0) VALUES (1, 2, 1);
}

do_execsql_test rtreeH-310 {
  SELECT 1 FROM t1 WHERE t1.c3;
} {1}

do_execsql_test rtreeH-320 {
  SELECT * FROM t0 WHERE NOT EXISTS (
      SELECT 1 FROM t1 WHERE t1.c3 OR t0.c0 ISNULL
  );
} {}

finish_test
