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

Artifact 058d0b331ae6840a61bbee910d8cbae27bfd5991:


0000: 23 20 32 30 31 30 20 41 70 72 69 6c 20 30 37 0a  # 2010 April 07.
0010: 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64  #.# The author d
0020: 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67  isclaims copyrig
0030: 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63  ht to this sourc
0040: 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63  e code.  In plac
0050: 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e  e of.# a legal n
0060: 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61  otice, here is a
0070: 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20   blessing:.#.#  
0080: 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f    May you do goo
0090: 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a  d and not evil..
00a0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e  #    May you fin
00b0: 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f  d forgiveness fo
00c0: 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66  r yourself and f
00d0: 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23  orgive others..#
00e0: 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72      May you shar
00f0: 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20  e freely, never 
0100: 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  taking more than
0110: 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 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 2a 2a 2a 0a 23 20 54 68 69 73 20 66  *******.# This f
0170: 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72  ile implements r
0180: 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74 73 20  egression tests 
0190: 66 6f 72 20 53 51 4c 69 74 65 20 6c 69 62 72 61  for SQLite libra
01a0: 72 79 2e 20 20 54 68 65 0a 23 20 66 6f 63 75 73  ry.  The.# focus
01b0: 20 6f 66 20 74 68 69 73 20 73 63 72 69 70 74 20   of this script 
01c0: 69 73 20 74 65 73 74 69 6e 67 20 61 75 74 6f 6d  is testing autom
01d0: 61 74 69 63 20 69 6e 64 65 78 20 63 72 65 61 74  atic index creat
01e0: 69 6f 6e 20 6c 6f 67 69 63 2e 0a 23 0a 0a 73 65  ion logic..#..se
01f0: 74 20 74 65 73 74 64 69 72 20 5b 66 69 6c 65 20  t testdir [file 
0200: 64 69 72 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a  dirname $argv0].
0210: 73 6f 75 72 63 65 20 24 74 65 73 74 64 69 72 2f  source $testdir/
0220: 74 65 73 74 65 72 2e 74 63 6c 0a 0a 23 20 49 66  tester.tcl..# If
0230: 20 74 68 65 20 6c 69 62 72 61 72 79 20 69 73 20   the library is 
0240: 6e 6f 74 20 63 6f 6d 70 69 6c 65 64 20 77 69 74  not compiled wit
0250: 68 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  h automatic inde
0260: 78 20 73 75 70 70 6f 72 74 20 74 68 65 6e 0a 23  x support then.#
0270: 20 73 6b 69 70 20 61 6c 6c 20 74 65 73 74 73 20   skip all tests 
0280: 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 0a 23 0a  in this file..#.
0290: 69 66 63 61 70 61 62 6c 65 20 7b 21 61 75 74 6f  ifcapable {!auto
02a0: 69 6e 64 65 78 7d 20 7b 0a 20 20 66 69 6e 69 73  index} {.  finis
02b0: 68 5f 74 65 73 74 0a 20 20 72 65 74 75 72 6e 0a  h_test.  return.
02c0: 7d 0a 0a 23 20 57 69 74 68 20 61 75 74 6f 6d 61  }..# With automa
02d0: 74 69 63 20 69 6e 64 65 78 20 74 75 72 6e 65 64  tic index turned
02e0: 20 6f 66 66 2c 20 77 65 20 64 6f 20 61 20 66 75   off, we do a fu
02f0: 6c 6c 20 73 63 61 6e 20 6f 66 20 74 68 65 20 54  ll scan of the T
0300: 32 20 74 61 62 6c 65 0a 64 6f 5f 74 65 73 74 20  2 table.do_test 
0310: 61 75 74 6f 69 6e 64 65 78 31 2d 31 30 30 20 7b  autoindex1-100 {
0320: 0a 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20  .  db eval {.   
0330: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
0340: 28 61 2c 62 29 3b 0a 20 20 20 20 49 4e 53 45 52  (a,b);.    INSER
0350: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
0360: 28 31 2c 31 31 29 3b 0a 20 20 20 20 49 4e 53 45  (1,11);.    INSE
0370: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
0380: 53 28 32 2c 32 32 29 3b 0a 20 20 20 20 49 4e 53  S(2,22);.    INS
0390: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
03a0: 43 54 20 61 2b 32 2c 20 62 2b 32 32 20 46 52 4f  CT a+2, b+22 FRO
03b0: 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
03c0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
03d0: 61 2b 34 2c 20 62 2b 34 34 20 46 52 4f 4d 20 74  a+4, b+44 FROM t
03e0: 31 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  1;.    CREATE TA
03f0: 42 4c 45 20 74 32 28 63 2c 64 29 3b 0a 20 20 20  BLE t2(c,d);.   
0400: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
0410: 53 45 4c 45 43 54 20 61 2c 20 39 30 30 2b 62 20  SELECT a, 900+b 
0420: 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 20 20 64  FROM t1;.  }.  d
0430: 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 50 52 41  b eval {.    PRA
0440: 47 4d 41 20 61 75 74 6f 6d 61 74 69 63 5f 69 6e  GMA automatic_in
0450: 64 65 78 3d 4f 46 46 3b 0a 20 20 20 20 53 45 4c  dex=OFF;.    SEL
0460: 45 43 54 20 62 2c 20 64 20 46 52 4f 4d 20 74 31  ECT b, d FROM t1
0470: 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 61 3d 63 20   JOIN t2 ON a=c 
0480: 4f 52 44 45 52 20 42 59 20 62 3b 0a 20 20 7d 0a  ORDER BY b;.  }.
0490: 7d 20 7b 31 31 20 39 31 31 20 32 32 20 39 32 32  } {11 911 22 922
04a0: 20 33 33 20 39 33 33 20 34 34 20 39 34 34 20 35   33 933 44 944 5
04b0: 35 20 39 35 35 20 36 36 20 39 36 36 20 37 37 20  5 955 66 966 77 
04c0: 39 37 37 20 38 38 20 39 38 38 7d 0a 64 6f 5f 74  977 88 988}.do_t
04d0: 65 73 74 20 61 75 74 6f 69 6e 64 65 78 31 2d 31  est autoindex1-1
04e0: 30 31 20 7b 0a 20 20 64 62 20 73 74 61 74 75 73  01 {.  db status
04f0: 20 73 74 65 70 0a 7d 20 7b 36 33 7d 0a 64 6f 5f   step.} {63}.do_
0500: 74 65 73 74 20 61 75 74 6f 69 6e 64 65 78 31 2d  test autoindex1-
0510: 31 30 32 20 7b 0a 20 20 64 62 20 73 74 61 74 75  102 {.  db statu
0520: 73 20 61 75 74 6f 69 6e 64 65 78 0a 7d 20 7b 30  s autoindex.} {0
0530: 7d 0a 0a 23 20 57 69 74 68 20 61 75 74 6f 69 6e  }..# With autoin
0540: 64 65 78 20 74 75 72 6e 65 64 20 6f 6e 2c 20 77  dex turned on, w
0550: 65 20 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78  e build an index
0560: 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 6e 20 75   once and then u
0570: 73 65 20 74 68 61 74 20 69 6e 64 65 78 0a 23 20  se that index.# 
0580: 74 6f 20 66 69 6e 64 20 54 32 20 76 61 6c 75 65  to find T2 value
0590: 73 2e 0a 64 6f 5f 74 65 73 74 20 61 75 74 6f 69  s..do_test autoi
05a0: 6e 64 65 78 31 2d 31 31 30 20 7b 0a 20 20 64 62  ndex1-110 {.  db
05b0: 20 65 76 61 6c 20 7b 0a 20 20 20 20 50 52 41 47   eval {.    PRAG
05c0: 4d 41 20 61 75 74 6f 6d 61 74 69 63 5f 69 6e 64  MA automatic_ind
05d0: 65 78 3d 4f 4e 3b 0a 20 20 20 20 53 45 4c 45 43  ex=ON;.    SELEC
05e0: 54 20 62 2c 20 64 20 46 52 4f 4d 20 74 31 20 4a  T b, d FROM t1 J
05f0: 4f 49 4e 20 74 32 20 4f 4e 20 61 3d 63 20 4f 52  OIN t2 ON a=c OR
0600: 44 45 52 20 42 59 20 62 3b 0a 20 20 7d 0a 7d 20  DER BY b;.  }.} 
0610: 7b 31 31 20 39 31 31 20 32 32 20 39 32 32 20 33  {11 911 22 922 3
0620: 33 20 39 33 33 20 34 34 20 39 34 34 20 35 35 20  3 933 44 944 55 
0630: 39 35 35 20 36 36 20 39 36 36 20 37 37 20 39 37  955 66 966 77 97
0640: 37 20 38 38 20 39 38 38 7d 0a 64 6f 5f 74 65 73  7 88 988}.do_tes
0650: 74 20 61 75 74 6f 69 6e 64 65 78 31 2d 31 31 31  t autoindex1-111
0660: 20 7b 0a 20 20 64 62 20 73 74 61 74 75 73 20 73   {.  db status s
0670: 74 65 70 0a 7d 20 7b 37 7d 0a 64 6f 5f 74 65 73  tep.} {7}.do_tes
0680: 74 20 61 75 74 6f 69 6e 64 65 78 31 2d 31 31 32  t autoindex1-112
0690: 20 7b 0a 20 20 64 62 20 73 74 61 74 75 73 20 61   {.  db status a
06a0: 75 74 6f 69 6e 64 65 78 0a 7d 20 7b 37 7d 0a 0a  utoindex.} {7}..
06b0: 23 20 54 68 65 20 73 61 6d 65 20 74 65 73 74 20  # The same test 
06c0: 61 73 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68  as above, but th
06d0: 69 73 20 74 69 6d 65 20 74 68 65 20 54 32 20 71  is time the T2 q
06e0: 75 65 72 79 20 69 73 20 61 20 73 75 62 71 75 65  uery is a subque
06f0: 72 79 20 72 61 74 68 65 72 0a 23 20 74 68 61 6e  ry rather.# than
0700: 20 61 20 6a 6f 69 6e 2e 0a 64 6f 5f 74 65 73 74   a join..do_test
0710: 20 61 75 74 6f 69 6e 64 65 78 31 2d 32 30 30 20   autoindex1-200 
0720: 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20  {.  db eval {.  
0730: 20 20 50 52 41 47 4d 41 20 61 75 74 6f 6d 61 74    PRAGMA automat
0740: 69 63 5f 69 6e 64 65 78 3d 4f 46 46 3b 0a 20 20  ic_index=OFF;.  
0750: 20 20 53 45 4c 45 43 54 20 62 2c 20 28 53 45 4c    SELECT b, (SEL
0760: 45 43 54 20 64 20 46 52 4f 4d 20 74 32 20 57 48  ECT d FROM t2 WH
0770: 45 52 45 20 63 3d 61 29 20 46 52 4f 4d 20 74 31  ERE c=a) FROM t1
0780: 3b 0a 20 20 7d 0a 7d 20 7b 31 31 20 39 31 31 20  ;.  }.} {11 911 
0790: 32 32 20 39 32 32 20 33 33 20 39 33 33 20 34 34  22 922 33 933 44
07a0: 20 39 34 34 20 35 35 20 39 35 35 20 36 36 20 39   944 55 955 66 9
07b0: 36 36 20 37 37 20 39 37 37 20 38 38 20 39 38 38  66 77 977 88 988
07c0: 7d 0a 64 6f 5f 74 65 73 74 20 61 75 74 6f 69 6e  }.do_test autoin
07d0: 64 65 78 31 2d 32 30 31 20 7b 0a 20 20 64 62 20  dex1-201 {.  db 
07e0: 73 74 61 74 75 73 20 73 74 65 70 0a 7d 20 7b 33  status step.} {3
07f0: 35 7d 0a 64 6f 5f 74 65 73 74 20 61 75 74 6f 69  5}.do_test autoi
0800: 6e 64 65 78 31 2d 32 30 32 20 7b 0a 20 20 64 62  ndex1-202 {.  db
0810: 20 73 74 61 74 75 73 20 61 75 74 6f 69 6e 64 65   status autoinde
0820: 78 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20  x.} {0}.do_test 
0830: 61 75 74 6f 69 6e 64 65 78 31 2d 32 31 30 20 7b  autoindex1-210 {
0840: 0a 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20  .  db eval {.   
0850: 20 50 52 41 47 4d 41 20 61 75 74 6f 6d 61 74 69   PRAGMA automati
0860: 63 5f 69 6e 64 65 78 3d 4f 4e 3b 0a 20 20 20 20  c_index=ON;.    
0870: 53 45 4c 45 43 54 20 62 2c 20 28 53 45 4c 45 43  SELECT b, (SELEC
0880: 54 20 64 20 46 52 4f 4d 20 74 32 20 57 48 45 52  T d FROM t2 WHER
0890: 45 20 63 3d 61 29 20 46 52 4f 4d 20 74 31 3b 0a  E c=a) FROM t1;.
08a0: 20 20 7d 0a 7d 20 7b 31 31 20 39 31 31 20 32 32    }.} {11 911 22
08b0: 20 39 32 32 20 33 33 20 39 33 33 20 34 34 20 39   922 33 933 44 9
08c0: 34 34 20 35 35 20 39 35 35 20 36 36 20 39 36 36  44 55 955 66 966
08d0: 20 37 37 20 39 37 37 20 38 38 20 39 38 38 7d 0a   77 977 88 988}.
08e0: 64 6f 5f 74 65 73 74 20 61 75 74 6f 69 6e 64 65  do_test autoinde
08f0: 78 31 2d 32 31 31 20 7b 0a 20 20 64 62 20 73 74  x1-211 {.  db st
0900: 61 74 75 73 20 73 74 65 70 0a 7d 20 7b 37 7d 0a  atus step.} {7}.
0910: 64 6f 5f 74 65 73 74 20 61 75 74 6f 69 6e 64 65  do_test autoinde
0920: 78 31 2d 32 31 32 20 7b 0a 20 20 64 62 20 73 74  x1-212 {.  db st
0930: 61 74 75 73 20 61 75 74 6f 69 6e 64 65 78 0a 7d  atus autoindex.}
0940: 20 7b 37 7d 0a 0a 0a 23 20 4d 6f 64 69 66 79 20   {7}...# Modify 
0950: 74 68 65 20 73 65 63 6f 6e 64 20 74 61 62 6c 65  the second table
0960: 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 77 68 69   of the join whi
0970: 6c 65 20 74 68 65 20 6a 6f 69 6e 20 69 73 20 69  le the join is i
0980: 6e 20 70 72 6f 67 72 65 73 73 0a 23 0a 64 6f 5f  n progress.#.do_
0990: 74 65 73 74 20 61 75 74 6f 69 6e 64 65 78 31 2d  test autoindex1-
09a0: 33 30 30 20 7b 0a 20 20 73 65 74 20 72 20 7b 7d  300 {.  set r {}
09b0: 0a 20 20 64 62 20 65 76 61 6c 20 7b 53 45 4c 45  .  db eval {SELE
09c0: 43 54 20 62 2c 20 64 20 46 52 4f 4d 20 74 31 20  CT b, d FROM t1 
09d0: 4a 4f 49 4e 20 74 32 20 4f 4e 20 28 63 3d 61 29  JOIN t2 ON (c=a)
09e0: 7d 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20  } {.    lappend 
09f0: 72 20 24 62 20 24 64 0a 20 20 20 20 64 62 20 65  r $b $d.    db e
0a00: 76 61 6c 20 7b 55 50 44 41 54 45 20 74 32 20 53  val {UPDATE t2 S
0a10: 45 54 20 64 3d 64 2b 31 7d 0a 20 20 7d 0a 20 20  ET d=d+1}.  }.  
0a20: 73 65 74 20 72 0a 7d 20 7b 31 31 20 39 31 31 20  set r.} {11 911 
0a30: 32 32 20 39 32 32 20 33 33 20 39 33 33 20 34 34  22 922 33 933 44
0a40: 20 39 34 34 20 35 35 20 39 35 35 20 36 36 20 39   944 55 955 66 9
0a50: 36 36 20 37 37 20 39 37 37 20 38 38 20 39 38 38  66 77 977 88 988
0a60: 7d 0a 64 6f 5f 74 65 73 74 20 61 75 74 6f 69 6e  }.do_test autoin
0a70: 64 65 78 31 2d 33 31 30 20 7b 0a 20 20 64 62 20  dex1-310 {.  db 
0a80: 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 64 20 46  eval {SELECT d F
0a90: 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20  ROM t2 ORDER BY 
0aa0: 64 7d 0a 7d 20 7b 39 31 39 20 39 33 30 20 39 34  d}.} {919 930 94
0ab0: 31 20 39 35 32 20 39 36 33 20 39 37 34 20 39 38  1 952 963 974 98
0ac0: 35 20 39 39 36 7d 0a 0a 23 20 54 68 65 20 6e 65  5 996}..# The ne
0ad0: 78 74 20 74 65 73 74 20 64 6f 65 73 20 61 20 31  xt test does a 1
0ae0: 30 2d 77 61 79 20 6a 6f 69 6e 20 6f 6e 20 75 6e  0-way join on un
0af0: 69 6e 64 65 78 65 64 20 74 61 62 6c 65 73 2e 20  indexed tables. 
0b00: 20 57 69 74 68 6f 75 74 0a 23 20 61 75 74 6f 6d   Without.# autom
0b10: 61 74 69 63 20 69 6e 64 69 63 65 73 2c 20 74 68  atic indices, th
0b20: 65 20 6a 6f 69 6e 20 77 69 6c 6c 20 74 61 6b 65  e join will take
0b30: 20 61 20 6c 6f 6e 67 20 74 69 6d 65 20 74 6f 20   a long time to 
0b40: 63 6f 6d 70 6c 65 74 65 2e 0a 23 20 57 69 74 68  complete..# With
0b50: 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 69 63   automatic indic
0b60: 65 73 2c 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e  es, it should on
0b70: 6c 79 20 74 61 6b 65 20 61 62 6f 75 74 20 61 20  ly take about a 
0b80: 73 65 63 6f 6e 64 2e 0a 23 0a 64 6f 5f 74 65 73  second..#.do_tes
0b90: 74 20 61 75 74 6f 69 6e 64 65 78 31 2d 34 30 30  t autoindex1-400
0ba0: 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 0a 20   {.  db eval {. 
0bb0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
0bc0: 74 34 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e  t4(a, b);.    IN
0bd0: 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c  SERT INTO t4 VAL
0be0: 55 45 53 28 31 2c 32 29 3b 0a 20 20 20 20 49 4e  UES(1,2);.    IN
0bf0: 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c  SERT INTO t4 VAL
0c00: 55 45 53 28 32 2c 33 29 3b 0a 20 20 7d 0a 20 20  UES(2,3);.  }.  
0c10: 66 6f 72 20 7b 73 65 74 20 6e 20 32 7d 20 7b 24  for {set n 2} {$
0c20: 6e 3c 34 30 39 36 7d 20 7b 73 65 74 20 6e 20 5b  n<4096} {set n [
0c30: 65 78 70 72 20 7b 24 6e 2b 24 6e 7d 5d 7d 20 7b  expr {$n+$n}]} {
0c40: 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b 49 4e  .    db eval {IN
0c50: 53 45 52 54 20 49 4e 54 4f 20 74 34 20 53 45 4c  SERT INTO t4 SEL
0c60: 45 43 54 20 61 2b 24 6e 2c 20 62 2b 24 6e 20 46  ECT a+$n, b+$n F
0c70: 52 4f 4d 20 74 34 7d 0a 20 20 7d 0a 20 20 64 62  ROM t4}.  }.  db
0c80: 20 65 76 61 6c 20 7b 0a 20 20 20 20 53 45 4c 45   eval {.    SELE
0c90: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
0ca0: 20 74 34 3b 0a 20 20 7d 0a 7d 20 7b 34 30 39 36   t4;.  }.} {4096
0cb0: 7d 0a 64 6f 5f 74 65 73 74 20 61 75 74 6f 69 6e  }.do_test autoin
0cc0: 64 65 78 31 2d 34 30 31 20 7b 0a 20 20 64 62 20  dex1-401 {.  db 
0cd0: 65 76 61 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  eval {.    SELEC
0ce0: 54 20 63 6f 75 6e 74 28 2a 29 0a 20 20 20 20 20  T count(*).     
0cf0: 20 46 52 4f 4d 20 74 34 20 41 53 20 78 31 0a 20   FROM t4 AS x1. 
0d00: 20 20 20 20 20 4a 4f 49 4e 20 74 34 20 41 53 20       JOIN t4 AS 
0d10: 78 32 20 4f 4e 20 78 32 2e 61 3d 78 31 2e 62 0a  x2 ON x2.a=x1.b.
0d20: 20 20 20 20 20 20 4a 4f 49 4e 20 74 34 20 41 53        JOIN t4 AS
0d30: 20 78 33 20 4f 4e 20 78 33 2e 61 3d 78 32 2e 62   x3 ON x3.a=x2.b
0d40: 0a 20 20 20 20 20 20 4a 4f 49 4e 20 74 34 20 41  .      JOIN t4 A
0d50: 53 20 78 34 20 4f 4e 20 78 34 2e 61 3d 78 33 2e  S x4 ON x4.a=x3.
0d60: 62 0a 20 20 20 20 20 20 4a 4f 49 4e 20 74 34 20  b.      JOIN t4 
0d70: 41 53 20 78 35 20 4f 4e 20 78 35 2e 61 3d 78 34  AS x5 ON x5.a=x4
0d80: 2e 62 0a 20 20 20 20 20 20 4a 4f 49 4e 20 74 34  .b.      JOIN t4
0d90: 20 41 53 20 78 36 20 4f 4e 20 78 36 2e 61 3d 78   AS x6 ON x6.a=x
0da0: 35 2e 62 0a 20 20 20 20 20 20 4a 4f 49 4e 20 74  5.b.      JOIN t
0db0: 34 20 41 53 20 78 37 20 4f 4e 20 78 37 2e 61 3d  4 AS x7 ON x7.a=
0dc0: 78 36 2e 62 0a 20 20 20 20 20 20 4a 4f 49 4e 20  x6.b.      JOIN 
0dd0: 74 34 20 41 53 20 78 38 20 4f 4e 20 78 38 2e 61  t4 AS x8 ON x8.a
0de0: 3d 78 37 2e 62 0a 20 20 20 20 20 20 4a 4f 49 4e  =x7.b.      JOIN
0df0: 20 74 34 20 41 53 20 78 39 20 4f 4e 20 78 39 2e   t4 AS x9 ON x9.
0e00: 61 3d 78 38 2e 62 0a 20 20 20 20 20 20 4a 4f 49  a=x8.b.      JOI
0e10: 4e 20 74 34 20 41 53 20 78 31 30 20 4f 4e 20 78  N t4 AS x10 ON x
0e20: 31 30 2e 61 3d 78 39 2e 62 3b 0a 20 20 7d 0a 7d  10.a=x9.b;.  }.}
0e30: 20 7b 34 30 38 37 7d 0a 0a 23 20 54 69 63 6b 65   {4087}..# Ticke
0e40: 74 20 5b 38 30 31 31 30 38 36 63 38 35 63 36 63  t [8011086c85c6c
0e50: 34 30 34 30 31 34 63 39 34 37 66 63 66 33 65 62  404014c947fcf3eb
0e60: 39 66 34 32 62 31 38 34 61 30 64 5d 20 66 72 6f  9f42b184a0d] fro
0e70: 6d 20 32 30 31 30 2d 30 37 2d 30 38 0a 23 20 4d  m 2010-07-08.# M
0e80: 61 6b 65 20 73 75 72 65 20 61 75 74 6f 6d 61 74  ake sure automat
0e90: 69 63 20 69 6e 64 69 63 65 73 20 61 72 65 20 6e  ic indices are n
0ea0: 6f 74 20 63 72 65 61 74 65 64 20 66 6f 72 20 74  ot created for t
0eb0: 68 65 20 52 48 53 20 6f 66 20 61 6e 20 49 4e 20  he RHS of an IN 
0ec0: 65 78 70 72 65 73 73 69 6f 6e 0a 23 20 74 68 61  expression.# tha
0ed0: 74 20 69 73 20 6e 6f 74 20 61 20 63 6f 72 72 65  t is not a corre
0ee0: 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 2e 0a  lated subquery..
0ef0: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
0f00: 74 20 61 75 74 6f 69 6e 64 65 78 31 2d 35 30 30  t autoindex1-500
0f10: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
0f20: 45 20 74 35 30 31 28 61 20 49 4e 54 45 47 45 52  E t501(a INTEGER
0f30: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29   PRIMARY KEY, b)
0f40: 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ;.  CREATE TABLE
0f50: 20 74 35 30 32 28 78 20 49 4e 54 45 47 45 52 20   t502(x INTEGER 
0f60: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b  PRIMARY KEY, y);
0f70: 0a 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  .  EXPLAIN QUERY
0f80: 20 50 4c 41 4e 0a 20 20 53 45 4c 45 43 54 20 62   PLAN.  SELECT b
0f90: 20 46 52 4f 4d 20 74 35 30 31 0a 20 20 20 57 48   FROM t501.   WH
0fa0: 45 52 45 20 74 35 30 31 2e 61 20 49 4e 20 28 53  ERE t501.a IN (S
0fb0: 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 35 30  ELECT x FROM t50
0fc0: 32 20 57 48 45 52 45 20 79 3d 3f 29 3b 0a 7d 20  2 WHERE y=?);.} 
0fd0: 7b 0a 20 20 30 20 30 20 30 20 7b 53 45 41 52 43  {.  0 0 0 {SEARC
0fe0: 48 20 54 41 42 4c 45 20 74 35 30 31 20 55 53 49  H TABLE t501 USI
0ff0: 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  NG INTEGER PRIMA
1000: 52 59 20 4b 45 59 20 28 72 6f 77 69 64 3d 3f 29  RY KEY (rowid=?)
1010: 20 28 7e 32 35 20 72 6f 77 73 29 7d 20 0a 20 20   (~25 rows)} .  
1020: 30 20 30 20 30 20 7b 45 58 45 43 55 54 45 20 4c  0 0 0 {EXECUTE L
1030: 49 53 54 20 53 55 42 51 55 45 52 59 20 31 7d 20  IST SUBQUERY 1} 
1040: 0a 20 20 31 20 30 20 30 20 7b 53 43 41 4e 20 54  .  1 0 0 {SCAN T
1050: 41 42 4c 45 20 74 35 30 32 20 28 7e 31 30 30 30  ABLE t502 (~1000
1060: 30 30 20 72 6f 77 73 29 7d 0a 7d 0a 64 6f 5f 65  00 rows)}.}.do_e
1070: 78 65 63 73 71 6c 5f 74 65 73 74 20 61 75 74 6f  xecsql_test auto
1080: 69 6e 64 65 78 31 2d 35 30 31 20 7b 0a 20 20 45  index1-501 {.  E
1090: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
10a0: 4e 0a 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f  N.  SELECT b FRO
10b0: 4d 20 74 35 30 31 0a 20 20 20 57 48 45 52 45 20  M t501.   WHERE 
10c0: 74 35 30 31 2e 61 20 49 4e 20 28 53 45 4c 45 43  t501.a IN (SELEC
10d0: 54 20 78 20 46 52 4f 4d 20 74 35 30 32 20 57 48  T x FROM t502 WH
10e0: 45 52 45 20 79 3d 74 35 30 31 2e 62 29 3b 0a 7d  ERE y=t501.b);.}
10f0: 20 7b 0a 20 20 30 20 30 20 30 20 7b 53 43 41 4e   {.  0 0 0 {SCAN
1100: 20 54 41 42 4c 45 20 74 35 30 31 20 28 7e 35 30   TABLE t501 (~50
1110: 30 30 30 30 20 72 6f 77 73 29 7d 20 0a 20 20 30  0000 rows)} .  0
1120: 20 30 20 30 20 7b 45 58 45 43 55 54 45 20 43 4f   0 0 {EXECUTE CO
1130: 52 52 45 4c 41 54 45 44 20 4c 49 53 54 20 53 55  RRELATED LIST SU
1140: 42 51 55 45 52 59 20 31 7d 20 0a 20 20 31 20 30  BQUERY 1} .  1 0
1150: 20 30 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45   0 {SEARCH TABLE
1160: 20 74 35 30 32 20 55 53 49 4e 47 20 41 55 54 4f   t502 USING AUTO
1170: 4d 41 54 49 43 20 43 4f 56 45 52 49 4e 47 20 49  MATIC COVERING I
1180: 4e 44 45 58 20 28 79 3d 3f 29 20 28 7e 37 20 72  NDEX (y=?) (~7 r
1190: 6f 77 73 29 7d 0a 7d 0a 64 6f 5f 65 78 65 63 73  ows)}.}.do_execs
11a0: 71 6c 5f 74 65 73 74 20 61 75 74 6f 69 6e 64 65  ql_test autoinde
11b0: 78 31 2d 35 30 32 20 7b 0a 20 20 45 58 50 4c 41  x1-502 {.  EXPLA
11c0: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20  IN QUERY PLAN.  
11d0: 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 35  SELECT b FROM t5
11e0: 30 31 0a 20 20 20 57 48 45 52 45 20 74 35 30 31  01.   WHERE t501
11f0: 2e 61 3d 31 32 33 0a 20 20 20 20 20 41 4e 44 20  .a=123.     AND 
1200: 74 35 30 31 2e 61 20 49 4e 20 28 53 45 4c 45 43  t501.a IN (SELEC
1210: 54 20 78 20 46 52 4f 4d 20 74 35 30 32 20 57 48  T x FROM t502 WH
1220: 45 52 45 20 79 3d 74 35 30 31 2e 62 29 3b 0a 7d  ERE y=t501.b);.}
1230: 20 7b 0a 20 20 30 20 30 20 30 20 7b 53 45 41 52   {.  0 0 0 {SEAR
1240: 43 48 20 54 41 42 4c 45 20 74 35 30 31 20 55 53  CH TABLE t501 US
1250: 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d  ING INTEGER PRIM
1260: 41 52 59 20 4b 45 59 20 28 72 6f 77 69 64 3d 3f  ARY KEY (rowid=?
1270: 29 20 28 7e 31 20 72 6f 77 73 29 7d 20 0a 20 20  ) (~1 rows)} .  
1280: 30 20 30 20 30 20 7b 45 58 45 43 55 54 45 20 43  0 0 0 {EXECUTE C
1290: 4f 52 52 45 4c 41 54 45 44 20 4c 49 53 54 20 53  ORRELATED LIST S
12a0: 55 42 51 55 45 52 59 20 31 7d 20 0a 20 20 31 20  UBQUERY 1} .  1 
12b0: 30 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20  0 0 {SCAN TABLE 
12c0: 74 35 30 32 20 28 7e 31 30 30 30 30 30 20 72 6f  t502 (~100000 ro
12d0: 77 73 29 7d 0a 7d 0a 0a 0a 23 20 54 68 65 20 66  ws)}.}...# The f
12e0: 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 63 68  ollowing code ch
12f0: 65 63 6b 73 20 61 20 70 65 72 66 6f 72 6d 61 6e  ecks a performan
1300: 63 65 20 72 65 67 72 65 73 73 69 6f 6e 20 72 65  ce regression re
1310: 70 6f 72 74 65 64 20 6f 6e 20 74 68 65 0a 23 20  ported on the.# 
1320: 6d 61 69 6c 69 6e 67 20 6c 69 73 74 20 6f 6e 20  mailing list on 
1330: 32 30 31 30 2d 31 30 2d 31 39 2e 20 20 54 68 65  2010-10-19.  The
1340: 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 68 61 74   problem is that
1350: 20 74 68 65 20 6e 52 6f 77 45 73 74 20 66 69 65   the nRowEst fie
1360: 6c 64 0a 23 20 6f 66 20 65 70 68 65 72 6d 65 72  ld.# of ephermer
1370: 61 6c 20 74 61 62 6c 65 73 20 77 61 73 20 6e 6f  al tables was no
1380: 74 20 62 65 69 6e 67 20 69 6e 69 74 69 61 6c 69  t being initiali
1390: 7a 65 64 20 63 6f 72 72 65 63 74 6c 79 20 61 6e  zed correctly an
13a0: 64 20 73 6f 20 6e 6f 0a 23 20 61 75 74 6f 6d 61  d so no.# automa
13b0: 74 69 63 20 69 6e 64 65 78 20 77 61 73 20 62 65  tic index was be
13c0: 69 6e 67 20 63 72 65 61 74 65 64 20 66 6f 72 20  ing created for 
13d0: 74 68 65 20 65 6d 70 68 65 6d 65 72 61 6c 20 74  the emphemeral t
13e0: 61 62 6c 65 20 77 68 65 6e 20 69 74 20 77 61 73  able when it was
13f0: 0a 23 20 75 73 65 64 20 61 73 20 70 61 72 74 20  .# used as part 
1400: 6f 66 20 61 20 6a 6f 69 6e 2e 0a 23 0a 64 6f 5f  of a join..#.do_
1410: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 61 75 74  execsql_test aut
1420: 6f 69 6e 64 65 78 31 2d 36 30 30 20 7b 0a 20 20  oindex1-600 {.  
1430: 43 52 45 41 54 45 20 54 41 42 4c 45 20 66 6c 6f  CREATE TABLE flo
1440: 63 6b 5f 6f 77 6e 65 72 28 0a 20 20 20 20 6f 77  ck_owner(.    ow
1450: 6e 65 72 5f 72 65 63 5f 69 64 20 49 4e 54 45 47  ner_rec_id INTEG
1460: 45 52 20 43 4f 4e 53 54 52 41 49 4e 54 20 66 6c  ER CONSTRAINT fl
1470: 6f 63 6b 5f 6f 77 6e 65 72 5f 6b 65 79 20 50 52  ock_owner_key PR
1480: 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 66  IMARY KEY,.    f
1490: 6c 6f 63 6b 5f 6e 6f 20 56 41 52 43 48 41 52 28  lock_no VARCHAR(
14a0: 36 29 20 4e 4f 54 20 4e 55 4c 4c 20 52 45 46 45  6) NOT NULL REFE
14b0: 52 45 4e 43 45 53 20 66 6c 6f 63 6b 20 28 66 6c  RENCES flock (fl
14c0: 6f 63 6b 5f 6e 6f 29 2c 0a 20 20 20 20 6f 77 6e  ock_no),.    own
14d0: 65 72 5f 70 65 72 73 6f 6e 5f 69 64 20 49 4e 54  er_person_id INT
14e0: 45 47 45 52 20 4e 4f 54 20 4e 55 4c 4c 20 52 45  EGER NOT NULL RE
14f0: 46 45 52 45 4e 43 45 53 20 70 65 72 73 6f 6e 20  FERENCES person 
1500: 28 70 65 72 73 6f 6e 5f 69 64 29 2c 0a 20 20 20  (person_id),.   
1510: 20 6f 77 6e 65 72 5f 63 68 61 6e 67 65 5f 64 61   owner_change_da
1520: 74 65 20 54 45 58 54 2c 20 6c 61 73 74 5f 63 68  te TEXT, last_ch
1530: 61 6e 67 65 64 20 54 45 58 54 20 4e 4f 54 20 4e  anged TEXT NOT N
1540: 55 4c 4c 2c 0a 20 20 20 20 43 4f 4e 53 54 52 41  ULL,.    CONSTRA
1550: 49 4e 54 20 66 6f 5f 6f 77 6e 65 72 5f 64 61 74  INT fo_owner_dat
1560: 65 20 55 4e 49 51 55 45 20 28 66 6c 6f 63 6b 5f  e UNIQUE (flock_
1570: 6e 6f 2c 20 6f 77 6e 65 72 5f 63 68 61 6e 67 65  no, owner_change
1580: 5f 64 61 74 65 29 0a 20 20 29 3b 0a 20 20 43 52  _date).  );.  CR
1590: 45 41 54 45 20 54 41 42 4c 45 20 73 68 65 65 70  EATE TABLE sheep
15a0: 20 28 0a 20 20 20 20 53 68 65 65 70 5f 4e 6f 20   (.    Sheep_No 
15b0: 63 68 61 72 28 37 29 20 4e 4f 54 20 4e 55 4c 4c  char(7) NOT NULL
15c0: 2c 0a 20 20 20 20 44 61 74 65 5f 6f 66 5f 42 69  ,.    Date_of_Bi
15d0: 72 74 68 20 63 68 61 72 28 38 29 2c 0a 20 20 20  rth char(8),.   
15e0: 20 53 6f 72 74 5f 44 6f 42 20 74 65 78 74 2c 0a   Sort_DoB text,.
15f0: 20 20 20 20 46 6c 6f 63 6b 5f 42 6f 6f 6b 5f 56      Flock_Book_V
1600: 6f 6c 20 63 68 61 72 28 32 29 2c 0a 20 20 20 20  ol char(2),.    
1610: 42 72 65 65 64 65 72 5f 4e 6f 20 63 68 61 72 28  Breeder_No char(
1620: 36 29 2c 0a 20 20 20 20 42 72 65 65 64 65 72 5f  6),.    Breeder_
1630: 50 65 72 73 6f 6e 20 69 6e 74 65 67 65 72 2c 0a  Person integer,.
1640: 20 20 20 20 4f 72 69 67 69 6e 61 74 69 6e 67 5f      Originating_
1650: 46 6c 6f 63 6b 20 63 68 61 72 28 36 29 2c 0a 20  Flock char(6),. 
1660: 20 20 20 52 65 67 69 73 74 65 72 69 6e 67 5f 46     Registering_F
1670: 6c 6f 63 6b 20 63 68 61 72 28 36 29 2c 0a 20 20  lock char(6),.  
1680: 20 20 54 61 67 5f 50 72 65 66 69 78 20 63 68 61    Tag_Prefix cha
1690: 72 28 39 29 2c 0a 20 20 20 20 54 61 67 5f 4e 6f  r(9),.    Tag_No
16a0: 20 63 68 61 72 28 31 35 29 2c 0a 20 20 20 20 53   char(15),.    S
16b0: 6f 72 74 5f 54 61 67 5f 4e 6f 20 69 6e 74 65 67  ort_Tag_No integ
16c0: 65 72 2c 0a 20 20 20 20 42 72 65 65 64 65 72 73  er,.    Breeders
16d0: 5f 54 65 6d 70 5f 54 61 67 20 63 68 61 72 28 31  _Temp_Tag char(1
16e0: 35 29 2c 0a 20 20 20 20 53 65 78 20 63 68 61 72  5),.    Sex char
16f0: 28 31 29 2c 0a 20 20 20 20 53 68 65 65 70 5f 4e  (1),.    Sheep_N
1700: 61 6d 65 20 63 68 61 72 28 33 32 29 2c 0a 20 20  ame char(32),.  
1710: 20 20 53 69 72 65 5f 4e 6f 20 63 68 61 72 28 37    Sire_No char(7
1720: 29 2c 0a 20 20 20 20 44 61 6d 5f 4e 6f 20 63 68  ),.    Dam_No ch
1730: 61 72 28 37 29 2c 0a 20 20 20 20 52 65 67 69 73  ar(7),.    Regis
1740: 74 65 72 5f 43 6f 64 65 20 63 68 61 72 28 31 29  ter_Code char(1)
1750: 2c 0a 20 20 20 20 43 6f 6c 6f 75 72 20 63 68 61  ,.    Colour cha
1760: 72 28 34 38 29 2c 0a 20 20 20 20 43 6f 6c 6f 75  r(48),.    Colou
1770: 72 5f 43 6f 64 65 20 63 68 61 72 28 32 29 2c 0a  r_Code char(2),.
1780: 20 20 20 20 50 61 74 74 65 72 6e 5f 43 6f 64 65      Pattern_Code
1790: 20 63 68 61 72 28 38 29 2c 0a 20 20 20 20 48 6f   char(8),.    Ho
17a0: 72 6e 73 20 63 68 61 72 28 31 29 2c 0a 20 20 20  rns char(1),.   
17b0: 20 4c 69 74 74 65 72 5f 53 69 7a 65 20 63 68 61   Litter_Size cha
17c0: 72 28 31 29 2c 0a 20 20 20 20 43 6f 65 66 66 5f  r(1),.    Coeff_
17d0: 6f 66 5f 49 6e 62 72 65 65 64 69 6e 67 20 72 65  of_Inbreeding re
17e0: 61 6c 2c 0a 20 20 20 20 44 61 74 65 5f 6f 66 5f  al,.    Date_of_
17f0: 52 65 67 69 73 74 72 61 74 69 6f 6e 20 74 65 78  Registration tex
1800: 74 2c 0a 20 20 20 20 44 61 74 65 5f 4c 61 73 74  t,.    Date_Last
1810: 5f 43 68 61 6e 67 65 64 20 74 65 78 74 2c 0a 20  _Changed text,. 
1820: 20 20 20 55 4e 49 51 55 45 28 53 68 65 65 70 5f     UNIQUE(Sheep_
1830: 4e 6f 29 29 3b 0a 20 20 43 52 45 41 54 45 20 49  No));.  CREATE I
1840: 4e 44 45 58 20 66 6f 5f 66 6c 6f 63 6b 5f 6e 6f  NDEX fo_flock_no
1850: 5f 69 6e 64 65 78 20 20 0a 20 20 20 20 20 20 20  _index  .       
1860: 20 20 20 20 20 20 20 4f 4e 20 66 6c 6f 63 6b 5f         ON flock_
1870: 6f 77 6e 65 72 20 28 66 6c 6f 63 6b 5f 6e 6f 29  owner (flock_no)
1880: 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  ;.  CREATE INDEX
1890: 20 66 6f 5f 6f 77 6e 65 72 5f 63 68 61 6e 67 65   fo_owner_change
18a0: 5f 64 61 74 65 5f 69 6e 64 65 78 20 20 0a 20 20  _date_index  .  
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 4f 4e 20 66              ON f
18c0: 6c 6f 63 6b 5f 6f 77 6e 65 72 20 28 6f 77 6e 65  lock_owner (owne
18d0: 72 5f 63 68 61 6e 67 65 5f 64 61 74 65 29 3b 0a  r_change_date);.
18e0: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 66    CREATE INDEX f
18f0: 6f 5f 6f 77 6e 65 72 5f 70 65 72 73 6f 6e 5f 69  o_owner_person_i
1900: 64 5f 69 6e 64 65 78 20 20 0a 20 20 20 20 20 20  d_index  .      
1910: 20 20 20 20 20 20 20 20 4f 4e 20 66 6c 6f 63 6b          ON flock
1920: 5f 6f 77 6e 65 72 20 28 6f 77 6e 65 72 5f 70 65  _owner (owner_pe
1930: 72 73 6f 6e 5f 69 64 29 3b 0a 20 20 43 52 45 41  rson_id);.  CREA
1940: 54 45 20 49 4e 44 45 58 20 73 68 65 65 70 5f 6f  TE INDEX sheep_o
1950: 72 67 5f 66 6c 6f 63 6b 5f 69 6e 64 65 78 20 20  rg_flock_index  
1960: 0a 20 20 20 20 20 20 20 20 20 20 20 4f 4e 20 73  .           ON s
1970: 68 65 65 70 20 28 6f 72 69 67 69 6e 61 74 69 6e  heep (originatin
1980: 67 5f 66 6c 6f 63 6b 29 3b 0a 20 20 43 52 45 41  g_flock);.  CREA
1990: 54 45 20 49 4e 44 45 58 20 73 68 65 65 70 5f 72  TE INDEX sheep_r
19a0: 65 67 5f 66 6c 6f 63 6b 5f 69 6e 64 65 78 20 20  eg_flock_index  
19b0: 0a 20 20 20 20 20 20 20 20 20 20 20 4f 4e 20 73  .           ON s
19c0: 68 65 65 70 20 28 72 65 67 69 73 74 65 72 69 6e  heep (registerin
19d0: 67 5f 66 6c 6f 63 6b 29 3b 0a 20 20 45 58 50 4c  g_flock);.  EXPL
19e0: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 20  AIN QUERY PLAN. 
19f0: 20 53 45 4c 45 43 54 20 78 2e 73 68 65 65 70 5f   SELECT x.sheep_
1a00: 6e 6f 2c 20 78 2e 72 65 67 69 73 74 65 72 69 6e  no, x.registerin
1a10: 67 5f 66 6c 6f 63 6b 2c 20 78 2e 64 61 74 65 5f  g_flock, x.date_
1a20: 6f 66 5f 72 65 67 69 73 74 72 61 74 69 6f 6e 0a  of_registration.
1a30: 20 20 20 46 52 4f 4d 20 73 68 65 65 70 20 78 20     FROM sheep x 
1a40: 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 20 20 20 20  LEFT JOIN.      
1a50: 20 28 53 45 4c 45 43 54 20 73 2e 73 68 65 65 70   (SELECT s.sheep
1a60: 5f 6e 6f 2c 20 70 72 65 76 2e 66 6c 6f 63 6b 5f  _no, prev.flock_
1a70: 6e 6f 2c 20 70 72 65 76 2e 6f 77 6e 65 72 5f 70  no, prev.owner_p
1a80: 65 72 73 6f 6e 5f 69 64 2c 0a 20 20 20 20 20 20  erson_id,.      
1a90: 20 73 2e 64 61 74 65 5f 6f 66 5f 72 65 67 69 73   s.date_of_regis
1aa0: 74 72 61 74 69 6f 6e 2c 20 70 72 65 76 2e 6f 77  tration, prev.ow
1ab0: 6e 65 72 5f 63 68 61 6e 67 65 5f 64 61 74 65 0a  ner_change_date.
1ac0: 20 20 20 20 20 20 20 46 52 4f 4d 20 73 68 65 65         FROM shee
1ad0: 70 20 73 20 4a 4f 49 4e 20 66 6c 6f 63 6b 5f 6f  p s JOIN flock_o
1ae0: 77 6e 65 72 20 70 72 65 76 20 4f 4e 20 73 2e 72  wner prev ON s.r
1af0: 65 67 69 73 74 65 72 69 6e 67 5f 66 6c 6f 63 6b  egistering_flock
1b00: 20 3d 0a 20 20 20 70 72 65 76 2e 66 6c 6f 63 6b   =.   prev.flock
1b10: 5f 6e 6f 0a 20 20 20 20 20 20 20 41 4e 44 20 28  _no.       AND (
1b20: 70 72 65 76 2e 6f 77 6e 65 72 5f 63 68 61 6e 67  prev.owner_chang
1b30: 65 5f 64 61 74 65 20 3c 3d 20 73 2e 64 61 74 65  e_date <= s.date
1b40: 5f 6f 66 5f 72 65 67 69 73 74 72 61 74 69 6f 6e  _of_registration
1b50: 20 7c 7c 20 27 20 30 30 3a 30 30 3a 30 30 27 29   || ' 00:00:00')
1b60: 0a 20 20 20 20 20 20 20 57 48 45 52 45 20 4e 4f  .       WHERE NO
1b70: 54 20 45 58 49 53 54 53 0a 20 20 20 20 20 20 20  T EXISTS.       
1b80: 20 20 20 20 28 53 45 4c 45 43 54 20 27 78 27 20      (SELECT 'x' 
1b90: 46 52 4f 4d 20 66 6c 6f 63 6b 5f 6f 77 6e 65 72  FROM flock_owner
1ba0: 20 6c 61 74 65 72 0a 20 20 20 20 20 20 20 20 20   later.         
1bb0: 20 20 57 48 45 52 45 20 70 72 65 76 2e 66 6c 6f    WHERE prev.flo
1bc0: 63 6b 5f 6e 6f 20 3d 20 6c 61 74 65 72 2e 66 6c  ck_no = later.fl
1bd0: 6f 63 6b 5f 6e 6f 0a 20 20 20 20 20 20 20 20 20  ock_no.         
1be0: 20 20 41 4e 44 20 6c 61 74 65 72 2e 6f 77 6e 65    AND later.owne
1bf0: 72 5f 63 68 61 6e 67 65 5f 64 61 74 65 20 3e 20  r_change_date > 
1c00: 70 72 65 76 2e 6f 77 6e 65 72 5f 63 68 61 6e 67  prev.owner_chang
1c10: 65 5f 64 61 74 65 0a 20 20 20 20 20 20 20 20 20  e_date.         
1c20: 20 20 41 4e 44 20 6c 61 74 65 72 2e 6f 77 6e 65    AND later.owne
1c30: 72 5f 63 68 61 6e 67 65 5f 64 61 74 65 20 3c 3d  r_change_date <=
1c40: 20 73 2e 64 61 74 65 5f 6f 66 5f 72 65 67 69 73   s.date_of_regis
1c50: 74 72 61 74 69 6f 6e 7c 7c 27 20 30 30 3a 30 30  tration||' 00:00
1c60: 3a 30 30 27 29 0a 20 20 20 20 20 20 20 29 20 79  :00').       ) y
1c70: 20 4f 4e 20 78 2e 73 68 65 65 70 5f 6e 6f 20 3d   ON x.sheep_no =
1c80: 20 79 2e 73 68 65 65 70 5f 6e 6f 0a 20 20 20 57   y.sheep_no.   W
1c90: 48 45 52 45 20 79 2e 73 68 65 65 70 5f 6e 6f 20  HERE y.sheep_no 
1ca0: 49 53 20 4e 55 4c 4c 0a 20 20 20 4f 52 44 45 52  IS NULL.   ORDER
1cb0: 20 42 59 20 78 2e 72 65 67 69 73 74 65 72 69 6e   BY x.registerin
1cc0: 67 5f 66 6c 6f 63 6b 3b 0a 7d 20 7b 0a 20 20 31  g_flock;.} {.  1
1cd0: 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45   0 0 {SCAN TABLE
1ce0: 20 73 68 65 65 70 20 41 53 20 73 20 28 7e 31 30   sheep AS s (~10
1cf0: 30 30 30 30 30 20 72 6f 77 73 29 7d 20 0a 20 20  00000 rows)} .  
1d00: 31 20 31 20 31 20 7b 53 45 41 52 43 48 20 54 41  1 1 1 {SEARCH TA
1d10: 42 4c 45 20 66 6c 6f 63 6b 5f 6f 77 6e 65 72 20  BLE flock_owner 
1d20: 41 53 20 70 72 65 76 20 55 53 49 4e 47 20 49 4e  AS prev USING IN
1d30: 44 45 58 20 73 71 6c 69 74 65 5f 61 75 74 6f 69  DEX sqlite_autoi
1d40: 6e 64 65 78 5f 66 6c 6f 63 6b 5f 6f 77 6e 65 72  ndex_flock_owner
1d50: 5f 31 20 28 66 6c 6f 63 6b 5f 6e 6f 3d 3f 20 41  _1 (flock_no=? A
1d60: 4e 44 20 6f 77 6e 65 72 5f 63 68 61 6e 67 65 5f  ND owner_change_
1d70: 64 61 74 65 3c 3f 29 20 28 7e 32 20 72 6f 77 73  date<?) (~2 rows
1d80: 29 7d 20 0a 20 20 31 20 30 20 30 20 7b 45 58 45  )} .  1 0 0 {EXE
1d90: 43 55 54 45 20 43 4f 52 52 45 4c 41 54 45 44 20  CUTE CORRELATED 
1da0: 53 43 41 4c 41 52 20 53 55 42 51 55 45 52 59 20  SCALAR SUBQUERY 
1db0: 32 7d 20 0a 20 20 32 20 30 20 30 20 7b 53 45 41  2} .  2 0 0 {SEA
1dc0: 52 43 48 20 54 41 42 4c 45 20 66 6c 6f 63 6b 5f  RCH TABLE flock_
1dd0: 6f 77 6e 65 72 20 41 53 20 6c 61 74 65 72 20 55  owner AS later U
1de0: 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e  SING COVERING IN
1df0: 44 45 58 20 73 71 6c 69 74 65 5f 61 75 74 6f 69  DEX sqlite_autoi
1e00: 6e 64 65 78 5f 66 6c 6f 63 6b 5f 6f 77 6e 65 72  ndex_flock_owner
1e10: 5f 31 20 28 66 6c 6f 63 6b 5f 6e 6f 3d 3f 20 41  _1 (flock_no=? A
1e20: 4e 44 20 6f 77 6e 65 72 5f 63 68 61 6e 67 65 5f  ND owner_change_
1e30: 64 61 74 65 3e 3f 20 41 4e 44 20 6f 77 6e 65 72  date>? AND owner
1e40: 5f 63 68 61 6e 67 65 5f 64 61 74 65 3c 3f 29 20  _change_date<?) 
1e50: 28 7e 31 20 72 6f 77 73 29 7d 20 0a 20 20 30 20  (~1 rows)} .  0 
1e60: 30 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20  0 0 {SCAN TABLE 
1e70: 73 68 65 65 70 20 41 53 20 78 20 55 53 49 4e 47  sheep AS x USING
1e80: 20 49 4e 44 45 58 20 73 68 65 65 70 5f 72 65 67   INDEX sheep_reg
1e90: 5f 66 6c 6f 63 6b 5f 69 6e 64 65 78 20 28 7e 31  _flock_index (~1
1ea0: 30 30 30 30 30 30 20 72 6f 77 73 29 7d 20 0a 20  000000 rows)} . 
1eb0: 20 30 20 31 20 31 20 7b 53 45 41 52 43 48 20 53   0 1 1 {SEARCH S
1ec0: 55 42 51 55 45 52 59 20 31 20 41 53 20 79 20 55  UBQUERY 1 AS y U
1ed0: 53 49 4e 47 20 41 55 54 4f 4d 41 54 49 43 20 43  SING AUTOMATIC C
1ee0: 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20 28 73  OVERING INDEX (s
1ef0: 68 65 65 70 5f 6e 6f 3d 3f 29 20 28 7e 38 20 72  heep_no=?) (~8 r
1f00: 6f 77 73 29 7d 0a 7d 0a 0a 0a 64 6f 5f 65 78 65  ows)}.}...do_exe
1f10: 63 73 71 6c 5f 74 65 73 74 20 61 75 74 6f 69 6e  csql_test autoin
1f20: 64 65 78 31 2d 37 30 30 20 7b 0a 20 20 43 52 45  dex1-700 {.  CRE
1f30: 41 54 45 20 54 41 42 4c 45 20 74 35 28 61 2c 20  ATE TABLE t5(a, 
1f40: 62 2c 20 63 29 3b 0a 20 20 45 58 50 4c 41 49 4e  b, c);.  EXPLAIN
1f50: 20 51 55 45 52 59 20 50 4c 41 4e 20 53 45 4c 45   QUERY PLAN SELE
1f60: 43 54 20 61 20 46 52 4f 4d 20 74 35 20 57 48 45  CT a FROM t5 WHE
1f70: 52 45 20 62 3d 31 30 20 4f 52 44 45 52 20 42 59  RE b=10 ORDER BY
1f80: 20 63 3b 0a 7d 20 7b 0a 20 20 30 20 30 20 30 20   c;.} {.  0 0 0 
1f90: 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 35 20 28  {SCAN TABLE t5 (
1fa0: 7e 31 30 30 30 30 30 20 72 6f 77 73 29 7d 20 0a  ~100000 rows)} .
1fb0: 20 20 30 20 30 20 30 20 7b 55 53 45 20 54 45 4d    0 0 0 {USE TEM
1fc0: 50 20 42 2d 54 52 45 45 20 46 4f 52 20 4f 52 44  P B-TREE FOR ORD
1fd0: 45 52 20 42 59 7d 0a 7d 0a 0a 0a 66 69 6e 69 73  ER BY}.}...finis
1fe0: 68 5f 74 65 73 74 0a                             h_test.