/ Hex Artifact Content
Login

Artifact 89a107d36710dc3f44dab0861a784ffab967bd1f32c8d700b031748b9d2703c6:


0000: 23 20 32 30 31 32 20 4d 61 72 63 68 20 30 31 0a  # 2012 March 01.
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 74 68 65 20 6c  is testing the l
01d0: 61 6e 67 75 61 67 65 69 64 3d 78 78 78 20 46 54  anguageid=xxx FT
01e0: 53 34 20 6f 70 74 69 6f 6e 2e 0a 23 0a 0a 73 65  S4 option..#..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 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0240: 54 53 33 20 69 73 20 64 65 66 69 6e 65 64 2c 20  TS3 is defined, 
0250: 6f 6d 69 74 20 74 68 69 73 20 66 69 6c 65 2e 0a  omit this file..
0260: 69 66 63 61 70 61 62 6c 65 20 21 66 74 73 33 20  ifcapable !fts3 
0270: 7b 0a 20 20 66 69 6e 69 73 68 5f 74 65 73 74 0a  {.  finish_test.
0280: 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 73 65 74 20    return.}..set 
0290: 3a 3a 74 65 73 74 70 72 65 66 69 78 20 66 74 73  ::testprefix fts
02a0: 34 6c 61 6e 67 69 64 0a 0a 23 2d 2d 2d 2d 2d 2d  4langid..#------
02b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02f0: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 70 6c 61  -----.# Test pla
0300: 6e 3a 0a 23 0a 23 20 20 20 31 2e 2a 20 2d 20 57  n:.#.#   1.* - W
0310: 61 72 6d 2d 62 6f 64 79 20 74 65 73 74 73 20 63  arm-body tests c
0320: 72 65 61 74 65 64 20 66 6f 72 20 73 70 65 63 69  reated for speci
0330: 66 69 63 20 70 75 72 70 6f 73 65 73 20 64 75 72  fic purposes dur
0340: 69 6e 67 20 64 65 76 65 6c 6f 70 6d 65 6e 74 2e  ing development.
0350: 0a 23 20 20 20 20 20 20 20 20 20 50 61 73 73 69  .#         Passi
0360: 6e 67 20 74 68 65 73 65 20 64 6f 65 73 6e 27 74  ng these doesn't
0370: 20 72 65 61 6c 6c 79 20 70 72 6f 76 65 20 6d 75   really prove mu
0380: 63 68 2e 0a 23 0a 23 20 20 20 32 2e 31 2e 2a 20  ch..#.#   2.1.* 
0390: 2d 20 54 65 73 74 20 74 68 61 74 20 46 54 53 20  - Test that FTS 
03a0: 71 75 65 72 69 65 73 20 6f 6e 6c 79 20 65 76 65  queries only eve
03b0: 72 20 72 65 74 75 72 6e 20 72 6f 77 73 20 61 73  r return rows as
03c0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 23 20  sociated with.# 
03d0: 20 20 20 20 20 20 20 20 20 20 74 68 65 20 72 65            the re
03e0: 71 75 65 73 74 65 64 20 6c 61 6e 67 75 61 67 65  quested language
03f0: 2e 0a 23 0a 23 20 20 20 32 2e 32 2e 2a 20 2d 20  ..#.#   2.2.* - 
0400: 53 61 6d 65 20 61 73 20 32 2e 31 2e 2a 2c 20 61  Same as 2.1.*, a
0410: 66 74 65 72 20 61 6e 20 27 6f 70 74 69 6d 69 7a  fter an 'optimiz
0420: 65 27 20 63 6f 6d 6d 61 6e 64 2e 0a 23 0a 23 20  e' command..#.# 
0430: 20 20 32 2e 33 2e 2a 20 2d 20 53 61 6d 65 20 61    2.3.* - Same a
0440: 73 20 32 2e 31 2e 2a 2c 20 61 66 74 65 72 20 61  s 2.1.*, after a
0450: 20 27 72 65 62 75 69 6c 64 27 20 63 6f 6d 6d 61   'rebuild' comma
0460: 6e 64 2e 0a 23 0a 23 20 20 20 33 2e 2a 20 2d 20  nd..#.#   3.* - 
0470: 54 65 73 74 73 20 77 69 74 68 20 63 6f 6e 74 65  Tests with conte
0480: 6e 74 3d 20 74 61 62 6c 65 73 2e 20 42 6f 74 68  nt= tables. Both
0490: 20 77 68 65 72 65 20 74 68 65 72 65 20 69 73 20   where there is 
04a0: 61 20 72 65 61 6c 20 0a 23 20 20 20 20 20 20 20  a real .#       
04b0: 20 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 6f 6e    underlying con
04c0: 74 65 6e 74 20 74 61 62 6c 65 20 61 6e 64 20 77  tent table and w
04d0: 68 65 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  here there is no
04e0: 74 2e 0a 23 0a 23 20 20 20 34 2e 2a 20 2d 20 54  t..#.#   4.* - T
04f0: 65 73 74 20 74 68 61 74 20 69 66 20 6f 6e 65 20  est that if one 
0500: 69 73 20 70 72 6f 76 69 64 65 64 2c 20 74 68 65  is provided, the
0510: 20 74 6f 6b 65 6e 69 7a 65 72 20 78 4c 61 6e 67   tokenizer xLang
0520: 75 61 67 65 20 6d 65 74 68 6f 64 0a 23 20 20 20  uage method.#   
0530: 20 20 20 20 20 20 69 73 20 63 61 6c 6c 65 64 20        is called 
0540: 74 6f 20 63 6f 6e 66 69 67 75 72 65 20 74 68 65  to configure the
0550: 20 74 6f 6b 65 6e 69 7a 65 72 20 62 65 66 6f 72   tokenizer befor
0560: 65 20 74 6f 6b 65 6e 69 7a 69 6e 67 20 71 75 65  e tokenizing que
0570: 72 79 0a 23 20 20 20 20 20 20 20 20 20 6f 72 20  ry.#         or 
0580: 64 6f 63 75 6d 65 6e 74 20 74 65 78 74 2e 0a 23  document text..#
0590: 0a 23 20 20 20 35 2e 2a 20 2d 20 54 65 73 74 20  .#   5.* - Test 
05a0: 74 68 65 20 66 74 73 34 61 75 78 20 74 61 62 6c  the fts4aux tabl
05b0: 65 20 77 68 65 6e 20 74 68 65 20 61 73 73 6f 63  e when the assoc
05c0: 69 61 74 65 64 20 46 54 53 34 20 74 61 62 6c 65  iated FTS4 table
05d0: 20 63 6f 6e 74 61 69 6e 73 0a 23 20 20 20 20 20   contains.#     
05e0: 20 20 20 20 6d 75 6c 74 69 70 6c 65 20 6c 61 6e      multiple lan
05f0: 67 75 61 67 65 73 2e 0a 23 0a 0a 64 6f 5f 65 78  guages..#..do_ex
0600: 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 31 20 7b  ecsql_test 1.1 {
0610: 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41  .  CREATE VIRTUA
0620: 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47  L TABLE t1 USING
0630: 20 66 74 73 34 28 61 2c 20 62 2c 20 6c 61 6e 67   fts4(a, b, lang
0640: 75 61 67 65 69 64 3d 6c 61 6e 67 5f 69 64 29 3b  uageid=lang_id);
0650: 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  .}..do_execsql_t
0660: 65 73 74 20 31 2e 32 20 7b 0a 20 20 53 45 4c 45  est 1.2 {.  SELE
0670: 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  CT sql FROM sqli
0680: 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20  te_master WHERE 
0690: 6e 61 6d 65 20 3d 20 27 74 31 5f 63 6f 6e 74 65  name = 't1_conte
06a0: 6e 74 27 3b 0a 7d 20 7b 7b 43 52 45 41 54 45 20  nt';.} {{CREATE 
06b0: 54 41 42 4c 45 20 27 74 31 5f 63 6f 6e 74 65 6e  TABLE 't1_conten
06c0: 74 27 28 64 6f 63 69 64 20 49 4e 54 45 47 45 52  t'(docid INTEGER
06d0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 27 63   PRIMARY KEY, 'c
06e0: 30 61 27 2c 20 27 63 31 62 27 2c 20 6c 61 6e 67  0a', 'c1b', lang
06f0: 69 64 29 7d 7d 0a 0a 64 6f 5f 65 78 65 63 73 71  id)}}..do_execsq
0700: 6c 5f 74 65 73 74 20 31 2e 33 20 7b 53 45 4c 45  l_test 1.3 {SELE
0710: 43 54 20 64 6f 63 69 64 20 46 52 4f 4d 20 74 31  CT docid FROM t1
0720: 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  } {}.do_execsql_
0730: 74 65 73 74 20 31 2e 34 20 7b 53 45 4c 45 43 54  test 1.4 {SELECT
0740: 20 6c 61 6e 67 5f 69 64 20 46 52 4f 4d 20 74 31   lang_id FROM t1
0750: 7d 20 7b 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  } {}..do_execsql
0760: 5f 74 65 73 74 20 31 2e 35 20 7b 49 4e 53 45 52  _test 1.5 {INSER
0770: 54 20 49 4e 54 4f 20 74 31 28 61 2c 20 62 29 20  T INTO t1(a, b) 
0780: 56 41 4c 55 45 53 28 27 61 61 61 27 2c 20 27 62  VALUES('aaa', 'b
0790: 62 62 27 29 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  bb')}.do_execsql
07a0: 5f 74 65 73 74 20 31 2e 36 20 7b 53 45 4c 45 43  _test 1.6 {SELEC
07b0: 54 20 6c 61 6e 67 5f 69 64 20 46 52 4f 4d 20 74  T lang_id FROM t
07c0: 31 20 7d 20 7b 30 7d 0a 0a 64 6f 5f 65 78 65 63  1 } {0}..do_exec
07d0: 73 71 6c 5f 74 65 73 74 20 31 2e 37 20 7b 49 4e  sql_test 1.7 {IN
07e0: 53 45 52 54 20 49 4e 54 4f 20 74 31 28 61 2c 20  SERT INTO t1(a, 
07f0: 62 2c 20 6c 61 6e 67 5f 69 64 29 20 56 41 4c 55  b, lang_id) VALU
0800: 45 53 28 27 61 61 61 27 2c 20 27 62 62 62 27 2c  ES('aaa', 'bbb',
0810: 20 34 29 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   4)}.do_execsql_
0820: 74 65 73 74 20 31 2e 38 20 7b 53 45 4c 45 43 54  test 1.8 {SELECT
0830: 20 6c 61 6e 67 5f 69 64 20 46 52 4f 4d 20 74 31   lang_id FROM t1
0840: 20 7d 20 7b 30 20 34 7d 0a 0a 64 6f 5f 65 78 65   } {0 4}..do_exe
0850: 63 73 71 6c 5f 74 65 73 74 20 31 2e 39 20 20 7b  csql_test 1.9  {
0860: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 61  INSERT INTO t1(a
0870: 2c 20 62 2c 20 6c 61 6e 67 5f 69 64 29 20 56 41  , b, lang_id) VA
0880: 4c 55 45 53 28 27 61 61 61 27 2c 20 27 62 62 62  LUES('aaa', 'bbb
0890: 27 2c 20 27 78 79 7a 27 29 7d 0a 64 6f 5f 65 78  ', 'xyz')}.do_ex
08a0: 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 31 30 20  ecsql_test 1.10 
08b0: 7b 53 45 4c 45 43 54 20 6c 61 6e 67 5f 69 64 20  {SELECT lang_id 
08c0: 46 52 4f 4d 20 74 31 7d 20 7b 30 20 34 20 30 7d  FROM t1} {0 4 0}
08d0: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
08e0: 74 20 31 2e 31 31 20 7b 0a 20 20 43 52 45 41 54  t 1.11 {.  CREAT
08f0: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
0900: 74 32 20 55 53 49 4e 47 20 66 74 73 34 3b 0a 20  t2 USING fts4;. 
0910: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
0920: 56 41 4c 55 45 53 28 27 61 62 63 27 29 3b 0a 7d  VALUES('abc');.}
0930: 20 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73   .do_execsql_tes
0940: 74 20 31 2e 31 32 20 7b 20 53 45 4c 45 43 54 20  t 1.12 { SELECT 
0950: 72 6f 77 69 64 20 46 52 4f 4d 20 74 32 20 57 48  rowid FROM t2 WH
0960: 45 52 45 20 63 6f 6e 74 65 6e 74 20 4d 41 54 43  ERE content MATC
0970: 48 20 27 61 62 63 27 20 7d 20 31 0a 0a 64 6f 5f  H 'abc' } 1..do_
0980: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 31  execsql_test 1.1
0990: 33 20 7b 0a 20 20 44 52 4f 50 20 54 41 42 4c 45  3 {.  DROP TABLE
09a0: 20 74 31 3b 0a 20 20 43 52 45 41 54 45 20 56 49   t1;.  CREATE VI
09b0: 52 54 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55  RTUAL TABLE t1 U
09c0: 53 49 4e 47 20 66 74 73 34 28 6c 61 6e 67 75 61  SING fts4(langua
09d0: 67 65 69 64 3d 6c 61 6e 67 5f 69 64 29 3b 0a 20  geid=lang_id);. 
09e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28   INSERT INTO t1(
09f0: 63 6f 6e 74 65 6e 74 29 20 20 20 20 20 20 20 20  content)        
0a00: 20 20 56 41 4c 55 45 53 28 27 61 20 62 20 63 27    VALUES('a b c'
0a10: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
0a20: 20 74 31 28 63 6f 6e 74 65 6e 74 2c 20 6c 61 6e   t1(content, lan
0a30: 67 5f 69 64 29 20 56 41 4c 55 45 53 28 27 61 20  g_id) VALUES('a 
0a40: 62 20 63 27 2c 20 31 29 3b 0a 7d 0a 0a 64 6f 5f  b c', 1);.}..do_
0a50: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 31  execsql_test 1.1
0a60: 34 20 7b 0a 20 20 53 45 4c 45 43 54 20 72 6f 77  4 {.  SELECT row
0a70: 69 64 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  id FROM t1 WHERE
0a80: 20 74 31 20 4d 41 54 43 48 20 27 62 27 3b 0a 7d   t1 MATCH 'b';.}
0a90: 20 7b 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   {1}.do_execsql_
0aa0: 74 65 73 74 20 31 2e 31 35 20 7b 0a 20 20 53 45  test 1.15 {.  SE
0ab0: 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20  LECT rowid FROM 
0ac0: 74 31 20 57 48 45 52 45 20 74 31 20 4d 41 54 43  t1 WHERE t1 MATC
0ad0: 48 20 27 62 27 20 41 4e 44 20 6c 61 6e 67 5f 69  H 'b' AND lang_i
0ae0: 64 20 3d 20 30 3b 0a 7d 20 7b 31 7d 0a 0a 64 6f  d = 0;.} {1}..do
0af0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e  _execsql_test 1.
0b00: 31 36 20 7b 0a 20 20 53 45 4c 45 43 54 20 72 6f  16 {.  SELECT ro
0b10: 77 69 64 20 46 52 4f 4d 20 74 31 20 57 48 45 52  wid FROM t1 WHER
0b20: 45 20 74 31 20 4d 41 54 43 48 20 27 62 27 20 41  E t1 MATCH 'b' A
0b30: 4e 44 20 6c 61 6e 67 5f 69 64 20 3d 20 31 3b 0a  ND lang_id = 1;.
0b40: 7d 20 7b 32 7d 0a 0a 64 6f 5f 63 61 74 63 68 73  } {2}..do_catchs
0b50: 71 6c 5f 74 65 73 74 20 31 2e 31 37 20 7b 0a 20  ql_test 1.17 {. 
0b60: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28   INSERT INTO t1(
0b70: 63 6f 6e 74 65 6e 74 2c 20 6c 61 6e 67 5f 69 64  content, lang_id
0b80: 29 20 56 41 4c 55 45 53 28 27 31 32 33 27 2c 20  ) VALUES('123', 
0b90: 2d 31 29 3b 0a 7d 20 7b 31 20 7b 63 6f 6e 73 74  -1);.} {1 {const
0ba0: 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 0a  raint failed}}..
0bb0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0bc0: 31 2e 31 38 20 7b 0a 20 20 44 52 4f 50 20 54 41  1.18 {.  DROP TA
0bd0: 42 4c 45 20 74 31 3b 0a 20 20 43 52 45 41 54 45  BLE t1;.  CREATE
0be0: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74   VIRTUAL TABLE t
0bf0: 31 20 55 53 49 4e 47 20 66 74 73 34 28 6c 61 6e  1 USING fts4(lan
0c00: 67 75 61 67 65 69 64 3d 6c 61 6e 67 5f 69 64 29  guageid=lang_id)
0c10: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
0c20: 74 31 28 63 6f 6e 74 65 6e 74 2c 20 6c 61 6e 67  t1(content, lang
0c30: 5f 69 64 29 20 56 41 4c 55 45 53 28 27 41 27 2c  _id) VALUES('A',
0c40: 20 31 33 29 3b 0a 20 20 49 4e 53 45 52 54 20 49   13);.  INSERT I
0c50: 4e 54 4f 20 74 31 28 63 6f 6e 74 65 6e 74 2c 20  NTO t1(content, 
0c60: 6c 61 6e 67 5f 69 64 29 20 56 41 4c 55 45 53 28  lang_id) VALUES(
0c70: 27 42 27 2c 20 31 33 29 3b 0a 20 20 49 4e 53 45  'B', 13);.  INSE
0c80: 52 54 20 49 4e 54 4f 20 74 31 28 63 6f 6e 74 65  RT INTO t1(conte
0c90: 6e 74 2c 20 6c 61 6e 67 5f 69 64 29 20 56 41 4c  nt, lang_id) VAL
0ca0: 55 45 53 28 27 43 27 2c 20 31 33 29 3b 0a 20 20  UES('C', 13);.  
0cb0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 63  INSERT INTO t1(c
0cc0: 6f 6e 74 65 6e 74 2c 20 6c 61 6e 67 5f 69 64 29  ontent, lang_id)
0cd0: 20 56 41 4c 55 45 53 28 27 44 27 2c 20 31 33 29   VALUES('D', 13)
0ce0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
0cf0: 74 31 28 63 6f 6e 74 65 6e 74 2c 20 6c 61 6e 67  t1(content, lang
0d00: 5f 69 64 29 20 56 41 4c 55 45 53 28 27 45 27 2c  _id) VALUES('E',
0d10: 20 31 33 29 3b 0a 20 20 49 4e 53 45 52 54 20 49   13);.  INSERT I
0d20: 4e 54 4f 20 74 31 28 63 6f 6e 74 65 6e 74 2c 20  NTO t1(content, 
0d30: 6c 61 6e 67 5f 69 64 29 20 56 41 4c 55 45 53 28  lang_id) VALUES(
0d40: 27 46 27 2c 20 31 33 29 3b 0a 20 20 49 4e 53 45  'F', 13);.  INSE
0d50: 52 54 20 49 4e 54 4f 20 74 31 28 63 6f 6e 74 65  RT INTO t1(conte
0d60: 6e 74 2c 20 6c 61 6e 67 5f 69 64 29 20 56 41 4c  nt, lang_id) VAL
0d70: 55 45 53 28 27 47 27 2c 20 31 33 29 3b 0a 20 20  UES('G', 13);.  
0d80: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 63  INSERT INTO t1(c
0d90: 6f 6e 74 65 6e 74 2c 20 6c 61 6e 67 5f 69 64 29  ontent, lang_id)
0da0: 20 56 41 4c 55 45 53 28 27 48 27 2c 20 31 33 29   VALUES('H', 13)
0db0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
0dc0: 74 31 28 63 6f 6e 74 65 6e 74 2c 20 6c 61 6e 67  t1(content, lang
0dd0: 5f 69 64 29 20 56 41 4c 55 45 53 28 27 49 27 2c  _id) VALUES('I',
0de0: 20 31 33 29 3b 0a 20 20 49 4e 53 45 52 54 20 49   13);.  INSERT I
0df0: 4e 54 4f 20 74 31 28 63 6f 6e 74 65 6e 74 2c 20  NTO t1(content, 
0e00: 6c 61 6e 67 5f 69 64 29 20 56 41 4c 55 45 53 28  lang_id) VALUES(
0e10: 27 4a 27 2c 20 31 33 29 3b 0a 20 20 49 4e 53 45  'J', 13);.  INSE
0e20: 52 54 20 49 4e 54 4f 20 74 31 28 63 6f 6e 74 65  RT INTO t1(conte
0e30: 6e 74 2c 20 6c 61 6e 67 5f 69 64 29 20 56 41 4c  nt, lang_id) VAL
0e40: 55 45 53 28 27 4b 27 2c 20 31 33 29 3b 0a 20 20  UES('K', 13);.  
0e50: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 63  INSERT INTO t1(c
0e60: 6f 6e 74 65 6e 74 2c 20 6c 61 6e 67 5f 69 64 29  ontent, lang_id)
0e70: 20 56 41 4c 55 45 53 28 27 4c 27 2c 20 31 33 29   VALUES('L', 13)
0e80: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
0e90: 74 31 28 63 6f 6e 74 65 6e 74 2c 20 6c 61 6e 67  t1(content, lang
0ea0: 5f 69 64 29 20 56 41 4c 55 45 53 28 27 4d 27 2c  _id) VALUES('M',
0eb0: 20 31 33 29 3b 0a 20 20 49 4e 53 45 52 54 20 49   13);.  INSERT I
0ec0: 4e 54 4f 20 74 31 28 63 6f 6e 74 65 6e 74 2c 20  NTO t1(content, 
0ed0: 6c 61 6e 67 5f 69 64 29 20 56 41 4c 55 45 53 28  lang_id) VALUES(
0ee0: 27 4e 27 2c 20 31 33 29 3b 0a 20 20 49 4e 53 45  'N', 13);.  INSE
0ef0: 52 54 20 49 4e 54 4f 20 74 31 28 63 6f 6e 74 65  RT INTO t1(conte
0f00: 6e 74 2c 20 6c 61 6e 67 5f 69 64 29 20 56 41 4c  nt, lang_id) VAL
0f10: 55 45 53 28 27 4f 27 2c 20 31 33 29 3b 0a 20 20  UES('O', 13);.  
0f20: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 63  INSERT INTO t1(c
0f30: 6f 6e 74 65 6e 74 2c 20 6c 61 6e 67 5f 69 64 29  ontent, lang_id)
0f40: 20 56 41 4c 55 45 53 28 27 50 27 2c 20 31 33 29   VALUES('P', 13)
0f50: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
0f60: 74 31 28 63 6f 6e 74 65 6e 74 2c 20 6c 61 6e 67  t1(content, lang
0f70: 5f 69 64 29 20 56 41 4c 55 45 53 28 27 51 27 2c  _id) VALUES('Q',
0f80: 20 31 33 29 3b 0a 20 20 49 4e 53 45 52 54 20 49   13);.  INSERT I
0f90: 4e 54 4f 20 74 31 28 63 6f 6e 74 65 6e 74 2c 20  NTO t1(content, 
0fa0: 6c 61 6e 67 5f 69 64 29 20 56 41 4c 55 45 53 28  lang_id) VALUES(
0fb0: 27 52 27 2c 20 31 33 29 3b 0a 20 20 49 4e 53 45  'R', 13);.  INSE
0fc0: 52 54 20 49 4e 54 4f 20 74 31 28 63 6f 6e 74 65  RT INTO t1(conte
0fd0: 6e 74 2c 20 6c 61 6e 67 5f 69 64 29 20 56 41 4c  nt, lang_id) VAL
0fe0: 55 45 53 28 27 53 27 2c 20 31 33 29 3b 0a 20 20  UES('S', 13);.  
0ff0: 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f  SELECT rowid FRO
1000: 4d 20 74 31 20 57 48 45 52 45 20 74 31 20 4d 41  M t1 WHERE t1 MA
1010: 54 43 48 20 27 41 27 3b 0a 7d 20 7b 7d 0a 0a 0a  TCH 'A';.} {}...
1020: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
1030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
1070: 74 20 63 61 73 65 73 20 32 2e 2a 0a 23 0a 70 72  t cases 2.*.#.pr
1080: 6f 63 20 62 75 69 6c 64 5f 6d 75 6c 74 69 6c 69  oc build_multili
1090: 6e 67 75 61 6c 5f 64 62 5f 31 20 7b 64 62 7d 20  ngual_db_1 {db} 
10a0: 7b 0a 20 20 24 64 62 20 65 76 61 6c 20 7b 20 43  {.  $db eval { C
10b0: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
10c0: 42 4c 45 20 74 32 20 55 53 49 4e 47 20 66 74 73  BLE t2 USING fts
10d0: 34 28 78 2c 20 79 2c 20 6c 61 6e 67 75 61 67 65  4(x, y, language
10e0: 69 64 3d 6c 29 20 7d 0a 0a 20 20 73 65 74 20 78  id=l) }..  set x
10f0: 77 6f 72 64 73 20 5b 6c 69 73 74 20 7a 65 72 6f  words [list zero
1100: 20 6f 6e 65 20 74 77 6f 20 74 68 72 65 65 20 66   one two three f
1110: 6f 75 72 20 66 69 76 65 20 73 69 78 20 73 65 76  our five six sev
1120: 65 6e 20 65 69 67 68 74 20 6e 69 6e 65 20 74 65  en eight nine te
1130: 6e 5d 0a 20 20 73 65 74 20 79 77 6f 72 64 73 20  n].  set ywords 
1140: 5b 6c 69 73 74 20 61 6c 70 68 61 20 62 65 74 61  [list alpha beta
1150: 20 67 61 6d 6d 61 20 64 65 6c 74 61 20 65 70 73   gamma delta eps
1160: 69 6c 6f 6e 20 7a 65 74 61 20 65 74 61 20 74 68  ilon zeta eta th
1170: 65 74 61 20 69 6f 74 61 20 6b 61 70 70 61 5d 0a  eta iota kappa].
1180: 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d  .  for {set i 0}
1190: 20 7b 24 69 20 3c 20 31 30 30 30 7d 20 7b 69 6e   {$i < 1000} {in
11a0: 63 72 20 69 7d 20 7b 0a 20 20 20 20 73 65 74 20  cr i} {.    set 
11b0: 69 4c 61 6e 67 69 64 20 5b 65 78 70 72 20 24 69  iLangid [expr $i
11c0: 25 39 5d 0a 20 20 20 20 73 65 74 20 78 20 22 22  %9].    set x ""
11d0: 0a 20 20 20 20 73 65 74 20 79 20 22 22 0a 0a 20  .    set y "".. 
11e0: 20 20 20 73 65 74 20 78 20 5b 6c 69 73 74 5d 0a     set x [list].
11f0: 20 20 20 20 6c 61 70 70 65 6e 64 20 78 20 5b 6c      lappend x [l
1200: 69 6e 64 65 78 20 24 78 77 6f 72 64 73 20 5b 65  index $xwords [e
1210: 78 70 72 20 28 24 69 20 2f 20 31 30 30 30 29 20  xpr ($i / 1000) 
1220: 25 20 31 30 5d 5d 0a 20 20 20 20 6c 61 70 70 65  % 10]].    lappe
1230: 6e 64 20 78 20 5b 6c 69 6e 64 65 78 20 24 78 77  nd x [lindex $xw
1240: 6f 72 64 73 20 5b 65 78 70 72 20 28 24 69 20 2f  ords [expr ($i /
1250: 20 31 30 30 29 20 20 25 20 31 30 5d 5d 0a 20 20   100)  % 10]].  
1260: 20 20 6c 61 70 70 65 6e 64 20 78 20 5b 6c 69 6e    lappend x [lin
1270: 64 65 78 20 24 78 77 6f 72 64 73 20 5b 65 78 70  dex $xwords [exp
1280: 72 20 28 24 69 20 2f 20 31 30 29 20 20 20 25 20  r ($i / 10)   % 
1290: 31 30 5d 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64  10]].    lappend
12a0: 20 78 20 5b 6c 69 6e 64 65 78 20 24 78 77 6f 72   x [lindex $xwor
12b0: 64 73 20 5b 65 78 70 72 20 28 24 69 20 2f 20 31  ds [expr ($i / 1
12c0: 29 20 20 20 25 20 31 30 5d 5d 0a 0a 20 20 20 20  )   % 10]]..    
12d0: 73 65 74 20 79 20 5b 6c 69 73 74 5d 0a 20 20 20  set y [list].   
12e0: 20 6c 61 70 70 65 6e 64 20 79 20 5b 6c 69 6e 64   lappend y [lind
12f0: 65 78 20 24 79 77 6f 72 64 73 20 5b 65 78 70 72  ex $ywords [expr
1300: 20 28 24 69 20 2f 20 31 30 30 30 29 20 25 20 31   ($i / 1000) % 1
1310: 30 5d 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20  0]].    lappend 
1320: 79 20 5b 6c 69 6e 64 65 78 20 24 79 77 6f 72 64  y [lindex $yword
1330: 73 20 5b 65 78 70 72 20 28 24 69 20 2f 20 31 30  s [expr ($i / 10
1340: 30 29 20 20 25 20 31 30 5d 5d 0a 20 20 20 20 6c  0)  % 10]].    l
1350: 61 70 70 65 6e 64 20 79 20 5b 6c 69 6e 64 65 78  append y [lindex
1360: 20 24 79 77 6f 72 64 73 20 5b 65 78 70 72 20 28   $ywords [expr (
1370: 24 69 20 2f 20 31 30 29 20 20 20 25 20 31 30 5d  $i / 10)   % 10]
1380: 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 79 20  ].    lappend y 
1390: 5b 6c 69 6e 64 65 78 20 24 79 77 6f 72 64 73 20  [lindex $ywords 
13a0: 5b 65 78 70 72 20 28 24 69 20 2f 20 31 29 20 20  [expr ($i / 1)  
13b0: 20 25 20 31 30 5d 5d 0a 0a 20 20 20 20 24 64 62   % 10]]..    $db
13c0: 20 65 76 61 6c 20 7b 20 49 4e 53 45 52 54 20 49   eval { INSERT I
13d0: 4e 54 4f 20 74 32 28 64 6f 63 69 64 2c 20 78 2c  NTO t2(docid, x,
13e0: 20 79 2c 20 6c 29 20 56 41 4c 55 45 53 28 24 69   y, l) VALUES($i
13f0: 2c 20 24 78 2c 20 24 79 2c 20 24 69 4c 61 6e 67  , $x, $y, $iLang
1400: 69 64 29 20 7d 0a 20 20 7d 0a 0a 20 20 24 64 62  id) }.  }..  $db
1410: 20 65 76 61 6c 20 7b 0a 20 20 20 20 43 52 45 41   eval {.    CREA
1420: 54 45 20 54 41 42 4c 45 20 64 61 74 61 28 78 2c  TE TABLE data(x,
1430: 20 79 2c 20 6c 29 3b 0a 20 20 20 20 49 4e 53 45   y, l);.    INSE
1440: 52 54 20 49 4e 54 4f 20 64 61 74 61 28 72 6f 77  RT INTO data(row
1450: 69 64 2c 20 78 2c 20 79 2c 20 6c 29 20 53 45 4c  id, x, y, l) SEL
1460: 45 43 54 20 64 6f 63 69 64 2c 20 78 2c 20 79 2c  ECT docid, x, y,
1470: 20 6c 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a   l FROM t2;.  }.
1480: 7d 0a 0a 70 72 6f 63 20 72 6f 77 69 64 5f 6c 69  }..proc rowid_li
1490: 73 74 5f 73 65 74 5f 6c 61 6e 67 69 64 20 7b 6c  st_set_langid {l
14a0: 61 6e 67 69 64 7d 20 7b 0a 20 20 73 65 74 20 3a  angid} {.  set :
14b0: 3a 72 6f 77 69 64 5f 6c 69 73 74 5f 6c 61 6e 67  :rowid_list_lang
14c0: 69 64 20 24 6c 61 6e 67 69 64 0a 7d 0a 70 72 6f  id $langid.}.pro
14d0: 63 20 72 6f 77 69 64 5f 6c 69 73 74 20 7b 70 61  c rowid_list {pa
14e0: 74 74 65 72 6e 7d 20 7b 0a 20 20 73 65 74 20 6c  ttern} {.  set l
14f0: 61 6e 67 69 64 20 24 3a 3a 72 6f 77 69 64 5f 6c  angid $::rowid_l
1500: 69 73 74 5f 6c 61 6e 67 69 64 0a 20 20 73 65 74  ist_langid.  set
1510: 20 72 65 73 20 5b 6c 69 73 74 5d 0a 20 20 64 62   res [list].  db
1520: 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 72 6f   eval {SELECT ro
1530: 77 69 64 2c 20 78 2c 20 79 20 46 52 4f 4d 20 64  wid, x, y FROM d
1540: 61 74 61 20 57 48 45 52 45 20 6c 20 3d 20 24 6c  ata WHERE l = $l
1550: 61 6e 67 69 64 20 4f 52 44 45 52 20 42 59 20 72  angid ORDER BY r
1560: 6f 77 69 64 20 41 53 43 7d 20 7b 0a 20 20 20 20  owid ASC} {.    
1570: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63  if {[string matc
1580: 68 20 22 2a 24 70 61 74 74 65 72 6e 2a 22 20 24  h "*$pattern*" $
1590: 78 5d 20 7c 7c 20 5b 73 74 72 69 6e 67 20 6d 61  x] || [string ma
15a0: 74 63 68 20 22 2a 24 70 61 74 74 65 72 6e 2a 22  tch "*$pattern*"
15b0: 20 24 79 5d 7d 20 7b 0a 20 20 20 20 20 20 6c 61   $y]} {.      la
15c0: 70 70 65 6e 64 20 72 65 73 20 24 72 6f 77 69 64  ppend res $rowid
15d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
15e0: 75 72 6e 20 24 72 65 73 0a 7d 0a 0a 70 72 6f 63  urn $res.}..proc
15f0: 20 6f 72 5f 6d 65 72 67 65 5f 6c 69 73 74 20 7b   or_merge_list {
1600: 6c 69 73 74 31 20 6c 69 73 74 32 7d 20 7b 0a 20  list1 list2} {. 
1610: 20 73 65 74 20 72 65 73 20 5b 6c 69 73 74 5d 0a   set res [list].
1620: 0a 20 20 73 65 74 20 69 31 20 30 0a 20 20 73 65  .  set i1 0.  se
1630: 74 20 69 32 20 30 0a 0a 20 20 73 65 74 20 6e 31  t i2 0..  set n1
1640: 20 5b 6c 6c 65 6e 67 74 68 20 24 6c 69 73 74 31   [llength $list1
1650: 5d 0a 20 20 73 65 74 20 6e 32 20 5b 6c 6c 65 6e  ].  set n2 [llen
1660: 67 74 68 20 24 6c 69 73 74 32 5d 0a 0a 20 20 77  gth $list2]..  w
1670: 68 69 6c 65 20 7b 24 69 31 20 3c 20 24 6e 31 20  hile {$i1 < $n1 
1680: 26 26 20 24 69 32 20 3c 20 24 6e 32 7d 20 7b 0a  && $i2 < $n2} {.
1690: 20 20 20 20 73 65 74 20 65 31 20 5b 6c 69 6e 64      set e1 [lind
16a0: 65 78 20 24 6c 69 73 74 31 20 24 69 31 5d 0a 20  ex $list1 $i1]. 
16b0: 20 20 20 73 65 74 20 65 32 20 5b 6c 69 6e 64 65     set e2 [linde
16c0: 78 20 24 6c 69 73 74 32 20 24 69 32 5d 0a 0a 20  x $list2 $i2].. 
16d0: 20 20 20 69 66 20 7b 24 65 31 3d 3d 24 65 32 7d     if {$e1==$e2}
16e0: 20 7b 0a 20 20 20 20 20 20 6c 61 70 70 65 6e 64   {.      lappend
16f0: 20 72 65 73 20 24 65 31 0a 20 20 20 20 20 20 69   res $e1.      i
1700: 6e 63 72 20 69 31 0a 20 20 20 20 20 20 69 6e 63  ncr i1.      inc
1710: 72 20 69 32 0a 20 20 20 20 7d 20 65 6c 73 65 69  r i2.    } elsei
1720: 66 20 7b 24 65 31 20 3c 20 24 65 32 7d 20 7b 0a  f {$e1 < $e2} {.
1730: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65        lappend re
1740: 73 20 24 65 31 0a 20 20 20 20 20 20 69 6e 63 72  s $e1.      incr
1750: 20 69 31 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b   i1.    } else {
1760: 0a 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72  .      lappend r
1770: 65 73 20 24 65 32 0a 20 20 20 20 20 20 69 6e 63  es $e2.      inc
1780: 72 20 69 32 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  r i2.    }.  }..
1790: 20 20 63 6f 6e 63 61 74 20 24 72 65 73 20 5b 6c    concat $res [l
17a0: 72 61 6e 67 65 20 24 6c 69 73 74 31 20 24 69 31  range $list1 $i1
17b0: 20 65 6e 64 5d 20 5b 6c 72 61 6e 67 65 20 24 6c   end] [lrange $l
17c0: 69 73 74 32 20 24 69 32 20 65 6e 64 5d 0a 7d 0a  ist2 $i2 end].}.
17d0: 0a 70 72 6f 63 20 6f 72 5f 6d 65 72 67 65 5f 6c  .proc or_merge_l
17e0: 69 73 74 73 20 7b 61 72 67 73 7d 20 7b 0a 20 20  ists {args} {.  
17f0: 73 65 74 20 72 65 73 20 5b 6c 69 6e 64 65 78 20  set res [lindex 
1800: 24 61 72 67 73 20 30 5d 0a 20 20 66 6f 72 20 7b  $args 0].  for {
1810: 73 65 74 20 69 20 31 7d 20 7b 24 69 20 3c 20 5b  set i 1} {$i < [
1820: 6c 6c 65 6e 67 74 68 20 24 61 72 67 73 5d 7d 20  llength $args]} 
1830: 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 73  {incr i} {.    s
1840: 65 74 20 72 65 73 20 5b 6f 72 5f 6d 65 72 67 65  et res [or_merge
1850: 5f 6c 69 73 74 20 24 72 65 73 20 5b 6c 69 6e 64  _list $res [lind
1860: 65 78 20 24 61 72 67 73 20 24 69 5d 5d 0a 20 20  ex $args $i]].  
1870: 7d 0a 20 20 73 65 74 20 72 65 73 0a 7d 0a 0a 70  }.  set res.}..p
1880: 72 6f 63 20 61 6e 64 5f 6d 65 72 67 65 5f 6c 69  roc and_merge_li
1890: 73 74 20 7b 6c 69 73 74 31 20 6c 69 73 74 32 7d  st {list1 list2}
18a0: 20 7b 0a 20 20 66 6f 72 65 61 63 68 20 69 20 24   {.  foreach i $
18b0: 6c 69 73 74 32 20 7b 20 73 65 74 20 61 28 24 69  list2 { set a($i
18c0: 29 20 31 20 7d 0a 20 20 73 65 74 20 72 65 73 20  ) 1 }.  set res 
18d0: 5b 6c 69 73 74 5d 0a 20 20 66 6f 72 65 61 63 68  [list].  foreach
18e0: 20 69 20 24 6c 69 73 74 31 20 7b 0a 20 20 20 20   i $list1 {.    
18f0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
1900: 20 61 28 24 69 29 5d 7d 20 7b 6c 61 70 70 65 6e   a($i)]} {lappen
1910: 64 20 72 65 73 20 24 69 7d 0a 20 20 7d 0a 20 20  d res $i}.  }.  
1920: 73 65 74 20 72 65 73 0a 7d 0a 0a 0a 70 72 6f 63  set res.}...proc
1930: 20 61 6e 64 5f 6d 65 72 67 65 5f 6c 69 73 74 73   and_merge_lists
1940: 20 7b 61 72 67 73 7d 20 7b 0a 20 20 73 65 74 20   {args} {.  set 
1950: 72 65 73 20 5b 6c 69 6e 64 65 78 20 24 61 72 67  res [lindex $arg
1960: 73 20 30 5d 0a 20 20 66 6f 72 20 7b 73 65 74 20  s 0].  for {set 
1970: 69 20 31 7d 20 7b 24 69 20 3c 20 5b 6c 6c 65 6e  i 1} {$i < [llen
1980: 67 74 68 20 24 61 72 67 73 5d 7d 20 7b 69 6e 63  gth $args]} {inc
1990: 72 20 69 7d 20 7b 0a 20 20 20 20 73 65 74 20 72  r i} {.    set r
19a0: 65 73 20 5b 61 6e 64 5f 6d 65 72 67 65 5f 6c 69  es [and_merge_li
19b0: 73 74 20 24 72 65 73 20 5b 6c 69 6e 64 65 78 20  st $res [lindex 
19c0: 24 61 72 67 73 20 24 69 5d 5d 0a 20 20 7d 0a 20  $args $i]].  }. 
19d0: 20 73 65 74 20 72 65 73 0a 7d 0a 0a 70 72 6f 63   set res.}..proc
19e0: 20 66 69 6c 74 65 72 5f 6c 69 73 74 20 7b 6c 69   filter_list {li
19f0: 73 74 20 6c 61 6e 67 69 64 7d 20 7b 0a 20 20 73  st langid} {.  s
1a00: 65 74 20 72 65 73 20 5b 6c 69 73 74 5d 0a 20 20  et res [list].  
1a10: 66 6f 72 65 61 63 68 20 69 20 24 6c 69 73 74 20  foreach i $list 
1a20: 7b 0a 20 20 20 20 69 66 20 7b 28 24 69 20 25 20  {.    if {($i % 
1a30: 39 29 20 3d 3d 20 24 6c 61 6e 67 69 64 7d 20 7b  9) == $langid} {
1a40: 6c 61 70 70 65 6e 64 20 72 65 73 20 24 69 7d 0a  lappend res $i}.
1a50: 20 20 7d 0a 20 20 73 65 74 20 72 65 73 0a 7d 0a    }.  set res.}.
1a60: 0a 64 6f 5f 74 65 73 74 20 32 2e 30 20 7b 20 0a  .do_test 2.0 { .
1a70: 20 20 72 65 73 65 74 5f 64 62 0a 20 20 62 75 69    reset_db.  bui
1a80: 6c 64 5f 6d 75 6c 74 69 6c 69 6e 67 75 61 6c 5f  ld_multilingual_
1a90: 64 62 5f 31 20 64 62 0a 7d 20 7b 7d 0a 0a 70 72  db_1 db.} {}..pr
1aa0: 6f 63 20 64 6f 5f 74 65 73 74 5f 71 75 65 72 79  oc do_test_query
1ab0: 31 20 7b 74 6e 20 71 75 65 72 79 20 72 65 73 5f  1 {tn query res_
1ac0: 73 63 72 69 70 74 7d 20 7b 0a 20 20 66 6f 72 20  script} {.  for 
1ad0: 7b 73 65 74 20 6c 61 6e 67 69 64 20 30 7d 20 7b  {set langid 0} {
1ae0: 24 6c 61 6e 67 69 64 20 3c 20 31 30 7d 20 7b 69  $langid < 10} {i
1af0: 6e 63 72 20 6c 61 6e 67 69 64 7d 20 7b 0a 20 20  ncr langid} {.  
1b00: 20 20 72 6f 77 69 64 5f 6c 69 73 74 5f 73 65 74    rowid_list_set
1b10: 5f 6c 61 6e 67 69 64 20 24 6c 61 6e 67 69 64 0a  _langid $langid.
1b20: 20 20 20 20 73 65 74 20 72 65 73 20 5b 65 76 61      set res [eva
1b30: 6c 20 24 72 65 73 5f 73 63 72 69 70 74 5d 0a 0a  l $res_script]..
1b40: 20 20 20 20 73 65 74 20 61 63 74 75 61 6c 20 5b      set actual [
1b50: 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b  .      execsql {
1b60: 53 45 4c 45 43 54 20 64 6f 63 69 64 20 46 52 4f  SELECT docid FRO
1b70: 4d 20 74 32 20 57 48 45 52 45 20 74 32 20 4d 41  M t2 WHERE t2 MA
1b80: 54 43 48 20 24 71 75 65 72 79 20 41 4e 44 20 6c  TCH $query AND l
1b90: 20 3d 20 24 6c 61 6e 67 69 64 7d 0a 20 20 20 20   = $langid}.    
1ba0: 5d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 24 74  ].    do_test $t
1bb0: 6e 2e 24 6c 61 6e 67 69 64 20 5b 6c 69 73 74 20  n.$langid [list 
1bc0: 73 65 74 20 7b 7d 20 24 61 63 74 75 61 6c 5d 20  set {} $actual] 
1bd0: 24 72 65 73 0a 20 20 7d 0a 7d 0a 0a 23 20 52 75  $res.  }.}..# Ru
1be0: 6e 20 73 6f 6d 65 20 71 75 65 72 69 65 73 2e 20  n some queries. 
1bf0: 0a 64 6f 5f 74 65 73 74 5f 71 75 65 72 79 31 20  .do_test_query1 
1c00: 32 2e 31 2e 31 20 20 7b 64 65 6c 74 61 7d 20 20  2.1.1  {delta}  
1c10: 20 20 20 20 20 20 20 20 7b 20 72 6f 77 69 64 5f          { rowid_
1c20: 6c 69 73 74 20 64 65 6c 74 61 20 7d 0a 64 6f 5f  list delta }.do_
1c30: 74 65 73 74 5f 71 75 65 72 79 31 20 32 2e 31 2e  test_query1 2.1.
1c40: 32 20 20 7b 22 7a 65 72 6f 20 6f 6e 65 20 74 77  2  {"zero one tw
1c50: 6f 22 7d 20 7b 20 72 6f 77 69 64 5f 6c 69 73 74  o"} { rowid_list
1c60: 20 22 7a 65 72 6f 20 6f 6e 65 20 74 77 6f 22 20   "zero one two" 
1c70: 7d 0a 64 6f 5f 74 65 73 74 5f 71 75 65 72 79 31  }.do_test_query1
1c80: 20 32 2e 31 2e 33 20 20 7b 7a 65 72 6f 20 6f 6e   2.1.3  {zero on
1c90: 65 20 74 77 6f 7d 20 7b 0a 20 20 61 6e 64 5f 6d  e two} {.  and_m
1ca0: 65 72 67 65 5f 6c 69 73 74 73 20 5b 72 6f 77 69  erge_lists [rowi
1cb0: 64 5f 6c 69 73 74 20 7a 65 72 6f 5d 20 5b 72 6f  d_list zero] [ro
1cc0: 77 69 64 5f 6c 69 73 74 20 6f 6e 65 5d 20 5b 72  wid_list one] [r
1cd0: 6f 77 69 64 5f 6c 69 73 74 20 74 77 6f 5d 0a 7d  owid_list two].}
1ce0: 0a 64 6f 5f 74 65 73 74 5f 71 75 65 72 79 31 20  .do_test_query1 
1cf0: 32 2e 31 2e 34 20 20 7b 22 7a 65 72 6f 20 6f 6e  2.1.4  {"zero on
1d00: 65 22 20 4f 52 20 22 6f 6e 65 20 74 77 6f 22 7d  e" OR "one two"}
1d10: 20 7b 0a 20 20 6f 72 5f 6d 65 72 67 65 5f 6c 69   {.  or_merge_li
1d20: 73 74 73 20 5b 72 6f 77 69 64 5f 6c 69 73 74 20  sts [rowid_list 
1d30: 22 7a 65 72 6f 20 6f 6e 65 22 5d 20 5b 72 6f 77  "zero one"] [row
1d40: 69 64 5f 6c 69 73 74 20 22 6f 6e 65 20 74 77 6f  id_list "one two
1d50: 22 5d 0a 7d 0a 0a 23 20 4e 6f 77 20 74 72 79 20  "].}..# Now try 
1d60: 74 68 65 20 73 61 6d 65 20 74 65 73 74 73 20 61  the same tests a
1d70: 73 20 61 62 6f 76 65 2c 20 62 75 74 20 61 66 74  s above, but aft
1d80: 65 72 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 27  er running the '
1d90: 6f 70 74 69 6d 69 7a 65 27 0a 23 20 63 6f 6d 6d  optimize'.# comm
1da0: 61 6e 64 20 6f 6e 20 74 68 65 20 46 54 53 20 74  and on the FTS t
1db0: 61 62 6c 65 2e 0a 23 0a 64 6f 5f 65 78 65 63 73  able..#.do_execs
1dc0: 71 6c 5f 74 65 73 74 20 32 2e 32 20 7b 0a 20 20  ql_test 2.2 {.  
1dd0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 28 74  INSERT INTO t2(t
1de0: 32 29 20 56 41 4c 55 45 53 28 27 6f 70 74 69 6d  2) VALUES('optim
1df0: 69 7a 65 27 29 3b 0a 20 20 53 45 4c 45 43 54 20  ize');.  SELECT 
1e00: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32  count(*) FROM t2
1e10: 5f 73 65 67 64 69 72 3b 0a 7d 20 7b 39 7d 0a 64  _segdir;.} {9}.d
1e20: 6f 5f 74 65 73 74 5f 71 75 65 72 79 31 20 32 2e  o_test_query1 2.
1e30: 32 2e 31 20 7b 64 65 6c 74 61 7d 20 20 20 20 20  2.1 {delta}     
1e40: 20 20 20 20 20 7b 20 72 6f 77 69 64 5f 6c 69 73       { rowid_lis
1e50: 74 20 64 65 6c 74 61 20 7d 0a 64 6f 5f 74 65 73  t delta }.do_tes
1e60: 74 5f 71 75 65 72 79 31 20 32 2e 32 2e 32 20 7b  t_query1 2.2.2 {
1e70: 22 7a 65 72 6f 20 6f 6e 65 20 74 77 6f 22 7d 20  "zero one two"} 
1e80: 7b 20 72 6f 77 69 64 5f 6c 69 73 74 20 22 7a 65  { rowid_list "ze
1e90: 72 6f 20 6f 6e 65 20 74 77 6f 22 20 7d 0a 64 6f  ro one two" }.do
1ea0: 5f 74 65 73 74 5f 71 75 65 72 79 31 20 32 2e 32  _test_query1 2.2
1eb0: 2e 33 20 7b 7a 65 72 6f 20 6f 6e 65 20 74 77 6f  .3 {zero one two
1ec0: 7d 20 7b 0a 20 20 61 6e 64 5f 6d 65 72 67 65 5f  } {.  and_merge_
1ed0: 6c 69 73 74 73 20 5b 72 6f 77 69 64 5f 6c 69 73  lists [rowid_lis
1ee0: 74 20 7a 65 72 6f 5d 20 5b 72 6f 77 69 64 5f 6c  t zero] [rowid_l
1ef0: 69 73 74 20 6f 6e 65 5d 20 5b 72 6f 77 69 64 5f  ist one] [rowid_
1f00: 6c 69 73 74 20 74 77 6f 5d 0a 7d 0a 64 6f 5f 74  list two].}.do_t
1f10: 65 73 74 5f 71 75 65 72 79 31 20 32 2e 32 2e 34  est_query1 2.2.4
1f20: 20 7b 22 7a 65 72 6f 20 6f 6e 65 22 20 4f 52 20   {"zero one" OR 
1f30: 22 6f 6e 65 20 74 77 6f 22 7d 20 7b 0a 20 20 6f  "one two"} {.  o
1f40: 72 5f 6d 65 72 67 65 5f 6c 69 73 74 73 20 5b 72  r_merge_lists [r
1f50: 6f 77 69 64 5f 6c 69 73 74 20 22 7a 65 72 6f 20  owid_list "zero 
1f60: 6f 6e 65 22 5d 20 5b 72 6f 77 69 64 5f 6c 69 73  one"] [rowid_lis
1f70: 74 20 22 6f 6e 65 20 74 77 6f 22 5d 0a 7d 0a 0a  t "one two"].}..
1f80: 23 20 41 6e 64 20 72 65 62 75 69 6c 64 2e 0a 23  # And rebuild..#
1f90: 0a 64 6f 5f 74 65 73 74 20 32 2e 33 20 7b 20 0a  .do_test 2.3 { .
1fa0: 20 20 72 65 73 65 74 5f 64 62 0a 20 20 62 75 69    reset_db.  bui
1fb0: 6c 64 5f 6d 75 6c 74 69 6c 69 6e 67 75 61 6c 5f  ld_multilingual_
1fc0: 64 62 5f 31 20 64 62 0a 20 20 65 78 65 63 73 71  db_1 db.  execsq
1fd0: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
1fe0: 74 32 28 74 32 29 20 56 41 4c 55 45 53 28 27 72  t2(t2) VALUES('r
1ff0: 65 62 75 69 6c 64 27 29 20 7d 0a 7d 20 7b 7d 0a  ebuild') }.} {}.
2000: 64 6f 5f 74 65 73 74 5f 71 75 65 72 79 31 20 32  do_test_query1 2
2010: 2e 33 2e 31 20 7b 64 65 6c 74 61 7d 20 20 20 20  .3.1 {delta}    
2020: 20 20 20 20 20 20 7b 20 72 6f 77 69 64 5f 6c 69        { rowid_li
2030: 73 74 20 64 65 6c 74 61 20 7d 0a 64 6f 5f 74 65  st delta }.do_te
2040: 73 74 5f 71 75 65 72 79 31 20 32 2e 33 2e 32 20  st_query1 2.3.2 
2050: 7b 22 7a 65 72 6f 20 6f 6e 65 20 74 77 6f 22 7d  {"zero one two"}
2060: 20 7b 20 72 6f 77 69 64 5f 6c 69 73 74 20 22 7a   { rowid_list "z
2070: 65 72 6f 20 6f 6e 65 20 74 77 6f 22 20 7d 0a 64  ero one two" }.d
2080: 6f 5f 74 65 73 74 5f 71 75 65 72 79 31 20 32 2e  o_test_query1 2.
2090: 33 2e 33 20 7b 7a 65 72 6f 20 6f 6e 65 20 74 77  3.3 {zero one tw
20a0: 6f 7d 20 7b 0a 20 20 61 6e 64 5f 6d 65 72 67 65  o} {.  and_merge
20b0: 5f 6c 69 73 74 73 20 5b 72 6f 77 69 64 5f 6c 69  _lists [rowid_li
20c0: 73 74 20 7a 65 72 6f 5d 20 5b 72 6f 77 69 64 5f  st zero] [rowid_
20d0: 6c 69 73 74 20 6f 6e 65 5d 20 5b 72 6f 77 69 64  list one] [rowid
20e0: 5f 6c 69 73 74 20 74 77 6f 5d 0a 7d 0a 64 6f 5f  _list two].}.do_
20f0: 74 65 73 74 5f 71 75 65 72 79 31 20 32 2e 33 2e  test_query1 2.3.
2100: 34 20 7b 22 7a 65 72 6f 20 6f 6e 65 22 20 4f 52  4 {"zero one" OR
2110: 20 22 6f 6e 65 20 74 77 6f 22 7d 20 7b 0a 20 20   "one two"} {.  
2120: 6f 72 5f 6d 65 72 67 65 5f 6c 69 73 74 73 20 5b  or_merge_lists [
2130: 72 6f 77 69 64 5f 6c 69 73 74 20 22 7a 65 72 6f  rowid_list "zero
2140: 20 6f 6e 65 22 5d 20 5b 72 6f 77 69 64 5f 6c 69   one"] [rowid_li
2150: 73 74 20 22 6f 6e 65 20 74 77 6f 22 5d 0a 7d 0a  st "one two"].}.
2160: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
2170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
21b0: 73 74 20 63 61 73 65 73 20 33 2e 2a 0a 23 0a 64  st cases 3.*.#.d
21c0: 6f 5f 74 65 73 74 20 33 2e 30 20 7b 0a 20 20 72  o_test 3.0 {.  r
21d0: 65 73 65 74 5f 64 62 0a 20 20 62 75 69 6c 64 5f  eset_db.  build_
21e0: 6d 75 6c 74 69 6c 69 6e 67 75 61 6c 5f 64 62 5f  multilingual_db_
21f0: 31 20 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  1 db.  execsql {
2200: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
2210: 45 20 74 33 5f 64 61 74 61 28 6c 2c 20 78 2c 20  E t3_data(l, x, 
2220: 79 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  y);.    INSERT I
2230: 4e 54 4f 20 74 33 5f 64 61 74 61 28 72 6f 77 69  NTO t3_data(rowi
2240: 64 2c 20 6c 2c 20 78 2c 20 79 29 20 53 45 4c 45  d, l, x, y) SELE
2250: 43 54 20 64 6f 63 69 64 2c 20 6c 2c 20 78 2c 20  CT docid, l, x, 
2260: 79 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 44  y FROM t2;.    D
2270: 52 4f 50 20 54 41 42 4c 45 20 74 32 3b 0a 20 20  ROP TABLE t2;.  
2280: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71  }.} {}.do_execsq
2290: 6c 5f 74 65 73 74 20 33 2e 31 20 7b 0a 20 20 43  l_test 3.1 {.  C
22a0: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
22b0: 42 4c 45 20 74 32 20 55 53 49 4e 47 20 66 74 73  BLE t2 USING fts
22c0: 34 28 63 6f 6e 74 65 6e 74 3d 74 33 5f 64 61 74  4(content=t3_dat
22d0: 61 2c 20 6c 61 6e 67 75 61 67 65 69 64 3d 6c 29  a, languageid=l)
22e0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
22f0: 74 32 28 74 32 29 20 56 41 4c 55 45 53 28 27 72  t2(t2) VALUES('r
2300: 65 62 75 69 6c 64 27 29 3b 0a 7d 0a 0a 64 6f 5f  ebuild');.}..do_
2310: 74 65 73 74 5f 71 75 65 72 79 31 20 33 2e 31 2e  test_query1 3.1.
2320: 31 20 7b 64 65 6c 74 61 7d 20 20 20 20 20 20 20  1 {delta}       
2330: 20 20 20 7b 20 72 6f 77 69 64 5f 6c 69 73 74 20     { rowid_list 
2340: 64 65 6c 74 61 20 7d 0a 64 6f 5f 74 65 73 74 5f  delta }.do_test_
2350: 71 75 65 72 79 31 20 33 2e 31 2e 32 20 7b 22 7a  query1 3.1.2 {"z
2360: 65 72 6f 20 6f 6e 65 20 74 77 6f 22 7d 20 7b 20  ero one two"} { 
2370: 72 6f 77 69 64 5f 6c 69 73 74 20 22 7a 65 72 6f  rowid_list "zero
2380: 20 6f 6e 65 20 74 77 6f 22 20 7d 0a 64 6f 5f 74   one two" }.do_t
2390: 65 73 74 5f 71 75 65 72 79 31 20 33 2e 31 2e 33  est_query1 3.1.3
23a0: 20 7b 7a 65 72 6f 20 6f 6e 65 20 74 77 6f 7d 20   {zero one two} 
23b0: 7b 0a 20 20 61 6e 64 5f 6d 65 72 67 65 5f 6c 69  {.  and_merge_li
23c0: 73 74 73 20 5b 72 6f 77 69 64 5f 6c 69 73 74 20  sts [rowid_list 
23d0: 7a 65 72 6f 5d 20 5b 72 6f 77 69 64 5f 6c 69 73  zero] [rowid_lis
23e0: 74 20 6f 6e 65 5d 20 5b 72 6f 77 69 64 5f 6c 69  t one] [rowid_li
23f0: 73 74 20 74 77 6f 5d 0a 7d 0a 64 6f 5f 74 65 73  st two].}.do_tes
2400: 74 5f 71 75 65 72 79 31 20 33 2e 31 2e 34 20 7b  t_query1 3.1.4 {
2410: 22 7a 65 72 6f 20 6f 6e 65 22 20 4f 52 20 22 6f  "zero one" OR "o
2420: 6e 65 20 74 77 6f 22 7d 20 7b 0a 20 20 6f 72 5f  ne two"} {.  or_
2430: 6d 65 72 67 65 5f 6c 69 73 74 73 20 5b 72 6f 77  merge_lists [row
2440: 69 64 5f 6c 69 73 74 20 22 7a 65 72 6f 20 6f 6e  id_list "zero on
2450: 65 22 5d 20 5b 72 6f 77 69 64 5f 6c 69 73 74 20  e"] [rowid_list 
2460: 22 6f 6e 65 20 74 77 6f 22 5d 0a 7d 0a 0a 64 6f  "one two"].}..do
2470: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33 2e  _execsql_test 3.
2480: 32 2e 31 20 7b 0a 20 20 44 52 4f 50 20 54 41 42  2.1 {.  DROP TAB
2490: 4c 45 20 74 32 3b 0a 20 20 43 52 45 41 54 45 20  LE t2;.  CREATE 
24a0: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 32  VIRTUAL TABLE t2
24b0: 20 55 53 49 4e 47 20 66 74 73 34 28 78 2c 20 79   USING fts4(x, y
24c0: 2c 20 6c 61 6e 67 75 61 67 65 69 64 3d 6c 2c 20  , languageid=l, 
24d0: 63 6f 6e 74 65 6e 74 3d 6e 6f 73 75 63 68 74 61  content=nosuchta
24e0: 62 6c 65 29 3b 0a 7d 0a 0a 64 6f 5f 65 78 65 63  ble);.}..do_exec
24f0: 73 71 6c 5f 74 65 73 74 20 33 2e 32 2e 32 20 7b  sql_test 3.2.2 {
2500: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
2510: 32 28 64 6f 63 69 64 2c 20 78 2c 20 79 2c 20 6c  2(docid, x, y, l
2520: 29 20 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20  ) SELECT rowid, 
2530: 78 2c 20 79 2c 20 6c 20 46 52 4f 4d 20 74 33 5f  x, y, l FROM t3_
2540: 64 61 74 61 3b 0a 7d 0a 0a 64 6f 5f 65 78 65 63  data;.}..do_exec
2550: 73 71 6c 5f 74 65 73 74 20 33 2e 32 2e 33 20 7b  sql_test 3.2.3 {
2560: 0a 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 33  .  DROP TABLE t3
2570: 5f 64 61 74 61 3b 0a 7d 0a 0a 64 6f 5f 74 65 73  _data;.}..do_tes
2580: 74 5f 71 75 65 72 79 31 20 33 2e 33 2e 31 20 7b  t_query1 3.3.1 {
2590: 64 65 6c 74 61 7d 20 20 20 20 20 20 20 20 20 20  delta}          
25a0: 7b 20 72 6f 77 69 64 5f 6c 69 73 74 20 64 65 6c  { rowid_list del
25b0: 74 61 20 7d 0a 64 6f 5f 74 65 73 74 5f 71 75 65  ta }.do_test_que
25c0: 72 79 31 20 33 2e 33 2e 32 20 7b 22 7a 65 72 6f  ry1 3.3.2 {"zero
25d0: 20 6f 6e 65 20 74 77 6f 22 7d 20 7b 20 72 6f 77   one two"} { row
25e0: 69 64 5f 6c 69 73 74 20 22 7a 65 72 6f 20 6f 6e  id_list "zero on
25f0: 65 20 74 77 6f 22 20 7d 0a 64 6f 5f 74 65 73 74  e two" }.do_test
2600: 5f 71 75 65 72 79 31 20 33 2e 33 2e 33 20 7b 7a  _query1 3.3.3 {z
2610: 65 72 6f 20 6f 6e 65 20 74 77 6f 7d 20 7b 0a 20  ero one two} {. 
2620: 20 61 6e 64 5f 6d 65 72 67 65 5f 6c 69 73 74 73   and_merge_lists
2630: 20 5b 72 6f 77 69 64 5f 6c 69 73 74 20 7a 65 72   [rowid_list zer
2640: 6f 5d 20 5b 72 6f 77 69 64 5f 6c 69 73 74 20 6f  o] [rowid_list o
2650: 6e 65 5d 20 5b 72 6f 77 69 64 5f 6c 69 73 74 20  ne] [rowid_list 
2660: 74 77 6f 5d 0a 7d 0a 64 6f 5f 74 65 73 74 5f 71  two].}.do_test_q
2670: 75 65 72 79 31 20 33 2e 33 2e 34 20 7b 22 7a 65  uery1 3.3.4 {"ze
2680: 72 6f 20 6f 6e 65 22 20 4f 52 20 22 6f 6e 65 20  ro one" OR "one 
2690: 74 77 6f 22 7d 20 7b 0a 20 20 6f 72 5f 6d 65 72  two"} {.  or_mer
26a0: 67 65 5f 6c 69 73 74 73 20 5b 72 6f 77 69 64 5f  ge_lists [rowid_
26b0: 6c 69 73 74 20 22 7a 65 72 6f 20 6f 6e 65 22 5d  list "zero one"]
26c0: 20 5b 72 6f 77 69 64 5f 6c 69 73 74 20 22 6f 6e   [rowid_list "on
26d0: 65 20 74 77 6f 22 5d 0a 7d 0a 0a 64 6f 5f 65 78  e two"].}..do_ex
26e0: 65 63 73 71 6c 5f 74 65 73 74 20 33 2e 34 20 7b  ecsql_test 3.4 {
26f0: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
2700: 74 38 63 28 61 2c 20 62 29 3b 0a 20 20 43 52 45  t8c(a, b);.  CRE
2710: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
2720: 45 20 74 38 20 55 53 49 4e 47 20 66 74 73 34 28  E t8 USING fts4(
2730: 63 6f 6e 74 65 6e 74 3d 74 38 63 2c 20 6c 61 6e  content=t8c, lan
2740: 67 75 61 67 65 69 64 3d 6c 61 6e 67 69 64 29 3b  guageid=langid);
2750: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
2760: 38 28 64 6f 63 69 64 2c 20 61 2c 20 62 29 20 56  8(docid, a, b) V
2770: 41 4c 55 45 53 28 2d 31 2c 20 27 6f 6e 65 20 74  ALUES(-1, 'one t
2780: 77 6f 20 74 68 72 65 65 27 2c 20 27 78 20 79 20  wo three', 'x y 
2790: 7a 27 29 3b 0a 20 20 53 45 4c 45 43 54 20 64 6f  z');.  SELECT do
27a0: 63 69 64 20 46 52 4f 4d 20 74 38 20 57 48 45 52  cid FROM t8 WHER
27b0: 45 20 74 38 20 4d 41 54 43 48 20 27 6f 6e 65 20  E t8 MATCH 'one 
27c0: 78 27 20 41 4e 44 20 6c 61 6e 67 69 64 3d 30 0a  x' AND langid=0.
27d0: 7d 20 7b 2d 31 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  } {-1}..#-------
27e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2820: 2d 2d 0a 23 20 54 65 73 74 20 63 61 73 65 73 20  --.# Test cases 
2830: 34 2e 2a 0a 23 0a 70 72 6f 63 20 62 75 69 6c 64  4.*.#.proc build
2840: 5f 6d 75 6c 74 69 6c 69 6e 67 75 61 6c 5f 64 62  _multilingual_db
2850: 5f 32 20 7b 64 62 7d 20 7b 0a 20 20 24 64 62 20  _2 {db} {.  $db 
2860: 65 76 61 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  eval {.    CREAT
2870: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
2880: 74 34 20 55 53 49 4e 47 20 66 74 73 34 28 0a 20  t4 USING fts4(. 
2890: 20 20 20 20 20 20 20 74 6f 6b 65 6e 69 7a 65 3d         tokenize=
28a0: 74 65 73 74 74 6f 6b 65 6e 69 7a 65 72 2c 20 0a  testtokenizer, .
28b0: 20 20 20 20 20 20 20 20 6c 61 6e 67 75 61 67 65          language
28c0: 69 64 3d 6c 69 64 0a 20 20 20 20 29 3b 0a 20 20  id=lid.    );.  
28d0: 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30  }.  for {set i 0
28e0: 7d 20 7b 24 69 20 3c 20 35 30 7d 20 7b 69 6e 63  } {$i < 50} {inc
28f0: 72 20 69 7d 20 7b 0a 20 20 20 20 65 78 65 63 73  r i} {.    execs
2900: 71 6c 20 7b 20 0a 20 20 20 20 20 20 49 4e 53 45  ql { .      INSE
2910: 52 54 20 49 4e 54 4f 20 74 34 28 64 6f 63 69 64  RT INTO t4(docid
2920: 2c 20 63 6f 6e 74 65 6e 74 2c 20 6c 69 64 29 20  , content, lid) 
2930: 56 41 4c 55 45 53 28 24 69 2c 20 27 54 68 65 20  VALUES($i, 'The 
2940: 51 75 69 63 6b 20 42 72 6f 77 6e 20 46 6f 78 27  Quick Brown Fox'
2950: 2c 20 24 69 29 20 0a 20 20 20 20 7d 0a 20 20 7d  , $i) .    }.  }
2960: 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 34 2e 31 2e  .}..do_test 4.1.
2970: 30 20 7b 0a 20 20 72 65 73 65 74 5f 64 62 0a 20  0 {.  reset_db. 
2980: 20 73 65 74 20 70 74 72 20 5b 66 74 73 33 5f 74   set ptr [fts3_t
2990: 65 73 74 5f 74 6f 6b 65 6e 69 7a 65 72 5d 0a 20  est_tokenizer]. 
29a0: 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66   sqlite3_db_conf
29b0: 69 67 20 64 62 20 53 51 4c 49 54 45 5f 44 42 43  ig db SQLITE_DBC
29c0: 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46 54 53  ONFIG_ENABLE_FTS
29d0: 33 5f 54 4f 4b 45 4e 49 5a 45 52 20 31 0a 20 20  3_TOKENIZER 1.  
29e0: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
29f0: 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 28   fts3_tokenizer(
2a00: 27 74 65 73 74 74 6f 6b 65 6e 69 7a 65 72 27 2c  'testtokenizer',
2a10: 20 24 70 74 72 29 20 7d 0a 20 20 62 75 69 6c 64   $ptr) }.  build
2a20: 5f 6d 75 6c 74 69 6c 69 6e 67 75 61 6c 5f 64 62  _multilingual_db
2a30: 5f 32 20 64 62 0a 7d 20 7b 7d 0a 64 6f 5f 65 78  _2 db.} {}.do_ex
2a40: 65 63 73 71 6c 5f 74 65 73 74 20 34 2e 31 2e 31  ecsql_test 4.1.1
2a50: 20 7b 0a 20 20 53 45 4c 45 43 54 20 64 6f 63 69   {.  SELECT doci
2a60: 64 20 46 52 4f 4d 20 74 34 20 57 48 45 52 45 20  d FROM t4 WHERE 
2a70: 74 34 20 4d 41 54 43 48 20 27 71 75 69 63 6b 27  t4 MATCH 'quick'
2a80: 3b 0a 7d 20 7b 30 7d 0a 64 6f 5f 65 78 65 63 73  ;.} {0}.do_execs
2a90: 71 6c 5f 74 65 73 74 20 34 2e 31 2e 32 20 7b 0a  ql_test 4.1.2 {.
2aa0: 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64 20 46    SELECT docid F
2ab0: 52 4f 4d 20 74 34 20 57 48 45 52 45 20 74 34 20  ROM t4 WHERE t4 
2ac0: 4d 41 54 43 48 20 27 71 75 69 63 6b 27 20 41 4e  MATCH 'quick' AN
2ad0: 44 20 6c 69 64 3d 31 3b 0a 7d 20 7b 7d 0a 64 6f  D lid=1;.} {}.do
2ae0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 34 2e  _execsql_test 4.
2af0: 31 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 64  1.3 {.  SELECT d
2b00: 6f 63 69 64 20 46 52 4f 4d 20 74 34 20 57 48 45  ocid FROM t4 WHE
2b10: 52 45 20 74 34 20 4d 41 54 43 48 20 27 51 75 69  RE t4 MATCH 'Qui
2b20: 63 6b 27 20 41 4e 44 20 6c 69 64 3d 31 3b 0a 7d  ck' AND lid=1;.}
2b30: 20 7b 31 7d 0a 66 6f 72 20 7b 73 65 74 20 69 20   {1}.for {set i 
2b40: 30 7d 20 7b 24 69 20 3c 20 35 30 7d 20 7b 69 6e  0} {$i < 50} {in
2b50: 63 72 20 69 7d 20 7b 0a 20 20 64 6f 5f 65 78 65  cr i} {.  do_exe
2b60: 63 73 71 6c 5f 74 65 73 74 20 34 2e 31 2e 34 2e  csql_test 4.1.4.
2b70: 24 69 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  $i {.    SELECT 
2b80: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 34  count(*) FROM t4
2b90: 20 57 48 45 52 45 20 74 34 20 4d 41 54 43 48 20   WHERE t4 MATCH 
2ba0: 27 66 6f 78 27 20 41 4e 44 20 6c 69 64 3d 24 69  'fox' AND lid=$i
2bb0: 3b 0a 20 20 7d 20 5b 65 78 70 72 20 30 3d 3d 28  ;.  } [expr 0==(
2bc0: 24 69 25 32 29 5d 0a 7d 0a 64 6f 5f 63 61 74 63  $i%2)].}.do_catc
2bd0: 68 73 71 6c 5f 74 65 73 74 20 34 2e 31 2e 35 20  hsql_test 4.1.5 
2be0: 7b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  {.  INSERT INTO 
2bf0: 74 34 28 63 6f 6e 74 65 6e 74 2c 20 6c 69 64 29  t4(content, lid)
2c00: 20 56 41 4c 55 45 53 28 27 68 65 6c 6c 6f 20 77   VALUES('hello w
2c10: 6f 72 6c 64 27 2c 20 31 30 31 29 0a 7d 20 7b 31  orld', 101).} {1
2c20: 20 7b 53 51 4c 20 6c 6f 67 69 63 20 65 72 72 6f   {SQL logic erro
2c30: 72 20 6f 72 20 6d 69 73 73 69 6e 67 20 64 61 74  r or missing dat
2c40: 61 62 61 73 65 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  abase}}..#------
2c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c90: 2d 2d 2d 0a 23 20 54 65 73 74 20 63 61 73 65 73  ---.# Test cases
2ca0: 20 35 2e 2a 0a 23 0a 23 20 54 68 65 20 66 6f 6c   5.*.#.# The fol
2cb0: 6c 6f 77 69 6e 67 20 74 65 73 74 20 63 61 73 65  lowing test case
2cc0: 73 20 61 72 65 20 64 65 73 69 67 6e 65 64 20 74  s are designed t
2cd0: 6f 20 64 65 74 65 63 74 20 61 20 33 32 2d 62 69  o detect a 32-bi
2ce0: 74 20 6f 76 65 72 66 6c 6f 77 20 62 75 67 0a 23  t overflow bug.#
2cf0: 20 74 68 61 74 20 65 78 69 73 74 65 64 20 61 74   that existed at
2d00: 20 6f 6e 65 20 70 6f 69 6e 74 2e 0a 23 0a 70 72   one point..#.pr
2d10: 6f 63 20 62 75 69 6c 64 5f 6d 75 6c 74 69 6c 69  oc build_multili
2d20: 6e 67 75 61 6c 5f 64 62 5f 33 20 7b 64 62 7d 20  ngual_db_3 {db} 
2d30: 7b 0a 20 20 24 64 62 20 65 76 61 6c 20 7b 0a 20  {.  $db eval {. 
2d40: 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41     CREATE VIRTUA
2d50: 4c 20 54 41 42 4c 45 20 74 35 20 55 53 49 4e 47  L TABLE t5 USING
2d60: 20 66 74 73 34 28 6c 61 6e 67 75 61 67 65 69 64   fts4(languageid
2d70: 3d 6c 69 64 29 3b 0a 20 20 7d 0a 20 20 73 65 74  =lid);.  }.  set
2d80: 20 6c 61 6e 67 75 61 67 65 73 20 5b 6c 69 73 74   languages [list
2d90: 20 30 20 31 20 32 20 5b 65 78 70 72 20 31 3c 3c   0 1 2 [expr 1<<
2da0: 33 30 5d 5d 0a 0a 20 20 66 6f 72 65 61 63 68 20  30]]..  foreach 
2db0: 6c 69 64 20 24 6c 61 6e 67 75 61 67 65 73 20 7b  lid $languages {
2dc0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
2dd0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
2de0: 20 74 35 28 64 6f 63 69 64 2c 20 63 6f 6e 74 65   t5(docid, conte
2df0: 6e 74 2c 20 6c 69 64 29 20 56 41 4c 55 45 53 28  nt, lid) VALUES(
2e00: 0a 20 20 20 20 20 20 20 20 20 20 24 6c 69 64 2c  .          $lid,
2e10: 20 27 4d 79 20 6c 61 6e 67 75 61 67 65 20 69 73   'My language is
2e20: 20 27 20 7c 7c 20 24 6c 69 64 2c 20 24 6c 69 64   ' || $lid, $lid
2e30: 0a 20 20 20 20 20 20 29 20 0a 20 20 20 20 7d 0a  .      ) .    }.
2e40: 20 20 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 35    }.}..do_test 5
2e50: 2e 31 2e 30 20 7b 0a 20 20 72 65 73 65 74 5f 64  .1.0 {.  reset_d
2e60: 62 0a 20 20 62 75 69 6c 64 5f 6d 75 6c 74 69 6c  b.  build_multil
2e70: 69 6e 67 75 61 6c 5f 64 62 5f 33 20 64 62 0a 7d  ingual_db_3 db.}
2e80: 20 7b 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   {}..do_execsql_
2e90: 74 65 73 74 20 35 2e 31 2e 31 20 7b 0a 20 20 53  test 5.1.1 {.  S
2ea0: 45 4c 45 43 54 20 6c 65 76 65 6c 20 46 52 4f 4d  ELECT level FROM
2eb0: 20 74 35 5f 73 65 67 64 69 72 3b 0a 7d 20 5b 6c   t5_segdir;.} [l
2ec0: 69 73 74 20 30 20 31 30 32 34 20 32 30 34 38 20  ist 0 1024 2048 
2ed0: 5b 65 78 70 72 20 31 3c 3c 34 30 5d 5d 0a 0a 64  [expr 1<<40]]..d
2ee0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 35  o_execsql_test 5
2ef0: 2e 31 2e 32 20 7b 53 45 4c 45 43 54 20 64 6f 63  .1.2 {SELECT doc
2f00: 69 64 20 46 52 4f 4d 20 74 35 20 57 48 45 52 45  id FROM t5 WHERE
2f10: 20 74 35 20 4d 41 54 43 48 20 27 6c 61 6e 67 75   t5 MATCH 'langu
2f20: 61 67 65 27 7d 20 30 0a 66 6f 72 65 61 63 68 20  age'} 0.foreach 
2f30: 6c 61 6e 67 69 64 20 5b 6c 69 73 74 20 30 20 31  langid [list 0 1
2f40: 20 32 20 5b 65 78 70 72 20 31 3c 3c 33 30 5d 5d   2 [expr 1<<30]]
2f50: 20 7b 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f   {.  do_execsql_
2f60: 74 65 73 74 20 35 2e 32 2e 24 6c 61 6e 67 69 64  test 5.2.$langid
2f70: 20 7b 20 0a 20 20 20 20 53 45 4c 45 43 54 20 64   { .    SELECT d
2f80: 6f 63 69 64 20 46 52 4f 4d 20 74 35 20 57 48 45  ocid FROM t5 WHE
2f90: 52 45 20 74 35 20 4d 41 54 43 48 20 27 6c 61 6e  RE t5 MATCH 'lan
2fa0: 67 75 61 67 65 27 20 41 4e 44 20 6c 69 64 20 3d  guage' AND lid =
2fb0: 20 24 6c 61 6e 67 69 64 0a 20 20 7d 20 24 6c 61   $langid.  } $la
2fc0: 6e 67 69 64 0a 7d 0a 0a 73 65 74 20 6c 69 64 20  ngid.}..set lid 
2fd0: 5b 65 78 70 72 20 31 3c 3c 33 30 5d 0a 64 6f 5f  [expr 1<<30].do_
2fe0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 35 2e 33  execsql_test 5.3
2ff0: 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20 56 49  .1 {.  CREATE VI
3000: 52 54 55 41 4c 20 54 41 42 4c 45 20 74 36 20 55  RTUAL TABLE t6 U
3010: 53 49 4e 47 20 66 74 73 34 28 6c 61 6e 67 75 61  SING fts4(langua
3020: 67 65 69 64 3d 6c 69 64 29 3b 0a 20 20 49 4e 53  geid=lid);.  INS
3030: 45 52 54 20 49 4e 54 4f 20 74 36 20 56 41 4c 55  ERT INTO t6 VALU
3040: 45 53 28 27 49 20 62 65 6c 6f 6e 67 20 74 6f 20  ES('I belong to 
3050: 6c 61 6e 67 75 61 67 65 20 30 21 27 29 3b 0a 7d  language 0!');.}
3060: 0a 64 6f 5f 74 65 73 74 20 35 2e 33 2e 32 20 7b  .do_test 5.3.2 {
3070: 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d  .  for {set i 0}
3080: 20 7b 24 69 20 3c 20 32 30 7d 20 7b 69 6e 63 72   {$i < 20} {incr
3090: 20 69 7d 20 7b 0a 20 20 20 20 65 78 65 63 73 71   i} {.    execsq
30a0: 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  l {.      INSERT
30b0: 20 49 4e 54 4f 20 74 36 28 63 6f 6e 74 65 6e 74   INTO t6(content
30c0: 2c 20 6c 69 64 29 20 56 41 4c 55 45 53 28 0a 20  , lid) VALUES(. 
30d0: 20 20 20 20 20 20 20 27 49 20 28 72 6f 77 20 27         'I (row '
30e0: 7c 7c 24 69 7c 7c 27 29 20 62 65 6c 6f 6e 67 20  ||$i||') belong 
30f0: 74 6f 20 6c 61 6e 67 61 75 67 65 20 4e 21 27 2c  to langauge N!',
3100: 20 24 6c 69 64 0a 20 20 20 20 20 20 29 3b 0a 20   $lid.      );. 
3110: 20 20 20 7d 0a 20 20 7d 0a 20 20 65 78 65 63 73     }.  }.  execs
3120: 71 6c 20 7b 20 53 45 4c 45 43 54 20 64 6f 63 69  ql { SELECT doci
3130: 64 20 46 52 4f 4d 20 74 36 20 57 48 45 52 45 20  d FROM t6 WHERE 
3140: 74 36 20 4d 41 54 43 48 20 27 62 65 6c 6f 6e 67  t6 MATCH 'belong
3150: 27 20 7d 0a 7d 20 7b 31 7d 0a 0a 64 6f 5f 74 65  ' }.} {1}..do_te
3160: 73 74 20 35 2e 33 2e 33 20 7b 0a 20 20 65 78 65  st 5.3.3 {.  exe
3170: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 64 6f  csql { SELECT do
3180: 63 69 64 20 46 52 4f 4d 20 74 36 20 57 48 45 52  cid FROM t6 WHER
3190: 45 20 74 36 20 4d 41 54 43 48 20 27 62 65 6c 6f  E t6 MATCH 'belo
31a0: 6e 67 27 20 41 4e 44 20 6c 69 64 3d 24 6c 69 64  ng' AND lid=$lid
31b0: 7d 0a 7d 20 7b 32 20 33 20 34 20 35 20 36 20 37  }.} {2 3 4 5 6 7
31c0: 20 38 20 39 20 31 30 20 31 31 20 31 32 20 31 33   8 9 10 11 12 13
31d0: 20 31 34 20 31 35 20 31 36 20 31 37 20 31 38 20   14 15 16 17 18 
31e0: 31 39 20 32 30 20 32 31 7d 0a 0a 64 6f 5f 65 78  19 20 21}..do_ex
31f0: 65 63 73 71 6c 5f 74 65 73 74 20 35 2e 33 2e 34  ecsql_test 5.3.4
3200: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
3210: 36 28 74 36 29 20 56 41 4c 55 45 53 28 27 6f 70  6(t6) VALUES('op
3220: 74 69 6d 69 7a 65 27 29 20 7d 20 7b 7d 0a 64 6f  timize') } {}.do
3230: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 35 2e  _execsql_test 5.
3240: 33 2e 35 20 7b 20 53 45 4c 45 43 54 20 64 6f 63  3.5 { SELECT doc
3250: 69 64 20 46 52 4f 4d 20 74 36 20 57 48 45 52 45  id FROM t6 WHERE
3260: 20 74 36 20 4d 41 54 43 48 20 27 62 65 6c 6f 6e   t6 MATCH 'belon
3270: 67 27 20 7d 20 7b 31 7d 0a 64 6f 5f 65 78 65 63  g' } {1}.do_exec
3280: 73 71 6c 5f 74 65 73 74 20 35 2e 33 2e 36 20 7b  sql_test 5.3.6 {
3290: 20 0a 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64   .  SELECT docid
32a0: 20 46 52 4f 4d 20 74 36 20 57 48 45 52 45 20 74   FROM t6 WHERE t
32b0: 36 20 4d 41 54 43 48 20 27 62 65 6c 6f 6e 67 27  6 MATCH 'belong'
32c0: 20 41 4e 44 20 6c 69 64 3d 24 6c 69 64 0a 7d 20   AND lid=$lid.} 
32d0: 7b 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39  {2 3 4 5 6 7 8 9
32e0: 20 31 30 20 31 31 20 31 32 20 31 33 20 31 34 20   10 11 12 13 14 
32f0: 31 35 20 31 36 20 31 37 20 31 38 20 31 39 20 32  15 16 17 18 19 2
3300: 30 20 32 31 7d 0a 0a 0a 73 65 74 20 6c 69 64 20  0 21}...set lid 
3310: 5b 65 78 70 72 20 31 3c 3c 33 30 5d 0a 66 6f 72  [expr 1<<30].for
3320: 65 61 63 68 20 6c 69 64 20 5b 6c 69 73 74 20 34  each lid [list 4
3330: 20 5b 65 78 70 72 20 31 3c 3c 33 30 5d 5d 20 7b   [expr 1<<30]] {
3340: 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .  do_execsql_te
3350: 73 74 20 35 2e 34 2e 24 6c 69 64 2e 31 20 7b 0a  st 5.4.$lid.1 {.
3360: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
3370: 74 36 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63  t6;.    SELECT c
3380: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 36 5f  ount(*) FROM t6_
3390: 73 65 67 64 69 72 3b 0a 20 20 20 20 53 45 4c 45  segdir;.    SELE
33a0: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
33b0: 20 74 36 5f 73 65 67 6d 65 6e 74 73 3b 0a 20 20   t6_segments;.  
33c0: 7d 20 7b 30 20 30 7d 0a 20 20 64 6f 5f 65 78 65  } {0 0}.  do_exe
33d0: 63 73 71 6c 5f 74 65 73 74 20 35 2e 34 2e 24 6c  csql_test 5.4.$l
33e0: 69 64 2e 32 20 7b 0a 20 20 20 20 49 4e 53 45 52  id.2 {.    INSER
33f0: 54 20 49 4e 54 4f 20 74 36 28 63 6f 6e 74 65 6e  T INTO t6(conten
3400: 74 2c 20 6c 69 64 29 20 56 41 4c 55 45 53 28 27  t, lid) VALUES('
3410: 7a 65 72 6f 20 7a 65 72 6f 20 7a 65 72 6f 27 2c  zero zero zero',
3420: 20 24 6c 69 64 29 3b 0a 20 20 20 20 49 4e 53 45   $lid);.    INSE
3430: 52 54 20 49 4e 54 4f 20 74 36 28 63 6f 6e 74 65  RT INTO t6(conte
3440: 6e 74 2c 20 6c 69 64 29 20 56 41 4c 55 45 53 28  nt, lid) VALUES(
3450: 27 7a 65 72 6f 20 7a 65 72 6f 20 6f 6e 65 27 2c  'zero zero one',
3460: 20 24 6c 69 64 29 3b 0a 20 20 20 20 49 4e 53 45   $lid);.    INSE
3470: 52 54 20 49 4e 54 4f 20 74 36 28 63 6f 6e 74 65  RT INTO t6(conte
3480: 6e 74 2c 20 6c 69 64 29 20 56 41 4c 55 45 53 28  nt, lid) VALUES(
3490: 27 7a 65 72 6f 20 6f 6e 65 20 7a 65 72 6f 27 2c  'zero one zero',
34a0: 20 24 6c 69 64 29 3b 0a 20 20 20 20 49 4e 53 45   $lid);.    INSE
34b0: 52 54 20 49 4e 54 4f 20 74 36 28 63 6f 6e 74 65  RT INTO t6(conte
34c0: 6e 74 2c 20 6c 69 64 29 20 56 41 4c 55 45 53 28  nt, lid) VALUES(
34d0: 27 7a 65 72 6f 20 6f 6e 65 20 6f 6e 65 27 2c 20  'zero one one', 
34e0: 24 6c 69 64 29 3b 0a 20 20 20 20 49 4e 53 45 52  $lid);.    INSER
34f0: 54 20 49 4e 54 4f 20 74 36 28 63 6f 6e 74 65 6e  T INTO t6(conten
3500: 74 2c 20 6c 69 64 29 20 56 41 4c 55 45 53 28 27  t, lid) VALUES('
3510: 6f 6e 65 20 7a 65 72 6f 20 7a 65 72 6f 27 2c 20  one zero zero', 
3520: 24 6c 69 64 29 3b 0a 20 20 20 20 49 4e 53 45 52  $lid);.    INSER
3530: 54 20 49 4e 54 4f 20 74 36 28 63 6f 6e 74 65 6e  T INTO t6(conten
3540: 74 2c 20 6c 69 64 29 20 56 41 4c 55 45 53 28 27  t, lid) VALUES('
3550: 6f 6e 65 20 7a 65 72 6f 20 6f 6e 65 27 2c 20 24  one zero one', $
3560: 6c 69 64 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  lid);.    INSERT
3570: 20 49 4e 54 4f 20 74 36 28 63 6f 6e 74 65 6e 74   INTO t6(content
3580: 2c 20 6c 69 64 29 20 56 41 4c 55 45 53 28 27 6f  , lid) VALUES('o
3590: 6e 65 20 6f 6e 65 20 7a 65 72 6f 27 2c 20 24 6c  ne one zero', $l
35a0: 69 64 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  id);.    INSERT 
35b0: 49 4e 54 4f 20 74 36 28 63 6f 6e 74 65 6e 74 2c  INTO t6(content,
35c0: 20 6c 69 64 29 20 56 41 4c 55 45 53 28 27 6f 6e   lid) VALUES('on
35d0: 65 20 6f 6e 65 20 6f 6e 65 27 2c 20 24 6c 69 64  e one one', $lid
35e0: 29 3b 0a 0a 20 20 20 20 53 45 4c 45 43 54 20 64  );..    SELECT d
35f0: 6f 63 69 64 20 46 52 4f 4d 20 74 36 20 57 48 45  ocid FROM t6 WHE
3600: 52 45 20 74 36 20 4d 41 54 43 48 20 27 22 7a 65  RE t6 MATCH '"ze
3610: 72 6f 20 7a 65 72 6f 22 27 20 41 4e 44 20 6c 69  ro zero"' AND li
3620: 64 3d 24 6c 69 64 3b 0a 20 20 7d 20 7b 31 20 32  d=$lid;.  } {1 2
3630: 20 35 7d 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71   5}..  do_execsq
3640: 6c 5f 74 65 73 74 20 35 2e 34 2e 24 6c 69 64 2e  l_test 5.4.$lid.
3650: 33 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 63  3 {.    SELECT c
3660: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 36 5f  ount(*) FROM t6_
3670: 73 65 67 64 69 72 3b 0a 20 20 20 20 53 45 4c 45  segdir;.    SELE
3680: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
3690: 20 74 36 5f 73 65 67 6d 65 6e 74 73 3b 0a 20 20   t6_segments;.  
36a0: 7d 20 7b 38 20 30 7d 0a 0a 20 20 64 6f 5f 65 78  } {8 0}..  do_ex
36b0: 65 63 73 71 6c 5f 74 65 73 74 20 35 2e 34 2e 24  ecsql_test 5.4.$
36c0: 6c 69 64 2e 34 20 7b 0a 20 20 20 20 49 4e 53 45  lid.4 {.    INSE
36d0: 52 54 20 49 4e 54 4f 20 74 36 28 74 36 29 20 56  RT INTO t6(t6) V
36e0: 41 4c 55 45 53 28 27 6d 65 72 67 65 3d 31 30 30  ALUES('merge=100
36f0: 2c 33 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ,3');.    INSERT
3700: 20 49 4e 54 4f 20 74 36 28 74 36 29 20 56 41 4c   INTO t6(t6) VAL
3710: 55 45 53 28 27 6d 65 72 67 65 3d 31 30 30 2c 33  UES('merge=100,3
3720: 27 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 64  ');.    SELECT d
3730: 6f 63 69 64 20 46 52 4f 4d 20 74 36 20 57 48 45  ocid FROM t6 WHE
3740: 52 45 20 74 36 20 4d 41 54 43 48 20 27 22 7a 65  RE t6 MATCH '"ze
3750: 72 6f 20 7a 65 72 6f 22 27 20 41 4e 44 20 6c 69  ro zero"' AND li
3760: 64 3d 24 6c 69 64 3b 0a 20 20 7d 20 7b 31 20 32  d=$lid;.  } {1 2
3770: 20 35 7d 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71   5}..  do_execsq
3780: 6c 5f 74 65 73 74 20 35 2e 34 2e 24 6c 69 64 2e  l_test 5.4.$lid.
3790: 35 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 63  5 {.    SELECT c
37a0: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 36 5f  ount(*) FROM t6_
37b0: 73 65 67 64 69 72 3b 0a 20 20 20 20 53 45 4c 45  segdir;.    SELE
37c0: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
37d0: 20 74 36 5f 73 65 67 6d 65 6e 74 73 3b 0a 20 20   t6_segments;.  
37e0: 7d 20 7b 31 20 32 7d 0a 7d 0a 66 69 6e 69 73 68  } {1 2}.}.finish
37f0: 5f 74 65 73 74 0a                                _test.