Home | History | Annotate | Download | only in test
      1 # 2009 August 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 # This file implements regression tests for SQLite library. The
     12 # focus of this file is testing WHERE clause conditions with
     13 # subtle affinity issues.
     14 #
     15 
     16 set testdir [file dirname $argv0]
     17 source $testdir/tester.tcl
     18 
     19 # For this set of tests:
     20 #
     21 #  *   t1.y holds an integer value with affinity NONE
     22 #  *   t2.b holds a text value with affinity TEXT
     23 #
     24 # These values are not equal and because neither affinity is NUMERIC
     25 # no type conversion occurs.
     26 #
     27 do_test whereB-1.1 {
     28   db eval {
     29     CREATE TABLE t1(x,y);    -- affinity of t1.y is NONE
     30     INSERT INTO t1 VALUES(1,99);
     31 
     32     CREATE TABLE t2(a, b TEXT);  -- affinity of t2.b is TEXT
     33     CREATE INDEX t2b ON t2(b);
     34     INSERT INTO t2 VALUES(2,99);
     35 
     36     SELECT x, a, y=b FROM t1, t2 ORDER BY +x, +a;
     37   }
     38 } {1 2 0}
     39 do_test whereB-1.2 {
     40   db eval {
     41     SELECT x, a, y=b FROM t1, t2 WHERE y=b;
     42   }
     43 } {}
     44 do_test whereB-1.3 {
     45   db eval {
     46     SELECT x, a, y=b FROM t1, t2 WHERE b=y;
     47   }
     48 } {}
     49 do_test whereB-1.4 {
     50   db eval {
     51     SELECT x, a, y=b FROM t1, t2 WHERE +y=+b;
     52   }
     53 } {}
     54 do_test whereB-1.100 {
     55   db eval {
     56     DROP INDEX t2b;
     57     SELECT x, a, y=b FROM t1, t2 WHERE y=b;
     58   }
     59 } {}
     60 do_test whereB-1.101 {
     61   db eval {
     62     SELECT x, a, y=b FROM t1, t2 WHERE b=y;
     63   }
     64 } {}
     65 do_test whereB-1.102 {
     66   db eval {
     67     SELECT x, a, y=b FROM t1, t2 WHERE +y=+b;
     68   }
     69 } {}
     70 
     71 # For this set of tests:
     72 #
     73 #  *   t1.y holds a text value with affinity TEXT
     74 #  *   t2.b holds an integer value with affinity NONE
     75 #
     76 # These values are not equal and because neither affinity is NUMERIC
     77 # no type conversion occurs.
     78 #
     79 do_test whereB-2.1 {
     80   db eval {
     81     DROP TABLE t1;
     82     DROP TABLE t2;
     83 
     84     CREATE TABLE t1(x, y TEXT);    -- affinity of t1.y is TEXT
     85     INSERT INTO t1 VALUES(1,99);
     86 
     87     CREATE TABLE t2(a, b BLOB);  -- affinity of t2.b is NONE
     88     CREATE INDEX t2b ON t2(b);
     89     INSERT INTO t2 VALUES(2,99);
     90 
     91     SELECT x, a, y=b FROM t1, t2 ORDER BY +x, +a;
     92   }
     93 } {1 2 0}
     94 do_test whereB-2.2 {
     95   db eval {
     96     SELECT x, a, y=b FROM t1, t2 WHERE y=b;
     97   }
     98 } {}
     99 do_test whereB-2.3 {
    100   db eval {
    101     SELECT x, a, y=b FROM t1, t2 WHERE b=y;
    102   }
    103 } {}
    104 do_test whereB-2.4 {
    105   db eval {
    106     SELECT x, a, y=b FROM t1, t2 WHERE +y=+b;
    107   }
    108 } {}
    109 do_test whereB-2.100 {
    110   db eval {
    111     DROP INDEX t2b;
    112     SELECT x, a, y=b FROM t1, t2 WHERE y=b;
    113   }
    114 } {}
    115 do_test whereB-2.101 {
    116   db eval {
    117     SELECT x, a, y=b FROM t1, t2 WHERE b=y;
    118   }
    119 } {}
    120 do_test whereB-2.102 {
    121   db eval {
    122     SELECT x, a, y=b FROM t1, t2 WHERE +y=+b;
    123   }
    124 } {}
    125 
    126 # For this set of tests:
    127 #
    128 #  *   t1.y holds a text value with affinity NONE
    129 #  *   t2.b holds an integer value with affinity NONE
    130 #
    131 # These values are not equal and because neither affinity is NUMERIC
    132 # no type conversion occurs.
    133 #
    134 do_test whereB-3.1 {
    135   db eval {
    136     DROP TABLE t1;
    137     DROP TABLE t2;
    138 
    139     CREATE TABLE t1(x, y BLOB);    -- affinity of t1.y is NONE
    140     INSERT INTO t1 VALUES(1,99);
    141 
    142     CREATE TABLE t2(a, b BLOB);  -- affinity of t2.b is NONE
    143     CREATE INDEX t2b ON t2(b);
    144     INSERT INTO t2 VALUES(2,'99');
    145 
    146     SELECT x, a, y=b FROM t1, t2;
    147   }
    148 } {1 2 0}
    149 do_test whereB-3.2 {
    150   db eval {
    151     SELECT x, a, y=b FROM t1, t2 WHERE y=b;
    152   }
    153 } {}
    154 do_test whereB-3.3 {
    155   db eval {
    156     SELECT x, a, y=b FROM t1, t2 WHERE b=y;
    157   }
    158 } {}
    159 do_test whereB-3.4 {
    160   db eval {
    161     SELECT x, a, y=b FROM t1, t2 WHERE +y=+b;
    162   }
    163 } {}
    164 do_test whereB-3.100 {
    165   db eval {
    166     DROP INDEX t2b;
    167     SELECT x, a, y=b FROM t1, t2 WHERE y=b;
    168   }
    169 } {}
    170 do_test whereB-3.101 {
    171   db eval {
    172     SELECT x, a, y=b FROM t1, t2 WHERE b=y;
    173   }
    174 } {}
    175 do_test whereB-3.102 {
    176   db eval {
    177     SELECT x, a, y=b FROM t1, t2 WHERE +y=+b;
    178   }
    179 } {}
    180 
    181 
    182 # For this set of tests:
    183 #
    184 #  *   t1.y holds a text value with affinity NONE
    185 #  *   t2.b holds an integer value with affinity NUMERIC
    186 #
    187 # Because t2.b has a numeric affinity, type conversion should occur
    188 # and the two fields should be equal.
    189 #
    190 do_test whereB-4.1 {
    191   db eval {
    192     DROP TABLE t1;
    193     DROP TABLE t2;
    194 
    195     CREATE TABLE t1(x, y BLOB);    -- affinity of t1.y is NONE
    196     INSERT INTO t1 VALUES(1,'99');
    197 
    198     CREATE TABLE t2(a, b NUMERIC);  -- affinity of t2.b is NUMERIC
    199     CREATE INDEX t2b ON t2(b);
    200     INSERT INTO t2 VALUES(2,99);
    201 
    202     SELECT x, a, y=b FROM t1, t2;
    203   }
    204 } {1 2 1}
    205 do_test whereB-4.2 {
    206   db eval {
    207     SELECT x, a, y=b FROM t1, t2 WHERE y=b;
    208   }
    209 } {1 2 1}
    210 do_test whereB-4.3 {
    211   db eval {
    212     SELECT x, a, y=b FROM t1, t2 WHERE b=y;
    213   }
    214 } {1 2 1}
    215 do_test whereB-4.4 {
    216   # In this case the unary "+" operator removes the column affinity so
    217   # the columns compare false
    218   db eval {
    219     SELECT x, a, y=b FROM t1, t2 WHERE +y=+b;
    220   }
    221 } {}
    222 do_test whereB-4.100 {
    223   db eval {
    224     DROP INDEX t2b;
    225     SELECT x, a, y=b FROM t1, t2 WHERE y=b;
    226   }
    227 } {1 2 1}
    228 do_test whereB-4.101 {
    229   db eval {
    230     SELECT x, a, y=b FROM t1, t2 WHERE b=y;
    231   }
    232 } {1 2 1}
    233 do_test whereB-4.102 {
    234   # In this case the unary "+" operator removes the column affinity so
    235   # the columns compare false
    236   db eval {
    237     SELECT x, a, y=b FROM t1, t2 WHERE +y=+b;
    238   }
    239 } {}
    240 
    241 
    242 
    243 # For this set of tests:
    244 #
    245 #  *   t1.y holds a text value with affinity NONE
    246 #  *   t2.b holds an integer value with affinity INTEGER
    247 #
    248 # Because t2.b has a numeric affinity, type conversion should occur
    249 # and the two fields should be equal.
    250 #
    251 do_test whereB-5.1 {
    252   db eval {
    253     DROP TABLE t1;
    254     DROP TABLE t2;
    255 
    256     CREATE TABLE t1(x, y BLOB);    -- affinity of t1.y is NONE
    257     INSERT INTO t1 VALUES(1,'99');
    258 
    259     CREATE TABLE t2(a, b INT);  -- affinity of t2.b is INTEGER
    260     CREATE INDEX t2b ON t2(b);
    261     INSERT INTO t2 VALUES(2,99);
    262 
    263     SELECT x, a, y=b FROM t1, t2;
    264   }
    265 } {1 2 1}
    266 do_test whereB-5.2 {
    267   db eval {
    268     SELECT x, a, y=b FROM t1, t2 WHERE y=b;
    269   }
    270 } {1 2 1}
    271 do_test whereB-5.3 {
    272   db eval {
    273     SELECT x, a, y=b FROM t1, t2 WHERE b=y;
    274   }
    275 } {1 2 1}
    276 do_test whereB-5.4 {
    277   # In this case the unary "+" operator removes the column affinity so
    278   # the columns compare false
    279   db eval {
    280     SELECT x, a, y=b FROM t1, t2 WHERE +y=+b;
    281   }
    282 } {}
    283 do_test whereB-5.100 {
    284   db eval {
    285     DROP INDEX t2b;
    286     SELECT x, a, y=b FROM t1, t2 WHERE y=b;
    287   }
    288 } {1 2 1}
    289 do_test whereB-5.101 {
    290   db eval {
    291     SELECT x, a, y=b FROM t1, t2 WHERE b=y;
    292   }
    293 } {1 2 1}
    294 do_test whereB-5.102 {
    295   # In this case the unary "+" operator removes the column affinity so
    296   # the columns compare false
    297   db eval {
    298     SELECT x, a, y=b FROM t1, t2 WHERE +y=+b;
    299   }
    300 } {}
    301 
    302 
    303 # For this set of tests:
    304 #
    305 #  *   t1.y holds a text value with affinity NONE
    306 #  *   t2.b holds an integer value with affinity REAL
    307 #
    308 # Because t2.b has a numeric affinity, type conversion should occur
    309 # and the two fields should be equal.
    310 #
    311 do_test whereB-6.1 {
    312   db eval {
    313     DROP TABLE t1;
    314     DROP TABLE t2;
    315 
    316     CREATE TABLE t1(x, y BLOB);    -- affinity of t1.y is NONE
    317     INSERT INTO t1 VALUES(1,'99');
    318 
    319     CREATE TABLE t2(a, b REAL);  -- affinity of t2.b is REAL
    320     CREATE INDEX t2b ON t2(b);
    321     INSERT INTO t2 VALUES(2,99.0);
    322 
    323     SELECT x, a, y=b FROM t1, t2;
    324   }
    325 } {1 2 1}
    326 do_test whereB-6.2 {
    327   db eval {
    328     SELECT x, a, y=b FROM t1, t2 WHERE y=b;
    329   }
    330 } {1 2 1}
    331 do_test whereB-6.3 {
    332   db eval {
    333     SELECT x, a, y=b FROM t1, t2 WHERE b=y;
    334   }
    335 } {1 2 1}
    336 do_test whereB-6.4 {
    337   # In this case the unary "+" operator removes the column affinity so
    338   # the columns compare false
    339   db eval {
    340     SELECT x, a, y=b FROM t1, t2 WHERE +y=+b;
    341   }
    342 } {}
    343 do_test whereB-6.100 {
    344   db eval {
    345     DROP INDEX t2b;
    346     SELECT x, a, y=b FROM t1, t2 WHERE y=b;
    347   }
    348 } {1 2 1}
    349 do_test whereB-6.101 {
    350   db eval {
    351     SELECT x, a, y=b FROM t1, t2 WHERE b=y;
    352   }
    353 } {1 2 1}
    354 do_test whereB-6.102 {
    355   # In this case the unary "+" operator removes the column affinity so
    356   # the columns compare false
    357   db eval {
    358     SELECT x, a, y=b FROM t1, t2 WHERE +y=+b;
    359   }
    360 } {}
    361 
    362 
    363 # For this set of tests:
    364 #
    365 #  *   t1.y holds an integer value with affinity NUMERIC
    366 #  *   t2.b holds a text value with affinity NONE
    367 #
    368 # Because t1.y has a numeric affinity, type conversion should occur
    369 # and the two fields should be equal.
    370 #
    371 do_test whereB-7.1 {
    372   db eval {
    373     DROP TABLE t1;
    374     DROP TABLE t2;
    375 
    376     CREATE TABLE t1(x, y NUMERIC);  -- affinity of t1.y is NUMERIC
    377     INSERT INTO t1 VALUES(1,99);
    378 
    379     CREATE TABLE t2(a, b BLOB);  -- affinity of t2.b is NONE
    380     CREATE INDEX t2b ON t2(b);
    381     INSERT INTO t2 VALUES(2,'99');
    382 
    383     SELECT x, a, y=b FROM t1, t2;
    384   }
    385 } {1 2 1}
    386 do_test whereB-7.2 {
    387   db eval {
    388     SELECT x, a, y=b FROM t1, t2 WHERE y=b;
    389   }
    390 } {1 2 1}
    391 do_test whereB-7.3 {
    392   db eval {
    393     SELECT x, a, y=b FROM t1, t2 WHERE b=y;
    394   }
    395 } {1 2 1}
    396 do_test whereB-7.4 {
    397   # In this case the unary "+" operator removes the column affinity so
    398   # the columns compare false
    399   db eval {
    400     SELECT x, a, y=b FROM t1, t2 WHERE +y=+b;
    401   }
    402 } {}
    403 do_test whereB-7.100 {
    404   db eval {
    405     DROP INDEX t2b;
    406     SELECT x, a, y=b FROM t1, t2 WHERE y=b;
    407   }
    408 } {1 2 1}
    409 do_test whereB-7.101 {
    410   db eval {
    411     SELECT x, a, y=b FROM t1, t2 WHERE b=y;
    412   }
    413 } {1 2 1}
    414 do_test whereB-7.102 {
    415   # In this case the unary "+" operator removes the column affinity so
    416   # the columns compare false
    417   db eval {
    418     SELECT x, a, y=b FROM t1, t2 WHERE +y=+b;
    419   }
    420 } {}
    421 
    422 # For this set of tests:
    423 #
    424 #  *   t1.y holds an integer value with affinity INTEGER
    425 #  *   t2.b holds a text value with affinity NONE
    426 #
    427 # Because t1.y has a numeric affinity, type conversion should occur
    428 # and the two fields should be equal.
    429 #
    430 do_test whereB-8.1 {
    431   db eval {
    432     DROP TABLE t1;
    433     DROP TABLE t2;
    434 
    435     CREATE TABLE t1(x, y INT);  -- affinity of t1.y is INTEGER
    436     INSERT INTO t1 VALUES(1,99);
    437 
    438     CREATE TABLE t2(a, b BLOB);  -- affinity of t2.b is NONE
    439     CREATE INDEX t2b ON t2(b);
    440     INSERT INTO t2 VALUES(2,'99');
    441 
    442     SELECT x, a, y=b FROM t1, t2;
    443   }
    444 } {1 2 1}
    445 do_test whereB-8.2 {
    446   db eval {
    447     SELECT x, a, y=b FROM t1, t2 WHERE y=b;
    448   }
    449 } {1 2 1}
    450 do_test whereB-8.3 {
    451   db eval {
    452     SELECT x, a, y=b FROM t1, t2 WHERE b=y;
    453   }
    454 } {1 2 1}
    455 do_test whereB-8.4 {
    456   # In this case the unary "+" operator removes the column affinity so
    457   # the columns compare false
    458   db eval {
    459     SELECT x, a, y=b FROM t1, t2 WHERE +y=+b;
    460   }
    461 } {}
    462 do_test whereB-8.100 {
    463   db eval {
    464     DROP INDEX t2b;
    465     SELECT x, a, y=b FROM t1, t2 WHERE y=b;
    466   }
    467 } {1 2 1}
    468 do_test whereB-8.101 {
    469   db eval {
    470     SELECT x, a, y=b FROM t1, t2 WHERE b=y;
    471   }
    472 } {1 2 1}
    473 do_test whereB-8.102 {
    474   # In this case the unary "+" operator removes the column affinity so
    475   # the columns compare false
    476   db eval {
    477     SELECT x, a, y=b FROM t1, t2 WHERE +y=+b;
    478   }
    479 } {}
    480 
    481 # For this set of tests:
    482 #
    483 #  *   t1.y holds an integer value with affinity REAL
    484 #  *   t2.b holds a text value with affinity NONE
    485 #
    486 # Because t1.y has a numeric affinity, type conversion should occur
    487 # and the two fields should be equal.
    488 #
    489 do_test whereB-9.1 {
    490   db eval {
    491     DROP TABLE t1;
    492     DROP TABLE t2;
    493 
    494     CREATE TABLE t1(x, y REAL);  -- affinity of t1.y is REAL
    495     INSERT INTO t1 VALUES(1,99.0);
    496 
    497     CREATE TABLE t2(a, b BLOB);  -- affinity of t2.b is NONE
    498     CREATE INDEX t2b ON t2(b);
    499     INSERT INTO t2 VALUES(2,'99');
    500 
    501     SELECT x, a, y=b FROM t1, t2;
    502   }
    503 } {1 2 1}
    504 do_test whereB-9.2 {
    505   db eval {
    506     SELECT x, a, y=b FROM t1, t2 WHERE y=b;
    507   }
    508 } {1 2 1}
    509 do_test whereB-9.3 {
    510   db eval {
    511     SELECT x, a, y=b FROM t1, t2 WHERE b=y;
    512   }
    513 } {1 2 1}
    514 do_test whereB-9.4 {
    515   # In this case the unary "+" operator removes the column affinity so
    516   # the columns compare false
    517   db eval {
    518     SELECT x, a, y=b FROM t1, t2 WHERE +y=+b;
    519   }
    520 } {}
    521 do_test whereB-9.100 {
    522   db eval {
    523     DROP INDEX t2b;
    524     SELECT x, a, y=b FROM t1, t2 WHERE y=b;
    525   }
    526 } {1 2 1}
    527 do_test whereB-9.101 {
    528   db eval {
    529     SELECT x, a, y=b FROM t1, t2 WHERE b=y;
    530   }
    531 } {1 2 1}
    532 do_test whereB-9.102 {
    533   # In this case the unary "+" operator removes the column affinity so
    534   # the columns compare false
    535   db eval {
    536     SELECT x, a, y=b FROM t1, t2 WHERE +y=+b;
    537   }
    538 } {}
    539 
    540 
    541 
    542 
    543 finish_test
    544