2006-02-01 05:45:02 +03:00
|
|
|
# 2006 January 31
|
|
|
|
#
|
|
|
|
# The author disclaims copyright to this source code. In place of
|
|
|
|
# a legal notice, here is a blessing:
|
|
|
|
#
|
|
|
|
# May you do good and not evil.
|
|
|
|
# May you find forgiveness for yourself and forgive others.
|
|
|
|
# May you share freely, never taking more than you give.
|
|
|
|
#
|
|
|
|
#***********************************************************************
|
|
|
|
# This file implements regression tests for SQLite library. The
|
|
|
|
# focus of this file is testing the join reordering optimization
|
|
|
|
# in cases that include a LEFT JOIN.
|
|
|
|
#
|
2006-06-06 15:45:54 +04:00
|
|
|
# $Id: where3.test,v 1.2 2006/06/06 11:45:55 drh Exp $
|
2006-02-01 05:45:02 +03:00
|
|
|
|
|
|
|
set testdir [file dirname $argv0]
|
|
|
|
source $testdir/tester.tcl
|
|
|
|
|
|
|
|
# The following is from ticket #1652.
|
|
|
|
#
|
|
|
|
# A comma join then a left outer join: A,B left join C.
|
|
|
|
# Arrange indices so that the B table is chosen to go first.
|
|
|
|
# Also put an index on C, but make sure that A is chosen before C.
|
|
|
|
#
|
|
|
|
do_test where3-1.1 {
|
|
|
|
execsql {
|
|
|
|
CREATE TABLE t1(a, b);
|
|
|
|
CREATE TABLE t2(p, q);
|
|
|
|
CREATE TABLE t3(x, y);
|
|
|
|
|
|
|
|
INSERT INTO t1 VALUES(111,'one');
|
|
|
|
INSERT INTO t1 VALUES(222,'two');
|
|
|
|
INSERT INTO t1 VALUES(333,'three');
|
|
|
|
|
|
|
|
INSERT INTO t2 VALUES(1,111);
|
|
|
|
INSERT INTO t2 VALUES(2,222);
|
|
|
|
INSERT INTO t2 VALUES(4,444);
|
|
|
|
CREATE INDEX t2i1 ON t2(p);
|
|
|
|
|
|
|
|
INSERT INTO t3 VALUES(999,'nine');
|
|
|
|
CREATE INDEX t3i1 ON t3(x);
|
|
|
|
|
|
|
|
SELECT * FROM t1, t2 LEFT JOIN t3 ON q=x WHERE p=2 AND a=q;
|
|
|
|
}
|
|
|
|
} {222 two 2 222 {} {}}
|
|
|
|
|
2006-06-06 15:45:54 +04:00
|
|
|
# Ticket #1830
|
|
|
|
#
|
|
|
|
# This is similar to the above but with the LEFT JOIN on the
|
|
|
|
# other side.
|
|
|
|
#
|
|
|
|
do_test where3-1.2 {
|
|
|
|
execsql {
|
|
|
|
CREATE TABLE parent1(parent1key, child1key, Child2key, child3key);
|
|
|
|
CREATE TABLE child1 ( child1key NVARCHAR, value NVARCHAR );
|
|
|
|
CREATE UNIQUE INDEX PKIDXChild1 ON child1 ( child1key );
|
|
|
|
CREATE TABLE child2 ( child2key NVARCHAR, value NVARCHAR );
|
|
|
|
|
|
|
|
INSERT INTO parent1(parent1key,child1key,child2key)
|
|
|
|
VALUES ( 1, 'C1.1', 'C2.1' );
|
|
|
|
INSERT INTO child1 ( child1key, value ) VALUES ( 'C1.1', 'Value for C1.1' );
|
|
|
|
INSERT INTO child2 ( child2key, value ) VALUES ( 'C2.1', 'Value for C2.1' );
|
|
|
|
|
|
|
|
INSERT INTO parent1 ( parent1key, child1key, child2key )
|
|
|
|
VALUES ( 2, 'C1.2', 'C2.2' );
|
|
|
|
INSERT INTO child2 ( child2key, value ) VALUES ( 'C2.2', 'Value for C2.2' );
|
|
|
|
|
|
|
|
INSERT INTO parent1 ( parent1key, child1key, child2key )
|
|
|
|
VALUES ( 3, 'C1.3', 'C2.3' );
|
|
|
|
INSERT INTO child1 ( child1key, value ) VALUES ( 'C1.3', 'Value for C1.3' );
|
|
|
|
INSERT INTO child2 ( child2key, value ) VALUES ( 'C2.3', 'Value for C2.3' );
|
|
|
|
|
|
|
|
SELECT parent1.parent1key, child1.value, child2.value
|
|
|
|
FROM parent1
|
|
|
|
LEFT OUTER JOIN child1 ON child1.child1key = parent1.child1key
|
|
|
|
INNER JOIN child2 ON child2.child2key = parent1.child2key;
|
|
|
|
}
|
|
|
|
} {1 {Value for C1.1} {Value for C2.1} 2 {} {Value for C2.2} 3 {Value for C1.3} {Value for C2.3}}
|
2006-02-01 05:45:02 +03:00
|
|
|
|
|
|
|
finish_test
|