/ Hex Artifact Content
Login

Artifact 8b6ab5418cf0f4dde551730825d67da1457c2b3c:


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 32 20 32 30 30 38  om.c,v 1.22 2008
0280: 2f 30 33 2f 31 39 20 31 34 3a 31 35 3a 33 35 20  /03/19 14:15:35 
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: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 50 72  struct sqlite3Pr
0340: 6e 67 54 79 70 65 20 7b 0a 20 20 75 6e 73 69 67  ngType {.  unsig
0350: 6e 65 64 20 63 68 61 72 20 69 73 49 6e 69 74 3b  ned char isInit;
0360: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
0370: 65 20 69 66 20 69 6e 69 74 69 61 6c 69 7a 65 64  e if initialized
0380: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
0390: 68 61 72 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  har i, j;       
03a0: 20 20 20 20 20 2f 2a 20 53 74 61 74 65 20 76 61       /* State va
03b0: 72 69 61 62 6c 65 73 20 2a 2f 0a 20 20 75 6e 73  riables */.  uns
03c0: 69 67 6e 65 64 20 63 68 61 72 20 73 5b 32 35 36  igned char s[256
03d0: 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ];          /* S
03e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 73 20 2a  tate variables *
03f0: 2f 0a 7d 20 73 71 6c 69 74 65 33 50 72 6e 67 3b  /.} sqlite3Prng;
0400: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 73 69  ../*.** Get a si
0410: 6e 67 6c 65 20 38 2d 62 69 74 20 72 61 6e 64 6f  ngle 8-bit rando
0420: 6d 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65  m value from the
0430: 20 52 43 34 20 50 52 4e 47 2e 20 20 54 68 65 20   RC4 PRNG.  The 
0440: 4d 75 74 65 78 0a 2a 2a 20 6d 75 73 74 20 62 65  Mutex.** must be
0450: 20 68 65 6c 64 20 77 68 69 6c 65 20 65 78 65 63   held while exec
0460: 75 74 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  uting this routi
0470: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 79 20 6e 6f  ne..**.** Why no
0480: 74 20 6a 75 73 74 20 75 73 65 20 61 20 6c 69 62  t just use a lib
0490: 72 61 72 79 20 72 61 6e 64 6f 6d 20 67 65 6e 65  rary random gene
04a0: 72 61 74 6f 72 20 6c 69 6b 65 20 6c 72 61 6e 64  rator like lrand
04b0: 34 38 28 29 20 66 6f 72 20 74 68 69 73 3f 0a 2a  48() for this?.*
04c0: 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 4f 50  * Because the OP
04d0: 5f 4e 65 77 52 6f 77 69 64 20 6f 70 63 6f 64 65  _NewRowid opcode
04e0: 20 69 6e 20 74 68 65 20 56 44 42 45 20 64 65 70   in the VDBE dep
04f0: 65 6e 64 73 20 6f 6e 20 68 61 76 69 6e 67 20 61  ends on having a
0500: 20 76 65 72 79 0a 2a 2a 20 67 6f 6f 64 20 73 6f   very.** good so
0510: 75 72 63 65 20 6f 66 20 72 61 6e 64 6f 6d 20 6e  urce of random n
0520: 75 6d 62 65 72 73 2e 20 20 54 68 65 20 6c 72 61  umbers.  The lra
0530: 6e 64 34 38 28 29 20 6c 69 62 72 61 72 79 20 66  nd48() library f
0540: 75 6e 63 74 69 6f 6e 20 6d 61 79 0a 2a 2a 20 77  unction may.** w
0550: 65 6c 6c 20 62 65 20 67 6f 6f 64 20 65 6e 6f 75  ell be good enou
0560: 67 68 2e 20 20 42 75 74 20 6d 61 79 62 65 20 6e  gh.  But maybe n
0570: 6f 74 2e 20 20 4f 72 20 6d 61 79 62 65 20 6c 72  ot.  Or maybe lr
0580: 61 6e 64 34 38 28 29 20 68 61 73 20 73 6f 6d 65  and48() has some
0590: 0a 2a 2a 20 73 75 62 74 6c 65 20 70 72 6f 62 6c  .** subtle probl
05a0: 65 6d 73 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74  ems on some syst
05b0: 65 6d 73 20 74 68 61 74 20 63 6f 75 6c 64 20 63  ems that could c
05c0: 61 75 73 65 20 70 72 6f 62 6c 65 6d 73 2e 20 20  ause problems.  
05d0: 49 74 20 69 73 20 68 61 72 64 0a 2a 2a 20 74 6f  It is hard.** to
05e0: 20 6b 6e 6f 77 2e 20 20 54 6f 20 6d 69 6e 69 6d   know.  To minim
05f0: 69 7a 65 20 74 68 65 20 72 69 73 6b 20 6f 66 20  ize the risk of 
0600: 70 72 6f 62 6c 65 6d 73 20 64 75 65 20 74 6f 20  problems due to 
0610: 62 61 64 20 6c 72 61 6e 64 34 38 28 29 0a 2a 2a  bad lrand48().**
0620: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
0630: 2c 20 53 51 4c 69 74 65 20 75 73 65 73 20 74 68  , SQLite uses th
0640: 69 73 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  is random number
0650: 20 67 65 6e 65 72 61 74 6f 72 20 62 61 73 65 64   generator based
0660: 0a 2a 2a 20 6f 6e 20 52 43 34 2c 20 77 68 69 63  .** on RC4, whic
0670: 68 20 77 65 20 6b 6e 6f 77 20 77 6f 72 6b 73 20  h we know works 
0680: 76 65 72 79 20 77 65 6c 6c 2e 0a 2a 2a 0a 2a 2a  very well..**.**
0690: 20 28 4c 61 74 65 72 29 3a 20 20 41 63 74 75 61   (Later):  Actua
06a0: 6c 6c 79 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  lly, OP_NewRowid
06b0: 20 64 6f 65 73 20 6e 6f 74 20 64 65 70 65 6e 64   does not depend
06c0: 20 6f 6e 20 61 20 67 6f 6f 64 20 73 6f 75 72 63   on a good sourc
06d0: 65 20 6f 66 0a 2a 2a 20 72 61 6e 64 6f 6d 6e 65  e of.** randomne
06e0: 73 73 20 61 6e 79 20 6d 6f 72 65 2e 20 20 42 75  ss any more.  Bu
06f0: 74 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20  t we will leave 
0700: 74 68 69 73 20 63 6f 64 65 20 69 6e 20 61 6c 6c  this code in all
0710: 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74   the same..*/.st
0720: 61 74 69 63 20 69 6e 74 20 72 61 6e 64 6f 6d 42  atic int randomB
0730: 79 74 65 28 76 6f 69 64 29 7b 0a 20 20 75 6e 73  yte(void){.  uns
0740: 69 67 6e 65 64 20 63 68 61 72 20 74 3b 0a 0a 0a  igned char t;...
0750: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
0760: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
0770: 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67   random number g
0780: 65 6e 65 72 61 74 6f 72 20 6f 6e 63 65 2c 0a 20  enerator once,. 
0790: 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 69   ** the first ti
07a0: 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  me this routine 
07b0: 69 73 20 63 61 6c 6c 65 64 2e 20 20 54 68 65 20  is called.  The 
07c0: 73 65 65 64 20 76 61 6c 75 65 20 64 6f 65 73 0a  seed value does.
07d0: 20 20 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f    ** not need to
07e0: 20 63 6f 6e 74 61 69 6e 20 61 20 6c 6f 74 20 6f   contain a lot o
07f0: 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20 73 69 6e  f randomness sin
0800: 63 65 20 77 65 20 61 72 65 20 6e 6f 74 0a 20 20  ce we are not.  
0810: 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 64 6f 20  ** trying to do 
0820: 73 65 63 75 72 65 20 65 6e 63 72 79 70 74 69 6f  secure encryptio
0830: 6e 20 6f 72 20 61 6e 79 74 68 69 6e 67 20 6c 69  n or anything li
0840: 6b 65 20 74 68 61 74 2e 2e 2e 0a 20 20 2a 2a 0a  ke that....  **.
0850: 20 20 2a 2a 20 4e 6f 74 68 69 6e 67 20 69 6e 20    ** Nothing in 
0860: 74 68 69 73 20 66 69 6c 65 20 6f 72 20 61 6e 79  this file or any
0870: 77 68 65 72 65 20 65 6c 73 65 20 69 6e 20 53 51  where else in SQ
0880: 4c 69 74 65 20 64 6f 65 73 20 61 6e 79 20 6b 69  Lite does any ki
0890: 6e 64 20 6f 66 0a 20 20 2a 2a 20 65 6e 63 72 79  nd of.  ** encry
08a0: 70 74 69 6f 6e 2e 20 20 54 68 65 20 52 43 34 20  ption.  The RC4 
08b0: 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 62 65 69  algorithm is bei
08c0: 6e 67 20 75 73 65 64 20 61 73 20 61 20 50 52 4e  ng used as a PRN
08d0: 47 20 28 70 73 65 75 64 6f 2d 72 61 6e 64 6f 6d  G (pseudo-random
08e0: 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 65 6e  .  ** number gen
08f0: 65 72 61 74 6f 72 29 20 6e 6f 74 20 61 73 20 61  erator) not as a
0900: 6e 20 65 6e 63 72 79 70 74 69 6f 6e 20 64 65 76  n encryption dev
0910: 69 63 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ice..  */.  if( 
0920: 21 73 71 6c 69 74 65 33 50 72 6e 67 2e 69 73 49  !sqlite3Prng.isI
0930: 6e 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  nit ){.    int i
0940: 3b 0a 20 20 20 20 63 68 61 72 20 6b 5b 32 35 36  ;.    char k[256
0950: 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  ];.    sqlite3Pr
0960: 6e 67 2e 6a 20 3d 20 30 3b 0a 20 20 20 20 73 71  ng.j = 0;.    sq
0970: 6c 69 74 65 33 50 72 6e 67 2e 69 20 3d 20 30 3b  lite3Prng.i = 0;
0980: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 52 61  .    sqlite3OsRa
0990: 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33  ndomness(sqlite3
09a0: 5f 76 66 73 5f 66 69 6e 64 28 30 29 2c 20 32 35  _vfs_find(0), 25
09b0: 36 2c 20 6b 29 3b 0a 20 20 20 20 66 6f 72 28 69  6, k);.    for(i
09c0: 3d 30 3b 20 69 3c 32 35 36 3b 20 69 2b 2b 29 7b  =0; i<256; i++){
09d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72  .      sqlite3Pr
09e0: 6e 67 2e 73 5b 69 5d 20 3d 20 69 3b 0a 20 20 20  ng.s[i] = i;.   
09f0: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
0a00: 69 3c 32 35 36 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<256; i++){.   
0a10: 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 2e 6a     sqlite3Prng.j
0a20: 20 2b 3d 20 73 71 6c 69 74 65 33 50 72 6e 67 2e   += sqlite3Prng.
0a30: 73 5b 69 5d 20 2b 20 6b 5b 69 5d 3b 0a 20 20 20  s[i] + k[i];.   
0a40: 20 20 20 74 20 3d 20 73 71 6c 69 74 65 33 50 72     t = sqlite3Pr
0a50: 6e 67 2e 73 5b 73 71 6c 69 74 65 33 50 72 6e 67  ng.s[sqlite3Prng
0a60: 2e 6a 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  .j];.      sqlit
0a70: 65 33 50 72 6e 67 2e 73 5b 73 71 6c 69 74 65 33  e3Prng.s[sqlite3
0a80: 50 72 6e 67 2e 6a 5d 20 3d 20 73 71 6c 69 74 65  Prng.j] = sqlite
0a90: 33 50 72 6e 67 2e 73 5b 69 5d 3b 0a 20 20 20 20  3Prng.s[i];.    
0aa0: 20 20 73 71 6c 69 74 65 33 50 72 6e 67 2e 73 5b    sqlite3Prng.s[
0ab0: 69 5d 20 3d 20 74 3b 0a 20 20 20 20 7d 0a 20 20  i] = t;.    }.  
0ac0: 20 20 73 71 6c 69 74 65 33 50 72 6e 67 2e 69 73    sqlite3Prng.is
0ad0: 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  Init = 1;.  }.. 
0ae0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 64   /* Generate and
0af0: 20 72 65 74 75 72 6e 20 73 69 6e 67 6c 65 20 72   return single r
0b00: 61 6e 64 6f 6d 20 62 79 74 65 0a 20 20 2a 2f 0a  andom byte.  */.
0b10: 20 20 73 71 6c 69 74 65 33 50 72 6e 67 2e 69 2b    sqlite3Prng.i+
0b20: 2b 3b 0a 20 20 74 20 3d 20 73 71 6c 69 74 65 33  +;.  t = sqlite3
0b30: 50 72 6e 67 2e 73 5b 73 71 6c 69 74 65 33 50 72  Prng.s[sqlite3Pr
0b40: 6e 67 2e 69 5d 3b 0a 20 20 73 71 6c 69 74 65 33  ng.i];.  sqlite3
0b50: 50 72 6e 67 2e 6a 20 2b 3d 20 74 3b 0a 20 20 73  Prng.j += t;.  s
0b60: 71 6c 69 74 65 33 50 72 6e 67 2e 73 5b 73 71 6c  qlite3Prng.s[sql
0b70: 69 74 65 33 50 72 6e 67 2e 69 5d 20 3d 20 73 71  ite3Prng.i] = sq
0b80: 6c 69 74 65 33 50 72 6e 67 2e 73 5b 73 71 6c 69  lite3Prng.s[sqli
0b90: 74 65 33 50 72 6e 67 2e 6a 5d 3b 0a 20 20 73 71  te3Prng.j];.  sq
0ba0: 6c 69 74 65 33 50 72 6e 67 2e 73 5b 73 71 6c 69  lite3Prng.s[sqli
0bb0: 74 65 33 50 72 6e 67 2e 6a 5d 20 3d 20 74 3b 0a  te3Prng.j] = t;.
0bc0: 20 20 74 20 2b 3d 20 73 71 6c 69 74 65 33 50 72    t += sqlite3Pr
0bd0: 6e 67 2e 73 5b 73 71 6c 69 74 65 33 50 72 6e 67  ng.s[sqlite3Prng
0be0: 2e 69 5d 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  .i];.  return sq
0bf0: 6c 69 74 65 33 50 72 6e 67 2e 73 5b 74 5d 3b 0a  lite3Prng.s[t];.
0c00: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
0c10: 4e 20 72 61 6e 64 6f 6d 20 62 79 74 65 73 2e 0a  N random bytes..
0c20: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  */.void sqlite3_
0c30: 72 61 6e 64 6f 6d 6e 65 73 73 28 69 6e 74 20 4e  randomness(int N
0c40: 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
0c50: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
0c60: 7a 42 75 66 20 3d 20 70 42 75 66 3b 0a 20 20 73  zBuf = pBuf;.  s
0c70: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 6d 75  tatic sqlite3_mu
0c80: 74 65 78 20 2a 6d 75 74 65 78 20 3d 20 30 3b 0a  tex *mutex = 0;.
0c90: 20 20 69 66 28 20 6d 75 74 65 78 3d 3d 30 20 29    if( mutex==0 )
0ca0: 7b 0a 20 20 20 20 6d 75 74 65 78 20 3d 20 73 71  {.    mutex = sq
0cb0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
0cc0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
0cd0: 54 41 54 49 43 5f 50 52 4e 47 29 3b 0a 20 20 7d  TATIC_PRNG);.  }
0ce0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
0cf0: 5f 65 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a 20  _enter(mutex);. 
0d00: 20 77 68 69 6c 65 28 20 4e 2d 2d 20 29 7b 0a 20   while( N-- ){. 
0d10: 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 72     *(zBuf++) = r
0d20: 61 6e 64 6f 6d 42 79 74 65 28 29 3b 0a 20 20 7d  andomByte();.  }
0d30: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
0d40: 5f 6c 65 61 76 65 28 6d 75 74 65 78 29 3b 0a 7d  _leave(mutex);.}
0d50: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
0d60: 5f 4f 4d 49 54 5f 54 45 53 54 4c 4f 47 49 43 0a  _OMIT_TESTLOGIC.
0d70: 2f 2a 0a 2a 2a 20 46 6f 72 20 74 65 73 74 69 6e  /*.** For testin
0d80: 67 20 70 75 72 70 6f 73 65 73 2c 20 77 65 20 73  g purposes, we s
0d90: 6f 6d 65 74 69 6d 65 73 20 77 61 6e 74 20 74 6f  ometimes want to
0da0: 20 70 72 65 73 65 72 76 65 20 74 68 65 20 73 74   preserve the st
0db0: 61 74 65 20 6f 66 0a 2a 2a 20 50 52 4e 47 20 61  ate of.** PRNG a
0dc0: 6e 64 20 72 65 73 74 6f 72 65 20 74 68 65 20 50  nd restore the P
0dd0: 52 4e 47 20 74 6f 20 69 74 73 20 73 61 76 65 64  RNG to its saved
0de0: 20 73 74 61 74 65 20 61 74 20 61 20 6c 61 74 65   state at a late
0df0: 72 20 74 69 6d 65 2e 0a 2a 2a 20 54 68 65 20 73  r time..** The s
0e00: 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
0e10: 72 6f 6c 28 29 20 69 6e 74 65 72 66 61 63 65 20  rol() interface 
0e20: 63 61 6c 6c 73 20 74 68 65 73 65 20 72 6f 75 74  calls these rout
0e30: 69 6e 65 73 20 74 6f 0a 2a 2a 20 63 6f 6e 74 72  ines to.** contr
0e40: 6f 6c 20 74 68 65 20 50 52 4e 47 2e 0a 2a 2f 0a  ol the PRNG..*/.
0e50: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73 71  static struct sq
0e60: 6c 69 74 65 33 50 72 6e 67 54 79 70 65 20 73 71  lite3PrngType sq
0e70: 6c 69 74 65 33 53 61 76 65 64 50 72 6e 67 3b 0a  lite3SavedPrng;.
0e80: 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 6e 67  void sqlite3Prng
0e90: 53 61 76 65 53 74 61 74 65 28 76 6f 69 64 29 7b  SaveState(void){
0ea0: 0a 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74  .  memcpy(&sqlit
0eb0: 65 33 53 61 76 65 64 50 72 6e 67 2c 20 26 73 71  e3SavedPrng, &sq
0ec0: 6c 69 74 65 33 50 72 6e 67 2c 20 73 69 7a 65 6f  lite3Prng, sizeo
0ed0: 66 28 73 71 6c 69 74 65 33 50 72 6e 67 29 29 3b  f(sqlite3Prng));
0ee0: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  .}.void sqlite3P
0ef0: 72 6e 67 52 65 73 74 6f 72 65 53 74 61 74 65 28  rngRestoreState(
0f00: 76 6f 69 64 29 7b 0a 20 20 6d 65 6d 63 70 79 28  void){.  memcpy(
0f10: 26 73 71 6c 69 74 65 33 50 72 6e 67 2c 20 26 73  &sqlite3Prng, &s
0f20: 71 6c 69 74 65 33 53 61 76 65 64 50 72 6e 67 2c  qlite3SavedPrng,
0f30: 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 50   sizeof(sqlite3P
0f40: 72 6e 67 29 29 3b 0a 7d 0a 76 6f 69 64 20 73 71  rng));.}.void sq
0f50: 6c 69 74 65 33 50 72 6e 67 52 65 73 65 74 53 74  lite3PrngResetSt
0f60: 61 74 65 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  ate(void){.  sql
0f70: 69 74 65 33 50 72 6e 67 2e 69 73 49 6e 69 74 20  ite3Prng.isInit 
0f80: 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  = 0;.}.#endif /*
0f90: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 53   SQLITE_OMIT_TES
0fa0: 54 4c 4f 47 49 43 20 2a 2f 0a                    TLOGIC */.