1*89b373abSdrh# 2022-10-24 2*89b373abSdrh# 3*89b373abSdrh# The author disclaims copyright to this source code. In place of 4*89b373abSdrh# a legal notice, here is a blessing: 5*89b373abSdrh# 6*89b373abSdrh# May you do good and not evil. 7*89b373abSdrh# May you find forgiveness for yourself and forgive others. 8*89b373abSdrh# May you share freely, never taking more than you give. 9*89b373abSdrh# 10*89b373abSdrh#*********************************************************************** 11*89b373abSdrh# This file implements test cases for wide table (tables with more than 12*89b373abSdrh# 64 columns) and indexes that reference columns beyond the 63rd or 64th 13*89b373abSdrh# column. 14*89b373abSdrh# 15*89b373abSdrh 16*89b373abSdrhset testdir [file dirname $argv0] 17*89b373abSdrhsource $testdir/tester.tcl 18*89b373abSdrhset testprefix widetab1 19*89b373abSdrh 20*89b373abSdrh 21*89b373abSdrh# In order to pick the better index in the following query, SQLite needs to 22*89b373abSdrh# be able to detect when an index that references later columns in a wide 23*89b373abSdrh# table is a covering index. 24*89b373abSdrh# 25*89b373abSdrhdo_execsql_test 100 { 26*89b373abSdrh CREATE TABLE a( 27*89b373abSdrh a00, a01, a02, a03, a04, a05, a06, a07, a08, a09, 28*89b373abSdrh a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, 29*89b373abSdrh a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, 30*89b373abSdrh a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, 31*89b373abSdrh a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, 32*89b373abSdrh a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, 33*89b373abSdrh pd, bn, vb, bc, cn, ie, qm); 34*89b373abSdrh CREATE INDEX a1 on a(pd, bn, vb, bc, cn); -- preferred index 35*89b373abSdrh CREATE INDEX a2 on a(pd, bc, ie, qm); -- suboptimal index 36*89b373abSdrh CREATE TABLE b(bg, bc, bn, iv, ln, mg); 37*89b373abSdrh CREATE INDEX b1 on b(bn, iv, bg); 38*89b373abSdrh} 39*89b373abSdrhdo_eqp_test 110 { 40*89b373abSdrh SELECT dc, count(cn) 41*89b373abSdrh FROM (SELECT coalesce(b.bg, a.bc) as dc, cn 42*89b373abSdrh FROM a LEFT JOIN b 43*89b373abSdrh ON a.bn = b.bn 44*89b373abSdrh AND CASE WHEN a.vb IS NOT NULL THEN 1 ELSE 0 END = b.iv 45*89b373abSdrh WHERE pd BETWEEN 0 AND 10) 46*89b373abSdrh GROUP BY dc; 47*89b373abSdrh} { 48*89b373abSdrh QUERY PLAN 49*89b373abSdrh |--SEARCH a USING COVERING INDEX a1 (pd>? AND pd<?) 50*89b373abSdrh |--SEARCH b USING COVERING INDEX b1 (bn=? AND iv=?) LEFT-JOIN 51*89b373abSdrh `--USE TEMP B-TREE FOR GROUP BY 52*89b373abSdrh} 53*89b373abSdrh 54*89b373abSdrhreset_db 55*89b373abSdrhdo_execsql_test 200 { 56*89b373abSdrh CREATE TABLE t1( 57*89b373abSdrh c00,c01,c02,c03,c04,c05,c06,c07,c08,c09, 58*89b373abSdrh c10,c11,c12,c13,c14,c15,c16,c17,c18,c19, 59*89b373abSdrh c20,c21,c22,c23,c24,c25,c26,c27,c28,c29, 60*89b373abSdrh c30,c31,c32,c33,c34,c35,c36,c37,c38,c39, 61*89b373abSdrh c40,c41,c42,c43,c44,c45,c46,c47,c48,c49, 62*89b373abSdrh c50,c51,c52,c53,c54,c55,c56,c57,c58,c59, 63*89b373abSdrh c60,c61,c62,c63,c64,c65,c66,c67,c68,c69, 64*89b373abSdrh c70,c71,c72,c73,c74,c75,c76,c77,c78,c79, 65*89b373abSdrh c80,c81,c82,c83,c84,c85,c86,c87,c88,c89, 66*89b373abSdrh c90,c91,c92,c93,c94,c95,c96,c97,c98,c99, 67*89b373abSdrh a,b,c,d,e 68*89b373abSdrh ); 69*89b373abSdrh CREATE INDEX t1x1 on t1(c00,a,b, 70*89b373abSdrh c01,c02,c03,c04,c05,c06,c07,c08,c09, 71*89b373abSdrh c10,c11,c12,c13,c14,c15,c16,c17,c18,c19, 72*89b373abSdrh c20,c21,c22,c23,c24,c25,c26,c27,c28,c29, 73*89b373abSdrh c30,c31,c32,c33,c34,c35,c36,c37,c38,c39, 74*89b373abSdrh c40,c41,c42,c43,c44,c45,c46,c47,c48,c49, 75*89b373abSdrh c50,c51,c52,c53,c54,c55,c56,c57,c58,c59, 76*89b373abSdrh c60,c61,c62,c63,c64,c65,c66,c67,c68,c69, 77*89b373abSdrh c70,c71,c72,c73,c74,c75,c76,c77,c78,c79, 78*89b373abSdrh c80,c81,c82,c83,c84,c85,c86,c87,c88,c89, 79*89b373abSdrh c90,c91,c92,c93,c94,c00,c96,c97,c98,c99 80*89b373abSdrh ); 81*89b373abSdrh CREATE INDEX t1cd ON t1(c,d); 82*89b373abSdrh CREATE INDEX t1x2 ON t1(c01,c02,c03,a,b); 83*89b373abSdrh WITH RECURSIVE c(x) AS (VALUES(0) UNION ALL SELECT x+1000 FROM c WHERE x<9000) 84*89b373abSdrh INSERT INTO t1 SELECT 85*89b373abSdrh x+00, x+01, x+02, x+03, x+04, x+05, x+06, x+07, x+08, x+09, 86*89b373abSdrh x+10, x+11, x+12, x+13, x+14, x+15, x+16, x+17, x+18, x+19, 87*89b373abSdrh x+20, x+21, x+22, x+23, x+24, x+25, x+26, x+27, x+28, x+29, 88*89b373abSdrh x+30, x+31, x+32, x+33, x+34, x+35, x+36, x+37, x+38, x+39, 89*89b373abSdrh x+40, x+41, x+42, x+43, x+44, x+45, x+46, x+47, x+48, x+49, 90*89b373abSdrh x+50, x+51, x+52, x+53, x+54, x+55, x+56, x+57, x+58, x+59, 91*89b373abSdrh x+60, x+61, x+62, x+63, x+64, x+65, x+66, x+67, x+68, x+69, 92*89b373abSdrh x+70, x+71, x+72, x+73, x+74, x+75, x+76, x+77, x+78, x+79, 93*89b373abSdrh x+80, x+81, x+82, x+83, x+84, x+85, x+86, x+87, x+88, x+89, 94*89b373abSdrh x+90, x+91, x+92, x+93, x+94, x+95, x+96, x+97, x+98, x+99, 95*89b373abSdrh x+100, x+101, x+102, x+103, x+104 FROM c; 96*89b373abSdrh} 97*89b373abSdrh 98*89b373abSdrhdo_execsql_test 210 {SELECT sum(c62) FROM t1;} 45620 99*89b373abSdrhdo_execsql_test 220 {SELECT sum(c63) FROM t1;} 45630 100*89b373abSdrhdo_execsql_test 230 {SELECT sum(c64) FROM t1;} 45640 101*89b373abSdrhdo_execsql_test 240 {SELECT sum(c65) FROM t1;} 45650 102*89b373abSdrh 103*89b373abSdrhdo_execsql_test 300 { 104*89b373abSdrh BEGIN; 105*89b373abSdrh SELECT sum(c62) FROM t1; 106*89b373abSdrh UPDATE t1 SET c62=c62+1 WHERE c00=1000; 107*89b373abSdrh SELECT sum(c62) FROM t1; 108*89b373abSdrh} {45620 45621} 109*89b373abSdrhdo_execsql_test 310 { 110*89b373abSdrh SELECT sum(c65) FROM t1; 111*89b373abSdrh UPDATE t1 SET c65=c65+1 WHERE c00=1000; 112*89b373abSdrh SELECT sum(c65) FROM t1; 113*89b373abSdrh ROLLBACK; 114*89b373abSdrh} {45650 45651} 115*89b373abSdrh 116*89b373abSdrhdo_execsql_test 320 { 117*89b373abSdrh BEGIN; 118*89b373abSdrh SELECT count(*) FROM t1; 119*89b373abSdrh DELETE FROM t1 WHERE c=3102; 120*89b373abSdrh SELECT COUNT(*) FROM t1; 121*89b373abSdrh ROLLBACK; 122*89b373abSdrh} {10 9} 123*89b373abSdrhdo_execsql_test 330 { 124*89b373abSdrh BEGIN; 125*89b373abSdrh SELECT count(*) FROM t1; 126*89b373abSdrh DELETE FROM t1 WHERE c=3102 AND d=3103; 127*89b373abSdrh SELECT COUNT(*) FROM t1; 128*89b373abSdrh ROLLBACK; 129*89b373abSdrh} {10 9} 130*89b373abSdrhdo_execsql_test 340 { 131*89b373abSdrh BEGIN; 132*89b373abSdrh DELETE FROM t1 WHERE (c,d) IN (VALUES(3102,3103),(4102,4103),(5102,5103),(1,2)); 133*89b373abSdrh SELECT count(*) FROM t1; 134*89b373abSdrh ROLLBACK; 135*89b373abSdrh} {7} 136*89b373abSdrh 137*89b373abSdrhdo_execsql_test 400 { 138*89b373abSdrh DROP INDEX t1cd; 139*89b373abSdrh DROP INDEX t1x1; 140*89b373abSdrh DROP INDEX t1x2; 141*89b373abSdrh CREATE INDEX t1x3 ON t1(c00,c05,c08); 142*89b373abSdrh} 143*89b373abSdrhdo_execsql_test 410 {SELECT sum(c08) FROM t1 WHERE c00 IN (1000,5000);} 6016 144*89b373abSdrhdo_execsql_test 420 {SELECT sum(c63) FROM t1 WHERE c00 IN (1000,5000);} 6126 145*89b373abSdrhdo_execsql_test 430 {SELECT sum(c64) FROM t1 WHERE c00 IN (1000,5000);} 6128 146*89b373abSdrh 147*89b373abSdrhdo_execsql_test 500 { 148*89b373abSdrh DROP INDEX t1x3; 149*89b373abSdrh CREATE TABLE t2 AS SELECT * FROM t1; 150*89b373abSdrh CREATE INDEX t1x4 ON t1(c00, c62, a, b); 151*89b373abSdrh CREATE INDEX t2x4 ON t2(c01, c62, c63, b, c); 152*89b373abSdrh SELECT t1.b, t2.b FROM t1 JOIN t2 ON t2.c01=t1.c00+1 WHERE +t1.b<7000 153*89b373abSdrh ORDER BY +t1.b; 154*89b373abSdrh} {101 101 1101 1101 2101 2101 3101 3101 4101 4101 5101 5101 6101 6101} 155*89b373abSdrh 156*89b373abSdrhfinish_test 157