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