1# 2014 Dec 20
2#
3# The author disclaims copyright to this source code.  In place of
4# a legal notice, here is a blessing:
5#
6#    May you do good and not evil.
7#    May you find forgiveness for yourself and forgive others.
8#    May you share freely, never taking more than you give.
9#
10#***********************************************************************
11#
12# Tests focusing on the fts5 xSetAuxdata() and xGetAuxdata() APIs.
13#
14
15source [file join [file dirname [info script]] fts5_common.tcl]
16set testprefix fts5auxdata
17
18# If SQLITE_ENABLE_FTS5 is defined, omit this file.
19ifcapable !fts5 {
20  finish_test
21  return
22}
23
24do_execsql_test 1.0 {
25  CREATE VIRTUAL TABLE f1 USING fts5(a, b);
26  INSERT INTO f1(rowid, a, b) VALUES(1, 'a', 'b1');
27  INSERT INTO f1(rowid, a, b) VALUES(2, 'a', 'b2');
28  INSERT INTO f1(rowid, a, b) VALUES(3, 'a', 'b3');
29  INSERT INTO f1(rowid, a, b) VALUES(4, 'a', 'b4');
30  INSERT INTO f1(rowid, a, b) VALUES(5, 'a', 'b5');
31}
32
33proc aux_function_1 {cmd tn} {
34  switch [$cmd xRowid] {
35    1 {
36      do_test $tn.1 [list $cmd xGetAuxdata 0 ] {}
37      $cmd xSetAuxdata "one"
38    }
39
40    2 {
41      do_test $tn.2 [list $cmd xGetAuxdata 0 ] {one}
42      $cmd xSetAuxdata "two"
43    }
44
45    3 {
46      do_test $tn.3 [list $cmd xGetAuxdata 0 ] {two}
47    }
48
49    4 {
50      do_test $tn.4 [list $cmd xGetAuxdata 1 ] {two}
51    }
52
53    5 {
54      do_test $tn.5 [list $cmd xGetAuxdata 0 ] {}
55    }
56  }
57}
58
59sqlite3_fts5_create_function db aux_function_1 aux_function_1
60db eval {
61  SELECT aux_function_1(f1, 1) FROM f1 WHERE f1 MATCH 'a'
62  ORDER BY rowid ASC
63}
64
65proc aux_function_2 {cmd tn inst} {
66  if {$inst == "A"} {
67    switch [$cmd xRowid] {
68      1 {
69        do_test $tn.1.$inst [list $cmd xGetAuxdata 0 ] {}
70        $cmd xSetAuxdata "one $inst"
71      }
72      2 {
73        do_test $tn.2.$inst [list $cmd xGetAuxdata 0 ] "one $inst"
74        $cmd xSetAuxdata "two $inst"
75      }
76      3 {
77        do_test $tn.3.$inst [list $cmd xGetAuxdata 0 ] "two $inst"
78      }
79      4 {
80        do_test $tn.4.$inst [list $cmd xGetAuxdata 1 ] "two $inst"
81      }
82      5 {
83        do_test $tn.5.$inst [list $cmd xGetAuxdata 0 ] {}
84      }
85    }
86  } else {
87    switch [$cmd xRowid] {
88      1 {
89        do_test $tn.1.$inst [list $cmd xGetAuxdata 0 ] "one A"
90      }
91      2 {
92        do_test $tn.2.$inst [list $cmd xGetAuxdata 0 ] "two A"
93      }
94      3 {
95        do_test $tn.3.$inst [list $cmd xGetAuxdata 0 ] "two A"
96      }
97      4 {
98        do_test $tn.4.$inst [list $cmd xGetAuxdata 0 ] {}
99      }
100      5 {
101        do_test $tn.5.$inst [list $cmd xGetAuxdata 0 ] {}
102      }
103    }
104  }
105}
106
107sqlite3_fts5_create_function db aux_function_2 aux_function_2
108db eval {
109  SELECT aux_function_2(f1, 2, 'A'), aux_function_2(f1, 2, 'B')
110  FROM f1 WHERE f1 MATCH 'a'
111  ORDER BY rowid ASC
112}
113
114finish_test
115