/ Hex Artifact Content
Login

Artifact a793f2da4cbe9c8ad2f49d2a013c6a0ff61e1783:


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 73 65 74 20 3a  tester.tcl.set :
0230: 3a 74 65 73 74 70 72 65 66 69 78 20 66 74 73 34  :testprefix fts4
0240: 63 6f 6e 74 65 6e 74 0a 0a 23 20 49 66 20 53 51  content..# If SQ
0250: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33  LITE_ENABLE_FTS3
0260: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 6f 6d 69   is defined, omi
0270: 74 20 74 68 69 73 20 66 69 6c 65 2e 0a 69 66 63  t this file..ifc
0280: 61 70 61 62 6c 65 20 21 66 74 73 33 20 7b 0a 20  apable !fts3 {. 
0290: 20 66 69 6e 69 73 68 5f 74 65 73 74 0a 20 20 72   finish_test.  r
02a0: 65 74 75 72 6e 0a 7d 0a 0a 73 65 74 20 3a 3a 74  eturn.}..set ::t
02b0: 65 73 74 70 72 65 66 69 78 20 66 74 73 34 6c 61  estprefix fts4la
02c0: 6e 67 69 64 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  ngid..#---------
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0310: 2d 2d 0a 23 20 54 65 73 74 20 70 6c 61 6e 3a 0a  --.# Test plan:.
0320: 23 0a 23 20 20 20 31 2e 2a 20 2d 20 57 61 72 6d  #.#   1.* - Warm
0330: 2d 62 6f 64 79 20 74 65 73 74 73 20 63 72 65 61  -body tests crea
0340: 74 65 64 20 66 6f 72 20 73 70 65 63 69 66 69 63  ted for specific
0350: 20 70 75 72 70 6f 73 65 73 20 64 75 72 69 6e 67   purposes during
0360: 20 64 65 76 65 6c 6f 70 6d 65 6e 74 2e 0a 23 20   development..# 
0370: 20 20 20 20 20 20 20 20 50 61 73 73 69 6e 67 20          Passing 
0380: 74 68 65 73 65 20 64 6f 65 73 6e 27 74 20 72 65  these doesn't re
0390: 61 6c 6c 79 20 70 72 6f 76 65 20 6d 75 63 68 2e  ally prove much.
03a0: 0a 23 0a 23 20 20 20 32 2e 2a 20 2d 20 54 65 73  .#.#   2.* - Tes
03b0: 74 20 74 68 61 74 20 46 54 53 20 71 75 65 72 69  t that FTS queri
03c0: 65 73 20 6f 6e 6c 79 20 65 76 65 72 20 72 65 74  es only ever ret
03d0: 75 72 6e 20 72 6f 77 73 20 61 73 73 6f 63 69 61  urn rows associa
03e0: 74 65 64 20 77 69 74 68 0a 23 20 20 20 20 20 20  ted with.#      
03f0: 20 20 20 74 68 65 20 72 65 71 75 65 73 74 65 64     the requested
0400: 20 6c 61 6e 67 75 61 67 65 2e 0a 23 0a 23 20 20   language..#.#  
0410: 20 33 2e 2a 20 2d 20 54 65 73 74 20 74 68 61 74   3.* - Test that
0420: 20 74 68 65 20 27 6f 70 74 69 6d 69 7a 65 27 20   the 'optimize' 
0430: 61 6e 64 20 27 72 65 62 75 69 6c 64 27 20 63 6f  and 'rebuild' co
0440: 6d 6d 61 6e 64 73 20 77 6f 72 6b 20 63 6f 72 72  mmands work corr
0450: 65 63 74 6c 79 2e 0a 23 0a 23 20 20 20 34 2e 2a  ectly..#.#   4.*
0460: 20 2d 20 54 65 73 74 20 74 68 61 74 20 69 66 20   - Test that if 
0470: 6f 6e 65 20 69 73 20 70 72 6f 76 69 64 65 64 2c  one is provided,
0480: 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72 20 78   the tokenizer x
0490: 4c 61 6e 67 75 61 67 65 20 6d 65 74 68 6f 64 0a  Language method.
04a0: 23 20 20 20 20 20 20 20 20 20 69 73 20 63 61 6c  #         is cal
04b0: 6c 65 64 20 74 6f 20 63 6f 6e 66 69 67 75 72 65  led to configure
04c0: 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72 20 62   the tokenizer b
04d0: 65 66 6f 72 65 20 74 6f 6b 65 6e 69 7a 69 6e 67  efore tokenizing
04e0: 20 71 75 65 72 79 0a 23 20 20 20 20 20 20 20 20   query.#        
04f0: 20 6f 72 20 64 6f 63 75 6d 65 6e 74 20 74 65 78   or document tex
0500: 74 2e 0a 23 0a 23 20 20 20 35 2e 2a 20 2d 20 54  t..#.#   5.* - T
0510: 65 73 74 20 74 68 65 20 66 74 73 34 61 75 78 20  est the fts4aux 
0520: 74 61 62 6c 65 20 77 68 65 6e 20 74 68 65 20 61  table when the a
0530: 73 73 6f 63 69 61 74 65 64 20 46 54 53 34 20 74  ssociated FTS4 t
0540: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 0a 23 20  able contains.# 
0550: 20 20 20 20 20 20 20 20 6d 75 6c 74 69 70 6c 65          multiple
0560: 20 6c 61 6e 67 75 61 67 65 73 2e 0a 23 0a 23 20   languages..#.# 
0570: 20 20 36 2e 2a 20 2d 20 54 65 73 74 73 20 77 69    6.* - Tests wi
0580: 74 68 20 63 6f 6e 74 65 6e 74 3d 20 74 61 62 6c  th content= tabl
0590: 65 73 2e 20 42 6f 74 68 20 77 68 65 72 65 20 74  es. Both where t
05a0: 68 65 72 65 20 69 73 20 61 20 72 65 61 6c 20 0a  here is a real .
05b0: 23 20 20 20 20 20 20 20 20 20 75 6e 64 65 72 6c  #         underl
05c0: 79 69 6e 67 20 63 6f 6e 74 65 6e 74 20 74 61 62  ying content tab
05d0: 6c 65 20 61 6e 64 20 77 68 65 72 65 20 74 68 65  le and where the
05e0: 72 65 20 69 73 20 6e 6f 74 2e 0a 23 0a 0a 0a 64  re is not..#...d
05f0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31  o_execsql_test 1
0600: 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20 56 49  .1 {.  CREATE VI
0610: 52 54 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55  RTUAL TABLE t1 U
0620: 53 49 4e 47 20 66 74 73 34 28 61 2c 20 62 2c 20  SING fts4(a, b, 
0630: 6c 61 6e 67 75 61 67 65 69 64 3d 6c 61 6e 67 5f  languageid=lang_
0640: 69 64 29 3b 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73  id);.}..do_execs
0650: 71 6c 5f 74 65 73 74 20 31 2e 32 20 7b 0a 20 20  ql_test 1.2 {.  
0660: 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20  SELECT sql FROM 
0670: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48  sqlite_master WH
0680: 45 52 45 20 6e 61 6d 65 20 3d 20 27 74 31 5f 63  ERE name = 't1_c
0690: 6f 6e 74 65 6e 74 27 3b 0a 7d 20 7b 7b 43 52 45  ontent';.} {{CRE
06a0: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f  ATE TABLE 't1_co
06b0: 6e 74 65 6e 74 27 28 64 6f 63 69 64 20 49 4e 54  ntent'(docid INT
06c0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
06d0: 2c 20 27 63 30 61 27 2c 20 27 63 31 62 27 2c 20  , 'c0a', 'c1b', 
06e0: 6c 61 6e 67 69 64 29 7d 7d 0a 0a 64 6f 5f 65 78  langid)}}..do_ex
06f0: 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 33 20 7b  ecsql_test 1.3 {
0700: 53 45 4c 45 43 54 20 64 6f 63 69 64 20 46 52 4f  SELECT docid FRO
0710: 4d 20 74 31 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63  M t1} {}.do_exec
0720: 73 71 6c 5f 74 65 73 74 20 31 2e 34 20 7b 53 45  sql_test 1.4 {SE
0730: 4c 45 43 54 20 6c 61 6e 67 5f 69 64 20 46 52 4f  LECT lang_id FRO
0740: 4d 20 74 31 7d 20 7b 7d 0a 0a 64 6f 5f 65 78 65  M t1} {}..do_exe
0750: 63 73 71 6c 5f 74 65 73 74 20 31 2e 35 20 7b 49  csql_test 1.5 {I
0760: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 61 2c  NSERT INTO t1(a,
0770: 20 62 29 20 56 41 4c 55 45 53 28 27 61 61 61 27   b) VALUES('aaa'
0780: 2c 20 27 62 62 62 27 29 7d 0a 64 6f 5f 65 78 65  , 'bbb')}.do_exe
0790: 63 73 71 6c 5f 74 65 73 74 20 31 2e 36 20 7b 53  csql_test 1.6 {S
07a0: 45 4c 45 43 54 20 6c 61 6e 67 5f 69 64 20 46 52  ELECT lang_id FR
07b0: 4f 4d 20 74 31 20 7d 20 7b 30 7d 0a 0a 64 6f 5f  OM t1 } {0}..do_
07c0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 37  execsql_test 1.7
07d0: 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31   {INSERT INTO t1
07e0: 28 61 2c 20 62 2c 20 6c 61 6e 67 5f 69 64 29 20  (a, b, lang_id) 
07f0: 56 41 4c 55 45 53 28 27 61 61 61 27 2c 20 27 62  VALUES('aaa', 'b
0800: 62 62 27 2c 20 34 29 7d 0a 64 6f 5f 65 78 65 63  bb', 4)}.do_exec
0810: 73 71 6c 5f 74 65 73 74 20 31 2e 38 20 7b 53 45  sql_test 1.8 {SE
0820: 4c 45 43 54 20 6c 61 6e 67 5f 69 64 20 46 52 4f  LECT lang_id FRO
0830: 4d 20 74 31 20 7d 20 7b 30 20 34 7d 0a 0a 64 6f  M t1 } {0 4}..do
0840: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e  _execsql_test 1.
0850: 39 20 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20  9  {INSERT INTO 
0860: 74 31 28 61 2c 20 62 2c 20 6c 61 6e 67 5f 69 64  t1(a, b, lang_id
0870: 29 20 56 41 4c 55 45 53 28 27 61 61 61 27 2c 20  ) VALUES('aaa', 
0880: 27 62 62 62 27 2c 20 27 78 79 7a 27 29 7d 0a 64  'bbb', 'xyz')}.d
0890: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31  o_execsql_test 1
08a0: 2e 31 30 20 7b 53 45 4c 45 43 54 20 6c 61 6e 67  .10 {SELECT lang
08b0: 5f 69 64 20 46 52 4f 4d 20 74 31 7d 20 7b 30 20  _id FROM t1} {0 
08c0: 34 20 30 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  4 0}..do_execsql
08d0: 5f 74 65 73 74 20 31 2e 31 31 20 7b 0a 20 20 43  _test 1.11 {.  C
08e0: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
08f0: 42 4c 45 20 74 32 20 55 53 49 4e 47 20 66 74 73  BLE t2 USING fts
0900: 34 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  4;.  INSERT INTO
0910: 20 74 32 20 56 41 4c 55 45 53 28 27 61 62 63 27   t2 VALUES('abc'
0920: 29 3b 0a 7d 20 0a 64 6f 5f 65 78 65 63 73 71 6c  );.} .do_execsql
0930: 5f 74 65 73 74 20 31 2e 31 32 20 7b 20 53 45 4c  _test 1.12 { SEL
0940: 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74  ECT rowid FROM t
0950: 32 20 57 48 45 52 45 20 63 6f 6e 74 65 6e 74 20  2 WHERE content 
0960: 4d 41 54 43 48 20 27 61 62 63 27 20 7d 20 31 0a  MATCH 'abc' } 1.
0970: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
0980: 20 31 2e 31 33 20 7b 0a 20 20 44 52 4f 50 20 54   1.13 {.  DROP T
0990: 41 42 4c 45 20 74 31 3b 0a 20 20 43 52 45 41 54  ABLE t1;.  CREAT
09a0: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
09b0: 74 31 20 55 53 49 4e 47 20 66 74 73 34 28 6c 61  t1 USING fts4(la
09c0: 6e 67 75 61 67 65 69 64 3d 6c 61 6e 67 5f 69 64  nguageid=lang_id
09d0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
09e0: 20 74 31 28 63 6f 6e 74 65 6e 74 29 20 20 20 20   t1(content)    
09f0: 20 20 20 20 20 20 56 41 4c 55 45 53 28 27 61 20        VALUES('a 
0a00: 62 20 63 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  b c');.  INSERT 
0a10: 49 4e 54 4f 20 74 31 28 63 6f 6e 74 65 6e 74 2c  INTO t1(content,
0a20: 20 6c 61 6e 67 5f 69 64 29 20 56 41 4c 55 45 53   lang_id) VALUES
0a30: 28 27 61 20 62 20 63 27 2c 20 31 29 3b 0a 7d 0a  ('a b c', 1);.}.
0a40: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
0a50: 20 31 2e 31 34 20 7b 0a 20 20 53 45 4c 45 43 54   1.14 {.  SELECT
0a60: 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 31 20 57   rowid FROM t1 W
0a70: 48 45 52 45 20 74 31 20 4d 41 54 43 48 20 27 62  HERE t1 MATCH 'b
0a80: 27 3b 0a 7d 20 7b 31 7d 0a 64 6f 5f 65 78 65 63  ';.} {1}.do_exec
0a90: 73 71 6c 5f 74 65 73 74 20 31 2e 31 35 20 7b 0a  sql_test 1.15 {.
0aa0: 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46    SELECT rowid F
0ab0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 74 31 20  ROM t1 WHERE t1 
0ac0: 4d 41 54 43 48 20 27 62 27 20 41 4e 44 20 6c 61  MATCH 'b' AND la
0ad0: 6e 67 5f 69 64 20 3d 20 30 3b 0a 7d 20 7b 31 7d  ng_id = 0;.} {1}
0ae0: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
0af0: 74 20 31 2e 31 36 20 7b 0a 20 20 53 45 4c 45 43  t 1.16 {.  SELEC
0b00: 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 31 20  T rowid FROM t1 
0b10: 57 48 45 52 45 20 74 31 20 4d 41 54 43 48 20 27  WHERE t1 MATCH '
0b20: 62 27 20 41 4e 44 20 6c 61 6e 67 5f 69 64 20 3d  b' AND lang_id =
0b30: 20 31 3b 0a 7d 20 7b 32 7d 0a 0a 64 6f 5f 63 61   1;.} {2}..do_ca
0b40: 74 63 68 73 71 6c 5f 74 65 73 74 20 31 2e 31 37  tchsql_test 1.17
0b50: 20 7b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f   {.  INSERT INTO
0b60: 20 74 31 28 63 6f 6e 74 65 6e 74 2c 20 6c 61 6e   t1(content, lan
0b70: 67 5f 69 64 29 20 56 41 4c 55 45 53 28 27 31 32  g_id) VALUES('12
0b80: 33 27 2c 20 2d 31 29 3b 0a 7d 20 7b 31 20 7b 63  3', -1);.} {1 {c
0b90: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
0ba0: 7d 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  }}..do_execsql_t
0bb0: 65 73 74 20 31 2e 31 38 20 7b 0a 20 20 44 52 4f  est 1.18 {.  DRO
0bc0: 50 20 54 41 42 4c 45 20 74 31 3b 0a 20 20 43 52  P TABLE t1;.  CR
0bd0: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
0be0: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 34  LE t1 USING fts4
0bf0: 28 6c 61 6e 67 75 61 67 65 69 64 3d 6c 61 6e 67  (languageid=lang
0c00: 5f 69 64 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  _id);.  INSERT I
0c10: 4e 54 4f 20 74 31 28 63 6f 6e 74 65 6e 74 2c 20  NTO t1(content, 
0c20: 6c 61 6e 67 5f 69 64 29 20 56 41 4c 55 45 53 28  lang_id) VALUES(
0c30: 27 41 27 2c 20 31 33 29 3b 0a 20 20 49 4e 53 45  'A', 13);.  INSE
0c40: 52 54 20 49 4e 54 4f 20 74 31 28 63 6f 6e 74 65  RT INTO t1(conte
0c50: 6e 74 2c 20 6c 61 6e 67 5f 69 64 29 20 56 41 4c  nt, lang_id) VAL
0c60: 55 45 53 28 27 42 27 2c 20 31 33 29 3b 0a 20 20  UES('B', 13);.  
0c70: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 63  INSERT INTO t1(c
0c80: 6f 6e 74 65 6e 74 2c 20 6c 61 6e 67 5f 69 64 29  ontent, lang_id)
0c90: 20 56 41 4c 55 45 53 28 27 43 27 2c 20 31 33 29   VALUES('C', 13)
0ca0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
0cb0: 74 31 28 63 6f 6e 74 65 6e 74 2c 20 6c 61 6e 67  t1(content, lang
0cc0: 5f 69 64 29 20 56 41 4c 55 45 53 28 27 44 27 2c  _id) VALUES('D',
0cd0: 20 31 33 29 3b 0a 20 20 49 4e 53 45 52 54 20 49   13);.  INSERT I
0ce0: 4e 54 4f 20 74 31 28 63 6f 6e 74 65 6e 74 2c 20  NTO t1(content, 
0cf0: 6c 61 6e 67 5f 69 64 29 20 56 41 4c 55 45 53 28  lang_id) VALUES(
0d00: 27 45 27 2c 20 31 33 29 3b 0a 20 20 49 4e 53 45  'E', 13);.  INSE
0d10: 52 54 20 49 4e 54 4f 20 74 31 28 63 6f 6e 74 65  RT INTO t1(conte
0d20: 6e 74 2c 20 6c 61 6e 67 5f 69 64 29 20 56 41 4c  nt, lang_id) VAL
0d30: 55 45 53 28 27 46 27 2c 20 31 33 29 3b 0a 20 20  UES('F', 13);.  
0d40: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 63  INSERT INTO t1(c
0d50: 6f 6e 74 65 6e 74 2c 20 6c 61 6e 67 5f 69 64 29  ontent, lang_id)
0d60: 20 56 41 4c 55 45 53 28 27 47 27 2c 20 31 33 29   VALUES('G', 13)
0d70: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
0d80: 74 31 28 63 6f 6e 74 65 6e 74 2c 20 6c 61 6e 67  t1(content, lang
0d90: 5f 69 64 29 20 56 41 4c 55 45 53 28 27 48 27 2c  _id) VALUES('H',
0da0: 20 31 33 29 3b 0a 20 20 49 4e 53 45 52 54 20 49   13);.  INSERT I
0db0: 4e 54 4f 20 74 31 28 63 6f 6e 74 65 6e 74 2c 20  NTO t1(content, 
0dc0: 6c 61 6e 67 5f 69 64 29 20 56 41 4c 55 45 53 28  lang_id) VALUES(
0dd0: 27 49 27 2c 20 31 33 29 3b 0a 20 20 49 4e 53 45  'I', 13);.  INSE
0de0: 52 54 20 49 4e 54 4f 20 74 31 28 63 6f 6e 74 65  RT INTO t1(conte
0df0: 6e 74 2c 20 6c 61 6e 67 5f 69 64 29 20 56 41 4c  nt, lang_id) VAL
0e00: 55 45 53 28 27 4a 27 2c 20 31 33 29 3b 0a 20 20  UES('J', 13);.  
0e10: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 63  INSERT INTO t1(c
0e20: 6f 6e 74 65 6e 74 2c 20 6c 61 6e 67 5f 69 64 29  ontent, lang_id)
0e30: 20 56 41 4c 55 45 53 28 27 4b 27 2c 20 31 33 29   VALUES('K', 13)
0e40: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
0e50: 74 31 28 63 6f 6e 74 65 6e 74 2c 20 6c 61 6e 67  t1(content, lang
0e60: 5f 69 64 29 20 56 41 4c 55 45 53 28 27 4c 27 2c  _id) VALUES('L',
0e70: 20 31 33 29 3b 0a 20 20 49 4e 53 45 52 54 20 49   13);.  INSERT I
0e80: 4e 54 4f 20 74 31 28 63 6f 6e 74 65 6e 74 2c 20  NTO t1(content, 
0e90: 6c 61 6e 67 5f 69 64 29 20 56 41 4c 55 45 53 28  lang_id) VALUES(
0ea0: 27 4d 27 2c 20 31 33 29 3b 0a 20 20 49 4e 53 45  'M', 13);.  INSE
0eb0: 52 54 20 49 4e 54 4f 20 74 31 28 63 6f 6e 74 65  RT INTO t1(conte
0ec0: 6e 74 2c 20 6c 61 6e 67 5f 69 64 29 20 56 41 4c  nt, lang_id) VAL
0ed0: 55 45 53 28 27 4e 27 2c 20 31 33 29 3b 0a 20 20  UES('N', 13);.  
0ee0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 63  INSERT INTO t1(c
0ef0: 6f 6e 74 65 6e 74 2c 20 6c 61 6e 67 5f 69 64 29  ontent, lang_id)
0f00: 20 56 41 4c 55 45 53 28 27 4f 27 2c 20 31 33 29   VALUES('O', 13)
0f10: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
0f20: 74 31 28 63 6f 6e 74 65 6e 74 2c 20 6c 61 6e 67  t1(content, lang
0f30: 5f 69 64 29 20 56 41 4c 55 45 53 28 27 50 27 2c  _id) VALUES('P',
0f40: 20 31 33 29 3b 0a 20 20 49 4e 53 45 52 54 20 49   13);.  INSERT I
0f50: 4e 54 4f 20 74 31 28 63 6f 6e 74 65 6e 74 2c 20  NTO t1(content, 
0f60: 6c 61 6e 67 5f 69 64 29 20 56 41 4c 55 45 53 28  lang_id) VALUES(
0f70: 27 51 27 2c 20 31 33 29 3b 0a 20 20 49 4e 53 45  'Q', 13);.  INSE
0f80: 52 54 20 49 4e 54 4f 20 74 31 28 63 6f 6e 74 65  RT INTO t1(conte
0f90: 6e 74 2c 20 6c 61 6e 67 5f 69 64 29 20 56 41 4c  nt, lang_id) VAL
0fa0: 55 45 53 28 27 52 27 2c 20 31 33 29 3b 0a 20 20  UES('R', 13);.  
0fb0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 63  INSERT INTO t1(c
0fc0: 6f 6e 74 65 6e 74 2c 20 6c 61 6e 67 5f 69 64 29  ontent, lang_id)
0fd0: 20 56 41 4c 55 45 53 28 27 53 27 2c 20 31 33 29   VALUES('S', 13)
0fe0: 3b 0a 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64  ;.  SELECT rowid
0ff0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 74   FROM t1 WHERE t
1000: 31 20 4d 41 54 43 48 20 27 41 27 3b 0a 7d 20 7b  1 MATCH 'A';.} {
1010: 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }...#-----------
1020: 2d 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 0a 23  --------------.#
1060: 20 54 65 73 74 20 63 61 73 65 73 20 32 2e 2a 0a   Test cases 2.*.
1070: 23 0a 0a 70 72 6f 63 20 62 75 69 6c 64 5f 6d 75  #..proc build_mu
1080: 6c 74 69 6c 69 6e 67 75 61 6c 5f 64 62 5f 31 20  ltilingual_db_1 
1090: 7b 64 62 7d 20 7b 0a 20 20 24 64 62 20 65 76 61  {db} {.  $db eva
10a0: 6c 20 7b 20 43 52 45 41 54 45 20 56 49 52 54 55  l { CREATE VIRTU
10b0: 41 4c 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e  AL TABLE t2 USIN
10c0: 47 20 66 74 73 34 28 78 2c 20 79 2c 20 6c 61 6e  G fts4(x, y, lan
10d0: 67 75 61 67 65 69 64 3d 6c 29 20 7d 0a 0a 20 20  guageid=l) }..  
10e0: 73 65 74 20 78 77 6f 72 64 73 20 5b 6c 69 73 74  set xwords [list
10f0: 20 7a 65 72 6f 20 6f 6e 65 20 74 77 6f 20 74 68   zero one two th
1100: 72 65 65 20 66 6f 75 72 20 66 69 76 65 20 73 69  ree four five si
1110: 78 20 73 65 76 65 6e 20 65 69 67 68 74 20 6e 69  x seven eight ni
1120: 6e 65 20 74 65 6e 5d 0a 20 20 73 65 74 20 79 77  ne ten].  set yw
1130: 6f 72 64 73 20 5b 6c 69 73 74 20 61 6c 70 68 61  ords [list alpha
1140: 20 62 65 74 61 20 67 61 6d 6d 61 20 64 65 6c 74   beta gamma delt
1150: 61 20 65 70 73 69 6c 6f 6e 20 7a 65 74 61 20 65  a epsilon zeta e
1160: 74 61 20 74 68 65 74 61 20 69 6f 74 61 20 6b 61  ta theta iota ka
1170: 70 70 61 5d 0a 0a 20 20 66 6f 72 20 7b 73 65 74  ppa]..  for {set
1180: 20 69 20 30 7d 20 7b 24 69 20 3c 20 31 30 30 30   i 0} {$i < 1000
1190: 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20  } {incr i} {.   
11a0: 20 73 65 74 20 69 4c 61 6e 67 69 64 20 5b 65 78   set iLangid [ex
11b0: 70 72 20 24 69 25 39 5d 0a 20 20 20 20 73 65 74  pr $i%9].    set
11c0: 20 78 20 22 22 0a 20 20 20 20 73 65 74 20 79 20   x "".    set y 
11d0: 22 22 0a 0a 20 20 20 20 73 65 74 20 78 20 5b 6c  ""..    set x [l
11e0: 69 73 74 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64  ist].    lappend
11f0: 20 78 20 5b 6c 69 6e 64 65 78 20 24 78 77 6f 72   x [lindex $xwor
1200: 64 73 20 5b 65 78 70 72 20 28 24 69 20 2f 20 31  ds [expr ($i / 1
1210: 30 30 30 29 20 25 20 31 30 5d 5d 0a 20 20 20 20  000) % 10]].    
1220: 6c 61 70 70 65 6e 64 20 78 20 5b 6c 69 6e 64 65  lappend x [linde
1230: 78 20 24 78 77 6f 72 64 73 20 5b 65 78 70 72 20  x $xwords [expr 
1240: 28 24 69 20 2f 20 31 30 30 29 20 20 25 20 31 30  ($i / 100)  % 10
1250: 5d 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 78  ]].    lappend x
1260: 20 5b 6c 69 6e 64 65 78 20 24 78 77 6f 72 64 73   [lindex $xwords
1270: 20 5b 65 78 70 72 20 28 24 69 20 2f 20 31 30 29   [expr ($i / 10)
1280: 20 20 20 25 20 31 30 5d 5d 0a 20 20 20 20 6c 61     % 10]].    la
1290: 70 70 65 6e 64 20 78 20 5b 6c 69 6e 64 65 78 20  ppend x [lindex 
12a0: 24 78 77 6f 72 64 73 20 5b 65 78 70 72 20 28 24  $xwords [expr ($
12b0: 69 20 2f 20 31 29 20 20 20 25 20 31 30 5d 5d 0a  i / 1)   % 10]].
12c0: 0a 20 20 20 20 73 65 74 20 79 20 5b 6c 69 73 74  .    set y [list
12d0: 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 79 20  ].    lappend y 
12e0: 5b 6c 69 6e 64 65 78 20 24 79 77 6f 72 64 73 20  [lindex $ywords 
12f0: 5b 65 78 70 72 20 28 24 69 20 2f 20 31 30 30 30  [expr ($i / 1000
1300: 29 20 25 20 31 30 5d 5d 0a 20 20 20 20 6c 61 70  ) % 10]].    lap
1310: 70 65 6e 64 20 79 20 5b 6c 69 6e 64 65 78 20 24  pend y [lindex $
1320: 79 77 6f 72 64 73 20 5b 65 78 70 72 20 28 24 69  ywords [expr ($i
1330: 20 2f 20 31 30 30 29 20 20 25 20 31 30 5d 5d 0a   / 100)  % 10]].
1340: 20 20 20 20 6c 61 70 70 65 6e 64 20 79 20 5b 6c      lappend y [l
1350: 69 6e 64 65 78 20 24 79 77 6f 72 64 73 20 5b 65  index $ywords [e
1360: 78 70 72 20 28 24 69 20 2f 20 31 30 29 20 20 20  xpr ($i / 10)   
1370: 25 20 31 30 5d 5d 0a 20 20 20 20 6c 61 70 70 65  % 10]].    lappe
1380: 6e 64 20 79 20 5b 6c 69 6e 64 65 78 20 24 79 77  nd y [lindex $yw
1390: 6f 72 64 73 20 5b 65 78 70 72 20 28 24 69 20 2f  ords [expr ($i /
13a0: 20 31 29 20 20 20 25 20 31 30 5d 5d 0a 0a 20 20   1)   % 10]]..  
13b0: 20 20 24 64 62 20 65 76 61 6c 20 7b 20 49 4e 53    $db eval { INS
13c0: 45 52 54 20 49 4e 54 4f 20 74 32 28 64 6f 63 69  ERT INTO t2(doci
13d0: 64 2c 20 78 2c 20 79 2c 20 6c 29 20 56 41 4c 55  d, x, y, l) VALU
13e0: 45 53 28 24 69 2c 20 24 78 2c 20 24 79 2c 20 24  ES($i, $x, $y, $
13f0: 69 4c 61 6e 67 69 64 29 20 7d 0a 20 20 7d 0a 7d  iLangid) }.  }.}
1400: 0a 0a 70 72 6f 63 20 72 6f 77 69 64 5f 6c 69 73  ..proc rowid_lis
1410: 74 5f 73 65 74 5f 6c 61 6e 67 69 64 20 7b 6c 61  t_set_langid {la
1420: 6e 67 69 64 7d 20 7b 0a 20 20 73 65 74 20 3a 3a  ngid} {.  set ::
1430: 72 6f 77 69 64 5f 6c 69 73 74 5f 6c 61 6e 67 69  rowid_list_langi
1440: 64 20 24 6c 61 6e 67 69 64 0a 7d 0a 70 72 6f 63  d $langid.}.proc
1450: 20 72 6f 77 69 64 5f 6c 69 73 74 20 7b 70 61 74   rowid_list {pat
1460: 74 65 72 6e 7d 20 7b 0a 20 20 73 65 74 20 6c 61  tern} {.  set la
1470: 6e 67 69 64 20 24 3a 3a 72 6f 77 69 64 5f 6c 69  ngid $::rowid_li
1480: 73 74 5f 6c 61 6e 67 69 64 0a 20 20 73 65 74 20  st_langid.  set 
1490: 72 65 73 20 5b 6c 69 73 74 5d 0a 20 20 64 62 20  res [list].  db 
14a0: 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 64 6f 63  eval {SELECT doc
14b0: 69 64 2c 20 78 2c 20 79 20 46 52 4f 4d 20 74 32  id, x, y FROM t2
14c0: 20 57 48 45 52 45 20 6c 20 3d 20 24 6c 61 6e 67   WHERE l = $lang
14d0: 69 64 20 4f 52 44 45 52 20 42 59 20 64 6f 63 69  id ORDER BY doci
14e0: 64 20 41 53 43 7d 20 7b 0a 20 20 20 20 69 66 20  d ASC} {.    if 
14f0: 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 22  {[string match "
1500: 2a 24 70 61 74 74 65 72 6e 2a 22 20 24 78 5d 20  *$pattern*" $x] 
1510: 7c 7c 20 5b 73 74 72 69 6e 67 20 6d 61 74 63 68  || [string match
1520: 20 22 2a 24 70 61 74 74 65 72 6e 2a 22 20 24 79   "*$pattern*" $y
1530: 5d 7d 20 7b 0a 20 20 20 20 20 20 6c 61 70 70 65  ]} {.      lappe
1540: 6e 64 20 72 65 73 20 24 64 6f 63 69 64 0a 20 20  nd res $docid.  
1550: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1560: 20 24 72 65 73 0a 7d 0a 0a 70 72 6f 63 20 6f 72   $res.}..proc or
1570: 5f 6d 65 72 67 65 5f 6c 69 73 74 20 7b 6c 69 73  _merge_list {lis
1580: 74 31 20 6c 69 73 74 32 7d 20 7b 0a 20 20 73 65  t1 list2} {.  se
1590: 74 20 72 65 73 20 5b 6c 69 73 74 5d 0a 0a 20 20  t res [list]..  
15a0: 73 65 74 20 69 31 20 30 0a 20 20 73 65 74 20 69  set i1 0.  set i
15b0: 32 20 30 0a 0a 20 20 73 65 74 20 6e 31 20 5b 6c  2 0..  set n1 [l
15c0: 6c 65 6e 67 74 68 20 24 6c 69 73 74 31 5d 0a 20  length $list1]. 
15d0: 20 73 65 74 20 6e 32 20 5b 6c 6c 65 6e 67 74 68   set n2 [llength
15e0: 20 24 6c 69 73 74 32 5d 0a 0a 20 20 77 68 69 6c   $list2]..  whil
15f0: 65 20 7b 24 69 31 20 3c 20 24 6e 31 20 26 26 20  e {$i1 < $n1 && 
1600: 24 69 32 20 3c 20 24 6e 32 7d 20 7b 0a 20 20 20  $i2 < $n2} {.   
1610: 20 73 65 74 20 65 31 20 5b 6c 69 6e 64 65 78 20   set e1 [lindex 
1620: 24 6c 69 73 74 31 20 24 69 31 5d 0a 20 20 20 20  $list1 $i1].    
1630: 73 65 74 20 65 32 20 5b 6c 69 6e 64 65 78 20 24  set e2 [lindex $
1640: 6c 69 73 74 32 20 24 69 32 5d 0a 0a 20 20 20 20  list2 $i2]..    
1650: 69 66 20 7b 24 65 31 3d 3d 24 65 32 7d 20 7b 0a  if {$e1==$e2} {.
1660: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65        lappend re
1670: 73 20 24 65 31 0a 20 20 20 20 20 20 69 6e 63 72  s $e1.      incr
1680: 20 69 31 0a 20 20 20 20 20 20 69 6e 63 72 20 69   i1.      incr i
1690: 32 0a 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b  2.    } elseif {
16a0: 24 65 31 20 3c 20 24 65 32 7d 20 7b 0a 20 20 20  $e1 < $e2} {.   
16b0: 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 20 24     lappend res $
16c0: 65 31 0a 20 20 20 20 20 20 69 6e 63 72 20 69 31  e1.      incr i1
16d0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
16e0: 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 20      lappend res 
16f0: 24 65 32 0a 20 20 20 20 20 20 69 6e 63 72 20 69  $e2.      incr i
1700: 32 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 63  2.    }.  }..  c
1710: 6f 6e 63 61 74 20 24 72 65 73 20 5b 6c 72 61 6e  oncat $res [lran
1720: 67 65 20 24 6c 69 73 74 31 20 24 69 31 20 65 6e  ge $list1 $i1 en
1730: 64 5d 20 5b 6c 72 61 6e 67 65 20 24 6c 69 73 74  d] [lrange $list
1740: 32 20 24 69 32 20 65 6e 64 5d 0a 7d 0a 0a 70 72  2 $i2 end].}..pr
1750: 6f 63 20 6f 72 5f 6d 65 72 67 65 5f 6c 69 73 74  oc or_merge_list
1760: 73 20 7b 61 72 67 73 7d 20 7b 0a 20 20 73 65 74  s {args} {.  set
1770: 20 72 65 73 20 5b 6c 69 6e 64 65 78 20 24 61 72   res [lindex $ar
1780: 67 73 20 30 5d 0a 20 20 66 6f 72 20 7b 73 65 74  gs 0].  for {set
1790: 20 69 20 31 7d 20 7b 24 69 20 3c 20 5b 6c 6c 65   i 1} {$i < [lle
17a0: 6e 67 74 68 20 24 61 72 67 73 5d 7d 20 7b 69 6e  ngth $args]} {in
17b0: 63 72 20 69 7d 20 7b 0a 20 20 20 20 73 65 74 20  cr i} {.    set 
17c0: 72 65 73 20 5b 6f 72 5f 6d 65 72 67 65 5f 6c 69  res [or_merge_li
17d0: 73 74 20 24 72 65 73 20 5b 6c 69 6e 64 65 78 20  st $res [lindex 
17e0: 24 61 72 67 73 20 24 69 5d 5d 0a 20 20 7d 0a 20  $args $i]].  }. 
17f0: 20 73 65 74 20 72 65 73 0a 7d 0a 0a 70 72 6f 63   set res.}..proc
1800: 20 61 6e 64 5f 6d 65 72 67 65 5f 6c 69 73 74 20   and_merge_list 
1810: 7b 6c 69 73 74 31 20 6c 69 73 74 32 7d 20 7b 0a  {list1 list2} {.
1820: 20 20 66 6f 72 65 61 63 68 20 69 20 24 6c 69 73    foreach i $lis
1830: 74 32 20 7b 20 73 65 74 20 61 28 24 69 29 20 31  t2 { set a($i) 1
1840: 20 7d 0a 20 20 73 65 74 20 72 65 73 20 5b 6c 69   }.  set res [li
1850: 73 74 5d 0a 20 20 66 6f 72 65 61 63 68 20 69 20  st].  foreach i 
1860: 24 6c 69 73 74 31 20 7b 0a 20 20 20 20 69 66 20  $list1 {.    if 
1870: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 61 28  {[info exists a(
1880: 24 69 29 5d 7d 20 7b 6c 61 70 70 65 6e 64 20 72  $i)]} {lappend r
1890: 65 73 20 24 69 7d 0a 20 20 7d 0a 20 20 73 65 74  es $i}.  }.  set
18a0: 20 72 65 73 0a 7d 0a 0a 0a 70 72 6f 63 20 61 6e   res.}...proc an
18b0: 64 5f 6d 65 72 67 65 5f 6c 69 73 74 73 20 7b 61  d_merge_lists {a
18c0: 72 67 73 7d 20 7b 0a 20 20 73 65 74 20 72 65 73  rgs} {.  set res
18d0: 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20 30   [lindex $args 0
18e0: 5d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 31  ].  for {set i 1
18f0: 7d 20 7b 24 69 20 3c 20 5b 6c 6c 65 6e 67 74 68  } {$i < [llength
1900: 20 24 61 72 67 73 5d 7d 20 7b 69 6e 63 72 20 69   $args]} {incr i
1910: 7d 20 7b 0a 20 20 20 20 73 65 74 20 72 65 73 20  } {.    set res 
1920: 5b 61 6e 64 5f 6d 65 72 67 65 5f 6c 69 73 74 20  [and_merge_list 
1930: 24 72 65 73 20 5b 6c 69 6e 64 65 78 20 24 61 72  $res [lindex $ar
1940: 67 73 20 24 69 5d 5d 0a 20 20 7d 0a 20 20 73 65  gs $i]].  }.  se
1950: 74 20 72 65 73 0a 7d 0a 0a 70 72 6f 63 20 66 69  t res.}..proc fi
1960: 6c 74 65 72 5f 6c 69 73 74 20 7b 6c 69 73 74 20  lter_list {list 
1970: 6c 61 6e 67 69 64 7d 20 7b 0a 20 20 73 65 74 20  langid} {.  set 
1980: 72 65 73 20 5b 6c 69 73 74 5d 0a 20 20 66 6f 72  res [list].  for
1990: 65 61 63 68 20 69 20 24 6c 69 73 74 20 7b 0a 20  each i $list {. 
19a0: 20 20 20 69 66 20 7b 28 24 69 20 25 20 39 29 20     if {($i % 9) 
19b0: 3d 3d 20 24 6c 61 6e 67 69 64 7d 20 7b 6c 61 70  == $langid} {lap
19c0: 70 65 6e 64 20 72 65 73 20 24 69 7d 0a 20 20 7d  pend res $i}.  }
19d0: 0a 20 20 73 65 74 20 72 65 73 0a 7d 0a 0a 64 6f  .  set res.}..do
19e0: 5f 74 65 73 74 20 32 2e 30 20 7b 20 0a 20 20 72  _test 2.0 { .  r
19f0: 65 73 65 74 5f 64 62 0a 20 20 62 75 69 6c 64 5f  eset_db.  build_
1a00: 6d 75 6c 74 69 6c 69 6e 67 75 61 6c 5f 64 62 5f  multilingual_db_
1a10: 31 20 64 62 0a 7d 20 7b 7d 0a 0a 70 72 6f 63 20  1 db.} {}..proc 
1a20: 64 6f 5f 74 65 73 74 5f 32 20 7b 74 6e 20 71 75  do_test_2 {tn qu
1a30: 65 72 79 20 72 65 73 5f 73 63 72 69 70 74 7d 20  ery res_script} 
1a40: 7b 0a 20 20 66 6f 72 20 7b 73 65 74 20 6c 61 6e  {.  for {set lan
1a50: 67 69 64 20 30 7d 20 7b 24 6c 61 6e 67 69 64 20  gid 0} {$langid 
1a60: 3c 20 31 30 7d 20 7b 69 6e 63 72 20 6c 61 6e 67  < 10} {incr lang
1a70: 69 64 7d 20 7b 0a 20 20 20 20 72 6f 77 69 64 5f  id} {.    rowid_
1a80: 6c 69 73 74 5f 73 65 74 5f 6c 61 6e 67 69 64 20  list_set_langid 
1a90: 24 6c 61 6e 67 69 64 0a 20 20 20 20 73 65 74 20  $langid.    set 
1aa0: 72 65 73 20 5b 65 76 61 6c 20 24 72 65 73 5f 73  res [eval $res_s
1ab0: 63 72 69 70 74 5d 0a 0a 20 20 20 20 73 65 74 20  cript]..    set 
1ac0: 61 63 74 75 61 6c 20 5b 0a 20 20 20 20 20 20 65  actual [.      e
1ad0: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 64  xecsql {SELECT d
1ae0: 6f 63 69 64 20 46 52 4f 4d 20 74 32 20 57 48 45  ocid FROM t2 WHE
1af0: 52 45 20 74 32 20 4d 41 54 43 48 20 24 71 75 65  RE t2 MATCH $que
1b00: 72 79 20 41 4e 44 20 6c 20 3d 20 24 6c 61 6e 67  ry AND l = $lang
1b10: 69 64 7d 0a 20 20 20 20 5d 0a 20 20 20 20 64 6f  id}.    ].    do
1b20: 5f 74 65 73 74 20 32 2e 24 74 6e 2e 24 6c 61 6e  _test 2.$tn.$lan
1b30: 67 69 64 20 5b 6c 69 73 74 20 73 65 74 20 7b 7d  gid [list set {}
1b40: 20 24 61 63 74 75 61 6c 5d 20 24 72 65 73 0a 20   $actual] $res. 
1b50: 20 7d 0a 7d 0a 0a 23 20 52 75 6e 20 73 6f 6d 65   }.}..# Run some
1b60: 20 71 75 65 72 69 65 73 2e 20 0a 64 6f 5f 74 65   queries. .do_te
1b70: 73 74 5f 32 20 31 2e 31 20 20 7b 64 65 6c 74 61  st_2 1.1  {delta
1b80: 7d 20 20 20 20 20 20 20 20 20 20 7b 20 72 6f 77  }          { row
1b90: 69 64 5f 6c 69 73 74 20 64 65 6c 74 61 20 7d 0a  id_list delta }.
1ba0: 64 6f 5f 74 65 73 74 5f 32 20 31 2e 32 20 20 7b  do_test_2 1.2  {
1bb0: 22 7a 65 72 6f 20 6f 6e 65 20 74 77 6f 22 7d 20  "zero one two"} 
1bc0: 7b 20 72 6f 77 69 64 5f 6c 69 73 74 20 22 7a 65  { rowid_list "ze
1bd0: 72 6f 20 6f 6e 65 20 74 77 6f 22 20 7d 0a 64 6f  ro one two" }.do
1be0: 5f 74 65 73 74 5f 32 20 31 2e 33 20 20 7b 7a 65  _test_2 1.3  {ze
1bf0: 72 6f 20 6f 6e 65 20 74 77 6f 7d 20 7b 0a 20 20  ro one two} {.  
1c00: 61 6e 64 5f 6d 65 72 67 65 5f 6c 69 73 74 73 20  and_merge_lists 
1c10: 5b 72 6f 77 69 64 5f 6c 69 73 74 20 7a 65 72 6f  [rowid_list zero
1c20: 5d 20 5b 72 6f 77 69 64 5f 6c 69 73 74 20 6f 6e  ] [rowid_list on
1c30: 65 5d 20 5b 72 6f 77 69 64 5f 6c 69 73 74 20 74  e] [rowid_list t
1c40: 77 6f 5d 0a 7d 0a 64 6f 5f 74 65 73 74 5f 32 20  wo].}.do_test_2 
1c50: 31 2e 34 20 20 7b 22 7a 65 72 6f 20 6f 6e 65 22  1.4  {"zero one"
1c60: 20 4f 52 20 22 6f 6e 65 20 74 77 6f 22 7d 20 7b   OR "one two"} {
1c70: 0a 20 20 6f 72 5f 6d 65 72 67 65 5f 6c 69 73 74  .  or_merge_list
1c80: 73 20 5b 72 6f 77 69 64 5f 6c 69 73 74 20 22 7a  s [rowid_list "z
1c90: 65 72 6f 20 6f 6e 65 22 5d 20 5b 72 6f 77 69 64  ero one"] [rowid
1ca0: 5f 6c 69 73 74 20 22 6f 6e 65 20 74 77 6f 22 5d  _list "one two"]
1cb0: 0a 7d 0a 0a 23 20 4e 6f 77 20 74 72 79 20 74 68  .}..# Now try th
1cc0: 65 20 73 61 6d 65 20 74 65 73 74 73 20 61 73 20  e same tests as 
1cd0: 61 62 6f 76 65 2c 20 62 75 74 20 61 66 74 65 72  above, but after
1ce0: 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 27 6f 70   running the 'op
1cf0: 74 69 6d 69 7a 65 27 0a 23 20 63 6f 6d 6d 61 6e  timize'.# comman
1d00: 64 20 6f 6e 20 74 68 65 20 46 54 53 20 74 61 62  d on the FTS tab
1d10: 6c 65 2e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  le..do_execsql_t
1d20: 65 73 74 20 32 2e 32 20 7b 0a 20 20 49 4e 53 45  est 2.2 {.  INSE
1d30: 52 54 20 49 4e 54 4f 20 74 32 28 74 32 29 20 56  RT INTO t2(t2) V
1d40: 41 4c 55 45 53 28 27 6f 70 74 69 6d 69 7a 65 27  ALUES('optimize'
1d50: 29 3b 0a 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  );.  SELECT coun
1d60: 74 28 2a 29 20 46 52 4f 4d 20 74 32 5f 73 65 67  t(*) FROM t2_seg
1d70: 64 69 72 3b 0a 7d 20 7b 39 7d 0a 64 6f 5f 74 65  dir;.} {9}.do_te
1d80: 73 74 5f 32 20 32 2e 31 20 20 7b 64 65 6c 74 61  st_2 2.1  {delta
1d90: 7d 20 20 20 20 20 20 20 20 20 20 7b 20 72 6f 77  }          { row
1da0: 69 64 5f 6c 69 73 74 20 64 65 6c 74 61 20 7d 0a  id_list delta }.
1db0: 64 6f 5f 74 65 73 74 5f 32 20 32 2e 32 20 20 7b  do_test_2 2.2  {
1dc0: 22 7a 65 72 6f 20 6f 6e 65 20 74 77 6f 22 7d 20  "zero one two"} 
1dd0: 7b 20 72 6f 77 69 64 5f 6c 69 73 74 20 22 7a 65  { rowid_list "ze
1de0: 72 6f 20 6f 6e 65 20 74 77 6f 22 20 7d 0a 64 6f  ro one two" }.do
1df0: 5f 74 65 73 74 5f 32 20 32 2e 33 20 20 7b 7a 65  _test_2 2.3  {ze
1e00: 72 6f 20 6f 6e 65 20 74 77 6f 7d 20 7b 0a 20 20  ro one two} {.  
1e10: 61 6e 64 5f 6d 65 72 67 65 5f 6c 69 73 74 73 20  and_merge_lists 
1e20: 5b 72 6f 77 69 64 5f 6c 69 73 74 20 7a 65 72 6f  [rowid_list zero
1e30: 5d 20 5b 72 6f 77 69 64 5f 6c 69 73 74 20 6f 6e  ] [rowid_list on
1e40: 65 5d 20 5b 72 6f 77 69 64 5f 6c 69 73 74 20 74  e] [rowid_list t
1e50: 77 6f 5d 0a 7d 0a 64 6f 5f 74 65 73 74 5f 32 20  wo].}.do_test_2 
1e60: 32 2e 34 20 20 7b 22 7a 65 72 6f 20 6f 6e 65 22  2.4  {"zero one"
1e70: 20 4f 52 20 22 6f 6e 65 20 74 77 6f 22 7d 20 7b   OR "one two"} {
1e80: 0a 20 20 6f 72 5f 6d 65 72 67 65 5f 6c 69 73 74  .  or_merge_list
1e90: 73 20 5b 72 6f 77 69 64 5f 6c 69 73 74 20 22 7a  s [rowid_list "z
1ea0: 65 72 6f 20 6f 6e 65 22 5d 20 5b 72 6f 77 69 64  ero one"] [rowid
1eb0: 5f 6c 69 73 74 20 22 6f 6e 65 20 74 77 6f 22 5d  _list "one two"]
1ec0: 0a 7d 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a  .}..finish_test.
1ed0: 0a                                               .