Annotation of embedaddon/sqlite3/test/tkt1443.test, revision 1.1.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>