trace.test 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. # 2004 Jun 29
  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.
  12. #
  13. # This file implements tests for the "sqlite3_trace()" API.
  14. #
  15. # $Id: trace.test,v 1.8 2009/04/07 14:14:23 danielk1977 Exp $
  16. set testdir [file dirname $argv0]
  17. source $testdir/tester.tcl
  18. ifcapable !trace {
  19. finish_test
  20. return
  21. }
  22. set ::stmtlist {}
  23. do_test trace-1.1 {
  24. set rc [catch {db trace 1 2 3} msg]
  25. lappend rc $msg
  26. } {1 {wrong # args: should be "db trace ?CALLBACK?"}}
  27. proc trace_proc cmd {
  28. lappend ::stmtlist [string trim $cmd]
  29. }
  30. do_test trace-1.2 {
  31. db trace trace_proc
  32. db trace
  33. } {trace_proc}
  34. do_test trace-1.3 {
  35. execsql {
  36. CREATE TABLE t1(a,b);
  37. INSERT INTO t1 VALUES(1,2);
  38. SELECT * FROM t1;
  39. }
  40. } {1 2}
  41. do_test trace-1.4 {
  42. set ::stmtlist
  43. } {{CREATE TABLE t1(a,b);} {INSERT INTO t1 VALUES(1,2);} {SELECT * FROM t1;}}
  44. do_test trace-1.5 {
  45. db trace {}
  46. db trace
  47. } {}
  48. # If we prepare a statement and execute it multiple times, the trace
  49. # happens on each execution.
  50. #
  51. db close
  52. sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
  53. do_test trace-2.1 {
  54. set STMT [sqlite3_prepare $DB {INSERT INTO t1 VALUES(2,3)} -1 TAIL]
  55. db trace trace_proc
  56. proc trace_proc sql {
  57. global TRACE_OUT
  58. lappend TRACE_OUT [string trim $sql]
  59. }
  60. set TRACE_OUT {}
  61. sqlite3_step $STMT
  62. set TRACE_OUT
  63. } {{INSERT INTO t1 VALUES(2,3)}}
  64. do_test trace-2.2 {
  65. set TRACE_OUT {}
  66. sqlite3_reset $STMT
  67. set TRACE_OUT
  68. } {}
  69. do_test trace-2.3 {
  70. sqlite3_step $STMT
  71. set TRACE_OUT
  72. } {{INSERT INTO t1 VALUES(2,3)}}
  73. do_test trace-2.4 {
  74. set TRACE_OUT {}
  75. execsql {SELECT * FROM t1}
  76. } {1 2 2 3 2 3}
  77. do_test trace-2.5 {
  78. set TRACE_OUT
  79. } {{SELECT * FROM t1}}
  80. catch {sqlite3_finalize $STMT}
  81. do_test trace-2.6 {
  82. set TRACE_OUT {}
  83. db eval VACUUM
  84. set TRACE_OUT
  85. } {VACUUM}
  86. # Similar tests, but this time for profiling.
  87. #
  88. do_test trace-3.1 {
  89. set rc [catch {db profile 1 2 3} msg]
  90. lappend rc $msg
  91. } {1 {wrong # args: should be "db profile ?CALLBACK?"}}
  92. set ::stmtlist {}
  93. proc profile_proc {cmd tm} {
  94. lappend ::stmtlist [string trim $cmd]
  95. }
  96. do_test trace-3.2 {
  97. db trace {}
  98. db profile profile_proc
  99. db profile
  100. } {profile_proc}
  101. do_test trace-3.3 {
  102. execsql {
  103. CREATE TABLE t2(a,b);
  104. INSERT INTO t2 VALUES(1,2);
  105. SELECT * FROM t2;
  106. }
  107. } {1 2}
  108. do_test trace-3.4 {
  109. set ::stmtlist
  110. } {{CREATE TABLE t2(a,b);} {INSERT INTO t2 VALUES(1,2);} {SELECT * FROM t2;}}
  111. do_test trace-3.5 {
  112. db profile {}
  113. db profile
  114. } {}
  115. # If we prepare a statement and execute it multiple times, the profile
  116. # happens on each execution.
  117. #
  118. db close
  119. sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
  120. do_test trace-4.1 {
  121. set STMT [sqlite3_prepare $DB {INSERT INTO t2 VALUES(2,3)} -1 TAIL]
  122. db trace trace_proc
  123. proc profile_proc {sql tm} {
  124. global TRACE_OUT
  125. lappend TRACE_OUT [string trim $sql]
  126. }
  127. set TRACE_OUT {}
  128. sqlite3_step $STMT
  129. set TRACE_OUT
  130. } {{INSERT INTO t2 VALUES(2,3)}}
  131. do_test trace-4.2 {
  132. set TRACE_OUT {}
  133. sqlite3_reset $STMT
  134. set TRACE_OUT
  135. } {}
  136. do_test trace-4.3 {
  137. sqlite3_step $STMT
  138. set TRACE_OUT
  139. } {{INSERT INTO t2 VALUES(2,3)}}
  140. do_test trace-4.4 {
  141. set TRACE_OUT {}
  142. execsql {SELECT * FROM t1}
  143. } {1 2 2 3 2 3}
  144. do_test trace-4.5 {
  145. set TRACE_OUT
  146. } {{SELECT * FROM t1}}
  147. catch {sqlite3_finalize $STMT}
  148. # Trigger tracing.
  149. #
  150. ifcapable trigger {
  151. do_test trace-5.1 {
  152. db eval {
  153. CREATE TRIGGER r1t1 AFTER UPDATE ON t1 BEGIN
  154. UPDATE t2 SET a=new.a WHERE rowid=new.rowid;
  155. END;
  156. CREATE TRIGGER r1t2 AFTER UPDATE ON t2 BEGIN
  157. SELECT 'hello';
  158. END;
  159. }
  160. set TRACE_OUT {}
  161. proc trace_proc cmd {
  162. lappend ::TRACE_OUT [string trim $cmd]
  163. }
  164. db eval {
  165. UPDATE t1 SET a=a+1;
  166. }
  167. set TRACE_OUT
  168. } {{UPDATE t1 SET a=a+1;} {-- TRIGGER r1t1} {-- TRIGGER r1t2} {-- TRIGGER r1t1} {-- TRIGGER r1t2} {-- TRIGGER r1t1} {-- TRIGGER r1t2}}
  169. }
  170. # With 3.6.21, we add the ability to expand host parameters in the trace
  171. # output. Test this feature.
  172. #
  173. do_test trace-6.1 {
  174. set ::t6int [expr {3+3}]
  175. set ::t6real [expr {1.5*4.0}]
  176. set ::t6str {test-six y'all}
  177. db eval {SELECT x'3031323334' AS x} {set ::t6blob $x}
  178. unset -nocomplain t6null
  179. set TRACE_OUT {}
  180. execsql {SELECT $::t6int, $::t6real, $t6str, $t6blob, $t6null}
  181. } {6 6.0 {test-six y'all} 01234 {}}
  182. do_test trace-6.2 {
  183. set TRACE_OUT
  184. } {{SELECT 6, 6.0, 'test-six y''all', x'3031323334', NULL}}
  185. do_test trace-6.3 {
  186. set TRACE_OUT {}
  187. execsql {SELECT $::t6int, ?1, $::t6int}
  188. } {6 6 6}
  189. do_test trace-6.4 {
  190. set TRACE_OUT
  191. } {{SELECT 6, 6, 6}}
  192. do_test trace-6.5 {
  193. execsql {CREATE TABLE t6([$::t6int],"?1"); INSERT INTO t6 VALUES(1,2)}
  194. set TRACE_OUT {}
  195. execsql {SELECT '$::t6int', [$::t6int], $::t6int, ?1, "?1", $::t6int FROM t6}
  196. } {{$::t6int} 1 6 6 2 6}
  197. do_test trace-6.6 {
  198. set TRACE_OUT
  199. } {{SELECT '$::t6int', [$::t6int], 6, 6, "?1", 6 FROM t6}}
  200. # Do these same tests with a UTF16 database.
  201. #
  202. do_test trace-6.100 {
  203. db close
  204. sqlite3 db :memory:
  205. db eval {
  206. PRAGMA encoding=UTF16be;
  207. CREATE TABLE t6([$::t6str],"?1");
  208. INSERT INTO t6 VALUES(1,2);
  209. }
  210. db trace trace_proc
  211. set TRACE_OUT {}
  212. execsql {SELECT '$::t6str', [$::t6str], $::t6str, ?1, "?1", $::t6str FROM t6}
  213. } {{$::t6str} 1 {test-six y'all} {test-six y'all} 2 {test-six y'all}}
  214. do_test trace-6.101 {
  215. set TRACE_OUT
  216. } {{SELECT '$::t6str', [$::t6str], 'test-six y''all', 'test-six y''all', "?1", 'test-six y''all' FROM t6}}
  217. do_test trace-6.200 {
  218. db close
  219. sqlite3 db :memory:
  220. db eval {
  221. PRAGMA encoding=UTF16le;
  222. CREATE TABLE t6([$::t6str],"?1");
  223. INSERT INTO t6 VALUES(1,2);
  224. }
  225. db trace trace_proc
  226. set TRACE_OUT {}
  227. execsql {SELECT '$::t6str', [$::t6str], $::t6str, ?1, "?1", $::t6str FROM t6}
  228. } {{$::t6str} 1 {test-six y'all} {test-six y'all} 2 {test-six y'all}}
  229. do_test trace-6.201 {
  230. set TRACE_OUT
  231. } {{SELECT '$::t6str', [$::t6str], 'test-six y''all', 'test-six y''all', "?1", 'test-six y''all' FROM t6}}
  232. finish_test