os/persistentdata/persistentstorage/sqlite3api/TEST/TclScript/main.test
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
     1 # 2001 September 15
     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 exercising the code in main.c.
    13 #
    14 # $Id: main.test,v 1.29 2008/07/12 14:52:20 drh Exp $
    15 
    16 set testdir [file dirname $argv0]
    17 source $testdir/tester.tcl
    18 
    19 # Only do the next group of tests if the sqlite3_complete API is available
    20 #
    21 ifcapable {complete} {
    22 
    23 # Tests of the sqlite_complete() function.
    24 #
    25 do_test main-1.1 {
    26   db complete {This is a test}
    27 } {0}
    28 do_test main-1.2 {
    29   db complete {
    30   }
    31 } {1}
    32 do_test main-1.3 {
    33   db complete {
    34      -- a comment ;
    35   }
    36 } {1}
    37 do_test main-1.4 {
    38   db complete {
    39      -- a comment ;
    40      ;
    41   }
    42 } {1}
    43 do_test main-1.5 {
    44   db complete {DROP TABLE 'xyz;}
    45 } {0}
    46 do_test main-1.6 {
    47   db complete {DROP TABLE 'xyz';}
    48 } {1}
    49 do_test main-1.7 {
    50   db complete {DROP TABLE "xyz;}
    51 } {0}
    52 do_test main-1.8 {
    53   db complete {DROP TABLE "xyz';}
    54 } {0}
    55 do_test main-1.9 {
    56   db complete {DROP TABLE "xyz";}
    57 } {1}
    58 do_test main-1.10 {
    59   db complete {DROP TABLE xyz; hi}
    60 } {0}
    61 do_test main-1.11 {
    62   db complete {DROP TABLE xyz; }
    63 } {1}
    64 do_test main-1.12 {
    65   db complete {DROP TABLE xyz; -- hi }
    66 } {1}
    67 do_test main-1.13 {
    68   db complete {DROP TABLE xyz; -- hi
    69   }
    70 } {1}
    71 do_test main-1.14 {
    72   db complete {SELECT a-b FROM t1; }
    73 } {1}
    74 do_test main-1.15 {
    75   db complete {SELECT a/e FROM t1 }
    76 } {0}
    77 do_test main-1.16 {
    78   db complete {
    79     CREATE TABLE abc(x,y);
    80   }
    81 } {1}
    82 ifcapable {trigger} {
    83   do_test main-1.17 {
    84     db complete {
    85       CREATE TRIGGER xyz AFTER DELETE abc BEGIN UPDATE pqr;
    86     }
    87   } {0}
    88   do_test main-1.18 {
    89     db complete {
    90       CREATE TRIGGER xyz AFTER DELETE abc BEGIN UPDATE pqr; END;
    91     }
    92   } {1}
    93   do_test main-1.19 {
    94     db complete {
    95       CREATE TRIGGER xyz AFTER DELETE abc BEGIN
    96          UPDATE pqr;
    97          unknown command;
    98     }
    99   } {0}
   100   do_test main-1.20 {
   101     db complete {
   102       CREATE TRIGGER xyz AFTER DELETE backend BEGIN
   103          UPDATE pqr;
   104     }
   105   } {0}
   106   do_test main-1.21 {
   107     db complete {
   108       CREATE TRIGGER xyz AFTER DELETE end BEGIN
   109          SELECT a, b FROM end;
   110     }
   111   } {0}
   112   do_test main-1.22 {
   113     db complete {
   114       CREATE TRIGGER xyz AFTER DELETE end BEGIN
   115          SELECT a, b FROM end;
   116       END;
   117     }
   118   } {1}
   119   do_test main-1.23 {
   120     db complete {
   121       CREATE TRIGGER xyz AFTER DELETE end BEGIN
   122          SELECT a, b FROM end;
   123       END;
   124       SELECT a, b FROM end;
   125     }
   126   } {1}
   127   do_test main-1.24 {
   128     db complete {
   129       CREATE TRIGGER xyz AFTER DELETE [;end;] BEGIN
   130          UPDATE pqr;
   131     }
   132   } {0}
   133   do_test main-1.25 {
   134     db complete {
   135       CREATE TRIGGER xyz AFTER DELETE backend BEGIN
   136          UPDATE cantor SET a=[;end;];;;
   137     }
   138   } {0}
   139   do_test main-1.26 {
   140     db complete {
   141       CREATE -- a comment
   142       TRIGGER exy AFTER DELETE backend BEGIN
   143          UPDATE pqr SET a=5;
   144     }
   145   } {0}
   146   do_test main-1.27.1 {
   147     db complete {
   148       CREATE -- a comment
   149       TRIGGERX tangentxx AFTER DELETE backend BEGIN
   150          UPDATE pqr SET a=5;
   151     }
   152   } {1}
   153   do_test main-1.27.2 {
   154     db complete {
   155       CREATE/**/TRIGGER tiger00 AFTER DELETE backend BEGIN
   156          UPDATE pqr SET a=5;
   157     }
   158   } {0}
   159   ifcapable {explain} {
   160     do_test main-1.27.3 {
   161       db complete {
   162         /* */ EXPLAIN -- A comment
   163         CREATE/**/TRIGGER ezxyz12 AFTER DELETE backend BEGIN
   164            UPDATE pqr SET a=5;
   165       }
   166     } {0}
   167   }
   168   do_test main-1.27.4 {
   169     db complete {
   170       BOGUS token
   171       CREATE  TRIGGER xyz AFTER DELETE backend BEGIN
   172          UPDATE pqr SET a=5;
   173     }
   174   } {1}
   175   ifcapable {explain} {
   176     do_test main-1.27.5 {
   177       db complete {
   178         EXPLAIN 
   179         CREATE TEMP TRIGGER xyz AFTER DELETE backend BEGIN
   180            UPDATE pqr SET a=5;
   181       }
   182     } {0}
   183   }
   184   do_test main-1.28 {
   185     db complete {
   186       CREATE TEMPORARY TRIGGER xyz AFTER DELETE backend BEGIN
   187          UPDATE pqr SET a=5;
   188     }
   189   } {0}
   190   do_test main-1.29 {
   191     db complete {
   192       CREATE TRIGGER xyz AFTER DELETE backend BEGIN
   193          UPDATE pqr SET a=5;
   194          EXPLAIN select * from xyz;
   195     }
   196   } {0}
   197 
   198 } ;# end ifcapable {complete}
   199 
   200 }
   201 do_test main-1.30 {
   202   db complete {
   203      CREATE TABLE /* In comment ; */
   204   }
   205 } {0}
   206 do_test main-1.31 {
   207   db complete {
   208      CREATE TABLE /* In comment ; */ hi;
   209   }
   210 } {1}
   211 do_test main-1.31 {
   212   db complete {
   213      CREATE TABLE /* In comment ; */;
   214   }
   215 } {1}
   216 do_test main-1.32 {
   217   db complete {
   218      stuff;
   219      /*
   220        CREATE TABLE
   221        multiple lines
   222        of text
   223      */
   224   }
   225 } {1}
   226 do_test main-1.33 {
   227   db complete {
   228      /*
   229        CREATE TABLE
   230        multiple lines
   231        of text;
   232   }
   233 } {0}
   234 do_test main-1.34 {
   235   db complete {
   236      /*
   237        CREATE TABLE
   238        multiple lines "*/
   239        of text;
   240   }
   241 } {1}
   242 do_test main-1.35 {
   243   db complete {hi /**/ there;}
   244 } {1}
   245 do_test main-1.36 {
   246   db complete {hi there/***/;}
   247 } {1}
   248 do_test main-1.37 {
   249   db complete {hi there/**}
   250 } {0}
   251 do_test main-1.38 {
   252   db complete {hi [there}
   253 } {0}
   254 
   255 ifcapable {trigger} {
   256   # Characters less than \040 can never be part of an identifier.
   257   # Characters greater than \u177 are always identifier characters.
   258   do_test main-1.100 {
   259     db complete "create \037\036\035\034trigger\001\002;"
   260   } {1}
   261   do_test main-1.101 {
   262     db complete "create trigger\200;"
   263   } {1}
   264   do_test main-1.102 {
   265     db complete "create \200trigger;"
   266   } {1}
   267 }
   268 
   269 
   270 # Try to open a database with a corrupt database file.
   271 #
   272 do_test main-2.0 {
   273   catch {db close}
   274   file delete -force test.db
   275   set fd [open test.db w]
   276   puts $fd hi!
   277   close $fd
   278   set v [catch {sqlite3 db test.db} msg]
   279   if {$v} {lappend v $msg} {lappend v {}}
   280 } {0 {}}
   281 
   282 # Here are some tests for tokenize.c.  
   283 #
   284 do_test main-3.1 {
   285   catch {db close}
   286   foreach f [glob -nocomplain testdb/*] {file delete -force $f}
   287   file delete -force testdb
   288   sqlite3 db testdb
   289   set v [catch {execsql {SELECT * from T1 where x!!5}} msg]
   290   lappend v $msg
   291 } {1 {unrecognized token: "!!"}}
   292 do_test main-3.2 {
   293   catch {db close}
   294   foreach f [glob -nocomplain testdb/*] {file delete -force $f}
   295   file delete -force testdb
   296   sqlite3 db testdb
   297   set v [catch {execsql {SELECT * from T1 where ^x}} msg]
   298   lappend v $msg
   299 } {1 {unrecognized token: "^"}}
   300 do_test main-3.2.2 {
   301   catchsql {select 'abc}
   302 } {1 {unrecognized token: "'abc"}}
   303 do_test main-3.2.3 {
   304   catchsql {select "abc}
   305 } {1 {unrecognized token: ""abc"}}
   306 do_test main-3.2.4 {
   307   catchsql {select [abc}
   308 } {1 {unrecognized token: "[abc"}}
   309 do_test main-3.2.5 {
   310   catchsql {select x'4869}
   311 } {1 {unrecognized token: "x'4869"}}
   312 do_test main-3.2.6 {
   313   catchsql {select x'4869'}
   314 } {0 Hi}
   315 do_test main-3.2.7 {
   316   catchsql {select x'48695'}
   317 } {1 {unrecognized token: "x'48695'"}}
   318 do_test main-3.2.8 {
   319   catchsql {select x'486x'}
   320 } {1 {unrecognized token: "x'486x'"}}
   321 do_test main-3.2.9 {
   322   catchsql {select $abc(}
   323 } {1 {unrecognized token: "$abc("}}
   324 do_test main-3.2.10 {
   325   catchsql {select $abc(x}
   326 } {1 {unrecognized token: "$abc(x"}}
   327 set xyz 123
   328 do_test main-3.2.11 {
   329   catchsql {select $::xyz}
   330 } {0 123}
   331 namespace eval ::testnamespace {
   332   variable xyz 321
   333 }
   334 do_test main-3.2.12 {
   335   catchsql {select $testnamespace::xyz}
   336 } {0 321}
   337 do_test main-3.2.13 {
   338   catchsql {select $(abc)}
   339 } {1 {unrecognized token: "$"}}
   340 do_test main-3.2.14 {
   341   set hi\u1234x 987
   342   db eval "select \$hi\u1234x"
   343 } {987}
   344 do_test main-3.2.15 {
   345   catchsql "select 456\u1234"
   346 } [list 1 "unrecognized token: \"456\u1234\""]
   347 do_test main-3.2.16 {
   348   catchsql {select cast(3.14e+4 AS integer)}
   349 } {0 31400}
   350 do_test main-3.2.17 {
   351   catchsql {select cast(3.14e+04 AS integer)}
   352 } {0 31400}
   353 do_test main-3.2.18 {
   354   catchsql {select cast(3.14e+004 AS integer)}
   355 } {0 31400}
   356 do_test main-3.2.19 {
   357   catchsql {select cast(3.14e4 AS integer)}
   358 } {0 31400}
   359 do_test main-3.2.20 {
   360   catchsql {select cast(3.14e04 AS integer)}
   361 } {0 31400}
   362 do_test main-3.2.21 {
   363   catchsql {select cast(3.14e004 AS integer)}
   364 } {0 31400}
   365 do_test main-3.2.16 {
   366   catchsql {select cast(3.14E+4 AS integer)}
   367 } {0 31400}
   368 do_test main-3.2.17 {
   369   catchsql {select cast(3.14E+04 AS integer)}
   370 } {0 31400}
   371 do_test main-3.2.18 {
   372   catchsql {select cast(3.14E+004 AS integer)}
   373 } {0 31400}
   374 do_test main-3.2.19 {
   375   catchsql {select cast(3.14E4 AS integer)}
   376 } {0 31400}
   377 do_test main-3.2.20 {
   378   catchsql {select cast(3.14E04 AS integer)}
   379 } {0 31400}
   380 do_test main-3.2.21 {
   381   catchsql {select cast(3.14E004 AS integer)}
   382 } {0 31400}
   383 do_test main-3.2.22 {
   384   catchsql {select cast(3.14e-4 * 1e8 AS integer)}
   385 } {0 31400}
   386 do_test main-3.2.23 {
   387   catchsql {select cast(3.14E-04 * 1E08 AS integer)}
   388 } {0 31400}
   389 do_test main-3.2.24 {
   390   catchsql {select cast(3.14e-004 * 01.0E+8 AS integer)}
   391 } {0 31400}
   392 do_test main-3.2.25 {
   393   catchsql {select 123/*abc}
   394 } {0 123}
   395 do_test main-3.2.26 {
   396   catchsql {select 123/***abc}
   397 } {0 123}
   398 do_test main-3.2.27 {
   399   catchsql {select 123/*/*2}
   400 } {0 123}
   401 do_test main-3.2.28 {
   402   catchsql {select 123/**/*2}
   403 } {0 246}
   404 do_test main-3.2.29 {
   405   catchsql {select 123/}
   406 } {1 {near "/": syntax error}}
   407 do_test main-3.2.30 {
   408   catchsql {select 123--5}
   409 } {0 123}
   410 
   411 
   412 do_test main-3.3 {
   413   catch {db close}
   414   foreach f [glob -nocomplain testdb/*] {file delete -force $f}
   415   file delete -force testdb
   416   sqlite3 db testdb
   417   execsql {
   418     create table T1(X REAL);  /* C-style comments allowed */
   419     insert into T1 values(0.5);
   420     insert into T1 values(0.5e2);
   421     insert into T1 values(0.5e-002);
   422     insert into T1 values(5e-002);
   423     insert into T1 values(-5.0e-2);
   424     insert into T1 values(-5.1e-2);
   425     insert into T1 values(0.5e2);
   426     insert into T1 values(0.5E+02);
   427     insert into T1 values(5E+02);
   428     insert into T1 values(5.0E+03);
   429     select x*10 from T1 order by x*5;
   430   }
   431 } {-0.51 -0.5 0.05 0.5 5.0 500.0 500.0 500.0 5000.0 50000.0}
   432 do_test main-3.4 {
   433   set v [catch {execsql {create bogus}} msg]
   434   lappend v $msg
   435 } {1 {near "bogus": syntax error}}
   436 do_test main-3.5 {
   437   set v [catch {execsql {create}} msg]
   438   lappend v $msg
   439 } {1 {near "create": syntax error}}
   440 do_test main-3.6 {
   441   catchsql {SELECT 'abc' + #9}
   442 } {1 {near "#9": syntax error}}
   443 
   444 # The following test-case tests the linked list code used to manage
   445 # sqlite3_vfs structures.
   446 if {$::tcl_platform(platform)=="unix"} {
   447   ifcapable threadsafe {
   448     do_test main-4.1 {
   449 
   450       sqlite3_crash_enable 1
   451       sqlite3_crash_enable 0
   452     
   453       sqlite3async_enable 1
   454       sqlite3async_enable 0
   455     
   456       sqlite3_crash_enable 1
   457       sqlite3async_enable 1
   458       sqlite3_crash_enable 0
   459       sqlite3async_enable 0
   460     
   461       sqlite3_crash_enable 1
   462       sqlite3async_enable 1
   463       sqlite3async_enable 0
   464       sqlite3_crash_enable 0
   465     
   466       sqlite3async_enable 1
   467       sqlite3_crash_enable 1
   468       sqlite3_crash_enable 0
   469       sqlite3async_enable 0
   470     
   471       sqlite3async_enable 1
   472       sqlite3_crash_enable 1
   473       sqlite3async_enable 0
   474       sqlite3_crash_enable 0
   475     } {}
   476     do_test main-4.2 {
   477       set rc [catch {sqlite3 db test.db -vfs crash} msg]
   478       list $rc $msg
   479     } {1 {no such vfs: crash}}
   480     do_test main-4.3 {
   481       set rc [catch {sqlite3 db test.db -vfs async} msg]
   482       list $rc $msg
   483     } {1 {no such vfs: async}}
   484   }
   485 }
   486 
   487 finish_test