/ Hex Artifact Content
Login

Artifact 18c277f5986df0a3d9071dfd7128afeb16fe9d5d:


0000: 23 20 32 30 31 34 20 4e 6f 76 65 6d 62 65 72 20  # 2014 November 
0010: 32 34 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f  24.#.# The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61  lace of.# a lega
0060: 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69  l notice, here i
0070: 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a  s a blessing:.#.
0080: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20  #    May you do 
0090: 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69  good and not evi
00a0: 6c 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20  l..#    May you 
00b0: 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73  find forgiveness
00c0: 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e   for yourself an
00d0: 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73  d forgive others
00e0: 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73  ..#    May you s
00f0: 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76  hare freely, nev
0100: 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74  er taking more t
0110: 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a  han you give..#.
0120: 23 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 2a 2a 2a 0a 23 20 54 68 69  **********.# Thi
0170: 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74  s file implement
0180: 73 20 72 65 67 72 65 73 73 69 6f 6e 20 74 65 73  s regression tes
0190: 74 73 20 66 6f 72 20 53 51 4c 69 74 65 20 6c 69  ts for SQLite li
01a0: 62 72 61 72 79 2e 20 20 54 68 65 0a 23 20 66 6f  brary.  The.# fo
01b0: 63 75 73 20 6f 66 20 74 68 69 73 20 73 63 72 69  cus of this scri
01c0: 70 74 20 69 73 20 74 65 73 74 69 6e 67 20 74 68  pt is testing th
01d0: 65 20 46 54 53 35 20 6d 6f 64 75 6c 65 2e 0a 23  e FTS5 module..#
01e0: 0a 23 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c  .# Specifically,
01f0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74   this function t
0200: 65 73 74 73 20 74 68 65 20 25 5f 63 6f 6e 66 69  ests the %_confi
0210: 67 20 74 61 62 6c 65 2e 0a 23 0a 0a 73 6f 75 72  g table..#..sour
0220: 63 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 66  ce [file join [f
0230: 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b 69 6e 66  ile dirname [inf
0240: 6f 20 73 63 72 69 70 74 5d 5d 20 66 74 73 35 5f  o script]] fts5_
0250: 63 6f 6d 6d 6f 6e 2e 74 63 6c 5d 0a 73 65 74 20  common.tcl].set 
0260: 74 65 73 74 70 72 65 66 69 78 20 66 74 73 35 61  testprefix fts5a
0270: 6c 0a 0a 23 20 49 66 20 53 51 4c 49 54 45 5f 45  l..# If SQLITE_E
0280: 4e 41 42 4c 45 5f 46 54 53 35 20 69 73 20 64 65  NABLE_FTS5 is de
0290: 66 69 6e 65 64 2c 20 6f 6d 69 74 20 74 68 69 73  fined, omit this
02a0: 20 66 69 6c 65 2e 0a 69 66 63 61 70 61 62 6c 65   file..ifcapable
02b0: 20 21 66 74 73 35 20 7b 0a 20 20 66 69 6e 69 73   !fts5 {.  finis
02c0: 68 5f 74 65 73 74 0a 20 20 72 65 74 75 72 6e 0a  h_test.  return.
02d0: 7d 0a 0a 66 6f 72 65 61 63 68 5f 64 65 74 61 69  }..foreach_detai
02e0: 6c 5f 6d 6f 64 65 20 24 74 65 73 74 70 72 65 66  l_mode $testpref
02f0: 69 78 20 7b 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  ix {..do_execsql
0300: 5f 74 65 73 74 20 31 2e 31 20 7b 0a 20 20 43 52  _test 1.1 {.  CR
0310: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
0320: 4c 45 20 66 74 31 20 55 53 49 4e 47 20 66 74 73  LE ft1 USING fts
0330: 35 28 78 2c 20 64 65 74 61 69 6c 3d 25 44 45 54  5(x, detail=%DET
0340: 41 49 4c 25 29 3b 0a 20 20 53 45 4c 45 43 54 20  AIL%);.  SELECT 
0350: 2a 20 46 52 4f 4d 20 66 74 31 5f 63 6f 6e 66 69  * FROM ft1_confi
0360: 67 3b 0a 7d 20 7b 76 65 72 73 69 6f 6e 20 34 7d  g;.} {version 4}
0370: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
0380: 74 20 31 2e 32 20 7b 0a 20 20 49 4e 53 45 52 54  t 1.2 {.  INSERT
0390: 20 49 4e 54 4f 20 66 74 31 28 66 74 31 2c 20 72   INTO ft1(ft1, r
03a0: 61 6e 6b 29 20 56 41 4c 55 45 53 28 27 70 67 73  ank) VALUES('pgs
03b0: 7a 27 2c 20 33 32 29 3b 0a 20 20 53 45 4c 45 43  z', 32);.  SELEC
03c0: 54 20 2a 20 46 52 4f 4d 20 66 74 31 5f 63 6f 6e  T * FROM ft1_con
03d0: 66 69 67 3b 0a 7d 20 7b 70 67 73 7a 20 33 32 20  fig;.} {pgsz 32 
03e0: 76 65 72 73 69 6f 6e 20 34 7d 0a 0a 64 6f 5f 65  version 4}..do_e
03f0: 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 33 20  xecsql_test 1.3 
0400: 7b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  {.  INSERT INTO 
0410: 66 74 31 28 66 74 31 2c 20 72 61 6e 6b 29 20 56  ft1(ft1, rank) V
0420: 41 4c 55 45 53 28 27 70 67 73 7a 27 2c 20 36 34  ALUES('pgsz', 64
0430: 29 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  );.  SELECT * FR
0440: 4f 4d 20 66 74 31 5f 63 6f 6e 66 69 67 3b 0a 7d  OM ft1_config;.}
0450: 20 7b 70 67 73 7a 20 36 34 20 76 65 72 73 69 6f   {pgsz 64 versio
0460: 6e 20 34 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  n 4}..#---------
0470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04b0: 2d 0a 23 20 54 65 73 74 20 74 68 65 20 6c 6f 67  -.# Test the log
04c0: 69 63 20 66 6f 72 20 70 61 72 73 69 6e 67 20 74  ic for parsing t
04d0: 68 65 20 72 61 6e 6b 28 29 20 66 75 6e 63 74 69  he rank() functi
04e0: 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 23  on definition..#
04f0: 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 64 65 66  .foreach {tn def
0500: 6e 7d 20 7b 0a 20 20 31 20 22 66 6e 61 6d 65 28  n} {.  1 "fname(
0510: 29 22 0a 20 20 32 20 22 66 6e 61 6d 65 28 31 29  )".  2 "fname(1)
0520: 22 0a 20 20 33 20 22 66 6e 61 6d 65 28 31 2c 32  ".  3 "fname(1,2
0530: 29 22 0a 20 20 34 20 22 66 6e 61 6d 65 28 6e 75  )".  4 "fname(nu
0540: 6c 6c 2c 4e 55 4c 4c 2c 6e 55 6c 4c 29 22 0a 20  ll,NULL,nUlL)". 
0550: 20 35 20 22 20 20 66 6e 61 6d 65 20 20 20 20 28   5 "  fname    (
0560: 20 20 20 6e 75 6c 6c 20 20 2c 20 20 20 4e 55 4c     null  ,   NUL
0570: 4c 20 20 2c 20 20 6e 55 6c 4c 20 20 29 20 20 22  L  ,  nUlL  )  "
0580: 0a 20 20 36 20 22 66 6e 61 6d 65 28 27 61 62 63  .  6 "fname('abc
0590: 27 29 22 0a 20 20 37 20 22 66 6e 61 6d 65 28 27  ')".  7 "fname('
05a0: 61 27 27 62 63 27 29 22 0a 20 20 38 20 22 66 6e  a''bc')".  8 "fn
05b0: 61 6d 65 28 27 27 27 61 62 63 27 29 22 0a 20 20  ame('''abc')".  
05c0: 39 20 22 66 6e 61 6d 65 28 27 61 62 63 27 27 27  9 "fname('abc'''
05d0: 29 22 0a 0a 20 20 37 20 22 66 6e 61 6d 65 28 20  )"..  7 "fname( 
05e0: 20 27 61 27 27 62 63 27 20 20 29 22 0a 20 20 38   'a''bc'  )".  8
05f0: 20 22 66 6e 61 6d 65 28 27 27 27 61 62 63 27 20   "fname('''abc' 
0600: 20 29 22 0a 20 20 39 20 22 66 6e 61 6d 65 28 20   )".  9 "fname( 
0610: 20 27 61 62 63 27 27 27 20 29 22 0a 0a 20 20 31   'abc''' )"..  1
0620: 30 20 22 66 6e 61 6d 65 28 58 27 31 32 33 34 61  0 "fname(X'1234a
0630: 62 27 29 22 0a 0a 20 20 31 31 20 22 6d 79 66 75  b')"..  11 "myfu
0640: 6e 63 28 31 2e 32 29 22 0a 20 20 31 32 20 22 6d  nc(1.2)".  12 "m
0650: 79 66 75 6e 63 28 2d 31 2e 30 29 22 0a 20 20 31  yfunc(-1.0)".  1
0660: 33 20 22 6d 79 66 75 6e 63 28 2e 30 31 2c 27 61  3 "myfunc(.01,'a
0670: 62 63 27 29 22 0a 7d 20 7b 0a 20 20 64 6f 5f 65  bc')".} {.  do_e
0680: 78 65 63 73 71 6c 5f 74 65 73 74 20 32 2e 31 2e  xecsql_test 2.1.
0690: 24 74 6e 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  $tn {.    INSERT
06a0: 20 49 4e 54 4f 20 66 74 31 28 66 74 31 2c 20 72   INTO ft1(ft1, r
06b0: 61 6e 6b 29 20 56 41 4c 55 45 53 28 27 72 61 6e  ank) VALUES('ran
06c0: 6b 27 2c 20 24 64 65 66 6e 29 3b 0a 20 20 7d 0a  k', $defn);.  }.
06d0: 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 64  }..foreach {tn d
06e0: 65 66 6e 7d 20 7b 0a 20 20 31 20 22 22 0a 20 20  efn} {.  1 "".  
06f0: 32 20 22 66 6e 61 6d 65 22 0a 20 20 33 20 22 66  2 "fname".  3 "f
0700: 6e 61 6d 65 28 58 27 32 33 34 61 62 27 29 22 0a  name(X'234ab')".
0710: 20 20 34 20 22 6d 79 66 75 6e 63 28 2d 31 2e 2c    4 "myfunc(-1.,
0720: 27 61 62 63 27 29 22 0a 7d 20 7b 0a 20 20 64 6f  'abc')".} {.  do
0730: 5f 74 65 73 74 20 32 2e 32 2e 24 74 6e 20 7b 0a  _test 2.2.$tn {.
0740: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49      catchsql { I
0750: 4e 53 45 52 54 20 49 4e 54 4f 20 66 74 31 28 66  NSERT INTO ft1(f
0760: 74 31 2c 20 72 61 6e 6b 29 20 56 41 4c 55 45 53  t1, rank) VALUES
0770: 28 27 72 61 6e 6b 27 2c 20 24 64 65 66 6e 29 20  ('rank', $defn) 
0780: 7d 0a 20 20 7d 20 7b 31 20 7b 53 51 4c 20 6c 6f  }.  } {1 {SQL lo
0790: 67 69 63 20 65 72 72 6f 72 20 6f 72 20 6d 69 73  gic error or mis
07a0: 73 69 6e 67 20 64 61 74 61 62 61 73 65 7d 7d 0a  sing database}}.
07b0: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
07c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
0800: 41 73 73 6f 72 74 65 64 20 74 65 73 74 73 20 6f  Assorted tests o
0810: 66 20 74 68 65 20 74 63 6c 20 69 6e 74 65 72 66  f the tcl interf
0820: 61 63 65 20 66 6f 72 20 63 72 65 61 74 69 6e 67  ace for creating
0830: 20 65 78 74 65 6e 73 69 6f 6e 20 66 75 6e 63 74   extension funct
0840: 69 6f 6e 73 2e 0a 23 0a 0a 64 6f 5f 65 78 65 63  ions..#..do_exec
0850: 73 71 6c 5f 74 65 73 74 20 33 2e 31 20 7b 0a 20  sql_test 3.1 {. 
0860: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
0870: 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20 66  TABLE t1 USING f
0880: 74 73 35 28 78 2c 20 64 65 74 61 69 6c 3d 25 44  ts5(x, detail=%D
0890: 45 54 41 49 4c 25 29 3b 0a 20 20 49 4e 53 45 52  ETAIL%);.  INSER
08a0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
08b0: 28 27 71 20 77 20 65 20 72 20 74 20 79 27 29 3b  ('q w e r t y');
08c0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
08d0: 31 20 56 41 4c 55 45 53 28 27 79 20 74 20 72 20  1 VALUES('y t r 
08e0: 65 20 77 20 71 27 29 3b 0a 7d 0a 0a 70 72 6f 63  e w q');.}..proc
08f0: 20 61 72 67 74 65 73 74 20 7b 63 6d 64 20 61 72   argtest {cmd ar
0900: 67 73 7d 20 7b 20 72 65 74 75 72 6e 20 24 61 72  gs} { return $ar
0910: 67 73 20 7d 0a 73 71 6c 69 74 65 33 5f 66 74 73  gs }.sqlite3_fts
0920: 35 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  5_create_functio
0930: 6e 20 64 62 20 61 72 67 74 65 73 74 20 61 72 67  n db argtest arg
0940: 74 65 73 74 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  test..do_execsql
0950: 5f 74 65 73 74 20 33 2e 32 2e 31 20 7b 0a 20 20  _test 3.2.1 {.  
0960: 53 45 4c 45 43 54 20 61 72 67 74 65 73 74 28 74  SELECT argtest(t
0970: 31 2c 20 31 32 33 29 20 46 52 4f 4d 20 74 31 20  1, 123) FROM t1 
0980: 57 48 45 52 45 20 74 31 20 4d 41 54 43 48 20 27  WHERE t1 MATCH '
0990: 71 27 0a 7d 20 7b 31 32 33 20 31 32 33 7d 0a 0a  q'.} {123 123}..
09a0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
09b0: 33 2e 32 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54  3.2.2 {.  SELECT
09c0: 20 61 72 67 74 65 73 74 28 74 31 2c 20 31 32 33   argtest(t1, 123
09d0: 2c 20 34 35 36 29 20 46 52 4f 4d 20 74 31 20 57  , 456) FROM t1 W
09e0: 48 45 52 45 20 74 31 20 4d 41 54 43 48 20 27 71  HERE t1 MATCH 'q
09f0: 27 0a 7d 20 7b 7b 31 32 33 20 34 35 36 7d 20 7b  '.} {{123 456} {
0a00: 31 32 33 20 34 35 36 7d 7d 0a 0a 70 72 6f 63 20  123 456}}..proc 
0a10: 72 6f 77 69 64 74 65 73 74 20 7b 63 6d 64 7d 20  rowidtest {cmd} 
0a20: 7b 20 24 63 6d 64 20 78 52 6f 77 69 64 20 7d 0a  { $cmd xRowid }.
0a30: 73 71 6c 69 74 65 33 5f 66 74 73 35 5f 63 72 65  sqlite3_fts5_cre
0a40: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 64 62 20  ate_function db 
0a50: 72 6f 77 69 64 74 65 73 74 20 72 6f 77 69 64 74  rowidtest rowidt
0a60: 65 73 74 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  est..do_execsql_
0a70: 74 65 73 74 20 33 2e 33 2e 31 20 7b 0a 20 20 53  test 3.3.1 {.  S
0a80: 45 4c 45 43 54 20 72 6f 77 69 64 74 65 73 74 28  ELECT rowidtest(
0a90: 74 31 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52  t1) FROM t1 WHER
0aa0: 45 20 74 31 20 4d 41 54 43 48 20 27 71 27 0a 7d  E t1 MATCH 'q'.}
0ab0: 20 7b 31 20 32 7d 0a 0a 70 72 6f 63 20 69 6e 73   {1 2}..proc ins
0ac0: 74 74 65 73 74 20 7b 63 6d 64 7d 20 7b 0a 20 20  ttest {cmd} {.  
0ad0: 73 65 74 20 72 65 73 20 5b 6c 69 73 74 5d 0a 20  set res [list]. 
0ae0: 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b   for {set i 0} {
0af0: 24 69 20 3c 20 5b 24 63 6d 64 20 78 49 6e 73 74  $i < [$cmd xInst
0b00: 43 6f 75 6e 74 5d 7d 20 7b 69 6e 63 72 20 69 7d  Count]} {incr i}
0b10: 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 72   {.    lappend r
0b20: 65 73 20 5b 24 63 6d 64 20 78 49 6e 73 74 20 24  es [$cmd xInst $
0b30: 69 5d 0a 20 20 7d 0a 20 20 73 65 74 20 72 65 73  i].  }.  set res
0b40: 0a 7d 0a 73 71 6c 69 74 65 33 5f 66 74 73 35 5f  .}.sqlite3_fts5_
0b50: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20  create_function 
0b60: 64 62 20 69 6e 73 74 74 65 73 74 20 69 6e 73 74  db insttest inst
0b70: 74 65 73 74 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  test..do_execsql
0b80: 5f 74 65 73 74 20 33 2e 34 2e 31 20 7b 0a 20 20  _test 3.4.1 {.  
0b90: 53 45 4c 45 43 54 20 69 6e 73 74 74 65 73 74 28  SELECT insttest(
0ba0: 74 31 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52  t1) FROM t1 WHER
0bb0: 45 20 74 31 20 4d 41 54 43 48 20 27 71 27 0a 7d  E t1 MATCH 'q'.}
0bc0: 20 7b 0a 20 20 7b 7b 30 20 30 20 30 7d 7d 0a 20   {.  {{0 0 0}}. 
0bd0: 20 7b 7b 30 20 30 20 35 7d 7d 20 0a 7d 0a 0a 69   {{0 0 5}} .}..i
0be0: 66 20 7b 5b 64 65 74 61 69 6c 5f 69 73 5f 66 75  f {[detail_is_fu
0bf0: 6c 6c 5d 7d 20 7b 0a 20 20 64 6f 5f 65 78 65 63  ll]} {.  do_exec
0c00: 73 71 6c 5f 74 65 73 74 20 33 2e 34 2e 32 20 7b  sql_test 3.4.2 {
0c10: 0a 20 20 20 20 53 45 4c 45 43 54 20 69 6e 73 74  .    SELECT inst
0c20: 74 65 73 74 28 74 31 29 20 46 52 4f 4d 20 74 31  test(t1) FROM t1
0c30: 20 57 48 45 52 45 20 74 31 20 4d 41 54 43 48 20   WHERE t1 MATCH 
0c40: 27 72 2b 65 20 4f 52 20 77 27 0a 20 20 7d 20 7b  'r+e OR w'.  } {
0c50: 0a 20 20 20 20 7b 7b 31 20 30 20 31 7d 7d 0a 20  .    {{1 0 1}}. 
0c60: 20 20 20 7b 7b 30 20 30 20 32 7d 20 7b 31 20 30     {{0 0 2} {1 0
0c70: 20 34 7d 7d 20 0a 20 20 7d 0a 7d 0a 0a 70 72 6f   4}} .  }.}..pro
0c80: 63 20 63 6f 6c 74 65 73 74 20 7b 63 6d 64 7d 20  c coltest {cmd} 
0c90: 7b 0a 20 20 6c 69 73 74 20 5b 24 63 6d 64 20 78  {.  list [$cmd x
0ca0: 43 6f 6c 75 6d 6e 53 69 7a 65 20 30 5d 20 5b 24  ColumnSize 0] [$
0cb0: 63 6d 64 20 78 43 6f 6c 75 6d 6e 54 65 78 74 20  cmd xColumnText 
0cc0: 30 5d 0a 7d 0a 73 71 6c 69 74 65 33 5f 66 74 73  0].}.sqlite3_fts
0cd0: 35 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  5_create_functio
0ce0: 6e 20 64 62 20 63 6f 6c 74 65 73 74 20 63 6f 6c  n db coltest col
0cf0: 74 65 73 74 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  test..do_execsql
0d00: 5f 74 65 73 74 20 33 2e 35 2e 31 20 7b 0a 20 20  _test 3.5.1 {.  
0d10: 53 45 4c 45 43 54 20 63 6f 6c 74 65 73 74 28 74  SELECT coltest(t
0d20: 31 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  1) FROM t1 WHERE
0d30: 20 74 31 20 4d 41 54 43 48 20 27 71 27 0a 7d 20   t1 MATCH 'q'.} 
0d40: 7b 0a 20 20 7b 36 20 7b 71 20 77 20 65 20 72 20  {.  {6 {q w e r 
0d50: 74 20 79 7d 7d 0a 20 20 7b 36 20 7b 79 20 74 20  t y}}.  {6 {y t 
0d60: 72 20 65 20 77 20 71 7d 7d 20 0a 7d 0a 0a 23 2d  r e w q}} .}..#-
0d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0db0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 73  --------.# Tests
0dc0: 20 66 6f 72 20 72 65 6d 61 70 70 69 6e 67 20 74   for remapping t
0dd0: 68 65 20 22 72 61 6e 6b 22 20 63 6f 6c 75 6d 6e  he "rank" column
0de0: 2e 0a 23 0a 23 20 20 20 34 2e 31 2e 2a 3a 20 4d  ..#.#   4.1.*: M
0df0: 61 70 70 65 64 20 74 6f 20 61 20 66 75 6e 63 74  apped to a funct
0e00: 69 6f 6e 20 77 69 74 68 20 6e 6f 20 61 72 67 75  ion with no argu
0e10: 6d 65 6e 74 73 2e 0a 23 20 20 20 34 2e 32 2e 2a  ments..#   4.2.*
0e20: 3a 20 4d 61 70 70 65 64 20 74 6f 20 61 20 66 75  : Mapped to a fu
0e30: 6e 63 74 69 6f 6e 20 77 69 74 68 20 6f 6e 65 20  nction with one 
0e40: 6f 72 20 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74  or more argument
0e50: 73 2e 0a 23 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  s..#..do_execsql
0e60: 5f 74 65 73 74 20 34 2e 30 20 7b 0a 20 20 43 52  _test 4.0 {.  CR
0e70: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
0e80: 4c 45 20 74 32 20 55 53 49 4e 47 20 66 74 73 35  LE t2 USING fts5
0e90: 28 61 2c 20 62 2c 20 64 65 74 61 69 6c 3d 25 44  (a, b, detail=%D
0ea0: 45 54 41 49 4c 25 29 3b 0a 20 20 49 4e 53 45 52  ETAIL%);.  INSER
0eb0: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
0ec0: 28 27 61 20 73 20 68 20 67 20 73 20 62 20 6a 20  ('a s h g s b j 
0ed0: 6d 20 72 20 68 27 2c 20 27 73 20 62 20 70 20 61  m r h', 's b p a
0ee0: 20 64 20 62 20 62 20 61 20 6f 20 65 27 29 3b 0a   d b b a o e');.
0ef0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
0f00: 20 56 41 4c 55 45 53 28 27 72 20 68 20 6e 20 74   VALUES('r h n t
0f10: 20 61 20 67 20 72 20 64 20 64 20 69 27 2c 20 27   a g r d d i', '
0f20: 6c 20 64 20 6e 20 6a 20 72 20 63 20 66 20 74 20  l d n j r c f t 
0f30: 6f 20 71 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  o q');.  INSERT 
0f40: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27  INTO t2 VALUES('
0f50: 71 20 6b 20 6e 20 69 20 6b 20 63 20 61 20 61 20  q k n i k c a a 
0f60: 65 20 6d 27 2c 20 27 63 20 68 20 6e 20 6a 20 70  e m', 'c h n j p
0f70: 20 67 20 73 20 63 20 69 20 74 27 29 3b 0a 20 20   g s c i t');.  
0f80: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
0f90: 41 4c 55 45 53 28 27 68 20 6a 20 67 20 74 20 72  ALUES('h j g t r
0fa0: 20 65 20 6c 20 73 20 67 20 73 27 2c 20 27 6b 20   e l s g s', 'k 
0fb0: 71 20 6b 20 63 20 69 20 69 20 63 20 6b 20 6e 20  q k c i i c k n 
0fc0: 73 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  s');.  INSERT IN
0fd0: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 62 20  TO t2 VALUES('b 
0fe0: 6c 20 6b 20 68 20 64 20 6e 20 6e 20 6e 20 6d 20  l k h d n n n m 
0ff0: 69 27 2c 20 27 70 20 74 20 69 20 61 20 72 20 62  i', 'p t i a r b
1000: 20 74 20 71 20 6f 20 6c 27 29 3b 0a 20 20 49 4e   t q o l');.  IN
1010: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
1020: 55 45 53 28 27 6b 20 72 20 69 20 6c 20 6a 20 62  UES('k r i l j b
1030: 20 67 20 69 20 70 20 61 27 2c 20 27 74 20 71 20   g i p a', 't q 
1040: 63 20 68 20 61 20 69 20 6d 20 67 20 6e 20 6c 27  c h a i m g n l'
1050: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
1060: 20 74 32 20 56 41 4c 55 45 53 28 27 61 20 65 20   t2 VALUES('a e 
1070: 63 20 71 20 6e 20 6d 20 6f 20 6d 20 64 20 67 27  c q n m o m d g'
1080: 2c 20 27 6c 20 63 20 74 20 67 20 69 20 73 20 71  , 'l c t g i s q
1090: 20 67 20 71 20 65 27 29 3b 0a 20 20 49 4e 53 45   g q e');.  INSE
10a0: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
10b0: 53 28 27 62 20 6f 20 6a 20 68 20 66 20 6f 20 67  S('b o j h f o g
10c0: 20 62 20 70 20 65 27 2c 20 27 72 20 74 20 6c 20   b p e', 'r t l 
10d0: 68 20 73 20 62 20 67 20 69 20 63 20 70 27 29 3b  h s b g i c p');
10e0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
10f0: 32 20 56 41 4c 55 45 53 28 27 73 20 71 20 6b 20  2 VALUES('s q k 
1100: 66 20 71 20 62 20 6a 20 67 20 68 20 66 27 2c 20  f q b j g h f', 
1110: 27 6e 20 6d 20 61 20 6f 20 70 20 65 20 69 20 65  'n m a o p e i e
1120: 20 6b 20 74 27 29 3b 0a 20 20 49 4e 53 45 52 54   k t');.  INSERT
1130: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
1140: 27 6f 20 71 20 67 20 67 20 71 20 63 20 6f 20 6b  'o q g g q c o k
1150: 20 61 20 62 27 2c 20 27 72 20 74 20 6b 20 70 20   a b', 'r t k p 
1160: 74 20 66 20 74 20 68 20 70 20 63 27 29 3b 0a 7d  t f t h p c');.}
1170: 0a 0a 70 72 6f 63 20 66 69 72 73 74 69 6e 73 74  ..proc firstinst
1180: 20 7b 63 6d 64 7d 20 7b 20 0a 20 20 66 6f 72 65   {cmd} { .  fore
1190: 61 63 68 20 7b 70 20 63 20 6f 7d 20 5b 24 63 6d  ach {p c o} [$cm
11a0: 64 20 78 49 6e 73 74 20 30 5d 20 7b 7d 0a 20 20  d xInst 0] {}.  
11b0: 65 78 70 72 20 24 63 2a 31 30 30 20 2b 20 24 6f  expr $c*100 + $o
11c0: 0a 7d 0a 73 71 6c 69 74 65 33 5f 66 74 73 35 5f  .}.sqlite3_fts5_
11d0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20  create_function 
11e0: 64 62 20 66 69 72 73 74 69 6e 73 74 20 66 69 72  db firstinst fir
11f0: 73 74 69 6e 73 74 0a 0a 64 6f 5f 65 78 65 63 73  stinst..do_execs
1200: 71 6c 5f 74 65 73 74 20 34 2e 31 2e 31 20 7b 0a  ql_test 4.1.1 {.
1210: 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20    SELECT rowid, 
1220: 66 69 72 73 74 69 6e 73 74 28 74 32 29 20 46 52  firstinst(t2) FR
1230: 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32 20 4d  OM t2 WHERE t2 M
1240: 41 54 43 48 20 27 61 27 20 4f 52 44 45 52 20 42  ATCH 'a' ORDER B
1250: 59 20 72 6f 77 69 64 20 41 53 43 0a 7d 20 7b 0a  Y rowid ASC.} {.
1260: 20 20 31 20 30 20 32 20 34 20 33 20 36 20 20 20    1 0 2 4 3 6   
1270: 35 20 20 31 30 33 0a 20 20 36 20 39 20 37 20 30  5  103.  6 9 7 0
1280: 20 39 20 31 30 32 20 31 30 20 38 0a 7d 0a 0a 64   9 102 10 8.}..d
1290: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 34  o_execsql_test 4
12a0: 2e 31 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20  .1.2 {.  SELECT 
12b0: 72 6f 77 69 64 2c 20 72 61 6e 6b 20 46 52 4f 4d  rowid, rank FROM
12c0: 20 74 32 20 0a 20 20 57 48 45 52 45 20 74 32 20   t2 .  WHERE t2 
12d0: 4d 41 54 43 48 20 27 61 27 20 41 4e 44 20 72 61  MATCH 'a' AND ra
12e0: 6e 6b 20 4d 41 54 43 48 20 27 66 69 72 73 74 69  nk MATCH 'firsti
12f0: 6e 73 74 28 29 27 20 0a 20 20 4f 52 44 45 52 20  nst()' .  ORDER 
1300: 42 59 20 72 6f 77 69 64 20 41 53 43 0a 7d 20 7b  BY rowid ASC.} {
1310: 0a 20 20 31 20 30 20 32 20 34 20 33 20 36 20 20  .  1 0 2 4 3 6  
1320: 20 35 20 20 31 30 33 0a 20 20 36 20 39 20 37 20   5  103.  6 9 7 
1330: 30 20 39 20 31 30 32 20 31 30 20 38 0a 7d 0a 0a  0 9 102 10 8.}..
1340: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
1350: 34 2e 31 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54  4.1.3 {.  SELECT
1360: 20 72 6f 77 69 64 2c 20 72 61 6e 6b 20 46 52 4f   rowid, rank FRO
1370: 4d 20 74 32 20 0a 20 20 57 48 45 52 45 20 74 32  M t2 .  WHERE t2
1380: 20 4d 41 54 43 48 20 27 61 27 20 41 4e 44 20 72   MATCH 'a' AND r
1390: 61 6e 6b 20 4d 41 54 43 48 20 27 66 69 72 73 74  ank MATCH 'first
13a0: 69 6e 73 74 28 29 27 0a 20 20 4f 52 44 45 52 20  inst()'.  ORDER 
13b0: 42 59 20 72 61 6e 6b 20 44 45 53 43 0a 7d 20 7b  BY rank DESC.} {
13c0: 0a 20 20 35 20 31 30 33 20 20 39 20 31 30 32 20  .  5 103  9 102 
13d0: 20 36 20 39 20 20 31 30 20 38 20 20 33 20 36 20   6 9  10 8  3 6 
13e0: 20 32 20 34 20 20 31 20 30 20 20 37 20 30 20 20   2 4  1 0  7 0  
13f0: 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  .}..do_execsql_t
1400: 65 73 74 20 34 2e 31 2e 34 20 7b 0a 20 20 49 4e  est 4.1.4 {.  IN
1410: 53 45 52 54 20 49 4e 54 4f 20 74 32 28 74 32 2c  SERT INTO t2(t2,
1420: 20 72 61 6e 6b 29 20 56 41 4c 55 45 53 28 27 72   rank) VALUES('r
1430: 61 6e 6b 27 2c 20 27 66 69 72 73 74 69 6e 73 74  ank', 'firstinst
1440: 28 29 27 29 3b 0a 20 20 53 45 4c 45 43 54 20 72  ()');.  SELECT r
1450: 6f 77 69 64 2c 20 72 61 6e 6b 20 46 52 4f 4d 20  owid, rank FROM 
1460: 74 32 20 57 48 45 52 45 20 74 32 20 4d 41 54 43  t2 WHERE t2 MATC
1470: 48 20 27 61 27 20 4f 52 44 45 52 20 42 59 20 72  H 'a' ORDER BY r
1480: 6f 77 69 64 20 41 53 43 0a 7d 20 7b 0a 20 20 31  owid ASC.} {.  1
1490: 20 30 20 32 20 34 20 33 20 36 20 20 20 35 20 20   0 2 4 3 6   5  
14a0: 31 30 33 0a 20 20 36 20 39 20 37 20 30 20 39 20  103.  6 9 7 0 9 
14b0: 31 30 32 20 31 30 20 38 0a 7d 0a 0a 64 6f 5f 65  102 10 8.}..do_e
14c0: 78 65 63 73 71 6c 5f 74 65 73 74 20 34 2e 31 2e  xecsql_test 4.1.
14d0: 35 20 7b 0a 20 20 53 45 4c 45 43 54 20 72 6f 77  5 {.  SELECT row
14e0: 69 64 2c 20 72 61 6e 6b 20 46 52 4f 4d 20 74 32  id, rank FROM t2
14f0: 20 57 48 45 52 45 20 74 32 20 4d 41 54 43 48 20   WHERE t2 MATCH 
1500: 27 61 27 20 4f 52 44 45 52 20 42 59 20 72 61 6e  'a' ORDER BY ran
1510: 6b 20 44 45 53 43 0a 7d 20 7b 0a 20 20 35 20 31  k DESC.} {.  5 1
1520: 30 33 20 20 39 20 31 30 32 20 20 36 20 39 20 20  03  9 102  6 9  
1530: 31 30 20 38 20 20 33 20 36 20 20 32 20 34 20 20  10 8  3 6  2 4  
1540: 31 20 30 20 20 37 20 30 20 20 0a 7d 0a 0a 64 6f  1 0  7 0  .}..do
1550: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 34 2e  _execsql_test 4.
1560: 31 2e 36 20 7b 0a 20 20 49 4e 53 45 52 54 20 49  1.6 {.  INSERT I
1570: 4e 54 4f 20 74 32 28 74 32 2c 20 72 61 6e 6b 29  NTO t2(t2, rank)
1580: 20 56 41 4c 55 45 53 28 27 72 61 6e 6b 27 2c 20   VALUES('rank', 
1590: 27 66 69 72 73 74 69 6e 73 74 20 28 20 20 20 20  'firstinst (    
15a0: 29 20 27 29 3b 0a 20 20 53 45 4c 45 43 54 20 72  ) ');.  SELECT r
15b0: 6f 77 69 64 2c 20 72 61 6e 6b 20 46 52 4f 4d 20  owid, rank FROM 
15c0: 74 32 20 57 48 45 52 45 20 74 32 20 4d 41 54 43  t2 WHERE t2 MATC
15d0: 48 20 27 61 27 20 4f 52 44 45 52 20 42 59 20 72  H 'a' ORDER BY r
15e0: 61 6e 6b 20 44 45 53 43 0a 7d 20 7b 0a 20 20 35  ank DESC.} {.  5
15f0: 20 31 30 33 20 20 39 20 31 30 32 20 20 36 20 39   103  9 102  6 9
1600: 20 20 31 30 20 38 20 20 33 20 36 20 20 32 20 34    10 8  3 6  2 4
1610: 20 20 20 31 20 30 20 20 37 20 30 20 20 0a 7d 0a     1 0  7 0  .}.
1620: 0a 70 72 6f 63 20 72 6f 77 69 64 70 6c 75 73 20  .proc rowidplus 
1630: 7b 63 6d 64 20 69 76 61 6c 7d 20 7b 20 0a 20 20  {cmd ival} { .  
1640: 65 78 70 72 20 5b 24 63 6d 64 20 78 52 6f 77 69  expr [$cmd xRowi
1650: 64 5d 20 2b 20 24 69 76 61 6c 0a 7d 0a 73 71 6c  d] + $ival.}.sql
1660: 69 74 65 33 5f 66 74 73 35 5f 63 72 65 61 74 65  ite3_fts5_create
1670: 5f 66 75 6e 63 74 69 6f 6e 20 64 62 20 72 6f 77  _function db row
1680: 69 64 70 6c 75 73 20 72 6f 77 69 64 70 6c 75 73  idplus rowidplus
1690: 0a 0a 69 66 20 7b 5b 64 65 74 61 69 6c 5f 69 73  ..if {[detail_is
16a0: 5f 66 75 6c 6c 5d 7d 20 7b 0a 20 20 64 6f 5f 65  _full]} {.  do_e
16b0: 78 65 63 73 71 6c 5f 74 65 73 74 20 34 2e 32 2e  xecsql_test 4.2.
16c0: 31 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  1 {.    INSERT I
16d0: 4e 54 4f 20 74 32 28 74 32 2c 20 72 61 6e 6b 29  NTO t2(t2, rank)
16e0: 20 56 41 4c 55 45 53 28 27 72 61 6e 6b 27 2c 20   VALUES('rank', 
16f0: 27 72 6f 77 69 64 70 6c 75 73 28 31 30 30 29 20  'rowidplus(100) 
1700: 27 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 72  ');.    SELECT r
1710: 6f 77 69 64 2c 20 72 61 6e 6b 20 46 52 4f 4d 20  owid, rank FROM 
1720: 74 32 20 57 48 45 52 45 20 74 32 20 4d 41 54 43  t2 WHERE t2 MATC
1730: 48 20 27 6f 20 2b 20 71 20 2b 20 67 27 0a 20 20  H 'o + q + g'.  
1740: 7d 20 7b 0a 20 20 20 20 31 30 20 31 31 30 0a 20  } {.    10 110. 
1750: 20 7d 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f   }.  do_execsql_
1760: 74 65 73 74 20 34 2e 32 2e 32 20 7b 0a 20 20 20  test 4.2.2 {.   
1770: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 28   INSERT INTO t2(
1780: 74 32 2c 20 72 61 6e 6b 29 20 56 41 4c 55 45 53  t2, rank) VALUES
1790: 28 27 72 61 6e 6b 27 2c 20 27 72 6f 77 69 64 70  ('rank', 'rowidp
17a0: 6c 75 73 28 31 31 31 29 20 27 29 3b 0a 20 20 20  lus(111) ');.   
17b0: 20 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 72   SELECT rowid, r
17c0: 61 6e 6b 20 46 52 4f 4d 20 74 32 20 57 48 45 52  ank FROM t2 WHER
17d0: 45 20 74 32 20 4d 41 54 43 48 20 27 6f 20 2b 20  E t2 MATCH 'o + 
17e0: 71 20 2b 20 67 27 0a 20 20 7d 20 7b 0a 20 20 20  q + g'.  } {.   
17f0: 20 31 30 20 31 32 31 0a 20 20 7d 0a 0a 20 20 64   10 121.  }..  d
1800: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 34  o_execsql_test 4
1810: 2e 32 2e 33 20 7b 0a 20 20 20 20 53 45 4c 45 43  .2.3 {.    SELEC
1820: 54 20 72 6f 77 69 64 2c 20 72 61 6e 6b 20 46 52  T rowid, rank FR
1830: 4f 4d 20 74 32 20 0a 20 20 20 20 20 20 57 48 45  OM t2 .      WHE
1840: 52 45 20 74 32 20 4d 41 54 43 48 20 27 6f 20 2b  RE t2 MATCH 'o +
1850: 20 71 20 2b 20 67 27 20 41 4e 44 20 72 61 6e 6b   q + g' AND rank
1860: 20 4d 41 54 43 48 20 27 72 6f 77 69 64 70 6c 75   MATCH 'rowidplu
1870: 73 28 31 31 32 29 27 0a 20 20 7d 20 7b 0a 20 20  s(112)'.  } {.  
1880: 20 20 31 30 20 31 32 32 0a 20 20 7d 0a 7d 0a 0a    10 122.  }.}..
1890: 70 72 6f 63 20 72 6f 77 69 64 6d 6f 64 20 7b 63  proc rowidmod {c
18a0: 6d 64 20 69 6d 6f 64 7d 20 7b 20 0a 20 20 65 78  md imod} { .  ex
18b0: 70 72 20 5b 24 63 6d 64 20 78 52 6f 77 69 64 5d  pr [$cmd xRowid]
18c0: 20 25 20 24 69 6d 6f 64 0a 7d 0a 73 71 6c 69 74   % $imod.}.sqlit
18d0: 65 33 5f 66 74 73 35 5f 63 72 65 61 74 65 5f 66  e3_fts5_create_f
18e0: 75 6e 63 74 69 6f 6e 20 64 62 20 72 6f 77 69 64  unction db rowid
18f0: 6d 6f 64 20 72 6f 77 69 64 6d 6f 64 0a 64 6f 5f  mod rowidmod.do_
1900: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 34 2e 33  execsql_test 4.3
1910: 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20 56 49  .1 {.  CREATE VI
1920: 52 54 55 41 4c 20 54 41 42 4c 45 20 74 33 20 55  RTUAL TABLE t3 U
1930: 53 49 4e 47 20 66 74 73 35 28 78 2c 20 64 65 74  SING fts5(x, det
1940: 61 69 6c 3d 25 44 45 54 41 49 4c 25 29 3b 0a 20  ail=%DETAIL%);. 
1950: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
1960: 56 41 4c 55 45 53 28 27 61 20 6f 6e 65 27 29 3b  VALUES('a one');
1970: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
1980: 33 20 56 41 4c 55 45 53 28 27 61 20 74 77 6f 27  3 VALUES('a two'
1990: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
19a0: 20 74 33 20 56 41 4c 55 45 53 28 27 61 20 74 68   t3 VALUES('a th
19b0: 72 65 65 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  ree');.  INSERT 
19c0: 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 27  INTO t3 VALUES('
19d0: 61 20 66 6f 75 72 27 29 3b 0a 20 20 49 4e 53 45  a four');.  INSE
19e0: 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45  RT INTO t3 VALUE
19f0: 53 28 27 61 20 66 69 76 65 27 29 3b 0a 20 20 49  S('a five');.  I
1a00: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 28 74 33  NSERT INTO t3(t3
1a10: 2c 20 72 61 6e 6b 29 20 56 41 4c 55 45 53 28 27  , rank) VALUES('
1a20: 72 61 6e 6b 27 2c 20 27 62 6d 32 35 28 29 27 29  rank', 'bm25()')
1a30: 3b 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  ;.}..do_execsql_
1a40: 74 65 73 74 20 34 2e 33 2e 32 20 7b 0a 20 20 53  test 4.3.2 {.  S
1a50: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 0a  ELECT * FROM t3.
1a60: 20 20 57 48 45 52 45 20 74 33 20 4d 41 54 43 48    WHERE t3 MATCH
1a70: 20 27 61 27 20 41 4e 44 20 72 61 6e 6b 20 4d 41   'a' AND rank MA
1a80: 54 43 48 20 27 72 6f 77 69 64 6d 6f 64 28 34 29  TCH 'rowidmod(4)
1a90: 27 20 0a 20 20 4f 52 44 45 52 20 42 59 20 72 61  ' .  ORDER BY ra
1aa0: 6e 6b 20 41 53 43 0a 7d 20 7b 0a 20 20 7b 61 20  nk ASC.} {.  {a 
1ab0: 66 6f 75 72 7d 20 7b 61 20 6f 6e 65 7d 20 7b 61  four} {a one} {a
1ac0: 20 66 69 76 65 7d 20 7b 61 20 74 77 6f 7d 20 7b   five} {a two} {
1ad0: 61 20 74 68 72 65 65 7d 0a 7d 0a 0a 64 6f 5f 65  a three}.}..do_e
1ae0: 78 65 63 73 71 6c 5f 74 65 73 74 20 34 2e 33 2e  xecsql_test 4.3.
1af0: 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 2c 20  3 {.  SELECT *, 
1b00: 72 61 6e 6b 20 46 52 4f 4d 20 74 33 0a 20 20 57  rank FROM t3.  W
1b10: 48 45 52 45 20 74 33 20 4d 41 54 43 48 20 27 61  HERE t3 MATCH 'a
1b20: 27 20 41 4e 44 20 72 61 6e 6b 20 4d 41 54 43 48  ' AND rank MATCH
1b30: 20 27 72 6f 77 69 64 6d 6f 64 28 33 29 27 20 0a   'rowidmod(3)' .
1b40: 20 20 4f 52 44 45 52 20 42 59 20 72 61 6e 6b 20    ORDER BY rank 
1b50: 41 53 43 0a 7d 20 7b 0a 20 20 7b 61 20 74 68 72  ASC.} {.  {a thr
1b60: 65 65 7d 20 30 20 7b 61 20 6f 6e 65 7d 20 31 20  ee} 0 {a one} 1 
1b70: 7b 61 20 66 6f 75 72 7d 20 31 20 7b 61 20 74 77  {a four} 1 {a tw
1b80: 6f 7d 20 32 20 7b 61 20 66 69 76 65 7d 20 32 20  o} 2 {a five} 2 
1b90: 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  .}..do_execsql_t
1ba0: 65 73 74 20 34 2e 33 2e 34 20 7b 0a 20 20 53 45  est 4.3.4 {.  SE
1bb0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 28 27  LECT * FROM t3('
1bc0: 61 27 2c 20 27 72 6f 77 69 64 6d 6f 64 28 34 29  a', 'rowidmod(4)
1bd0: 27 29 20 4f 52 44 45 52 20 42 59 20 72 61 6e 6b  ') ORDER BY rank
1be0: 20 41 53 43 3b 0a 7d 20 7b 0a 20 20 7b 61 20 66   ASC;.} {.  {a f
1bf0: 6f 75 72 7d 20 7b 61 20 6f 6e 65 7d 20 7b 61 20  our} {a one} {a 
1c00: 66 69 76 65 7d 20 7b 61 20 74 77 6f 7d 20 7b 61  five} {a two} {a
1c10: 20 74 68 72 65 65 7d 0a 7d 0a 0a 64 6f 5f 65 78   three}.}..do_ex
1c20: 65 63 73 71 6c 5f 74 65 73 74 20 34 2e 33 2e 35  ecsql_test 4.3.5
1c30: 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 2c 20 72   {.  SELECT *, r
1c40: 61 6e 6b 20 46 52 4f 4d 20 74 33 28 27 61 27 2c  ank FROM t3('a',
1c50: 20 27 72 6f 77 69 64 6d 6f 64 28 33 29 27 29 20   'rowidmod(3)') 
1c60: 4f 52 44 45 52 20 42 59 20 72 61 6e 6b 20 41 53  ORDER BY rank AS
1c70: 43 0a 7d 20 7b 0a 20 20 7b 61 20 74 68 72 65 65  C.} {.  {a three
1c80: 7d 20 30 20 7b 61 20 6f 6e 65 7d 20 31 20 7b 61  } 0 {a one} 1 {a
1c90: 20 66 6f 75 72 7d 20 31 20 7b 61 20 74 77 6f 7d   four} 1 {a two}
1ca0: 20 32 20 7b 61 20 66 69 76 65 7d 20 32 20 0a 7d   2 {a five} 2 .}
1cb0: 0a 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65  ..do_catchsql_te
1cc0: 73 74 20 34 2e 34 2e 33 20 7b 0a 20 20 53 45 4c  st 4.4.3 {.  SEL
1cd0: 45 43 54 20 2a 2c 20 72 61 6e 6b 20 46 52 4f 4d  ECT *, rank FROM
1ce0: 20 74 33 20 57 48 45 52 45 20 74 33 20 4d 41 54   t3 WHERE t3 MAT
1cf0: 43 48 20 27 61 27 20 41 4e 44 20 72 61 6e 6b 20  CH 'a' AND rank 
1d00: 4d 41 54 43 48 20 27 78 79 7a 28 33 29 27 20 0a  MATCH 'xyz(3)' .
1d10: 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 66 75  } {1 {no such fu
1d20: 6e 63 74 69 6f 6e 3a 20 78 79 7a 7d 7d 0a 64 6f  nction: xyz}}.do
1d30: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 34  _catchsql_test 4
1d40: 2e 34 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54 20  .4.4 {.  SELECT 
1d50: 2a 2c 20 72 61 6e 6b 20 46 52 4f 4d 20 74 33 20  *, rank FROM t3 
1d60: 57 48 45 52 45 20 74 33 20 4d 41 54 43 48 20 27  WHERE t3 MATCH '
1d70: 61 27 20 41 4e 44 20 72 61 6e 6b 20 4d 41 54 43  a' AND rank MATC
1d80: 48 20 4e 55 4c 4c 0a 7d 20 7b 31 20 7b 70 61 72  H NULL.} {1 {par
1d90: 73 65 20 65 72 72 6f 72 20 69 6e 20 72 61 6e 6b  se error in rank
1da0: 20 66 75 6e 63 74 69 6f 6e 3a 20 7d 7d 0a 0a 7d   function: }}..}
1db0: 20 3b 23 20 66 6f 72 65 61 63 68 5f 64 65 74 61   ;# foreach_deta
1dc0: 69 6c 5f 6d 6f 64 65 0a 0a 0a 66 69 6e 69 73 68  il_mode...finish
1dd0: 5f 74 65 73 74 0a 0a                             _test..