Annotation of embedaddon/sqlite3/test/unique.test, revision 1.1.1.1

1.1       misho       1: # 2001 September 27
                      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 the CREATE UNIQUE INDEX statement,
                     13: # and primary keys, and the UNIQUE constraint on table columns
                     14: #
                     15: # $Id: unique.test,v 1.9 2009/05/02 15:46:47 drh Exp $
                     16: 
                     17: set testdir [file dirname $argv0]
                     18: source $testdir/tester.tcl
                     19: 
                     20: # Try to create a table with two primary keys.
                     21: # (This is allowed in SQLite even that it is not valid SQL)
                     22: #
                     23: do_test unique-1.1 {
                     24:   catchsql {
                     25:     CREATE TABLE t1(
                     26:        a int PRIMARY KEY,
                     27:        b int PRIMARY KEY,
                     28:        c text
                     29:     );
                     30:   }
                     31: } {1 {table "t1" has more than one primary key}}
                     32: do_test unique-1.1b {
                     33:   catchsql {
                     34:     CREATE TABLE t1(
                     35:        a int PRIMARY KEY,
                     36:        b int UNIQUE,
                     37:        c text
                     38:     );
                     39:   }
                     40: } {0 {}}
                     41: do_test unique-1.2 {
                     42:   catchsql {
                     43:     INSERT INTO t1(a,b,c) VALUES(1,2,3)
                     44:   }
                     45: } {0 {}}
                     46: do_test unique-1.3 {
                     47:   catchsql {
                     48:     INSERT INTO t1(a,b,c) VALUES(1,3,4)
                     49:   }
                     50: } {1 {column a is not unique}}
                     51: do_test unique-1.4 {
                     52:   execsql {
                     53:     SELECT * FROM t1 ORDER BY a;
                     54:   }
                     55: } {1 2 3}
                     56: do_test unique-1.5 {
                     57:   catchsql {
                     58:     INSERT INTO t1(a,b,c) VALUES(3,2,4)
                     59:   }
                     60: } {1 {column b is not unique}}
                     61: do_test unique-1.6 {
                     62:   execsql {
                     63:     SELECT * FROM t1 ORDER BY a;
                     64:   }
                     65: } {1 2 3}
                     66: do_test unique-1.7 {
                     67:   catchsql {
                     68:     INSERT INTO t1(a,b,c) VALUES(3,4,5)
                     69:   }
                     70: } {0 {}}
                     71: do_test unique-1.8 {
                     72:   execsql {
                     73:     SELECT * FROM t1 ORDER BY a;
                     74:   }
                     75: } {1 2 3 3 4 5}
                     76: integrity_check unique-1.9
                     77: 
                     78: do_test unique-2.0 {
                     79:   execsql {
                     80:     DROP TABLE t1;
                     81:     CREATE TABLE t2(a int, b int);
                     82:     INSERT INTO t2(a,b) VALUES(1,2);
                     83:     INSERT INTO t2(a,b) VALUES(3,4);
                     84:     SELECT * FROM t2 ORDER BY a;
                     85:   }
                     86: } {1 2 3 4}
                     87: do_test unique-2.1 {
                     88:   catchsql {
                     89:     CREATE UNIQUE INDEX i2 ON t2(a)
                     90:   }
                     91: } {0 {}}
                     92: do_test unique-2.2 {
                     93:   catchsql {
                     94:     SELECT * FROM t2 ORDER BY a
                     95:   }
                     96: } {0 {1 2 3 4}}
                     97: do_test unique-2.3 {
                     98:   catchsql {
                     99:     INSERT INTO t2 VALUES(1,5);
                    100:   }
                    101: } {1 {column a is not unique}}
                    102: do_test unique-2.4 {
                    103:   catchsql {
                    104:     SELECT * FROM t2 ORDER BY a
                    105:   }
                    106: } {0 {1 2 3 4}}
                    107: do_test unique-2.5 {
                    108:   catchsql {
                    109:     DROP INDEX i2;
                    110:     SELECT * FROM t2 ORDER BY a;
                    111:   }
                    112: } {0 {1 2 3 4}}
                    113: do_test unique-2.6 {
                    114:   catchsql {
                    115:     INSERT INTO t2 VALUES(1,5)
                    116:   }
                    117: } {0 {}}
                    118: do_test unique-2.7 {
                    119:   catchsql {
                    120:     SELECT * FROM t2 ORDER BY a, b;
                    121:   }
                    122: } {0 {1 2 1 5 3 4}}
                    123: do_test unique-2.8 {
                    124:   catchsql {
                    125:     CREATE UNIQUE INDEX i2 ON t2(a);
                    126:   }
                    127: } {1 {indexed columns are not unique}}
                    128: do_test unique-2.9 {
                    129:   catchsql {
                    130:     CREATE INDEX i2 ON t2(a);
                    131:   }
                    132: } {0 {}}
                    133: integrity_check unique-2.10
                    134: 
                    135: # Test the UNIQUE keyword as used on two or more fields.
                    136: #
                    137: do_test unique-3.1 {
                    138:   catchsql {
                    139:     CREATE TABLE t3(
                    140:        a int,
                    141:        b int,
                    142:        c int,
                    143:        d int,
                    144:        unique(a,c,d)
                    145:      );
                    146:   }
                    147: } {0 {}}
                    148: do_test unique-3.2 {
                    149:   catchsql {
                    150:     INSERT INTO t3(a,b,c,d) VALUES(1,2,3,4);
                    151:     SELECT * FROM t3 ORDER BY a,b,c,d;
                    152:   }
                    153: } {0 {1 2 3 4}}
                    154: do_test unique-3.3 {
                    155:   catchsql {
                    156:     INSERT INTO t3(a,b,c,d) VALUES(1,2,3,5);
                    157:     SELECT * FROM t3 ORDER BY a,b,c,d;
                    158:   }
                    159: } {0 {1 2 3 4 1 2 3 5}}
                    160: do_test unique-3.4 {
                    161:   catchsql {
                    162:     INSERT INTO t3(a,b,c,d) VALUES(1,4,3,5);
                    163:     SELECT * FROM t3 ORDER BY a,b,c,d;
                    164:   }
                    165: } {1 {columns a, c, d are not unique}}
                    166: integrity_check unique-3.5
                    167: 
                    168: # Make sure NULLs are distinct as far as the UNIQUE tests are
                    169: # concerned.
                    170: #
                    171: do_test unique-4.1 {
                    172:   execsql {
                    173:     CREATE TABLE t4(a UNIQUE, b, c, UNIQUE(b,c));
                    174:     INSERT INTO t4 VALUES(1,2,3);
                    175:     INSERT INTO t4 VALUES(NULL, 2, NULL);
                    176:     SELECT * FROM t4;
                    177:   }
                    178: } {1 2 3 {} 2 {}}
                    179: do_test unique-4.2 {
                    180:   catchsql {
                    181:     INSERT INTO t4 VALUES(NULL, 3, 4);
                    182:   }
                    183: } {0 {}}
                    184: do_test unique-4.3 {
                    185:   execsql {
                    186:     SELECT * FROM t4
                    187:   }
                    188: } {1 2 3 {} 2 {} {} 3 4}
                    189: do_test unique-4.4 {
                    190:   catchsql {
                    191:     INSERT INTO t4 VALUES(2, 2, NULL);
                    192:   }
                    193: } {0 {}}
                    194: do_test unique-4.5 {
                    195:   execsql {
                    196:     SELECT * FROM t4
                    197:   }
                    198: } {1 2 3 {} 2 {} {} 3 4 2 2 {}}
                    199: 
                    200: # Ticket #1301.  Any NULL value in a set of unique columns should
                    201: # cause the rows to be distinct.
                    202: #
                    203: do_test unique-4.6 {
                    204:   catchsql {
                    205:     INSERT INTO t4 VALUES(NULL, 2, NULL);
                    206:   }
                    207: } {0 {}}
                    208: do_test unique-4.7 {
                    209:   execsql {SELECT * FROM t4}
                    210: } {1 2 3 {} 2 {} {} 3 4 2 2 {} {} 2 {}}
                    211: do_test unique-4.8 {
                    212:   catchsql {CREATE UNIQUE INDEX i4a ON t4(a,b)}
                    213: } {0 {}}
                    214: do_test unique-4.9 {
                    215:   catchsql {CREATE UNIQUE INDEX i4b ON t4(a,b,c)}
                    216: } {0 {}}
                    217: do_test unique-4.10 {
                    218:   catchsql {CREATE UNIQUE INDEX i4c ON t4(b)}
                    219: } {1 {indexed columns are not unique}}
                    220: integrity_check unique-4.99
                    221: 
                    222: # Test the error message generation logic.  In particular, make sure we
                    223: # do not overflow the static buffer used to generate the error message.
                    224: #
                    225: do_test unique-5.1 {
                    226:   execsql {
                    227:     CREATE TABLE t5(
                    228:       first_column_with_long_name,
                    229:       second_column_with_long_name,
                    230:       third_column_with_long_name,
                    231:       fourth_column_with_long_name,
                    232:       fifth_column_with_long_name,
                    233:       sixth_column_with_long_name,
                    234:       UNIQUE(
                    235:         first_column_with_long_name,
                    236:         second_column_with_long_name,
                    237:         third_column_with_long_name,
                    238:         fourth_column_with_long_name,
                    239:         fifth_column_with_long_name,
                    240:         sixth_column_with_long_name
                    241:       )
                    242:     );
                    243:     INSERT INTO t5 VALUES(1,2,3,4,5,6);
                    244:     SELECT * FROM t5;
                    245:   }
                    246: } {1 2 3 4 5 6}
                    247: do_test unique-5.2 {
                    248:   catchsql {
                    249:     INSERT INTO t5 VALUES(1,2,3,4,5,6);
                    250:   }
                    251: } {1 {columns first_column_with_long_name, second_column_with_long_name, third_column_with_long_name, fourth_column_with_long_name, fifth_column_with_long_name, sixth_column_with_long_name are not unique}}
                    252: 
                    253: finish_test

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>