xref: /sqlite-3.40.0/test/without_rowid6.test (revision 8210233c)
1e385d887Sdrh# 2014-12-28
2e385d887Sdrh#
3e385d887Sdrh# The author disclaims copyright to this source code.  In place of
4e385d887Sdrh# a legal notice, here is a blessing:
5e385d887Sdrh#
6e385d887Sdrh#    May you do good and not evil.
7e385d887Sdrh#    May you find forgiveness for yourself and forgive others.
8e385d887Sdrh#    May you share freely, never taking more than you give.
9e385d887Sdrh#
10e385d887Sdrh#***********************************************************************
11e385d887Sdrh#
12e385d887Sdrh# Verify that WITHOUT ROWID tables work correctly when the PRIMARY KEY
13e385d887Sdrh# has redundant columns.
14e385d887Sdrh#
15e385d887Sdrh
16e385d887Sdrhset testdir [file dirname $argv0]
17e385d887Sdrhsource $testdir/tester.tcl
18e385d887Sdrh
19b008e4d7Sdanproc do_execsql_test_if_vtab {tn sql {res {}}} {
20b008e4d7Sdan  ifcapable vtab { uplevel [list do_execsql_test $tn $sql $res] }
21b008e4d7Sdan}
22b008e4d7Sdan
23e385d887Sdrhdo_execsql_test without_rowid6-100 {
24e385d887Sdrh  CREATE TABLE t1(a,b,c,d,e, PRIMARY KEY(a,b,c,a,b,c,d,a,b,c)) WITHOUT ROWID;
25e385d887Sdrh  CREATE INDEX t1a ON t1(b, b);
26e385d887Sdrh  WITH RECURSIVE
27e385d887Sdrh    c(i) AS (VALUES(1) UNION ALL SELECT i+1 FROM c WHERE i<1000)
28e385d887Sdrh  INSERT INTO t1(a,b,c,d,e) SELECT i, i+1000, printf('x%dy',i), 0, 0 FROM c;
29e385d887Sdrh  ANALYZE;
30e385d887Sdrh} {}
31b008e4d7Sdando_execsql_test_if_vtab without_rowid6-101 {
3219d9a3caSdrh  SELECT name, key FROM pragma_index_xinfo('t1');
3319d9a3caSdrh} {a 1 b 1 c 1 d 1 e 0}
34e385d887Sdrhdo_execsql_test without_rowid6-110 {
35e385d887Sdrh  SELECT c FROM t1 WHERE a=123;
36e385d887Sdrh} {x123y}
37e385d887Sdrhdo_execsql_test without_rowid6-120 {
38e385d887Sdrh  SELECT c FROM t1 WHERE b=1123;
39e385d887Sdrh} {x123y}
40e385d887Sdrhdo_execsql_test without_rowid6-130 {
41e385d887Sdrh  SELECT c FROM t1 ORDER BY a DESC LIMIT 5;
42e385d887Sdrh} {x1000y x999y x998y x997y x996y}
43e385d887Sdrhdo_execsql_test without_rowid6-140 {
44e385d887Sdrh  SELECT c FROM t1 ORDER BY b LIMIT 5;
45e385d887Sdrh} {x1y x2y x3y x4y x5y}
46e385d887Sdrh
47f0636850Sdrh# Column t1.b starts out as a unique index, but that index is
48f0636850Sdrh# subsequently converted into a PRIMARY KEY.
49f0636850Sdrh#
50f0636850Sdrhdo_execsql_test without_rowid6-200 {
51f0636850Sdrh  DROP TABLE IF EXISTS t1;
52f0636850Sdrh  CREATE TABLE t1(
53f0636850Sdrh    a UNIQUE,
54f0636850Sdrh    b UNIQUE,
55f0636850Sdrh    c UNIQUE,
56f0636850Sdrh    PRIMARY KEY(b)
57f0636850Sdrh  ) WITHOUT ROWID;
58f0636850Sdrh  INSERT INTO t1(a,b,c) VALUES(1,8,3),(4,5,6),(7,2,9);
59f0636850Sdrh  SELECT a FROM t1 WHERE b>3 ORDER BY b;
60f0636850Sdrh} {4 1}
61b008e4d7Sdando_execsql_test_if_vtab without_rowid6-201 {
6219d9a3caSdrh  SELECT name, key FROM pragma_index_xinfo('t1');
6319d9a3caSdrh} {b 1 a 0 c 0}
64f0636850Sdrhdo_execsql_test without_rowid6-210 {
65f0636850Sdrh  EXPLAIN QUERY PLAN
66f0636850Sdrh  SELECT a FROM t1 WHERE b>3 ORDER BY b;
67*8210233cSdrh} {/SEARCH t1 USING PRIMARY KEY .b>../}
68f0636850Sdrhdo_execsql_test without_rowid6-220 {
69f0636850Sdrh  PRAGMA index_list(t1);
70f0636850Sdrh} {/sqlite_autoindex_t1_2 1 pk/}
71f0636850Sdrh
72f0636850Sdrhdo_execsql_test without_rowid6-300 {
73f0636850Sdrh  DROP TABLE IF EXISTS t1;
74f0636850Sdrh  CREATE TABLE t1(
75f0636850Sdrh    a UNIQUE,
76f0636850Sdrh    b PRIMARY KEY,
77f0636850Sdrh    c UNIQUE,
78f0636850Sdrh    UNIQUE(b)
79f0636850Sdrh  ) WITHOUT ROWID;
80f0636850Sdrh  INSERT INTO t1(a,b,c) VALUES(1,8,3),(4,5,6),(7,2,9);
81f0636850Sdrh  SELECT a FROM t1 WHERE b>3 ORDER BY b;
82f0636850Sdrh} {4 1}
83f0636850Sdrhdo_execsql_test without_rowid6-310 {
84f0636850Sdrh  EXPLAIN QUERY PLAN
85f0636850Sdrh  SELECT a FROM t1 WHERE b>3 ORDER BY b;
86*8210233cSdrh} {/SEARCH t1 USING PRIMARY KEY .b>../}
87f0636850Sdrhdo_execsql_test without_rowid6-320 {
88f0636850Sdrh  PRAGMA index_list(t1);
89f0636850Sdrh} {/sqlite_autoindex_t1_2 1 pk/}
90f0636850Sdrh
91f0636850Sdrhdo_execsql_test without_rowid6-400 {
92f0636850Sdrh  DROP TABLE IF EXISTS t1;
93f0636850Sdrh  CREATE TABLE t1(
94f0636850Sdrh    a UNIQUE,
95f0636850Sdrh    b UNIQUE PRIMARY KEY,
96f0636850Sdrh    c UNIQUE
97f0636850Sdrh  ) WITHOUT ROWID;
98f0636850Sdrh  INSERT INTO t1(a,b,c) VALUES(1,8,3),(4,5,6),(7,2,9);
99f0636850Sdrh  SELECT a FROM t1 WHERE b>3 ORDER BY b;
100f0636850Sdrh} {4 1}
101f0636850Sdrhdo_execsql_test without_rowid6-410 {
102f0636850Sdrh  EXPLAIN QUERY PLAN
103f0636850Sdrh  SELECT a FROM t1 WHERE b>3 ORDER BY b;
104*8210233cSdrh} {/SEARCH t1 USING PRIMARY KEY .b>../}
105f0636850Sdrhdo_execsql_test without_rowid6-420 {
106f0636850Sdrh  PRAGMA index_list(t1);
107f0636850Sdrh} {/sqlite_autoindex_t1_2 1 pk/}
108f0636850Sdrh
109f0636850Sdrhdo_execsql_test without_rowid6-500 {
110f0636850Sdrh  DROP TABLE IF EXISTS t1;
111f0636850Sdrh  CREATE TABLE t1(a,b,c,
112f0636850Sdrh    UNIQUE(b,c),
113f0636850Sdrh    PRIMARY KEY(b,c)
114f0636850Sdrh  ) WITHOUT ROWID;
115f0636850Sdrh  INSERT INTO t1(a,b,c) VALUES(1,8,3),(4,5,6),(7,2,9);
116f0636850Sdrh  SELECT a FROM t1 WHERE b>3 ORDER BY b;
117f0636850Sdrh} {4 1}
118b008e4d7Sdando_execsql_test_if_vtab without_rowid6-501 {
11919d9a3caSdrh  SELECT name, key FROM pragma_index_xinfo('t1');
12019d9a3caSdrh} {b 1 c 1 a 0}
121f0636850Sdrhdo_execsql_test without_rowid6-510 {
122f0636850Sdrh  EXPLAIN QUERY PLAN
123f0636850Sdrh  SELECT a FROM t1 WHERE b>3 ORDER BY b;
124*8210233cSdrh} {/SEARCH t1 USING PRIMARY KEY .b>../}
125f0636850Sdrhdo_execsql_test without_rowid6-520 {
126f0636850Sdrh  PRAGMA index_list(t1);
127f0636850Sdrh} {/sqlite_autoindex_t1_1 1 pk/}
128f0636850Sdrh
1294cbc54b0Sdrhdo_catchsql_test without_rowid6-600 {
1304cbc54b0Sdrh  CREATE TABLE t6(a,b,c,PRIMARY KEY(a,rowid,b))WITHOUT ROWID;
1314cbc54b0Sdrh} {1 {no such column: rowid}}
1324cbc54b0Sdrh
133e385d887Sdrh
134e385d887Sdrhfinish_test
135