Start of experimental implementation of SQL window functions. Does not yet
[sqlite.git] / test / analyzeB.test
blobe91e7d585e4069f8e768328c473ee829a1b4d7f6
1 # 2013 August 3
3 # The author disclaims copyright to this source code.  In place of
4 # a legal notice, here is a blessing:
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.
10 #***********************************************************************
12 # This file contains automated tests used to verify that the sqlite_stat3
13 # functionality is working. The tests in this file are based on a subset
14 # of the sqlite_stat4 tests in analyze9.test.
17 set testdir [file dirname $argv0]
18 source $testdir/tester.tcl
19 set testprefix analyzeB
21 ifcapable !stat3 {
22   finish_test
23   return
26 do_execsql_test 1.0 {
27   CREATE TABLE t1(a TEXT, b TEXT); 
28   INSERT INTO t1 VALUES('(0)', '(0)');
29   INSERT INTO t1 VALUES('(1)', '(1)');
30   INSERT INTO t1 VALUES('(2)', '(2)');
31   INSERT INTO t1 VALUES('(3)', '(3)');
32   INSERT INTO t1 VALUES('(4)', '(4)');
33   CREATE INDEX i1 ON t1(a, b);
34 } {}
37 do_execsql_test 1.1 {
38   ANALYZE;
39 } {}
41 do_execsql_test 1.2 {
42   SELECT tbl,idx,nEq,nLt,nDLt,quote(sample) FROM sqlite_stat3;
43 } {
44   t1 i1 1 0 0 '(0)'
45   t1 i1 1 1 1 '(1)'
46   t1 i1 1 2 2 '(2)'
47   t1 i1 1 3 3 '(3)'
48   t1 i1 1 4 4 '(4)'
51 if {[permutation] != "utf16"} {
52   do_execsql_test 1.3 {
53     SELECT tbl,idx,nEq,nLt,nDLt,quote(sample) FROM sqlite_stat3;
54   } {
55     t1 i1 1 0 0 '(0)'
56     t1 i1 1 1 1 '(1)'
57     t1 i1 1 2 2 '(2)'
58     t1 i1 1 3 3 '(3)'
59     t1 i1 1 4 4 '(4)'
60   }
64 #-------------------------------------------------------------------------
65 # This is really just to test SQL user function "test_decode".
67 reset_db
68 do_execsql_test 2.1 {
69   CREATE TABLE t1(a, b, c);
70   INSERT INTO t1(a) VALUES('some text');
71   INSERT INTO t1(a) VALUES(14);
72   INSERT INTO t1(a) VALUES(NULL);
73   INSERT INTO t1(a) VALUES(22.0);
74   INSERT INTO t1(a) VALUES(x'656667');
75   CREATE INDEX i1 ON t1(a, b, c);
76   ANALYZE;
77   SELECT quote(sample) FROM sqlite_stat3;
78 } {
79   NULL 14 22.0 {'some text'} X'656667' 
82 #-------------------------------------------------------------------------
83
84 reset_db
85 do_execsql_test 3.1 {
86   CREATE TABLE t2(a, b);
87   CREATE INDEX i2 ON t2(a, b);
88   BEGIN;
91 do_test 3.2 {
92   for {set i 0} {$i < 1000} {incr i} {
93     set a [expr $i / 10]
94     set b [expr int(rand() * 15.0)]
95     execsql { INSERT INTO t2 VALUES($a, $b) }
96   }
97   execsql COMMIT
98 } {}
100 db func lindex lindex
102 # Each value of "a" occurs exactly 10 times in the table.
104 do_execsql_test 3.3.1 {
105   SELECT count(*) FROM t2 GROUP BY a;
106 } [lrange [string repeat "10 " 100] 0 99]
108 # The first element in the "nEq" list of all samples should therefore be 10.
110 do_execsql_test 3.3.2 {
111   ANALYZE;
112   SELECT nEq FROM sqlite_stat3;
113 } [lrange [string repeat "10 " 100] 0 23]
115 #-------------------------------------------------------------------------
117 do_execsql_test 3.4 {
118   DROP TABLE IF EXISTS t1;
119   CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c);
120   INSERT INTO t1 VALUES(1, 1, 'one-a');
121   INSERT INTO t1 VALUES(11, 1, 'one-b');
122   INSERT INTO t1 VALUES(21, 1, 'one-c');
123   INSERT INTO t1 VALUES(31, 1, 'one-d');
124   INSERT INTO t1 VALUES(41, 1, 'one-e');
125   INSERT INTO t1 VALUES(51, 1, 'one-f');
126   INSERT INTO t1 VALUES(61, 1, 'one-g');
127   INSERT INTO t1 VALUES(71, 1, 'one-h');
128   INSERT INTO t1 VALUES(81, 1, 'one-i');
129   INSERT INTO t1 VALUES(91, 1, 'one-j');
130   INSERT INTO t1 SELECT a+1,2,'two' || substr(c,4) FROM t1;
131   INSERT INTO t1 SELECT a+2,3,'three'||substr(c,4) FROM t1 WHERE c GLOB 'one-*';
132   INSERT INTO t1 SELECT a+3,4,'four'||substr(c,4) FROM t1 WHERE c GLOB 'one-*';
133   INSERT INTO t1 SELECT a+4,5,'five'||substr(c,4) FROM t1 WHERE c GLOB 'one-*';
134   INSERT INTO t1 SELECT a+5,6,'six'||substr(c,4) FROM t1 WHERE c GLOB 'one-*';  
135   CREATE INDEX t1b ON t1(b);
136   ANALYZE;
137   SELECT c FROM t1 WHERE b=3 AND a BETWEEN 30 AND 60;
138 } {three-d three-e three-f}
141 #-------------------------------------------------------------------------
142 # These tests verify that the sample selection for stat3 appears to be 
143 # working as designed.
146 reset_db
147 db func lindex lindex
148 db func lrange lrange
150 do_execsql_test 4.0 {
151   DROP TABLE IF EXISTS t1;
152   CREATE TABLE t1(a, b, c);
153   CREATE INDEX i1 ON t1(c, b, a);
157 proc insert_filler_rows_n {iStart args} {
158   set A(-ncopy) 1
159   set A(-nval) 1
161   foreach {k v} $args {
162     if {[info exists A($k)]==0} { error "no such option: $k" }
163     set A($k) $v
164   }
165   if {[llength $args] % 2} {
166     error "option requires an argument: [lindex $args end]"
167   }
169   for {set i 0} {$i < $A(-nval)} {incr i} {
170     set iVal [expr $iStart+$i]
171     for {set j 0} {$j < $A(-ncopy)} {incr j} {
172       execsql { INSERT INTO t1 VALUES($iVal, $iVal, $iVal) }
173     }
174   }
177 do_test 4.1 {
178   execsql { BEGIN }
179   insert_filler_rows_n  0  -ncopy 10 -nval 19
180   insert_filler_rows_n 20  -ncopy  1 -nval 100
182   execsql {
183     INSERT INTO t1(c, b, a) VALUES(200, 1, 'a');
184     INSERT INTO t1(c, b, a) VALUES(200, 1, 'b');
185     INSERT INTO t1(c, b, a) VALUES(200, 1, 'c');
187     INSERT INTO t1(c, b, a) VALUES(200, 2, 'e');
188     INSERT INTO t1(c, b, a) VALUES(200, 2, 'f');
190     INSERT INTO t1(c, b, a) VALUES(201, 3, 'g');
191     INSERT INTO t1(c, b, a) VALUES(201, 4, 'h');
193     ANALYZE;
194     SELECT count(*) FROM sqlite_stat3;
195     SELECT count(*) FROM t1;
196   }
197 } {24 297}
199 do_execsql_test 4.2 {
200   SELECT neq, nlt, ndlt, sample FROM sqlite_stat3 ORDER BY rowid LIMIT 16;
201 } {
202   10 0 0 0
203   10 10 1 1
204   10 20 2 2
205   10 30 3 3
206   10 40 4 4
207   10 50 5 5
208   10 60 6 6
209   10 70 7 7
210   10 80 8 8
211   10 90 9 9
212   10 100 10 10
213   10 110 11 11
214   10 120 12 12
215   10 130 13 13
216   10 140 14 14
217   10 150 15 15
220 do_execsql_test 4.3 {
221   SELECT neq, nlt, ndlt, sample FROM sqlite_stat3
222   ORDER BY rowid DESC LIMIT 2;
223 } {
224   2 295 120 201
225   5 290 119 200
228 do_execsql_test 4.4 { SELECT count(DISTINCT c) FROM t1 WHERE c<201 } 120
229 do_execsql_test 4.5 { SELECT count(DISTINCT c) FROM t1 WHERE c<200 } 119
231 reset_db
232 do_test 4.7 {
233   execsql { 
234     BEGIN;
235     CREATE TABLE t1(o,t INTEGER PRIMARY KEY);
236     CREATE INDEX i1 ON t1(o);
237   }
238   for {set i 0} {$i<10000} {incr i [expr (($i<1000)?1:10)]} {
239     execsql { INSERT INTO t1 VALUES('x', $i) }
240   }
241   execsql {
242     COMMIT;
243     ANALYZE;
244     SELECT count(*) FROM sqlite_stat3;
245   }
246 } {1}
247 do_execsql_test 4.8 {
248   SELECT sample FROM sqlite_stat3;
249 } {x}
252 #-------------------------------------------------------------------------
253 # The following would cause a crash at one point.
255 reset_db
256 do_execsql_test 5.1 {
257   PRAGMA encoding = 'utf-16';
258   CREATE TABLE t0(v);
259   ANALYZE;
262 #-------------------------------------------------------------------------
263 # This was also crashing (corrupt sqlite_stat3 table).
265 reset_db
266 do_execsql_test 6.1 {
267   CREATE TABLE t1(a, b);
268   CREATE INDEX i1 ON t1(a);
269   CREATE INDEX i2 ON t1(b);
270   INSERT INTO t1 VALUES(1, 1);
271   INSERT INTO t1 VALUES(2, 2);
272   INSERT INTO t1 VALUES(3, 3);
273   INSERT INTO t1 VALUES(4, 4);
274   INSERT INTO t1 VALUES(5, 5);
275   ANALYZE;
276   PRAGMA writable_schema = 1;
277   CREATE TEMP TABLE x1 AS
278     SELECT tbl,idx,neq,nlt,ndlt,sample FROM sqlite_stat3
279     ORDER BY (rowid%5), rowid;
280   DELETE FROM sqlite_stat3;
281   INSERT INTO sqlite_stat3 SELECT * FROM x1;
282   PRAGMA writable_schema = 0;
283   ANALYZE sqlite_master;
285 do_execsql_test 6.2 {
286   SELECT * FROM t1 WHERE a = 'abc';
289 #-------------------------------------------------------------------------
290 # The following tests experiment with adding corrupted records to the
291 # 'sample' column of the sqlite_stat3 table.
293 reset_db
294 sqlite3_db_config_lookaside db 0 0 0
296 do_execsql_test 7.1 {
297   CREATE TABLE t1(a, b);
298   CREATE INDEX i1 ON t1(a, b);
299   INSERT INTO t1 VALUES(1, 1);
300   INSERT INTO t1 VALUES(2, 2);
301   INSERT INTO t1 VALUES(3, 3);
302   INSERT INTO t1 VALUES(4, 4);
303   INSERT INTO t1 VALUES(5, 5);
304   ANALYZE;
305   UPDATE sqlite_stat3 SET sample = X'' WHERE rowid = 1;
306   ANALYZE sqlite_master;
309 do_execsql_test 7.2 {
310   UPDATE sqlite_stat3 SET sample = X'FFFF';
311   ANALYZE sqlite_master;
312   SELECT * FROM t1 WHERE a = 1;
313 } {1 1}
315 do_execsql_test 7.3 {
316   ANALYZE;
317   UPDATE sqlite_stat3 SET neq = '0 0 0';
318   ANALYZE sqlite_master;
319   SELECT * FROM t1 WHERE a = 1;
320 } {1 1}
322 do_execsql_test 7.4 {
323   ANALYZE;
324   UPDATE sqlite_stat3 SET ndlt = '0 0 0';
325   ANALYZE sqlite_master;
326   SELECT * FROM t1 WHERE a = 3;
327 } {3 3}
329 do_execsql_test 7.5 {
330   ANALYZE;
331   UPDATE sqlite_stat3 SET nlt = '0 0 0';
332   ANALYZE sqlite_master;
333   SELECT * FROM t1 WHERE a = 5;
334 } {5 5}
336 #-------------------------------------------------------------------------
338 reset_db
339 do_execsql_test 8.1 {
340   CREATE TABLE t1(x TEXT);
341   CREATE INDEX i1 ON t1(x);
342   INSERT INTO t1 VALUES('1');
343   INSERT INTO t1 VALUES('2');
344   INSERT INTO t1 VALUES('3');
345   INSERT INTO t1 VALUES('4');
346   ANALYZE;
348 do_execsql_test 8.2 {
349   SELECT * FROM t1 WHERE x = 3;
350 } {3}
352 #-------------------------------------------------------------------------
354 reset_db
355 do_execsql_test 9.1 {
356   CREATE TABLE t1(a, b, c, d, e);
357   CREATE INDEX i1 ON t1(a, b, c, d);
358   CREATE INDEX i2 ON t1(e);
360 do_test 9.2 {
361   execsql BEGIN;
362   for {set i 0} {$i < 100} {incr i} {
363     execsql "INSERT INTO t1 VALUES('x', 'y', 'z', $i, [expr $i/2])"
364   }
365   for {set i 0} {$i < 20} {incr i} {
366     execsql "INSERT INTO t1 VALUES('x', 'y', 'z', 101, $i)"
367   }
368   for {set i 102} {$i < 200} {incr i} {
369     execsql "INSERT INTO t1 VALUES('x', 'y', 'z', $i, [expr $i/2])"
370   }
371   execsql COMMIT
372   execsql ANALYZE
373 } {}
375 do_eqp_test 9.3.1 {
376   SELECT * FROM t1 WHERE a='x' AND b='y' AND c='z' AND d=101 AND e=5;
377 } {/t1 USING INDEX i1/}
378 do_eqp_test 9.3.2 {
379   SELECT * FROM t1 WHERE a='x' AND b='y' AND c='z' AND d=99 AND e=5;
380 } {/t1 USING INDEX i1/}
382 set value_d [expr 101]
383 do_eqp_test 9.4.1 {
384   SELECT * FROM t1 WHERE a='x' AND b='y' AND c='z' AND d=$value_d AND e=5
385 } {/t1 USING INDEX i1/}
386 set value_d [expr 99]
387 do_eqp_test 9.4.2 {
388   SELECT * FROM t1 WHERE a='x' AND b='y' AND c='z' AND d=$value_d AND e=5
389 } {/t1 USING INDEX i1/}
391 #-------------------------------------------------------------------------
392 # Check that the planner takes stat3 data into account when considering
393 # "IS NULL" and "IS NOT NULL" constraints.
395 do_execsql_test 10.1.1 {
396   DROP TABLE IF EXISTS t3;
397   CREATE TABLE t3(a, b);
398   CREATE INDEX t3a ON t3(a);
399   CREATE INDEX t3b ON t3(b);
401 do_test 10.1.2 {
402   for {set i 1} {$i < 100} {incr i} {
403     if {$i>90} { set a $i } else { set a NULL }
404     set b [expr $i % 5]
405     execsql "INSERT INTO t3 VALUES($a, $b)"
406   }
407   execsql ANALYZE
408 } {}
409 do_eqp_test 10.1.3 {
410   SELECT * FROM t3 WHERE a IS NULL AND b = 2
411 } {/t3 USING INDEX t3b/}
412 do_eqp_test 10.1.4 {
413   SELECT * FROM t3 WHERE a IS NOT NULL AND b = 2
414 } {/t3 USING INDEX t3a/}
416 #-------------------------------------------------------------------------
417 # Check that stat3 data is used correctly with non-default collation
418 # sequences.
420 foreach {tn schema} {
421   1 {
422     CREATE TABLE t4(a COLLATE nocase, b);
423     CREATE INDEX t4a ON t4(a);
424     CREATE INDEX t4b ON t4(b);
425   }
426   2 {
427     CREATE TABLE t4(a, b);
428     CREATE INDEX t4a ON t4(a COLLATE nocase);
429     CREATE INDEX t4b ON t4(b);
430   }
431 } {
432   drop_all_tables
433   do_test 11.$tn.1 { execsql $schema } {}
435   do_test 11.$tn.2 {
436     for {set i 0} {$i < 100} {incr i} {
437       if { ($i % 10)==0 } { set a ABC } else { set a DEF }
438       set b [expr $i % 5]
439         execsql { INSERT INTO t4 VALUES($a, $b) }
440     }
441     execsql ANALYZE
442   } {}
444   do_eqp_test 11.$tn.3 {
445     SELECT * FROM t4 WHERE a = 'def' AND b = 3;
446   } {/t4 USING INDEX t4b/}
448   if {$tn==1} {
449     set sql "SELECT * FROM t4 WHERE a = 'abc' AND b = 3;"
450     do_eqp_test 11.$tn.4 $sql {/t4 USING INDEX t4a/}
451   } else {
453     set sql "SELECT * FROM t4 WHERE a = 'abc' COLLATE nocase AND b = 3;"
454     do_eqp_test 11.$tn.5 $sql {/t4 USING INDEX t4a/}
456     set sql "SELECT * FROM t4 WHERE a COLLATE nocase = 'abc' AND b = 3;"
457     do_eqp_test 11.$tn.6 $sql {/t4 USING INDEX t4a/}
458   }
461 #-------------------------------------------------------------------------
462 # Test that nothing untoward happens if the stat3 table contains entries
463 # for indexes that do not exist. Or NULL values in the idx column.
464 # Or NULL values in any of the other columns.
466 drop_all_tables
467 do_execsql_test 15.1 {
468   CREATE TABLE x1(a, b, UNIQUE(a, b));
469   INSERT INTO x1 VALUES(1, 2);
470   INSERT INTO x1 VALUES(3, 4);
471   INSERT INTO x1 VALUES(5, 6);
472   ANALYZE;
473   INSERT INTO sqlite_stat3 VALUES(NULL, NULL, NULL, NULL, NULL, NULL);
475 db close
476 sqlite3 db test.db
477 do_execsql_test 15.2 { SELECT * FROM x1 } {1 2 3 4 5 6}
479 do_execsql_test 15.3 {
480   INSERT INTO sqlite_stat3 VALUES(42, 42, 42, 42, 42, 42);
482 db close
483 sqlite3 db test.db
484 do_execsql_test 15.4 { SELECT * FROM x1 } {1 2 3 4 5 6}
486 do_execsql_test 15.5 {
487   UPDATE sqlite_stat1 SET stat = NULL;
489 db close
490 sqlite3 db test.db
491 do_execsql_test 15.6 { SELECT * FROM x1 } {1 2 3 4 5 6}
493 do_execsql_test 15.7 {
494   ANALYZE;
495   UPDATE sqlite_stat1 SET tbl = 'no such tbl';
497 db close
498 sqlite3 db test.db
499 do_execsql_test 15.8 { SELECT * FROM x1 } {1 2 3 4 5 6}
501 do_execsql_test 15.9 {
502   ANALYZE;
503   UPDATE sqlite_stat3 SET neq = NULL, nlt=NULL, ndlt=NULL;
505 db close
506 sqlite3 db test.db
507 do_execsql_test 15.10 { SELECT * FROM x1 } {1 2 3 4 5 6}
509 # This is just for coverage....
510 do_execsql_test 15.11 {
511   ANALYZE;
512   UPDATE sqlite_stat1 SET stat = stat || ' unordered';
514 db close
515 sqlite3 db test.db
516 do_execsql_test 15.12 { SELECT * FROM x1 } {1 2 3 4 5 6}
518 #-------------------------------------------------------------------------
519 # Test that allocations used for sqlite_stat3 samples are included in
520 # the quantity returned by SQLITE_DBSTATUS_SCHEMA_USED.
522 set one [string repeat x 1000]
523 set two [string repeat x 2000]
524 do_test 16.1 {
525   reset_db
526   execsql {
527     CREATE TABLE t1(a, UNIQUE(a));
528     INSERT INTO t1 VALUES($one);
529     ANALYZE;
530   }
531   set nByte [lindex [sqlite3_db_status db SCHEMA_USED 0] 1]
533   reset_db
534   execsql {
535     CREATE TABLE t1(a, UNIQUE(a));
536     INSERT INTO t1 VALUES($two);
537     ANALYZE;
538   }
539   set nByte2 [lindex [sqlite3_db_status db SCHEMA_USED 0] 1]
541   expr {$nByte2 > $nByte+950 && $nByte2 < $nByte+1050}
542 } {1}
544 #-------------------------------------------------------------------------
545 # Test that stat3 data may be used with partial indexes.
547 do_test 17.1 {
548   reset_db
549   execsql {
550     CREATE TABLE t1(a, b, c, d);
551     CREATE INDEX i1 ON t1(a, b) WHERE d IS NOT NULL;
552     INSERT INTO t1 VALUES(-1, -1, -1, NULL);
553     INSERT INTO t1 SELECT 2*a,2*b,2*c,d FROM t1;
554     INSERT INTO t1 SELECT 2*a,2*b,2*c,d FROM t1;
555     INSERT INTO t1 SELECT 2*a,2*b,2*c,d FROM t1;
556     INSERT INTO t1 SELECT 2*a,2*b,2*c,d FROM t1;
557     INSERT INTO t1 SELECT 2*a,2*b,2*c,d FROM t1;
558     INSERT INTO t1 SELECT 2*a,2*b,2*c,d FROM t1;
559   }
561   for {set i 0} {$i < 32} {incr i} {
562     execsql { INSERT INTO t1 VALUES($i%2, $b, $i/2, 'abc') }
563   }
564   execsql {ANALYZE main.t1}
565 } {}
567 do_catchsql_test 17.1.2 {
568   ANALYZE temp.t1;
569 } {1 {no such table: temp.t1}}
571 do_eqp_test 17.2 {
572   SELECT * FROM t1 WHERE d IS NOT NULL AND a=0;
573 } {/USING INDEX i1/}
574 do_eqp_test 17.3 {
575   SELECT * FROM t1 WHERE d IS NOT NULL AND a=0;
576 } {/USING INDEX i1/}
578 do_execsql_test 17.4 {
579   CREATE INDEX i2 ON t1(c) WHERE d IS NOT NULL;
580   ANALYZE main.i2;
582 do_eqp_test 17.5 {
583   SELECT * FROM t1 WHERE d IS NOT NULL AND a=0;
584 } {/USING INDEX i1/}
585 do_eqp_test 17.6 {
586   SELECT * FROM t1 WHERE d IS NOT NULL AND a=0 AND b=0 AND c=10;
587 } {/USING INDEX i2/}
589 #-------------------------------------------------------------------------
591 do_test 18.1 {
592   reset_db
593   execsql {
594     CREATE TABLE t1(a, b);
595     CREATE INDEX i1 ON t1(a, b);
596   }
597   for {set i 0} {$i < 9} {incr i} {
598     execsql {
599       INSERT INTO t1 VALUES($i, 0);
600       INSERT INTO t1 VALUES($i, 0);
601       INSERT INTO t1 VALUES($i, 0);
602       INSERT INTO t1 VALUES($i, 0);
603       INSERT INTO t1 VALUES($i, 0);
604       INSERT INTO t1 VALUES($i, 0);
605       INSERT INTO t1 VALUES($i, 0);
606       INSERT INTO t1 VALUES($i, 0);
607       INSERT INTO t1 VALUES($i, 0);
608       INSERT INTO t1 VALUES($i, 0);
609       INSERT INTO t1 VALUES($i, 0);
610       INSERT INTO t1 VALUES($i, 0);
611       INSERT INTO t1 VALUES($i, 0);
612       INSERT INTO t1 VALUES($i, 0);
613       INSERT INTO t1 VALUES($i, 0);
614     }
615   }
616   execsql ANALYZE
617   execsql { SELECT count(*) FROM sqlite_stat3 }
618 } {9}
620 #-------------------------------------------------------------------------
621 # For coverage.
623 ifcapable view {
624   do_test 19.1 {
625     reset_db 
626     execsql {
627       CREATE TABLE t1(x, y);
628       CREATE INDEX i1 ON t1(x, y);
629       CREATE VIEW v1 AS SELECT * FROM t1;
630       ANALYZE;
631     }
632   } {}
634 ifcapable auth {
635   proc authproc {op args} {
636     if {$op == "SQLITE_ANALYZE"} { return "SQLITE_DENY" }
637     return "SQLITE_OK"
638   }
639   do_test 19.2 {
640     reset_db 
641     db auth authproc
642     execsql {
643       CREATE TABLE t1(x, y);
644       CREATE VIEW v1 AS SELECT * FROM t1;
645     }
646     catchsql ANALYZE
647   } {1 {not authorized}}
650 #-------------------------------------------------------------------------
652 reset_db
653 proc r {args} { expr rand() }
654 db func r r
655 db func lrange lrange
656 do_test 20.1 {
657   execsql {
658     CREATE TABLE t1(a,b,c,d);
659     CREATE INDEX i1 ON t1(a,b,c,d);
660   }
661   for {set i 0} {$i < 16} {incr i} {
662     execsql {
663       INSERT INTO t1 VALUES($i, r(), r(), r());
664       INSERT INTO t1 VALUES($i, $i,  r(), r());
665       INSERT INTO t1 VALUES($i, $i,  $i,  r());
666       INSERT INTO t1 VALUES($i, $i,  $i,  $i);
667       INSERT INTO t1 VALUES($i, $i,  $i,  $i);
668       INSERT INTO t1 VALUES($i, $i,  $i,  r());
669       INSERT INTO t1 VALUES($i, $i,  r(), r());
670       INSERT INTO t1 VALUES($i, r(), r(), r());
671     }
672   }
673 } {}
674 do_execsql_test 20.2 { ANALYZE }
675 for {set i 0} {$i<16} {incr i} {
676     set val $i
677     do_execsql_test 20.3.$i {
678       SELECT count(*) FROM sqlite_stat3 WHERE sample=$val
679     } {1}
682 finish_test