# 2014-06-17
#
# 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 implements regression tests for SQLite library.  The
# focus of this script is testing automatic index creation logic.
#
# This file contains a single real-world test case that was giving
# suboptimal performance because of over-use of automatic indexes.
#

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


do_execsql_test autoindex2-100 {
  CREATE TABLE t1(
    t1_id largeint,
    did char(9),
    ptime largeint,
    exbyte char(4),
    pe_id int,
    field_id int,
    mass float,
    param10 float,
    param11 float,
    exmass float,
    deviation float,
    trange float,
    vstatus int,
    commit_status int,
    formula char(329),
    tier int DEFAULT 2,
    ssid int DEFAULT 0,
    last_operation largeint DEFAULT 0,
    admin_uuid int DEFAULT 0,
    previous_value float,
    job_id largeint,
    last_t1 largeint DEFAULT 0,
    data_t1 int,
    previous_date largeint DEFAULT 0,
    flg8 int DEFAULT 1,
    failed_fields char(100)
  );
  CREATE INDEX t1x0 on t1 (t1_id);
  CREATE INDEX t1x1 on t1 (ptime, vstatus);
  CREATE INDEX t1x2 on t1 (did, ssid, ptime, vstatus, exbyte, t1_id);
  CREATE INDEX t1x3 on t1 (job_id);
  
  CREATE TABLE t2(
    did char(9),
    client_did char(30),
    description char(49),
    uid int,
    tzid int,
    privilege int,
    param2 int,
    type char(30),
    subtype char(32),
    dparam1 char(7) DEFAULT '',
    param5 char(3) DEFAULT '',
    notional float DEFAULT 0.000000,
    create_time largeint,
    sample_time largeint DEFAULT 0,
    param6 largeint,
    frequency int,
    expiration largeint,
    uw_status int,
    next_sample largeint,
    last_sample largeint,
    reserve1 char(29) DEFAULT '',
    reserve2 char(29) DEFAULT '',
    reserve3 char(29) DEFAULT '',
    bxcdr char(19) DEFAULT 'XY',
    ssid int DEFAULT 1,
    last_t1_id largeint,
    reserve4 char(29) DEFAULT '',
    reserve5 char(29) DEFAULT '',
    param12 int DEFAULT 0,
    long_did char(100) DEFAULT '',
    gr_code int DEFAULT 0,
    drx char(100) DEFAULT '',
    parent_id char(9) DEFAULT '',
    param13 int DEFAULT 0,
    position float DEFAULT 1.000000,
    client_did3 char(100) DEFAULT '',
    client_did4 char(100) DEFAULT '',
    dlib_id char(9) DEFAULT ''
  );
  CREATE INDEX t2x0 on t2 (did);
  CREATE INDEX t2x1 on t2 (client_did);
  CREATE INDEX t2x2 on t2 (long_did);
  CREATE INDEX t2x3 on t2 (uid);
  CREATE INDEX t2x4 on t2 (param2);
  CREATE INDEX t2x5 on t2 (type);
  CREATE INDEX t2x6 on t2 (subtype);
  CREATE INDEX t2x7 on t2 (last_sample);
  CREATE INDEX t2x8 on t2 (param6);
  CREATE INDEX t2x9 on t2 (frequency);
  CREATE INDEX t2x10 on t2 (privilege);
  CREATE INDEX t2x11 on t2 (sample_time);
  CREATE INDEX t2x12 on t2 (notional);
  CREATE INDEX t2x13 on t2 (tzid);
  CREATE INDEX t2x14 on t2 (gr_code);
  CREATE INDEX t2x15 on t2 (parent_id);
  
  CREATE TABLE t3(
    uid int,
    param3 int,
    uuid int,
    acc_id int,
    cust_num int,
    numerix_id int,
    pfy char(29),
    param4 char(29),
    param15 int DEFAULT 0,
    flg7 int DEFAULT 0,
    param21 int DEFAULT 0,
    bxcdr char(2) DEFAULT 'PC',
    c31 int DEFAULT 0,
    c33 int DEFAULT 0,
    c35 int DEFAULT 0,
    c37 int,
    mgr_uuid int,
    back_up_uuid int,
    priv_mars int DEFAULT 0,
    is_qc int DEFAULT 0,
    c41 int DEFAULT 0,
    deleted int DEFAULT 0,
    c47 int DEFAULT 1
  );
  CREATE INDEX t3x0 on t3 (uid);
  CREATE INDEX t3x1 on t3 (param3);
  CREATE INDEX t3x2 on t3 (uuid);
  CREATE INDEX t3x3 on t3 (acc_id);
  CREATE INDEX t3x4 on t3 (param4);
  CREATE INDEX t3x5 on t3 (pfy);
  CREATE INDEX t3x6 on t3 (is_qc);
  SELECT count(*) FROM sqlite_master;
} {30}
do_execsql_test autoindex2-110 {
  ANALYZE sqlite_master;
  INSERT INTO sqlite_stat1 VALUES('t1','t1x3','10747267 260');
  INSERT INTO sqlite_stat1 VALUES('t1','t1x2','10747267 121 113 2 2 2 1');
  INSERT INTO sqlite_stat1 VALUES('t1','t1x1','10747267 50 40');
  INSERT INTO sqlite_stat1 VALUES('t1','t1x0','10747267 1');
  INSERT INTO sqlite_stat1 VALUES('t2','t2x15','39667 253');
  INSERT INTO sqlite_stat1 VALUES('t2','t2x14','39667 19834');
  INSERT INTO sqlite_stat1 VALUES('t2','t2x13','39667 13223');
  INSERT INTO sqlite_stat1 VALUES('t2','t2x12','39667 7');
  INSERT INTO sqlite_stat1 VALUES('t2','t2x11','39667 17');
  INSERT INTO sqlite_stat1 VALUES('t2','t2x10','39667 19834');
  INSERT INTO sqlite_stat1 VALUES('t2','t2x9','39667 7934');
  INSERT INTO sqlite_stat1 VALUES('t2','t2x8','39667 11');
  INSERT INTO sqlite_stat1 VALUES('t2','t2x7','39667 5');
  INSERT INTO sqlite_stat1 VALUES('t2','t2x6','39667 242');
  INSERT INTO sqlite_stat1 VALUES('t2','t2x5','39667 1984');
  INSERT INTO sqlite_stat1 VALUES('t2','t2x4','39667 4408');
  INSERT INTO sqlite_stat1 VALUES('t2','t2x3','39667 81');
  INSERT INTO sqlite_stat1 VALUES('t2','t2x2','39667 551');
  INSERT INTO sqlite_stat1 VALUES('t2','t2x1','39667 2');
  INSERT INTO sqlite_stat1 VALUES('t2','t2x0','39667 1');
  INSERT INTO sqlite_stat1 VALUES('t3','t3x6','569 285');
  INSERT INTO sqlite_stat1 VALUES('t3','t3x5','569 2');
  INSERT INTO sqlite_stat1 VALUES('t3','t3x4','569 2');
  INSERT INTO sqlite_stat1 VALUES('t3','t3x3','569 5');
  INSERT INTO sqlite_stat1 VALUES('t3','t3x2','569 3');
  INSERT INTO sqlite_stat1 VALUES('t3','t3x1','569 6');
  INSERT INTO sqlite_stat1 VALUES('t3','t3x0','569 1');
  ANALYZE sqlite_master;
} {}
do_execsql_test autoindex2-120 {
  EXPLAIN QUERY PLAN
  SELECT
     t1_id,
     t1.did,
     param2,
     param3,
     t1.ptime,
     t1.trange,
     t1.exmass,
     t1.mass,
     t1.vstatus,
     type,
     subtype,
     t1.deviation,
     t1.formula,
     dparam1,
     reserve1,
     reserve2,
     param4,
     t1.last_operation,
     t1.admin_uuid,
     t1.previous_value,
     t1.job_id,
     client_did, 
     t1.last_t1,
     t1.data_t1,
     t1.previous_date,
     param5,
     param6,
     mgr_uuid
  FROM
     t1,
     t2,
     t3
  WHERE
     t1.ptime > 1393520400
     AND param3<>9001
     AND t3.flg7 = 1
     AND t1.did = t2.did
     AND t2.uid = t3.uid
  ORDER BY t1.ptime desc LIMIT 500;
} {0 0 0 {SEARCH TABLE t1 USING INDEX t1x1 (ptime>?)} 0 1 1 {SEARCH TABLE t2 USING INDEX t2x0 (did=?)} 0 2 2 {SEARCH TABLE t3 USING INDEX t3x0 (uid=?)}}
#
# ^^^--- Before being fixed, the above was using an automatic covering
# on t3 and reordering the tables so that t3 was in the outer loop and
# implementing the ORDER BY clause using a B-Tree.

do_execsql_test autoindex2-120 {
  EXPLAIN QUERY PLAN
  SELECT
     t1_id,
     t1.did,
     param2,
     param3,
     t1.ptime,
     t1.trange,
     t1.exmass,
     t1.mass,
     t1.vstatus,
     type,
     subtype,
     t1.deviation,
     t1.formula,
     dparam1,
     reserve1,
     reserve2,
     param4,
     t1.last_operation,
     t1.admin_uuid,
     t1.previous_value,
     t1.job_id,
     client_did, 
     t1.last_t1,
     t1.data_t1,
     t1.previous_date,
     param5,
     param6,
     mgr_uuid
  FROM
     t3,
     t2,
     t1
  WHERE
     t1.ptime > 1393520400
     AND param3<>9001
     AND t3.flg7 = 1
     AND t1.did = t2.did
     AND t2.uid = t3.uid
  ORDER BY t1.ptime desc LIMIT 500;
} {0 0 2 {SEARCH TABLE t1 USING INDEX t1x1 (ptime>?)} 0 1 1 {SEARCH TABLE t2 USING INDEX t2x0 (did=?)} 0 2 0 {SEARCH TABLE t3 USING INDEX t3x0 (uid=?)}}

finish_test
