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
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>