PageRenderTime 54ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 1ms

/test/sqllimits1.test

https://bitbucket.org/aware/sqlite
Unknown | 844 lines | 786 code | 58 blank | 0 comment | 0 complexity | 8565878193ac18f3d2478b1738e325a4 MD5 | raw file
  1. # 2007 May 8
  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. #
  12. # This file contains tests to verify that the limits defined in
  13. # sqlite source file limits.h are enforced.
  14. #
  15. # $Id:$
  16. set testdir [file dirname $argv0]
  17. source $testdir/tester.tcl
  18. # Verify that the default per-connection limits are the same as
  19. # the compile-time hard limits.
  20. #
  21. sqlite3 db2 :memory:
  22. do_test sqllimits1-1.1 {
  23. sqlite3_limit db SQLITE_LIMIT_LENGTH -1
  24. } $SQLITE_MAX_LENGTH
  25. do_test sqllimits1-1.2 {
  26. sqlite3_limit db SQLITE_LIMIT_SQL_LENGTH -1
  27. } $SQLITE_MAX_SQL_LENGTH
  28. do_test sqllimits1-1.3 {
  29. sqlite3_limit db SQLITE_LIMIT_COLUMN -1
  30. } $SQLITE_MAX_COLUMN
  31. do_test sqllimits1-1.4 {
  32. sqlite3_limit db SQLITE_LIMIT_EXPR_DEPTH -1
  33. } $SQLITE_MAX_EXPR_DEPTH
  34. do_test sqllimits1-1.5 {
  35. sqlite3_limit db SQLITE_LIMIT_COMPOUND_SELECT -1
  36. } $SQLITE_MAX_COMPOUND_SELECT
  37. do_test sqllimits1-1.6 {
  38. sqlite3_limit db SQLITE_LIMIT_VDBE_OP -1
  39. } $SQLITE_MAX_VDBE_OP
  40. do_test sqllimits1-1.7 {
  41. sqlite3_limit db SQLITE_LIMIT_FUNCTION_ARG -1
  42. } $SQLITE_MAX_FUNCTION_ARG
  43. do_test sqllimits1-1.8 {
  44. sqlite3_limit db SQLITE_LIMIT_ATTACHED -1
  45. } $SQLITE_MAX_ATTACHED
  46. do_test sqllimits1-1.9 {
  47. sqlite3_limit db SQLITE_LIMIT_LIKE_PATTERN_LENGTH -1
  48. } $SQLITE_MAX_LIKE_PATTERN_LENGTH
  49. do_test sqllimits1-1.10 {
  50. sqlite3_limit db SQLITE_LIMIT_VARIABLE_NUMBER -1
  51. } $SQLITE_MAX_VARIABLE_NUMBER
  52. # Limit parameters out of range.
  53. #
  54. do_test sqllimits1-1.20 {
  55. sqlite3_limit db SQLITE_LIMIT_TOOSMALL 123
  56. } {-1}
  57. do_test sqllimits1-1.21 {
  58. sqlite3_limit db SQLITE_LIMIT_TOOSMALL 123
  59. } {-1}
  60. do_test sqllimits1-1.22 {
  61. sqlite3_limit db SQLITE_LIMIT_TOOBIG 123
  62. } {-1}
  63. do_test sqllimits1-1.23 {
  64. sqlite3_limit db SQLITE_LIMIT_TOOBIG 123
  65. } {-1}
  66. # Decrease all limits by half. Verify that the new limits take.
  67. #
  68. if {$SQLITE_MAX_LENGTH>=2} {
  69. do_test sqllimits1-2.1.1 {
  70. sqlite3_limit db SQLITE_LIMIT_LENGTH \
  71. [expr {$::SQLITE_MAX_LENGTH/2}]
  72. } $SQLITE_MAX_LENGTH
  73. do_test sqllimits1-2.1.2 {
  74. sqlite3_limit db SQLITE_LIMIT_LENGTH -1
  75. } [expr {$SQLITE_MAX_LENGTH/2}]
  76. }
  77. if {$SQLITE_MAX_SQL_LENGTH>=2} {
  78. do_test sqllimits1-2.2.1 {
  79. sqlite3_limit db SQLITE_LIMIT_SQL_LENGTH \
  80. [expr {$::SQLITE_MAX_SQL_LENGTH/2}]
  81. } $SQLITE_MAX_SQL_LENGTH
  82. do_test sqllimits1-2.2.2 {
  83. sqlite3_limit db SQLITE_LIMIT_SQL_LENGTH -1
  84. } [expr {$SQLITE_MAX_SQL_LENGTH/2}]
  85. }
  86. if {$SQLITE_MAX_COLUMN>=2} {
  87. do_test sqllimits1-2.3.1 {
  88. sqlite3_limit db SQLITE_LIMIT_COLUMN \
  89. [expr {$::SQLITE_MAX_COLUMN/2}]
  90. } $SQLITE_MAX_COLUMN
  91. do_test sqllimits1-2.3.2 {
  92. sqlite3_limit db SQLITE_LIMIT_COLUMN -1
  93. } [expr {$SQLITE_MAX_COLUMN/2}]
  94. }
  95. if {$SQLITE_MAX_EXPR_DEPTH>=2} {
  96. do_test sqllimits1-2.4.1 {
  97. sqlite3_limit db SQLITE_LIMIT_EXPR_DEPTH \
  98. [expr {$::SQLITE_MAX_EXPR_DEPTH/2}]
  99. } $SQLITE_MAX_EXPR_DEPTH
  100. do_test sqllimits1-2.4.2 {
  101. sqlite3_limit db SQLITE_LIMIT_EXPR_DEPTH -1
  102. } [expr {$SQLITE_MAX_EXPR_DEPTH/2}]
  103. }
  104. if {$SQLITE_MAX_COMPOUND_SELECT>=2} {
  105. do_test sqllimits1-2.5.1 {
  106. sqlite3_limit db SQLITE_LIMIT_COMPOUND_SELECT \
  107. [expr {$::SQLITE_MAX_COMPOUND_SELECT/2}]
  108. } $SQLITE_MAX_COMPOUND_SELECT
  109. do_test sqllimits1-2.5.2 {
  110. sqlite3_limit db SQLITE_LIMIT_COMPOUND_SELECT -1
  111. } [expr {$SQLITE_MAX_COMPOUND_SELECT/2}]
  112. }
  113. if {$SQLITE_MAX_VDBE_OP>=2} {
  114. do_test sqllimits1-2.6.1 {
  115. sqlite3_limit db SQLITE_LIMIT_VDBE_OP \
  116. [expr {$::SQLITE_MAX_VDBE_OP/2}]
  117. } $SQLITE_MAX_VDBE_OP
  118. do_test sqllimits1-2.6.2 {
  119. sqlite3_limit db SQLITE_LIMIT_VDBE_OP -1
  120. } [expr {$SQLITE_MAX_VDBE_OP/2}]
  121. }
  122. if {$SQLITE_MAX_FUNCTION_ARG>=2} {
  123. do_test sqllimits1-2.7.1 {
  124. sqlite3_limit db SQLITE_LIMIT_FUNCTION_ARG \
  125. [expr {$::SQLITE_MAX_FUNCTION_ARG/2}]
  126. } $SQLITE_MAX_FUNCTION_ARG
  127. do_test sqllimits1-2.7.2 {
  128. sqlite3_limit db SQLITE_LIMIT_FUNCTION_ARG -1
  129. } [expr {$SQLITE_MAX_FUNCTION_ARG/2}]
  130. }
  131. if {$SQLITE_MAX_ATTACHED>=2} {
  132. do_test sqllimits1-2.8.1 {
  133. sqlite3_limit db SQLITE_LIMIT_ATTACHED \
  134. [expr {$::SQLITE_MAX_ATTACHED/2}]
  135. } $SQLITE_MAX_ATTACHED
  136. do_test sqllimits1-2.8.2 {
  137. sqlite3_limit db SQLITE_LIMIT_ATTACHED -1
  138. } [expr {$SQLITE_MAX_ATTACHED/2}]
  139. }
  140. if {$SQLITE_MAX_LIKE_PATTERN_LENGTH>=2} {
  141. do_test sqllimits1-2.9.1 {
  142. sqlite3_limit db SQLITE_LIMIT_LIKE_PATTERN_LENGTH \
  143. [expr {$::SQLITE_MAX_LIKE_PATTERN_LENGTH/2}]
  144. } $SQLITE_MAX_LIKE_PATTERN_LENGTH
  145. do_test sqllimits1-2.9.2 {
  146. sqlite3_limit db SQLITE_LIMIT_LIKE_PATTERN_LENGTH -1
  147. } [expr {$SQLITE_MAX_LIKE_PATTERN_LENGTH/2}]
  148. }
  149. if {$SQLITE_MAX_VARIABLE_NUMBER>=2} {
  150. do_test sqllimits1-2.10.1 {
  151. sqlite3_limit db SQLITE_LIMIT_VARIABLE_NUMBER \
  152. [expr {$::SQLITE_MAX_VARIABLE_NUMBER/2}]
  153. } $SQLITE_MAX_VARIABLE_NUMBER
  154. do_test sqllimits1-2.10.2 {
  155. sqlite3_limit db SQLITE_LIMIT_VARIABLE_NUMBER -1
  156. } [expr {$SQLITE_MAX_VARIABLE_NUMBER/2}]
  157. }
  158. # In a separate database connection, verify that the limits are unchanged.
  159. #
  160. do_test sqllimits1-3.1 {
  161. sqlite3_limit db2 SQLITE_LIMIT_LENGTH -1
  162. } $SQLITE_MAX_LENGTH
  163. do_test sqllimits1-3.2 {
  164. sqlite3_limit db2 SQLITE_LIMIT_SQL_LENGTH -1
  165. } $SQLITE_MAX_SQL_LENGTH
  166. do_test sqllimits1-3.3 {
  167. sqlite3_limit db2 SQLITE_LIMIT_COLUMN -1
  168. } $SQLITE_MAX_COLUMN
  169. do_test sqllimits1-3.4 {
  170. sqlite3_limit db2 SQLITE_LIMIT_EXPR_DEPTH -1
  171. } $SQLITE_MAX_EXPR_DEPTH
  172. do_test sqllimits1-3.5 {
  173. sqlite3_limit db2 SQLITE_LIMIT_COMPOUND_SELECT -1
  174. } $SQLITE_MAX_COMPOUND_SELECT
  175. do_test sqllimits1-3.6 {
  176. sqlite3_limit db2 SQLITE_LIMIT_VDBE_OP -1
  177. } $SQLITE_MAX_VDBE_OP
  178. do_test sqllimits1-3.7 {
  179. sqlite3_limit db2 SQLITE_LIMIT_FUNCTION_ARG -1
  180. } $SQLITE_MAX_FUNCTION_ARG
  181. do_test sqllimits1-3.8 {
  182. sqlite3_limit db2 SQLITE_LIMIT_ATTACHED -1
  183. } $SQLITE_MAX_ATTACHED
  184. do_test sqllimits1-3.9 {
  185. sqlite3_limit db2 SQLITE_LIMIT_LIKE_PATTERN_LENGTH -1
  186. } $SQLITE_MAX_LIKE_PATTERN_LENGTH
  187. do_test sqllimits1-3.10 {
  188. sqlite3_limit db2 SQLITE_LIMIT_VARIABLE_NUMBER -1
  189. } $SQLITE_MAX_VARIABLE_NUMBER
  190. db2 close
  191. # Attempt to set all limits to the maximum 32-bit integer. Verify
  192. # that the limit does not exceed the compile-time upper bound.
  193. #
  194. do_test sqllimits1-4.1.1 {
  195. sqlite3_limit db SQLITE_LIMIT_LENGTH 0x7fffffff
  196. sqlite3_limit db SQLITE_LIMIT_LENGTH -1
  197. } $SQLITE_MAX_LENGTH
  198. do_test sqllimits1-4.2.1 {
  199. sqlite3_limit db SQLITE_LIMIT_SQL_LENGTH 0x7fffffff
  200. sqlite3_limit db SQLITE_LIMIT_SQL_LENGTH -1
  201. } $SQLITE_MAX_SQL_LENGTH
  202. do_test sqllimits1-4.3.1 {
  203. sqlite3_limit db SQLITE_LIMIT_COLUMN 0x7fffffff
  204. sqlite3_limit db SQLITE_LIMIT_COLUMN -1
  205. } $SQLITE_MAX_COLUMN
  206. do_test sqllimits1-4.4.1 {
  207. sqlite3_limit db SQLITE_LIMIT_EXPR_DEPTH 0x7fffffff
  208. sqlite3_limit db SQLITE_LIMIT_EXPR_DEPTH -1
  209. } $SQLITE_MAX_EXPR_DEPTH
  210. do_test sqllimits1-4.5.1 {
  211. sqlite3_limit db SQLITE_LIMIT_COMPOUND_SELECT 0x7fffffff
  212. sqlite3_limit db SQLITE_LIMIT_COMPOUND_SELECT -1
  213. } $SQLITE_MAX_COMPOUND_SELECT
  214. do_test sqllimits1-4.6.1 {
  215. sqlite3_limit db SQLITE_LIMIT_VDBE_OP 0x7fffffff
  216. sqlite3_limit db SQLITE_LIMIT_VDBE_OP -1
  217. } $SQLITE_MAX_VDBE_OP
  218. do_test sqllimits1-4.7.1 {
  219. sqlite3_limit db SQLITE_LIMIT_FUNCTION_ARG 0x7fffffff
  220. sqlite3_limit db SQLITE_LIMIT_FUNCTION_ARG -1
  221. } $SQLITE_MAX_FUNCTION_ARG
  222. do_test sqllimits1-4.8.1 {
  223. sqlite3_limit db SQLITE_LIMIT_ATTACHED 0x7fffffff
  224. sqlite3_limit db SQLITE_LIMIT_ATTACHED -1
  225. } $SQLITE_MAX_ATTACHED
  226. do_test sqllimits1-4.9.1 {
  227. sqlite3_limit db SQLITE_LIMIT_LIKE_PATTERN_LENGTH 0x7fffffff
  228. sqlite3_limit db SQLITE_LIMIT_LIKE_PATTERN_LENGTH -1
  229. } $SQLITE_MAX_LIKE_PATTERN_LENGTH
  230. do_test sqllimits1-4.10.1 {
  231. sqlite3_limit db SQLITE_LIMIT_VARIABLE_NUMBER 0x7fffffff
  232. sqlite3_limit db SQLITE_LIMIT_VARIABLE_NUMBER -1
  233. } $SQLITE_MAX_VARIABLE_NUMBER
  234. #--------------------------------------------------------------------
  235. # Test cases sqllimits1-5.* test that the SQLITE_MAX_LENGTH limit
  236. # is enforced.
  237. #
  238. db close
  239. sqlite3 db test.db
  240. set LARGESIZE 99999
  241. set SQLITE_LIMIT_LENGTH 100000
  242. sqlite3_limit db SQLITE_LIMIT_LENGTH $SQLITE_LIMIT_LENGTH
  243. do_test sqllimits1-5.1.1 {
  244. catchsql { SELECT randomblob(2147483647) }
  245. } {1 {string or blob too big}}
  246. do_test sqllimits1-5.1.2 {
  247. catchsql { SELECT zeroblob(2147483647) }
  248. } {1 {string or blob too big}}
  249. do_test sqllimits1-5.2 {
  250. catchsql { SELECT LENGTH(randomblob($::LARGESIZE)) }
  251. } [list 0 $LARGESIZE]
  252. do_test sqllimits1-5.3 {
  253. catchsql { SELECT quote(randomblob($::LARGESIZE)) }
  254. } {1 {string or blob too big}}
  255. do_test sqllimits1-5.4 {
  256. catchsql { SELECT LENGTH(zeroblob($::LARGESIZE)) }
  257. } [list 0 $LARGESIZE]
  258. do_test sqllimits1-5.5 {
  259. catchsql { SELECT quote(zeroblob($::LARGESIZE)) }
  260. } {1 {string or blob too big}}
  261. do_test sqllimits1-5.6 {
  262. catchsql { SELECT zeroblob(-1) }
  263. } {0 {{}}}
  264. do_test sqllimits1-5.9 {
  265. set ::str [string repeat A 65537]
  266. set ::rep [string repeat B 65537]
  267. catchsql { SELECT replace($::str, 'A', $::rep) }
  268. } {1 {string or blob too big}}
  269. do_test sqllimits1-5.10 {
  270. set ::str [string repeat %J 2100]
  271. catchsql { SELECT strftime($::str, '2003-10-31') }
  272. } {1 {string or blob too big}}
  273. do_test sqllimits1-5.11 {
  274. set ::str1 [string repeat A [expr {$SQLITE_LIMIT_LENGTH - 10}]]
  275. set ::str2 [string repeat B [expr {$SQLITE_LIMIT_LENGTH - 10}]]
  276. catchsql { SELECT $::str1 || $::str2 }
  277. } {1 {string or blob too big}}
  278. do_test sqllimits1-5.12 {
  279. set ::str1 [string repeat ' [expr {$SQLITE_LIMIT_LENGTH - 10}]]
  280. catchsql { SELECT quote($::str1) }
  281. } {1 {string or blob too big}}
  282. do_test sqllimits1-5.13 {
  283. set ::str1 [string repeat ' [expr {$SQLITE_LIMIT_LENGTH - 10}]]
  284. catchsql { SELECT hex($::str1) }
  285. } {1 {string or blob too big}}
  286. do_test sqllimits1-5.14.1 {
  287. set ::STMT [sqlite3_prepare db "SELECT ?" -1 TAIL]
  288. sqlite3_bind_zeroblob $::STMT 1 [expr {$SQLITE_LIMIT_LENGTH + 1}]
  289. } {}
  290. do_test sqllimits1-5.14.2 {
  291. sqlite3_step $::STMT
  292. } {SQLITE_ERROR}
  293. do_test sqllimits1-5.14.3 {
  294. sqlite3_reset $::STMT
  295. } {SQLITE_TOOBIG}
  296. do_test sqllimits1-5.14.4 {
  297. set np1 [expr {$SQLITE_LIMIT_LENGTH + 1}]
  298. set ::str1 [string repeat A $np1]
  299. catch {sqlite3_bind_text $::STMT 1 $::str1 -1} res
  300. set res
  301. } {SQLITE_TOOBIG}
  302. ifcapable utf16 {
  303. do_test sqllimits1-5.14.5 {
  304. catch {sqlite3_bind_text16 $::STMT 1 $::str1 -1} res
  305. set res
  306. } {SQLITE_TOOBIG}
  307. }
  308. do_test sqllimits1-5.14.6 {
  309. catch {sqlite3_bind_text $::STMT 1 $::str1 $np1} res
  310. set res
  311. } {SQLITE_TOOBIG}
  312. ifcapable utf16 {
  313. do_test sqllimits1-5.14.7 {
  314. catch {sqlite3_bind_text16 $::STMT 1 $::str1 $np1} res
  315. set res
  316. } {SQLITE_TOOBIG}
  317. }
  318. do_test sqllimits1-5.14.8 {
  319. set n [expr {$np1-1}]
  320. catch {sqlite3_bind_text $::STMT 1 $::str1 $n} res
  321. set res
  322. } {}
  323. do_test sqllimits1-5.14.9 {
  324. catch {sqlite3_bind_text16 $::STMT 1 $::str1 $n} res
  325. set res
  326. } {}
  327. sqlite3_finalize $::STMT
  328. do_test sqllimits1-5.15 {
  329. execsql {
  330. CREATE TABLE t4(x);
  331. INSERT INTO t4 VALUES(1);
  332. INSERT INTO t4 VALUES(2);
  333. INSERT INTO t4 SELECT 2+x FROM t4;
  334. }
  335. catchsql {
  336. SELECT group_concat(hex(randomblob(20000))) FROM t4;
  337. }
  338. } {1 {string or blob too big}}
  339. db eval {DROP TABLE t4}
  340. sqlite3_limit db SQLITE_LIMIT_SQL_LENGTH 0x7fffffff
  341. set strvalue [string repeat A $::SQLITE_LIMIT_LENGTH]
  342. do_test sqllimits1-5.16 {
  343. catchsql "SELECT '$strvalue'"
  344. } [list 0 $strvalue]
  345. do_test sqllimits1-5.17.1 {
  346. catchsql "SELECT 'A$strvalue'"
  347. } [list 1 {string or blob too big}]
  348. do_test sqllimits1-5.17.2 {
  349. sqlite3_limit db SQLITE_LIMIT_LENGTH 0x7fffffff
  350. catchsql {SELECT 'A' || $::strvalue}
  351. } [list 0 A$strvalue]
  352. do_test sqllimits1-5.17.3 {
  353. sqlite3_limit db SQLITE_LIMIT_LENGTH $SQLITE_LIMIT_LENGTH
  354. catchsql {SELECT 'A' || $::strvalue}
  355. } [list 1 {string or blob too big}]
  356. set blobvalue [string repeat 41 $::SQLITE_LIMIT_LENGTH]
  357. do_test sqllimits1-5.18 {
  358. catchsql "SELECT x'$blobvalue'"
  359. } [list 0 $strvalue]
  360. do_test sqllimits1-5.19 {
  361. catchsql "SELECT '41$blobvalue'"
  362. } [list 1 {string or blob too big}]
  363. unset blobvalue
  364. ifcapable datetime {
  365. set strvalue [string repeat D [expr {$SQLITE_LIMIT_LENGTH-12}]]
  366. do_test sqllimits1-5.20 {
  367. catchsql {SELECT strftime('%Y ' || $::strvalue, '2008-01-02')}
  368. } [list 0 [list "2008 $strvalue"]]
  369. do_test sqllimits1-5.21 {
  370. catchsql {SELECT strftime('%Y-%m-%d ' || $::strvalue, '2008-01-02')}
  371. } {1 {string or blob too big}}
  372. }
  373. unset strvalue
  374. #--------------------------------------------------------------------
  375. # Test cases sqllimits1-6.* test that the SQLITE_MAX_SQL_LENGTH limit
  376. # is enforced.
  377. #
  378. do_test sqllimits1-6.1 {
  379. sqlite3_limit db SQLITE_LIMIT_SQL_LENGTH 50000
  380. set sql "SELECT 1 WHERE 1==1"
  381. set tail " /* A comment to take up space in order to make the string\
  382. longer without increasing the expression depth */\
  383. AND 1 == 1"
  384. set N [expr {(50000 / [string length $tail])+1}]
  385. append sql [string repeat $tail $N]
  386. catchsql $sql
  387. } {1 {string or blob too big}}
  388. do_test sqllimits1-6.3 {
  389. sqlite3_limit db SQLITE_LIMIT_SQL_LENGTH 50000
  390. set sql "SELECT 1 WHERE 1==1"
  391. set tail " /* A comment to take up space in order to make the string\
  392. longer without increasing the expression depth */\
  393. AND 1 == 1"
  394. set N [expr {(50000 / [string length $tail])+1}]
  395. append sql [string repeat $tail $N]
  396. set nbytes [string length $sql]
  397. append sql { AND 0}
  398. set rc [catch {sqlite3_prepare db $sql $nbytes TAIL} STMT]
  399. lappend rc $STMT
  400. } {1 {(18) statement too long}}
  401. do_test sqllimits1-6.4 {
  402. sqlite3_errmsg db
  403. } {statement too long}
  404. #--------------------------------------------------------------------
  405. # Test cases sqllimits1-7.* test that the limit set using the
  406. # max_page_count pragma.
  407. #
  408. do_test sqllimits1-7.1 {
  409. execsql {
  410. PRAGMA max_page_count = 1000;
  411. }
  412. } {1000}
  413. do_test sqllimits1-7.2 {
  414. execsql { CREATE TABLE trig (a INTEGER, b INTEGER); }
  415. # Set up a tree of triggers to fire when a row is inserted
  416. # into table "trig".
  417. #
  418. # INSERT -> insert_b -> update_b -> insert_a -> update_a (chain 1)
  419. # -> update_a -> insert_a -> update_b (chain 2)
  420. # -> insert_a -> update_b -> insert_b -> update_a (chain 3)
  421. # -> update_a -> insert_b -> update_b (chain 4)
  422. #
  423. # Table starts with N rows.
  424. #
  425. # Chain 1: insert_b (update N rows)
  426. # -> update_b (insert 1 rows)
  427. # -> insert_a (update N rows)
  428. # -> update_a (insert 1 rows)
  429. #
  430. # chains 2, 3 and 4 are similar. Each inserts more than N^2 rows, where
  431. # N is the number of rows at the conclusion of the previous chain.
  432. #
  433. # Therefore, a single insert adds (N^16 plus some) rows to the database.
  434. # A really long loop...
  435. #
  436. execsql {
  437. CREATE TRIGGER update_b BEFORE UPDATE ON trig
  438. FOR EACH ROW BEGIN
  439. INSERT INTO trig VALUES (65, 'update_b');
  440. END;
  441. CREATE TRIGGER update_a AFTER UPDATE ON trig
  442. FOR EACH ROW BEGIN
  443. INSERT INTO trig VALUES (65, 'update_a');
  444. END;
  445. CREATE TRIGGER insert_b BEFORE INSERT ON trig
  446. FOR EACH ROW BEGIN
  447. UPDATE trig SET a = 1;
  448. END;
  449. CREATE TRIGGER insert_a AFTER INSERT ON trig
  450. FOR EACH ROW BEGIN
  451. UPDATE trig SET a = 1;
  452. END;
  453. }
  454. } {}
  455. do_test sqllimits1-7.3 {
  456. execsql {
  457. INSERT INTO trig VALUES (1,1);
  458. }
  459. } {}
  460. do_test sqllimits1-7.4 {
  461. execsql {
  462. SELECT COUNT(*) FROM trig;
  463. }
  464. } {7}
  465. # This tries to insert so many rows it fills up the database (limited
  466. # to 1MB, so not that noteworthy an achievement).
  467. #
  468. do_test sqllimits1-7.5 {
  469. catchsql {
  470. INSERT INTO trig VALUES (1,10);
  471. }
  472. } {1 {database or disk is full}}
  473. do_test sqllimits1-7.6 {
  474. catchsql {
  475. SELECT COUNT(*) FROM trig;
  476. }
  477. } {0 7}
  478. # Now check the response of the library to opening a file larger than
  479. # the current max_page_count value. The response is to change the
  480. # internal max_page_count value to match the actual size of the file.
  481. if {[db eval {PRAGMA auto_vacuum}]} {
  482. set fsize 1700
  483. } else {
  484. set fsize 1691
  485. }
  486. do_test sqllimits1-7.7.1 {
  487. execsql {
  488. PRAGMA max_page_count = 1000000;
  489. CREATE TABLE abc(a, b, c);
  490. INSERT INTO abc VALUES(1, 2, 3);
  491. INSERT INTO abc SELECT a||b||c, b||c||a, c||a||b FROM abc;
  492. INSERT INTO abc SELECT a||b||c, b||c||a, c||a||b FROM abc;
  493. INSERT INTO abc SELECT a||b||c, b||c||a, c||a||b FROM abc;
  494. INSERT INTO abc SELECT a||b||c, b||c||a, c||a||b FROM abc;
  495. INSERT INTO abc SELECT a||b||c, b||c||a, c||a||b FROM abc;
  496. INSERT INTO abc SELECT a||b||c, b||c||a, c||a||b FROM abc;
  497. INSERT INTO abc SELECT a||b||c, b||c||a, c||a||b FROM abc;
  498. INSERT INTO abc SELECT a||b||c, b||c||a, c||a||b FROM abc;
  499. INSERT INTO abc SELECT a, b, c FROM abc;
  500. INSERT INTO abc SELECT b, a, c FROM abc;
  501. INSERT INTO abc SELECT c, b, a FROM abc;
  502. }
  503. expr [file size test.db] / 1024
  504. } $fsize
  505. do_test sqllimits1-7.7.2 {
  506. db close
  507. sqlite3 db test.db
  508. execsql {
  509. PRAGMA max_page_count = 1000;
  510. }
  511. execsql {
  512. SELECT count(*) FROM sqlite_master;
  513. }
  514. } {6}
  515. do_test sqllimits1-7.7.3 {
  516. execsql {
  517. PRAGMA max_page_count;
  518. }
  519. } $fsize
  520. do_test sqllimits1-7.7.4 {
  521. execsql {
  522. DROP TABLE abc;
  523. }
  524. } {}
  525. #--------------------------------------------------------------------
  526. # Test cases sqllimits1-8.* test the SQLITE_MAX_COLUMN limit.
  527. #
  528. set SQLITE_LIMIT_COLUMN 200
  529. sqlite3_limit db SQLITE_LIMIT_COLUMN $SQLITE_LIMIT_COLUMN
  530. do_test sqllimits1-8.1 {
  531. # Columns in a table.
  532. set cols [list]
  533. for {set i 0} {$i <= $SQLITE_LIMIT_COLUMN} {incr i} {
  534. lappend cols "c$i"
  535. }
  536. catchsql "CREATE TABLE t([join $cols ,])"
  537. } {1 {too many columns on t}}
  538. do_test sqllimits1-8.2 {
  539. # Columns in the result-set of a SELECT.
  540. set cols [list]
  541. for {set i 0} {$i <= $SQLITE_LIMIT_COLUMN} {incr i} {
  542. lappend cols "sql AS sql$i"
  543. }
  544. catchsql "SELECT [join $cols ,] FROM sqlite_master"
  545. } {1 {too many columns in result set}}
  546. do_test sqllimits1-8.3 {
  547. # Columns in the result-set of a sub-SELECT.
  548. set cols [list]
  549. for {set i 0} {$i <= $SQLITE_LIMIT_COLUMN} {incr i} {
  550. lappend cols "sql AS sql$i"
  551. }
  552. catchsql "SELECT sql4 FROM (SELECT [join $cols ,] FROM sqlite_master)"
  553. } {1 {too many columns in result set}}
  554. do_test sqllimits1-8.4 {
  555. # Columns in an index.
  556. set cols [list]
  557. for {set i 0} {$i <= $SQLITE_LIMIT_COLUMN} {incr i} {
  558. lappend cols c
  559. }
  560. set sql1 "CREATE TABLE t1(c);"
  561. set sql2 "CREATE INDEX i1 ON t1([join $cols ,]);"
  562. catchsql "$sql1 ; $sql2"
  563. } {1 {too many columns in index}}
  564. do_test sqllimits1-8.5 {
  565. # Columns in a GROUP BY clause.
  566. catchsql "SELECT * FROM t1 GROUP BY [join $cols ,]"
  567. } {1 {too many terms in GROUP BY clause}}
  568. do_test sqllimits1-8.6 {
  569. # Columns in an ORDER BY clause.
  570. catchsql "SELECT * FROM t1 ORDER BY [join $cols ,]"
  571. } {1 {too many terms in ORDER BY clause}}
  572. do_test sqllimits1-8.7 {
  573. # Assignments in an UPDATE statement.
  574. set cols [list]
  575. for {set i 0} {$i <= $SQLITE_LIMIT_COLUMN} {incr i} {
  576. lappend cols "c = 1"
  577. }
  578. catchsql "UPDATE t1 SET [join $cols ,];"
  579. } {1 {too many columns in set list}}
  580. do_test sqllimits1-8.8 {
  581. # Columns in a view definition:
  582. set cols [list]
  583. for {set i 0} {$i <= $SQLITE_LIMIT_COLUMN} {incr i} {
  584. lappend cols "c$i"
  585. }
  586. catchsql "CREATE VIEW v1 AS SELECT [join $cols ,] FROM t1;"
  587. } {1 {too many columns in result set}}
  588. do_test sqllimits1-8.9 {
  589. # Columns in a view definition (testing * expansion):
  590. set cols [list]
  591. for {set i 0} {$i < $SQLITE_LIMIT_COLUMN} {incr i} {
  592. lappend cols "c$i"
  593. }
  594. catchsql "CREATE TABLE t2([join $cols ,])"
  595. catchsql "CREATE VIEW v1 AS SELECT *, c1 AS o FROM t2;"
  596. } {1 {too many columns in result set}}
  597. do_test sqllimits1-8.10 {
  598. # ORDER BY columns
  599. set cols [list]
  600. for {set i 0} {$i <= $SQLITE_LIMIT_COLUMN} {incr i} {
  601. lappend cols c
  602. }
  603. set sql "SELECT c FROM t1 ORDER BY [join $cols ,]"
  604. catchsql $sql
  605. } {1 {too many terms in ORDER BY clause}}
  606. do_test sqllimits1-8.11 {
  607. # ORDER BY columns
  608. set cols [list]
  609. for {set i 0} {$i <= $SQLITE_LIMIT_COLUMN} {incr i} {
  610. lappend cols [expr {$i%3 + 1}]
  611. }
  612. set sql "SELECT c, c+1, c+2 FROM t1 UNION SELECT c-1, c-2, c-3 FROM t1"
  613. append sql " ORDER BY [join $cols ,]"
  614. catchsql $sql
  615. } {1 {too many terms in ORDER BY clause}}
  616. #--------------------------------------------------------------------
  617. # These tests - sqllimits1-9.* - test that the SQLITE_LIMIT_EXPR_DEPTH
  618. # limit is enforced. The limit refers to the number of terms in
  619. # the expression.
  620. #
  621. if {$SQLITE_MAX_EXPR_DEPTH==0} {
  622. puts -nonewline stderr "WARNING: Compile with -DSQLITE_MAX_EXPR_DEPTH to run "
  623. puts stderr "tests sqllimits1-9.X"
  624. } else {
  625. do_test sqllimits1-9.1 {
  626. set max $::SQLITE_MAX_EXPR_DEPTH
  627. set expr "(1 [string repeat {AND 1 } $max])"
  628. catchsql [subst {
  629. SELECT $expr
  630. }]
  631. } "1 {Expression tree is too large (maximum depth $::SQLITE_MAX_EXPR_DEPTH)}"
  632. # Attempting to beat the expression depth limit using nested SELECT
  633. # queries causes a parser stack overflow.
  634. do_test sqllimits1-9.2 {
  635. set max $::SQLITE_MAX_EXPR_DEPTH
  636. set expr "SELECT 1"
  637. for {set i 0} {$i <= $max} {incr i} {
  638. set expr "SELECT ($expr)"
  639. }
  640. catchsql [subst { $expr }]
  641. } "1 {parser stack overflow}"
  642. if 0 {
  643. do_test sqllimits1-9.3 {
  644. execsql {
  645. PRAGMA max_page_count = 1000000; -- 1 GB
  646. CREATE TABLE v0(a);
  647. INSERT INTO v0 VALUES(1);
  648. }
  649. db transaction {
  650. for {set i 1} {$i < 200} {incr i} {
  651. set expr "(a [string repeat {AND 1 } 50]) AS a"
  652. execsql [subst {
  653. CREATE VIEW v${i} AS SELECT $expr FROM v[expr {$i-1}]
  654. }]
  655. }
  656. }
  657. } {}
  658. do_test sqllimits1-9.4 {
  659. catchsql {
  660. SELECT a FROM v199
  661. }
  662. } "1 {Expression tree is too large (maximum depth $::SQLITE_MAX_EXPR_DEPTH)}"
  663. }
  664. }
  665. #--------------------------------------------------------------------
  666. # Test cases sqllimits1-10.* test that the SQLITE_MAX_VDBE_OP
  667. # limit works as expected. The limit refers to the number of opcodes
  668. # in a single VDBE program.
  669. #
  670. # TODO
  671. #--------------------------------------------------------------------
  672. # Test the SQLITE_LIMIT_FUNCTION_ARG limit works. Test case names
  673. # match the pattern "sqllimits1-11.*".
  674. #
  675. for {set max 5} {$max<=$SQLITE_MAX_FUNCTION_ARG} {incr max} {
  676. do_test sqllimits1-11.$max.1 {
  677. set vals [list]
  678. sqlite3_limit db SQLITE_LIMIT_FUNCTION_ARG $::max
  679. for {set i 0} {$i < $::max} {incr i} {
  680. lappend vals $i
  681. }
  682. catchsql "SELECT max([join $vals ,])"
  683. } "0 [expr {$::max - 1}]"
  684. do_test sqllimits1-11.$max.2 {
  685. set vals [list]
  686. for {set i 0} {$i <= $::max} {incr i} {
  687. lappend vals $i
  688. }
  689. catchsql "SELECT max([join $vals ,])"
  690. } {1 {too many arguments on function max}}
  691. # Test that it is SQLite, and not the implementation of the
  692. # user function that is throwing the error.
  693. proc myfunc {args} {error "I don't like to be called!"}
  694. do_test sqllimits1-11.$max.2 {
  695. db function myfunc myfunc
  696. set vals [list]
  697. for {set i 0} {$i <= $::max} {incr i} {
  698. lappend vals $i
  699. }
  700. catchsql "SELECT myfunc([join $vals ,])"
  701. } {1 {too many arguments on function myfunc}}
  702. }
  703. #--------------------------------------------------------------------
  704. # Test cases sqllimits1-12.*: Test the SQLITE_MAX_ATTACHED limit.
  705. #
  706. ifcapable attach {
  707. do_test sqllimits1-12.1 {
  708. set max $::SQLITE_MAX_ATTACHED
  709. for {set i 0} {$i < ($max)} {incr i} {
  710. forcedelete test${i}.db test${i}.db-journal
  711. }
  712. for {set i 0} {$i < ($max)} {incr i} {
  713. execsql "ATTACH 'test${i}.db' AS aux${i}"
  714. }
  715. catchsql "ATTACH 'test${i}.db' AS aux${i}"
  716. } "1 {too many attached databases - max $::SQLITE_MAX_ATTACHED}"
  717. do_test sqllimits1-12.2 {
  718. set max $::SQLITE_MAX_ATTACHED
  719. for {set i 0} {$i < ($max)} {incr i} {
  720. execsql "DETACH aux${i}"
  721. }
  722. } {}
  723. }
  724. #--------------------------------------------------------------------
  725. # Test cases sqllimits1-13.*: Check that the SQLITE_MAX_VARIABLE_NUMBER
  726. # limit works.
  727. #
  728. do_test sqllimits1-13.1 {
  729. set max $::SQLITE_MAX_VARIABLE_NUMBER
  730. catchsql "SELECT ?[expr {$max+1}] FROM t1"
  731. } "1 {variable number must be between ?1 and ?$::SQLITE_MAX_VARIABLE_NUMBER}"
  732. do_test sqllimits1-13.2 {
  733. set max $::SQLITE_MAX_VARIABLE_NUMBER
  734. set vals [list]
  735. for {set i 0} {$i < ($max+3)} {incr i} {
  736. lappend vals ?
  737. }
  738. catchsql "SELECT [join $vals ,] FROM t1"
  739. } "1 {too many SQL variables}"
  740. #--------------------------------------------------------------------
  741. # Test cases sqllimits1-15.* verify that the
  742. # SQLITE_MAX_LIKE_PATTERN_LENGTH limit is enforced. This limit only
  743. # applies to the built-in LIKE operator, supplying an external
  744. # implementation by overriding the like() scalar function bypasses
  745. # this limitation.
  746. #
  747. # These tests check that the limit is not incorrectly applied to
  748. # the left-hand-side of the LIKE operator (the string being tested
  749. # against the pattern).
  750. #
  751. set SQLITE_LIMIT_LIKE_PATTERN 1000
  752. sqlite3_limit db SQLITE_LIMIT_LIKE_PATTERN_LENGTH $SQLITE_LIMIT_LIKE_PATTERN
  753. do_test sqllimits1-15.1 {
  754. set max $::SQLITE_LIMIT_LIKE_PATTERN
  755. set ::pattern [string repeat "A%" [expr $max/2]]
  756. set ::string [string repeat "A" [expr {$max*2}]]
  757. execsql {
  758. SELECT $::string LIKE $::pattern;
  759. }
  760. } {1}
  761. do_test sqllimits1-15.2 {
  762. set max $::SQLITE_LIMIT_LIKE_PATTERN
  763. set ::pattern [string repeat "A%" [expr {($max/2) + 1}]]
  764. set ::string [string repeat "A" [expr {$max*2}]]
  765. catchsql {
  766. SELECT $::string LIKE $::pattern;
  767. }
  768. } {1 {LIKE or GLOB pattern too complex}}
  769. #--------------------------------------------------------------------
  770. # This test case doesn't really belong with the other limits tests.
  771. # It is in this file because it is taxing to run, like the limits tests.
  772. #
  773. do_test sqllimits1-16.1 {
  774. set ::N [expr int(([expr pow(2,32)]/50) + 1)]
  775. expr (($::N*50) & 0xffffffff)<55
  776. } {1}
  777. do_test sqllimits1-16.2 {
  778. set ::format "[string repeat A 60][string repeat "%J" $::N]"
  779. catchsql {
  780. SELECT strftime($::format, 1);
  781. }
  782. } {1 {string or blob too big}}
  783. foreach {key value} [array get saved] {
  784. catch {set $key $value}
  785. }
  786. finish_test