Annotation of embedaddon/sqlite3/test/tkt1443.test, revision 1.1
1.1 ! misho 1: # 2005 September 17
! 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.
! 12: #
! 13: # This file implements tests to verify that ticket #1433 has been
! 14: # fixed.
! 15: #
! 16: # The problem in ticket #1433 was that the dependencies on the right-hand
! 17: # side of an IN operator were not being checked correctly. So in an
! 18: # expression of the form:
! 19: #
! 20: # t1.x IN (1,t2.b,3)
! 21: #
! 22: # the optimizer was missing the fact that the right-hand side of the IN
! 23: # depended on table t2. It was checking dependencies based on the
! 24: # Expr.pRight field rather than Expr.pList and Expr.pSelect.
! 25: #
! 26: # Such a bug could be verifed using a less elaborate test case. But
! 27: # this test case (from the original bug poster) exercises so many different
! 28: # parts of the system all at once, that it seemed like a good one to
! 29: # include in the test suite.
! 30: #
! 31: # NOTE: Yes, in spite of the name of this file (tkt1443.test) this
! 32: # test is for ticket #1433 not #1443. I mistyped the name when I was
! 33: # creating the file and I had already checked in the file by the wrong
! 34: # name be the time I noticed the error. With CVS it is a really hassle
! 35: # to change filenames, so I'll just leave it as is. No harm done.
! 36: #
! 37: # $Id: tkt1443.test,v 1.4 2006/01/17 09:35:02 danielk1977 Exp $
! 38:
! 39: set testdir [file dirname $argv0]
! 40: source $testdir/tester.tcl
! 41:
! 42: ifcapable !subquery||!memorydb {
! 43: finish_test
! 44: return
! 45: }
! 46:
! 47: # Construct the sample database.
! 48: #
! 49: do_test tkt1443-1.0 {
! 50: sqlite3 db :memory:
! 51: execsql {
! 52: CREATE TABLE Items(
! 53: itemId integer primary key,
! 54: item str unique
! 55: );
! 56: INSERT INTO "Items" VALUES(0, 'ALL');
! 57: INSERT INTO "Items" VALUES(1, 'double:source');
! 58: INSERT INTO "Items" VALUES(2, 'double');
! 59: INSERT INTO "Items" VALUES(3, 'double:runtime');
! 60: INSERT INTO "Items" VALUES(4, '.*:runtime');
! 61:
! 62: CREATE TABLE Labels(
! 63: labelId INTEGER PRIMARY KEY,
! 64: label STR UNIQUE
! 65: );
! 66: INSERT INTO "Labels" VALUES(0, 'ALL');
! 67: INSERT INTO "Labels" VALUES(1, 'localhost@rpl:linux');
! 68: INSERT INTO "Labels" VALUES(2, 'localhost@rpl:branch');
! 69:
! 70: CREATE TABLE LabelMap(
! 71: itemId INTEGER,
! 72: labelId INTEGER,
! 73: branchId integer
! 74: );
! 75: INSERT INTO "LabelMap" VALUES(1, 1, 1);
! 76: INSERT INTO "LabelMap" VALUES(2, 1, 1);
! 77: INSERT INTO "LabelMap" VALUES(3, 1, 1);
! 78: INSERT INTO "LabelMap" VALUES(1, 2, 2);
! 79: INSERT INTO "LabelMap" VALUES(2, 2, 3);
! 80: INSERT INTO "LabelMap" VALUES(3, 2, 3);
! 81:
! 82: CREATE TABLE Users (
! 83: userId INTEGER PRIMARY KEY,
! 84: user STRING UNIQUE,
! 85: salt BINARY,
! 86: password STRING
! 87: );
! 88: INSERT INTO "Users" VALUES(1, 'test', 'æ$d',
! 89: '43ba0f45014306bd6df529551ffdb3df');
! 90: INSERT INTO "Users" VALUES(2, 'limited', 'ª>S',
! 91: 'cf07c8348fdf675cc1f7696b7d45191b');
! 92: CREATE TABLE UserGroups (
! 93: userGroupId INTEGER PRIMARY KEY,
! 94: userGroup STRING UNIQUE
! 95: );
! 96: INSERT INTO "UserGroups" VALUES(1, 'test');
! 97: INSERT INTO "UserGroups" VALUES(2, 'limited');
! 98:
! 99: CREATE TABLE UserGroupMembers (
! 100: userGroupId INTEGER,
! 101: userId INTEGER
! 102: );
! 103: INSERT INTO "UserGroupMembers" VALUES(1, 1);
! 104: INSERT INTO "UserGroupMembers" VALUES(2, 2);
! 105:
! 106: CREATE TABLE Permissions (
! 107: userGroupId INTEGER,
! 108: labelId INTEGER NOT NULL,
! 109: itemId INTEGER NOT NULL,
! 110: write INTEGER,
! 111: capped INTEGER,
! 112: admin INTEGER
! 113: );
! 114: INSERT INTO "Permissions" VALUES(1, 0, 0, 1, 0, 1);
! 115: INSERT INTO "Permissions" VALUES(2, 2, 4, 0, 0, 0);
! 116: }
! 117: } {}
! 118:
! 119: # Run the query with an index
! 120: #
! 121: do_test tkt1443-1.1 {
! 122: execsql {
! 123: select distinct
! 124: Items.Item as trove, UP.pattern as pattern
! 125: from
! 126: ( select
! 127: Permissions.labelId as labelId,
! 128: PerItems.item as pattern
! 129: from
! 130: Users, UserGroupMembers, Permissions
! 131: left outer join Items as PerItems
! 132: on Permissions.itemId = PerItems.itemId
! 133: where
! 134: Users.user = 'limited'
! 135: and Users.userId = UserGroupMembers.userId
! 136: and UserGroupMembers.userGroupId = Permissions.userGroupId
! 137: ) as UP join LabelMap on ( UP.labelId = 0 or
! 138: UP.labelId = LabelMap.labelId ),
! 139: Labels, Items
! 140: where
! 141: Labels.label = 'localhost@rpl:branch'
! 142: and Labels.labelId = LabelMap.labelId
! 143: and LabelMap.itemId = Items.itemId
! 144: ORDER BY +trove, +pattern
! 145: }
! 146: } {double .*:runtime double:runtime .*:runtime double:source .*:runtime}
! 147:
! 148: # Create an index and rerun the query.
! 149: # Verify that the results are the same
! 150: #
! 151: do_test tkt1443-1.2 {
! 152: execsql {
! 153: CREATE UNIQUE INDEX PermissionsIdx
! 154: ON Permissions(userGroupId, labelId, itemId);
! 155: select distinct
! 156: Items.Item as trove, UP.pattern as pattern
! 157: from
! 158: ( select
! 159: Permissions.labelId as labelId,
! 160: PerItems.item as pattern
! 161: from
! 162: Users, UserGroupMembers, Permissions
! 163: left outer join Items as PerItems
! 164: on Permissions.itemId = PerItems.itemId
! 165: where
! 166: Users.user = 'limited'
! 167: and Users.userId = UserGroupMembers.userId
! 168: and UserGroupMembers.userGroupId = Permissions.userGroupId
! 169: ) as UP join LabelMap on ( UP.labelId = 0 or
! 170: UP.labelId = LabelMap.labelId ),
! 171: Labels, Items
! 172: where
! 173: Labels.label = 'localhost@rpl:branch'
! 174: and Labels.labelId = LabelMap.labelId
! 175: and LabelMap.itemId = Items.itemId
! 176: ORDER BY +trove, +pattern
! 177: }
! 178: } {double .*:runtime double:runtime .*:runtime double:source .*:runtime}
! 179:
! 180: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>