modernc.org/cc@v1.0.1/v2/testdata/_sqlite/ext/fts5/test/fts5config.test (about)

     1  # 2015 Jan 13
     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  # This file focuses on the code in fts5_config.c, which is largely concerned
    13  # with parsing the various configuration and CREATE TABLE options.
    14  #
    15  
    16  source [file join [file dirname [info script]] fts5_common.tcl]
    17  set testprefix fts5config
    18  
    19  # If SQLITE_ENABLE_FTS5 is defined, omit this file.
    20  ifcapable !fts5 {
    21    finish_test
    22    return
    23  }
    24  
    25  #-------------------------------------------------------------------------
    26  # Try different types of quote characters.
    27  #
    28  do_execsql_test 1.0 {
    29    CREATE VIRTUAL TABLE t1 USING fts5('a', "b", [c], `d`);
    30    PRAGMA table_info = t1;
    31  } {
    32    0 a {} 0 {} 0 
    33    1 b {} 0 {} 0 
    34    2 c {} 0 {} 0 
    35    3 d {} 0 {} 0
    36  }
    37  
    38  #-------------------------------------------------------------------------
    39  # Syntax errors in the prefix= option.
    40  #
    41  foreach {tn opt} {
    42    1 {prefix=x}  
    43    2 {prefix='x'}
    44    3 {prefix='$'}
    45    4 {prefix='1,2,'}
    46    5 {prefix=',1'}
    47    6 {prefix='1,2,3...'}
    48    7 {prefix='1,2,3xyz'}
    49  } {
    50    set res [list 1 {malformed prefix=... directive}]
    51    do_catchsql_test 2.$tn "CREATE VIRTUAL TABLE f1 USING fts5(x, $opt)" $res
    52  }
    53  
    54  #-------------------------------------------------------------------------
    55  # Syntax errors in the 'rank' option.
    56  #
    57  foreach {tn val} {
    58    1 "f1(xyz)"
    59    2 "f1(zyx)"
    60    3 "f1(nzz)"
    61    4 "f1(x'!!')"
    62    5 "f1(x':;')"
    63    6 "f1(x'[]')"
    64    7 "f1(x'{}')"
    65    8 "f1('abc)"
    66  } {
    67    do_catchsql_test 3.$tn {
    68      INSERT INTO t1(t1, rank) VALUES('rank', $val);
    69    } {1 {SQL logic error}}
    70  }
    71  
    72  #-------------------------------------------------------------------------
    73  # The parsing of SQL literals specified as part of 'rank' options.
    74  #
    75  do_execsql_test 4.0 {
    76    CREATE VIRTUAL TABLE zzz USING fts5(one);
    77    INSERT INTO zzz VALUES('a b c');
    78  }
    79  proc first {cmd A} { return $A }
    80  sqlite3_fts5_create_function db first first
    81  
    82  foreach {tn arg} {
    83    1 "123"
    84    2 "'01234567890ABCDEF'"
    85    3 "x'0123'"
    86    4 "x'ABCD'"
    87    5 "x'0123456789ABCDEF'"
    88    6 "x'0123456789abcdef'"
    89    7 "22.5"
    90    8 "-91.5"
    91    9 "-.5"
    92    10 "''''"
    93    11 "+.5"
    94  } {
    95    set func [string map {' ''} "first($arg)"]
    96    do_execsql_test 4.1.$tn "
    97      INSERT INTO zzz(zzz, rank) VALUES('rank', '$func');
    98      SELECT rank IS $arg FROM zzz WHERE zzz MATCH 'a + b + c'
    99    " 1
   100  }
   101  
   102  do_execsql_test 4.2 {
   103    INSERT INTO zzz(zzz, rank) VALUES('rank', 'f1()');
   104  } {}
   105  
   106  #-------------------------------------------------------------------------
   107  # Misquoting in tokenize= and other options. 
   108  #
   109  do_catchsql_test 5.1 {
   110    CREATE VIRTUAL TABLE xx USING fts5(x, tokenize="porter 'ascii");
   111  } {1 {parse error in tokenize directive}} 
   112  
   113  do_catchsql_test 5.2 {
   114    CREATE VIRTUAL TABLE xx USING fts5(x, [y[]);
   115  } {0 {}}
   116  
   117  do_catchsql_test 5.3 {
   118    CREATE VIRTUAL TABLE yy USING fts5(x, [y]]);
   119  } {1 {unrecognized token: "]"}}
   120  
   121  #-------------------------------------------------------------------------
   122  # Errors in prefix= directives.
   123  #
   124  do_catchsql_test 6.2 {
   125    CREATE VIRTUAL TABLE abc USING fts5(a, prefix='1, 2, 1001');
   126  } {1 {prefix length out of range (max 999)}}
   127  do_catchsql_test 6.3 {
   128    CREATE VIRTUAL TAbLE abc USING fts5(a, prefix='1, 2, 0000');
   129  } {1 {prefix length out of range (max 999)}}
   130  do_catchsql_test 6.4 {
   131    CREATE VIRTUAL TABLE abc USING fts5(a, prefix='1  , 1000000');
   132  } {1 {prefix length out of range (max 999)}}
   133  
   134  #-------------------------------------------------------------------------
   135  # Duplicate tokenize= and other options.
   136  #
   137  do_catchsql_test 7.1 {
   138    CREATE VIRTUAL TABLE abc USING fts5(a, tokenize=porter, tokenize=ascii);
   139  } {1 {multiple tokenize=... directives}}
   140  do_catchsql_test 7.2 {
   141    CREATE VIRTUAL TABLE abc USING fts5(a, content=porter, content=ascii);
   142  } {1 {multiple content=... directives}}
   143  do_catchsql_test 7.3 {
   144    CREATE VIRTUAL TABLE abc USING fts5(a, content_rowid=porter, content_rowid=a);
   145  } {1 {multiple content_rowid=... directives}}
   146  
   147  #-------------------------------------------------------------------------
   148  # Unrecognized option.
   149  #
   150  do_catchsql_test 8.0 {
   151    CREATE VIRTUAL TABLE abc USING fts5(a, nosuchoption=123);
   152  } {1 {unrecognized option: "nosuchoption"}}
   153  do_catchsql_test 8.1 {
   154    CREATE VIRTUAL TABLE abc USING fts5(a, "nosuchoption"=123);
   155  } {1 {parse error in ""nosuchoption"=123"}}
   156  
   157  #-------------------------------------------------------------------------
   158  # Errors in:
   159  #
   160  #   9.1.* 'pgsz' options.
   161  #   9.2.* 'automerge' options.
   162  #   9.3.* 'crisismerge' options.
   163  #   9.4.* a non-existant option.
   164  #   9.5.* 'hashsize' options.
   165  #
   166  do_execsql_test 9.0 {
   167    CREATE VIRTUAL TABLE abc USING fts5(a, b);
   168  } {}
   169  do_catchsql_test 9.1.1 {
   170    INSERT INTO abc(abc, rank) VALUES('pgsz', -5);
   171  } {1 {SQL logic error}}
   172  do_catchsql_test 9.1.2 {
   173    INSERT INTO abc(abc, rank) VALUES('pgsz', 50000000);
   174  } {1 {SQL logic error}}
   175  do_catchsql_test 9.1.3 {
   176    INSERT INTO abc(abc, rank) VALUES('pgsz', 66.67);
   177  } {1 {SQL logic error}}
   178  
   179  do_catchsql_test 9.2.1 {
   180    INSERT INTO abc(abc, rank) VALUES('automerge', -5);
   181  } {1 {SQL logic error}}
   182  do_catchsql_test 9.2.2 {
   183    INSERT INTO abc(abc, rank) VALUES('automerge', 50000000);
   184  } {1 {SQL logic error}}
   185  do_catchsql_test 9.2.3 {
   186    INSERT INTO abc(abc, rank) VALUES('automerge', 66.67);
   187  } {1 {SQL logic error}}
   188  do_execsql_test 9.2.4 {
   189    INSERT INTO abc(abc, rank) VALUES('automerge', 1);
   190  } {}
   191  
   192  do_catchsql_test 9.3.1 {
   193    INSERT INTO abc(abc, rank) VALUES('crisismerge', -5);
   194  } {1 {SQL logic error}}
   195  do_catchsql_test 9.3.2 {
   196    INSERT INTO abc(abc, rank) VALUES('crisismerge', 66.67);
   197  } {1 {SQL logic error}}
   198  do_execsql_test 9.3.3 {
   199    INSERT INTO abc(abc, rank) VALUES('crisismerge', 1);
   200  } {}
   201  do_execsql_test 9.3.4 {
   202    INSERT INTO abc(abc, rank) VALUES('crisismerge', 50000000);
   203  } {}
   204  
   205  do_catchsql_test 9.4.1 {
   206    INSERT INTO abc(abc, rank) VALUES('nosuchoption', 1);
   207  } {1 {SQL logic error}}
   208  
   209  do_catchsql_test 9.5.1 {
   210    INSERT INTO abc(abc, rank) VALUES('hashsize', 'not an integer');
   211  } {1 {SQL logic error}}
   212  do_catchsql_test 9.5.2 {
   213    INSERT INTO abc(abc, rank) VALUES('hashsize', -500000);
   214  } {1 {SQL logic error}}
   215  do_catchsql_test 9.5.3 {
   216    INSERT INTO abc(abc, rank) VALUES('hashsize', 500000);
   217  } {0 {}}
   218  
   219  #-------------------------------------------------------------------------
   220  # Too many prefix indexes. Maximum allowed is 31.
   221  #
   222  foreach {tn spec} {
   223    1 {prefix="1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32"}
   224    2 {prefix="1 2 3 4", prefix="5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32"}
   225  } {
   226    set sql "CREATE VIRTUAL TABLE xyz USING fts5(x, $spec)"
   227    do_catchsql_test 10.$tn $sql {1 {too many prefix indexes (max 31)}}
   228  }
   229  
   230  #-------------------------------------------------------------------------
   231  # errors in the detail= option.
   232  #
   233  foreach {tn opt} {
   234    1 {detail=x}  
   235    2 {detail='x'}
   236    3 {detail='$'}
   237    4 {detail='1,2,'}
   238    5 {detail=',1'}
   239    6 {detail=''}
   240  } {
   241    set res [list 1 {malformed detail=... directive}]
   242    do_catchsql_test 11.$tn "CREATE VIRTUAL TABLE f1 USING fts5(x, $opt)" $res
   243  }
   244  
   245  do_catchsql_test 12.1 {
   246    INSERT INTO t1(t1, rank) VALUES('rank', NULL);;
   247  } {1 {SQL logic error}}
   248  
   249  #-------------------------------------------------------------------------
   250  # errors in the 'usermerge' option
   251  #
   252  do_execsql_test 13.0 {
   253    CREATE VIRTUAL TABLE tt USING fts5(ttt);
   254  }
   255  foreach {tn val} {
   256    1     -1
   257    2     4.2
   258    3     17
   259    4     1
   260  } {
   261    set sql "INSERT INTO tt(tt, rank) VALUES('usermerge', $val)"
   262    do_catchsql_test 13.$tn $sql {1 {SQL logic error}}
   263  }
   264  
   265  finish_test