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 16set testdir [file dirname $argv0] 17source $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# 27do_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} 39do_test whereB-1.2 { 40 db eval { 41 SELECT x, a, y=b FROM t1, t2 WHERE y=b; 42 } 43} {} 44do_test whereB-1.3 { 45 db eval { 46 SELECT x, a, y=b FROM t1, t2 WHERE b=y; 47 } 48} {} 49do_test whereB-1.4 { 50 db eval { 51 SELECT x, a, y=b FROM t1, t2 WHERE +y=+b; 52 } 53} {} 54do_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} {} 60do_test whereB-1.101 { 61 db eval { 62 SELECT x, a, y=b FROM t1, t2 WHERE b=y; 63 } 64} {} 65do_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# 79do_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} 94do_test whereB-2.2 { 95 db eval { 96 SELECT x, a, y=b FROM t1, t2 WHERE y=b; 97 } 98} {} 99do_test whereB-2.3 { 100 db eval { 101 SELECT x, a, y=b FROM t1, t2 WHERE b=y; 102 } 103} {} 104do_test whereB-2.4 { 105 db eval { 106 SELECT x, a, y=b FROM t1, t2 WHERE +y=+b; 107 } 108} {} 109do_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} {} 115do_test whereB-2.101 { 116 db eval { 117 SELECT x, a, y=b FROM t1, t2 WHERE b=y; 118 } 119} {} 120do_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# 134do_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} 149do_test whereB-3.2 { 150 db eval { 151 SELECT x, a, y=b FROM t1, t2 WHERE y=b; 152 } 153} {} 154do_test whereB-3.3 { 155 db eval { 156 SELECT x, a, y=b FROM t1, t2 WHERE b=y; 157 } 158} {} 159do_test whereB-3.4 { 160 db eval { 161 SELECT x, a, y=b FROM t1, t2 WHERE +y=+b; 162 } 163} {} 164do_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} {} 170do_test whereB-3.101 { 171 db eval { 172 SELECT x, a, y=b FROM t1, t2 WHERE b=y; 173 } 174} {} 175do_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# 190do_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} 205do_test whereB-4.2 { 206 db eval { 207 SELECT x, a, y=b FROM t1, t2 WHERE y=b; 208 } 209} {1 2 1} 210do_test whereB-4.3 { 211 db eval { 212 SELECT x, a, y=b FROM t1, t2 WHERE b=y; 213 } 214} {1 2 1} 215do_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} {} 222do_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} 228do_test whereB-4.101 { 229 db eval { 230 SELECT x, a, y=b FROM t1, t2 WHERE b=y; 231 } 232} {1 2 1} 233do_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# 251do_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} 266do_test whereB-5.2 { 267 db eval { 268 SELECT x, a, y=b FROM t1, t2 WHERE y=b; 269 } 270} {1 2 1} 271do_test whereB-5.3 { 272 db eval { 273 SELECT x, a, y=b FROM t1, t2 WHERE b=y; 274 } 275} {1 2 1} 276do_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} {} 283do_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} 289do_test whereB-5.101 { 290 db eval { 291 SELECT x, a, y=b FROM t1, t2 WHERE b=y; 292 } 293} {1 2 1} 294do_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# 311do_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} 326do_test whereB-6.2 { 327 db eval { 328 SELECT x, a, y=b FROM t1, t2 WHERE y=b; 329 } 330} {1 2 1} 331do_test whereB-6.3 { 332 db eval { 333 SELECT x, a, y=b FROM t1, t2 WHERE b=y; 334 } 335} {1 2 1} 336do_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} {} 343do_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} 349do_test whereB-6.101 { 350 db eval { 351 SELECT x, a, y=b FROM t1, t2 WHERE b=y; 352 } 353} {1 2 1} 354do_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# 371do_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} 386do_test whereB-7.2 { 387 db eval { 388 SELECT x, a, y=b FROM t1, t2 WHERE y=b; 389 } 390} {1 2 1} 391do_test whereB-7.3 { 392 db eval { 393 SELECT x, a, y=b FROM t1, t2 WHERE b=y; 394 } 395} {1 2 1} 396do_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} {} 403do_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} 409do_test whereB-7.101 { 410 db eval { 411 SELECT x, a, y=b FROM t1, t2 WHERE b=y; 412 } 413} {1 2 1} 414do_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# 430do_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} 445do_test whereB-8.2 { 446 db eval { 447 SELECT x, a, y=b FROM t1, t2 WHERE y=b; 448 } 449} {1 2 1} 450do_test whereB-8.3 { 451 db eval { 452 SELECT x, a, y=b FROM t1, t2 WHERE b=y; 453 } 454} {1 2 1} 455do_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} {} 462do_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} 468do_test whereB-8.101 { 469 db eval { 470 SELECT x, a, y=b FROM t1, t2 WHERE b=y; 471 } 472} {1 2 1} 473do_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# 489do_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} 504do_test whereB-9.2 { 505 db eval { 506 SELECT x, a, y=b FROM t1, t2 WHERE y=b; 507 } 508} {1 2 1} 509do_test whereB-9.3 { 510 db eval { 511 SELECT x, a, y=b FROM t1, t2 WHERE b=y; 512 } 513} {1 2 1} 514do_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} {} 521do_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} 527do_test whereB-9.101 { 528 db eval { 529 SELECT x, a, y=b FROM t1, t2 WHERE b=y; 530 } 531} {1 2 1} 532do_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 543finish_test 544