/ Hex Artifact Content
Login

Artifact 11bbdf7def3746a762fbdb56c9d04648135ad6d8:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64  ile contains cod
0190: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  e to implement a
01a0: 20 70 73 65 75 64 6f 2d 72 61 6e 64 6f 6d 20 6e   pseudo-random n
01b0: 75 6d 62 65 72 0a 2a 2a 20 67 65 6e 65 72 61 74  umber.** generat
01c0: 6f 72 20 28 50 52 4e 47 29 20 66 6f 72 20 53 51  or (PRNG) for SQ
01d0: 4c 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 61 6e 64  Lite..**.** Rand
01e0: 6f 6d 20 6e 75 6d 62 65 72 73 20 61 72 65 20 75  om numbers are u
01f0: 73 65 64 20 62 79 20 73 6f 6d 65 20 6f 66 20 74  sed by some of t
0200: 68 65 20 64 61 74 61 62 61 73 65 20 62 61 63 6b  he database back
0210: 65 6e 64 73 20 69 6e 20 6f 72 64 65 72 0a 2a 2a  ends in order.**
0220: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 72 61 6e   to generate ran
0230: 64 6f 6d 20 69 6e 74 65 67 65 72 20 6b 65 79 73  dom integer keys
0240: 20 66 6f 72 20 74 61 62 6c 65 73 20 6f 72 20 72   for tables or r
0250: 61 6e 64 6f 6d 20 66 69 6c 65 6e 61 6d 65 73 2e  andom filenames.
0260: 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 72 61 6e 64  .**.** $Id: rand
0270: 6f 6d 2e 63 2c 76 20 31 2e 32 36 20 32 30 30 38  om.c,v 1.26 2008
0280: 2f 30 39 2f 30 32 20 30 30 3a 35 32 3a 35 32 20  /09/02 00:52:52 
0290: 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e  drh Exp $.*/.#in
02a0: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74  clude "sqliteInt
02b0: 2e 68 22 0a 0a 0a 2f 2a 20 41 6c 6c 20 74 68 72  .h".../* All thr
02c0: 65 61 64 73 20 73 68 61 72 65 20 61 20 73 69 6e  eads share a sin
02d0: 67 6c 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65  gle random numbe
02e0: 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2a 20  r generator..** 
02f0: 54 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  This structure i
0300: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  s the current st
0310: 61 74 65 20 6f 66 20 74 68 65 20 67 65 6e 65 72  ate of the gener
0320: 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ator..*/.static 
0330: 53 51 4c 49 54 45 5f 57 53 44 20 73 74 72 75 63  SQLITE_WSD struc
0340: 74 20 73 71 6c 69 74 65 33 50 72 6e 67 54 79 70  t sqlite3PrngTyp
0350: 65 20 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  e {.  unsigned c
0360: 68 61 72 20 69 73 49 6e 69 74 3b 20 20 20 20 20  har isInit;     
0370: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
0380: 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20  initialized */. 
0390: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69   unsigned char i
03a0: 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
03b0: 2f 2a 20 53 74 61 74 65 20 76 61 72 69 61 62 6c  /* State variabl
03c0: 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  es */.  unsigned
03d0: 20 63 68 61 72 20 73 5b 32 35 36 5d 3b 20 20 20   char s[256];   
03e0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 20         /* State 
03f0: 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 7d 20 73  variables */.} s
0400: 71 6c 69 74 65 33 50 72 6e 67 20 3d 20 7b 20 30  qlite3Prng = { 0
0410: 2c 20 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  , };../*.** Get 
0420: 61 20 73 69 6e 67 6c 65 20 38 2d 62 69 74 20 72  a single 8-bit r
0430: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 66 72 6f 6d  andom value from
0440: 20 74 68 65 20 52 43 34 20 50 52 4e 47 2e 20 20   the RC4 PRNG.  
0450: 54 68 65 20 4d 75 74 65 78 0a 2a 2a 20 6d 75 73  The Mutex.** mus
0460: 74 20 62 65 20 68 65 6c 64 20 77 68 69 6c 65 20  t be held while 
0470: 65 78 65 63 75 74 69 6e 67 20 74 68 69 73 20 72  executing this r
0480: 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 57 68  outine..**.** Wh
0490: 79 20 6e 6f 74 20 6a 75 73 74 20 75 73 65 20 61  y not just use a
04a0: 20 6c 69 62 72 61 72 79 20 72 61 6e 64 6f 6d 20   library random 
04b0: 67 65 6e 65 72 61 74 6f 72 20 6c 69 6b 65 20 6c  generator like l
04c0: 72 61 6e 64 34 38 28 29 20 66 6f 72 20 74 68 69  rand48() for thi
04d0: 73 3f 0a 2a 2a 20 42 65 63 61 75 73 65 20 74 68  s?.** Because th
04e0: 65 20 4f 50 5f 4e 65 77 52 6f 77 69 64 20 6f 70  e OP_NewRowid op
04f0: 63 6f 64 65 20 69 6e 20 74 68 65 20 56 44 42 45  code in the VDBE
0500: 20 64 65 70 65 6e 64 73 20 6f 6e 20 68 61 76 69   depends on havi
0510: 6e 67 20 61 20 76 65 72 79 0a 2a 2a 20 67 6f 6f  ng a very.** goo
0520: 64 20 73 6f 75 72 63 65 20 6f 66 20 72 61 6e 64  d source of rand
0530: 6f 6d 20 6e 75 6d 62 65 72 73 2e 20 20 54 68 65  om numbers.  The
0540: 20 6c 72 61 6e 64 34 38 28 29 20 6c 69 62 72 61   lrand48() libra
0550: 72 79 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 0a  ry function may.
0560: 2a 2a 20 77 65 6c 6c 20 62 65 20 67 6f 6f 64 20  ** well be good 
0570: 65 6e 6f 75 67 68 2e 20 20 42 75 74 20 6d 61 79  enough.  But may
0580: 62 65 20 6e 6f 74 2e 20 20 4f 72 20 6d 61 79 62  be not.  Or mayb
0590: 65 20 6c 72 61 6e 64 34 38 28 29 20 68 61 73 20  e lrand48() has 
05a0: 73 6f 6d 65 0a 2a 2a 20 73 75 62 74 6c 65 20 70  some.** subtle p
05b0: 72 6f 62 6c 65 6d 73 20 6f 6e 20 73 6f 6d 65 20  roblems on some 
05c0: 73 79 73 74 65 6d 73 20 74 68 61 74 20 63 6f 75  systems that cou
05d0: 6c 64 20 63 61 75 73 65 20 70 72 6f 62 6c 65 6d  ld cause problem
05e0: 73 2e 20 20 49 74 20 69 73 20 68 61 72 64 0a 2a  s.  It is hard.*
05f0: 2a 20 74 6f 20 6b 6e 6f 77 2e 20 20 54 6f 20 6d  * to know.  To m
0600: 69 6e 69 6d 69 7a 65 20 74 68 65 20 72 69 73 6b  inimize the risk
0610: 20 6f 66 20 70 72 6f 62 6c 65 6d 73 20 64 75 65   of problems due
0620: 20 74 6f 20 62 61 64 20 6c 72 61 6e 64 34 38 28   to bad lrand48(
0630: 29 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  ).** implementat
0640: 69 6f 6e 73 2c 20 53 51 4c 69 74 65 20 75 73 65  ions, SQLite use
0650: 73 20 74 68 69 73 20 72 61 6e 64 6f 6d 20 6e 75  s this random nu
0660: 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72 20 62  mber generator b
0670: 61 73 65 64 0a 2a 2a 20 6f 6e 20 52 43 34 2c 20  ased.** on RC4, 
0680: 77 68 69 63 68 20 77 65 20 6b 6e 6f 77 20 77 6f  which we know wo
0690: 72 6b 73 20 76 65 72 79 20 77 65 6c 6c 2e 0a 2a  rks very well..*
06a0: 2a 0a 2a 2a 20 28 4c 61 74 65 72 29 3a 20 20 41  *.** (Later):  A
06b0: 63 74 75 61 6c 6c 79 2c 20 4f 50 5f 4e 65 77 52  ctually, OP_NewR
06c0: 6f 77 69 64 20 64 6f 65 73 20 6e 6f 74 20 64 65  owid does not de
06d0: 70 65 6e 64 20 6f 6e 20 61 20 67 6f 6f 64 20 73  pend on a good s
06e0: 6f 75 72 63 65 20 6f 66 0a 2a 2a 20 72 61 6e 64  ource of.** rand
06f0: 6f 6d 6e 65 73 73 20 61 6e 79 20 6d 6f 72 65 2e  omness any more.
0700: 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6c 65    But we will le
0710: 61 76 65 20 74 68 69 73 20 63 6f 64 65 20 69 6e  ave this code in
0720: 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 2e 0a 2a   all the same..*
0730: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 61 6e  /.static int ran
0740: 64 6f 6d 42 79 74 65 28 76 6f 69 64 29 7b 0a 20  domByte(void){. 
0750: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74   unsigned char t
0760: 3b 0a 0a 0a 20 20 2f 2a 20 54 68 65 20 22 77 73  ;...  /* The "ws
0770: 64 50 72 6e 67 22 20 6d 61 63 72 6f 20 77 69 6c  dPrng" macro wil
0780: 6c 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65  l resolve to the
0790: 20 70 73 65 75 64 6f 2d 72 61 6e 64 6f 6d 20 6e   pseudo-random n
07a0: 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72 0a  umber generator.
07b0: 20 20 2a 2a 20 73 74 61 74 65 20 76 65 63 74 6f    ** state vecto
07c0: 72 2e 20 20 49 66 20 77 72 69 74 61 62 6c 65 20  r.  If writable 
07d0: 73 74 61 74 69 63 20 64 61 74 61 20 69 73 20 75  static data is u
07e0: 6e 73 75 70 70 6f 72 74 65 64 20 6f 6e 20 74 68  nsupported on th
07f0: 65 20 74 61 72 67 65 74 2c 0a 20 20 2a 2a 20 77  e target,.  ** w
0800: 65 20 68 61 76 65 20 74 6f 20 6c 6f 63 61 74 65  e have to locate
0810: 20 74 68 65 20 73 74 61 74 65 20 76 65 63 74 6f   the state vecto
0820: 72 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e 20 20  r at run-time.  
0830: 49 6e 20 74 68 65 20 6d 6f 72 65 20 63 6f 6d 6d  In the more comm
0840: 6f 6e 0a 20 20 2a 2a 20 63 61 73 65 20 77 68 65  on.  ** case whe
0850: 72 65 20 77 72 69 74 61 62 6c 65 20 73 74 61 74  re writable stat
0860: 69 63 20 64 61 74 61 20 69 73 20 73 75 70 70 6f  ic data is suppo
0870: 72 74 65 64 2c 20 77 73 64 50 72 6e 67 20 63 61  rted, wsdPrng ca
0880: 6e 20 72 65 66 65 72 20 64 69 72 65 63 74 6c 79  n refer directly
0890: 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 22 73 71  .  ** to the "sq
08a0: 6c 69 74 65 33 50 72 6e 67 22 20 73 74 61 74 65  lite3Prng" state
08b0: 20 76 65 63 74 6f 72 20 64 65 63 6c 61 72 65 64   vector declared
08c0: 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 23 69 66   above..  */.#if
08d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
08e0: 57 53 44 0a 20 20 73 74 72 75 63 74 20 73 71 6c  WSD.  struct sql
08f0: 69 74 65 33 50 72 6e 67 54 79 70 65 20 2a 70 20  ite3PrngType *p 
0900: 3d 20 26 47 4c 4f 42 41 4c 28 73 74 72 75 63 74  = &GLOBAL(struct
0910: 20 73 71 6c 69 74 65 33 50 72 6e 67 54 79 70 65   sqlite3PrngType
0920: 2c 20 73 71 6c 69 74 65 33 50 72 6e 67 29 3b 0a  , sqlite3Prng);.
0930: 23 20 64 65 66 69 6e 65 20 77 73 64 50 72 6e 67  # define wsdPrng
0940: 20 70 5b 30 5d 0a 23 65 6c 73 65 0a 23 20 64 65   p[0].#else.# de
0950: 66 69 6e 65 20 77 73 64 50 72 6e 67 20 73 71 6c  fine wsdPrng sql
0960: 69 74 65 33 50 72 6e 67 0a 23 65 6e 64 69 66 0a  ite3Prng.#endif.
0970: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
0980: 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  e the state of t
0990: 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  he random number
09a0: 20 67 65 6e 65 72 61 74 6f 72 20 6f 6e 63 65 2c   generator once,
09b0: 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20  .  ** the first 
09c0: 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e  time this routin
09d0: 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 54 68  e is called.  Th
09e0: 65 20 73 65 65 64 20 76 61 6c 75 65 20 64 6f 65  e seed value doe
09f0: 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65 65 64 20  s.  ** not need 
0a00: 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 6c 6f 74  to contain a lot
0a10: 20 6f 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20 73   of randomness s
0a20: 69 6e 63 65 20 77 65 20 61 72 65 20 6e 6f 74 0a  ince we are not.
0a30: 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 64    ** trying to d
0a40: 6f 20 73 65 63 75 72 65 20 65 6e 63 72 79 70 74  o secure encrypt
0a50: 69 6f 6e 20 6f 72 20 61 6e 79 74 68 69 6e 67 20  ion or anything 
0a60: 6c 69 6b 65 20 74 68 61 74 2e 2e 2e 0a 20 20 2a  like that....  *
0a70: 2a 0a 20 20 2a 2a 20 4e 6f 74 68 69 6e 67 20 69  *.  ** Nothing i
0a80: 6e 20 74 68 69 73 20 66 69 6c 65 20 6f 72 20 61  n this file or a
0a90: 6e 79 77 68 65 72 65 20 65 6c 73 65 20 69 6e 20  nywhere else in 
0aa0: 53 51 4c 69 74 65 20 64 6f 65 73 20 61 6e 79 20  SQLite does any 
0ab0: 6b 69 6e 64 20 6f 66 0a 20 20 2a 2a 20 65 6e 63  kind of.  ** enc
0ac0: 72 79 70 74 69 6f 6e 2e 20 20 54 68 65 20 52 43  ryption.  The RC
0ad0: 34 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 62  4 algorithm is b
0ae0: 65 69 6e 67 20 75 73 65 64 20 61 73 20 61 20 50  eing used as a P
0af0: 52 4e 47 20 28 70 73 65 75 64 6f 2d 72 61 6e 64  RNG (pseudo-rand
0b00: 6f 6d 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67  om.  ** number g
0b10: 65 6e 65 72 61 74 6f 72 29 20 6e 6f 74 20 61 73  enerator) not as
0b20: 20 61 6e 20 65 6e 63 72 79 70 74 69 6f 6e 20 64   an encryption d
0b30: 65 76 69 63 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  evice..  */.  if
0b40: 28 20 21 77 73 64 50 72 6e 67 2e 69 73 49 6e 69  ( !wsdPrng.isIni
0b50: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ){.    int i;.
0b60: 20 20 20 20 63 68 61 72 20 6b 5b 32 35 36 5d 3b      char k[256];
0b70: 0a 20 20 20 20 77 73 64 50 72 6e 67 2e 6a 20 3d  .    wsdPrng.j =
0b80: 20 30 3b 0a 20 20 20 20 77 73 64 50 72 6e 67 2e   0;.    wsdPrng.
0b90: 69 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  i = 0;.    sqlit
0ba0: 65 33 4f 73 52 61 6e 64 6f 6d 6e 65 73 73 28 73  e3OsRandomness(s
0bb0: 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
0bc0: 30 29 2c 20 32 35 36 2c 20 6b 29 3b 0a 20 20 20  0), 256, k);.   
0bd0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 35 36 3b   for(i=0; i<256;
0be0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 73 64   i++){.      wsd
0bf0: 50 72 6e 67 2e 73 5b 69 5d 20 3d 20 69 3b 0a 20  Prng.s[i] = i;. 
0c00: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
0c10: 3b 20 69 3c 32 35 36 3b 20 69 2b 2b 29 7b 0a 20  ; i<256; i++){. 
0c20: 20 20 20 20 20 77 73 64 50 72 6e 67 2e 6a 20 2b       wsdPrng.j +
0c30: 3d 20 77 73 64 50 72 6e 67 2e 73 5b 69 5d 20 2b  = wsdPrng.s[i] +
0c40: 20 6b 5b 69 5d 3b 0a 20 20 20 20 20 20 74 20 3d   k[i];.      t =
0c50: 20 77 73 64 50 72 6e 67 2e 73 5b 77 73 64 50 72   wsdPrng.s[wsdPr
0c60: 6e 67 2e 6a 5d 3b 0a 20 20 20 20 20 20 77 73 64  ng.j];.      wsd
0c70: 50 72 6e 67 2e 73 5b 77 73 64 50 72 6e 67 2e 6a  Prng.s[wsdPrng.j
0c80: 5d 20 3d 20 77 73 64 50 72 6e 67 2e 73 5b 69 5d  ] = wsdPrng.s[i]
0c90: 3b 0a 20 20 20 20 20 20 77 73 64 50 72 6e 67 2e  ;.      wsdPrng.
0ca0: 73 5b 69 5d 20 3d 20 74 3b 0a 20 20 20 20 7d 0a  s[i] = t;.    }.
0cb0: 20 20 20 20 77 73 64 50 72 6e 67 2e 69 73 49 6e      wsdPrng.isIn
0cc0: 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  it = 1;.  }..  /
0cd0: 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 64 20 72  * Generate and r
0ce0: 65 74 75 72 6e 20 73 69 6e 67 6c 65 20 72 61 6e  eturn single ran
0cf0: 64 6f 6d 20 62 79 74 65 0a 20 20 2a 2f 0a 20 20  dom byte.  */.  
0d00: 77 73 64 50 72 6e 67 2e 69 2b 2b 3b 0a 20 20 74  wsdPrng.i++;.  t
0d10: 20 3d 20 77 73 64 50 72 6e 67 2e 73 5b 77 73 64   = wsdPrng.s[wsd
0d20: 50 72 6e 67 2e 69 5d 3b 0a 20 20 77 73 64 50 72  Prng.i];.  wsdPr
0d30: 6e 67 2e 6a 20 2b 3d 20 74 3b 0a 20 20 77 73 64  ng.j += t;.  wsd
0d40: 50 72 6e 67 2e 73 5b 77 73 64 50 72 6e 67 2e 69  Prng.s[wsdPrng.i
0d50: 5d 20 3d 20 77 73 64 50 72 6e 67 2e 73 5b 77 73  ] = wsdPrng.s[ws
0d60: 64 50 72 6e 67 2e 6a 5d 3b 0a 20 20 77 73 64 50  dPrng.j];.  wsdP
0d70: 72 6e 67 2e 73 5b 77 73 64 50 72 6e 67 2e 6a 5d  rng.s[wsdPrng.j]
0d80: 20 3d 20 74 3b 0a 20 20 74 20 2b 3d 20 77 73 64   = t;.  t += wsd
0d90: 50 72 6e 67 2e 73 5b 77 73 64 50 72 6e 67 2e 69  Prng.s[wsdPrng.i
0da0: 5d 3b 0a 20 20 72 65 74 75 72 6e 20 77 73 64 50  ];.  return wsdP
0db0: 72 6e 67 2e 73 5b 74 5d 3b 0a 7d 0a 0a 2f 2a 0a  rng.s[t];.}../*.
0dc0: 2a 2a 20 52 65 74 75 72 6e 20 4e 20 72 61 6e 64  ** Return N rand
0dd0: 6f 6d 20 62 79 74 65 73 2e 0a 2a 2f 0a 76 6f 69  om bytes..*/.voi
0de0: 64 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d  d sqlite3_random
0df0: 6e 65 73 73 28 69 6e 74 20 4e 2c 20 76 6f 69 64  ness(int N, void
0e00: 20 2a 70 42 75 66 29 7b 0a 20 20 75 6e 73 69 67   *pBuf){.  unsig
0e10: 6e 65 64 20 63 68 61 72 20 2a 7a 42 75 66 20 3d  ned char *zBuf =
0e20: 20 70 42 75 66 3b 0a 23 69 66 6e 64 65 66 20 53   pBuf;.#ifndef S
0e30: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4e 4f 4f 50  QLITE_MUTEX_NOOP
0e40: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
0e50: 20 2a 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65   *mutex = sqlite
0e60: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
0e70: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
0e80: 50 52 4e 47 29 3b 0a 23 65 6e 64 69 66 0a 20 20  PRNG);.#endif.  
0e90: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
0ea0: 74 65 72 28 6d 75 74 65 78 29 3b 0a 20 20 77 68  ter(mutex);.  wh
0eb0: 69 6c 65 28 20 4e 2d 2d 20 29 7b 0a 20 20 20 20  ile( N-- ){.    
0ec0: 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 72 61 6e 64  *(zBuf++) = rand
0ed0: 6f 6d 42 79 74 65 28 29 3b 0a 20 20 7d 0a 20 20  omByte();.  }.  
0ee0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
0ef0: 61 76 65 28 6d 75 74 65 78 29 3b 0a 7d 0a 0a 23  ave(mutex);.}..#
0f00: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0f10: 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 0a  IT_BUILTIN_TEST.
0f20: 2f 2a 0a 2a 2a 20 46 6f 72 20 74 65 73 74 69 6e  /*.** For testin
0f30: 67 20 70 75 72 70 6f 73 65 73 2c 20 77 65 20 73  g purposes, we s
0f40: 6f 6d 65 74 69 6d 65 73 20 77 61 6e 74 20 74 6f  ometimes want to
0f50: 20 70 72 65 73 65 72 76 65 20 74 68 65 20 73 74   preserve the st
0f60: 61 74 65 20 6f 66 0a 2a 2a 20 50 52 4e 47 20 61  ate of.** PRNG a
0f70: 6e 64 20 72 65 73 74 6f 72 65 20 74 68 65 20 50  nd restore the P
0f80: 52 4e 47 20 74 6f 20 69 74 73 20 73 61 76 65 64  RNG to its saved
0f90: 20 73 74 61 74 65 20 61 74 20 61 20 6c 61 74 65   state at a late
0fa0: 72 20 74 69 6d 65 2c 20 6f 72 0a 2a 2a 20 74 6f  r time, or.** to
0fb0: 20 72 65 73 65 74 20 74 68 65 20 50 52 4e 47 20   reset the PRNG 
0fc0: 74 6f 20 69 74 73 20 69 6e 69 74 69 61 6c 20 73  to its initial s
0fd0: 74 61 74 65 2e 20 20 54 68 65 73 65 20 72 6f 75  tate.  These rou
0fe0: 74 69 6e 65 73 20 61 63 63 6f 6d 70 6c 69 73 68  tines accomplish
0ff0: 0a 2a 2a 20 74 68 6f 73 65 20 74 61 73 6b 73 2e  .** those tasks.
1000: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  .**.** The sqlit
1010: 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1020: 29 20 69 6e 74 65 72 66 61 63 65 20 63 61 6c 6c  ) interface call
1030: 73 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  s these routines
1040: 20 74 6f 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74   to.** control t
1050: 68 65 20 50 52 4e 47 2e 0a 2a 2f 0a 73 74 61 74  he PRNG..*/.stat
1060: 69 63 20 53 51 4c 49 54 45 5f 57 53 44 20 73 74  ic SQLITE_WSD st
1070: 72 75 63 74 20 73 71 6c 69 74 65 33 50 72 6e 67  ruct sqlite3Prng
1080: 54 79 70 65 20 73 71 6c 69 74 65 33 53 61 76 65  Type sqlite3Save
1090: 64 50 72 6e 67 20 3d 20 7b 20 30 2c 20 7d 3b 0a  dPrng = { 0, };.
10a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 6e 67  void sqlite3Prng
10b0: 53 61 76 65 53 74 61 74 65 28 76 6f 69 64 29 7b  SaveState(void){
10c0: 0a 20 20 6d 65 6d 63 70 79 28 0a 20 20 20 20 26  .  memcpy(.    &
10d0: 47 4c 4f 42 41 4c 28 73 74 72 75 63 74 20 73 71  GLOBAL(struct sq
10e0: 6c 69 74 65 33 50 72 6e 67 54 79 70 65 2c 20 73  lite3PrngType, s
10f0: 71 6c 69 74 65 33 53 61 76 65 64 50 72 6e 67 29  qlite3SavedPrng)
1100: 2c 0a 20 20 20 20 26 47 4c 4f 42 41 4c 28 73 74  ,.    &GLOBAL(st
1110: 72 75 63 74 20 73 71 6c 69 74 65 33 50 72 6e 67  ruct sqlite3Prng
1120: 54 79 70 65 2c 20 73 71 6c 69 74 65 33 50 72 6e  Type, sqlite3Prn
1130: 67 29 2c 0a 20 20 20 20 73 69 7a 65 6f 66 28 73  g),.    sizeof(s
1140: 71 6c 69 74 65 33 50 72 6e 67 29 0a 20 20 29 3b  qlite3Prng).  );
1150: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  .}.void sqlite3P
1160: 72 6e 67 52 65 73 74 6f 72 65 53 74 61 74 65 28  rngRestoreState(
1170: 76 6f 69 64 29 7b 0a 20 20 6d 65 6d 63 70 79 28  void){.  memcpy(
1180: 0a 20 20 20 20 26 47 4c 4f 42 41 4c 28 73 74 72  .    &GLOBAL(str
1190: 75 63 74 20 73 71 6c 69 74 65 33 50 72 6e 67 54  uct sqlite3PrngT
11a0: 79 70 65 2c 20 73 71 6c 69 74 65 33 50 72 6e 67  ype, sqlite3Prng
11b0: 29 2c 0a 20 20 20 20 26 47 4c 4f 42 41 4c 28 73  ),.    &GLOBAL(s
11c0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 50 72 6e  truct sqlite3Prn
11d0: 67 54 79 70 65 2c 20 73 71 6c 69 74 65 33 53 61  gType, sqlite3Sa
11e0: 76 65 64 50 72 6e 67 29 2c 0a 20 20 20 20 73 69  vedPrng),.    si
11f0: 7a 65 6f 66 28 73 71 6c 69 74 65 33 50 72 6e 67  zeof(sqlite3Prng
1200: 29 0a 20 20 29 3b 0a 7d 0a 76 6f 69 64 20 73 71  ).  );.}.void sq
1210: 6c 69 74 65 33 50 72 6e 67 52 65 73 65 74 53 74  lite3PrngResetSt
1220: 61 74 65 28 76 6f 69 64 29 7b 0a 20 20 47 4c 4f  ate(void){.  GLO
1230: 42 41 4c 28 73 74 72 75 63 74 20 73 71 6c 69 74  BAL(struct sqlit
1240: 65 33 50 72 6e 67 54 79 70 65 2c 20 73 71 6c 69  e3PrngType, sqli
1250: 74 65 33 50 72 6e 67 29 2e 69 73 49 6e 69 74 20  te3Prng).isInit 
1260: 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  = 0;.}.#endif /*
1270: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49   SQLITE_OMIT_BUI
1280: 4c 54 49 4e 5f 54 45 53 54 20 2a 2f 0a           LTIN_TEST */.