main.test 12 KB

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