Documentation Source Text

Hex Artifact Content
Login

Artifact ba79894437257a8d684e97cf224e0f56efc690f3902831af962d1292d1a4b233:


0000: 3c 74 69 74 6c 65 3e 54 68 65 20 55 73 65 20 4f  <title>The Use O
0010: 66 20 61 73 73 65 72 74 28 29 20 49 6e 20 53 51  f assert() In SQ
0020: 4c 69 74 65 3c 2f 74 69 74 6c 65 3e 0a 3c 74 63  Lite</title>.<tc
0030: 6c 3e 68 64 5f 6b 65 79 77 6f 72 64 73 20 7b 54  l>hd_keywords {T
0040: 68 65 20 55 73 65 20 4f 66 20 61 73 73 65 72 74  he Use Of assert
0050: 28 29 20 49 6e 20 53 51 4c 69 74 65 7d 3c 2f 74  () In SQLite}</t
0060: 63 6c 3e 0a 0a 3c 74 61 62 6c 65 5f 6f 66 5f 63  cl>..<table_of_c
0070: 6f 6e 74 65 6e 74 73 3e 0a 0a 3c 68 31 3e 41 73  ontents>..<h1>As
0080: 73 65 72 74 28 29 20 41 6e 64 20 53 69 6d 69 6c  sert() And Simil
0090: 61 72 20 4d 61 63 72 6f 73 20 49 6e 20 53 51 4c  ar Macros In SQL
00a0: 69 74 65 3c 2f 68 31 3e 0a 0a 3c 70 3e 0a 54 68  ite</h1>..<p>.Th
00b0: 65 20 61 73 73 65 72 74 28 58 29 20 6d 61 63 72  e assert(X) macr
00c0: 6f 20 69 73 20 0a 5b 68 74 74 70 73 3a 2f 2f 65  o is .[https://e
00d0: 6e 2e 77 69 6b 69 70 65 64 69 61 2e 6f 72 67 2f  n.wikipedia.org/
00e0: 77 69 6b 69 2f 41 73 73 65 72 74 2e 68 7c 70 61  wiki/Assert.h|pa
00f0: 72 74 20 6f 66 20 73 74 61 6e 64 61 72 64 20 43  rt of standard C
0100: 5d 2c 20 69 6e 20 74 68 65 0a 26 6c 74 3b 61 73  ], in the.&lt;as
0110: 73 65 72 74 2e 68 26 67 74 3b 20 68 65 61 64 65  sert.h&gt; heade
0120: 72 20 66 69 6c 65 2e 0a 53 51 4c 69 74 65 20 61  r file..SQLite a
0130: 64 64 73 20 74 68 72 65 65 20 6f 74 68 65 72 20  dds three other 
0140: 61 73 73 65 72 74 28 29 2d 6c 69 6b 65 20 6d 61  assert()-like ma
0150: 63 72 6f 73 20 6e 61 6d 65 64 20 4e 45 56 45 52  cros named NEVER
0160: 28 58 29 2c 20 41 4c 57 41 59 53 28 58 29 2c 0a  (X), ALWAYS(X),.
0170: 61 6e 64 20 74 65 73 74 63 61 73 65 28 58 29 2e  and testcase(X).
0180: 0a 0a 3c 75 6c 3e 0a 3c 6c 69 3e 3c 70 3e 3c 62  ..<ul>.<li><p><b
0190: 3e 61 73 73 65 72 74 28 58 29 3c 2f 62 3e 20 26  >assert(X)</b> &
01a0: 72 61 72 72 3b 0a 54 68 65 20 61 73 73 65 72 74  rarr;.The assert
01b0: 28 58 29 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  (X) statement in
01c0: 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
01d0: 20 63 6f 6e 64 69 74 69 6f 6e 20 58 20 69 73 20   condition X is 
01e0: 61 6c 77 61 79 73 20 74 72 75 65 2e 0a 49 6e 20  always true..In 
01f0: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 58 20 69  other words, X i
0200: 73 20 61 6e 20 69 6e 76 61 72 69 61 6e 74 2e 20  s an invariant. 
0210: 20 54 68 65 20 61 73 73 65 72 74 28 58 29 20 6d   The assert(X) m
0220: 61 63 72 6f 20 77 6f 72 6b 73 20 6c 69 6b 65 20  acro works like 
0230: 61 0a 70 72 6f 63 65 64 75 72 65 20 69 6e 20 74  a.procedure in t
0240: 68 61 74 20 69 74 20 68 61 73 20 6e 6f 20 72 65  hat it has no re
0250: 74 75 72 6e 20 76 61 6c 75 65 2e 0a 0a 3c 6c 69  turn value...<li
0260: 3e 3c 70 3e 3c 62 3e 41 4c 57 41 59 53 28 58 29  ><p><b>ALWAYS(X)
0270: 3c 2f 62 3e 20 26 72 61 72 72 3b 0a 54 68 65 20  </b> &rarr;.The 
0280: 41 4c 57 41 59 53 28 58 29 20 66 75 6e 63 74 69  ALWAYS(X) functi
0290: 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  on indicates tha
02a0: 74 20 63 6f 6e 64 69 74 69 6f 6e 20 58 20 69 73  t condition X is
02b0: 20 61 6c 77 61 79 73 20 74 72 75 65 20 61 73 20   always true as 
02c0: 66 61 72 0a 61 73 20 74 68 65 20 64 65 76 65 6c  far.as the devel
02d0: 6f 70 65 72 73 20 6b 6e 6f 77 2c 20 62 75 74 20  opers know, but 
02e0: 74 68 65 72 65 20 69 73 20 6e 6f 20 70 72 6f 6f  there is no proo
02f0: 66 20 74 68 65 20 58 20 69 73 20 74 72 75 65 2c  f the X is true,
0300: 20 6f 72 20 74 68 65 0a 70 72 6f 6f 66 20 69 73   or the.proof is
0310: 20 63 6f 6d 70 6c 65 78 20 61 6e 64 20 65 72 72   complex and err
0320: 6f 72 2d 70 72 6f 6e 65 2c 20 6f 72 20 74 68 65  or-prone, or the
0330: 20 70 72 6f 6f 66 20 64 65 70 65 6e 64 73 20 6f   proof depends o
0340: 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  n implementation
0350: 0a 64 65 74 61 69 6c 73 20 74 68 61 74 20 61 72  .details that ar
0360: 65 20 6c 69 6b 65 6c 79 20 74 6f 20 63 68 61 6e  e likely to chan
0370: 67 65 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  ge in the future
0380: 2e 20 20 41 4c 57 41 59 53 28 58 29 20 62 65 68  .  ALWAYS(X) beh
0390: 61 76 65 73 20 6c 69 6b 65 0a 61 20 66 75 6e 63  aves like.a func
03a0: 74 69 6f 6e 20 74 68 61 74 20 72 65 74 75 72 6e  tion that return
03b0: 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 76 61  s the boolean va
03c0: 6c 75 65 20 58 2c 20 61 6e 64 20 69 73 20 69 6e  lue X, and is in
03d0: 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65  tended to be use
03e0: 64 0a 77 69 74 68 69 6e 20 74 68 65 20 63 6f 6e  d.within the con
03f0: 64 69 74 69 6f 6e 61 6c 20 6f 66 20 61 6e 20 22  ditional of an "
0400: 69 66 22 20 73 74 61 74 65 6d 65 6e 74 2e 0a 0a  if" statement...
0410: 3c 6c 69 3e 3c 70 3e 3c 62 3e 4e 45 56 45 52 28  <li><p><b>NEVER(
0420: 58 29 3c 2f 62 3e 20 26 72 61 72 72 3b 0a 54 68  X)</b> &rarr;.Th
0430: 65 20 4e 45 56 45 52 28 58 29 20 66 75 6e 63 74  e NEVER(X) funct
0440: 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68  ion indicates th
0450: 61 74 20 63 6f 6e 64 69 74 69 6f 6e 20 58 20 69  at condition X i
0460: 73 20 6e 65 76 65 72 20 74 72 75 65 2e 20 20 54  s never true.  T
0470: 68 69 73 0a 69 73 20 74 68 65 20 6e 65 67 61 74  his.is the negat
0480: 69 76 65 20 61 6e 61 6c 6f 67 20 6f 66 20 74 68  ive analog of th
0490: 65 20 41 4c 57 41 59 53 28 58 29 20 66 75 6e 63  e ALWAYS(X) func
04a0: 74 69 6f 6e 2e 0a 0a 3c 6c 69 3e 3c 70 3e 3c 62  tion...<li><p><b
04b0: 3e 74 65 73 74 63 61 73 65 28 58 29 3c 2f 62 3e  >testcase(X)</b>
04c0: 20 26 72 61 72 72 3b 0a 54 68 65 20 74 65 73 74   &rarr;.The test
04d0: 63 61 73 65 28 58 29 20 73 74 61 74 65 6d 65 6e  case(X) statemen
04e0: 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  t indicates that
04f0: 20 58 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20   X is sometimes 
0500: 74 72 75 65 20 61 6e 64 20 73 6f 6d 65 74 69 6d  true and sometim
0510: 65 73 0a 66 61 6c 73 65 2e 20 20 49 6e 20 6f 74  es.false.  In ot
0520: 68 65 72 20 77 6f 72 64 73 2c 20 74 65 73 74 63  her words, testc
0530: 61 73 65 28 58 29 20 69 6e 64 69 63 61 74 65 73  ase(X) indicates
0540: 20 74 68 61 74 20 58 20 69 73 20 64 65 66 69 6e   that X is defin
0550: 69 74 65 6c 79 20 6e 6f 74 20 61 6e 0a 69 6e 76  itely not an.inv
0560: 61 72 69 61 6e 74 2e 20 20 53 69 6e 63 65 20 53  ariant.  Since S
0570: 51 4c 69 74 65 20 75 73 65 73 20 31 30 30 25 20  QLite uses 100% 
0580: 5b 4d 43 2f 44 43 20 74 65 73 74 69 6e 67 5d 2c  [MC/DC testing],
0590: 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66   the presence of
05a0: 20 61 0a 74 65 73 74 63 61 73 65 28 58 29 20 6d   a.testcase(X) m
05b0: 61 63 72 6f 20 69 6e 64 69 63 61 74 65 73 20 74  acro indicates t
05c0: 68 61 74 20 6e 6f 74 20 6f 6e 6c 79 20 69 73 20  hat not only is 
05d0: 69 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  it possible for 
05e0: 58 20 74 6f 20 62 65 20 65 69 74 68 65 72 0a 74  X to be either.t
05f0: 72 75 65 20 6f 72 20 66 61 6c 73 65 2c 20 62 75  rue or false, bu
0600: 74 20 74 68 65 72 65 20 61 72 65 20 74 65 73 74  t there are test
0610: 20 63 61 73 65 73 20 74 6f 20 64 65 6d 6f 6e 73   cases to demons
0620: 74 72 61 74 65 20 74 68 69 73 2e 0a 3c 2f 75 6c  trate this..</ul
0630: 3e 0a 0a 3c 70 3e 0a 53 51 4c 69 74 65 20 76 65  >..<p>.SQLite ve
0640: 72 73 69 6f 6e 20 33 2e 32 32 2e 30 20 28 5b 64  rsion 3.22.0 ([d
0650: 61 74 65 6f 66 3a 33 2e 32 32 2e 30 5d 29 20 63  ateof:3.22.0]) c
0660: 6f 6e 74 61 69 6e 73 20 35 32 39 30 20 61 73 73  ontains 5290 ass
0670: 65 72 74 28 29 20 6d 61 63 72 6f 73 2c 0a 38 33  ert() macros,.83
0680: 39 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63  9 testcase() mac
0690: 72 6f 73 2c 20 38 38 20 41 4c 57 41 59 53 28 29  ros, 88 ALWAYS()
06a0: 20 6d 61 63 72 6f 73 2c 20 61 6e 64 20 36 33 20   macros, and 63 
06b0: 4e 45 56 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a  NEVER() macros..
06c0: 0a 3c 68 32 3e 50 68 69 6c 6f 73 6f 70 68 79 20  .<h2>Philosophy 
06d0: 6f 66 20 61 73 73 65 72 74 28 29 3c 2f 68 32 3e  of assert()</h2>
06e0: 0a 0a 3c 70 3e 49 6e 20 53 51 4c 69 74 65 2c 20  ..<p>In SQLite, 
06f0: 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20  the presence of 
0700: 61 73 73 65 72 74 28 58 29 20 6d 65 61 6e 73 20  assert(X) means 
0710: 74 68 61 74 20 74 68 65 20 64 65 76 65 6c 6f 70  that the develop
0720: 65 72 73 20 68 61 76 65 0a 61 20 70 72 6f 6f 66  ers have.a proof
0730: 20 74 68 61 74 20 58 20 69 73 20 61 6c 77 61 79   that X is alway
0740: 73 20 74 72 75 65 2e 20 20 52 65 61 64 65 72 73  s true.  Readers
0750: 20 63 61 6e 20 64 65 70 65 6e 64 20 75 70 6f 6e   can depend upon
0760: 20 58 20 62 65 69 6e 67 20 74 72 75 65 20 74 6f   X being true to
0770: 0a 68 65 6c 70 20 74 68 65 6d 20 72 65 61 73 6f  .help them reaso
0780: 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f 64 65  n about the code
0790: 2e 20 20 41 6e 20 61 73 73 65 72 74 28 58 29 20  .  An assert(X) 
07a0: 69 73 20 61 20 73 74 72 6f 6e 67 20 73 74 61 74  is a strong stat
07b0: 65 6d 65 6e 74 0a 61 62 6f 75 74 20 74 68 65 20  ement.about the 
07c0: 74 72 75 74 68 20 6f 66 20 58 2e 20 20 54 68 65  truth of X.  The
07d0: 72 65 20 69 73 20 6e 6f 20 64 6f 75 62 74 2e 0a  re is no doubt..
07e0: 0a 3c 70 3e 54 68 65 20 41 4c 57 41 59 53 28 58  .<p>The ALWAYS(X
07f0: 29 20 61 6e 64 20 4e 45 56 45 52 28 58 29 20 6d  ) and NEVER(X) m
0800: 61 63 72 6f 73 20 61 72 65 20 61 20 77 65 61 6b  acros are a weak
0810: 65 72 20 73 74 61 74 65 6d 65 6e 74 20 61 62 6f  er statement abo
0820: 75 74 20 74 68 65 0a 74 72 75 74 68 20 6f 66 20  ut the.truth of 
0830: 58 2e 20 20 54 68 65 20 70 72 65 73 65 6e 63 65  X.  The presence
0840: 20 6f 66 20 41 4c 57 41 59 53 28 58 29 20 6f 72   of ALWAYS(X) or
0850: 20 4e 45 56 45 52 28 58 29 20 6d 65 61 6e 73 20   NEVER(X) means 
0860: 74 68 61 74 20 74 68 65 20 64 65 76 65 6c 6f 70  that the develop
0870: 65 72 73 0a 62 65 6c 69 65 76 65 20 58 20 69 73  ers.believe X is
0880: 20 61 6c 77 61 79 73 20 6f 72 20 6e 65 76 65 72   always or never
0890: 20 74 72 75 65 2c 20 62 75 74 20 74 68 65 72 65   true, but there
08a0: 20 69 73 20 6e 6f 20 70 72 6f 6f 66 2c 20 6f 72   is no proof, or
08b0: 20 74 68 65 20 70 72 6f 6f 66 0a 69 73 20 63 6f   the proof.is co
08c0: 6d 70 6c 65 78 20 61 6e 64 20 65 72 72 6f 72 2d  mplex and error-
08d0: 70 72 6f 6e 65 2c 20 6f 72 20 74 68 65 20 70 72  prone, or the pr
08e0: 6f 6f 66 20 64 65 70 65 6e 64 73 20 6f 6e 20 6f  oof depends on o
08f0: 74 68 65 72 20 61 73 70 65 63 74 73 20 0a 6f 66  ther aspects .of
0900: 20 74 68 65 20 73 79 73 74 65 6d 20 74 68 61 74   the system that
0910: 20 73 65 65 6d 20 6c 69 6b 65 6c 79 20 74 6f 20   seem likely to 
0920: 63 68 61 6e 67 65 2e 0a 0a 3c 70 3e 4f 74 68 65  change...<p>Othe
0930: 72 20 73 79 73 74 65 6d 73 20 73 6f 6d 65 74 69  r systems someti
0940: 6d 65 73 20 75 73 65 20 61 73 73 65 72 74 28 58  mes use assert(X
0950: 29 20 69 6e 20 61 20 77 61 79 20 74 68 61 74 20  ) in a way that 
0960: 69 73 0a 73 69 6d 69 6c 61 72 20 74 6f 20 74 68  is.similar to th
0970: 65 20 75 73 65 20 6f 66 20 41 4c 57 41 59 53 28  e use of ALWAYS(
0980: 58 29 20 6f 72 20 4e 45 56 45 52 28 58 29 20 69  X) or NEVER(X) i
0990: 6e 20 53 51 4c 69 74 65 2e 0a 44 65 76 65 6c 6f  n SQLite..Develo
09a0: 70 65 72 73 20 77 69 6c 6c 20 61 64 64 20 61 6e  pers will add an
09b0: 20 61 73 73 65 72 74 28 58 29 20 61 73 20 61 20   assert(X) as a 
09c0: 0a 5b 68 74 74 70 73 3a 2f 2f 62 6c 6f 67 2e 72  .[https://blog.r
09d0: 65 67 65 68 72 2e 6f 72 67 2f 61 72 63 68 69 76  egehr.org/archiv
09e0: 65 73 2f 31 35 37 36 7c 74 61 63 69 74 20 61 63  es/1576|tacit ac
09f0: 6b 6e 6f 77 6c 65 64 67 65 6d 65 6e 74 20 74 68  knowledgement th
0a00: 61 74 20 74 68 65 79 0a 64 6f 20 6e 6f 74 20 66  at they.do not f
0a10: 75 6c 6c 79 20 62 65 6c 69 65 76 65 20 74 68 61  ully believe tha
0a20: 74 20 58 20 69 73 20 61 6c 77 61 79 73 20 74 72  t X is always tr
0a30: 75 65 5d 2e 0a 57 65 20 62 65 6c 69 65 76 65 20  ue]..We believe 
0a40: 74 68 61 74 20 74 68 69 73 20 75 73 65 20 6f 66  that this use of
0a50: 20 61 73 73 65 72 74 28 58 29 20 69 73 20 77 72   assert(X) is wr
0a60: 6f 6e 67 20 61 6e 64 20 76 69 6f 6c 61 74 65 73  ong and violates
0a70: 20 74 68 65 20 69 6e 74 65 6e 74 0a 61 6e 64 20   the intent.and 
0a80: 70 75 72 70 6f 73 65 20 6f 66 20 68 61 76 69 6e  purpose of havin
0a90: 67 20 61 73 73 65 72 74 28 58 29 20 61 76 61 69  g assert(X) avai
0aa0: 6c 61 62 6c 65 20 69 6e 20 43 20 69 6e 20 74 68  lable in C in th
0ab0: 65 20 66 69 72 73 74 20 70 6c 61 63 65 2e 0a 41  e first place..A
0ac0: 6e 20 61 73 73 65 72 74 28 58 29 20 73 68 6f 75  n assert(X) shou
0ad0: 6c 64 20 6e 6f 74 20 62 65 20 73 65 65 6e 20 61  ld not be seen a
0ae0: 73 20 61 20 73 61 66 65 74 79 2d 6e 65 74 20 6f  s a safety-net o
0af0: 72 20 74 6f 70 2d 72 6f 70 65 20 75 73 65 64 20  r top-rope used 
0b00: 74 6f 0a 67 75 61 72 64 20 61 67 61 69 6e 73 74  to.guard against
0b10: 20 6d 69 73 74 61 6b 65 73 2e 20 20 4e 6f 72 20   mistakes.  Nor 
0b20: 69 73 20 61 73 73 65 72 74 28 58 29 20 61 70 70  is assert(X) app
0b30: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 64 65 66  ropriate for def
0b40: 65 6e 73 65 2d 69 6e 2d 64 65 70 74 68 2e 0a 41  ense-in-depth..A
0b50: 6e 20 41 4c 57 41 59 53 28 58 29 20 6f 72 20 4e  n ALWAYS(X) or N
0b60: 45 56 45 52 28 58 29 20 6d 61 63 72 6f 2c 20 6f  EVER(X) macro, o
0b70: 72 20 73 6f 6d 65 74 68 69 6e 67 20 73 69 6d 69  r something simi
0b80: 6c 61 72 2c 20 73 68 6f 75 6c 64 20 62 65 20 75  lar, should be u
0b90: 73 65 64 20 69 6e 20 0a 74 68 6f 73 65 20 63 61  sed in .those ca
0ba0: 73 65 73 20 62 65 63 61 75 73 65 20 41 4c 57 41  ses because ALWA
0bb0: 59 53 28 58 29 20 6f 72 20 4e 45 56 45 52 28 58  YS(X) or NEVER(X
0bc0: 29 20 77 69 6c 6c 20 62 65 20 66 6f 6c 6c 6f 77  ) will be follow
0bd0: 65 64 20 62 79 20 63 6f 64 65 20 74 6f 0a 61 63  ed by code to.ac
0be0: 74 75 61 6c 6c 79 20 64 65 61 6c 20 77 69 74 68  tually deal with
0bf0: 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 77 68 65   the problem whe
0c00: 6e 20 74 68 65 20 70 72 6f 67 72 61 6d 6d 65 72  n the programmer
0c10: 73 20 72 65 61 73 6f 6e 69 6e 67 0a 74 75 72 6e  s reasoning.turn
0c20: 73 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e  s out to be wron
0c30: 67 2e 20 20 53 69 6e 63 65 20 74 68 65 20 63 6f  g.  Since the co
0c40: 64 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  de that follows 
0c50: 41 4c 57 41 59 53 28 58 29 20 6f 72 20 4e 45 56  ALWAYS(X) or NEV
0c60: 45 52 28 58 29 0a 69 73 20 75 6e 74 65 73 74 65  ER(X).is unteste
0c70: 64 2c 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20  d, it should be 
0c80: 73 6f 6d 65 74 68 69 6e 67 20 76 65 72 79 20 73  something very s
0c90: 69 6d 70 6c 65 2c 20 6c 69 6b 65 20 61 20 22 72  imple, like a "r
0ca0: 65 74 75 72 6e 22 20 73 74 61 74 65 6d 65 6e 74  eturn" statement
0cb0: 2c 0a 74 68 61 74 20 69 73 20 65 61 73 69 6c 79  ,.that is easily
0cc0: 20 76 65 72 69 66 69 65 64 20 62 79 20 69 6e 73   verified by ins
0cd0: 70 65 63 74 69 6f 6e 2e 0a 0a 3c 70 3e 54 68 65  pection...<p>The
0ce0: 20 5b 68 74 74 70 73 3a 2f 2f 67 6f 6c 61 6e 67   [https://golang
0cf0: 2e 6f 72 67 7c 47 6f 20 70 72 6f 67 72 61 6d 6d  .org|Go programm
0d00: 69 6e 67 20 6c 61 6e 67 75 61 67 65 5d 20 6f 6d  ing language] om
0d10: 69 74 73 20 61 73 73 65 72 74 28 29 2e 0a 54 68  its assert()..Th
0d20: 65 20 47 6f 20 64 65 76 65 6c 6f 70 65 72 73 0a  e Go developers.
0d30: 5b 68 74 74 70 73 3a 2f 2f 67 6f 6c 61 6e 67 2e  [https://golang.
0d40: 6f 72 67 2f 64 6f 63 2f 66 61 71 23 61 73 73 65  org/doc/faq#asse
0d50: 72 74 69 6f 6e 73 7c 72 65 63 6f 67 6e 69 7a 65  rtions|recognize
0d60: 20 74 68 69 73 20 69 73 20 63 6f 6e 74 65 6e 74   this is content
0d70: 69 6f 75 73 5d 2e 0a 44 69 73 61 6c 6c 6f 77 69  ious]..Disallowi
0d80: 6e 67 20 61 73 73 65 72 74 28 29 20 69 73 20 65  ng assert() is e
0d90: 73 73 65 6e 74 69 61 6c 6c 79 20 74 65 6c 6c 69  ssentially telli
0da0: 6e 67 20 64 65 76 65 6c 6f 70 65 72 73 20 74 68  ng developers th
0db0: 61 74 20 74 68 65 79 20 61 72 65 0a 6e 6f 74 20  at they are.not 
0dc0: 61 6c 6c 6f 77 65 64 20 74 6f 20 64 6f 20 72 75  allowed to do ru
0dd0: 6e 2d 74 69 6d 65 20 76 65 72 69 66 69 63 61 74  n-time verificat
0de0: 69 6f 6e 20 6f 66 20 69 6e 76 61 72 69 61 6e 74  ion of invariant
0df0: 73 2e 0a 49 74 20 69 73 20 61 73 20 69 66 20 74  s..It is as if t
0e00: 68 65 20 64 65 76 65 6c 6f 70 65 72 73 20 6f 66  he developers of
0e10: 0a 47 6f 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20  .Go do not want 
0e20: 63 6f 64 65 72 73 20 74 6f 20 70 72 6f 76 65 20  coders to prove 
0e30: 74 68 65 20 73 6f 66 74 77 61 72 65 20 69 73 20  the software is 
0e40: 63 6f 72 72 65 63 74 2e 0a 54 68 65 20 53 51 4c  correct..The SQL
0e50: 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73 20 62  ite developers b
0e60: 65 6c 69 65 76 65 20 74 68 61 74 20 74 68 65 20  elieve that the 
0e70: 6c 61 63 6b 20 6f 66 20 61 73 73 65 72 74 28 29  lack of assert()
0e80: 20 64 69 73 71 75 61 6c 69 66 69 65 73 0a 47 6f   disqualifies.Go
0e90: 20 61 73 20 61 20 6c 61 6e 67 75 61 67 65 20 66   as a language f
0ea0: 6f 72 20 73 65 72 69 6f 75 73 20 64 65 76 65 6c  or serious devel
0eb0: 6f 70 6d 65 6e 74 20 77 6f 72 6b 2e 0a 0a 3c 68  opment work...<h
0ec0: 32 3e 44 69 66 66 65 72 65 6e 74 20 42 65 68 61  2>Different Beha
0ed0: 76 69 6f 72 73 20 41 63 63 6f 72 64 69 6e 67 20  viors According 
0ee0: 54 6f 20 42 75 69 6c 64 20 54 79 70 65 3c 2f 68  To Build Type</h
0ef0: 32 3e 0a 0a 3c 70 3e 54 68 72 65 65 20 73 65 70  2>..<p>Three sep
0f00: 61 72 61 74 65 20 62 75 69 6c 64 73 20 61 72 65  arate builds are
0f10: 20 75 73 65 64 20 74 6f 20 76 61 6c 69 64 61 74   used to validat
0f20: 65 20 74 68 65 20 53 51 4c 69 74 65 20 73 6f 66  e the SQLite sof
0f30: 74 77 61 72 65 2e 0a 3c 6f 6c 3e 0a 3c 6c 69 3e  tware..<ol>.<li>
0f40: 20 41 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79   A functionality
0f50: 20 74 65 73 74 69 6e 67 20 62 75 69 6c 64 20 69   testing build i
0f60: 73 20 75 73 65 64 20 74 6f 20 76 61 6c 69 64 61  s used to valida
0f70: 74 65 20 74 68 65 20 73 6f 75 72 63 65 20 63 6f  te the source co
0f80: 64 65 2e 0a 3c 6c 69 3e 20 41 20 63 6f 76 65 72  de..<li> A cover
0f90: 61 67 65 20 74 65 73 74 69 6e 67 20 62 75 69 6c  age testing buil
0fa0: 64 20 69 73 20 75 73 65 64 20 74 6f 20 76 61 6c  d is used to val
0fb0: 69 64 61 74 65 20 74 68 65 20 74 65 73 74 20 73  idate the test s
0fc0: 75 69 74 65 2c 20 74 6f 20 63 6f 6e 66 69 72 6d  uite, to confirm
0fd0: 0a 20 20 20 20 20 74 68 61 74 20 74 68 65 20 74  .     that the t
0fe0: 65 73 74 20 73 75 69 74 65 20 70 72 6f 76 69 64  est suite provid
0ff0: 65 73 20 31 30 30 25 20 4d 43 2f 44 43 2e 0a 3c  es 100% MC/DC..<
1000: 6c 69 3e 20 54 68 65 20 72 65 6c 65 61 73 65 20  li> The release 
1010: 62 75 69 6c 64 20 69 73 20 75 73 65 64 20 74 6f  build is used to
1020: 20 76 61 6c 69 64 61 74 65 20 74 68 65 20 67 65   validate the ge
1030: 6e 65 72 61 74 65 64 20 6d 61 63 68 69 6e 65 20  nerated machine 
1040: 63 6f 64 65 2e 0a 3c 2f 6f 6c 3e 0a 3c 70 3e 41  code..</ol>.<p>A
1050: 6c 6c 20 74 65 73 74 73 20 6d 75 73 74 20 67 69  ll tests must gi
1060: 76 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77  ve the same answ
1070: 65 72 20 69 6e 20 61 6c 6c 20 74 68 72 65 65 0a  er in all three.
1080: 62 75 69 6c 64 73 2e 20 53 65 65 20 74 68 65 20  builds. See the 
1090: 5b 74 65 73 74 69 6e 67 7c 22 48 6f 77 20 53 51  [testing|"How SQ
10a0: 4c 69 74 65 20 49 73 20 54 65 73 74 65 64 22 5d  Lite Is Tested"]
10b0: 20 64 6f 63 75 6d 65 6e 74 20 66 6f 72 20 6d 6f   document for mo
10c0: 72 65 20 64 65 74 61 69 6c 2e 0a 0a 3c 70 3e 54  re detail...<p>T
10d0: 68 65 20 76 61 72 69 6f 75 73 20 61 73 73 65 72  he various asser
10e0: 74 28 29 2d 6c 69 6b 65 0a 6d 61 63 72 6f 73 20  t()-like.macros 
10f0: 62 65 68 61 76 65 20 64 69 66 66 65 72 65 6e 74  behave different
1100: 6c 79 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ly according to 
1110: 68 6f 77 20 53 51 4c 69 74 65 20 69 73 20 62 75  how SQLite is bu
1120: 69 6c 74 2e 0a 0a 3c 74 61 62 6c 65 20 73 74 72  ilt...<table str
1130: 69 70 65 64 3d 31 3e 0a 3c 74 72 3e 3c 74 68 3e  iped=1>.<tr><th>
1140: 3c 74 68 3e 46 75 6e 63 74 69 6f 6e 61 6c 69 74  <th>Functionalit
1150: 79 20 54 65 73 74 69 6e 67 3c 74 68 3e 43 6f 76  y Testing<th>Cov
1160: 65 72 61 67 65 20 54 65 73 74 69 6e 67 3c 74 68  erage Testing<th
1170: 3e 52 65 6c 65 61 73 65 3c 2f 74 72 3e 0a 3c 74  >Release</tr>.<t
1180: 72 3e 3c 74 68 20 76 61 6c 69 67 6e 3d 22 74 6f  r><th valign="to
1190: 70 22 3e 61 73 73 65 72 74 28 58 29 0a 3c 74 64  p">assert(X).<td
11a0: 3e 61 62 6f 72 74 28 29 20 69 66 20 58 20 69 73  >abort() if X is
11b0: 20 66 61 6c 73 65 0a 3c 74 64 3e 6e 6f 2d 6f 70   false.<td>no-op
11c0: 0a 3c 74 64 3e 6e 6f 2d 6f 70 0a 3c 2f 74 72 3e  .<td>no-op.</tr>
11d0: 0a 3c 74 72 3e 3c 74 68 20 76 61 6c 69 67 6e 3d  .<tr><th valign=
11e0: 22 74 6f 70 22 3e 41 4c 57 41 59 53 28 58 29 0a  "top">ALWAYS(X).
11f0: 3c 74 64 3e 61 62 6f 72 74 28 29 20 69 66 20 58  <td>abort() if X
1200: 20 69 73 20 66 61 6c 73 65 0a 3c 74 64 3e 61 6c   is false.<td>al
1210: 77 61 79 73 20 74 72 75 65 0a 3c 74 64 3e 70 61  ways true.<td>pa
1220: 73 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 76  ss through the v
1230: 61 6c 75 65 20 58 0a 3c 2f 74 72 3e 0a 3c 74 72  alue X.</tr>.<tr
1240: 3e 3c 74 68 20 76 61 6c 69 67 6e 3d 22 74 6f 70  ><th valign="top
1250: 22 3e 4e 45 56 45 52 28 58 29 0a 3c 74 64 3e 61  ">NEVER(X).<td>a
1260: 62 6f 72 74 28 29 20 69 66 20 58 20 69 73 20 74  bort() if X is t
1270: 72 75 65 0a 3c 74 64 3e 61 6c 77 61 79 73 20 66  rue.<td>always f
1280: 61 6c 73 65 0a 3c 74 64 3e 70 61 73 73 20 74 68  alse.<td>pass th
1290: 72 6f 75 67 68 20 74 68 65 20 76 61 6c 75 65 20  rough the value 
12a0: 58 0a 3c 2f 74 72 3e 0a 3c 74 72 3e 3c 74 68 20  X.</tr>.<tr><th 
12b0: 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e 74 65 73  valign="top">tes
12c0: 74 63 61 73 65 28 58 29 0a 3c 74 64 3e 6e 6f 2d  tcase(X).<td>no-
12d0: 6f 70 0a 3c 74 64 3e 64 6f 20 73 6f 6d 65 20 68  op.<td>do some h
12e0: 61 72 6d 6c 65 73 73 20 77 6f 72 6b 20 69 66 20  armless work if 
12f0: 58 20 69 73 20 74 72 75 65 0a 3c 74 64 3e 6e 6f  X is true.<td>no
1300: 2d 6f 70 0a 3c 2f 74 72 3e 0a 3c 2f 74 61 62 6c  -op.</tr>.</tabl
1310: 65 3e 0a 0a 3c 70 3e 54 68 65 20 64 65 66 61 75  e>..<p>The defau
1320: 6c 74 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61  lt behavior of a
1330: 73 73 65 72 74 28 58 29 20 69 6e 20 73 74 61 6e  ssert(X) in stan
1340: 64 61 72 64 20 43 20 69 73 20 74 68 61 74 20 69  dard C is that i
1350: 74 20 69 73 20 65 6e 61 62 6c 65 64 0a 66 6f 72  t is enabled.for
1360: 20 72 65 6c 65 61 73 65 20 62 75 69 6c 64 73 2e   release builds.
1370: 20 20 54 68 69 73 20 69 73 20 61 20 72 65 61 73    This is a reas
1380: 6f 6e 61 62 6c 65 20 64 65 66 61 75 6c 74 2e 20  onable default. 
1390: 20 48 6f 77 65 76 65 72 2c 20 74 68 65 0a 53 51   However, the.SQ
13a0: 4c 69 74 65 20 63 6f 64 65 20 62 61 73 65 20 68  Lite code base h
13b0: 61 73 20 6d 61 6e 79 20 61 73 73 65 72 74 28 29  as many assert()
13c0: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 70   statements in p
13d0: 65 72 66 6f 72 6d 61 6e 63 65 2d 73 65 6e 73 69  erformance-sensi
13e0: 74 69 76 65 0a 61 72 65 61 73 20 6f 66 20 74 68  tive.areas of th
13f0: 65 20 63 6f 64 65 2e 20 20 4c 65 61 76 69 6e 67  e code.  Leaving
1400: 20 61 73 73 65 72 74 28 58 29 20 74 75 72 6e 65   assert(X) turne
1410: 64 20 6f 6e 20 63 61 75 73 65 73 20 53 51 4c 69  d on causes SQLi
1420: 74 65 20 74 6f 20 72 75 6e 20 61 62 6f 75 74 0a  te to run about.
1430: 74 68 72 65 65 20 74 69 6d 65 73 20 73 6c 6f 77  three times slow
1440: 65 72 2e 20 20 41 6c 73 6f 2c 20 53 51 4c 69 74  er.  Also, SQLit
1450: 65 20 73 74 72 69 76 65 73 20 74 6f 20 70 72 6f  e strives to pro
1460: 76 69 64 65 20 31 30 30 25 20 4d 43 2f 44 43 20  vide 100% MC/DC 
1470: 69 6e 20 61 6e 0a 61 73 2d 64 65 6c 69 76 65 72  in an.as-deliver
1480: 65 64 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ed configuration
1490: 2c 20 77 68 69 63 68 20 69 73 20 6f 62 76 69 6f  , which is obvio
14a0: 75 73 6c 79 20 69 6d 70 6f 73 73 69 62 6c 65 20  usly impossible 
14b0: 69 66 20 61 73 73 65 72 74 28 58 29 0a 73 74 61  if assert(X).sta
14c0: 74 65 6d 65 6e 74 73 20 61 72 65 20 65 6e 61 62  tements are enab
14d0: 6c 65 64 2e 20 20 46 6f 72 20 74 68 65 73 65 20  led.  For these 
14e0: 72 65 61 73 6f 6e 73 2c 20 61 73 73 65 72 74 28  reasons, assert(
14f0: 58 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  X) is a no-op fo
1500: 72 0a 72 65 6c 65 61 73 65 20 62 75 69 6c 64 73  r.release builds
1510: 20 69 6e 20 53 51 4c 69 74 65 2e 0a 0a 3c 70 3e   in SQLite...<p>
1520: 54 68 65 20 41 4c 57 41 59 53 28 58 29 20 61 6e  The ALWAYS(X) an
1530: 64 20 4e 45 56 45 52 28 58 29 20 6d 61 63 72 6f  d NEVER(X) macro
1540: 73 20 62 65 68 61 76 65 20 6c 69 6b 65 20 61 73  s behave like as
1550: 73 65 72 74 28 58 29 20 64 75 72 69 6e 67 0a 66  sert(X) during.f
1560: 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20 74 65 73  unctionality tes
1570: 74 69 6e 67 2c 20 62 65 63 61 75 73 65 20 74 68  ting, because th
1580: 65 20 64 65 76 65 6c 6f 70 65 72 73 20 77 61 6e  e developers wan
1590: 74 20 74 6f 20 62 65 20 69 6d 6d 65 64 69 61 74  t to be immediat
15a0: 65 6c 79 0a 61 6c 65 72 74 65 64 20 74 6f 20 74  ely.alerted to t
15b0: 68 65 20 69 73 73 75 65 20 69 66 20 74 68 65 20  he issue if the 
15c0: 76 61 6c 75 65 20 6f 66 20 58 20 69 73 20 64 69  value of X is di
15d0: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
15e0: 74 20 69 73 20 65 78 70 65 63 74 65 64 2e 0a 42  t is expected..B
15f0: 75 74 20 66 6f 72 20 64 65 6c 69 76 65 72 79 2c  ut for delivery,
1600: 20 41 4c 57 41 59 53 28 58 29 20 61 6e 64 20 4e   ALWAYS(X) and N
1610: 45 56 45 52 28 58 29 20 61 72 65 20 73 69 6d 70  EVER(X) are simp
1620: 6c 65 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20  le pass-through 
1630: 6d 61 63 72 6f 73 2c 0a 77 68 69 63 68 20 70 72  macros,.which pr
1640: 6f 76 69 64 65 20 64 65 66 65 6e 73 65 2d 69 6e  ovide defense-in
1650: 2d 64 65 70 74 68 2e 20 20 46 6f 72 20 63 6f 76  -depth.  For cov
1660: 65 72 61 67 65 20 74 65 73 74 69 6e 67 20 41 4c  erage testing AL
1670: 57 41 59 53 28 58 29 20 61 6e 64 20 4e 45 56 45  WAYS(X) and NEVE
1680: 52 28 58 29 0a 61 72 65 20 68 61 72 64 2d 63 6f  R(X).are hard-co
1690: 64 65 64 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  ded boolean valu
16a0: 65 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  es so that they 
16b0: 64 6f 20 6e 6f 74 20 63 61 75 73 65 20 75 6e 72  do not cause unr
16c0: 65 61 63 68 61 62 6c 65 0a 6d 61 63 68 69 6e 65  eachable.machine
16d0: 20 63 6f 64 65 20 74 6f 20 62 65 20 67 65 6e 65   code to be gene
16e0: 72 61 74 65 64 2e 0a 0a 3c 70 3e 54 68 65 20 74  rated...<p>The t
16f0: 65 73 74 63 61 73 65 28 58 29 20 6d 61 63 72 6f  estcase(X) macro
1700: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 6e   is normally a n
1710: 6f 2d 6f 70 2c 20 62 75 74 20 66 6f 72 20 61 20  o-op, but for a 
1720: 63 6f 76 65 72 61 67 65 20 74 65 73 74 0a 62 75  coverage test.bu
1730: 69 6c 64 20 69 74 20 64 6f 65 73 20 67 65 6e 65  ild it does gene
1740: 72 61 74 65 20 61 20 73 6d 61 6c 6c 20 61 6d 6f  rate a small amo
1750: 75 6e 74 20 6f 66 20 65 78 74 72 61 20 63 6f 64  unt of extra cod
1760: 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20  e that includes 
1770: 61 74 20 6c 65 61 73 74 0a 6f 6e 65 20 62 72 61  at least.one bra
1780: 6e 63 68 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f  nch, in order to
1790: 20 76 65 72 69 66 79 20 74 68 61 74 20 74 65 73   verify that tes
17a0: 74 20 63 61 73 65 73 20 65 78 69 73 74 20 66 6f  t cases exist fo
17b0: 72 20 77 68 69 63 68 20 58 20 69 73 20 62 6f 74  r which X is bot
17c0: 68 0a 74 72 75 65 20 61 6e 64 20 66 61 6c 73 65  h.true and false
17d0: 2e 0a 0a 3c 68 31 3e 45 78 61 6d 70 6c 65 73 3c  ...<h1>Examples<
17e0: 2f 68 31 3e 0a 0a 3c 70 3e 41 6e 20 61 73 73 65  /h1>..<p>An asse
17f0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 69  rt() statement i
1800: 73 20 6f 66 74 65 6e 20 75 73 65 64 20 74 6f 20  s often used to 
1810: 76 61 6c 69 64 61 74 65 20 70 72 65 2d 63 6f 6e  validate pre-con
1820: 64 69 74 69 6f 6e 73 20 6f 6e 20 0a 69 6e 74 65  ditions on .inte
1830: 72 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 73 20 61  rnal functions a
1840: 6e 64 20 6d 65 74 68 6f 64 73 2e 0a 45 78 61 6d  nd methods..Exam
1850: 70 6c 65 3a 20 5b 68 74 74 70 73 3a 2f 2f 73 71  ple: [https://sq
1860: 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 61 72 74  lite.org/src/art
1870: 69 66 61 63 74 2f 63 31 65 39 37 65 34 63 36 66  ifact/c1e97e4c6f
1880: 3f 6c 6e 3d 31 30 34 38 5d 2e 0a 54 68 69 73 20  ?ln=1048]..This 
1890: 69 73 20 64 65 65 6d 65 64 20 62 65 74 74 65 72  is deemed better
18a0: 20 74 68 61 6e 20 73 69 6d 70 6c 79 20 73 74 61   than simply sta
18b0: 74 69 6e 67 20 74 68 65 20 70 72 65 2d 63 6f 6e  ting the pre-con
18c0: 64 69 74 69 6f 6e 20 69 6e 20 61 20 68 65 61 64  dition in a head
18d0: 65 72 20 0a 63 6f 6d 6d 65 6e 74 2c 20 73 69 6e  er .comment, sin
18e0: 63 65 20 74 68 65 20 61 73 73 65 72 74 28 29 20  ce the assert() 
18f0: 69 73 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63  is actually exec
1900: 75 74 65 64 2e 20 20 49 6e 20 61 20 68 69 67 68  uted.  In a high
1910: 6c 79 20 74 65 73 74 65 64 0a 70 72 6f 67 72 61  ly tested.progra
1920: 6d 20 6c 69 6b 65 20 53 51 4c 69 74 65 2c 20 74  m like SQLite, t
1930: 68 65 20 72 65 61 64 65 72 20 6b 6e 6f 77 73 20  he reader knows 
1940: 74 68 61 74 20 74 68 65 20 70 72 65 2d 63 6f 6e  that the pre-con
1950: 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 0a 66  dition is true.f
1960: 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 68 75  or all of the hu
1970: 6e 64 72 65 64 73 20 6f 66 20 6d 69 6c 6c 69 6f  ndreds of millio
1980: 6e 73 20 6f 66 20 74 65 73 74 20 63 61 73 65 73  ns of test cases
1990: 20 72 75 6e 20 61 67 61 69 6e 73 74 20 53 51 4c   run against SQL
19a0: 69 74 65 2c 0a 73 69 6e 63 65 20 69 74 20 68 61  ite,.since it ha
19b0: 73 20 62 65 65 6e 20 76 65 72 69 66 69 65 64 20  s been verified 
19c0: 62 79 20 74 68 65 20 61 73 73 65 72 74 28 29 2e  by the assert().
19d0: 0a 49 6e 20 63 6f 6e 74 72 61 73 74 2c 20 61 20  .In contrast, a 
19e0: 74 65 78 74 20 70 72 65 2d 63 6f 6e 64 69 74 69  text pre-conditi
19f0: 6f 6e 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  on statement in 
1a00: 61 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74  a header comment
1a10: 0a 69 73 20 75 6e 74 65 73 74 65 64 2e 20 20 49  .is untested.  I
1a20: 74 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65  t might have bee
1a30: 6e 20 74 72 75 65 20 77 68 65 6e 20 74 68 65 20  n true when the 
1a40: 63 6f 64 65 20 77 61 73 20 77 72 69 74 74 65 6e  code was written
1a50: 2c 20 0a 62 75 74 20 77 68 6f 20 69 73 20 74 6f  , .but who is to
1a60: 20 73 61 79 20 74 68 61 74 20 69 74 20 69 73 20   say that it is 
1a70: 73 74 69 6c 6c 20 74 72 75 65 20 6e 6f 77 3f 0a  still true now?.
1a80: 0a 3c 70 3e 0a 53 6f 6d 65 74 69 6d 65 73 20 53  .<p>.Sometimes S
1a90: 51 4c 69 74 65 20 75 73 65 73 20 63 6f 6d 70 69  QLite uses compi
1aa0: 6c 65 2d 74 69 6d 65 20 65 76 61 6c 75 61 74 61  le-time evaluata
1ab0: 62 6c 65 20 61 73 73 65 72 74 28 29 20 73 74 61  ble assert() sta
1ac0: 74 65 6d 65 6e 74 73 2e 0a 43 6f 6e 73 69 64 65  tements..Conside
1ad0: 72 20 74 68 65 20 63 6f 64 65 20 61 74 0a 5b 68  r the code at.[h
1ae0: 74 74 70 73 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72  ttps://sqlite.or
1af0: 67 2f 73 72 63 2f 61 72 74 69 66 61 63 74 2f 63  g/src/artifact/c
1b00: 31 65 39 37 65 34 63 36 66 3f 6c 6e 3d 32 31 33  1e97e4c6f?ln=213
1b10: 30 2d 32 31 33 38 5d 2e 0a 46 6f 75 72 20 61 73  0-2138]..Four as
1b20: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
1b30: 73 20 76 65 72 69 66 79 20 74 68 65 20 76 61 6c  s verify the val
1b40: 75 65 73 20 66 6f 72 20 63 6f 6d 70 69 6c 65 2d  ues for compile-
1b50: 74 69 6d 65 20 63 6f 6e 73 74 61 6e 74 73 0a 73  time constants.s
1b60: 6f 20 74 68 61 74 20 74 68 65 20 72 65 61 64 65  o that the reade
1b70: 72 20 63 61 6e 20 71 75 69 63 6b 6c 79 20 63 68  r can quickly ch
1b80: 65 63 6b 20 74 68 65 20 76 61 6c 69 64 69 74 79  eck the validity
1b90: 20 6f 66 20 74 68 65 20 69 66 2d 73 74 61 74 65   of the if-state
1ba0: 6d 65 6e 74 0a 74 68 61 74 20 66 6f 6c 6c 6f 77  ment.that follow
1bb0: 73 2c 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  s, without havin
1bc0: 67 20 74 6f 20 6c 6f 6f 6b 20 75 70 20 74 68 65  g to look up the
1bd0: 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65 73   constant values
1be0: 20 69 6e 20 61 20 73 65 70 61 72 61 74 65 0a 68   in a separate.h
1bf0: 65 61 64 65 72 20 66 69 6c 65 2e 0a 0a 3c 70 3e  eader file...<p>
1c00: 0a 53 6f 6d 65 74 69 6d 65 73 20 63 6f 6d 70 69  .Sometimes compi
1c10: 6c 65 2d 74 69 6d 65 20 61 73 73 65 72 74 28 29  le-time assert()
1c20: 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
1c30: 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 74  used to verify t
1c40: 68 61 74 0a 53 51 4c 69 74 65 20 68 61 73 20 62  hat.SQLite has b
1c50: 65 65 6e 20 63 6f 72 72 65 63 74 6c 79 20 63 6f  een correctly co
1c60: 6d 70 69 6c 65 64 2e 20 20 46 6f 72 20 65 78 61  mpiled.  For exa
1c70: 6d 70 6c 65 2c 20 74 68 65 20 63 6f 64 65 20 61  mple, the code a
1c80: 74 0a 5b 68 74 74 70 73 3a 2f 2f 73 71 6c 69 74  t.[https://sqlit
1c90: 65 2e 6f 72 67 2f 73 72 63 2f 61 72 74 69 66 61  e.org/src/artifa
1ca0: 63 74 2f 63 31 65 39 37 65 34 63 36 66 3f 6c 6e  ct/c1e97e4c6f?ln
1cb0: 3d 31 35 37 5d 0a 76 65 72 69 66 69 65 73 20 74  =157].verifies t
1cc0: 68 61 74 20 74 68 65 20 53 51 4c 49 54 45 5f 50  hat the SQLITE_P
1cd0: 54 52 53 49 5a 45 20 70 72 65 70 72 6f 63 65 73  TRSIZE preproces
1ce0: 73 6f 72 20 6d 61 63 72 6f 20 69 73 20 73 65 74  sor macro is set
1cf0: 20 63 6f 72 72 65 63 74 6c 79 0a 66 6f 72 20 74   correctly.for t
1d00: 68 65 20 74 61 72 67 65 74 20 61 72 63 68 69 74  he target archit
1d10: 65 63 74 75 72 65 2e 0a 0a 3c 70 3e 0a 54 68 65  ecture...<p>.The
1d20: 20 43 4f 52 52 55 50 54 5f 44 42 20 6d 61 63 72   CORRUPT_DB macr
1d30: 6f 20 69 73 20 75 73 65 64 20 69 6e 20 6d 61 6e  o is used in man
1d40: 79 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  y assert() state
1d50: 6d 65 6e 74 73 2e 0a 49 6e 20 66 75 6e 63 74 69  ments..In functi
1d60: 6f 6e 61 6c 20 74 65 73 74 69 6e 67 20 62 75 69  onal testing bui
1d70: 6c 64 73 2c 20 43 4f 52 52 55 50 54 5f 44 42 20  lds, CORRUPT_DB 
1d80: 72 65 66 65 72 65 6e 63 65 73 20 61 20 67 6c 6f  references a glo
1d90: 62 61 6c 20 76 61 72 69 61 62 6c 65 0a 74 68 61  bal variable.tha
1da0: 74 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  t is true if the
1db0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d   database file m
1dc0: 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 63 6f 72  ight contain cor
1dd0: 72 75 70 74 69 6f 6e 2e 20 20 54 68 69 73 20 76  ruption.  This v
1de0: 61 72 69 61 62 6c 65 0a 69 73 20 74 72 75 65 20  ariable.is true 
1df0: 62 79 20 64 65 66 61 75 6c 74 2c 20 73 69 6e 63  by default, sinc
1e00: 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 6f 72 6d  e we do not norm
1e10: 61 6c 6c 79 20 6b 6e 6f 77 20 77 68 65 74 68 65  ally know whethe
1e20: 72 20 6f 72 20 6e 6f 74 20 61 20 64 61 74 61 62  r or not a datab
1e30: 61 73 65 0a 69 73 20 63 6f 72 72 75 70 74 2c 20  ase.is corrupt, 
1e40: 62 75 74 20 64 75 72 69 6e 67 20 74 65 73 74 69  but during testi
1e50: 6e 67 20 77 68 69 6c 65 20 77 6f 72 6b 69 6e 67  ng while working
1e60: 20 6f 6e 20 64 61 74 61 62 61 73 65 73 20 74 68   on databases th
1e70: 61 74 20 61 72 65 20 6b 6e 6f 77 6e 0a 74 6f 20  at are known.to 
1e80: 62 65 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2c 20  be well-formed, 
1e90: 74 68 61 74 20 67 6c 6f 62 61 6c 20 76 61 72 69  that global vari
1ea0: 61 62 6c 65 20 63 61 6e 20 62 65 20 73 65 74 20  able can be set 
1eb0: 74 6f 20 66 61 6c 73 65 2e 0a 54 68 65 6e 20 74  to false..Then t
1ec0: 68 65 20 43 4f 52 52 55 50 54 5f 44 42 20 6d 61  he CORRUPT_DB ma
1ed0: 63 72 6f 0a 63 61 6e 20 62 65 20 75 73 65 64 20  cro.can be used 
1ee0: 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  in assert() stat
1ef0: 65 6d 65 6e 74 73 20 73 75 63 68 20 61 73 20 73  ements such as s
1f00: 65 65 6e 20 61 74 0a 5b 68 74 74 70 73 3a 2f 2f  een at.[https://
1f10: 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 61  sqlite.org/src/a
1f20: 72 74 69 66 61 63 74 2f 31 38 61 35 33 35 34 30  rtifact/18a53540
1f30: 61 61 33 3f 6c 6e 3d 31 36 37 39 2d 31 36 38 30  aa3?ln=1679-1680
1f40: 5d 2e 0a 54 68 6f 73 65 20 61 73 73 65 72 74 28  ]..Those assert(
1f50: 29 73 20 73 70 65 63 69 66 79 20 70 72 65 2d 63  )s specify pre-c
1f60: 6f 6e 64 69 74 69 6f 6e 73 20 74 6f 20 74 68 65  onditions to the
1f70: 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 61 72   routine that ar
1f80: 65 20 74 72 75 65 20 66 6f 72 0a 63 6f 6e 73 69  e true for.consi
1f90: 73 74 65 6e 74 20 64 61 74 61 62 61 73 65 20 66  stent database f
1fa0: 69 6c 65 73 2c 20 62 75 74 20 77 68 69 63 68 20  iles, but which 
1fb0: 6d 69 67 68 74 20 62 65 20 66 61 6c 73 65 20 69  might be false i
1fc0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1fd0: 69 6c 65 0a 69 73 20 63 6f 72 72 75 70 74 2e 20  ile.is corrupt. 
1fe0: 4b 6e 6f 77 6c 65 64 67 65 20 6f 66 20 74 68 65  Knowledge of the
1ff0: 73 65 20 6b 69 6e 64 73 20 6f 66 20 63 6f 6e 64  se kinds of cond
2000: 69 74 69 6f 6e 73 20 69 73 20 76 65 72 79 20 68  itions is very h
2010: 65 6c 70 66 75 6c 20 74 6f 0a 72 65 61 64 65 72  elpful to.reader
2020: 73 20 77 68 6f 20 61 72 65 20 74 72 79 69 6e 67  s who are trying
2030: 20 74 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 61   to understand a
2040: 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69   block of code i
2050: 6e 20 69 73 6f 6c 61 74 69 6f 6e 2e 0a 0a 3c 70  n isolation...<p
2060: 3e 0a 41 4c 57 41 59 53 28 58 29 20 61 6e 64 20  >.ALWAYS(X) and 
2070: 4e 45 56 45 52 28 58 29 20 66 75 6e 63 74 69 6f  NEVER(X) functio
2080: 6e 73 20 61 72 65 20 75 73 65 64 20 69 6e 20 70  ns are used in p
2090: 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20 61  laces where we a
20a0: 6c 77 61 79 73 0a 77 61 6e 74 20 74 68 65 20 74  lways.want the t
20b0: 65 73 74 20 74 6f 20 6f 63 63 75 72 20 65 76 65  est to occur eve
20c0: 6e 20 74 68 6f 75 67 68 20 74 68 65 20 64 65 76  n though the dev
20d0: 65 6c 6f 70 65 72 73 20 62 65 6c 69 65 76 65 20  elopers believe 
20e0: 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 58 20 69  the value of.X i
20f0: 73 20 61 6c 77 61 79 73 20 74 72 75 65 20 6f 72  s always true or
2100: 20 66 61 6c 73 65 2e 20 20 46 6f 72 20 65 78 61   false.  For exa
2110: 6d 70 6c 65 2c 20 74 68 65 20 73 71 6c 69 74 65  mple, the sqlite
2120: 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
2130: 72 28 29 0a 72 6f 75 74 69 6e 65 20 73 68 6f 77  r().routine show
2140: 6e 20 6d 75 73 74 20 72 65 6d 6f 76 65 20 74 68  n must remove th
2150: 65 20 63 6c 6f 73 69 6e 67 20 63 75 72 73 6f 72  e closing cursor
2160: 20 66 72 6f 6d 20 61 20 6c 69 6e 6b 65 64 20 6c   from a linked l
2170: 69 73 74 20 6f 66 20 61 6c 6c 0a 63 75 72 73 6f  ist of all.curso
2180: 72 73 2e 20 20 57 65 20 6b 6e 6f 77 20 74 68 61  rs.  We know tha
2190: 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
21a0: 6f 6e 20 74 68 65 20 6c 69 73 74 2c 20 73 6f 20  on the list, so 
21b0: 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 0a 6d 75  that the loop.mu
21c0: 73 74 20 74 65 72 6d 69 6e 61 74 65 20 62 79 20  st terminate by 
21d0: 74 68 65 20 22 62 72 65 61 6b 22 20 73 74 61 74  the "break" stat
21e0: 65 6d 65 6e 74 2c 20 62 75 74 20 69 74 20 69 73  ement, but it is
21f0: 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 0a 75   convenient to.u
2200: 73 65 20 74 68 65 20 41 4c 57 41 59 53 28 58 29  se the ALWAYS(X)
2210: 20 74 65 73 74 20 61 74 0a 5b 68 74 74 70 73 3a   test at.[https:
2220: 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63  //sqlite.org/src
2230: 2f 61 72 74 69 66 61 63 74 2f 31 38 61 35 33 35  /artifact/18a535
2240: 34 30 61 61 33 3f 6c 6e 3d 34 33 37 31 5d 20 74  40aa3?ln=4371] t
2250: 6f 20 70 72 65 76 65 6e 74 0a 72 75 6e 6e 69 6e  o prevent.runnin
2260: 67 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  g off the end of
2270: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
2280: 20 69 6e 20 63 61 73 65 20 74 68 65 72 65 20 69   in case there i
2290: 73 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 73 6f  s an error in so
22a0: 6d 65 0a 6f 74 68 65 72 20 70 61 72 74 20 6f 66  me.other part of
22b0: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 68   the code that h
22c0: 61 73 20 63 6f 72 72 75 70 74 65 64 20 74 68 65  as corrupted the
22d0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 0a 3c   linked list...<
22e0: 70 3e 0a 41 6e 20 41 4c 57 41 59 53 28 58 29 20  p>.An ALWAYS(X) 
22f0: 6f 72 20 4e 45 56 45 52 28 58 29 20 73 6f 6d 65  or NEVER(X) some
2300: 74 69 6d 65 73 20 76 65 72 69 66 69 65 73 20 70  times verifies p
2310: 72 65 2d 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68  re-conditions th
2320: 61 74 20 61 72 65 0a 73 75 62 6a 65 63 74 20 74  at are.subject t
2330: 6f 20 63 68 61 6e 67 65 20 69 66 20 6f 74 68 65  o change if othe
2340: 72 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 63  r parts of the c
2350: 6f 64 65 20 61 72 65 20 6d 6f 64 69 66 69 65 64  ode are modified
2360: 20 69 6e 0a 73 75 62 74 6c 65 20 77 61 79 73 2e   in.subtle ways.
2370: 20 20 41 74 20 5b 68 74 74 70 73 3a 2f 2f 73 71    At [https://sq
2380: 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 61 72 74  lite.org/src/art
2390: 69 66 61 63 74 2f 31 38 61 35 33 35 34 30 61 61  ifact/18a53540aa
23a0: 33 3f 6c 6e 3d 35 35 31 32 2d 35 35 31 36 5d 0a  3?ln=5512-5516].
23b0: 77 65 20 68 61 76 65 20 61 20 63 61 73 65 20 74  we have a case t
23c0: 65 73 74 20 66 6f 72 20 74 77 6f 20 70 72 65 2d  est for two pre-
23d0: 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20  conditions that 
23e0: 61 72 65 20 74 72 75 65 20 6f 6e 6c 79 20 62 65  are true only be
23f0: 63 61 75 73 65 0a 6f 66 20 74 68 65 20 6c 69 6d  cause.of the lim
2400: 69 74 65 64 20 73 63 6f 70 65 20 6f 66 20 75 73  ited scope of us
2410: 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  e of the sqlite3
2420: 42 74 72 65 65 52 6f 77 43 6f 75 6e 74 45 73 74  BtreeRowCountEst
2430: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 46 75 74  () function..Fut
2440: 75 72 65 20 65 6e 68 61 6e 63 65 6d 65 6e 74 73  ure enhancements
2450: 20 74 6f 20 53 51 4c 69 74 65 20 6d 69 67 68 74   to SQLite might
2460: 20 75 73 65 20 73 71 6c 69 74 65 33 42 74 72 65   use sqlite3Btre
2470: 65 52 6f 77 43 6f 75 6e 74 45 73 74 28 29 20 69  eRowCountEst() i
2480: 6e 0a 6e 65 77 20 77 61 79 73 20 77 68 65 72 65  n.new ways where
2490: 20 74 68 6f 73 65 20 70 72 65 63 6f 6e 64 69 74   those precondit
24a0: 69 6f 6e 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 68  ions no longer h
24b0: 6f 6c 64 2c 20 61 6e 64 20 74 68 65 20 4e 45 56  old, and the NEV
24c0: 45 52 28 29 0a 6d 61 63 72 6f 73 20 77 69 6c 6c  ER().macros will
24d0: 20 71 75 69 63 6b 6c 79 20 61 6c 65 72 74 20 74   quickly alert t
24e0: 68 65 20 64 65 76 65 6c 6f 70 65 72 73 20 74 6f  he developers to
24f0: 20 74 68 61 74 20 66 61 63 74 20 77 68 65 6e 20   that fact when 
2500: 74 68 65 0a 73 69 74 75 61 74 69 6f 6e 20 61 72  the.situation ar
2510: 69 73 65 73 2e 20 20 42 75 74 20 69 66 2c 20 66  ises.  But if, f
2520: 6f 72 20 73 6f 6d 65 20 72 65 61 73 6f 6e 2c 20  or some reason, 
2530: 74 68 65 20 70 72 65 2d 63 6f 6e 64 69 74 69 6f  the pre-conditio
2540: 6e 73 20 61 72 65 0a 6e 6f 74 20 73 61 74 69 73  ns are.not satis
2550: 66 69 65 64 20 69 6e 20 61 20 72 65 6c 65 61 73  fied in a releas
2560: 65 20 62 75 69 6c 64 2c 20 74 68 65 20 70 72 6f  e build, the pro
2570: 67 72 61 6d 20 77 69 6c 6c 20 73 74 69 6c 6c 20  gram will still 
2580: 62 65 68 61 76 65 20 73 61 6e 65 6c 79 0a 61 6e  behave sanely.an
2590: 64 20 77 69 6c 6c 20 6e 6f 74 20 64 6f 20 61 6e  d will not do an
25a0: 20 75 6e 64 65 66 69 6e 65 64 20 6d 65 6d 6f 72   undefined memor
25b0: 79 20 61 63 63 65 73 73 2e 0a 0a 3c 70 3e 0a 54  y access...<p>.T
25c0: 68 65 20 74 65 73 74 63 61 73 65 28 29 20 6d 61  he testcase() ma
25d0: 63 72 6f 20 69 73 20 6f 66 74 65 6e 20 75 73 65  cro is often use
25e0: 64 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  d to verify that
25f0: 20 62 6f 75 6e 64 61 72 79 0a 63 61 73 65 73 20   boundary.cases 
2600: 6f 66 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  of an inequality
2610: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20   comparison are 
2620: 63 68 65 63 6b 65 64 2e 20 20 46 6f 72 20 65 78  checked.  For ex
2630: 61 6d 70 6c 65 2c 20 61 74 0a 5b 68 74 74 70 73  ample, at.[https
2640: 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72  ://sqlite.org/sr
2650: 63 2f 61 72 74 69 66 61 63 74 2f 31 38 61 35 33  c/artifact/18a53
2660: 35 34 30 61 61 33 3f 6c 6e 3d 35 37 36 36 5d 2e  540aa3?ln=5766].
2670: 20 20 54 68 65 73 65 0a 6b 69 6e 64 20 6f 66 20    These.kind of 
2680: 63 68 65 63 6b 73 20 68 65 6c 70 20 74 6f 20 70  checks help to p
2690: 72 65 76 65 6e 74 20 6f 66 66 2d 62 79 2d 6f 6e  revent off-by-on
26a0: 65 20 65 72 72 6f 72 73 2e 0a                    e errors..