xref: /sqlite-3.40.0/test/unique2.test (revision 4cbc54b0)
1ac50232dSdrh# 2014-07-30
2ac50232dSdrh#
3ac50232dSdrh# The author disclaims copyright to this source code.  In place of
4ac50232dSdrh# a legal notice, here is a blessing:
5ac50232dSdrh#
6ac50232dSdrh#    May you do good and not evil.
7ac50232dSdrh#    May you find forgiveness for yourself and forgive others.
8ac50232dSdrh#    May you share freely, never taking more than you give.
9ac50232dSdrh#
10ac50232dSdrh#***********************************************************************
11ac50232dSdrh# This file implements regression tests for SQLite library.  The
12ac50232dSdrh# focus of this file is testing the CREATE UNIQUE INDEX statement
13ac50232dSdrh# to verify that ticket 9a6daf340df99ba93c53bcf8fa83d9f28040d2a8
14ac50232dSdrh# has been fixed:
15ac50232dSdrh#
16ac50232dSdrh#  drh added on 2014-07-30 12:33:04:
17ac50232dSdrh#
18ac50232dSdrh#  The CREATE UNIQUE INDEX on the third line below does not fail even
19ac50232dSdrh#  though the x column values are not all unique.
20ac50232dSdrh#
21ac50232dSdrh#     CREATE TABLE t1(x NOT NULL);
22ac50232dSdrh#     INSERT INTO t1 VALUES(1),(2),(2),(3);
23ac50232dSdrh#     CREATE UNIQUE INDEX t1x ON t1(x);
24ac50232dSdrh#
25ac50232dSdrh# If the index is created before the INSERT, then uniqueness is enforced
26ac50232dSdrh# at the point of the INSERT. Note that the NOT NULL on the indexed column
27ac50232dSdrh# seems to be required in order to exhibit this bug.
28ac50232dSdrh#
29ac50232dSdrh# "PRAGMA integrity_check" does not detect the resulting malformed database.
30ac50232dSdrh# That might be considered a separate issue.
31ac50232dSdrh#
32ac50232dSdrh# Bisecting shows that this problem was introduced by the addition of
33ac50232dSdrh#  WITHOUT ROWID support in version 3.8.2, specifically in check-in
34ac50232dSdrh# [c80e229dd9c1230] on 2013-11-07. This problem was reported on the mailing
35ac50232dSdrh# list by Pavel Pimenov.  and primary keys, and the UNIQUE constraint
36ac50232dSdrh# on table columns
37ac50232dSdrh#
38ac50232dSdrh
39ac50232dSdrhset testdir [file dirname $argv0]
40ac50232dSdrhsource $testdir/tester.tcl
41ac50232dSdrh
42ac50232dSdrhforeach {id sql} {
43ac50232dSdrh   1 {CREATE TABLE t1(x TEXT PRIMARY KEY, y NOT NULL) WITHOUT ROWID}
44ac50232dSdrh   2 {CREATE TABLE t1(x TEXT PRIMARY KEY, y NOT NULL)}
45ac50232dSdrh   3 {CREATE TABLE t1(x TEXT PRIMARY KEY, y) WITHOUT ROWID}
46ac50232dSdrh   4 {CREATE TABLE t1(x TEXT PRIMARY KEY, y)}
47ac50232dSdrh} {
48ac50232dSdrh  do_test $id.1 {
49ac50232dSdrh    db eval {DROP TABLE IF EXISTS t1}
50ac50232dSdrh    db eval $sql
51ac50232dSdrh    db eval {INSERT INTO t1(x,y) VALUES(1,1),(2,2),(3,2),(4,3)}
52ac50232dSdrh  } {}
53ac50232dSdrh  do_test $id.2 {
54ac50232dSdrh    catchsql {CREATE UNIQUE INDEX t1y ON t1(y)}
55ac50232dSdrh  } {1 {UNIQUE constraint failed: t1.y}}
56ac50232dSdrh}
57ac50232dSdrh
58ac50232dSdrhforeach {id sql} {
59ac50232dSdrh   5 {CREATE TABLE t1(w,x,y NOT NULL,z NOT NULL,PRIMARY KEY(w,x)) WITHOUT ROWID}
60ac50232dSdrh   6 {CREATE TABLE t1(w,x,y NOT NULL,z NOT NULL,PRIMARY KEY(w,x))}
61ac50232dSdrh   7 {CREATE TABLE t1(w,x,y NOT NULL,z,PRIMARY KEY(w,x)) WITHOUT ROWID}
62ac50232dSdrh   8 {CREATE TABLE t1(w,x,y NOT NULL,z,PRIMARY KEY(w,x))}
63ac50232dSdrh   9 {CREATE TABLE t1(w,x,y,z NOT NULL,PRIMARY KEY(w,x)) WITHOUT ROWID}
64ac50232dSdrh  10 {CREATE TABLE t1(w,x,y,z NOT NULL,PRIMARY KEY(w,x))}
65ac50232dSdrh  11 {CREATE TABLE t1(w,x,y,z,PRIMARY KEY(w,x)) WITHOUT ROWID}
66ac50232dSdrh  12 {CREATE TABLE t1(w,x,y,z,PRIMARY KEY(w,x))}
67ac50232dSdrh} {
68ac50232dSdrh  do_test $id.1 {
69ac50232dSdrh    db eval {DROP TABLE IF EXISTS t1}
70ac50232dSdrh    db eval $sql
71ac50232dSdrh    db eval {INSERT INTO t1(w,x,y,z) VALUES(1,2,3,4),(2,3,3,4)}
72ac50232dSdrh  } {}
73ac50232dSdrh  do_test $id.2 {
74ac50232dSdrh    catchsql {CREATE UNIQUE INDEX t1yz ON t1(y,z)}
75ac50232dSdrh  } {1 {UNIQUE constraint failed: t1.y, t1.z}}
76ac50232dSdrh}
77ac50232dSdrh
78*4cbc54b0Sdrhdo_catchsql_test 13.1 {
79*4cbc54b0Sdrh  CREATE TABLE err1(a,b,c,UNIQUE(rowid));
80*4cbc54b0Sdrh} {1 {no such column: rowid}}
81*4cbc54b0Sdrhdo_catchsql_test 13.2 {
82*4cbc54b0Sdrh  CREATE TABLE err1(a,b,c,PRIMARY KEY(rowid));
83*4cbc54b0Sdrh} {1 {no such column: rowid}}
84*4cbc54b0Sdrh
85*4cbc54b0Sdrh
86ac50232dSdrhfinish_test
87