/ Hex Artifact Content
Login

Artifact 00c4c1c6a1366b73aa48ce2068c634520867c3cf7f5d1676ebbb775ee1f35734:


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 7d 7d 0a 7d 0a 0a 23  gic error}}.}..#
07a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07b0: 2d 2d 2d 2d 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 0a 23 20 41 73 73 6f  ---------.# Asso
07f0: 72 74 65 64 20 74 65 73 74 73 20 6f 66 20 74 68  rted tests of th
0800: 65 20 74 63 6c 20 69 6e 74 65 72 66 61 63 65 20  e tcl interface 
0810: 66 6f 72 20 63 72 65 61 74 69 6e 67 20 65 78 74  for creating ext
0820: 65 6e 73 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 73  ension functions
0830: 2e 0a 23 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  ..#..do_execsql_
0840: 74 65 73 74 20 33 2e 31 20 7b 0a 20 20 43 52 45  test 3.1 {.  CRE
0850: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
0860: 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 28  E t1 USING fts5(
0870: 78 2c 20 64 65 74 61 69 6c 3d 25 44 45 54 41 49  x, detail=%DETAI
0880: 4c 25 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  L%);.  INSERT IN
0890: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 71 20  TO t1 VALUES('q 
08a0: 77 20 65 20 72 20 74 20 79 27 29 3b 0a 20 20 49  w e r t y');.  I
08b0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
08c0: 4c 55 45 53 28 27 79 20 74 20 72 20 65 20 77 20  LUES('y t r e w 
08d0: 71 27 29 3b 0a 7d 0a 0a 70 72 6f 63 20 61 72 67  q');.}..proc arg
08e0: 74 65 73 74 20 7b 63 6d 64 20 61 72 67 73 7d 20  test {cmd args} 
08f0: 7b 20 72 65 74 75 72 6e 20 24 61 72 67 73 20 7d  { return $args }
0900: 0a 73 71 6c 69 74 65 33 5f 66 74 73 35 5f 63 72  .sqlite3_fts5_cr
0910: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 64 62  eate_function db
0920: 20 61 72 67 74 65 73 74 20 61 72 67 74 65 73 74   argtest argtest
0930: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
0940: 74 20 33 2e 32 2e 31 20 7b 0a 20 20 53 45 4c 45  t 3.2.1 {.  SELE
0950: 43 54 20 61 72 67 74 65 73 74 28 74 31 2c 20 31  CT argtest(t1, 1
0960: 32 33 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52  23) FROM t1 WHER
0970: 45 20 74 31 20 4d 41 54 43 48 20 27 71 27 0a 7d  E t1 MATCH 'q'.}
0980: 20 7b 31 32 33 20 31 32 33 7d 0a 0a 64 6f 5f 65   {123 123}..do_e
0990: 78 65 63 73 71 6c 5f 74 65 73 74 20 33 2e 32 2e  xecsql_test 3.2.
09a0: 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 61 72 67  2 {.  SELECT arg
09b0: 74 65 73 74 28 74 31 2c 20 31 32 33 2c 20 34 35  test(t1, 123, 45
09c0: 36 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  6) FROM t1 WHERE
09d0: 20 74 31 20 4d 41 54 43 48 20 27 71 27 0a 7d 20   t1 MATCH 'q'.} 
09e0: 7b 7b 31 32 33 20 34 35 36 7d 20 7b 31 32 33 20  {{123 456} {123 
09f0: 34 35 36 7d 7d 0a 0a 70 72 6f 63 20 72 6f 77 69  456}}..proc rowi
0a00: 64 74 65 73 74 20 7b 63 6d 64 7d 20 7b 20 24 63  dtest {cmd} { $c
0a10: 6d 64 20 78 52 6f 77 69 64 20 7d 0a 73 71 6c 69  md xRowid }.sqli
0a20: 74 65 33 5f 66 74 73 35 5f 63 72 65 61 74 65 5f  te3_fts5_create_
0a30: 66 75 6e 63 74 69 6f 6e 20 64 62 20 72 6f 77 69  function db rowi
0a40: 64 74 65 73 74 20 72 6f 77 69 64 74 65 73 74 0a  dtest rowidtest.
0a50: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
0a60: 20 33 2e 33 2e 31 20 7b 0a 20 20 53 45 4c 45 43   3.3.1 {.  SELEC
0a70: 54 20 72 6f 77 69 64 74 65 73 74 28 74 31 29 20  T rowidtest(t1) 
0a80: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 74 31  FROM t1 WHERE t1
0a90: 20 4d 41 54 43 48 20 27 71 27 0a 7d 20 7b 31 20   MATCH 'q'.} {1 
0aa0: 32 7d 0a 0a 70 72 6f 63 20 69 6e 73 74 74 65 73  2}..proc insttes
0ab0: 74 20 7b 63 6d 64 7d 20 7b 0a 20 20 73 65 74 20  t {cmd} {.  set 
0ac0: 72 65 73 20 5b 6c 69 73 74 5d 0a 20 20 66 6f 72  res [list].  for
0ad0: 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c   {set i 0} {$i <
0ae0: 20 5b 24 63 6d 64 20 78 49 6e 73 74 43 6f 75 6e   [$cmd xInstCoun
0af0: 74 5d 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20  t]} {incr i} {. 
0b00: 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 20 5b     lappend res [
0b10: 24 63 6d 64 20 78 49 6e 73 74 20 24 69 5d 0a 20  $cmd xInst $i]. 
0b20: 20 7d 0a 20 20 73 65 74 20 72 65 73 0a 7d 0a 73   }.  set res.}.s
0b30: 71 6c 69 74 65 33 5f 66 74 73 35 5f 63 72 65 61  qlite3_fts5_crea
0b40: 74 65 5f 66 75 6e 63 74 69 6f 6e 20 64 62 20 69  te_function db i
0b50: 6e 73 74 74 65 73 74 20 69 6e 73 74 74 65 73 74  nsttest insttest
0b60: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
0b70: 74 20 33 2e 34 2e 31 20 7b 0a 20 20 53 45 4c 45  t 3.4.1 {.  SELE
0b80: 43 54 20 69 6e 73 74 74 65 73 74 28 74 31 29 20  CT insttest(t1) 
0b90: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 74 31  FROM t1 WHERE t1
0ba0: 20 4d 41 54 43 48 20 27 71 27 0a 7d 20 7b 0a 20   MATCH 'q'.} {. 
0bb0: 20 7b 7b 30 20 30 20 30 7d 7d 0a 20 20 7b 7b 30   {{0 0 0}}.  {{0
0bc0: 20 30 20 35 7d 7d 20 0a 7d 0a 0a 69 66 20 7b 5b   0 5}} .}..if {[
0bd0: 64 65 74 61 69 6c 5f 69 73 5f 66 75 6c 6c 5d 7d  detail_is_full]}
0be0: 20 7b 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f   {.  do_execsql_
0bf0: 74 65 73 74 20 33 2e 34 2e 32 20 7b 0a 20 20 20  test 3.4.2 {.   
0c00: 20 53 45 4c 45 43 54 20 69 6e 73 74 74 65 73 74   SELECT insttest
0c10: 28 74 31 29 20 46 52 4f 4d 20 74 31 20 57 48 45  (t1) FROM t1 WHE
0c20: 52 45 20 74 31 20 4d 41 54 43 48 20 27 72 2b 65  RE t1 MATCH 'r+e
0c30: 20 4f 52 20 77 27 0a 20 20 7d 20 7b 0a 20 20 20   OR w'.  } {.   
0c40: 20 7b 7b 31 20 30 20 31 7d 7d 0a 20 20 20 20 7b   {{1 0 1}}.    {
0c50: 7b 30 20 30 20 32 7d 20 7b 31 20 30 20 34 7d 7d  {0 0 2} {1 0 4}}
0c60: 20 0a 20 20 7d 0a 7d 0a 0a 70 72 6f 63 20 63 6f   .  }.}..proc co
0c70: 6c 74 65 73 74 20 7b 63 6d 64 7d 20 7b 0a 20 20  ltest {cmd} {.  
0c80: 6c 69 73 74 20 5b 24 63 6d 64 20 78 43 6f 6c 75  list [$cmd xColu
0c90: 6d 6e 53 69 7a 65 20 30 5d 20 5b 24 63 6d 64 20  mnSize 0] [$cmd 
0ca0: 78 43 6f 6c 75 6d 6e 54 65 78 74 20 30 5d 0a 7d  xColumnText 0].}
0cb0: 0a 73 71 6c 69 74 65 33 5f 66 74 73 35 5f 63 72  .sqlite3_fts5_cr
0cc0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 64 62  eate_function db
0cd0: 20 63 6f 6c 74 65 73 74 20 63 6f 6c 74 65 73 74   coltest coltest
0ce0: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
0cf0: 74 20 33 2e 35 2e 31 20 7b 0a 20 20 53 45 4c 45  t 3.5.1 {.  SELE
0d00: 43 54 20 63 6f 6c 74 65 73 74 28 74 31 29 20 46  CT coltest(t1) F
0d10: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 74 31 20  ROM t1 WHERE t1 
0d20: 4d 41 54 43 48 20 27 71 27 0a 7d 20 7b 0a 20 20  MATCH 'q'.} {.  
0d30: 7b 36 20 7b 71 20 77 20 65 20 72 20 74 20 79 7d  {6 {q w e r t y}
0d40: 7d 0a 20 20 7b 36 20 7b 79 20 74 20 72 20 65 20  }.  {6 {y t r e 
0d50: 77 20 71 7d 7d 20 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  w q}} .}..#-----
0d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20 54 65 73 74 73 20 66 6f 72  ----.# Tests for
0db0: 20 72 65 6d 61 70 70 69 6e 67 20 74 68 65 20 22   remapping the "
0dc0: 72 61 6e 6b 22 20 63 6f 6c 75 6d 6e 2e 0a 23 0a  rank" column..#.
0dd0: 23 20 20 20 34 2e 31 2e 2a 3a 20 4d 61 70 70 65  #   4.1.*: Mappe
0de0: 64 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  d to a function 
0df0: 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74  with no argument
0e00: 73 2e 0a 23 20 20 20 34 2e 32 2e 2a 3a 20 4d 61  s..#   4.2.*: Ma
0e10: 70 70 65 64 20 74 6f 20 61 20 66 75 6e 63 74 69  pped to a functi
0e20: 6f 6e 20 77 69 74 68 20 6f 6e 65 20 6f 72 20 6d  on with one or m
0e30: 6f 72 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a 23  ore arguments..#
0e40: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
0e50: 74 20 34 2e 30 20 7b 0a 20 20 43 52 45 41 54 45  t 4.0 {.  CREATE
0e60: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74   VIRTUAL TABLE t
0e70: 32 20 55 53 49 4e 47 20 66 74 73 35 28 61 2c 20  2 USING fts5(a, 
0e80: 62 2c 20 64 65 74 61 69 6c 3d 25 44 45 54 41 49  b, detail=%DETAI
0e90: 4c 25 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  L%);.  INSERT IN
0ea0: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 61 20  TO t2 VALUES('a 
0eb0: 73 20 68 20 67 20 73 20 62 20 6a 20 6d 20 72 20  s h g s b j m r 
0ec0: 68 27 2c 20 27 73 20 62 20 70 20 61 20 64 20 62  h', 's b p a d b
0ed0: 20 62 20 61 20 6f 20 65 27 29 3b 0a 20 20 49 4e   b a o e');.  IN
0ee0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
0ef0: 55 45 53 28 27 72 20 68 20 6e 20 74 20 61 20 67  UES('r h n t a g
0f00: 20 72 20 64 20 64 20 69 27 2c 20 27 6c 20 64 20   r d d i', 'l d 
0f10: 6e 20 6a 20 72 20 63 20 66 20 74 20 6f 20 71 27  n j r c f t o q'
0f20: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
0f30: 20 74 32 20 56 41 4c 55 45 53 28 27 71 20 6b 20   t2 VALUES('q k 
0f40: 6e 20 69 20 6b 20 63 20 61 20 61 20 65 20 6d 27  n i k c a a e m'
0f50: 2c 20 27 63 20 68 20 6e 20 6a 20 70 20 67 20 73  , 'c h n j p g s
0f60: 20 63 20 69 20 74 27 29 3b 0a 20 20 49 4e 53 45   c i t');.  INSE
0f70: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
0f80: 53 28 27 68 20 6a 20 67 20 74 20 72 20 65 20 6c  S('h j g t r e l
0f90: 20 73 20 67 20 73 27 2c 20 27 6b 20 71 20 6b 20   s g s', 'k q k 
0fa0: 63 20 69 20 69 20 63 20 6b 20 6e 20 73 27 29 3b  c i i c k n s');
0fb0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
0fc0: 32 20 56 41 4c 55 45 53 28 27 62 20 6c 20 6b 20  2 VALUES('b l k 
0fd0: 68 20 64 20 6e 20 6e 20 6e 20 6d 20 69 27 2c 20  h d n n n m i', 
0fe0: 27 70 20 74 20 69 20 61 20 72 20 62 20 74 20 71  'p t i a r b t q
0ff0: 20 6f 20 6c 27 29 3b 0a 20 20 49 4e 53 45 52 54   o l');.  INSERT
1000: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
1010: 27 6b 20 72 20 69 20 6c 20 6a 20 62 20 67 20 69  'k r i l j b g i
1020: 20 70 20 61 27 2c 20 27 74 20 71 20 63 20 68 20   p a', 't q c h 
1030: 61 20 69 20 6d 20 67 20 6e 20 6c 27 29 3b 0a 20  a i m g n l');. 
1040: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
1050: 56 41 4c 55 45 53 28 27 61 20 65 20 63 20 71 20  VALUES('a e c q 
1060: 6e 20 6d 20 6f 20 6d 20 64 20 67 27 2c 20 27 6c  n m o m d g', 'l
1070: 20 63 20 74 20 67 20 69 20 73 20 71 20 67 20 71   c t g i s q g q
1080: 20 65 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49   e');.  INSERT I
1090: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 62  NTO t2 VALUES('b
10a0: 20 6f 20 6a 20 68 20 66 20 6f 20 67 20 62 20 70   o j h f o g b p
10b0: 20 65 27 2c 20 27 72 20 74 20 6c 20 68 20 73 20   e', 'r t l h s 
10c0: 62 20 67 20 69 20 63 20 70 27 29 3b 0a 20 20 49  b g i c p');.  I
10d0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
10e0: 4c 55 45 53 28 27 73 20 71 20 6b 20 66 20 71 20  LUES('s q k f q 
10f0: 62 20 6a 20 67 20 68 20 66 27 2c 20 27 6e 20 6d  b j g h f', 'n m
1100: 20 61 20 6f 20 70 20 65 20 69 20 65 20 6b 20 74   a o p e i e k t
1110: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
1120: 4f 20 74 32 20 56 41 4c 55 45 53 28 27 6f 20 71  O t2 VALUES('o q
1130: 20 67 20 67 20 71 20 63 20 6f 20 6b 20 61 20 62   g g q c o k a b
1140: 27 2c 20 27 72 20 74 20 6b 20 70 20 74 20 66 20  ', 'r t k p t f 
1150: 74 20 68 20 70 20 63 27 29 3b 0a 7d 0a 0a 70 72  t h p c');.}..pr
1160: 6f 63 20 66 69 72 73 74 69 6e 73 74 20 7b 63 6d  oc firstinst {cm
1170: 64 7d 20 7b 20 0a 20 20 66 6f 72 65 61 63 68 20  d} { .  foreach 
1180: 7b 70 20 63 20 6f 7d 20 5b 24 63 6d 64 20 78 49  {p c o} [$cmd xI
1190: 6e 73 74 20 30 5d 20 7b 7d 0a 20 20 65 78 70 72  nst 0] {}.  expr
11a0: 20 24 63 2a 31 30 30 20 2b 20 24 6f 0a 7d 0a 73   $c*100 + $o.}.s
11b0: 71 6c 69 74 65 33 5f 66 74 73 35 5f 63 72 65 61  qlite3_fts5_crea
11c0: 74 65 5f 66 75 6e 63 74 69 6f 6e 20 64 62 20 66  te_function db f
11d0: 69 72 73 74 69 6e 73 74 20 66 69 72 73 74 69 6e  irstinst firstin
11e0: 73 74 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  st..do_execsql_t
11f0: 65 73 74 20 34 2e 31 2e 31 20 7b 0a 20 20 53 45  est 4.1.1 {.  SE
1200: 4c 45 43 54 20 72 6f 77 69 64 2c 20 66 69 72 73  LECT rowid, firs
1210: 74 69 6e 73 74 28 74 32 29 20 46 52 4f 4d 20 74  tinst(t2) FROM t
1220: 32 20 57 48 45 52 45 20 74 32 20 4d 41 54 43 48  2 WHERE t2 MATCH
1230: 20 27 61 27 20 4f 52 44 45 52 20 42 59 20 72 6f   'a' ORDER BY ro
1240: 77 69 64 20 41 53 43 0a 7d 20 7b 0a 20 20 31 20  wid ASC.} {.  1 
1250: 30 20 32 20 34 20 33 20 36 20 20 20 35 20 20 31  0 2 4 3 6   5  1
1260: 30 33 0a 20 20 36 20 39 20 37 20 30 20 39 20 31  03.  6 9 7 0 9 1
1270: 30 32 20 31 30 20 38 0a 7d 0a 0a 64 6f 5f 65 78  02 10 8.}..do_ex
1280: 65 63 73 71 6c 5f 74 65 73 74 20 34 2e 31 2e 32  ecsql_test 4.1.2
1290: 20 7b 0a 20 20 53 45 4c 45 43 54 20 72 6f 77 69   {.  SELECT rowi
12a0: 64 2c 20 72 61 6e 6b 20 46 52 4f 4d 20 74 32 20  d, rank FROM t2 
12b0: 0a 20 20 57 48 45 52 45 20 74 32 20 4d 41 54 43  .  WHERE t2 MATC
12c0: 48 20 27 61 27 20 41 4e 44 20 72 61 6e 6b 20 4d  H 'a' AND rank M
12d0: 41 54 43 48 20 27 66 69 72 73 74 69 6e 73 74 28  ATCH 'firstinst(
12e0: 29 27 20 0a 20 20 4f 52 44 45 52 20 42 59 20 72  )' .  ORDER BY r
12f0: 6f 77 69 64 20 41 53 43 0a 7d 20 7b 0a 20 20 31  owid ASC.} {.  1
1300: 20 30 20 32 20 34 20 33 20 36 20 20 20 35 20 20   0 2 4 3 6   5  
1310: 31 30 33 0a 20 20 36 20 39 20 37 20 30 20 39 20  103.  6 9 7 0 9 
1320: 31 30 32 20 31 30 20 38 0a 7d 0a 0a 64 6f 5f 65  102 10 8.}..do_e
1330: 78 65 63 73 71 6c 5f 74 65 73 74 20 34 2e 31 2e  xecsql_test 4.1.
1340: 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 72 6f 77  3 {.  SELECT row
1350: 69 64 2c 20 72 61 6e 6b 20 46 52 4f 4d 20 74 32  id, rank FROM t2
1360: 20 0a 20 20 57 48 45 52 45 20 74 32 20 4d 41 54   .  WHERE t2 MAT
1370: 43 48 20 27 61 27 20 41 4e 44 20 72 61 6e 6b 20  CH 'a' AND rank 
1380: 4d 41 54 43 48 20 27 66 69 72 73 74 69 6e 73 74  MATCH 'firstinst
1390: 28 29 27 0a 20 20 4f 52 44 45 52 20 42 59 20 72  ()'.  ORDER BY r
13a0: 61 6e 6b 20 44 45 53 43 0a 7d 20 7b 0a 20 20 35  ank DESC.} {.  5
13b0: 20 31 30 33 20 20 39 20 31 30 32 20 20 36 20 39   103  9 102  6 9
13c0: 20 20 31 30 20 38 20 20 33 20 36 20 20 32 20 34    10 8  3 6  2 4
13d0: 20 20 31 20 30 20 20 37 20 30 20 20 0a 7d 0a 0a    1 0  7 0  .}..
13e0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
13f0: 34 2e 31 2e 34 20 7b 0a 20 20 49 4e 53 45 52 54  4.1.4 {.  INSERT
1400: 20 49 4e 54 4f 20 74 32 28 74 32 2c 20 72 61 6e   INTO t2(t2, ran
1410: 6b 29 20 56 41 4c 55 45 53 28 27 72 61 6e 6b 27  k) VALUES('rank'
1420: 2c 20 27 66 69 72 73 74 69 6e 73 74 28 29 27 29  , 'firstinst()')
1430: 3b 0a 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64  ;.  SELECT rowid
1440: 2c 20 72 61 6e 6b 20 46 52 4f 4d 20 74 32 20 57  , rank FROM t2 W
1450: 48 45 52 45 20 74 32 20 4d 41 54 43 48 20 27 61  HERE t2 MATCH 'a
1460: 27 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64  ' ORDER BY rowid
1470: 20 41 53 43 0a 7d 20 7b 0a 20 20 31 20 30 20 32   ASC.} {.  1 0 2
1480: 20 34 20 33 20 36 20 20 20 35 20 20 31 30 33 0a   4 3 6   5  103.
1490: 20 20 36 20 39 20 37 20 30 20 39 20 31 30 32 20    6 9 7 0 9 102 
14a0: 31 30 20 38 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73  10 8.}..do_execs
14b0: 71 6c 5f 74 65 73 74 20 34 2e 31 2e 35 20 7b 0a  ql_test 4.1.5 {.
14c0: 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20    SELECT rowid, 
14d0: 72 61 6e 6b 20 46 52 4f 4d 20 74 32 20 57 48 45  rank FROM t2 WHE
14e0: 52 45 20 74 32 20 4d 41 54 43 48 20 27 61 27 20  RE t2 MATCH 'a' 
14f0: 4f 52 44 45 52 20 42 59 20 72 61 6e 6b 20 44 45  ORDER BY rank DE
1500: 53 43 0a 7d 20 7b 0a 20 20 35 20 31 30 33 20 20  SC.} {.  5 103  
1510: 39 20 31 30 32 20 20 36 20 39 20 20 31 30 20 38  9 102  6 9  10 8
1520: 20 20 33 20 36 20 20 32 20 34 20 20 31 20 30 20    3 6  2 4  1 0 
1530: 20 37 20 30 20 20 0a 7d 0a 0a 64 6f 5f 65 78 65   7 0  .}..do_exe
1540: 63 73 71 6c 5f 74 65 73 74 20 34 2e 31 2e 36 20  csql_test 4.1.6 
1550: 7b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  {.  INSERT INTO 
1560: 74 32 28 74 32 2c 20 72 61 6e 6b 29 20 56 41 4c  t2(t2, rank) VAL
1570: 55 45 53 28 27 72 61 6e 6b 27 2c 20 27 66 69 72  UES('rank', 'fir
1580: 73 74 69 6e 73 74 20 28 20 20 20 20 29 20 27 29  stinst (    ) ')
1590: 3b 0a 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64  ;.  SELECT rowid
15a0: 2c 20 72 61 6e 6b 20 46 52 4f 4d 20 74 32 20 57  , rank FROM t2 W
15b0: 48 45 52 45 20 74 32 20 4d 41 54 43 48 20 27 61  HERE t2 MATCH 'a
15c0: 27 20 4f 52 44 45 52 20 42 59 20 72 61 6e 6b 20  ' ORDER BY rank 
15d0: 44 45 53 43 0a 7d 20 7b 0a 20 20 35 20 31 30 33  DESC.} {.  5 103
15e0: 20 20 39 20 31 30 32 20 20 36 20 39 20 20 31 30    9 102  6 9  10
15f0: 20 38 20 20 33 20 36 20 20 32 20 34 20 20 20 31   8  3 6  2 4   1
1600: 20 30 20 20 37 20 30 20 20 0a 7d 0a 0a 70 72 6f   0  7 0  .}..pro
1610: 63 20 72 6f 77 69 64 70 6c 75 73 20 7b 63 6d 64  c rowidplus {cmd
1620: 20 69 76 61 6c 7d 20 7b 20 0a 20 20 65 78 70 72   ival} { .  expr
1630: 20 5b 24 63 6d 64 20 78 52 6f 77 69 64 5d 20 2b   [$cmd xRowid] +
1640: 20 24 69 76 61 6c 0a 7d 0a 73 71 6c 69 74 65 33   $ival.}.sqlite3
1650: 5f 66 74 73 35 5f 63 72 65 61 74 65 5f 66 75 6e  _fts5_create_fun
1660: 63 74 69 6f 6e 20 64 62 20 72 6f 77 69 64 70 6c  ction db rowidpl
1670: 75 73 20 72 6f 77 69 64 70 6c 75 73 0a 0a 69 66  us rowidplus..if
1680: 20 7b 5b 64 65 74 61 69 6c 5f 69 73 5f 66 75 6c   {[detail_is_ful
1690: 6c 5d 7d 20 7b 0a 20 20 64 6f 5f 65 78 65 63 73  l]} {.  do_execs
16a0: 71 6c 5f 74 65 73 74 20 34 2e 32 2e 31 20 7b 0a  ql_test 4.2.1 {.
16b0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
16c0: 74 32 28 74 32 2c 20 72 61 6e 6b 29 20 56 41 4c  t2(t2, rank) VAL
16d0: 55 45 53 28 27 72 61 6e 6b 27 2c 20 27 72 6f 77  UES('rank', 'row
16e0: 69 64 70 6c 75 73 28 31 30 30 29 20 27 29 3b 0a  idplus(100) ');.
16f0: 20 20 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64      SELECT rowid
1700: 2c 20 72 61 6e 6b 20 46 52 4f 4d 20 74 32 20 57  , rank FROM t2 W
1710: 48 45 52 45 20 74 32 20 4d 41 54 43 48 20 27 6f  HERE t2 MATCH 'o
1720: 20 2b 20 71 20 2b 20 67 27 0a 20 20 7d 20 7b 0a   + q + g'.  } {.
1730: 20 20 20 20 31 30 20 31 31 30 0a 20 20 7d 0a 20      10 110.  }. 
1740: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
1750: 20 34 2e 32 2e 32 20 7b 0a 20 20 20 20 49 4e 53   4.2.2 {.    INS
1760: 45 52 54 20 49 4e 54 4f 20 74 32 28 74 32 2c 20  ERT INTO t2(t2, 
1770: 72 61 6e 6b 29 20 56 41 4c 55 45 53 28 27 72 61  rank) VALUES('ra
1780: 6e 6b 27 2c 20 27 72 6f 77 69 64 70 6c 75 73 28  nk', 'rowidplus(
1790: 31 31 31 29 20 27 29 3b 0a 20 20 20 20 53 45 4c  111) ');.    SEL
17a0: 45 43 54 20 72 6f 77 69 64 2c 20 72 61 6e 6b 20  ECT rowid, rank 
17b0: 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32  FROM t2 WHERE t2
17c0: 20 4d 41 54 43 48 20 27 6f 20 2b 20 71 20 2b 20   MATCH 'o + q + 
17d0: 67 27 0a 20 20 7d 20 7b 0a 20 20 20 20 31 30 20  g'.  } {.    10 
17e0: 31 32 31 0a 20 20 7d 0a 0a 20 20 64 6f 5f 65 78  121.  }..  do_ex
17f0: 65 63 73 71 6c 5f 74 65 73 74 20 34 2e 32 2e 33  ecsql_test 4.2.3
1800: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 72 6f   {.    SELECT ro
1810: 77 69 64 2c 20 72 61 6e 6b 20 46 52 4f 4d 20 74  wid, rank FROM t
1820: 32 20 0a 20 20 20 20 20 20 57 48 45 52 45 20 74  2 .      WHERE t
1830: 32 20 4d 41 54 43 48 20 27 6f 20 2b 20 71 20 2b  2 MATCH 'o + q +
1840: 20 67 27 20 41 4e 44 20 72 61 6e 6b 20 4d 41 54   g' AND rank MAT
1850: 43 48 20 27 72 6f 77 69 64 70 6c 75 73 28 31 31  CH 'rowidplus(11
1860: 32 29 27 0a 20 20 7d 20 7b 0a 20 20 20 20 31 30  2)'.  } {.    10
1870: 20 31 32 32 0a 20 20 7d 0a 7d 0a 0a 70 72 6f 63   122.  }.}..proc
1880: 20 72 6f 77 69 64 6d 6f 64 20 7b 63 6d 64 20 69   rowidmod {cmd i
1890: 6d 6f 64 7d 20 7b 20 0a 20 20 65 78 70 72 20 5b  mod} { .  expr [
18a0: 24 63 6d 64 20 78 52 6f 77 69 64 5d 20 25 20 24  $cmd xRowid] % $
18b0: 69 6d 6f 64 0a 7d 0a 73 71 6c 69 74 65 33 5f 66  imod.}.sqlite3_f
18c0: 74 73 35 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  ts5_create_funct
18d0: 69 6f 6e 20 64 62 20 72 6f 77 69 64 6d 6f 64 20  ion db rowidmod 
18e0: 72 6f 77 69 64 6d 6f 64 0a 64 6f 5f 65 78 65 63  rowidmod.do_exec
18f0: 73 71 6c 5f 74 65 73 74 20 34 2e 33 2e 31 20 7b  sql_test 4.3.1 {
1900: 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41  .  CREATE VIRTUA
1910: 4c 20 54 41 42 4c 45 20 74 33 20 55 53 49 4e 47  L TABLE t3 USING
1920: 20 66 74 73 35 28 78 2c 20 64 65 74 61 69 6c 3d   fts5(x, detail=
1930: 25 44 45 54 41 49 4c 25 29 3b 0a 20 20 49 4e 53  %DETAIL%);.  INS
1940: 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55  ERT INTO t3 VALU
1950: 45 53 28 27 61 20 6f 6e 65 27 29 3b 0a 20 20 49  ES('a one');.  I
1960: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41  NSERT INTO t3 VA
1970: 4c 55 45 53 28 27 61 20 74 77 6f 27 29 3b 0a 20  LUES('a two');. 
1980: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
1990: 56 41 4c 55 45 53 28 27 61 20 74 68 72 65 65 27  VALUES('a three'
19a0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
19b0: 20 74 33 20 56 41 4c 55 45 53 28 27 61 20 66 6f   t3 VALUES('a fo
19c0: 75 72 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  ur');.  INSERT I
19d0: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 27 61  NTO t3 VALUES('a
19e0: 20 66 69 76 65 27 29 3b 0a 20 20 49 4e 53 45 52   five');.  INSER
19f0: 54 20 49 4e 54 4f 20 74 33 28 74 33 2c 20 72 61  T INTO t3(t3, ra
1a00: 6e 6b 29 20 56 41 4c 55 45 53 28 27 72 61 6e 6b  nk) VALUES('rank
1a10: 27 2c 20 27 62 6d 32 35 28 29 27 29 3b 0a 7d 0a  ', 'bm25()');.}.
1a20: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
1a30: 20 34 2e 33 2e 32 20 7b 0a 20 20 53 45 4c 45 43   4.3.2 {.  SELEC
1a40: 54 20 2a 20 46 52 4f 4d 20 74 33 0a 20 20 57 48  T * FROM t3.  WH
1a50: 45 52 45 20 74 33 20 4d 41 54 43 48 20 27 61 27  ERE t3 MATCH 'a'
1a60: 20 41 4e 44 20 72 61 6e 6b 20 4d 41 54 43 48 20   AND rank MATCH 
1a70: 27 72 6f 77 69 64 6d 6f 64 28 34 29 27 20 0a 20  'rowidmod(4)' . 
1a80: 20 4f 52 44 45 52 20 42 59 20 72 61 6e 6b 20 41   ORDER BY rank A
1a90: 53 43 0a 7d 20 7b 0a 20 20 7b 61 20 66 6f 75 72  SC.} {.  {a four
1aa0: 7d 20 7b 61 20 6f 6e 65 7d 20 7b 61 20 66 69 76  } {a one} {a fiv
1ab0: 65 7d 20 7b 61 20 74 77 6f 7d 20 7b 61 20 74 68  e} {a two} {a th
1ac0: 72 65 65 7d 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73  ree}.}..do_execs
1ad0: 71 6c 5f 74 65 73 74 20 34 2e 33 2e 33 20 7b 0a  ql_test 4.3.3 {.
1ae0: 20 20 53 45 4c 45 43 54 20 2a 2c 20 72 61 6e 6b    SELECT *, rank
1af0: 20 46 52 4f 4d 20 74 33 0a 20 20 57 48 45 52 45   FROM t3.  WHERE
1b00: 20 74 33 20 4d 41 54 43 48 20 27 61 27 20 41 4e   t3 MATCH 'a' AN
1b10: 44 20 72 61 6e 6b 20 4d 41 54 43 48 20 27 72 6f  D rank MATCH 'ro
1b20: 77 69 64 6d 6f 64 28 33 29 27 20 0a 20 20 4f 52  widmod(3)' .  OR
1b30: 44 45 52 20 42 59 20 72 61 6e 6b 20 41 53 43 0a  DER BY rank ASC.
1b40: 7d 20 7b 0a 20 20 7b 61 20 74 68 72 65 65 7d 20  } {.  {a three} 
1b50: 30 20 7b 61 20 6f 6e 65 7d 20 31 20 7b 61 20 66  0 {a one} 1 {a f
1b60: 6f 75 72 7d 20 31 20 7b 61 20 74 77 6f 7d 20 32  our} 1 {a two} 2
1b70: 20 7b 61 20 66 69 76 65 7d 20 32 20 0a 7d 0a 0a   {a five} 2 .}..
1b80: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
1b90: 34 2e 33 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54  4.3.4 {.  SELECT
1ba0: 20 2a 20 46 52 4f 4d 20 74 33 28 27 61 27 2c 20   * FROM t3('a', 
1bb0: 27 72 6f 77 69 64 6d 6f 64 28 34 29 27 29 20 4f  'rowidmod(4)') O
1bc0: 52 44 45 52 20 42 59 20 72 61 6e 6b 20 41 53 43  RDER BY rank ASC
1bd0: 3b 0a 7d 20 7b 0a 20 20 7b 61 20 66 6f 75 72 7d  ;.} {.  {a four}
1be0: 20 7b 61 20 6f 6e 65 7d 20 7b 61 20 66 69 76 65   {a one} {a five
1bf0: 7d 20 7b 61 20 74 77 6f 7d 20 7b 61 20 74 68 72  } {a two} {a thr
1c00: 65 65 7d 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71  ee}.}..do_execsq
1c10: 6c 5f 74 65 73 74 20 34 2e 33 2e 35 20 7b 0a 20  l_test 4.3.5 {. 
1c20: 20 53 45 4c 45 43 54 20 2a 2c 20 72 61 6e 6b 20   SELECT *, rank 
1c30: 46 52 4f 4d 20 74 33 28 27 61 27 2c 20 27 72 6f  FROM t3('a', 'ro
1c40: 77 69 64 6d 6f 64 28 33 29 27 29 20 4f 52 44 45  widmod(3)') ORDE
1c50: 52 20 42 59 20 72 61 6e 6b 20 41 53 43 0a 7d 20  R BY rank ASC.} 
1c60: 7b 0a 20 20 7b 61 20 74 68 72 65 65 7d 20 30 20  {.  {a three} 0 
1c70: 7b 61 20 6f 6e 65 7d 20 31 20 7b 61 20 66 6f 75  {a one} 1 {a fou
1c80: 72 7d 20 31 20 7b 61 20 74 77 6f 7d 20 32 20 7b  r} 1 {a two} 2 {
1c90: 61 20 66 69 76 65 7d 20 32 20 0a 7d 0a 0a 64 6f  a five} 2 .}..do
1ca0: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 34  _catchsql_test 4
1cb0: 2e 34 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20  .4.3 {.  SELECT 
1cc0: 2a 2c 20 72 61 6e 6b 20 46 52 4f 4d 20 74 33 20  *, rank FROM t3 
1cd0: 57 48 45 52 45 20 74 33 20 4d 41 54 43 48 20 27  WHERE t3 MATCH '
1ce0: 61 27 20 41 4e 44 20 72 61 6e 6b 20 4d 41 54 43  a' AND rank MATC
1cf0: 48 20 27 78 79 7a 28 33 29 27 20 0a 7d 20 7b 31  H 'xyz(3)' .} {1
1d00: 20 7b 6e 6f 20 73 75 63 68 20 66 75 6e 63 74 69   {no such functi
1d10: 6f 6e 3a 20 78 79 7a 7d 7d 0a 64 6f 5f 63 61 74  on: xyz}}.do_cat
1d20: 63 68 73 71 6c 5f 74 65 73 74 20 34 2e 34 2e 34  chsql_test 4.4.4
1d30: 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 2c 20 72   {.  SELECT *, r
1d40: 61 6e 6b 20 46 52 4f 4d 20 74 33 20 57 48 45 52  ank FROM t3 WHER
1d50: 45 20 74 33 20 4d 41 54 43 48 20 27 61 27 20 41  E t3 MATCH 'a' A
1d60: 4e 44 20 72 61 6e 6b 20 4d 41 54 43 48 20 4e 55  ND rank MATCH NU
1d70: 4c 4c 0a 7d 20 7b 31 20 7b 70 61 72 73 65 20 65  LL.} {1 {parse e
1d80: 72 72 6f 72 20 69 6e 20 72 61 6e 6b 20 66 75 6e  rror in rank fun
1d90: 63 74 69 6f 6e 3a 20 7d 7d 0a 0a 7d 20 3b 23 20  ction: }}..} ;# 
1da0: 66 6f 72 65 61 63 68 5f 64 65 74 61 69 6c 5f 6d  foreach_detail_m
1db0: 6f 64 65 0a 0a 0a 66 69 6e 69 73 68 5f 74 65 73  ode...finish_tes
1dc0: 74 0a                                            t.