xref: /sqlite-3.40.0/test/view.test (revision 8c53b4e7)
1# 2002 February 26
2#
3# The author disclaims copyright to this source code.  In place of
4# a legal notice, here is a blessing:
5#
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.
9#
10#***********************************************************************
11# This file implements regression tests for SQLite library.  The
12# focus of this file is testing VIEW statements.
13#
14# $Id: view.test,v 1.39 2008/12/14 14:45:21 danielk1977 Exp $
15set testdir [file dirname $argv0]
16source $testdir/tester.tcl
17
18# Omit this entire file if the library is not configured with views enabled.
19ifcapable !view {
20  finish_test
21  return
22}
23
24do_test view-1.0 {
25  execsql {
26    CREATE TABLE t1(a,b,c);
27    INSERT INTO t1 VALUES(1,2,3);
28    INSERT INTO t1 VALUES(4,5,6);
29    INSERT INTO t1 VALUES(7,8,9);
30    SELECT * FROM t1;
31  }
32} {1 2 3 4 5 6 7 8 9}
33
34do_test view-1.1 {
35  execsql {
36    BEGIN;
37    CREATE VIEW IF NOT EXISTS v1 AS SELECT a,b FROM t1;
38    SELECT * FROM v1 ORDER BY a;
39  }
40} {1 2 4 5 7 8}
41do_test view-1.2 {
42  catchsql {
43    ROLLBACK;
44    SELECT * FROM v1 ORDER BY a;
45  }
46} {1 {no such table: v1}}
47do_test view-1.3 {
48  execsql {
49    CREATE VIEW v1 AS SELECT a,b FROM t1;
50    SELECT * FROM v1 ORDER BY a;
51  }
52} {1 2 4 5 7 8}
53do_test view-1.3.1 {
54  db close
55  sqlite3 db test.db
56  execsql {
57    SELECT * FROM v1 ORDER BY a;
58  }
59} {1 2 4 5 7 8}
60do_test view-1.4 {
61  catchsql {
62    DROP VIEW IF EXISTS v1;
63    SELECT * FROM v1 ORDER BY a;
64  }
65} {1 {no such table: v1}}
66do_test view-1.5 {
67  execsql {
68    CREATE VIEW v1 AS SELECT a,b FROM t1;
69    SELECT * FROM v1 ORDER BY a;
70  }
71} {1 2 4 5 7 8}
72do_test view-1.6 {
73  catchsql {
74    DROP TABLE t1;
75    SELECT * FROM v1 ORDER BY a;
76  }
77} {1 {no such table: main.t1}}
78do_test view-1.7 {
79  execsql {
80    CREATE TABLE t1(x,a,b,c);
81    INSERT INTO t1 VALUES(1,2,3,4);
82    INSERT INTO t1 VALUES(4,5,6,7);
83    INSERT INTO t1 VALUES(7,8,9,10);
84    SELECT * FROM v1 ORDER BY a;
85  }
86} {2 3 5 6 8 9}
87do_test view-1.8 {
88  db close
89  sqlite3 db test.db
90  execsql {
91    SELECT * FROM v1 ORDER BY a;
92  }
93} {2 3 5 6 8 9}
94
95do_execsql_test view-1.10 {
96  CREATE TABLE t9(x INTEGER);
97  CREATE VIEW v9a AS SELECT x FROM t9;
98  CREATE VIEW v9b AS SELECT * FROM t9;
99  CREATE VIEW v9c(x) AS SELECT x FROM t9;
100  CREATE VIEW v9d(x) AS SELECT * FROM t9;
101} {}
102do_execsql_test view-1.11 {
103  PRAGMA table_info(v9a);
104} {0 x INTEGER 0 {} 0}
105do_execsql_test view-1.12 {
106  PRAGMA table_info(v9b);
107} {0 x INTEGER 0 {} 0}
108do_execsql_test view-1.13 {
109  PRAGMA table_info(v9c);
110} {0 x INTEGER 0 {} 0}
111do_execsql_test view-1.14 {
112  PRAGMA table_info(v9d);
113} {0 x INTEGER 0 {} 0}
114
115do_test view-2.1 {
116  execsql {
117    CREATE VIEW v2 AS SELECT * FROM t1 WHERE a>5
118  };  # No semicolon
119  execsql2 {
120    SELECT * FROM v2;
121  }
122} {x 7 a 8 b 9 c 10}
123do_test view-2.2 {
124  catchsql {
125    INSERT INTO v2 VALUES(1,2,3,4);
126  }
127} {1 {cannot modify v2 because it is a view}}
128do_test view-2.3 {
129  catchsql {
130    UPDATE v2 SET a=10 WHERE a=5;
131  }
132} {1 {cannot modify v2 because it is a view}}
133do_test view-2.4 {
134  catchsql {
135    DELETE FROM v2;
136  }
137} {1 {cannot modify v2 because it is a view}}
138do_test view-2.5 {
139  execsql {
140    INSERT INTO t1 VALUES(11,12,13,14);
141    SELECT * FROM v2 ORDER BY x;
142  }
143} {7 8 9 10 11 12 13 14}
144do_test view-2.6 {
145  execsql {
146    SELECT x FROM v2 WHERE a>10
147  }
148} {11}
149
150# Test that column name of views are generated correctly.
151#
152do_test view-3.1 {
153  execsql2 {
154    SELECT * FROM v1 LIMIT 1
155  }
156} {a 2 b 3}
157do_test view-3.2 {
158  execsql2 {
159    SELECT * FROM v2 LIMIT 1
160  }
161} {x 7 a 8 b 9 c 10}
162do_test view-3.3.1 {
163  execsql2 {
164    DROP VIEW v1;
165    CREATE VIEW v1 AS SELECT a AS 'xyz', b+c AS 'pqr', c-b FROM t1;
166    SELECT * FROM v1 LIMIT 1
167  }
168} {xyz 2 pqr 7 c-b 1}
169do_test view-3.3.2 {
170  execsql2 {
171    CREATE VIEW v1b AS SELECT t1.a, b+c, t1.c FROM t1;
172    SELECT * FROM v1b LIMIT 1
173  }
174} {a 2 b+c 7 c 4}
175do_test view-3.3.3 {
176  execsql2 {
177    CREATE VIEW v1c(x,y,z) AS SELECT a, b+c, c-b FROM t1;
178    SELECT * FROM v1c LIMIT 1;
179  }
180} {x 2 y 7 z 1}
181do_catchsql_test view-3.3.4 {
182  CREATE VIEW v1err(x,y DESC,z) AS SELECT a, b+c, c-b FROM t1;
183} {1 {syntax error after column name "y"}}
184do_catchsql_test view-3.3.5 {
185  DROP VIEW IF EXISTS v1err;
186  CREATE VIEW v1err(x,y) AS SELECT a, b+c, c-b FROM t1;
187  SELECT * FROM v1err;
188} {1 {expected 2 columns for 'v1err' but got 3}}
189do_catchsql_test view-3.3.6 {
190  DROP VIEW IF EXISTS v1err;
191  CREATE VIEW v1err(w,x,y,z) AS SELECT a, b+c, c-b FROM t1;
192  SELECT * FROM v1err;
193} {1 {expected 4 columns for 'v1err' but got 3}}
194
195ifcapable compound {
196do_test  view-3.4 {
197  execsql2 {
198    CREATE VIEW v3 AS SELECT a FROM t1 UNION SELECT b FROM t1 ORDER BY b;
199    SELECT * FROM v3 LIMIT 4;
200  }
201} {a 2 a 3 a 5 a 6}
202do_test view-3.5 {
203  execsql2 {
204    CREATE VIEW v4 AS
205      SELECT a, b FROM t1
206      UNION
207      SELECT b AS 'x', a AS 'y' FROM t1
208      ORDER BY x, y;
209    SELECT b FROM v4 ORDER BY b LIMIT 4;
210  }
211} {b 2 b 3 b 5 b 6}
212} ;# ifcapable compound
213
214
215do_test view-4.1 {
216  catchsql {
217    DROP VIEW t1;
218  }
219} {1 {use DROP TABLE to delete table t1}}
220do_test view-4.2 {
221  execsql {
222    SELECT 1 FROM t1 LIMIT 1;
223  }
224} 1
225do_test view-4.3 {
226  catchsql {
227    DROP TABLE v1;
228  }
229} {1 {use DROP VIEW to delete view v1}}
230do_test view-4.4 {
231  execsql {
232     SELECT 1 FROM v1 LIMIT 1;
233  }
234} {1}
235do_test view-4.5 {
236  catchsql {
237    CREATE INDEX i1v1 ON v1(xyz);
238  }
239} {1 {views may not be indexed}}
240
241do_test view-5.1 {
242  execsql {
243    CREATE TABLE t2(y,a);
244    INSERT INTO t2 VALUES(22,2);
245    INSERT INTO t2 VALUES(33,3);
246    INSERT INTO t2 VALUES(44,4);
247    INSERT INTO t2 VALUES(55,5);
248    SELECT * FROM t2;
249  }
250} {22 2 33 3 44 4 55 5}
251do_test view-5.2 {
252  execsql {
253    CREATE VIEW v5 AS
254      SELECT t1.x AS v, t2.y AS w FROM t1 JOIN t2 USING(a);
255    SELECT * FROM v5;
256  }
257} {1 22 4 55}
258
259# Verify that the view v5 gets flattened.  see sqliteFlattenSubquery().
260# This will only work if EXPLAIN is enabled.
261# Ticket #272
262#
263ifcapable {explain} {
264do_test view-5.3 {
265  lsearch [execsql {
266    EXPLAIN SELECT * FROM v5;
267  }] OpenEphemeral
268} {-1}
269do_test view-5.4 {
270  execsql {
271    SELECT * FROM v5 AS a, t2 AS b WHERE a.w=b.y;
272  }
273} {1 22 22 2 4 55 55 5}
274do_test view-5.5 {
275  lsearch [execsql {
276    EXPLAIN SELECT * FROM v5 AS a, t2 AS b WHERE a.w=b.y;
277  }] OpenEphemeral
278} {-1}
279do_test view-5.6 {
280  execsql {
281    SELECT * FROM t2 AS b, v5 AS a WHERE a.w=b.y;
282  }
283} {22 2 1 22 55 5 4 55}
284do_test view-5.7 {
285  lsearch [execsql {
286    EXPLAIN SELECT * FROM t2 AS b, v5 AS a WHERE a.w=b.y;
287  }] OpenEphemeral
288} {-1}
289do_test view-5.8 {
290  execsql {
291    SELECT * FROM t1 AS a, v5 AS b, t2 AS c WHERE a.x=b.v AND b.w=c.y;
292  }
293} {1 2 3 4 1 22 22 2 4 5 6 7 4 55 55 5}
294do_test view-5.9 {
295  lsearch [execsql {
296    EXPLAIN SELECT * FROM t1 AS a, v5 AS b, t2 AS c WHERE a.x=b.v AND b.w=c.y;
297  }] OpenEphemeral
298} {-1}
299} ;# endif explain
300
301do_test view-6.1 {
302  execsql {
303    SELECT min(x), min(a), min(b), min(c), min(a+b+c) FROM v2;
304  }
305} {7 8 9 10 27}
306do_test view-6.2 {
307  execsql {
308    SELECT max(x), max(a), max(b), max(c), max(a+b+c) FROM v2;
309  }
310} {11 12 13 14 39}
311
312do_test view-7.1 {
313  execsql {
314    CREATE TABLE test1(id integer primary key, a);
315    CREATE TABLE test2(id integer, b);
316    INSERT INTO test1 VALUES(1,2);
317    INSERT INTO test2 VALUES(1,3);
318    CREATE VIEW test AS
319      SELECT test1.id, a, b
320      FROM test1 JOIN test2 ON test2.id=test1.id;
321    SELECT * FROM test;
322  }
323} {1 2 3}
324do_test view-7.2 {
325  db close
326  sqlite3 db test.db
327  execsql {
328    SELECT * FROM test;
329  }
330} {1 2 3}
331do_test view-7.3 {
332  execsql {
333    DROP VIEW test;
334    CREATE VIEW test AS
335      SELECT test1.id, a, b
336      FROM test1 JOIN test2 USING(id);
337    SELECT * FROM test;
338  }
339} {1 2 3}
340do_test view-7.4 {
341  db close
342  sqlite3 db test.db
343  execsql {
344    SELECT * FROM test;
345  }
346} {1 2 3}
347do_test view-7.5 {
348  execsql {
349    DROP VIEW test;
350    CREATE VIEW test AS
351      SELECT test1.id, a, b
352      FROM test1 NATURAL JOIN test2;
353    SELECT * FROM test;
354  }
355} {1 2 3}
356do_test view-7.6 {
357  db close
358  sqlite3 db test.db
359  execsql {
360    SELECT * FROM test;
361  }
362} {1 2 3}
363
364do_test view-8.1 {
365  execsql {
366    CREATE VIEW v6 AS SELECT pqr, xyz FROM v1;
367    SELECT * FROM v6 ORDER BY xyz;
368  }
369} {7 2 13 5 19 8 27 12}
370do_test view-8.2 {
371  db close
372  sqlite3 db test.db
373  execsql {
374    SELECT * FROM v6 ORDER BY xyz;
375  }
376} {7 2 13 5 19 8 27 12}
377do_test view-8.3 {
378  execsql {
379    CREATE VIEW v7(a) AS SELECT pqr+xyz FROM v6;
380    SELECT * FROM v7 ORDER BY a;
381  }
382} {9 18 27 39}
383
384ifcapable subquery {
385  do_test view-8.4 {
386    execsql {
387      CREATE VIEW v8 AS SELECT max(cnt) AS mx FROM
388        (SELECT a%2 AS eo, count(*) AS cnt FROM t1 GROUP BY eo);
389      SELECT * FROM v8;
390    }
391  } 3
392  do_test view-8.5 {
393    execsql {
394      SELECT mx+10, mx*2 FROM v8;
395    }
396  } {13 6}
397  do_test view-8.6 {
398    execsql {
399      SELECT mx+10, pqr FROM v6, v8 WHERE xyz=2;
400    }
401  } {13 7}
402  do_test view-8.7 {
403    execsql {
404      SELECT mx+10, pqr FROM v6, v8 WHERE xyz>2;
405    }
406  } {13 13 13 19 13 27}
407} ;# ifcapable subquery
408
409# Tests for a bug found by Michiel de Wit involving ORDER BY in a VIEW.
410#
411do_test view-9.1 {
412  execsql {
413    INSERT INTO t2 SELECT * FROM t2 WHERE a<5;
414    INSERT INTO t2 SELECT * FROM t2 WHERE a<4;
415    INSERT INTO t2 SELECT * FROM t2 WHERE a<3;
416    SELECT DISTINCT count(*) FROM t2 GROUP BY a ORDER BY 1;
417  }
418} {1 2 4 8}
419do_test view-9.2 {
420  execsql {
421    SELECT DISTINCT count(*) FROM t2 GROUP BY a ORDER BY 1 LIMIT 3;
422  }
423} {1 2 4}
424do_test view-9.3 {
425  execsql {
426    CREATE VIEW v9 AS
427       SELECT DISTINCT count(*) FROM t2 GROUP BY a ORDER BY 1 LIMIT 3;
428    SELECT * FROM v9;
429  }
430} {1 2 4}
431do_test view-9.4 {
432  execsql {
433    SELECT * FROM v9 ORDER BY 1 DESC;
434  }
435} {4 2 1}
436do_test view-9.5 {
437  execsql {
438    CREATE VIEW v10 AS
439       SELECT DISTINCT a, count(*) FROM t2 GROUP BY a ORDER BY 2 LIMIT 3;
440    SELECT * FROM v10;
441  }
442} {5 1 4 2 3 4}
443do_test view-9.6 {
444  execsql {
445    SELECT * FROM v10 ORDER BY 1;
446  }
447} {3 4 4 2 5 1}
448
449# Tables with columns having peculiar quoted names used in views
450# Ticket #756.
451#
452do_test view-10.1 {
453  execsql {
454    CREATE TABLE t3("9" integer, [4] text);
455    INSERT INTO t3 VALUES(1,2);
456    CREATE VIEW v_t3_a AS SELECT a.[9] FROM t3 AS a;
457    CREATE VIEW v_t3_b AS SELECT "4" FROM t3;
458    SELECT * FROM v_t3_a;
459  }
460} {1}
461do_test view-10.2 {
462  execsql {
463    SELECT * FROM v_t3_b;
464  }
465} {2}
466
467do_test view-11.1 {
468  execsql {
469    CREATE TABLE t4(a COLLATE NOCASE);
470    INSERT INTO t4 VALUES('This');
471    INSERT INTO t4 VALUES('this');
472    INSERT INTO t4 VALUES('THIS');
473    SELECT * FROM t4 WHERE a = 'THIS';
474  }
475} {This this THIS}
476ifcapable subquery {
477  do_test view-11.2 {
478    execsql {
479      SELECT * FROM (SELECT * FROM t4) WHERE a = 'THIS';
480    }
481  } {This this THIS}
482}
483do_test view-11.3 {
484  execsql {
485    CREATE VIEW v11 AS SELECT * FROM t4;
486    SELECT * FROM v11 WHERE a = 'THIS';
487  }
488} {This this THIS}
489
490# Ticket #1270:  Do not allow parameters in view definitions.
491#
492do_test view-12.1 {
493  catchsql {
494    CREATE VIEW v12 AS SELECT a FROM t1 WHERE b=?
495  }
496} {1 {parameters are not allowed in views}}
497do_test view-12.2 {
498  catchsql {
499    CREATE VIEW v12(x) AS SELECT a FROM t1 WHERE b=?
500  }
501} {1 {parameters are not allowed in views}}
502
503ifcapable attach {
504  do_test view-13.1 {
505    forcedelete test2.db
506    catchsql {
507      ATTACH 'test2.db' AS two;
508      CREATE TABLE two.t2(x,y);
509      CREATE VIEW v13 AS SELECT y FROM two.t2;
510    }
511  } {1 {view v13 cannot reference objects in database two}}
512}
513
514# Ticket #1658
515#
516do_test view-14.1 {
517  catchsql {
518    CREATE TEMP VIEW t1 AS SELECT a,b FROM t1;
519    SELECT * FROM temp.t1;
520  }
521} {1 {view t1 is circularly defined}}
522do_test view-14.2 {
523  catchsql {
524    DROP VIEW IF EXISTS temp.t1;
525    CREATE TEMP VIEW t1(a,b) AS SELECT a,b FROM t1;
526    SELECT * FROM temp.t1;
527  }
528} {1 {view t1 is circularly defined}}
529
530# Tickets #1688, #1709
531#
532do_test view-15.1 {
533  execsql2 {
534    CREATE VIEW v15 AS SELECT a AS x, b AS y FROM t1;
535    SELECT * FROM v15 LIMIT 1;
536  }
537} {x 2 y 3}
538do_test view-15.2 {
539  execsql2 {
540    SELECT x, y FROM v15 LIMIT 1
541  }
542} {x 2 y 3}
543
544do_test view-16.1 {
545  catchsql {
546    CREATE VIEW IF NOT EXISTS v1 AS SELECT * FROM t1;
547  }
548} {0 {}}
549do_test view-16.2 {
550  execsql {
551    SELECT sql FROM sqlite_master WHERE name='v1'
552  }
553} {{CREATE VIEW v1 AS SELECT a AS 'xyz', b+c AS 'pqr', c-b FROM t1}}
554do_test view-16.3 {
555  catchsql {
556    DROP VIEW IF EXISTS nosuchview
557  }
558} {0 {}}
559
560# correct error message when attempting to drop a view that does not
561# exist.
562#
563do_test view-17.1 {
564  catchsql {
565    DROP VIEW nosuchview
566  }
567} {1 {no such view: nosuchview}}
568do_test view-17.2 {
569  catchsql {
570    DROP VIEW main.nosuchview
571  }
572} {1 {no such view: main.nosuchview}}
573
574do_test view-18.1 {
575  execsql {
576    DROP VIEW t1;
577    DROP TABLE t1;
578    CREATE TABLE t1(a, b, c);
579    INSERT INTO t1 VALUES(1, 2, 3);
580    INSERT INTO t1 VALUES(4, 5, 6);
581
582    CREATE VIEW vv1 AS SELECT * FROM t1;
583    CREATE VIEW vv2 AS SELECT * FROM vv1;
584    CREATE VIEW vv3 AS SELECT * FROM vv2;
585    CREATE VIEW vv4 AS SELECT * FROM vv3;
586    CREATE VIEW vv5 AS SELECT * FROM vv4;
587
588    SELECT * FROM vv5;
589  }
590} {1 2 3 4 5 6}
591
592# Ticket #3308
593# Make sure "rowid" columns in a view are named correctly.
594#
595do_test view-19.1 {
596  execsql {
597    CREATE VIEW v3308a AS SELECT rowid, * FROM t1;
598  }
599  execsql2 {
600    SELECT * FROM v3308a
601  }
602} {rowid 1 a 1 b 2 c 3 rowid 2 a 4 b 5 c 6}
603do_test view-19.2 {
604  execsql {
605    CREATE VIEW v3308b AS SELECT t1.rowid, t1.a, t1.b+t1.c FROM t1;
606  }
607  execsql2 {
608    SELECT * FROM v3308b
609  }
610} {rowid 1 a 1 t1.b+t1.c 5 rowid 2 a 4 t1.b+t1.c 11}
611do_test view-19.3 {
612  execsql {
613    CREATE VIEW v3308c AS SELECT t1.oid, A, t1.b+t1.c AS x FROM t1;
614  }
615  execsql2 {
616    SELECT * FROM v3308c
617  }
618} {rowid 1 a 1 x 5 rowid 2 a 4 x 11}
619
620# Ticket #3539 had this crashing (see commit [5940]).
621do_test view-20.1 {
622  execsql {
623    DROP TABLE IF EXISTS t1;
624    DROP VIEW IF EXISTS v1;
625    CREATE TABLE t1(c1);
626    CREATE VIEW v1 AS SELECT c1 FROM (SELECT t1.c1 FROM t1);
627  }
628} {}
629
630# Ticket [d58ccbb3f1b]: Prevent Table.nRef overflow.
631db close
632sqlite3 db :memory:
633do_test view-21.1 {
634  catchsql {
635    CREATE TABLE t1(x);
636    INSERT INTO t1 VALUES(5);
637    CREATE VIEW v1 AS SELECT x*2 FROM t1;
638    CREATE VIEW v2 AS SELECT * FROM v1 UNION SELECT * FROM v1;
639    CREATE VIEW v4 AS SELECT * FROM v2 UNION SELECT * FROM v2;
640    CREATE VIEW v8 AS SELECT * FROM v4 UNION SELECT * FROM v4;
641    CREATE VIEW v16 AS SELECT * FROM v8 UNION SELECT * FROM v8;
642    CREATE VIEW v32 AS SELECT * FROM v16 UNION SELECT * FROM v16;
643    CREATE VIEW v64 AS SELECT * FROM v32 UNION SELECT * FROM v32;
644    CREATE VIEW v128 AS SELECT * FROM v64 UNION SELECT * FROM v64;
645    CREATE VIEW v256 AS SELECT * FROM v128 UNION SELECT * FROM v128;
646    CREATE VIEW v512 AS SELECT * FROM v256 UNION SELECT * FROM v256;
647    CREATE VIEW v1024 AS SELECT * FROM v512 UNION SELECT * FROM v512;
648    CREATE VIEW v2048 AS SELECT * FROM v1024 UNION SELECT * FROM v1024;
649    CREATE VIEW v4096 AS SELECT * FROM v2048 UNION SELECT * FROM v2048;
650    CREATE VIEW v8192 AS SELECT * FROM v4096 UNION SELECT * FROM v4096;
651    CREATE VIEW v16384 AS SELECT * FROM v8192 UNION SELECT * FROM v8192;
652    CREATE VIEW v32768 AS SELECT * FROM v16384 UNION SELECT * FROM v16384;
653    SELECT * FROM v32768 UNION SELECT * FROM v32768;
654  }
655} {1 {too many references to "v1": max 65535}}
656ifcapable progress {
657  do_test view-21.2 {
658    db progress 1000 {expr 1}
659    catchsql {
660      SELECT * FROM v32768;
661    }
662  } {1 interrupted}
663}
664
665db close
666sqlite3 db :memory:
667do_execsql_test view-22.1 {
668  CREATE VIEW x1 AS SELECT 123 AS '', 234 AS '', 345 AS '';
669  SELECT * FROM x1;
670} {123 234 345}
671do_test view-22.2 {
672  unset -nocomplain x
673  db eval {SELECT * FROM x1} x break
674  lsort [array names x]
675} {{} * :1 :2}
676
677do_test view-25.1 {
678  db eval {
679    CREATE TABLE t25 (x);
680    INSERT INTO t25 (x) VALUES (1);
681    ANALYZE;
682  }
683  proc authLogDelete {code arg1 arg2 arg3 arg4 args} {
684    if {$code=="SQLITE_DELETE" && [string match sqlite_stat* $arg1]} {
685      # lappend ::log [list $code $arg1 $arg2 $arg3 $arg4 $args]
686      lappend ::log [list $code $arg1 $arg2 $arg3 $arg4]
687    }
688    return SQLITE_OK
689  }
690  set log ""
691  db authorizer ::authLogDelete
692  db eval {DROP VIEW x1;}
693  set log
694} {}
695
696set res [list {SQLITE_DELETE sqlite_stat1 {} main {}}]
697ifcapable stat4 { lappend res {SQLITE_DELETE sqlite_stat4 {} main {}} }
698do_test view-25.2 {
699  set log ""
700  db eval {DROP TABLE t25;}
701  set log
702} $res
703
704finish_test
705