OLD | NEW |
1 # 2010 September 24 | 1 # 2010 September 24 |
2 # | 2 # |
3 # The author disclaims copyright to this source code. In place of | 3 # The author disclaims copyright to this source code. In place of |
4 # a legal notice, here is a blessing: | 4 # a legal notice, here is a blessing: |
5 # | 5 # |
6 # May you do good and not evil. | 6 # May you do good and not evil. |
7 # May you find forgiveness for yourself and forgive others. | 7 # May you find forgiveness for yourself and forgive others. |
8 # May you share freely, never taking more than you give. | 8 # May you share freely, never taking more than you give. |
9 # | 9 # |
10 #*********************************************************************** | 10 #*********************************************************************** |
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
337 e_select-2.1.2 { CREATE INDEX i1 ON t1(a) } | 337 e_select-2.1.2 { CREATE INDEX i1 ON t1(a) } |
338 e_select-2.1.3 { CREATE INDEX i1 ON t2(a) } | 338 e_select-2.1.3 { CREATE INDEX i1 ON t2(a) } |
339 e_select-2.1.4 { CREATE INDEX i1 ON t3(b) } | 339 e_select-2.1.4 { CREATE INDEX i1 ON t3(b) } |
340 } { | 340 } { |
341 | 341 |
342 catchsql { DROP INDEX i1 } | 342 catchsql { DROP INDEX i1 } |
343 catchsql { DROP INDEX i2 } | 343 catchsql { DROP INDEX i2 } |
344 catchsql { DROP INDEX i3 } | 344 catchsql { DROP INDEX i3 } |
345 execsql $indexes | 345 execsql $indexes |
346 | 346 |
347 # EVIDENCE-OF: R-46122-14930 If the join-op is "CROSS JOIN", "INNER | 347 # EVIDENCE-OF: R-49872-03192 If the join-operator is "CROSS JOIN", |
348 # JOIN", "JOIN" or a comma (",") and there is no ON or USING clause, | 348 # "INNER JOIN", "JOIN" or a comma (",") and there is no ON or USING |
349 # then the result of the join is simply the cartesian product of the | 349 # clause, then the result of the join is simply the cartesian product of |
350 # left and right-hand datasets. | 350 # the left and right-hand datasets. |
351 # | 351 # |
352 # EVIDENCE-OF: R-46256-57243 There is no difference between the "INNER | 352 # EVIDENCE-OF: R-46256-57243 There is no difference between the "INNER |
353 # JOIN", "JOIN" and "," join operators. | 353 # JOIN", "JOIN" and "," join operators. |
354 # | 354 # |
355 # EVIDENCE-OF: R-07544-24155 The "CROSS JOIN" join operator produces the | 355 # EVIDENCE-OF: R-25071-21202 The "CROSS JOIN" join operator produces the |
356 # same data as the "INNER JOIN", "JOIN" and "," operators | 356 # same result as the "INNER JOIN", "JOIN" and "," operators |
357 # | 357 # |
358 test_join $tn.1.1 "t1, t2" {t1 t2} | 358 test_join $tn.1.1 "t1, t2" {t1 t2} |
359 test_join $tn.1.2 "t1 INNER JOIN t2" {t1 t2} | 359 test_join $tn.1.2 "t1 INNER JOIN t2" {t1 t2} |
360 test_join $tn.1.3 "t1 CROSS JOIN t2" {t1 t2} | 360 test_join $tn.1.3 "t1 CROSS JOIN t2" {t1 t2} |
361 test_join $tn.1.4 "t1 JOIN t2" {t1 t2} | 361 test_join $tn.1.4 "t1 JOIN t2" {t1 t2} |
362 test_join $tn.1.5 "t2, t3" {t2 t3} | 362 test_join $tn.1.5 "t2, t3" {t2 t3} |
363 test_join $tn.1.6 "t2 INNER JOIN t3" {t2 t3} | 363 test_join $tn.1.6 "t2 INNER JOIN t3" {t2 t3} |
364 test_join $tn.1.7 "t2 CROSS JOIN t3" {t2 t3} | 364 test_join $tn.1.7 "t2 CROSS JOIN t3" {t2 t3} |
365 test_join $tn.1.8 "t2 JOIN t3" {t2 t3} | 365 test_join $tn.1.8 "t2 JOIN t3" {t2 t3} |
366 test_join $tn.1.9 "t2, t2 AS x" {t2 t2} | 366 test_join $tn.1.9 "t2, t2 AS x" {t2 t2} |
367 test_join $tn.1.10 "t2 INNER JOIN t2 AS x" {t2 t2} | 367 test_join $tn.1.10 "t2 INNER JOIN t2 AS x" {t2 t2} |
368 test_join $tn.1.11 "t2 CROSS JOIN t2 AS x" {t2 t2} | 368 test_join $tn.1.11 "t2 CROSS JOIN t2 AS x" {t2 t2} |
369 test_join $tn.1.12 "t2 JOIN t2 AS x" {t2 t2} | 369 test_join $tn.1.12 "t2 JOIN t2 AS x" {t2 t2} |
370 | 370 |
371 # EVIDENCE-OF: R-22775-56496 If there is an ON clause specified, then | 371 # EVIDENCE-OF: R-38465-03616 If there is an ON clause then the ON |
372 # the ON expression is evaluated for each row of the cartesian product | 372 # expression is evaluated for each row of the cartesian product as a |
373 # as a boolean expression. All rows for which the expression evaluates | 373 # boolean expression. Only rows for which the expression evaluates to |
374 # to false are excluded from the dataset. | 374 # true are included from the dataset. |
375 # | 375 # |
376 test_join $tn.2.1 "t1, t2 ON (t1.a=t2.a)" {t1 t2 -on {te_equals a a}} | 376 test_join $tn.2.1 "t1, t2 ON (t1.a=t2.a)" {t1 t2 -on {te_equals a a}} |
377 test_join $tn.2.2 "t2, t1 ON (t1.a=t2.a)" {t2 t1 -on {te_equals a a}} | 377 test_join $tn.2.2 "t2, t1 ON (t1.a=t2.a)" {t2 t1 -on {te_equals a a}} |
378 test_join $tn.2.3 "t2, t1 ON (1)" {t2 t1 -on te_true} | 378 test_join $tn.2.3 "t2, t1 ON (1)" {t2 t1 -on te_true} |
379 test_join $tn.2.4 "t2, t1 ON (NULL)" {t2 t1 -on te_false} | 379 test_join $tn.2.4 "t2, t1 ON (NULL)" {t2 t1 -on te_false} |
380 test_join $tn.2.5 "t2, t1 ON (1.1-1.1)" {t2 t1 -on te_false} | 380 test_join $tn.2.5 "t2, t1 ON (1.1-1.1)" {t2 t1 -on te_false} |
381 test_join $tn.2.6 "t1, t2 ON (1.1-1.0)" {t1 t2 -on te_true} | 381 test_join $tn.2.6 "t1, t2 ON (1.1-1.0)" {t1 t2 -on te_true} |
382 | 382 |
383 | 383 |
384 test_join $tn.3 "t1 LEFT JOIN t2 ON (t1.a=t2.a)" {t1 t2 -left -on {te_equals a
a}} | 384 test_join $tn.3 "t1 LEFT JOIN t2 ON (t1.a=t2.a)" {t1 t2 -left -on {te_equals a
a}} |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
497 | 497 |
498 do_execsql_test e_select-2.2.0 { | 498 do_execsql_test e_select-2.2.0 { |
499 CREATE TABLE t4(x TEXT COLLATE nocase); | 499 CREATE TABLE t4(x TEXT COLLATE nocase); |
500 CREATE TABLE t5(y INTEGER, z TEXT COLLATE binary); | 500 CREATE TABLE t5(y INTEGER, z TEXT COLLATE binary); |
501 | 501 |
502 INSERT INTO t4 VALUES('2.0'); | 502 INSERT INTO t4 VALUES('2.0'); |
503 INSERT INTO t4 VALUES('TWO'); | 503 INSERT INTO t4 VALUES('TWO'); |
504 INSERT INTO t5 VALUES(2, 'two'); | 504 INSERT INTO t5 VALUES(2, 'two'); |
505 } {} | 505 } {} |
506 | 506 |
507 # EVIDENCE-OF: R-55824-40976 A sub-select specified in the join-source | 507 # EVIDENCE-OF: R-59237-46742 A subquery specified in the |
508 # following the FROM clause in a simple SELECT statement is handled as | 508 # table-or-subquery following the FROM clause in a simple SELECT |
509 # if it was a table containing the data returned by executing the | 509 # statement is handled as if it was a table containing the data returned |
510 # sub-select statement. | 510 # by executing the subquery statement. |
511 # | 511 # |
512 # EVIDENCE-OF: R-42612-06757 Each column of the sub-select dataset | 512 # EVIDENCE-OF: R-27438-53558 Each column of the subquery has the |
513 # inherits the collation sequence and affinity of the corresponding | 513 # collation sequence and affinity of the corresponding expression in the |
514 # expression in the sub-select statement. | 514 # subquery statement. |
515 # | 515 # |
516 foreach {tn subselect select spec} { | 516 foreach {tn subselect select spec} { |
517 1 "SELECT * FROM t2" "SELECT * FROM t1 JOIN %ss%" | 517 1 "SELECT * FROM t2" "SELECT * FROM t1 JOIN %ss%" |
518 {t1 %ss%} | 518 {t1 %ss%} |
519 | 519 |
520 2 "SELECT * FROM t2" "SELECT * FROM t1 JOIN %ss% AS x ON (t1.a=x.a)" | 520 2 "SELECT * FROM t2" "SELECT * FROM t1 JOIN %ss% AS x ON (t1.a=x.a)" |
521 {t1 %ss% -on {te_equals 0 0}} | 521 {t1 %ss% -on {te_equals 0 0}} |
522 | 522 |
523 3 "SELECT * FROM t2" "SELECT * FROM %ss% AS x JOIN t1 ON (t1.a=x.a)" | 523 3 "SELECT * FROM t2" "SELECT * FROM %ss% AS x JOIN t1 ON (t1.a=x.a)" |
524 {%ss% t1 -on {te_equals 0 0}} | 524 {%ss% t1 -on {te_equals 0 0}} |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
571 | 571 |
572 # Check that the actual data returned by the $select query is the same | 572 # Check that the actual data returned by the $select query is the same |
573 # as the expected data calculated using [te_tbljoin] above. | 573 # as the expected data calculated using [te_tbljoin] above. |
574 # | 574 # |
575 te_dataset_eq_unordered e_select-2.2.1.$tn [ | 575 te_dataset_eq_unordered e_select-2.2.1.$tn [ |
576 te_read_sql db [string map [list %ss% "($subselect)"] $select] | 576 te_read_sql db [string map [list %ss% "($subselect)"] $select] |
577 ] $te | 577 ] $te |
578 } | 578 } |
579 | 579 |
580 finish_test | 580 finish_test |
OLD | NEW |