/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact c0a9c67f2efa98b6fae12acb8a28348d231a481d:


0000: 23 20 32 30 31 31 20 4d 61 72 63 68 20 32 0a 23  # 2011 March 2.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a  you give..#.#***
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 0a 23 20 4d 61 6b 65 20 73 75 72 65  ****.# Make sure
0170: 20 74 68 65 20 72 74 72 65 65 6e 6f 64 65 28 29   the rtreenode()
0180: 20 74 65 73 74 69 6e 67 20 66 75 6e 63 74 69 6f   testing functio
0190: 6e 20 63 61 6e 20 68 61 6e 64 6c 65 20 65 6e 74  n can handle ent
01a0: 72 69 65 73 20 77 69 74 68 0a 23 20 36 34 2d 62  ries with.# 64-b
01b0: 69 74 20 72 6f 77 69 64 73 2e 0a 23 20 0a 0a 69  it rowids..# ..i
01c0: 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
01d0: 20 74 65 73 74 64 69 72 5d 7d 20 7b 0a 20 20 73   testdir]} {.  s
01e0: 65 74 20 74 65 73 74 64 69 72 20 5b 66 69 6c 65  et testdir [file
01f0: 20 6a 6f 69 6e 20 5b 66 69 6c 65 20 64 69 72 6e   join [file dirn
0200: 61 6d 65 20 5b 69 6e 66 6f 20 73 63 72 69 70 74  ame [info script
0210: 5d 5d 20 2e 2e 20 2e 2e 20 74 65 73 74 5d 0a 7d  ]] .. .. test].}
0220: 20 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64 69   .source $testdi
0230: 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 69 66 63  r/tester.tcl.ifc
0240: 61 70 61 62 6c 65 20 21 72 74 72 65 65 20 7b 20  apable !rtree { 
0250: 66 69 6e 69 73 68 5f 74 65 73 74 20 3b 20 72 65  finish_test ; re
0260: 74 75 72 6e 20 7d 0a 73 65 74 20 74 65 73 74 70  turn }.set testp
0270: 72 65 66 69 78 20 72 74 72 65 65 43 0a 0a 64 6f  refix rtreeC..do
0280: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e  _execsql_test 1.
0290: 30 20 7b 0a 20 20 43 52 45 41 54 45 20 56 49 52  0 {.  CREATE VIR
02a0: 54 55 41 4c 20 54 41 42 4c 45 20 72 5f 74 72 65  TUAL TABLE r_tre
02b0: 65 20 55 53 49 4e 47 20 72 74 72 65 65 28 69 64  e USING rtree(id
02c0: 2c 20 6d 69 6e 5f 78 2c 20 6d 61 78 5f 78 2c 20  , min_x, max_x, 
02d0: 6d 69 6e 5f 79 2c 20 6d 61 78 5f 79 29 3b 0a 20  min_y, max_y);. 
02e0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28   CREATE TABLE t(
02f0: 78 2c 20 79 29 3b 0a 7d 0a 0a 64 6f 5f 65 71 70  x, y);.}..do_eqp
0300: 5f 74 65 73 74 20 31 2e 31 20 7b 0a 20 20 53 45  _test 1.1 {.  SE
0310: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 72 5f 74 72  LECT * FROM r_tr
0320: 65 65 2c 20 74 20 0a 20 20 57 48 45 52 45 20 74  ee, t .  WHERE t
0330: 2e 78 3e 3d 6d 69 6e 5f 78 20 41 4e 44 20 74 2e  .x>=min_x AND t.
0340: 78 3c 3d 6d 61 78 5f 78 20 41 4e 44 20 74 2e 79  x<=max_x AND t.y
0350: 3e 3d 6d 69 6e 5f 79 20 41 4e 44 20 74 2e 78 3c  >=min_y AND t.x<
0360: 3d 6d 61 78 5f 79 0a 7d 20 7b 0a 20 20 30 20 30  =max_y.} {.  0 0
0370: 20 31 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74   1 {SCAN TABLE t
0380: 7d 0a 20 20 30 20 31 20 30 20 7b 53 43 41 4e 20  }.  0 1 0 {SCAN 
0390: 54 41 42 4c 45 20 72 5f 74 72 65 65 20 56 49 52  TABLE r_tree VIR
03a0: 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58  TUAL TABLE INDEX
03b0: 20 32 3a 44 33 42 32 44 31 42 30 7d 0a 7d 0a 0a   2:D3B2D1B0}.}..
03c0: 64 6f 5f 65 71 70 5f 74 65 73 74 20 31 2e 32 20  do_eqp_test 1.2 
03d0: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
03e0: 4d 20 74 2c 20 72 5f 74 72 65 65 0a 20 20 57 48  M t, r_tree.  WH
03f0: 45 52 45 20 74 2e 78 3e 3d 6d 69 6e 5f 78 20 41  ERE t.x>=min_x A
0400: 4e 44 20 74 2e 78 3c 3d 6d 61 78 5f 78 20 41 4e  ND t.x<=max_x AN
0410: 44 20 74 2e 79 3e 3d 6d 69 6e 5f 79 20 41 4e 44  D t.y>=min_y AND
0420: 20 74 2e 78 3c 3d 6d 61 78 5f 79 0a 7d 20 7b 0a   t.x<=max_y.} {.
0430: 20 20 30 20 30 20 30 20 7b 53 43 41 4e 20 54 41    0 0 0 {SCAN TA
0440: 42 4c 45 20 74 7d 0a 20 20 30 20 31 20 31 20 7b  BLE t}.  0 1 1 {
0450: 53 43 41 4e 20 54 41 42 4c 45 20 72 5f 74 72 65  SCAN TABLE r_tre
0460: 65 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  e VIRTUAL TABLE 
0470: 49 4e 44 45 58 20 32 3a 44 33 42 32 44 31 42 30  INDEX 2:D3B2D1B0
0480: 7d 0a 7d 0a 0a 64 6f 5f 65 71 70 5f 74 65 73 74  }.}..do_eqp_test
0490: 20 31 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20   1.3 {.  SELECT 
04a0: 2a 20 46 52 4f 4d 20 74 2c 20 72 5f 74 72 65 65  * FROM t, r_tree
04b0: 0a 20 20 57 48 45 52 45 20 74 2e 78 3e 3d 6d 69  .  WHERE t.x>=mi
04c0: 6e 5f 78 20 41 4e 44 20 74 2e 78 3c 3d 6d 61 78  n_x AND t.x<=max
04d0: 5f 78 20 41 4e 44 20 74 2e 79 3e 3d 6d 69 6e 5f  _x AND t.y>=min_
04e0: 79 20 41 4e 44 20 3f 3c 3d 6d 61 78 5f 79 0a 7d  y AND ?<=max_y.}
04f0: 20 7b 0a 20 20 30 20 30 20 30 20 7b 53 43 41 4e   {.  0 0 0 {SCAN
0500: 20 54 41 42 4c 45 20 74 7d 0a 20 20 30 20 31 20   TABLE t}.  0 1 
0510: 31 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 72 5f  1 {SCAN TABLE r_
0520: 74 72 65 65 20 56 49 52 54 55 41 4c 20 54 41 42  tree VIRTUAL TAB
0530: 4c 45 20 49 4e 44 45 58 20 32 3a 44 33 42 32 44  LE INDEX 2:D3B2D
0540: 31 42 30 7d 0a 7d 0a 0a 64 6f 5f 65 71 70 5f 74  1B0}.}..do_eqp_t
0550: 65 73 74 20 31 2e 35 20 7b 0a 20 20 53 45 4c 45  est 1.5 {.  SELE
0560: 43 54 20 2a 20 46 52 4f 4d 20 74 2c 20 72 5f 74  CT * FROM t, r_t
0570: 72 65 65 0a 7d 20 7b 0a 20 20 30 20 30 20 31 20  ree.} {.  0 0 1 
0580: 7b 53 43 41 4e 20 54 41 42 4c 45 20 72 5f 74 72  {SCAN TABLE r_tr
0590: 65 65 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  ee VIRTUAL TABLE
05a0: 20 49 4e 44 45 58 20 32 3a 7d 0a 20 20 30 20 31   INDEX 2:}.  0 1
05b0: 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74   0 {SCAN TABLE t
05c0: 7d 20 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  } .}..do_execsql
05d0: 5f 74 65 73 74 20 32 2e 30 20 7b 0a 20 20 49 4e  _test 2.0 {.  IN
05e0: 53 45 52 54 20 49 4e 54 4f 20 74 20 56 41 4c 55  SERT INTO t VALU
05f0: 45 53 28 30 2c 20 30 29 3b 0a 20 20 49 4e 53 45  ES(0, 0);.  INSE
0600: 52 54 20 49 4e 54 4f 20 74 20 56 41 4c 55 45 53  RT INTO t VALUES
0610: 28 30 2c 20 31 29 3b 0a 20 20 49 4e 53 45 52 54  (0, 1);.  INSERT
0620: 20 49 4e 54 4f 20 74 20 56 41 4c 55 45 53 28 30   INTO t VALUES(0
0630: 2c 20 32 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , 2);.  INSERT I
0640: 4e 54 4f 20 74 20 56 41 4c 55 45 53 28 30 2c 20  NTO t VALUES(0, 
0650: 33 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  3);.  INSERT INT
0660: 4f 20 74 20 56 41 4c 55 45 53 28 30 2c 20 34 29  O t VALUES(0, 4)
0670: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
0680: 74 20 56 41 4c 55 45 53 28 30 2c 20 35 29 3b 0a  t VALUES(0, 5);.
0690: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 20    INSERT INTO t 
06a0: 56 41 4c 55 45 53 28 30 2c 20 36 29 3b 0a 20 20  VALUES(0, 6);.  
06b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 20 56 41  INSERT INTO t VA
06c0: 4c 55 45 53 28 30 2c 20 37 29 3b 0a 20 20 49 4e  LUES(0, 7);.  IN
06d0: 53 45 52 54 20 49 4e 54 4f 20 74 20 56 41 4c 55  SERT INTO t VALU
06e0: 45 53 28 30 2c 20 38 29 3b 0a 20 20 49 4e 53 45  ES(0, 8);.  INSE
06f0: 52 54 20 49 4e 54 4f 20 74 20 56 41 4c 55 45 53  RT INTO t VALUES
0700: 28 30 2c 20 39 29 3b 0a 0a 20 20 49 4e 53 45 52  (0, 9);..  INSER
0710: 54 20 49 4e 54 4f 20 74 20 53 45 4c 45 43 54 20  T INTO t SELECT 
0720: 78 2b 31 2c 20 79 20 46 52 4f 4d 20 74 3b 0a 20  x+1, y FROM t;. 
0730: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 20 53   INSERT INTO t S
0740: 45 4c 45 43 54 20 78 2b 32 2c 20 79 20 46 52 4f  ELECT x+2, y FRO
0750: 4d 20 74 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  M t;.  INSERT IN
0760: 54 4f 20 74 20 53 45 4c 45 43 54 20 78 2b 34 2c  TO t SELECT x+4,
0770: 20 79 20 46 52 4f 4d 20 74 3b 0a 20 20 49 4e 53   y FROM t;.  INS
0780: 45 52 54 20 49 4e 54 4f 20 72 5f 74 72 65 65 20  ERT INTO r_tree 
0790: 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 78 2d 31  SELECT NULL, x-1
07a0: 2c 20 78 2b 31 2c 20 79 2d 31 2c 20 79 2b 31 20  , x+1, y-1, y+1 
07b0: 46 52 4f 4d 20 74 3b 0a 20 20 41 4e 41 4c 59 5a  FROM t;.  ANALYZ
07c0: 45 3b 0a 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a 73  E;.}..db close.s
07d0: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
07e0: 62 0a 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 32  b..do_eqp_test 2
07f0: 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20  .1 {.  SELECT * 
0800: 46 52 4f 4d 20 72 5f 74 72 65 65 2c 20 74 20 0a  FROM r_tree, t .
0810: 20 20 57 48 45 52 45 20 74 2e 78 3e 3d 6d 69 6e    WHERE t.x>=min
0820: 5f 78 20 41 4e 44 20 74 2e 78 3c 3d 6d 61 78 5f  _x AND t.x<=max_
0830: 78 20 41 4e 44 20 74 2e 79 3e 3d 6d 69 6e 5f 79  x AND t.y>=min_y
0840: 20 41 4e 44 20 74 2e 78 3c 3d 6d 61 78 5f 79 0a   AND t.x<=max_y.
0850: 7d 20 7b 0a 20 20 30 20 30 20 31 20 7b 53 43 41  } {.  0 0 1 {SCA
0860: 4e 20 54 41 42 4c 45 20 74 7d 0a 20 20 30 20 31  N TABLE t}.  0 1
0870: 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 72   0 {SCAN TABLE r
0880: 5f 74 72 65 65 20 56 49 52 54 55 41 4c 20 54 41  _tree VIRTUAL TA
0890: 42 4c 45 20 49 4e 44 45 58 20 32 3a 44 33 42 32  BLE INDEX 2:D3B2
08a0: 44 31 42 30 7d 0a 7d 0a 0a 64 6f 5f 65 71 70 5f  D1B0}.}..do_eqp_
08b0: 74 65 73 74 20 32 2e 32 20 7b 0a 20 20 53 45 4c  test 2.2 {.  SEL
08c0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 2c 20 72 5f  ECT * FROM t, r_
08d0: 74 72 65 65 0a 20 20 57 48 45 52 45 20 74 2e 78  tree.  WHERE t.x
08e0: 3e 3d 6d 69 6e 5f 78 20 41 4e 44 20 74 2e 78 3c  >=min_x AND t.x<
08f0: 3d 6d 61 78 5f 78 20 41 4e 44 20 74 2e 79 3e 3d  =max_x AND t.y>=
0900: 6d 69 6e 5f 79 20 41 4e 44 20 74 2e 78 3c 3d 6d  min_y AND t.x<=m
0910: 61 78 5f 79 0a 7d 20 7b 0a 20 20 30 20 30 20 30  ax_y.} {.  0 0 0
0920: 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 7d 0a   {SCAN TABLE t}.
0930: 20 20 30 20 31 20 31 20 7b 53 43 41 4e 20 54 41    0 1 1 {SCAN TA
0940: 42 4c 45 20 72 5f 74 72 65 65 20 56 49 52 54 55  BLE r_tree VIRTU
0950: 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20 32  AL TABLE INDEX 2
0960: 3a 44 33 42 32 44 31 42 30 7d 0a 7d 0a 0a 64 6f  :D3B2D1B0}.}..do
0970: 5f 65 71 70 5f 74 65 73 74 20 32 2e 33 20 7b 0a  _eqp_test 2.3 {.
0980: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
0990: 74 2c 20 72 5f 74 72 65 65 0a 20 20 57 48 45 52  t, r_tree.  WHER
09a0: 45 20 74 2e 78 3e 3d 6d 69 6e 5f 78 20 41 4e 44  E t.x>=min_x AND
09b0: 20 74 2e 78 3c 3d 6d 61 78 5f 78 20 41 4e 44 20   t.x<=max_x AND 
09c0: 74 2e 79 3e 3d 6d 69 6e 5f 79 20 41 4e 44 20 3f  t.y>=min_y AND ?
09d0: 3c 3d 6d 61 78 5f 79 0a 7d 20 7b 0a 20 20 30 20  <=max_y.} {.  0 
09e0: 30 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20  0 0 {SCAN TABLE 
09f0: 74 7d 0a 20 20 30 20 31 20 31 20 7b 53 43 41 4e  t}.  0 1 1 {SCAN
0a00: 20 54 41 42 4c 45 20 72 5f 74 72 65 65 20 56 49   TABLE r_tree VI
0a10: 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45  RTUAL TABLE INDE
0a20: 58 20 32 3a 44 33 42 32 44 31 42 30 7d 0a 7d 0a  X 2:D3B2D1B0}.}.
0a30: 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 32 2e 35  .do_eqp_test 2.5
0a40: 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52   {.  SELECT * FR
0a50: 4f 4d 20 74 2c 20 72 5f 74 72 65 65 0a 7d 20 7b  OM t, r_tree.} {
0a60: 0a 20 20 30 20 30 20 31 20 7b 53 43 41 4e 20 54  .  0 0 1 {SCAN T
0a70: 41 42 4c 45 20 72 5f 74 72 65 65 20 56 49 52 54  ABLE r_tree VIRT
0a80: 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20  UAL TABLE INDEX 
0a90: 32 3a 7d 0a 20 20 30 20 31 20 30 20 7b 53 43 41  2:}.  0 1 0 {SCA
0aa0: 4e 20 54 41 42 4c 45 20 74 7d 20 0a 7d 0a 0a 23  N TABLE t} .}..#
0ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
0b00: 20 74 68 61 74 20 74 68 65 20 73 70 65 63 69 61   that the specia
0b10: 6c 20 43 52 4f 53 53 20 4a 4f 49 4e 20 68 61 6e  l CROSS JOIN han
0b20: 64 6c 69 6e 67 20 77 6f 72 6b 73 20 77 69 74 68  dling works with
0b30: 20 72 74 72 65 65 20 74 61 62 6c 65 73 2e 0a 23   rtree tables..#
0b40: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
0b50: 20 33 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20   3.1 {.  CREATE 
0b60: 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 43  TABLE t1(x);.  C
0b70: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 79  REATE TABLE t2(y
0b80: 29 3b 0a 20 20 43 52 45 41 54 45 20 56 49 52 54  );.  CREATE VIRT
0b90: 55 41 4c 20 54 41 42 4c 45 20 74 33 20 55 53 49  UAL TABLE t3 USI
0ba0: 4e 47 20 72 74 72 65 65 28 7a 2c 20 78 31 2c 78  NG rtree(z, x1,x
0bb0: 32 2c 20 79 31 2c 79 32 29 3b 0a 7d 0a 0a 64 6f  2, y1,y2);.}..do
0bc0: 5f 65 71 70 5f 74 65 73 74 20 33 2e 32 2e 31 20  _eqp_test 3.2.1 
0bd0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
0be0: 74 31 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74 32  t1 CROSS JOIN t2
0bf0: 20 7d 20 7b 0a 20 20 30 20 30 20 30 20 7b 53 43   } {.  0 0 0 {SC
0c00: 41 4e 20 54 41 42 4c 45 20 74 31 7d 20 0a 20 20  AN TABLE t1} .  
0c10: 30 20 31 20 31 20 7b 53 43 41 4e 20 54 41 42 4c  0 1 1 {SCAN TABL
0c20: 45 20 74 32 7d 0a 7d 0a 64 6f 5f 65 71 70 5f 74  E t2}.}.do_eqp_t
0c30: 65 73 74 20 33 2e 32 2e 32 20 7b 20 53 45 4c 45  est 3.2.2 { SELE
0c40: 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 43 52 4f  CT * FROM t2 CRO
0c50: 53 53 20 4a 4f 49 4e 20 74 31 20 7d 20 7b 0a 20  SS JOIN t1 } {. 
0c60: 20 30 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42   0 0 0 {SCAN TAB
0c70: 4c 45 20 74 32 7d 20 30 20 31 20 31 20 7b 53 43  LE t2} 0 1 1 {SC
0c80: 41 4e 20 54 41 42 4c 45 20 74 31 7d 0a 7d 0a 0a  AN TABLE t1}.}..
0c90: 64 6f 5f 65 71 70 5f 74 65 73 74 20 33 2e 33 2e  do_eqp_test 3.3.
0ca0: 31 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  1 { SELECT * FRO
0cb0: 4d 20 74 31 20 43 52 4f 53 53 20 4a 4f 49 4e 20  M t1 CROSS JOIN 
0cc0: 74 33 20 7d 20 7b 0a 20 20 30 20 30 20 30 20 7b  t3 } {.  0 0 0 {
0cd0: 53 43 41 4e 20 54 41 42 4c 45 20 74 31 7d 0a 20  SCAN TABLE t1}. 
0ce0: 20 30 20 31 20 31 20 7b 53 43 41 4e 20 54 41 42   0 1 1 {SCAN TAB
0cf0: 4c 45 20 74 33 20 56 49 52 54 55 41 4c 20 54 41  LE t3 VIRTUAL TA
0d00: 42 4c 45 20 49 4e 44 45 58 20 32 3a 7d 20 0a 7d  BLE INDEX 2:} .}
0d10: 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 33 2e 33  .do_eqp_test 3.3
0d20: 2e 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  .2 { SELECT * FR
0d30: 4f 4d 20 74 33 20 43 52 4f 53 53 20 4a 4f 49 4e  OM t3 CROSS JOIN
0d40: 20 74 31 20 7d 20 7b 0a 20 20 30 20 30 20 30 20   t1 } {.  0 0 0 
0d50: 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 33 20 56  {SCAN TABLE t3 V
0d60: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44  IRTUAL TABLE IND
0d70: 45 58 20 32 3a 7d 20 0a 20 20 30 20 31 20 31 20  EX 2:} .  0 1 1 
0d80: 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 31 7d 0a  {SCAN TABLE t1}.
0d90: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
0da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0dd0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
0de0: 74 68 61 74 20 4c 45 46 54 20 4a 4f 49 4e 73 20  that LEFT JOINs 
0df0: 61 72 65 20 6e 6f 74 20 72 65 6f 72 64 65 72 65  are not reordere
0e00: 64 20 69 66 20 74 68 65 20 72 69 67 68 74 2d 68  d if the right-h
0e10: 61 6e 64 2d 73 69 64 65 20 69 73 0a 23 20 61 20  and-side is.# a 
0e20: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 23  virtual table..#
0e30: 0a 72 65 73 65 74 5f 64 62 0a 64 6f 5f 65 78 65  .reset_db.do_exe
0e40: 63 73 71 6c 5f 74 65 73 74 20 34 2e 31 20 7b 0a  csql_test 4.1 {.
0e50: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
0e60: 31 28 61 29 3b 0a 20 20 43 52 45 41 54 45 20 56  1(a);.  CREATE V
0e70: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 32 20  IRTUAL TABLE t2 
0e80: 55 53 49 4e 47 20 72 74 72 65 65 28 62 2c 20 78  USING rtree(b, x
0e90: 31 2c 78 32 29 3b 0a 0a 20 20 49 4e 53 45 52 54  1,x2);..  INSERT
0ea0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
0eb0: 31 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  1);.  INSERT INT
0ec0: 4f 20 74 31 20 56 41 4c 55 45 53 28 32 29 3b 0a  O t1 VALUES(2);.
0ed0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
0ee0: 32 20 56 41 4c 55 45 53 28 31 2c 20 30 2e 30 2c  2 VALUES(1, 0.0,
0ef0: 20 30 2e 31 29 3b 0a 20 20 49 4e 53 45 52 54 20   0.1);.  INSERT 
0f00: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 33  INTO t2 VALUES(3
0f10: 2c 20 30 2e 30 2c 20 30 2e 31 29 3b 0a 7d 0a 0a  , 0.0, 0.1);.}..
0f20: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0f30: 34 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 61  4.2 {.  SELECT a
0f40: 2c 20 62 20 46 52 4f 4d 20 74 31 20 4c 45 46 54  , b FROM t1 LEFT
0f50: 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 28 2b 61 20   JOIN t2 ON (+a 
0f60: 3d 20 2b 62 29 3b 0a 7d 20 7b 31 20 31 20 32 20  = +b);.} {1 1 2 
0f70: 7b 7d 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  {}}..do_execsql_
0f80: 74 65 73 74 20 34 2e 33 20 7b 0a 20 20 53 45 4c  test 4.3 {.  SEL
0f90: 45 43 54 20 62 2c 20 61 20 46 52 4f 4d 20 74 32  ECT b, a FROM t2
0fa0: 20 4c 45 46 54 20 4a 4f 49 4e 20 74 31 20 4f 4e   LEFT JOIN t1 ON
0fb0: 20 28 2b 61 20 3d 20 2b 62 29 3b 0a 7d 20 7b 31   (+a = +b);.} {1
0fc0: 20 31 20 33 20 7b 7d 7d 0a 0a 23 2d 2d 2d 2d 2d   1 3 {}}..#-----
0fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1010: 23 20 54 65 73 74 20 74 68 61 74 20 74 68 65 20  # Test that the 
1020: 73 71 6c 69 74 65 5f 73 74 61 74 31 20 64 61 74  sqlite_stat1 dat
1030: 61 20 69 73 20 75 73 65 64 20 63 6f 72 72 65 63  a is used correc
1040: 74 6c 79 2e 0a 23 0a 72 65 73 65 74 5f 64 62 0a  tly..#.reset_db.
1050: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
1060: 35 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20 54  5.1 {.  CREATE T
1070: 41 42 4c 45 20 74 31 28 78 20 50 52 49 4d 41 52  ABLE t1(x PRIMAR
1080: 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 43 52 45  Y KEY, y);.  CRE
1090: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
10a0: 45 20 72 74 20 55 53 49 4e 47 20 72 74 72 65 65  E rt USING rtree
10b0: 28 69 64 2c 20 78 31 2c 20 78 32 29 3b 0a 0a 20  (id, x1, x2);.. 
10c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28   INSERT INTO t1(
10d0: 78 29 20 56 41 4c 55 45 53 28 31 29 3b 0a 20 20  x) VALUES(1);.  
10e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 78  INSERT INTO t1(x
10f0: 29 20 53 45 4c 45 43 54 20 78 2b 31 20 46 52 4f  ) SELECT x+1 FRO
1100: 4d 20 74 31 3b 20 20 20 2d 2d 20 20 20 32 0a 20  M t1;   --   2. 
1110: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28   INSERT INTO t1(
1120: 78 29 20 53 45 4c 45 43 54 20 78 2b 32 20 46 52  x) SELECT x+2 FR
1130: 4f 4d 20 74 31 3b 20 20 20 2d 2d 20 20 20 34 0a  OM t1;   --   4.
1140: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
1150: 28 78 29 20 53 45 4c 45 43 54 20 78 2b 34 20 46  (x) SELECT x+4 F
1160: 52 4f 4d 20 74 31 3b 20 20 20 2d 2d 20 20 20 38  ROM t1;   --   8
1170: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
1180: 31 28 78 29 20 53 45 4c 45 43 54 20 78 2b 38 20  1(x) SELECT x+8 
1190: 46 52 4f 4d 20 74 31 3b 20 20 20 2d 2d 20 20 31  FROM t1;   --  1
11a0: 36 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  6.  INSERT INTO 
11b0: 74 31 28 78 29 20 53 45 4c 45 43 54 20 78 2b 31  t1(x) SELECT x+1
11c0: 36 20 46 52 4f 4d 20 74 31 3b 20 20 2d 2d 20 20  6 FROM t1;  --  
11d0: 33 32 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  32.  INSERT INTO
11e0: 20 74 31 28 78 29 20 53 45 4c 45 43 54 20 78 2b   t1(x) SELECT x+
11f0: 33 32 20 46 52 4f 4d 20 74 31 3b 20 20 2d 2d 20  32 FROM t1;  -- 
1200: 20 36 34 0a 20 20 49 4e 53 45 52 54 20 49 4e 54   64.  INSERT INT
1210: 4f 20 74 31 28 78 29 20 53 45 4c 45 43 54 20 78  O t1(x) SELECT x
1220: 2b 36 34 20 46 52 4f 4d 20 74 31 3b 20 20 2d 2d  +64 FROM t1;  --
1230: 20 31 32 38 0a 20 20 49 4e 53 45 52 54 20 49 4e   128.  INSERT IN
1240: 54 4f 20 74 31 28 78 29 20 53 45 4c 45 43 54 20  TO t1(x) SELECT 
1250: 78 2b 31 32 38 20 46 52 4f 4d 20 74 31 3b 20 2d  x+128 FROM t1; -
1260: 2d 20 32 35 36 0a 20 20 49 4e 53 45 52 54 20 49  - 256.  INSERT I
1270: 4e 54 4f 20 74 31 28 78 29 20 53 45 4c 45 43 54  NTO t1(x) SELECT
1280: 20 78 2b 32 35 36 20 46 52 4f 4d 20 74 31 3b 20   x+256 FROM t1; 
1290: 2d 2d 20 35 31 32 0a 20 20 49 4e 53 45 52 54 20  -- 512.  INSERT 
12a0: 49 4e 54 4f 20 74 31 28 78 29 20 53 45 4c 45 43  INTO t1(x) SELEC
12b0: 54 20 78 2b 35 31 32 20 46 52 4f 4d 20 74 31 3b  T x+512 FROM t1;
12c0: 20 2d 2d 31 30 32 34 0a 0a 20 20 49 4e 53 45 52   --1024..  INSER
12d0: 54 20 49 4e 54 4f 20 72 74 20 53 45 4c 45 43 54  T INTO rt SELECT
12e0: 20 78 2c 20 78 2c 20 78 2b 31 20 46 52 4f 4d 20   x, x, x+1 FROM 
12f0: 74 31 20 57 48 45 52 45 20 78 3c 3d 35 3b 0a 7d  t1 WHERE x<=5;.}
1300: 0a 0a 23 20 46 69 72 73 74 20 74 65 73 74 20 61  ..# First test a
1310: 20 71 75 65 72 79 20 77 69 74 68 20 6e 6f 20 41   query with no A
1320: 4e 41 4c 59 5a 45 20 64 61 74 61 20 61 74 20 61  NALYZE data at a
1330: 6c 6c 2e 20 54 68 65 20 6f 75 74 65 72 20 6c 6f  ll. The outer lo
1340: 6f 70 20 69 73 0a 23 20 72 65 61 6c 20 74 61 62  op is.# real tab
1350: 6c 65 20 22 74 31 22 2e 0a 23 0a 64 6f 5f 65 71  le "t1"..#.do_eq
1360: 70 5f 74 65 73 74 20 35 2e 32 20 7b 0a 20 20 53  p_test 5.2 {.  S
1370: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c  ELECT * FROM t1,
1380: 20 72 74 20 57 48 45 52 45 20 78 3d 3d 69 64 3b   rt WHERE x==id;
1390: 0a 7d 20 7b 0a 20 20 30 20 30 20 30 20 7b 53 43  .} {.  0 0 0 {SC
13a0: 41 4e 20 54 41 42 4c 45 20 74 31 7d 20 0a 20 20  AN TABLE t1} .  
13b0: 30 20 31 20 31 20 7b 53 43 41 4e 20 54 41 42 4c  0 1 1 {SCAN TABL
13c0: 45 20 72 74 20 56 49 52 54 55 41 4c 20 54 41 42  E rt VIRTUAL TAB
13d0: 4c 45 20 49 4e 44 45 58 20 31 3a 7d 0a 7d 0a 0a  LE INDEX 1:}.}..
13e0: 23 20 4e 6f 77 20 63 72 65 61 74 65 20 65 6e 6f  # Now create eno
13f0: 75 67 68 20 41 4e 41 4c 59 5a 45 20 64 61 74 61  ugh ANALYZE data
1400: 20 74 6f 20 74 65 6c 6c 20 53 51 4c 69 74 65 20   to tell SQLite 
1410: 74 68 61 74 20 76 69 72 74 75 61 6c 20 74 61 62  that virtual tab
1420: 6c 65 20 22 72 74 22 0a 23 20 63 6f 6e 74 61 69  le "rt".# contai
1430: 6e 73 20 76 65 72 79 20 66 65 77 20 72 6f 77 73  ns very few rows
1440: 2e 20 54 68 69 73 20 63 61 75 73 65 73 20 69 74  . This causes it
1450: 20 74 6f 20 6d 6f 76 65 20 22 72 74 22 20 74 6f   to move "rt" to
1460: 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e   the outer loop.
1470: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
1480: 73 74 20 35 2e 33 20 7b 0a 20 20 41 4e 41 4c 59  st 5.3 {.  ANALY
1490: 5a 45 3b 0a 20 20 44 45 4c 45 54 45 20 46 52 4f  ZE;.  DELETE FRO
14a0: 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 57  M sqlite_stat1 W
14b0: 48 45 52 45 20 74 62 6c 3d 27 74 31 27 3b 0a 7d  HERE tbl='t1';.}
14c0: 0a 64 62 20 63 6c 6f 73 65 0a 73 71 6c 69 74 65  .db close.sqlite
14d0: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 64 6f 5f  3 db test.db.do_
14e0: 65 71 70 5f 74 65 73 74 20 35 2e 34 20 7b 0a 20  eqp_test 5.4 {. 
14f0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1500: 31 2c 20 72 74 20 57 48 45 52 45 20 78 3d 3d 69  1, rt WHERE x==i
1510: 64 3b 0a 7d 20 7b 0a 20 20 30 20 30 20 31 20 7b  d;.} {.  0 0 1 {
1520: 53 43 41 4e 20 54 41 42 4c 45 20 72 74 20 56 49  SCAN TABLE rt VI
1530: 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45  RTUAL TABLE INDE
1540: 58 20 32 3a 7d 20 0a 20 20 30 20 31 20 30 20 7b  X 2:} .  0 1 0 {
1550: 53 45 41 52 43 48 20 54 41 42 4c 45 20 74 31 20  SEARCH TABLE t1 
1560: 55 53 49 4e 47 20 49 4e 44 45 58 20 73 71 6c 69  USING INDEX sqli
1570: 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 74 31 5f  te_autoindex_t1_
1580: 31 20 28 78 3d 3f 29 7d 0a 7d 0a 0a 23 20 44 65  1 (x=?)}.}..# De
1590: 6c 65 74 65 20 74 68 65 20 41 4e 41 4c 59 5a 45  lete the ANALYZE
15a0: 20 64 61 74 61 2e 20 22 74 31 22 20 73 68 6f 75   data. "t1" shou
15b0: 6c 64 20 62 65 20 74 68 65 20 6f 75 74 65 72 20  ld be the outer 
15c0: 6c 6f 6f 70 20 61 67 61 69 6e 2e 0a 23 0a 64 6f  loop again..#.do
15d0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 35 2e  _execsql_test 5.
15e0: 35 20 7b 20 44 52 4f 50 20 54 41 42 4c 45 20 73  5 { DROP TABLE s
15f0: 71 6c 69 74 65 5f 73 74 61 74 31 3b 20 7d 0a 64  qlite_stat1; }.d
1600: 62 20 63 6c 6f 73 65 0a 73 71 6c 69 74 65 33 20  b close.sqlite3 
1610: 64 62 20 74 65 73 74 2e 64 62 0a 64 6f 5f 65 71  db test.db.do_eq
1620: 70 5f 74 65 73 74 20 35 2e 36 20 7b 0a 20 20 53  p_test 5.6 {.  S
1630: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c  ELECT * FROM t1,
1640: 20 72 74 20 57 48 45 52 45 20 78 3d 3d 69 64 3b   rt WHERE x==id;
1650: 0a 7d 20 7b 0a 20 20 30 20 30 20 30 20 7b 53 43  .} {.  0 0 0 {SC
1660: 41 4e 20 54 41 42 4c 45 20 74 31 7d 20 0a 20 20  AN TABLE t1} .  
1670: 30 20 31 20 31 20 7b 53 43 41 4e 20 54 41 42 4c  0 1 1 {SCAN TABL
1680: 45 20 72 74 20 56 49 52 54 55 41 4c 20 54 41 42  E rt VIRTUAL TAB
1690: 4c 45 20 49 4e 44 45 58 20 31 3a 7d 0a 7d 0a 0a  LE INDEX 1:}.}..
16a0: 23 20 54 68 69 73 20 74 69 6d 65 20 63 72 65 61  # This time crea
16b0: 74 65 20 61 6e 64 20 61 74 74 61 63 68 20 61 20  te and attach a 
16c0: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f  database that co
16d0: 6e 74 61 69 6e 73 20 41 4e 41 4c 59 5a 45 20 64  ntains ANALYZE d
16e0: 61 74 61 20 66 6f 72 0a 23 20 74 61 62 6c 65 73  ata for.# tables
16f0: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   of the same nam
1700: 65 73 20 61 73 20 74 68 6f 73 65 20 75 73 65 64  es as those used
1710: 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 76   internally by v
1720: 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 23 20 22  irtual table.# "
1730: 72 74 22 2e 20 43 68 65 63 6b 20 74 68 61 74 20  rt". Check that 
1740: 74 68 65 20 72 74 72 65 65 20 6d 6f 64 75 6c 65  the rtree module
1750: 20 69 73 20 6e 6f 74 20 66 6f 6f 6c 65 64 20 69   is not fooled i
1760: 6e 74 6f 20 75 73 69 6e 67 20 74 68 69 73 20 64  nto using this d
1770: 61 74 61 2e 0a 23 20 54 61 62 6c 65 20 22 74 31  ata..# Table "t1
1780: 22 20 73 68 6f 75 6c 64 20 72 65 6d 61 69 6e 20  " should remain 
1790: 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a  the outer loop..
17a0: 23 0a 64 6f 5f 74 65 73 74 20 35 2e 37 20 7b 0a  #.do_test 5.7 {.
17b0: 20 20 64 62 20 62 61 63 6b 75 70 20 74 65 73 74    db backup test
17c0: 2e 64 62 32 0a 20 20 73 71 6c 69 74 65 33 20 64  .db2.  sqlite3 d
17d0: 62 32 20 74 65 73 74 2e 64 62 32 0a 20 20 64 62  b2 test.db2.  db
17e0: 32 20 65 76 61 6c 20 7b 0a 20 20 20 20 41 4e 41  2 eval {.    ANA
17f0: 4c 59 5a 45 3b 0a 20 20 20 20 44 45 4c 45 54 45  LYZE;.    DELETE
1800: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61   FROM sqlite_sta
1810: 74 31 20 57 48 45 52 45 20 74 62 6c 3d 27 74 31  t1 WHERE tbl='t1
1820: 27 3b 0a 20 20 7d 0a 20 20 64 62 32 20 63 6c 6f  ';.  }.  db2 clo
1830: 73 65 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20  se.  db close.  
1840: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
1850: 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 41  db.  execsql { A
1860: 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 32 27  TTACH 'test.db2'
1870: 20 41 53 20 61 75 78 3b 20 7d 0a 7d 20 7b 7d 0a   AS aux; }.} {}.
1880: 64 6f 5f 65 71 70 5f 74 65 73 74 20 35 2e 38 20  do_eqp_test 5.8 
1890: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
18a0: 4d 20 74 31 2c 20 72 74 20 57 48 45 52 45 20 78  M t1, rt WHERE x
18b0: 3d 3d 69 64 3b 0a 7d 20 7b 0a 20 20 30 20 30 20  ==id;.} {.  0 0 
18c0: 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 31  0 {SCAN TABLE t1
18d0: 7d 20 0a 20 20 30 20 31 20 31 20 7b 53 43 41 4e  } .  0 1 1 {SCAN
18e0: 20 54 41 42 4c 45 20 72 74 20 56 49 52 54 55 41   TABLE rt VIRTUA
18f0: 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20 31 3a  L TABLE INDEX 1:
1900: 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.}..#----------
1910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
1950: 74 20 74 68 61 74 20 68 61 76 69 6e 67 20 61 20  t that having a 
1960: 73 65 63 6f 6e 64 20 63 6f 6e 6e 65 63 74 69 6f  second connectio
1970: 6e 20 64 72 6f 70 20 74 68 65 20 73 71 6c 69 74  n drop the sqlit
1980: 65 5f 73 74 61 74 31 20 74 61 62 6c 65 0a 23 20  e_stat1 table.# 
1990: 62 65 66 6f 72 65 20 69 74 20 69 73 20 72 65 71  before it is req
19a0: 75 69 72 65 64 20 62 79 20 72 74 72 65 65 43 6f  uired by rtreeCo
19b0: 6e 6e 65 63 74 28 29 20 64 6f 65 73 20 6e 6f 74  nnect() does not
19c0: 20 63 61 75 73 65 20 70 72 6f 62 6c 65 6d 73 2e   cause problems.
19d0: 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 72 74 72  .#.ifcapable rtr
19e0: 65 65 20 7b 0a 20 20 72 65 73 65 74 5f 64 62 0a  ee {.  reset_db.
19f0: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
1a00: 74 20 36 2e 31 20 7b 0a 20 20 20 20 43 52 45 41  t 6.1 {.    CREA
1a10: 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a  TE TABLE t1(x);.
1a20: 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55      CREATE VIRTU
1a30: 41 4c 20 54 41 42 4c 45 20 72 74 20 55 53 49 4e  AL TABLE rt USIN
1a40: 47 20 72 74 72 65 65 28 69 64 2c 20 78 31 2c 20  G rtree(id, x1, 
1a50: 78 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  x2);.    INSERT 
1a60: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
1a70: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
1a80: 54 4f 20 72 74 20 56 41 4c 55 45 53 28 31 2c 32  TO rt VALUES(1,2
1a90: 2c 33 29 3b 0a 20 20 20 20 41 4e 41 4c 59 5a 45  ,3);.    ANALYZE
1aa0: 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65  ;.  }.  db close
1ab0: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
1ac0: 73 74 2e 64 62 0a 20 20 64 6f 5f 65 78 65 63 73  st.db.  do_execs
1ad0: 71 6c 5f 74 65 73 74 20 36 2e 32 20 7b 20 53 45  ql_test 6.2 { SE
1ae0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
1af0: 20 7b 31 7d 0a 20 20 0a 20 20 64 6f 5f 74 65 73   {1}.  .  do_tes
1b00: 74 20 36 2e 33 20 7b 0a 20 20 20 20 73 71 6c 69  t 6.3 {.    sqli
1b10: 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a  te3 db2 test.db.
1b20: 20 20 20 20 64 62 32 20 65 76 61 6c 20 7b 20 44      db2 eval { D
1b30: 52 4f 50 20 54 41 42 4c 45 20 73 71 6c 69 74 65  ROP TABLE sqlite
1b40: 5f 73 74 61 74 31 20 7d 0a 20 20 20 20 64 62 32  _stat1 }.    db2
1b50: 20 63 6c 6f 73 65 0a 20 20 20 20 65 78 65 63 73   close.    execs
1b60: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
1b70: 4f 4d 20 72 74 20 7d 0a 20 20 7d 20 7b 31 20 32  OM rt }.  } {1 2
1b80: 2e 30 20 33 2e 30 7d 0a 20 20 64 62 20 63 6c 6f  .0 3.0}.  db clo
1b90: 73 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  se.}..#---------
1ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
1be0: 73 74 20 74 68 61 74 20 71 75 65 72 69 65 73 20  st that queries 
1bf0: 66 65 61 74 75 72 69 6e 67 20 4c 45 46 54 20 6f  featuring LEFT o
1c00: 72 20 43 52 4f 53 53 20 4a 4f 49 4e 53 20 61 72  r CROSS JOINS ar
1c10: 65 20 68 61 6e 64 6c 65 64 20 63 6f 72 72 65 63  e handled correc
1c20: 74 6c 79 2e 0a 23 20 48 61 6e 64 6c 65 64 20 63  tly..# Handled c
1c30: 6f 72 72 65 63 74 6c 79 20 69 6e 20 74 68 69 73  orrectly in this
1c40: 20 63 61 73 65 20 6d 65 61 6e 73 3a 0a 23 0a 23   case means:.#.#
1c50: 20 20 20 2a 20 54 65 72 6d 73 20 77 69 74 68 20     * Terms with 
1c60: 70 72 65 72 65 71 73 20 74 68 61 74 20 61 70 70  prereqs that app
1c70: 65 61 72 20 74 6f 20 74 68 65 20 6c 65 66 74 20  ear to the left 
1c80: 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 61  of a LEFT JOIN a
1c90: 67 61 69 6e 73 74 0a 23 20 20 20 20 20 74 68 65  gainst.#     the
1ca0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 61   virtual table a
1cb0: 72 65 20 61 6c 77 61 79 73 20 61 76 61 69 6c 61  re always availa
1cc0: 62 6c 65 20 74 6f 20 78 42 65 73 74 49 6e 64 65  ble to xBestInde
1cd0: 78 2e 0a 23 0a 23 20 20 20 2a 20 54 65 72 6d 73  x..#.#   * Terms
1ce0: 20 77 69 74 68 20 70 72 65 72 65 71 73 20 74 68   with prereqs th
1cf0: 61 74 20 61 70 70 65 61 72 20 74 6f 20 74 68 65  at appear to the
1d00: 20 72 69 67 68 74 20 6f 66 20 61 20 4c 45 46 54   right of a LEFT
1d10: 20 4a 4f 49 4e 20 61 67 61 69 6e 73 74 0a 23 20   JOIN against.# 
1d20: 20 20 20 20 74 68 65 20 76 69 72 74 75 61 6c 20      the virtual 
1d30: 74 61 62 6c 65 20 61 72 65 20 6e 65 76 65 72 20  table are never 
1d40: 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 78 42 65  available to xBe
1d50: 73 74 49 6e 64 65 78 2e 0a 23 0a 23 20 41 6e 64  stIndex..#.# And
1d60: 20 74 68 65 20 73 61 6d 65 20 62 65 68 61 76 69   the same behavi
1d70: 6f 75 72 20 66 6f 72 20 43 52 4f 53 53 20 6a 6f  our for CROSS jo
1d80: 69 6e 73 2e 0a 23 0a 72 65 73 65 74 5f 64 62 0a  ins..#.reset_db.
1d90: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
1da0: 37 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54  7.0 {.  CREATE T
1db0: 41 42 4c 45 20 78 64 69 72 28 78 31 29 3b 0a 20  ABLE xdir(x1);. 
1dc0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 79 64   CREATE TABLE yd
1dd0: 69 72 28 79 31 29 3b 0a 20 20 43 52 45 41 54 45  ir(y1);.  CREATE
1de0: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 72   VIRTUAL TABLE r
1df0: 74 20 55 53 49 4e 47 20 72 74 72 65 65 5f 69 33  t USING rtree_i3
1e00: 32 28 69 64 2c 20 78 6d 69 6e 2c 20 78 6d 61 78  2(id, xmin, xmax
1e10: 2c 20 79 6d 69 6e 2c 20 79 6d 61 78 29 3b 0a 0a  , ymin, ymax);..
1e20: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 64    INSERT INTO xd
1e30: 69 72 20 56 41 4c 55 45 53 28 35 29 3b 0a 20 20  ir VALUES(5);.  
1e40: 49 4e 53 45 52 54 20 49 4e 54 4f 20 79 64 69 72  INSERT INTO ydir
1e50: 20 56 41 4c 55 45 53 28 31 30 29 3b 0a 0a 20 20   VALUES(10);..  
1e60: 49 4e 53 45 52 54 20 49 4e 54 4f 20 72 74 20 56  INSERT INTO rt V
1e70: 41 4c 55 45 53 28 31 2c 20 32 2c 20 37 2c 20 31  ALUES(1, 2, 7, 1
1e80: 32 2c 20 31 34 29 3b 20 20 20 20 20 20 2d 2d 20  2, 14);      -- 
1e90: 4e 6f 74 20 61 20 68 69 74 0a 20 20 49 4e 53 45  Not a hit.  INSE
1ea0: 52 54 20 49 4e 54 4f 20 72 74 20 56 41 4c 55 45  RT INTO rt VALUE
1eb0: 53 28 32 2c 20 32 2c 20 37 2c 20 38 2c 20 31 32  S(2, 2, 7, 8, 12
1ec0: 29 3b 20 20 20 20 20 20 20 2d 2d 20 41 20 68 69  );       -- A hi
1ed0: 74 21 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  t!.  INSERT INTO
1ee0: 20 72 74 20 56 41 4c 55 45 53 28 33 2c 20 37 2c   rt VALUES(3, 7,
1ef0: 20 31 31 2c 20 38 2c 20 31 32 29 3b 20 20 20 20   11, 8, 12);    
1f00: 20 20 2d 2d 20 4e 6f 74 20 61 20 68 69 74 21 0a    -- Not a hit!.
1f10: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 72 74    INSERT INTO rt
1f20: 20 56 41 4c 55 45 53 28 34 2c 20 35 2c 20 35 2c   VALUES(4, 5, 5,
1f30: 20 31 30 2c 20 31 30 29 3b 20 20 20 20 20 20 2d   10, 10);      -
1f40: 2d 20 41 20 68 69 74 21 0a 0a 7d 0a 0a 70 72 6f  - A hit!..}..pro
1f50: 63 20 64 6f 5f 65 71 70 5f 65 78 65 63 73 71 6c  c do_eqp_execsql
1f60: 5f 74 65 73 74 20 7b 74 6e 20 73 71 6c 20 72 65  _test {tn sql re
1f70: 73 7d 20 7b 0a 20 20 73 65 74 20 71 75 65 72 79  s} {.  set query
1f80: 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20   "EXPLAIN QUERY 
1f90: 50 4c 41 4e 20 24 73 71 6c 20 3b 20 24 73 71 6c  PLAN $sql ; $sql
1fa0: 20 22 0a 20 20 75 70 6c 65 76 65 6c 20 5b 6c 69   ".  uplevel [li
1fb0: 73 74 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  st do_execsql_te
1fc0: 73 74 20 24 74 6e 20 24 71 75 65 72 79 20 24 72  st $tn $query $r
1fd0: 65 73 5d 0a 7d 0a 0a 64 6f 5f 65 71 70 5f 65 78  es].}..do_eqp_ex
1fe0: 65 63 73 71 6c 5f 74 65 73 74 20 37 2e 31 20 7b  ecsql_test 7.1 {
1ff0: 0a 20 20 53 45 4c 45 43 54 20 69 64 20 46 52 4f  .  SELECT id FRO
2000: 4d 20 78 64 69 72 2c 20 72 74 2c 20 79 64 69 72  M xdir, rt, ydir
2010: 20 0a 20 20 4f 4e 20 28 79 31 20 42 45 54 57 45   .  ON (y1 BETWE
2020: 45 4e 20 79 6d 69 6e 20 41 4e 44 20 79 6d 61 78  EN ymin AND ymax
2030: 29 0a 20 20 57 48 45 52 45 20 28 78 31 20 42 45  ).  WHERE (x1 BE
2040: 54 57 45 45 4e 20 78 6d 69 6e 20 41 4e 44 20 78  TWEEN xmin AND x
2050: 6d 61 78 29 3b 0a 7d 20 7b 0a 20 20 30 20 30 20  max);.} {.  0 0 
2060: 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 78 64  0 {SCAN TABLE xd
2070: 69 72 7d 20 0a 20 20 30 20 31 20 32 20 7b 53 43  ir} .  0 1 2 {SC
2080: 41 4e 20 54 41 42 4c 45 20 79 64 69 72 7d 20 0a  AN TABLE ydir} .
2090: 20 20 30 20 32 20 31 20 7b 53 43 41 4e 20 54 41    0 2 1 {SCAN TA
20a0: 42 4c 45 20 72 74 20 56 49 52 54 55 41 4c 20 54  BLE rt VIRTUAL T
20b0: 41 42 4c 45 20 49 4e 44 45 58 20 32 3a 42 32 44  ABLE INDEX 2:B2D
20c0: 33 42 30 44 31 7d 0a 20 20 32 20 34 0a 7d 0a 0a  3B0D1}.  2 4.}..
20d0: 64 6f 5f 65 71 70 5f 65 78 65 63 73 71 6c 5f 74  do_eqp_execsql_t
20e0: 65 73 74 20 37 2e 32 20 7b 0a 20 20 53 45 4c 45  est 7.2 {.  SELE
20f0: 43 54 20 2a 20 46 52 4f 4d 20 78 64 69 72 2c 20  CT * FROM xdir, 
2100: 72 74 20 4c 45 46 54 20 4a 4f 49 4e 20 79 64 69  rt LEFT JOIN ydi
2110: 72 20 0a 20 20 4f 4e 20 28 79 31 20 42 45 54 57  r .  ON (y1 BETW
2120: 45 45 4e 20 79 6d 69 6e 20 41 4e 44 20 79 6d 61  EEN ymin AND yma
2130: 78 29 0a 20 20 57 48 45 52 45 20 28 78 31 20 42  x).  WHERE (x1 B
2140: 45 54 57 45 45 4e 20 78 6d 69 6e 20 41 4e 44 20  ETWEEN xmin AND 
2150: 78 6d 61 78 29 3b 0a 7d 20 7b 0a 20 20 30 20 30  xmax);.} {.  0 0
2160: 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 78   0 {SCAN TABLE x
2170: 64 69 72 7d 20 0a 20 20 30 20 31 20 31 20 7b 53  dir} .  0 1 1 {S
2180: 43 41 4e 20 54 41 42 4c 45 20 72 74 20 56 49 52  CAN TABLE rt VIR
2190: 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58  TUAL TABLE INDEX
21a0: 20 32 3a 42 30 44 31 7d 0a 20 20 30 20 32 20 32   2:B0D1}.  0 2 2
21b0: 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 79 64 69   {SCAN TABLE ydi
21c0: 72 7d 20 0a 0a 20 20 35 20 31 20 32 20 37 20 31  r} ..  5 1 2 7 1
21d0: 32 20 31 34 20 7b 7d 0a 20 20 35 20 32 20 32 20  2 14 {}.  5 2 2 
21e0: 37 20 20 38 20 31 32 20 31 30 0a 20 20 35 20 34  7  8 12 10.  5 4
21f0: 20 35 20 35 20 31 30 20 31 30 20 31 30 0a 7d 0a   5 5 10 10 10.}.
2200: 0a 64 6f 5f 65 71 70 5f 65 78 65 63 73 71 6c 5f  .do_eqp_execsql_
2210: 74 65 73 74 20 37 2e 33 20 7b 0a 20 20 53 45 4c  test 7.3 {.  SEL
2220: 45 43 54 20 69 64 20 46 52 4f 4d 20 78 64 69 72  ECT id FROM xdir
2230: 2c 20 72 74 20 43 52 4f 53 53 20 4a 4f 49 4e 20  , rt CROSS JOIN 
2240: 79 64 69 72 20 0a 20 20 4f 4e 20 28 79 31 20 42  ydir .  ON (y1 B
2250: 45 54 57 45 45 4e 20 79 6d 69 6e 20 41 4e 44 20  ETWEEN ymin AND 
2260: 79 6d 61 78 29 0a 20 20 57 48 45 52 45 20 28 78  ymax).  WHERE (x
2270: 31 20 42 45 54 57 45 45 4e 20 78 6d 69 6e 20 41  1 BETWEEN xmin A
2280: 4e 44 20 78 6d 61 78 29 3b 0a 7d 20 7b 0a 20 20  ND xmax);.} {.  
2290: 30 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42 4c  0 0 0 {SCAN TABL
22a0: 45 20 78 64 69 72 7d 20 0a 20 20 30 20 31 20 31  E xdir} .  0 1 1
22b0: 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 72 74 20   {SCAN TABLE rt 
22c0: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e  VIRTUAL TABLE IN
22d0: 44 45 58 20 32 3a 42 30 44 31 7d 0a 20 20 30 20  DEX 2:B0D1}.  0 
22e0: 32 20 32 20 7b 53 43 41 4e 20 54 41 42 4c 45 20  2 2 {SCAN TABLE 
22f0: 79 64 69 72 7d 20 0a 20 20 32 20 34 0a 7d 0a 0a  ydir} .  2 4.}..
2300: 64 6f 5f 65 71 70 5f 65 78 65 63 73 71 6c 5f 74  do_eqp_execsql_t
2310: 65 73 74 20 37 2e 34 20 7b 0a 20 20 53 45 4c 45  est 7.4 {.  SELE
2320: 43 54 20 69 64 20 46 52 4f 4d 20 72 74 2c 20 78  CT id FROM rt, x
2330: 64 69 72 20 43 52 4f 53 53 20 4a 4f 49 4e 20 79  dir CROSS JOIN y
2340: 64 69 72 20 0a 20 20 4f 4e 20 28 79 31 20 42 45  dir .  ON (y1 BE
2350: 54 57 45 45 4e 20 79 6d 69 6e 20 41 4e 44 20 79  TWEEN ymin AND y
2360: 6d 61 78 29 0a 20 20 57 48 45 52 45 20 28 78 31  max).  WHERE (x1
2370: 20 42 45 54 57 45 45 4e 20 78 6d 69 6e 20 41 4e   BETWEEN xmin AN
2380: 44 20 78 6d 61 78 29 3b 0a 7d 20 7b 0a 20 20 30  D xmax);.} {.  0
2390: 20 30 20 31 20 7b 53 43 41 4e 20 54 41 42 4c 45   0 1 {SCAN TABLE
23a0: 20 78 64 69 72 7d 20 0a 20 20 30 20 31 20 30 20   xdir} .  0 1 0 
23b0: 7b 53 43 41 4e 20 54 41 42 4c 45 20 72 74 20 56  {SCAN TABLE rt V
23c0: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44  IRTUAL TABLE IND
23d0: 45 58 20 32 3a 42 30 44 31 7d 0a 20 20 30 20 32  EX 2:B0D1}.  0 2
23e0: 20 32 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 79   2 {SCAN TABLE y
23f0: 64 69 72 7d 20 0a 20 20 32 20 34 0a 7d 0a 0a 66  dir} .  2 4.}..f
2400: 69 6e 69 73 68 5f 74 65 73 74 0a                 inish_test.