/ Hex Artifact Content
Login

Artifact 67f79227273a9009d86a017619717c3f554f50b371294526da59faa6014ed2cd:


0000: 2f 2a 0a 2a 2a 20 54 68 65 20 22 70 72 69 6e 74  /*.** The "print
0010: 66 22 20 63 6f 64 65 20 74 68 61 74 20 66 6f 6c  f" code that fol
0020: 6c 6f 77 73 20 64 61 74 65 73 20 66 72 6f 6d 20  lows dates from 
0030: 74 68 65 20 31 39 38 30 27 73 2e 20 20 49 74 20  the 1980's.  It 
0040: 69 73 20 69 6e 0a 2a 2a 20 74 68 65 20 70 75 62  is in.** the pub
0050: 6c 69 63 20 64 6f 6d 61 69 6e 2e 20 0a 2a 2a 0a  lic domain. .**.
0060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
00a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
00b0: 20 54 68 69 73 20 66 69 6c 65 20 63 6f 6e 74 61   This file conta
00c0: 69 6e 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73  ins code for a s
00d0: 65 74 20 6f 66 20 22 70 72 69 6e 74 66 22 2d 6c  et of "printf"-l
00e0: 69 6b 65 20 72 6f 75 74 69 6e 65 73 2e 20 20 54  ike routines.  T
00f0: 68 65 73 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 73  hese.** routines
0100: 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 73 20   format strings 
0110: 6d 75 63 68 20 6c 69 6b 65 20 74 68 65 20 70 72  much like the pr
0120: 69 6e 74 66 28 29 20 66 72 6f 6d 20 74 68 65 20  intf() from the 
0130: 73 74 61 6e 64 61 72 64 20 43 0a 2a 2a 20 6c 69  standard C.** li
0140: 62 72 61 72 79 2c 20 74 68 6f 75 67 68 20 74 68  brary, though th
0150: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
0160: 20 68 65 72 65 20 68 61 73 20 65 6e 68 61 6e 63   here has enhanc
0170: 65 6d 65 6e 74 73 20 74 6f 20 73 75 70 70 6f 72  ements to suppor
0180: 74 0a 2a 2a 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a  t.** SQLite..*/.
0190: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
01a0: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 6f  Int.h"../*.** Co
01b0: 6e 76 65 72 73 69 6f 6e 20 74 79 70 65 73 20 66  nversion types f
01c0: 61 6c 6c 20 69 6e 74 6f 20 76 61 72 69 6f 75 73  all into various
01d0: 20 63 61 74 65 67 6f 72 69 65 73 20 61 73 20 64   categories as d
01e0: 65 66 69 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a  efined by the.**
01f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 6e 75 6d 65   following enume
0200: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 64 65 66 69  ration..*/.#defi
0210: 6e 65 20 65 74 52 41 44 49 58 20 20 20 20 20 20  ne etRADIX      
0220: 20 30 20 2f 2a 20 6e 6f 6e 2d 64 65 63 69 6d 61   0 /* non-decima
0230: 6c 20 69 6e 74 65 67 65 72 20 74 79 70 65 73 2e  l integer types.
0240: 20 20 25 78 20 25 6f 20 2a 2f 0a 23 64 65 66 69    %x %o */.#defi
0250: 6e 65 20 65 74 46 4c 4f 41 54 20 20 20 20 20 20  ne etFLOAT      
0260: 20 31 20 2f 2a 20 46 6c 6f 61 74 69 6e 67 20 70   1 /* Floating p
0270: 6f 69 6e 74 2e 20 20 25 66 20 2a 2f 0a 23 64 65  oint.  %f */.#de
0280: 66 69 6e 65 20 65 74 45 58 50 20 20 20 20 20 20  fine etEXP      
0290: 20 20 20 32 20 2f 2a 20 45 78 70 6f 6e 65 6e 74     2 /* Exponent
02a0: 69 6f 6e 61 6c 20 6e 6f 74 61 74 69 6f 6e 2e 20  ional notation. 
02b0: 25 65 20 61 6e 64 20 25 45 20 2a 2f 0a 23 64 65  %e and %E */.#de
02c0: 66 69 6e 65 20 65 74 47 45 4e 45 52 49 43 20 20  fine etGENERIC  
02d0: 20 20 20 33 20 2f 2a 20 46 6c 6f 61 74 69 6e 67     3 /* Floating
02e0: 20 6f 72 20 65 78 70 6f 6e 65 6e 74 69 61 6c 2c   or exponential,
02f0: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 65 78   depending on ex
0300: 70 6f 6e 65 6e 74 2e 20 25 67 20 2a 2f 0a 23 64  ponent. %g */.#d
0310: 65 66 69 6e 65 20 65 74 53 49 5a 45 20 20 20 20  efine etSIZE    
0320: 20 20 20 20 34 20 2f 2a 20 52 65 74 75 72 6e 20      4 /* Return 
0330: 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  number of charac
0340: 74 65 72 73 20 70 72 6f 63 65 73 73 65 64 20 73  ters processed s
0350: 6f 20 66 61 72 2e 20 25 6e 20 2a 2f 0a 23 64 65  o far. %n */.#de
0360: 66 69 6e 65 20 65 74 53 54 52 49 4e 47 20 20 20  fine etSTRING   
0370: 20 20 20 35 20 2f 2a 20 53 74 72 69 6e 67 73 2e     5 /* Strings.
0380: 20 25 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 65   %s */.#define e
0390: 74 44 59 4e 53 54 52 49 4e 47 20 20 20 36 20 2f  tDYNSTRING   6 /
03a0: 2a 20 44 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  * Dynamically al
03b0: 6c 6f 63 61 74 65 64 20 73 74 72 69 6e 67 73 2e  located strings.
03c0: 20 25 7a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 65   %z */.#define e
03d0: 74 50 45 52 43 45 4e 54 20 20 20 20 20 37 20 2f  tPERCENT     7 /
03e0: 2a 20 50 65 72 63 65 6e 74 20 73 79 6d 62 6f 6c  * Percent symbol
03f0: 2e 20 25 25 20 2a 2f 0a 23 64 65 66 69 6e 65 20  . %% */.#define 
0400: 65 74 43 48 41 52 58 20 20 20 20 20 20 20 38 20  etCHARX       8 
0410: 2f 2a 20 43 68 61 72 61 63 74 65 72 73 2e 20 25  /* Characters. %
0420: 63 20 2a 2f 0a 2f 2a 20 54 68 65 20 72 65 73 74  c */./* The rest
0430: 20 61 72 65 20 65 78 74 65 6e 73 69 6f 6e 73 2c   are extensions,
0440: 20 6e 6f 74 20 6e 6f 72 6d 61 6c 6c 79 20 66 6f   not normally fo
0450: 75 6e 64 20 69 6e 20 70 72 69 6e 74 66 28 29 20  und in printf() 
0460: 2a 2f 0a 23 64 65 66 69 6e 65 20 65 74 53 51 4c  */.#define etSQL
0470: 45 53 43 41 50 45 20 20 20 39 20 2f 2a 20 53 74  ESCAPE   9 /* St
0480: 72 69 6e 67 73 20 77 69 74 68 20 27 5c 27 27 20  rings with '\'' 
0490: 64 6f 75 62 6c 65 64 2e 20 20 25 71 20 2a 2f 0a  doubled.  %q */.
04a0: 23 64 65 66 69 6e 65 20 65 74 53 51 4c 45 53 43  #define etSQLESC
04b0: 41 50 45 32 20 31 30 20 2f 2a 20 53 74 72 69 6e  APE2 10 /* Strin
04c0: 67 73 20 77 69 74 68 20 27 5c 27 27 20 64 6f 75  gs with '\'' dou
04d0: 62 6c 65 64 20 61 6e 64 20 65 6e 63 6c 6f 73 65  bled and enclose
04e0: 64 20 69 6e 20 27 27 2c 0a 20 20 20 20 20 20 20  d in '',.       
04f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0500: 20 20 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73     NULL pointers
0510: 20 72 65 70 6c 61 63 65 64 20 62 79 20 53 51 4c   replaced by SQL
0520: 20 4e 55 4c 4c 2e 20 20 25 51 20 2a 2f 0a 23 64   NULL.  %Q */.#d
0530: 65 66 69 6e 65 20 65 74 54 4f 4b 45 4e 20 20 20  efine etTOKEN   
0540: 20 20 20 31 31 20 2f 2a 20 61 20 70 6f 69 6e 74     11 /* a point
0550: 65 72 20 74 6f 20 61 20 54 6f 6b 65 6e 20 73 74  er to a Token st
0560: 72 75 63 74 75 72 65 20 2a 2f 0a 23 64 65 66 69  ructure */.#defi
0570: 6e 65 20 65 74 53 52 43 4c 49 53 54 20 20 20 20  ne etSRCLIST    
0580: 31 32 20 2f 2a 20 61 20 70 6f 69 6e 74 65 72 20  12 /* a pointer 
0590: 74 6f 20 61 20 53 72 63 4c 69 73 74 20 2a 2f 0a  to a SrcList */.
05a0: 23 64 65 66 69 6e 65 20 65 74 50 4f 49 4e 54 45  #define etPOINTE
05b0: 52 20 20 20 20 31 33 20 2f 2a 20 54 68 65 20 25  R    13 /* The %
05c0: 70 20 63 6f 6e 76 65 72 73 69 6f 6e 20 2a 2f 0a  p conversion */.
05d0: 23 64 65 66 69 6e 65 20 65 74 53 51 4c 45 53 43  #define etSQLESC
05e0: 41 50 45 33 20 31 34 20 2f 2a 20 25 77 20 2d 3e  APE3 14 /* %w ->
05f0: 20 53 74 72 69 6e 67 73 20 77 69 74 68 20 27 5c   Strings with '\
0600: 22 27 20 64 6f 75 62 6c 65 64 20 2a 2f 0a 23 64  "' doubled */.#d
0610: 65 66 69 6e 65 20 65 74 4f 52 44 49 4e 41 4c 20  efine etORDINAL 
0620: 20 20 20 31 35 20 2f 2a 20 25 72 20 2d 3e 20 31     15 /* %r -> 1
0630: 73 74 2c 20 32 6e 64 2c 20 33 72 64 2c 20 34 74  st, 2nd, 3rd, 4t
0640: 68 2c 20 65 74 63 2e 20 20 45 6e 67 6c 69 73 68  h, etc.  English
0650: 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65   only */.#define
0660: 20 65 74 44 45 43 49 4d 41 4c 20 20 20 20 31 36   etDECIMAL    16
0670: 20 2f 2a 20 25 64 20 6f 72 20 25 75 2c 20 62 75   /* %d or %u, bu
0680: 74 20 6e 6f 74 20 25 78 2c 20 25 6f 20 2a 2f 0a  t not %x, %o */.
0690: 0a 23 64 65 66 69 6e 65 20 65 74 49 4e 56 41 4c  .#define etINVAL
06a0: 49 44 20 20 20 20 31 37 20 2f 2a 20 41 6e 79 20  ID    17 /* Any 
06b0: 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 63 6f 6e  unrecognized con
06c0: 76 65 72 73 69 6f 6e 20 74 79 70 65 20 2a 2f 0a  version type */.
06d0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 22 65 74 42 79  ../*.** An "etBy
06e0: 74 65 22 20 69 73 20 61 6e 20 38 2d 62 69 74 20  te" is an 8-bit 
06f0: 75 6e 73 69 67 6e 65 64 20 76 61 6c 75 65 2e 0a  unsigned value..
0700: 2a 2f 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67  */.typedef unsig
0710: 6e 65 64 20 63 68 61 72 20 65 74 42 79 74 65 3b  ned char etByte;
0720: 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 62 75 69  ../*.** Each bui
0730: 6c 74 69 6e 20 63 6f 6e 76 65 72 73 69 6f 6e 20  ltin conversion 
0740: 63 68 61 72 61 63 74 65 72 20 28 65 78 3a 20 74  character (ex: t
0750: 68 65 20 27 64 27 20 69 6e 20 22 25 64 22 29 20  he 'd' in "%d") 
0760: 69 73 20 64 65 73 63 72 69 62 65 64 0a 2a 2a 20  is described.** 
0770: 62 79 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  by an instance o
0780: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0790: 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 74 79 70  structure.*/.typ
07a0: 65 64 65 66 20 73 74 72 75 63 74 20 65 74 5f 69  edef struct et_i
07b0: 6e 66 6f 20 7b 20 20 20 2f 2a 20 49 6e 66 6f 72  nfo {   /* Infor
07c0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 65 61 63  mation about eac
07d0: 68 20 66 6f 72 6d 61 74 20 66 69 65 6c 64 20 2a  h format field *
07e0: 2f 0a 20 20 63 68 61 72 20 66 6d 74 74 79 70 65  /.  char fmttype
07f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0800: 54 68 65 20 66 6f 72 6d 61 74 20 66 69 65 6c 64  The format field
0810: 20 63 6f 64 65 20 6c 65 74 74 65 72 20 2a 2f 0a   code letter */.
0820: 20 20 65 74 42 79 74 65 20 62 61 73 65 3b 20 20    etByte base;  
0830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
0840: 65 20 62 61 73 65 20 66 6f 72 20 72 61 64 69 78  e base for radix
0850: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 2a 2f 0a 20   conversion */. 
0860: 20 65 74 42 79 74 65 20 66 6c 61 67 73 3b 20 20   etByte flags;  
0870: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
0880: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 46 4c 41 47   or more of FLAG
0890: 5f 20 63 6f 6e 73 74 61 6e 74 73 20 62 65 6c 6f  _ constants belo
08a0: 77 20 2a 2f 0a 20 20 65 74 42 79 74 65 20 74 79  w */.  etByte ty
08b0: 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pe;             
08c0: 2f 2a 20 43 6f 6e 76 65 72 73 69 6f 6e 20 70 61  /* Conversion pa
08d0: 72 61 64 69 67 6d 20 2a 2f 0a 20 20 65 74 42 79  radigm */.  etBy
08e0: 74 65 20 63 68 61 72 73 65 74 3b 20 20 20 20 20  te charset;     
08f0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
0900: 6e 74 6f 20 61 44 69 67 69 74 73 5b 5d 20 6f 66  nto aDigits[] of
0910: 20 74 68 65 20 64 69 67 69 74 73 20 73 74 72 69   the digits stri
0920: 6e 67 20 2a 2f 0a 20 20 65 74 42 79 74 65 20 70  ng */.  etByte p
0930: 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20  refix;          
0940: 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
0950: 61 50 72 65 66 69 78 5b 5d 20 6f 66 20 74 68 65  aPrefix[] of the
0960: 20 70 72 65 66 69 78 20 73 74 72 69 6e 67 20 2a   prefix string *
0970: 2f 0a 7d 20 65 74 5f 69 6e 66 6f 3b 0a 0a 2f 2a  /.} et_info;../*
0980: 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75  .** Allowed valu
0990: 65 73 20 66 6f 72 20 65 74 5f 69 6e 66 6f 2e 66  es for et_info.f
09a0: 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  lags.*/.#define 
09b0: 46 4c 41 47 5f 53 49 47 4e 45 44 20 20 20 20 31  FLAG_SIGNED    1
09c0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
09d0: 74 68 65 20 76 61 6c 75 65 20 74 6f 20 63 6f 6e  the value to con
09e0: 76 65 72 74 20 69 73 20 73 69 67 6e 65 64 20 2a  vert is signed *
09f0: 2f 0a 23 64 65 66 69 6e 65 20 46 4c 41 47 5f 53  /.#define FLAG_S
0a00: 54 52 49 4e 47 20 20 20 20 34 20 20 20 20 20 2f  TRING    4     /
0a10: 2a 20 41 6c 6c 6f 77 20 69 6e 66 69 6e 69 74 65  * Allow infinite
0a20: 20 70 72 65 63 69 73 69 6f 6e 20 2a 2f 0a 0a 0a   precision */...
0a30: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
0a40: 69 6e 67 20 74 61 62 6c 65 20 69 73 20 73 65 61  ing table is sea
0a50: 72 63 68 65 64 20 6c 69 6e 65 61 72 6c 79 2c 20  rched linearly, 
0a60: 73 6f 20 69 74 20 69 73 20 67 6f 6f 64 20 74 6f  so it is good to
0a70: 20 70 75 74 20 74 68 65 0a 2a 2a 20 6d 6f 73 74   put the.** most
0a80: 20 66 72 65 71 75 65 6e 74 6c 79 20 75 73 65 64   frequently used
0a90: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74 79 70 65   conversion type
0aa0: 73 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74 61 74  s first..*/.stat
0ab0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 61 44  ic const char aD
0ac0: 69 67 69 74 73 5b 5d 20 3d 20 22 30 31 32 33 34  igits[] = "01234
0ad0: 35 36 37 38 39 41 42 43 44 45 46 30 31 32 33 34  56789ABCDEF01234
0ae0: 35 36 37 38 39 61 62 63 64 65 66 22 3b 0a 73 74  56789abcdef";.st
0af0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
0b00: 61 50 72 65 66 69 78 5b 5d 20 3d 20 22 2d 78 30  aPrefix[] = "-x0
0b10: 5c 30 30 30 58 30 22 3b 0a 73 74 61 74 69 63 20  \000X0";.static 
0b20: 63 6f 6e 73 74 20 65 74 5f 69 6e 66 6f 20 66 6d  const et_info fm
0b30: 74 69 6e 66 6f 5b 5d 20 3d 20 7b 0a 20 20 7b 20  tinfo[] = {.  { 
0b40: 20 27 64 27 2c 20 31 30 2c 20 31 2c 20 65 74 44   'd', 10, 1, etD
0b50: 45 43 49 4d 41 4c 2c 20 20 20 20 30 2c 20 20 30  ECIMAL,    0,  0
0b60: 20 7d 2c 0a 20 20 7b 20 20 27 73 27 2c 20 20 30   },.  {  's',  0
0b70: 2c 20 34 2c 20 65 74 53 54 52 49 4e 47 2c 20 20  , 4, etSTRING,  
0b80: 20 20 20 30 2c 20 20 30 20 7d 2c 0a 20 20 7b 20     0,  0 },.  { 
0b90: 20 27 67 27 2c 20 20 30 2c 20 31 2c 20 65 74 47   'g',  0, 1, etG
0ba0: 45 4e 45 52 49 43 2c 20 20 20 20 33 30 2c 20 30  ENERIC,    30, 0
0bb0: 20 7d 2c 0a 20 20 7b 20 20 27 7a 27 2c 20 20 30   },.  {  'z',  0
0bc0: 2c 20 34 2c 20 65 74 44 59 4e 53 54 52 49 4e 47  , 4, etDYNSTRING
0bd0: 2c 20 20 30 2c 20 20 30 20 7d 2c 0a 20 20 7b 20  ,  0,  0 },.  { 
0be0: 20 27 71 27 2c 20 20 30 2c 20 34 2c 20 65 74 53   'q',  0, 4, etS
0bf0: 51 4c 45 53 43 41 50 45 2c 20 20 30 2c 20 20 30  QLESCAPE,  0,  0
0c00: 20 7d 2c 0a 20 20 7b 20 20 27 51 27 2c 20 20 30   },.  {  'Q',  0
0c10: 2c 20 34 2c 20 65 74 53 51 4c 45 53 43 41 50 45  , 4, etSQLESCAPE
0c20: 32 2c 20 30 2c 20 20 30 20 7d 2c 0a 20 20 7b 20  2, 0,  0 },.  { 
0c30: 20 27 77 27 2c 20 20 30 2c 20 34 2c 20 65 74 53   'w',  0, 4, etS
0c40: 51 4c 45 53 43 41 50 45 33 2c 20 30 2c 20 20 30  QLESCAPE3, 0,  0
0c50: 20 7d 2c 0a 20 20 7b 20 20 27 63 27 2c 20 20 30   },.  {  'c',  0
0c60: 2c 20 30 2c 20 65 74 43 48 41 52 58 2c 20 20 20  , 0, etCHARX,   
0c70: 20 20 20 30 2c 20 20 30 20 7d 2c 0a 20 20 7b 20     0,  0 },.  { 
0c80: 20 27 6f 27 2c 20 20 38 2c 20 30 2c 20 65 74 52   'o',  8, 0, etR
0c90: 41 44 49 58 2c 20 20 20 20 20 20 30 2c 20 20 32  ADIX,      0,  2
0ca0: 20 7d 2c 0a 20 20 7b 20 20 27 75 27 2c 20 31 30   },.  {  'u', 10
0cb0: 2c 20 30 2c 20 65 74 44 45 43 49 4d 41 4c 2c 20  , 0, etDECIMAL, 
0cc0: 20 20 20 30 2c 20 20 30 20 7d 2c 0a 20 20 7b 20     0,  0 },.  { 
0cd0: 20 27 78 27 2c 20 31 36 2c 20 30 2c 20 65 74 52   'x', 16, 0, etR
0ce0: 41 44 49 58 2c 20 20 20 20 20 20 31 36 2c 20 31  ADIX,      16, 1
0cf0: 20 7d 2c 0a 20 20 7b 20 20 27 58 27 2c 20 31 36   },.  {  'X', 16
0d00: 2c 20 30 2c 20 65 74 52 41 44 49 58 2c 20 20 20  , 0, etRADIX,   
0d10: 20 20 20 30 2c 20 20 34 20 7d 2c 0a 23 69 66 6e     0,  4 },.#ifn
0d20: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0d30: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
0d40: 20 7b 20 20 27 66 27 2c 20 20 30 2c 20 31 2c 20   {  'f',  0, 1, 
0d50: 65 74 46 4c 4f 41 54 2c 20 20 20 20 20 20 30 2c  etFLOAT,      0,
0d60: 20 20 30 20 7d 2c 0a 20 20 7b 20 20 27 65 27 2c    0 },.  {  'e',
0d70: 20 20 30 2c 20 31 2c 20 65 74 45 58 50 2c 20 20    0, 1, etEXP,  
0d80: 20 20 20 20 20 20 33 30 2c 20 30 20 7d 2c 0a 20        30, 0 },. 
0d90: 20 7b 20 20 27 45 27 2c 20 20 30 2c 20 31 2c 20   {  'E',  0, 1, 
0da0: 65 74 45 58 50 2c 20 20 20 20 20 20 20 20 31 34  etEXP,        14
0db0: 2c 20 30 20 7d 2c 0a 20 20 7b 20 20 27 47 27 2c  , 0 },.  {  'G',
0dc0: 20 20 30 2c 20 31 2c 20 65 74 47 45 4e 45 52 49    0, 1, etGENERI
0dd0: 43 2c 20 20 20 20 31 34 2c 20 30 20 7d 2c 0a 23  C,    14, 0 },.#
0de0: 65 6e 64 69 66 0a 20 20 7b 20 20 27 69 27 2c 20  endif.  {  'i', 
0df0: 31 30 2c 20 31 2c 20 65 74 44 45 43 49 4d 41 4c  10, 1, etDECIMAL
0e00: 2c 20 20 20 20 30 2c 20 20 30 20 7d 2c 0a 20 20  ,    0,  0 },.  
0e10: 7b 20 20 27 6e 27 2c 20 20 30 2c 20 30 2c 20 65  {  'n',  0, 0, e
0e20: 74 53 49 5a 45 2c 20 20 20 20 20 20 20 30 2c 20  tSIZE,       0, 
0e30: 20 30 20 7d 2c 0a 20 20 7b 20 20 27 25 27 2c 20   0 },.  {  '%', 
0e40: 20 30 2c 20 30 2c 20 65 74 50 45 52 43 45 4e 54   0, 0, etPERCENT
0e50: 2c 20 20 20 20 30 2c 20 20 30 20 7d 2c 0a 20 20  ,    0,  0 },.  
0e60: 7b 20 20 27 70 27 2c 20 31 36 2c 20 30 2c 20 65  {  'p', 16, 0, e
0e70: 74 50 4f 49 4e 54 45 52 2c 20 20 20 20 30 2c 20  tPOINTER,    0, 
0e80: 20 31 20 7d 2c 0a 0a 20 20 2f 2a 20 41 6c 6c 20   1 },..  /* All 
0e90: 74 68 65 20 72 65 73 74 20 61 72 65 20 75 6e 64  the rest are und
0ea0: 6f 63 75 6d 65 6e 74 65 64 20 61 6e 64 20 61 72  ocumented and ar
0eb0: 65 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75  e for internal u
0ec0: 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 7b 20 20  se only */.  {  
0ed0: 27 54 27 2c 20 20 30 2c 20 30 2c 20 65 74 54 4f  'T',  0, 0, etTO
0ee0: 4b 45 4e 2c 20 20 20 20 20 20 30 2c 20 20 30 20  KEN,      0,  0 
0ef0: 7d 2c 0a 20 20 7b 20 20 27 53 27 2c 20 20 30 2c  },.  {  'S',  0,
0f00: 20 30 2c 20 65 74 53 52 43 4c 49 53 54 2c 20 20   0, etSRCLIST,  
0f10: 20 20 30 2c 20 20 30 20 7d 2c 0a 20 20 7b 20 20    0,  0 },.  {  
0f20: 27 72 27 2c 20 31 30 2c 20 31 2c 20 65 74 4f 52  'r', 10, 1, etOR
0f30: 44 49 4e 41 4c 2c 20 20 20 20 30 2c 20 20 30 20  DINAL,    0,  0 
0f40: 7d 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  },.};../*.** If 
0f50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
0f60: 54 49 4e 47 5f 50 4f 49 4e 54 20 69 73 20 64 65  TING_POINT is de
0f70: 66 69 6e 65 64 2c 20 74 68 65 6e 20 6e 6f 6e 65  fined, then none
0f80: 20 6f 66 20 74 68 65 20 66 6c 6f 61 74 69 6e 67   of the floating
0f90: 20 70 6f 69 6e 74 0a 2a 2a 20 63 6f 6e 76 65 72   point.** conver
0fa0: 73 69 6f 6e 73 20 77 69 6c 6c 20 77 6f 72 6b 2e  sions will work.
0fb0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
0fc0: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
0fd0: 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 22 2a 76  _POINT./*.** "*v
0fe0: 61 6c 22 20 69 73 20 61 20 64 6f 75 62 6c 65 20  al" is a double 
0ff0: 73 75 63 68 20 74 68 61 74 20 30 2e 31 20 3c 3d  such that 0.1 <=
1000: 20 2a 76 61 6c 20 3c 20 31 30 2e 30 0a 2a 2a 20   *val < 10.0.** 
1010: 52 65 74 75 72 6e 20 74 68 65 20 61 73 63 69 69  Return the ascii
1020: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65   code for the le
1030: 61 64 69 6e 67 20 64 69 67 69 74 20 6f 66 20 2a  ading digit of *
1040: 76 61 6c 2c 20 74 68 65 6e 0a 2a 2a 20 6d 75 6c  val, then.** mul
1050: 74 69 70 6c 79 20 22 2a 76 61 6c 22 20 62 79 20  tiply "*val" by 
1060: 31 30 2e 30 20 74 6f 20 72 65 6e 6f 72 6d 61 6c  10.0 to renormal
1070: 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  ize..**.** Examp
1080: 6c 65 3a 0a 2a 2a 20 20 20 20 20 69 6e 70 75 74  le:.**     input
1090: 3a 20 20 20 20 20 2a 76 61 6c 20 3d 20 33 2e 31  :     *val = 3.1
10a0: 34 31 35 39 0a 2a 2a 20 20 20 20 20 6f 75 74 70  4159.**     outp
10b0: 75 74 3a 20 20 20 20 2a 76 61 6c 20 3d 20 31 2e  ut:    *val = 1.
10c0: 34 31 35 39 20 20 20 20 66 75 6e 63 74 69 6f 6e  4159    function
10d0: 20 72 65 74 75 72 6e 20 3d 20 27 33 27 0a 2a 2a   return = '3'.**
10e0: 0a 2a 2a 20 54 68 65 20 63 6f 75 6e 74 65 72 20  .** The counter 
10f0: 2a 63 6e 74 20 69 73 20 69 6e 63 72 65 6d 65 6e  *cnt is incremen
1100: 74 65 64 20 65 61 63 68 20 74 69 6d 65 2e 20 20  ted each time.  
1110: 41 66 74 65 72 20 63 6f 75 6e 74 65 72 20 65 78  After counter ex
1120: 63 65 65 64 73 0a 2a 2a 20 31 36 20 28 74 68 65  ceeds.** 16 (the
1130: 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 67 6e 69   number of signi
1140: 66 69 63 61 6e 74 20 64 69 67 69 74 73 20 69 6e  ficant digits in
1150: 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 29   a 64-bit float)
1160: 20 27 30 27 20 69 73 0a 2a 2a 20 61 6c 77 61 79   '0' is.** alway
1170: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
1180: 74 61 74 69 63 20 63 68 61 72 20 65 74 5f 67 65  tatic char et_ge
1190: 74 64 69 67 69 74 28 4c 4f 4e 47 44 4f 55 42 4c  tdigit(LONGDOUBL
11a0: 45 5f 54 59 50 45 20 2a 76 61 6c 2c 20 69 6e 74  E_TYPE *val, int
11b0: 20 2a 63 6e 74 29 7b 0a 20 20 69 6e 74 20 64 69   *cnt){.  int di
11c0: 67 69 74 3b 0a 20 20 4c 4f 4e 47 44 4f 55 42 4c  git;.  LONGDOUBL
11d0: 45 5f 54 59 50 45 20 64 3b 0a 20 20 69 66 28 20  E_TYPE d;.  if( 
11e0: 28 2a 63 6e 74 29 3c 3d 30 20 29 20 72 65 74 75  (*cnt)<=0 ) retu
11f0: 72 6e 20 27 30 27 3b 0a 20 20 28 2a 63 6e 74 29  rn '0';.  (*cnt)
1200: 2d 2d 3b 0a 20 20 64 69 67 69 74 20 3d 20 28 69  --;.  digit = (i
1210: 6e 74 29 2a 76 61 6c 3b 0a 20 20 64 20 3d 20 64  nt)*val;.  d = d
1220: 69 67 69 74 3b 0a 20 20 64 69 67 69 74 20 2b 3d  igit;.  digit +=
1230: 20 27 30 27 3b 0a 20 20 2a 76 61 6c 20 3d 20 28   '0';.  *val = (
1240: 2a 76 61 6c 20 2d 20 64 29 2a 31 30 2e 30 3b 0a  *val - d)*10.0;.
1250: 20 20 72 65 74 75 72 6e 20 28 63 68 61 72 29 64    return (char)d
1260: 69 67 69 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  igit;.}.#endif /
1270: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  * SQLITE_OMIT_FL
1280: 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 20 2a 2f 0a  OATING_POINT */.
1290: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 53  ./*.** Set the S
12a0: 74 72 41 63 63 75 6d 20 6f 62 6a 65 63 74 20 74  trAccum object t
12b0: 6f 20 61 6e 20 65 72 72 6f 72 20 6d 6f 64 65 2e  o an error mode.
12c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12d0: 73 65 74 53 74 72 41 63 63 75 6d 45 72 72 6f 72  setStrAccumError
12e0: 28 53 74 72 41 63 63 75 6d 20 2a 70 2c 20 75 38  (StrAccum *p, u8
12f0: 20 65 45 72 72 6f 72 29 7b 0a 20 20 61 73 73 65   eError){.  asse
1300: 72 74 28 20 65 45 72 72 6f 72 3d 3d 53 51 4c 49  rt( eError==SQLI
1310: 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 65 45 72 72  TE_NOMEM || eErr
1320: 6f 72 3d 3d 53 51 4c 49 54 45 5f 54 4f 4f 42 49  or==SQLITE_TOOBI
1330: 47 20 29 3b 0a 20 20 70 2d 3e 61 63 63 45 72 72  G );.  p->accErr
1340: 6f 72 20 3d 20 65 45 72 72 6f 72 3b 0a 20 20 69  or = eError;.  i
1350: 66 28 20 70 2d 3e 6d 78 41 6c 6c 6f 63 20 29 20  f( p->mxAlloc ) 
1360: 73 71 6c 69 74 65 33 5f 73 74 72 5f 72 65 73 65  sqlite3_str_rese
1370: 74 28 70 29 3b 0a 20 20 69 66 28 20 65 45 72 72  t(p);.  if( eErr
1380: 6f 72 3d 3d 53 51 4c 49 54 45 5f 54 4f 4f 42 49  or==SQLITE_TOOBI
1390: 47 20 29 20 73 71 6c 69 74 65 33 45 72 72 6f 72  G ) sqlite3Error
13a0: 54 6f 50 61 72 73 65 72 28 70 2d 3e 64 62 2c 20  ToParser(p->db, 
13b0: 65 45 72 72 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  eError);.}../*.*
13c0: 2a 20 45 78 74 72 61 20 61 72 67 75 6d 65 6e 74  * Extra argument
13d0: 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 61 20 50   values from a P
13e0: 72 69 6e 74 66 41 72 67 75 6d 65 6e 74 73 20 6f  rintfArguments o
13f0: 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20  bject.*/.static 
1400: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 67 65  sqlite3_int64 ge
1410: 74 49 6e 74 41 72 67 28 50 72 69 6e 74 66 41 72  tIntArg(PrintfAr
1420: 67 75 6d 65 6e 74 73 20 2a 70 29 7b 0a 20 20 69  guments *p){.  i
1430: 66 28 20 70 2d 3e 6e 41 72 67 3c 3d 70 2d 3e 6e  f( p->nArg<=p->n
1440: 55 73 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b  Used ) return 0;
1450: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1460: 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 70 2d  3_value_int64(p-
1470: 3e 61 70 41 72 67 5b 70 2d 3e 6e 55 73 65 64 2b  >apArg[p->nUsed+
1480: 2b 5d 29 3b 0a 7d 0a 73 74 61 74 69 63 20 64 6f  +]);.}.static do
1490: 75 62 6c 65 20 67 65 74 44 6f 75 62 6c 65 41 72  uble getDoubleAr
14a0: 67 28 50 72 69 6e 74 66 41 72 67 75 6d 65 6e 74  g(PrintfArgument
14b0: 73 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  s *p){.  if( p->
14c0: 6e 41 72 67 3c 3d 70 2d 3e 6e 55 73 65 64 20 29  nArg<=p->nUsed )
14d0: 20 72 65 74 75 72 6e 20 30 2e 30 3b 0a 20 20 72   return 0.0;.  r
14e0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 76 61  eturn sqlite3_va
14f0: 6c 75 65 5f 64 6f 75 62 6c 65 28 70 2d 3e 61 70  lue_double(p->ap
1500: 41 72 67 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 29  Arg[p->nUsed++])
1510: 3b 0a 7d 0a 73 74 61 74 69 63 20 63 68 61 72 20  ;.}.static char 
1520: 2a 67 65 74 54 65 78 74 41 72 67 28 50 72 69 6e  *getTextArg(Prin
1530: 74 66 41 72 67 75 6d 65 6e 74 73 20 2a 70 29 7b  tfArguments *p){
1540: 0a 20 20 69 66 28 20 70 2d 3e 6e 41 72 67 3c 3d  .  if( p->nArg<=
1550: 70 2d 3e 6e 55 73 65 64 20 29 20 72 65 74 75 72  p->nUsed ) retur
1560: 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 28 63  n 0;.  return (c
1570: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
1580: 75 65 5f 74 65 78 74 28 70 2d 3e 61 70 41 72 67  ue_text(p->apArg
1590: 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 29 3b 0a 7d  [p->nUsed++]);.}
15a0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
15b0: 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 74 65   memory for a te
15c0: 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 6e  mporary buffer n
15d0: 65 65 64 65 64 20 66 6f 72 20 70 72 69 6e 74 66  eeded for printf
15e0: 20 72 65 6e 64 65 72 69 6e 67 2e 0a 2a 2a 0a 2a   rendering..**.*
15f0: 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  * If the request
1600: 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 74  ed size of the t
1610: 65 6d 70 20 62 75 66 66 65 72 20 69 73 20 6c 61  emp buffer is la
1620: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 69  rger than the si
1630: 7a 65 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 75 74  ze.** of the out
1640: 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 70 41  put buffer in pA
1650: 63 63 75 6d 2c 20 74 68 65 6e 20 63 61 75 73 65  ccum, then cause
1660: 20 61 6e 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49   an SQLITE_TOOBI
1670: 47 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 74  G error..** Do t
1680: 68 65 20 73 69 7a 65 20 63 68 65 63 6b 20 62 65  he size check be
1690: 66 6f 72 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  fore the memory 
16a0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 72  allocation to pr
16b0: 65 76 65 6e 74 20 72 6f 67 75 65 0a 2a 2a 20 53  event rogue.** S
16c0: 51 4c 20 66 72 6f 6d 20 72 65 71 75 65 73 74 69  QL from requesti
16d0: 6e 67 20 6c 61 72 67 65 20 61 6c 6c 6f 63 61 74  ng large allocat
16e0: 69 6f 6e 73 20 75 73 69 6e 67 20 74 68 65 20 70  ions using the p
16f0: 72 65 63 69 73 69 6f 6e 20 6f 72 20 77 69 64 74  recision or widt
1700: 68 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68  h.** field of th
1710: 65 20 70 72 69 6e 74 66 28 29 20 66 75 6e 63 74  e printf() funct
1720: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ion..*/.static c
1730: 68 61 72 20 2a 70 72 69 6e 74 66 54 65 6d 70 42  har *printfTempB
1740: 75 66 28 73 71 6c 69 74 65 33 5f 73 74 72 20 2a  uf(sqlite3_str *
1750: 70 41 63 63 75 6d 2c 20 73 71 6c 69 74 65 33 5f  pAccum, sqlite3_
1760: 69 6e 74 36 34 20 6e 29 7b 0a 20 20 63 68 61 72  int64 n){.  char
1770: 20 2a 7a 3b 0a 20 20 69 66 28 20 70 41 63 63 75   *z;.  if( pAccu
1780: 6d 2d 3e 61 63 63 45 72 72 6f 72 20 29 20 72 65  m->accError ) re
1790: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 6e 3e  turn 0;.  if( n>
17a0: 70 41 63 63 75 6d 2d 3e 6e 41 6c 6c 6f 63 20 26  pAccum->nAlloc &
17b0: 26 20 6e 3e 70 41 63 63 75 6d 2d 3e 6d 78 41 6c  & n>pAccum->mxAl
17c0: 6c 6f 63 20 29 7b 0a 20 20 20 20 73 65 74 53 74  loc ){.    setSt
17d0: 72 41 63 63 75 6d 45 72 72 6f 72 28 70 41 63 63  rAccumError(pAcc
17e0: 75 6d 2c 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49  um, SQLITE_TOOBI
17f0: 47 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  G);.    return 0
1800: 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69  ;.  }.  z = sqli
1810: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70  te3DbMallocRaw(p
1820: 41 63 63 75 6d 2d 3e 64 62 2c 20 6e 29 3b 0a 20  Accum->db, n);. 
1830: 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20   if( z==0 ){.   
1840: 20 73 65 74 53 74 72 41 63 63 75 6d 45 72 72 6f   setStrAccumErro
1850: 72 28 70 41 63 63 75 6d 2c 20 53 51 4c 49 54 45  r(pAccum, SQLITE
1860: 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 0a 20 20 72  _NOMEM);.  }.  r
1870: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn z;.}../*.*
1880: 2a 20 4f 6e 20 6d 61 63 68 69 6e 65 73 20 77 69  * On machines wi
1890: 74 68 20 61 20 73 6d 61 6c 6c 20 73 74 61 63 6b  th a small stack
18a0: 20 73 69 7a 65 2c 20 79 6f 75 20 63 61 6e 20 72   size, you can r
18b0: 65 64 65 66 69 6e 65 20 74 68 65 0a 2a 2a 20 53  edefine the.** S
18c0: 51 4c 49 54 45 5f 50 52 49 4e 54 5f 42 55 46 5f  QLITE_PRINT_BUF_
18d0: 53 49 5a 45 20 74 6f 20 62 65 20 73 6f 6d 65 74  SIZE to be somet
18e0: 68 69 6e 67 20 73 6d 61 6c 6c 65 72 2c 20 69 66  hing smaller, if
18f0: 20 64 65 73 69 72 65 64 2e 0a 2a 2f 0a 23 69 66   desired..*/.#if
1900: 6e 64 65 66 20 53 51 4c 49 54 45 5f 50 52 49 4e  ndef SQLITE_PRIN
1910: 54 5f 42 55 46 5f 53 49 5a 45 0a 23 20 64 65 66  T_BUF_SIZE.# def
1920: 69 6e 65 20 53 51 4c 49 54 45 5f 50 52 49 4e 54  ine SQLITE_PRINT
1930: 5f 42 55 46 5f 53 49 5a 45 20 37 30 0a 23 65 6e  _BUF_SIZE 70.#en
1940: 64 69 66 0a 23 64 65 66 69 6e 65 20 65 74 42 55  dif.#define etBU
1950: 46 53 49 5a 45 20 53 51 4c 49 54 45 5f 50 52 49  FSIZE SQLITE_PRI
1960: 4e 54 5f 42 55 46 5f 53 49 5a 45 20 20 2f 2a 20  NT_BUF_SIZE  /* 
1970: 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 75 74 70  Size of the outp
1980: 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 0a 2f 2a  ut buffer */../*
1990: 0a 2a 2a 20 52 65 6e 64 65 72 20 61 20 73 74 72  .** Render a str
19a0: 69 6e 67 20 67 69 76 65 6e 20 62 79 20 22 66 6d  ing given by "fm
19b0: 74 22 20 69 6e 74 6f 20 74 68 65 20 53 74 72 41  t" into the StrA
19c0: 63 63 75 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  ccum object..*/.
19d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 73 74 72  void sqlite3_str
19e0: 5f 76 61 70 70 65 6e 64 66 28 0a 20 20 73 71 6c  _vappendf(.  sql
19f0: 69 74 65 33 5f 73 74 72 20 2a 70 41 63 63 75 6d  ite3_str *pAccum
1a00: 2c 20 20 20 20 20 20 20 2f 2a 20 41 63 63 75 6d  ,       /* Accum
1a10: 75 6c 61 74 65 20 72 65 73 75 6c 74 73 20 68 65  ulate results he
1a20: 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  re */.  const ch
1a30: 61 72 20 2a 66 6d 74 2c 20 20 20 20 20 20 20 20  ar *fmt,        
1a40: 20 20 20 2f 2a 20 46 6f 72 6d 61 74 20 73 74 72     /* Format str
1a50: 69 6e 67 20 2a 2f 0a 20 20 76 61 5f 6c 69 73 74  ing */.  va_list
1a60: 20 61 70 20 20 20 20 20 20 20 20 20 20 20 20 20   ap             
1a70: 20 20 20 20 2f 2a 20 61 72 67 75 6d 65 6e 74 73      /* arguments
1a80: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 3b 20   */.){.  int c; 
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa0: 20 20 20 20 2f 2a 20 4e 65 78 74 20 63 68 61 72      /* Next char
1ab0: 61 63 74 65 72 20 69 6e 20 74 68 65 20 66 6f 72  acter in the for
1ac0: 6d 61 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  mat string */.  
1ad0: 63 68 61 72 20 2a 62 75 66 70 74 3b 20 20 20 20  char *bufpt;    
1ae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1af0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6e  inter to the con
1b00: 76 65 72 73 69 6f 6e 20 62 75 66 66 65 72 20 2a  version buffer *
1b10: 2f 0a 20 20 69 6e 74 20 70 72 65 63 69 73 69 6f  /.  int precisio
1b20: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  n;             /
1b30: 2a 20 50 72 65 63 69 73 69 6f 6e 20 6f 66 20 74  * Precision of t
1b40: 68 65 20 63 75 72 72 65 6e 74 20 66 69 65 6c 64  he current field
1b50: 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 67 74 68   */.  int length
1b60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b70: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68   /* Length of th
1b80: 65 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74  e field */.  int
1b90: 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20   idx;           
1ba0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 67 65 6e          /* A gen
1bb0: 65 72 61 6c 20 70 75 72 70 6f 73 65 20 6c 6f 6f  eral purpose loo
1bc0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
1bd0: 6e 74 20 77 69 64 74 68 3b 20 20 20 20 20 20 20  nt width;       
1be0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 64            /* Wid
1bf0: 74 68 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  th of the curren
1c00: 74 20 66 69 65 6c 64 20 2a 2f 0a 20 20 65 74 42  t field */.  etB
1c10: 79 74 65 20 66 6c 61 67 5f 6c 65 66 74 6a 75 73  yte flag_leftjus
1c20: 74 69 66 79 3b 20 20 20 2f 2a 20 54 72 75 65 20  tify;   /* True 
1c30: 69 66 20 22 2d 22 20 66 6c 61 67 20 69 73 20 70  if "-" flag is p
1c40: 72 65 73 65 6e 74 20 2a 2f 0a 20 20 65 74 42 79  resent */.  etBy
1c50: 74 65 20 66 6c 61 67 5f 70 72 65 66 69 78 3b 20  te flag_prefix; 
1c60: 20 20 20 20 20 20 20 2f 2a 20 27 2b 27 20 6f 72         /* '+' or
1c70: 20 27 20 27 20 6f 72 20 30 20 66 6f 72 20 70 72   ' ' or 0 for pr
1c80: 65 66 69 78 20 2a 2f 0a 20 20 65 74 42 79 74 65  efix */.  etByte
1c90: 20 66 6c 61 67 5f 61 6c 74 65 72 6e 61 74 65 66   flag_alternatef
1ca0: 6f 72 6d 3b 20 2f 2a 20 54 72 75 65 20 69 66 20  orm; /* True if 
1cb0: 22 23 22 20 66 6c 61 67 20 69 73 20 70 72 65 73  "#" flag is pres
1cc0: 65 6e 74 20 2a 2f 0a 20 20 65 74 42 79 74 65 20  ent */.  etByte 
1cd0: 66 6c 61 67 5f 61 6c 74 66 6f 72 6d 32 3b 20 20  flag_altform2;  
1ce0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 22      /* True if "
1cf0: 21 22 20 66 6c 61 67 20 69 73 20 70 72 65 73 65  !" flag is prese
1d00: 6e 74 20 2a 2f 0a 20 20 65 74 42 79 74 65 20 66  nt */.  etByte f
1d10: 6c 61 67 5f 7a 65 72 6f 70 61 64 3b 20 20 20 20  lag_zeropad;    
1d20: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 66 69     /* True if fi
1d30: 65 6c 64 20 77 69 64 74 68 20 63 6f 6e 73 74 61  eld width consta
1d40: 6e 74 20 73 74 61 72 74 73 20 77 69 74 68 20 7a  nt starts with z
1d50: 65 72 6f 20 2a 2f 0a 20 20 65 74 42 79 74 65 20  ero */.  etByte 
1d60: 66 6c 61 67 5f 6c 6f 6e 67 3b 20 20 20 20 20 20  flag_long;      
1d70: 20 20 20 20 2f 2a 20 31 20 66 6f 72 20 74 68 65      /* 1 for the
1d80: 20 22 6c 22 20 66 6c 61 67 2c 20 32 20 66 6f 72   "l" flag, 2 for
1d90: 20 22 6c 6c 22 2c 20 30 20 62 79 20 64 65 66 61   "ll", 0 by defa
1da0: 75 6c 74 20 2a 2f 0a 20 20 65 74 42 79 74 65 20  ult */.  etByte 
1db0: 64 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20  done;           
1dc0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 65 72 6d      /* Loop term
1dd0: 69 6e 61 74 69 6f 6e 20 66 6c 61 67 20 2a 2f 0a  ination flag */.
1de0: 20 20 65 74 42 79 74 65 20 63 54 68 6f 75 73 61    etByte cThousa
1df0: 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nd;          /* 
1e00: 54 68 6f 75 73 61 6e 64 73 20 73 65 70 61 72 61  Thousands separa
1e10: 74 6f 72 20 66 6f 72 20 25 64 20 61 6e 64 20 25  tor for %d and %
1e20: 75 20 2a 2f 0a 20 20 65 74 42 79 74 65 20 78 74  u */.  etByte xt
1e30: 79 70 65 20 3d 20 65 74 49 4e 56 41 4c 49 44 3b  ype = etINVALID;
1e40: 20 20 2f 2a 20 43 6f 6e 76 65 72 73 69 6f 6e 20    /* Conversion 
1e50: 70 61 72 61 64 69 67 6d 20 2a 2f 0a 20 20 75 38  paradigm */.  u8
1e60: 20 62 41 72 67 4c 69 73 74 3b 20 20 20 20 20 20   bArgList;      
1e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1e80: 20 66 6f 72 20 53 51 4c 49 54 45 5f 50 52 49 4e   for SQLITE_PRIN
1e90: 54 46 5f 53 51 4c 46 55 4e 43 20 2a 2f 0a 20 20  TF_SQLFUNC */.  
1ea0: 63 68 61 72 20 70 72 65 66 69 78 3b 20 20 20 20  char prefix;    
1eb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
1ec0: 65 66 69 78 20 63 68 61 72 61 63 74 65 72 2e 20  efix character. 
1ed0: 20 22 2b 22 20 6f 72 20 22 2d 22 20 6f 72 20 22   "+" or "-" or "
1ee0: 20 22 20 6f 72 20 27 5c 30 27 2e 20 2a 2f 0a 20   " or '\0'. */. 
1ef0: 20 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 20 6c   sqlite_uint64 l
1f00: 6f 6e 67 76 61 6c 75 65 3b 20 20 20 2f 2a 20 56  ongvalue;   /* V
1f10: 61 6c 75 65 20 66 6f 72 20 69 6e 74 65 67 65 72  alue for integer
1f20: 20 74 79 70 65 73 20 2a 2f 0a 20 20 4c 4f 4e 47   types */.  LONG
1f30: 44 4f 55 42 4c 45 5f 54 59 50 45 20 72 65 61 6c  DOUBLE_TYPE real
1f40: 76 61 6c 75 65 3b 20 2f 2a 20 56 61 6c 75 65 20  value; /* Value 
1f50: 66 6f 72 20 72 65 61 6c 20 74 79 70 65 73 20 2a  for real types *
1f60: 2f 0a 20 20 63 6f 6e 73 74 20 65 74 5f 69 6e 66  /.  const et_inf
1f70: 6f 20 2a 69 6e 66 6f 70 3b 20 20 20 20 20 20 2f  o *infop;      /
1f80: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
1f90: 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e 66   appropriate inf
1fa0: 6f 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  o structure */. 
1fb0: 20 63 68 61 72 20 2a 7a 4f 75 74 3b 20 20 20 20   char *zOut;    
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1fd0: 65 6e 64 65 72 69 6e 67 20 62 75 66 66 65 72 20  endering buffer 
1fe0: 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 3b 20 20  */.  int nOut;  
1ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2000: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72  /* Size of the r
2010: 65 6e 64 65 72 69 6e 67 20 62 75 66 66 65 72 20  endering buffer 
2020: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72  */.  char *zExtr
2030: 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  a = 0;          
2040: 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 6d 65 6d 6f  /* Malloced memo
2050: 72 79 20 75 73 65 64 20 62 79 20 73 6f 6d 65 20  ry used by some 
2060: 63 6f 6e 76 65 72 73 69 6f 6e 20 2a 2f 0a 23 69  conversion */.#i
2070: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2080: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
2090: 0a 20 20 69 6e 74 20 20 65 78 70 2c 20 65 32 3b  .  int  exp, e2;
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20b0: 20 65 78 70 6f 6e 65 6e 74 20 6f 66 20 72 65 61   exponent of rea
20c0: 6c 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 69  l numbers */.  i
20d0: 6e 74 20 6e 73 64 3b 20 20 20 20 20 20 20 20 20  nt nsd;         
20e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
20f0: 62 65 72 20 6f 66 20 73 69 67 6e 69 66 69 63 61  ber of significa
2100: 6e 74 20 64 69 67 69 74 73 20 72 65 74 75 72 6e  nt digits return
2110: 65 64 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 72  ed */.  double r
2120: 6f 75 6e 64 65 72 3b 20 20 20 20 20 20 20 20 20  ounder;         
2130: 20 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 72     /* Used for r
2140: 6f 75 6e 64 69 6e 67 20 66 6c 6f 61 74 69 6e 67  ounding floating
2150: 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 2a 2f   point values */
2160: 0a 20 20 65 74 42 79 74 65 20 66 6c 61 67 5f 64  .  etByte flag_d
2170: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
2180: 20 54 72 75 65 20 69 66 20 64 65 63 69 6d 61 6c   True if decimal
2190: 20 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 62 65   point should be
21a0: 20 73 68 6f 77 6e 20 2a 2f 0a 20 20 65 74 42 79   shown */.  etBy
21b0: 74 65 20 66 6c 61 67 5f 72 74 7a 3b 20 20 20 20  te flag_rtz;    
21c0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
21d0: 66 20 74 72 61 69 6c 69 6e 67 20 7a 65 72 6f 73  f trailing zeros
21e0: 20 73 68 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76   should be remov
21f0: 65 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 50  ed */.#endif.  P
2200: 72 69 6e 74 66 41 72 67 75 6d 65 6e 74 73 20 2a  rintfArguments *
2210: 70 41 72 67 4c 69 73 74 20 3d 20 30 3b 20 2f 2a  pArgList = 0; /*
2220: 20 41 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 53   Arguments for S
2230: 51 4c 49 54 45 5f 50 52 49 4e 54 46 5f 53 51 4c  QLITE_PRINTF_SQL
2240: 46 55 4e 43 20 2a 2f 0a 20 20 63 68 61 72 20 62  FUNC */.  char b
2250: 75 66 5b 65 74 42 55 46 53 49 5a 45 5d 3b 20 20  uf[etBUFSIZE];  
2260: 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 73 69       /* Conversi
2270: 6f 6e 20 62 75 66 66 65 72 20 2a 2f 0a 0a 20 20  on buffer */..  
2280: 2f 2a 20 70 41 63 63 75 6d 20 6e 65 76 65 72 20  /* pAccum never 
2290: 73 74 61 72 74 73 20 6f 75 74 20 77 69 74 68 20  starts out with 
22a0: 61 6e 20 65 6d 70 74 79 20 62 75 66 66 65 72 20  an empty buffer 
22b0: 74 68 61 74 20 77 61 73 20 6f 62 74 61 69 6e 65  that was obtaine
22c0: 64 20 66 72 6f 6d 20 0a 20 20 2a 2a 20 6d 61 6c  d from .  ** mal
22d0: 6c 6f 63 28 29 2e 20 20 54 68 69 73 20 70 72 65  loc().  This pre
22e0: 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 72 65 71  condition is req
22f0: 75 69 72 65 64 20 62 79 20 74 68 65 20 6d 70 72  uired by the mpr
2300: 69 6e 74 66 28 22 25 7a 2e 2e 2e 22 29 0a 20 20  intf("%z...").  
2310: 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  ** optimization.
2320: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 41   */.  assert( pA
2330: 63 63 75 6d 2d 3e 6e 43 68 61 72 3e 30 20 7c 7c  ccum->nChar>0 ||
2340: 20 28 70 41 63 63 75 6d 2d 3e 70 72 69 6e 74 66   (pAccum->printf
2350: 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 50 52 49  Flags&SQLITE_PRI
2360: 4e 54 46 5f 4d 41 4c 4c 4f 43 45 44 29 3d 3d 30  NTF_MALLOCED)==0
2370: 20 29 3b 0a 0a 20 20 62 75 66 70 74 20 3d 20 30   );..  bufpt = 0
2380: 3b 0a 20 20 69 66 28 20 28 70 41 63 63 75 6d 2d  ;.  if( (pAccum-
2390: 3e 70 72 69 6e 74 66 46 6c 61 67 73 20 26 20 53  >printfFlags & S
23a0: 51 4c 49 54 45 5f 50 52 49 4e 54 46 5f 53 51 4c  QLITE_PRINTF_SQL
23b0: 46 55 4e 43 29 21 3d 30 20 29 7b 0a 20 20 20 20  FUNC)!=0 ){.    
23c0: 70 41 72 67 4c 69 73 74 20 3d 20 76 61 5f 61 72  pArgList = va_ar
23d0: 67 28 61 70 2c 20 50 72 69 6e 74 66 41 72 67 75  g(ap, PrintfArgu
23e0: 6d 65 6e 74 73 2a 29 3b 0a 20 20 20 20 62 41 72  ments*);.    bAr
23f0: 67 4c 69 73 74 20 3d 20 31 3b 0a 20 20 7d 65 6c  gList = 1;.  }el
2400: 73 65 7b 0a 20 20 20 20 62 41 72 67 4c 69 73 74  se{.    bArgList
2410: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28   = 0;.  }.  for(
2420: 3b 20 28 63 3d 28 2a 66 6d 74 29 29 21 3d 30 3b  ; (c=(*fmt))!=0;
2430: 20 2b 2b 66 6d 74 29 7b 0a 20 20 20 20 69 66 28   ++fmt){.    if(
2440: 20 63 21 3d 27 25 27 20 29 7b 0a 20 20 20 20 20   c!='%' ){.     
2450: 20 62 75 66 70 74 20 3d 20 28 63 68 61 72 20 2a   bufpt = (char *
2460: 29 66 6d 74 3b 0a 23 69 66 20 48 41 56 45 5f 53  )fmt;.#if HAVE_S
2470: 54 52 43 48 52 4e 55 4c 0a 20 20 20 20 20 20 66  TRCHRNUL.      f
2480: 6d 74 20 3d 20 73 74 72 63 68 72 6e 75 6c 28 66  mt = strchrnul(f
2490: 6d 74 2c 20 27 25 27 29 3b 0a 23 65 6c 73 65 0a  mt, '%');.#else.
24a0: 20 20 20 20 20 20 64 6f 7b 20 66 6d 74 2b 2b 3b        do{ fmt++;
24b0: 20 7d 77 68 69 6c 65 28 20 2a 66 6d 74 20 26 26   }while( *fmt &&
24c0: 20 2a 66 6d 74 20 21 3d 20 27 25 27 20 29 3b 0a   *fmt != '%' );.
24d0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 73 71 6c  #endif.      sql
24e0: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28  ite3_str_append(
24f0: 70 41 63 63 75 6d 2c 20 62 75 66 70 74 2c 20 28  pAccum, bufpt, (
2500: 69 6e 74 29 28 66 6d 74 20 2d 20 62 75 66 70 74  int)(fmt - bufpt
2510: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 2a 66  ));.      if( *f
2520: 6d 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  mt==0 ) break;. 
2530: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 63 3d     }.    if( (c=
2540: 28 2a 2b 2b 66 6d 74 29 29 3d 3d 30 20 29 7b 0a  (*++fmt))==0 ){.
2550: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
2560: 72 5f 61 70 70 65 6e 64 28 70 41 63 63 75 6d 2c  r_append(pAccum,
2570: 20 22 25 22 2c 20 31 29 3b 0a 20 20 20 20 20 20   "%", 1);.      
2580: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
2590: 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 61   /* Find out wha
25a0: 74 20 66 6c 61 67 73 20 61 72 65 20 70 72 65 73  t flags are pres
25b0: 65 6e 74 20 2a 2f 0a 20 20 20 20 66 6c 61 67 5f  ent */.    flag_
25c0: 6c 65 66 74 6a 75 73 74 69 66 79 20 3d 20 66 6c  leftjustify = fl
25d0: 61 67 5f 70 72 65 66 69 78 20 3d 20 63 54 68 6f  ag_prefix = cTho
25e0: 75 73 61 6e 64 20 3d 0a 20 20 20 20 20 66 6c 61  usand =.     fla
25f0: 67 5f 61 6c 74 65 72 6e 61 74 65 66 6f 72 6d 20  g_alternateform 
2600: 3d 20 66 6c 61 67 5f 61 6c 74 66 6f 72 6d 32 20  = flag_altform2 
2610: 3d 20 66 6c 61 67 5f 7a 65 72 6f 70 61 64 20 3d  = flag_zeropad =
2620: 20 30 3b 0a 20 20 20 20 64 6f 6e 65 20 3d 20 30   0;.    done = 0
2630: 3b 0a 20 20 20 20 77 69 64 74 68 20 3d 20 30 3b  ;.    width = 0;
2640: 0a 20 20 20 20 66 6c 61 67 5f 6c 6f 6e 67 20 3d  .    flag_long =
2650: 20 30 3b 0a 20 20 20 20 70 72 65 63 69 73 69 6f   0;.    precisio
2660: 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 64 6f 7b 0a  n = -1;.    do{.
2670: 20 20 20 20 20 20 73 77 69 74 63 68 28 20 63 20        switch( c 
2680: 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ){.        case 
2690: 27 2d 27 3a 20 20 20 66 6c 61 67 5f 6c 65 66 74  '-':   flag_left
26a0: 6a 75 73 74 69 66 79 20 3d 20 31 3b 20 20 20 20  justify = 1;    
26b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
26c0: 63 61 73 65 20 27 2b 27 3a 20 20 20 66 6c 61 67  case '+':   flag
26d0: 5f 70 72 65 66 69 78 20 3d 20 27 2b 27 3b 20 20  _prefix = '+';  
26e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26f0: 20 20 20 20 20 63 61 73 65 20 27 20 27 3a 20 20       case ' ':  
2700: 20 66 6c 61 67 5f 70 72 65 66 69 78 20 3d 20 27   flag_prefix = '
2710: 20 27 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b   ';        break
2720: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27  ;.        case '
2730: 23 27 3a 20 20 20 66 6c 61 67 5f 61 6c 74 65 72  #':   flag_alter
2740: 6e 61 74 65 66 6f 72 6d 20 3d 20 31 3b 20 20 20  nateform = 1;   
2750: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
2760: 61 73 65 20 27 21 27 3a 20 20 20 66 6c 61 67 5f  ase '!':   flag_
2770: 61 6c 74 66 6f 72 6d 32 20 3d 20 31 3b 20 20 20  altform2 = 1;   
2780: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2790: 20 20 20 20 63 61 73 65 20 27 30 27 3a 20 20 20      case '0':   
27a0: 66 6c 61 67 5f 7a 65 72 6f 70 61 64 20 3d 20 31  flag_zeropad = 1
27b0: 3b 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;         break;
27c0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 2c  .        case ',
27d0: 27 3a 20 20 20 63 54 68 6f 75 73 61 6e 64 20 3d  ':   cThousand =
27e0: 20 27 2c 27 3b 20 20 20 20 20 20 20 20 20 20 62   ',';          b
27f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 64 65  reak;.        de
2800: 66 61 75 6c 74 3a 20 20 20 20 64 6f 6e 65 20 3d  fault:    done =
2810: 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
2820: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2830: 20 20 20 63 61 73 65 20 27 6c 27 3a 20 7b 0a 20     case 'l': {. 
2840: 20 20 20 20 20 20 20 20 20 66 6c 61 67 5f 6c 6f           flag_lo
2850: 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ng = 1;.        
2860: 20 20 63 20 3d 20 2a 2b 2b 66 6d 74 3b 0a 20 20    c = *++fmt;.  
2870: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
2880: 6c 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l' ){.          
2890: 20 20 63 20 3d 20 2a 2b 2b 66 6d 74 3b 0a 20 20    c = *++fmt;.  
28a0: 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 5f 6c            flag_l
28b0: 6f 6e 67 20 3d 20 32 3b 0a 20 20 20 20 20 20 20  ong = 2;.       
28c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 64     }.          d
28d0: 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  one = 1;.       
28e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
28f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65    }.        case
2900: 20 27 31 27 3a 20 63 61 73 65 20 27 32 27 3a 20   '1': case '2': 
2910: 63 61 73 65 20 27 33 27 3a 20 63 61 73 65 20 27  case '3': case '
2920: 34 27 3a 20 63 61 73 65 20 27 35 27 3a 0a 20 20  4': case '5':.  
2930: 20 20 20 20 20 20 63 61 73 65 20 27 36 27 3a 20        case '6': 
2940: 63 61 73 65 20 27 37 27 3a 20 63 61 73 65 20 27  case '7': case '
2950: 38 27 3a 20 63 61 73 65 20 27 39 27 3a 20 7b 0a  8': case '9': {.
2960: 20 20 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e            unsign
2970: 65 64 20 77 78 20 3d 20 63 20 2d 20 27 30 27 3b  ed wx = c - '0';
2980: 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
2990: 28 20 28 63 20 3d 20 2a 2b 2b 66 6d 74 29 3e 3d  ( (c = *++fmt)>=
29a0: 27 30 27 20 26 26 20 63 3c 3d 27 39 27 20 29 7b  '0' && c<='9' ){
29b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 78 20  .            wx 
29c0: 3d 20 77 78 2a 31 30 20 2b 20 63 20 2d 20 27 30  = wx*10 + c - '0
29d0: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ';.          }. 
29e0: 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
29f0: 65 28 20 77 78 3e 30 78 37 66 66 66 66 66 66 66  e( wx>0x7fffffff
2a00: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 77 69   );.          wi
2a10: 64 74 68 20 3d 20 77 78 20 26 20 30 78 37 66 66  dth = wx & 0x7ff
2a20: 66 66 66 66 66 3b 0a 23 69 66 64 65 66 20 53 51  fffff;.#ifdef SQ
2a30: 4c 49 54 45 5f 50 52 49 4e 54 46 5f 50 52 45 43  LITE_PRINTF_PREC
2a40: 49 53 49 4f 4e 5f 4c 49 4d 49 54 0a 20 20 20 20  ISION_LIMIT.    
2a50: 20 20 20 20 20 20 69 66 28 20 77 69 64 74 68 3e        if( width>
2a60: 53 51 4c 49 54 45 5f 50 52 49 4e 54 46 5f 50 52  SQLITE_PRINTF_PR
2a70: 45 43 49 53 49 4f 4e 5f 4c 49 4d 49 54 20 29 7b  ECISION_LIMIT ){
2a80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 69 64  .            wid
2a90: 74 68 20 3d 20 53 51 4c 49 54 45 5f 50 52 49 4e  th = SQLITE_PRIN
2aa0: 54 46 5f 50 52 45 43 49 53 49 4f 4e 5f 4c 49 4d  TF_PRECISION_LIM
2ab0: 49 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  IT;.          }.
2ac0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
2ad0: 20 69 66 28 20 63 21 3d 27 2e 27 20 26 26 20 63   if( c!='.' && c
2ae0: 21 3d 27 6c 27 20 29 7b 0a 20 20 20 20 20 20 20  !='l' ){.       
2af0: 20 20 20 20 20 64 6f 6e 65 20 3d 20 31 3b 0a 20       done = 1;. 
2b00: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2b10: 20 20 20 20 20 20 20 20 20 20 20 20 66 6d 74 2d              fmt-
2b20: 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  -;.          }. 
2b30: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2b40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b50: 20 20 63 61 73 65 20 27 2a 27 3a 20 7b 0a 20 20    case '*': {.  
2b60: 20 20 20 20 20 20 20 20 69 66 28 20 62 41 72 67          if( bArg
2b70: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
2b80: 20 20 20 20 77 69 64 74 68 20 3d 20 28 69 6e 74      width = (int
2b90: 29 67 65 74 49 6e 74 41 72 67 28 70 41 72 67 4c  )getIntArg(pArgL
2ba0: 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ist);.          
2bb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2bc0: 20 20 20 77 69 64 74 68 20 3d 20 76 61 5f 61 72     width = va_ar
2bd0: 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20  g(ap,int);.     
2be0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2bf0: 20 69 66 28 20 77 69 64 74 68 3c 30 20 29 7b 0a   if( width<0 ){.
2c00: 20 20 20 20 20 20 20 20 20 20 20 20 66 6c 61 67              flag
2c10: 5f 6c 65 66 74 6a 75 73 74 69 66 79 20 3d 20 31  _leftjustify = 1
2c20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 69  ;.            wi
2c30: 64 74 68 20 3d 20 77 69 64 74 68 20 3e 3d 20 2d  dth = width >= -
2c40: 32 31 34 37 34 38 33 36 34 37 20 3f 20 2d 77 69  2147483647 ? -wi
2c50: 64 74 68 20 3a 20 30 3b 0a 20 20 20 20 20 20 20  dth : 0;.       
2c60: 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
2c70: 54 45 5f 50 52 49 4e 54 46 5f 50 52 45 43 49 53  TE_PRINTF_PRECIS
2c80: 49 4f 4e 5f 4c 49 4d 49 54 0a 20 20 20 20 20 20  ION_LIMIT.      
2c90: 20 20 20 20 69 66 28 20 77 69 64 74 68 3e 53 51      if( width>SQ
2ca0: 4c 49 54 45 5f 50 52 49 4e 54 46 5f 50 52 45 43  LITE_PRINTF_PREC
2cb0: 49 53 49 4f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20  ISION_LIMIT ){. 
2cc0: 20 20 20 20 20 20 20 20 20 20 20 77 69 64 74 68             width
2cd0: 20 3d 20 53 51 4c 49 54 45 5f 50 52 49 4e 54 46   = SQLITE_PRINTF
2ce0: 5f 50 52 45 43 49 53 49 4f 4e 5f 4c 49 4d 49 54  _PRECISION_LIMIT
2cf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65  ;.          }.#e
2d00: 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 69  ndif.          i
2d10: 66 28 20 28 63 20 3d 20 66 6d 74 5b 31 5d 29 21  f( (c = fmt[1])!
2d20: 3d 27 2e 27 20 26 26 20 63 21 3d 27 6c 27 20 29  ='.' && c!='l' )
2d30: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 20  {.            c 
2d40: 3d 20 2a 2b 2b 66 6d 74 3b 0a 20 20 20 20 20 20  = *++fmt;.      
2d50: 20 20 20 20 20 20 64 6f 6e 65 20 3d 20 31 3b 0a        done = 1;.
2d60: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2d80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
2d90: 61 73 65 20 27 2e 27 3a 20 7b 0a 20 20 20 20 20  ase '.': {.     
2da0: 20 20 20 20 20 63 20 3d 20 2a 2b 2b 66 6d 74 3b       c = *++fmt;
2db0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
2dc0: 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20 20 20  =='*' ){.       
2dd0: 20 20 20 20 20 69 66 28 20 62 41 72 67 4c 69 73       if( bArgLis
2de0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
2df0: 20 20 20 70 72 65 63 69 73 69 6f 6e 20 3d 20 28     precision = (
2e00: 69 6e 74 29 67 65 74 49 6e 74 41 72 67 28 70 41  int)getIntArg(pA
2e10: 72 67 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  rgList);.       
2e20: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2e30: 20 20 20 20 20 20 20 20 20 20 70 72 65 63 69 73            precis
2e40: 69 6f 6e 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  ion = va_arg(ap,
2e50: 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  int);.          
2e60: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2e70: 69 66 28 20 70 72 65 63 69 73 69 6f 6e 3c 30 20  if( precision<0 
2e80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2e90: 20 70 72 65 63 69 73 69 6f 6e 20 3d 20 70 72 65   precision = pre
2ea0: 63 69 73 69 6f 6e 20 3e 3d 20 2d 32 31 34 37 34  cision >= -21474
2eb0: 38 33 36 34 37 20 3f 20 2d 70 72 65 63 69 73 69  83647 ? -precisi
2ec0: 6f 6e 20 3a 20 2d 31 3b 0a 20 20 20 20 20 20 20  on : -1;.       
2ed0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2ee0: 20 20 20 63 20 3d 20 2a 2b 2b 66 6d 74 3b 0a 20     c = *++fmt;. 
2ef0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 73 69              unsi
2f10: 67 6e 65 64 20 70 78 20 3d 20 30 3b 0a 20 20 20  gned px = 0;.   
2f20: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
2f30: 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 39 27  c>='0' && c<='9'
2f40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f50: 20 20 70 78 20 3d 20 70 78 2a 31 30 20 2b 20 63    px = px*10 + c
2f60: 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20   - '0';.        
2f70: 20 20 20 20 20 20 63 20 3d 20 2a 2b 2b 66 6d 74        c = *++fmt
2f80: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2f90: 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
2fa0: 63 61 73 65 28 20 70 78 3e 30 78 37 66 66 66 66  case( px>0x7ffff
2fb0: 66 66 66 20 29 3b 0a 20 20 20 20 20 20 20 20 20  fff );.         
2fc0: 20 20 20 70 72 65 63 69 73 69 6f 6e 20 3d 20 70     precision = p
2fd0: 78 20 26 20 30 78 37 66 66 66 66 66 66 66 3b 0a  x & 0x7fffffff;.
2fe0: 20 20 20 20 20 20 20 20 20 20 7d 0a 23 69 66 64            }.#ifd
2ff0: 65 66 20 53 51 4c 49 54 45 5f 50 52 49 4e 54 46  ef SQLITE_PRINTF
3000: 5f 50 52 45 43 49 53 49 4f 4e 5f 4c 49 4d 49 54  _PRECISION_LIMIT
3010: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
3020: 72 65 63 69 73 69 6f 6e 3e 53 51 4c 49 54 45 5f  recision>SQLITE_
3030: 50 52 49 4e 54 46 5f 50 52 45 43 49 53 49 4f 4e  PRINTF_PRECISION
3040: 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20  _LIMIT ){.      
3050: 20 20 20 20 20 20 70 72 65 63 69 73 69 6f 6e 20        precision 
3060: 3d 20 53 51 4c 49 54 45 5f 50 52 49 4e 54 46 5f  = SQLITE_PRINTF_
3070: 50 52 45 43 49 53 49 4f 4e 5f 4c 49 4d 49 54 3b  PRECISION_LIMIT;
3080: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  .          }.#en
3090: 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 69 66  dif.          if
30a0: 28 20 63 3d 3d 27 6c 27 20 29 7b 0a 20 20 20 20  ( c=='l' ){.    
30b0: 20 20 20 20 20 20 20 20 2d 2d 66 6d 74 3b 0a 20          --fmt;. 
30c0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 6e 65              done
30e0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
30f0: 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
3100: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
3110: 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28     }.    }while(
3120: 20 21 64 6f 6e 65 20 26 26 20 28 63 3d 28 2a 2b   !done && (c=(*+
3130: 2b 66 6d 74 29 29 21 3d 30 20 29 3b 0a 0a 20 20  +fmt))!=0 );..  
3140: 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69    /* Fetch the i
3150: 6e 66 6f 20 65 6e 74 72 79 20 66 6f 72 20 74 68  nfo entry for th
3160: 65 20 66 69 65 6c 64 20 2a 2f 0a 20 20 20 20 69  e field */.    i
3170: 6e 66 6f 70 20 3d 20 26 66 6d 74 69 6e 66 6f 5b  nfop = &fmtinfo[
3180: 30 5d 3b 0a 20 20 20 20 78 74 79 70 65 20 3d 20  0];.    xtype = 
3190: 65 74 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 66  etINVALID;.    f
31a0: 6f 72 28 69 64 78 3d 30 3b 20 69 64 78 3c 41 72  or(idx=0; idx<Ar
31b0: 72 61 79 53 69 7a 65 28 66 6d 74 69 6e 66 6f 29  raySize(fmtinfo)
31c0: 3b 20 69 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20  ; idx++){.      
31d0: 69 66 28 20 63 3d 3d 66 6d 74 69 6e 66 6f 5b 69  if( c==fmtinfo[i
31e0: 64 78 5d 2e 66 6d 74 74 79 70 65 20 29 7b 0a 20  dx].fmttype ){. 
31f0: 20 20 20 20 20 20 20 69 6e 66 6f 70 20 3d 20 26         infop = &
3200: 66 6d 74 69 6e 66 6f 5b 69 64 78 5d 3b 0a 20 20  fmtinfo[idx];.  
3210: 20 20 20 20 20 20 78 74 79 70 65 20 3d 20 69 6e        xtype = in
3220: 66 6f 70 2d 3e 74 79 70 65 3b 0a 20 20 20 20 20  fop->type;.     
3230: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3240: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  }.    }..    /*.
3250: 20 20 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70      ** At this p
3260: 6f 69 6e 74 2c 20 76 61 72 69 61 62 6c 65 73 20  oint, variables 
3270: 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  are initialized 
3280: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
3290: 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 66 6c 61 67  **.    **   flag
32a0: 5f 61 6c 74 65 72 6e 61 74 65 66 6f 72 6d 20 20  _alternateform  
32b0: 20 20 20 20 20 20 20 20 54 52 55 45 20 69 66 20          TRUE if 
32c0: 61 20 27 23 27 20 69 73 20 70 72 65 73 65 6e 74  a '#' is present
32d0: 2e 0a 20 20 20 20 2a 2a 20 20 20 66 6c 61 67 5f  ..    **   flag_
32e0: 61 6c 74 66 6f 72 6d 32 20 20 20 20 20 20 20 20  altform2        
32f0: 20 20 20 20 20 20 20 54 52 55 45 20 69 66 20 61         TRUE if a
3300: 20 27 21 27 20 69 73 20 70 72 65 73 65 6e 74 2e   '!' is present.
3310: 0a 20 20 20 20 2a 2a 20 20 20 66 6c 61 67 5f 70  .    **   flag_p
3320: 72 65 66 69 78 20 20 20 20 20 20 20 20 20 20 20  refix           
3330: 20 20 20 20 20 20 27 2b 27 20 6f 72 20 27 20 27        '+' or ' '
3340: 20 6f 72 20 7a 65 72 6f 0a 20 20 20 20 2a 2a 20   or zero.    ** 
3350: 20 20 66 6c 61 67 5f 6c 65 66 74 6a 75 73 74 69    flag_leftjusti
3360: 66 79 20 20 20 20 20 20 20 20 20 20 20 20 54 52  fy            TR
3370: 55 45 20 69 66 20 61 20 27 2d 27 20 69 73 20 70  UE if a '-' is p
3380: 72 65 73 65 6e 74 20 6f 72 20 69 66 20 74 68 65  resent or if the
3390: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b0: 20 20 20 20 20 20 66 69 65 6c 64 20 77 69 64 74        field widt
33c0: 68 20 77 61 73 20 6e 65 67 61 74 69 76 65 2e 0a  h was negative..
33d0: 20 20 20 20 2a 2a 20 20 20 66 6c 61 67 5f 7a 65      **   flag_ze
33e0: 72 6f 70 61 64 20 20 20 20 20 20 20 20 20 20 20  ropad           
33f0: 20 20 20 20 20 54 52 55 45 20 69 66 20 74 68 65       TRUE if the
3400: 20 77 69 64 74 68 20 62 65 67 61 6e 20 77 69 74   width began wit
3410: 68 20 30 2e 0a 20 20 20 20 2a 2a 20 20 20 66 6c  h 0..    **   fl
3420: 61 67 5f 6c 6f 6e 67 20 20 20 20 20 20 20 20 20  ag_long         
3430: 20 20 20 20 20 20 20 20 20 20 31 20 66 6f 72 20            1 for 
3440: 22 6c 22 2c 20 32 20 66 6f 72 20 22 6c 6c 22 0a  "l", 2 for "ll".
3450: 20 20 20 20 2a 2a 20 20 20 77 69 64 74 68 20 20      **   width  
3460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3470: 20 20 20 20 20 54 68 65 20 73 70 65 63 69 66 69       The specifi
3480: 65 64 20 66 69 65 6c 64 20 77 69 64 74 68 2e 20  ed field width. 
3490: 20 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20   This is.    ** 
34a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6c                al
34c0: 77 61 79 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  ways non-negativ
34d0: 65 2e 20 20 5a 65 72 6f 20 69 73 20 74 68 65 20  e.  Zero is the 
34e0: 64 65 66 61 75 6c 74 2e 0a 20 20 20 20 2a 2a 20  default..    ** 
34f0: 20 20 70 72 65 63 69 73 69 6f 6e 20 20 20 20 20    precision     
3500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68                Th
3510: 65 20 73 70 65 63 69 66 69 65 64 20 70 72 65 63  e specified prec
3520: 69 73 69 6f 6e 2e 20 20 54 68 65 20 64 65 66 61  ision.  The defa
3530: 75 6c 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ult.    **      
3540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3550: 20 20 20 20 20 20 20 20 20 69 73 20 2d 31 2e 0a           is -1..
3560: 20 20 20 20 2a 2a 20 20 20 78 74 79 70 65 20 20      **   xtype  
3570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3580: 20 20 20 20 20 54 68 65 20 63 6c 61 73 73 20 6f       The class o
3590: 66 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e  f the conversion
35a0: 2e 0a 20 20 20 20 2a 2a 20 20 20 69 6e 66 6f 70  ..    **   infop
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c0: 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74         Pointer t
35d0: 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  o the appropriat
35e0: 65 20 69 6e 66 6f 20 73 74 72 75 63 74 2e 0a 20  e info struct.. 
35f0: 20 20 20 2a 2f 0a 20 20 20 20 73 77 69 74 63 68     */.    switch
3600: 28 20 78 74 79 70 65 20 29 7b 0a 20 20 20 20 20  ( xtype ){.     
3610: 20 63 61 73 65 20 65 74 50 4f 49 4e 54 45 52 3a   case etPOINTER:
3620: 0a 20 20 20 20 20 20 20 20 66 6c 61 67 5f 6c 6f  .        flag_lo
3630: 6e 67 20 3d 20 73 69 7a 65 6f 66 28 63 68 61 72  ng = sizeof(char
3640: 2a 29 3d 3d 73 69 7a 65 6f 66 28 69 36 34 29 20  *)==sizeof(i64) 
3650: 3f 20 32 20 3a 0a 20 20 20 20 20 20 20 20 20 20  ? 2 :.          
3660: 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
3670: 66 28 63 68 61 72 2a 29 3d 3d 73 69 7a 65 6f 66  f(char*)==sizeof
3680: 28 6c 6f 6e 67 20 69 6e 74 29 20 3f 20 31 20 3a  (long int) ? 1 :
3690: 20 30 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   0;.        /* F
36a0: 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f  all through into
36b0: 20 74 68 65 20 6e 65 78 74 20 63 61 73 65 20 2a   the next case *
36c0: 2f 0a 20 20 20 20 20 20 63 61 73 65 20 65 74 4f  /.      case etO
36d0: 52 44 49 4e 41 4c 3a 0a 20 20 20 20 20 20 63 61  RDINAL:.      ca
36e0: 73 65 20 65 74 52 41 44 49 58 3a 20 20 20 20 20  se etRADIX:     
36f0: 20 0a 20 20 20 20 20 20 20 20 63 54 68 6f 75 73   .        cThous
3700: 61 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  and = 0;.       
3710: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
3720: 20 69 6e 74 6f 20 74 68 65 20 6e 65 78 74 20 63   into the next c
3730: 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 63 61 73  ase */.      cas
3740: 65 20 65 74 44 45 43 49 4d 41 4c 3a 0a 20 20 20  e etDECIMAL:.   
3750: 20 20 20 20 20 69 66 28 20 69 6e 66 6f 70 2d 3e       if( infop->
3760: 66 6c 61 67 73 20 26 20 46 4c 41 47 5f 53 49 47  flags & FLAG_SIG
3770: 4e 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NED ){.         
3780: 20 69 36 34 20 76 3b 0a 20 20 20 20 20 20 20 20   i64 v;.        
3790: 20 20 69 66 28 20 62 41 72 67 4c 69 73 74 20 29    if( bArgList )
37a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 20  {.            v 
37b0: 3d 20 67 65 74 49 6e 74 41 72 67 28 70 41 72 67  = getIntArg(pArg
37c0: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20  List);.         
37d0: 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 5f   }else if( flag_
37e0: 6c 6f 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  long ){.        
37f0: 20 20 20 20 69 66 28 20 66 6c 61 67 5f 6c 6f 6e      if( flag_lon
3800: 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20  g==2 ){.        
3810: 20 20 20 20 20 20 76 20 3d 20 76 61 5f 61 72 67        v = va_arg
3820: 28 61 70 2c 69 36 34 29 20 3b 0a 20 20 20 20 20  (ap,i64) ;.     
3830: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
3840: 20 20 20 20 20 20 20 20 20 20 20 20 76 20 3d 20              v = 
3850: 76 61 5f 61 72 67 28 61 70 2c 6c 6f 6e 67 20 69  va_arg(ap,long i
3860: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nt);.           
3870: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
3880: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
3890: 76 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e  v = va_arg(ap,in
38a0: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  t);.          }.
38b0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76 3c            if( v<
38c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
38d0: 20 69 66 28 20 76 3d 3d 53 4d 41 4c 4c 45 53 54   if( v==SMALLEST
38e0: 5f 49 4e 54 36 34 20 29 7b 0a 20 20 20 20 20 20  _INT64 ){.      
38f0: 20 20 20 20 20 20 20 20 6c 6f 6e 67 76 61 6c 75          longvalu
3900: 65 20 3d 20 28 28 75 36 34 29 31 29 3c 3c 36 33  e = ((u64)1)<<63
3910: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
3920: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
3930: 20 20 20 6c 6f 6e 67 76 61 6c 75 65 20 3d 20 2d     longvalue = -
3940: 76 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  v;.            }
3950: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65  .            pre
3960: 66 69 78 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20  fix = '-';.     
3970: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
3980: 20 20 20 20 20 20 20 20 6c 6f 6e 67 76 61 6c 75          longvalu
3990: 65 20 3d 20 76 3b 0a 20 20 20 20 20 20 20 20 20  e = v;.         
39a0: 20 20 20 70 72 65 66 69 78 20 3d 20 66 6c 61 67     prefix = flag
39b0: 5f 70 72 65 66 69 78 3b 0a 20 20 20 20 20 20 20  _prefix;.       
39c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
39d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se{.          if
39e0: 28 20 62 41 72 67 4c 69 73 74 20 29 7b 0a 20 20  ( bArgList ){.  
39f0: 20 20 20 20 20 20 20 20 20 20 6c 6f 6e 67 76 61            longva
3a00: 6c 75 65 20 3d 20 28 75 36 34 29 67 65 74 49 6e  lue = (u64)getIn
3a10: 74 41 72 67 28 70 41 72 67 4c 69 73 74 29 3b 0a  tArg(pArgList);.
3a20: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
3a30: 69 66 28 20 66 6c 61 67 5f 6c 6f 6e 67 20 29 7b  if( flag_long ){
3a40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
3a50: 20 66 6c 61 67 5f 6c 6f 6e 67 3d 3d 32 20 29 7b   flag_long==2 ){
3a60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c  .              l
3a70: 6f 6e 67 76 61 6c 75 65 20 3d 20 76 61 5f 61 72  ongvalue = va_ar
3a80: 67 28 61 70 2c 75 36 34 29 3b 0a 20 20 20 20 20  g(ap,u64);.     
3a90: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
3aa0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 6e 67              long
3ab0: 76 61 6c 75 65 20 3d 20 76 61 5f 61 72 67 28 61  value = va_arg(a
3ac0: 70 2c 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  p,unsigned long 
3ad0: 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  int);.          
3ae0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
3af0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
3b00: 20 6c 6f 6e 67 76 61 6c 75 65 20 3d 20 76 61 5f   longvalue = va_
3b10: 61 72 67 28 61 70 2c 75 6e 73 69 67 6e 65 64 20  arg(ap,unsigned 
3b20: 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  int);.          
3b30: 7d 0a 20 20 20 20 20 20 20 20 20 20 70 72 65 66  }.          pref
3b40: 69 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ix = 0;.        
3b50: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f  }.        if( lo
3b60: 6e 67 76 61 6c 75 65 3d 3d 30 20 29 20 66 6c 61  ngvalue==0 ) fla
3b70: 67 5f 61 6c 74 65 72 6e 61 74 65 66 6f 72 6d 20  g_alternateform 
3b80: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
3b90: 20 66 6c 61 67 5f 7a 65 72 6f 70 61 64 20 26 26   flag_zeropad &&
3ba0: 20 70 72 65 63 69 73 69 6f 6e 3c 77 69 64 74 68   precision<width
3bb0: 2d 28 70 72 65 66 69 78 21 3d 30 29 20 29 7b 0a  -(prefix!=0) ){.
3bc0: 20 20 20 20 20 20 20 20 20 20 70 72 65 63 69 73            precis
3bd0: 69 6f 6e 20 3d 20 77 69 64 74 68 2d 28 70 72 65  ion = width-(pre
3be0: 66 69 78 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  fix!=0);.       
3bf0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
3c00: 72 65 63 69 73 69 6f 6e 3c 65 74 42 55 46 53 49  recision<etBUFSI
3c10: 5a 45 2d 31 30 2d 65 74 42 55 46 53 49 5a 45 2f  ZE-10-etBUFSIZE/
3c20: 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  3 ){.          n
3c30: 4f 75 74 20 3d 20 65 74 42 55 46 53 49 5a 45 3b  Out = etBUFSIZE;
3c40: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 75 74 20  .          zOut 
3c50: 3d 20 62 75 66 3b 0a 20 20 20 20 20 20 20 20 7d  = buf;.        }
3c60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
3c70: 75 36 34 20 6e 3b 0a 20 20 20 20 20 20 20 20 20  u64 n;.         
3c80: 20 6e 20 3d 20 28 75 36 34 29 70 72 65 63 69 73   n = (u64)precis
3c90: 69 6f 6e 20 2b 20 31 30 3b 0a 20 20 20 20 20 20  ion + 10;.      
3ca0: 20 20 20 20 69 66 28 20 63 54 68 6f 75 73 61 6e      if( cThousan
3cb0: 64 20 29 20 6e 20 2b 3d 20 70 72 65 63 69 73 69  d ) n += precisi
3cc0: 6f 6e 2f 33 3b 0a 20 20 20 20 20 20 20 20 20 20  on/3;.          
3cd0: 7a 4f 75 74 20 3d 20 7a 45 78 74 72 61 20 3d 20  zOut = zExtra = 
3ce0: 70 72 69 6e 74 66 54 65 6d 70 42 75 66 28 70 41  printfTempBuf(pA
3cf0: 63 63 75 6d 2c 20 6e 29 3b 0a 20 20 20 20 20 20  ccum, n);.      
3d00: 20 20 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20      if( zOut==0 
3d10: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
3d20: 20 20 20 20 6e 4f 75 74 20 3d 20 28 69 6e 74 29      nOut = (int)
3d30: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
3d40: 20 20 20 20 20 62 75 66 70 74 20 3d 20 26 7a 4f       bufpt = &zO
3d50: 75 74 5b 6e 4f 75 74 2d 31 5d 3b 0a 20 20 20 20  ut[nOut-1];.    
3d60: 20 20 20 20 69 66 28 20 78 74 79 70 65 3d 3d 65      if( xtype==e
3d70: 74 4f 52 44 49 4e 41 4c 20 29 7b 0a 20 20 20 20  tORDINAL ){.    
3d80: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
3d90: 73 74 20 63 68 61 72 20 7a 4f 72 64 5b 5d 20 3d  st char zOrd[] =
3da0: 20 22 74 68 73 74 6e 64 72 64 22 3b 0a 20 20 20   "thstndrd";.   
3db0: 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 28         int x = (
3dc0: 69 6e 74 29 28 6c 6f 6e 67 76 61 6c 75 65 20 25  int)(longvalue %
3dd0: 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20   10);.          
3de0: 69 66 28 20 78 3e 3d 34 20 7c 7c 20 28 6c 6f 6e  if( x>=4 || (lon
3df0: 67 76 61 6c 75 65 2f 31 30 29 25 31 30 3d 3d 31  gvalue/10)%10==1
3e00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
3e10: 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  x = 0;.         
3e20: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2a 28 2d   }.          *(-
3e30: 2d 62 75 66 70 74 29 20 3d 20 7a 4f 72 64 5b 78  -bufpt) = zOrd[x
3e40: 2a 32 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 20  *2+1];.         
3e50: 20 2a 28 2d 2d 62 75 66 70 74 29 20 3d 20 7a 4f   *(--bufpt) = zO
3e60: 72 64 5b 78 2a 32 5d 3b 0a 20 20 20 20 20 20 20  rd[x*2];.       
3e70: 20 7d 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20   }.        {.   
3e80: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
3e90: 72 20 2a 63 73 65 74 20 3d 20 26 61 44 69 67 69  r *cset = &aDigi
3ea0: 74 73 5b 69 6e 66 6f 70 2d 3e 63 68 61 72 73 65  ts[infop->charse
3eb0: 74 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38  t];.          u8
3ec0: 20 62 61 73 65 20 3d 20 69 6e 66 6f 70 2d 3e 62   base = infop->b
3ed0: 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 64  ase;.          d
3ee0: 6f 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o{              
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3f10: 43 6f 6e 76 65 72 74 20 74 6f 20 61 73 63 69 69  Convert to ascii
3f20: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
3f30: 2a 28 2d 2d 62 75 66 70 74 29 20 3d 20 63 73 65  *(--bufpt) = cse
3f40: 74 5b 6c 6f 6e 67 76 61 6c 75 65 25 62 61 73 65  t[longvalue%base
3f50: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  ];.            l
3f60: 6f 6e 67 76 61 6c 75 65 20 3d 20 6c 6f 6e 67 76  ongvalue = longv
3f70: 61 6c 75 65 2f 62 61 73 65 3b 0a 20 20 20 20 20  alue/base;.     
3f80: 20 20 20 20 20 7d 77 68 69 6c 65 28 20 6c 6f 6e       }while( lon
3f90: 67 76 61 6c 75 65 3e 30 20 29 3b 0a 20 20 20 20  gvalue>0 );.    
3fa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 65      }.        le
3fb0: 6e 67 74 68 20 3d 20 28 69 6e 74 29 28 26 7a 4f  ngth = (int)(&zO
3fc0: 75 74 5b 6e 4f 75 74 2d 31 5d 2d 62 75 66 70 74  ut[nOut-1]-bufpt
3fd0: 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  );.        while
3fe0: 28 20 70 72 65 63 69 73 69 6f 6e 3e 6c 65 6e 67  ( precision>leng
3ff0: 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  th ){.          
4000: 2a 28 2d 2d 62 75 66 70 74 29 20 3d 20 27 30 27  *(--bufpt) = '0'
4010: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4030: 20 5a 65 72 6f 20 70 61 64 20 2a 2f 0a 20 20 20   Zero pad */.   
4040: 20 20 20 20 20 20 20 6c 65 6e 67 74 68 2b 2b 3b         length++;
4050: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4060: 20 20 20 69 66 28 20 63 54 68 6f 75 73 61 6e 64     if( cThousand
4070: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
4080: 74 20 6e 6e 20 3d 20 28 6c 65 6e 67 74 68 20 2d  t nn = (length -
4090: 20 31 29 2f 33 3b 20 20 2f 2a 20 4e 75 6d 62 65   1)/3;  /* Numbe
40a0: 72 20 6f 66 20 22 2c 22 20 74 6f 20 69 6e 73 65  r of "," to inse
40b0: 72 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  rt */.          
40c0: 69 6e 74 20 69 78 20 3d 20 28 6c 65 6e 67 74 68  int ix = (length
40d0: 20 2d 20 31 29 25 33 20 2b 20 31 3b 0a 20 20 20   - 1)%3 + 1;.   
40e0: 20 20 20 20 20 20 20 62 75 66 70 74 20 2d 3d 20         bufpt -= 
40f0: 6e 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  nn;.          fo
4100: 72 28 69 64 78 3d 30 3b 20 6e 6e 3e 30 3b 20 69  r(idx=0; nn>0; i
4110: 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  dx++){.         
4120: 20 20 20 62 75 66 70 74 5b 69 64 78 5d 20 3d 20     bufpt[idx] = 
4130: 62 75 66 70 74 5b 69 64 78 2b 6e 6e 5d 3b 0a 20  bufpt[idx+nn];. 
4140: 20 20 20 20 20 20 20 20 20 20 20 69 78 2d 2d 3b             ix--;
4150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
4160: 20 69 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   ix==0 ){.      
4170: 20 20 20 20 20 20 20 20 62 75 66 70 74 5b 2b 2b          bufpt[++
4180: 69 64 78 5d 20 3d 20 63 54 68 6f 75 73 61 6e 64  idx] = cThousand
4190: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
41a0: 6e 6e 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20  nn--;.          
41b0: 20 20 20 20 69 78 20 3d 20 33 3b 0a 20 20 20 20      ix = 3;.    
41c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
41d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
41e0: 20 20 20 20 20 20 20 20 69 66 28 20 70 72 65 66          if( pref
41f0: 69 78 20 29 20 2a 28 2d 2d 62 75 66 70 74 29 20  ix ) *(--bufpt) 
4200: 3d 20 70 72 65 66 69 78 3b 20 20 20 20 20 20 20  = prefix;       
4210: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 73          /* Add s
4220: 69 67 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ign */.        i
4230: 66 28 20 66 6c 61 67 5f 61 6c 74 65 72 6e 61 74  f( flag_alternat
4240: 65 66 6f 72 6d 20 26 26 20 69 6e 66 6f 70 2d 3e  eform && infop->
4250: 70 72 65 66 69 78 20 29 7b 20 20 20 20 20 20 2f  prefix ){      /
4260: 2a 20 41 64 64 20 22 30 22 20 6f 72 20 22 30 78  * Add "0" or "0x
4270: 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63  " */.          c
4280: 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 65 3b 0a  onst char *pre;.
4290: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 78            char x
42a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72 65 20  ;.          pre 
42b0: 3d 20 26 61 50 72 65 66 69 78 5b 69 6e 66 6f 70  = &aPrefix[infop
42c0: 2d 3e 70 72 65 66 69 78 5d 3b 0a 20 20 20 20 20  ->prefix];.     
42d0: 20 20 20 20 20 66 6f 72 28 3b 20 28 78 3d 28 2a       for(; (x=(*
42e0: 70 72 65 29 29 21 3d 30 3b 20 70 72 65 2b 2b 29  pre))!=0; pre++)
42f0: 20 2a 28 2d 2d 62 75 66 70 74 29 20 3d 20 78 3b   *(--bufpt) = x;
4300: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4310: 20 20 20 6c 65 6e 67 74 68 20 3d 20 28 69 6e 74     length = (int
4320: 29 28 26 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d 2d  )(&zOut[nOut-1]-
4330: 62 75 66 70 74 29 3b 0a 20 20 20 20 20 20 20 20  bufpt);.        
4340: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
4350: 65 20 65 74 46 4c 4f 41 54 3a 0a 20 20 20 20 20  e etFLOAT:.     
4360: 20 63 61 73 65 20 65 74 45 58 50 3a 0a 20 20 20   case etEXP:.   
4370: 20 20 20 63 61 73 65 20 65 74 47 45 4e 45 52 49     case etGENERI
4380: 43 3a 0a 20 20 20 20 20 20 20 20 69 66 28 20 62  C:.        if( b
4390: 41 72 67 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ArgList ){.     
43a0: 20 20 20 20 20 72 65 61 6c 76 61 6c 75 65 20 3d       realvalue =
43b0: 20 67 65 74 44 6f 75 62 6c 65 41 72 67 28 70 41   getDoubleArg(pA
43c0: 72 67 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  rgList);.       
43d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
43e0: 20 20 72 65 61 6c 76 61 6c 75 65 20 3d 20 76 61    realvalue = va
43f0: 5f 61 72 67 28 61 70 2c 64 6f 75 62 6c 65 29 3b  _arg(ap,double);
4400: 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66 64 65  .        }.#ifde
4410: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
4420: 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
4430: 20 20 20 20 20 6c 65 6e 67 74 68 20 3d 20 30 3b       length = 0;
4440: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69  .#else.        i
4450: 66 28 20 70 72 65 63 69 73 69 6f 6e 3c 30 20 29  f( precision<0 )
4460: 20 70 72 65 63 69 73 69 6f 6e 20 3d 20 36 3b 20   precision = 6; 
4470: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 64          /* Set d
4480: 65 66 61 75 6c 74 20 70 72 65 63 69 73 69 6f 6e  efault precision
4490: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
44a0: 72 65 61 6c 76 61 6c 75 65 3c 30 2e 30 20 29 7b  realvalue<0.0 ){
44b0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 61 6c 76  .          realv
44c0: 61 6c 75 65 20 3d 20 2d 72 65 61 6c 76 61 6c 75  alue = -realvalu
44d0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72 65  e;.          pre
44e0: 66 69 78 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20  fix = '-';.     
44f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4500: 20 20 20 20 70 72 65 66 69 78 20 3d 20 66 6c 61      prefix = fla
4510: 67 5f 70 72 65 66 69 78 3b 0a 20 20 20 20 20 20  g_prefix;.      
4520: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
4530: 78 74 79 70 65 3d 3d 65 74 47 45 4e 45 52 49 43  xtype==etGENERIC
4540: 20 26 26 20 70 72 65 63 69 73 69 6f 6e 3e 30 20   && precision>0 
4550: 29 20 70 72 65 63 69 73 69 6f 6e 2d 2d 3b 0a 20  ) precision--;. 
4560: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
4570: 20 70 72 65 63 69 73 69 6f 6e 3e 30 78 66 66 66   precision>0xfff
4580: 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   );.        for(
4590: 69 64 78 3d 70 72 65 63 69 73 69 6f 6e 26 30 78  idx=precision&0x
45a0: 66 66 66 2c 20 72 6f 75 6e 64 65 72 3d 30 2e 35  fff, rounder=0.5
45b0: 3b 20 69 64 78 3e 30 3b 20 69 64 78 2d 2d 2c 20  ; idx>0; idx--, 
45c0: 72 6f 75 6e 64 65 72 2a 3d 30 2e 31 29 7b 7d 0a  rounder*=0.1){}.
45d0: 20 20 20 20 20 20 20 20 69 66 28 20 78 74 79 70          if( xtyp
45e0: 65 3d 3d 65 74 46 4c 4f 41 54 20 29 20 72 65 61  e==etFLOAT ) rea
45f0: 6c 76 61 6c 75 65 20 2b 3d 20 72 6f 75 6e 64 65  lvalue += rounde
4600: 72 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  r;.        /* No
4610: 72 6d 61 6c 69 7a 65 20 72 65 61 6c 76 61 6c 75  rmalize realvalu
4620: 65 20 74 6f 20 77 69 74 68 69 6e 20 31 30 2e 30  e to within 10.0
4630: 20 3e 20 72 65 61 6c 76 61 6c 75 65 20 3e 3d 20   > realvalue >= 
4640: 31 2e 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 65  1.0 */.        e
4650: 78 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xp = 0;.        
4660: 69 66 28 20 73 71 6c 69 74 65 33 49 73 4e 61 4e  if( sqlite3IsNaN
4670: 28 28 64 6f 75 62 6c 65 29 72 65 61 6c 76 61 6c  ((double)realval
4680: 75 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ue) ){.         
4690: 20 62 75 66 70 74 20 3d 20 22 4e 61 4e 22 3b 0a   bufpt = "NaN";.
46a0: 20 20 20 20 20 20 20 20 20 20 6c 65 6e 67 74 68            length
46b0: 20 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20   = 3;.          
46c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
46d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 61  .        if( rea
46e0: 6c 76 61 6c 75 65 3e 30 2e 30 20 29 7b 0a 20 20  lvalue>0.0 ){.  
46f0: 20 20 20 20 20 20 20 20 4c 4f 4e 47 44 4f 55 42          LONGDOUB
4700: 4c 45 5f 54 59 50 45 20 73 63 61 6c 65 20 3d 20  LE_TYPE scale = 
4710: 31 2e 30 3b 0a 20 20 20 20 20 20 20 20 20 20 77  1.0;.          w
4720: 68 69 6c 65 28 20 72 65 61 6c 76 61 6c 75 65 3e  hile( realvalue>
4730: 3d 31 65 31 30 30 2a 73 63 61 6c 65 20 26 26 20  =1e100*scale && 
4740: 65 78 70 3c 3d 33 35 30 20 29 7b 20 73 63 61 6c  exp<=350 ){ scal
4750: 65 20 2a 3d 20 31 65 31 30 30 3b 65 78 70 2b 3d  e *= 1e100;exp+=
4760: 31 30 30 3b 7d 0a 20 20 20 20 20 20 20 20 20 20  100;}.          
4770: 77 68 69 6c 65 28 20 72 65 61 6c 76 61 6c 75 65  while( realvalue
4780: 3e 3d 31 65 31 30 2a 73 63 61 6c 65 20 26 26 20  >=1e10*scale && 
4790: 65 78 70 3c 3d 33 35 30 20 29 7b 20 73 63 61 6c  exp<=350 ){ scal
47a0: 65 20 2a 3d 20 31 65 31 30 3b 20 65 78 70 2b 3d  e *= 1e10; exp+=
47b0: 31 30 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20  10; }.          
47c0: 77 68 69 6c 65 28 20 72 65 61 6c 76 61 6c 75 65  while( realvalue
47d0: 3e 3d 31 30 2e 30 2a 73 63 61 6c 65 20 26 26 20  >=10.0*scale && 
47e0: 65 78 70 3c 3d 33 35 30 20 29 7b 20 73 63 61 6c  exp<=350 ){ scal
47f0: 65 20 2a 3d 20 31 30 2e 30 3b 20 65 78 70 2b 2b  e *= 10.0; exp++
4800: 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 65  ; }.          re
4810: 61 6c 76 61 6c 75 65 20 2f 3d 20 73 63 61 6c 65  alvalue /= scale
4820: 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  ;.          whil
4830: 65 28 20 72 65 61 6c 76 61 6c 75 65 3c 31 65 2d  e( realvalue<1e-
4840: 38 20 29 7b 20 72 65 61 6c 76 61 6c 75 65 20 2a  8 ){ realvalue *
4850: 3d 20 31 65 38 3b 20 65 78 70 2d 3d 38 3b 20 7d  = 1e8; exp-=8; }
4860: 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
4870: 28 20 72 65 61 6c 76 61 6c 75 65 3c 31 2e 30 20  ( realvalue<1.0 
4880: 29 7b 20 72 65 61 6c 76 61 6c 75 65 20 2a 3d 20  ){ realvalue *= 
4890: 31 30 2e 30 3b 20 65 78 70 2d 2d 3b 20 7d 0a 20  10.0; exp--; }. 
48a0: 20 20 20 20 20 20 20 20 20 69 66 28 20 65 78 70           if( exp
48b0: 3e 33 35 30 20 29 7b 0a 20 20 20 20 20 20 20 20  >350 ){.        
48c0: 20 20 20 20 62 75 66 70 74 20 3d 20 62 75 66 3b      bufpt = buf;
48d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 75 66  .            buf
48e0: 5b 30 5d 20 3d 20 70 72 65 66 69 78 3b 0a 20 20  [0] = prefix;.  
48f0: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
4900: 28 62 75 66 2b 28 70 72 65 66 69 78 21 3d 30 29  (buf+(prefix!=0)
4910: 2c 22 49 6e 66 22 2c 34 29 3b 0a 20 20 20 20 20  ,"Inf",4);.     
4920: 20 20 20 20 20 20 20 6c 65 6e 67 74 68 20 3d 20         length = 
4930: 33 2b 28 70 72 65 66 69 78 21 3d 30 29 3b 0a 20  3+(prefix!=0);. 
4940: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
4950: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
4960: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4970: 62 75 66 70 74 20 3d 20 62 75 66 3b 0a 20 20 20  bufpt = buf;.   
4980: 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 20       /*.        
4990: 2a 2a 20 49 66 20 74 68 65 20 66 69 65 6c 64 20  ** If the field 
49a0: 74 79 70 65 20 69 73 20 65 74 47 45 4e 45 52 49  type is etGENERI
49b0: 43 2c 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20  C, then convert 
49c0: 74 6f 20 65 69 74 68 65 72 20 65 74 45 58 50 0a  to either etEXP.
49d0: 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 65 74          ** or et
49e0: 46 4c 4f 41 54 2c 20 61 73 20 61 70 70 72 6f 70  FLOAT, as approp
49f0: 72 69 61 74 65 2e 0a 20 20 20 20 20 20 20 20 2a  riate..        *
4a00: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 74  /.        if( xt
4a10: 79 70 65 21 3d 65 74 46 4c 4f 41 54 20 29 7b 0a  ype!=etFLOAT ){.
4a20: 20 20 20 20 20 20 20 20 20 20 72 65 61 6c 76 61            realva
4a30: 6c 75 65 20 2b 3d 20 72 6f 75 6e 64 65 72 3b 0a  lue += rounder;.
4a40: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65            if( re
4a50: 61 6c 76 61 6c 75 65 3e 3d 31 30 2e 30 20 29 7b  alvalue>=10.0 ){
4a60: 20 72 65 61 6c 76 61 6c 75 65 20 2a 3d 20 30 2e   realvalue *= 0.
4a70: 31 3b 20 65 78 70 2b 2b 3b 20 7d 0a 20 20 20 20  1; exp++; }.    
4a80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
4a90: 28 20 78 74 79 70 65 3d 3d 65 74 47 45 4e 45 52  ( xtype==etGENER
4aa0: 49 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  IC ){.          
4ab0: 66 6c 61 67 5f 72 74 7a 20 3d 20 21 66 6c 61 67  flag_rtz = !flag
4ac0: 5f 61 6c 74 65 72 6e 61 74 65 66 6f 72 6d 3b 0a  _alternateform;.
4ad0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 78            if( ex
4ae0: 70 3c 2d 34 20 7c 7c 20 65 78 70 3e 70 72 65 63  p<-4 || exp>prec
4af0: 69 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ision ){.       
4b00: 20 20 20 20 20 78 74 79 70 65 20 3d 20 65 74 45       xtype = etE
4b10: 58 50 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  XP;.          }e
4b20: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
4b30: 20 70 72 65 63 69 73 69 6f 6e 20 3d 20 70 72 65   precision = pre
4b40: 63 69 73 69 6f 6e 20 2d 20 65 78 70 3b 0a 20 20  cision - exp;.  
4b50: 20 20 20 20 20 20 20 20 20 20 78 74 79 70 65 20            xtype 
4b60: 3d 20 65 74 46 4c 4f 41 54 3b 0a 20 20 20 20 20  = etFLOAT;.     
4b70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
4b80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
4b90: 66 6c 61 67 5f 72 74 7a 20 3d 20 66 6c 61 67 5f  flag_rtz = flag_
4ba0: 61 6c 74 66 6f 72 6d 32 3b 0a 20 20 20 20 20 20  altform2;.      
4bb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
4bc0: 78 74 79 70 65 3d 3d 65 74 45 58 50 20 29 7b 0a  xtype==etEXP ){.
4bd0: 20 20 20 20 20 20 20 20 20 20 65 32 20 3d 20 30            e2 = 0
4be0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
4bf0: 0a 20 20 20 20 20 20 20 20 20 20 65 32 20 3d 20  .          e2 = 
4c00: 65 78 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  exp;.        }. 
4c10: 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
4c20: 20 20 20 69 36 34 20 73 7a 42 75 66 4e 65 65 64     i64 szBufNeed
4c30: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ed;           /*
4c40: 20 53 69 7a 65 20 6f 66 20 61 20 74 65 6d 70 6f   Size of a tempo
4c50: 72 61 72 79 20 62 75 66 66 65 72 20 6e 65 65 64  rary buffer need
4c60: 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ed */.          
4c70: 73 7a 42 75 66 4e 65 65 64 65 64 20 3d 20 4d 41  szBufNeeded = MA
4c80: 58 28 65 32 2c 30 29 2b 28 69 36 34 29 70 72 65  X(e2,0)+(i64)pre
4c90: 63 69 73 69 6f 6e 2b 28 69 36 34 29 77 69 64 74  cision+(i64)widt
4ca0: 68 2b 31 35 3b 0a 20 20 20 20 20 20 20 20 20 20  h+15;.          
4cb0: 69 66 28 20 73 7a 42 75 66 4e 65 65 64 65 64 20  if( szBufNeeded 
4cc0: 3e 20 65 74 42 55 46 53 49 5a 45 20 29 7b 0a 20  > etBUFSIZE ){. 
4cd0: 20 20 20 20 20 20 20 20 20 20 20 62 75 66 70 74             bufpt
4ce0: 20 3d 20 7a 45 78 74 72 61 20 3d 20 70 72 69 6e   = zExtra = prin
4cf0: 74 66 54 65 6d 70 42 75 66 28 70 41 63 63 75 6d  tfTempBuf(pAccum
4d00: 2c 20 73 7a 42 75 66 4e 65 65 64 65 64 29 3b 0a  , szBufNeeded);.
4d10: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
4d20: 62 75 66 70 74 3d 3d 30 20 29 20 72 65 74 75 72  bufpt==0 ) retur
4d30: 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  n;.          }. 
4d40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4d50: 20 7a 4f 75 74 20 3d 20 62 75 66 70 74 3b 0a 20   zOut = bufpt;. 
4d60: 20 20 20 20 20 20 20 6e 73 64 20 3d 20 31 36 20         nsd = 16 
4d70: 2b 20 66 6c 61 67 5f 61 6c 74 66 6f 72 6d 32 2a  + flag_altform2*
4d80: 31 30 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67  10;.        flag
4d90: 5f 64 70 20 3d 20 28 70 72 65 63 69 73 69 6f 6e  _dp = (precision
4da0: 3e 30 20 3f 31 3a 30 29 20 7c 20 66 6c 61 67 5f  >0 ?1:0) | flag_
4db0: 61 6c 74 65 72 6e 61 74 65 66 6f 72 6d 20 7c 20  alternateform | 
4dc0: 66 6c 61 67 5f 61 6c 74 66 6f 72 6d 32 3b 0a 20  flag_altform2;. 
4dd0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 69         /* The si
4de0: 67 6e 20 69 6e 20 66 72 6f 6e 74 20 6f 66 20 74  gn in front of t
4df0: 68 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20  he number */.   
4e00: 20 20 20 20 20 69 66 28 20 70 72 65 66 69 78 20       if( prefix 
4e10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 62  ){.          *(b
4e20: 75 66 70 74 2b 2b 29 20 3d 20 70 72 65 66 69 78  ufpt++) = prefix
4e30: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4e40: 20 20 20 20 2f 2a 20 44 69 67 69 74 73 20 70 72      /* Digits pr
4e50: 69 6f 72 20 74 6f 20 74 68 65 20 64 65 63 69 6d  ior to the decim
4e60: 61 6c 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20  al point */.    
4e70: 20 20 20 20 69 66 28 20 65 32 3c 30 20 29 7b 0a      if( e2<0 ){.
4e80: 20 20 20 20 20 20 20 20 20 20 2a 28 62 75 66 70            *(bufp
4e90: 74 2b 2b 29 20 3d 20 27 30 27 3b 0a 20 20 20 20  t++) = '0';.    
4ea0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4eb0: 20 20 20 20 20 66 6f 72 28 3b 20 65 32 3e 3d 30       for(; e2>=0
4ec0: 3b 20 65 32 2d 2d 29 7b 0a 20 20 20 20 20 20 20  ; e2--){.       
4ed0: 20 20 20 20 20 2a 28 62 75 66 70 74 2b 2b 29 20       *(bufpt++) 
4ee0: 3d 20 65 74 5f 67 65 74 64 69 67 69 74 28 26 72  = et_getdigit(&r
4ef0: 65 61 6c 76 61 6c 75 65 2c 26 6e 73 64 29 3b 0a  ealvalue,&nsd);.
4f00: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
4f10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
4f20: 20 54 68 65 20 64 65 63 69 6d 61 6c 20 70 6f 69   The decimal poi
4f30: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  nt */.        if
4f40: 28 20 66 6c 61 67 5f 64 70 20 29 7b 0a 20 20 20  ( flag_dp ){.   
4f50: 20 20 20 20 20 20 20 2a 28 62 75 66 70 74 2b 2b         *(bufpt++
4f60: 29 20 3d 20 27 2e 27 3b 0a 20 20 20 20 20 20 20  ) = '.';.       
4f70: 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 30   }.        /* "0
4f80: 22 20 64 69 67 69 74 73 20 61 66 74 65 72 20 74  " digits after t
4f90: 68 65 20 64 65 63 69 6d 61 6c 20 70 6f 69 6e 74  he decimal point
4fa0: 20 62 75 74 20 62 65 66 6f 72 65 20 74 68 65 20   but before the 
4fb0: 66 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a  first.        **
4fc0: 20 73 69 67 6e 69 66 69 63 61 6e 74 20 64 69 67   significant dig
4fd0: 69 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  it of the number
4fe0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
4ff0: 65 32 2b 2b 3b 20 65 32 3c 30 3b 20 70 72 65 63  e2++; e2<0; prec
5000: 69 73 69 6f 6e 2d 2d 2c 20 65 32 2b 2b 29 7b 0a  ision--, e2++){.
5010: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
5020: 28 20 70 72 65 63 69 73 69 6f 6e 3e 30 20 29 3b  ( precision>0 );
5030: 0a 20 20 20 20 20 20 20 20 20 20 2a 28 62 75 66  .          *(buf
5040: 70 74 2b 2b 29 20 3d 20 27 30 27 3b 0a 20 20 20  pt++) = '0';.   
5050: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
5060: 2a 20 53 69 67 6e 69 66 69 63 61 6e 74 20 64 69  * Significant di
5070: 67 69 74 73 20 61 66 74 65 72 20 74 68 65 20 64  gits after the d
5080: 65 63 69 6d 61 6c 20 70 6f 69 6e 74 20 2a 2f 0a  ecimal point */.
5090: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28          while( (
50a0: 70 72 65 63 69 73 69 6f 6e 2d 2d 29 3e 30 20 29  precision--)>0 )
50b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 62 75  {.          *(bu
50c0: 66 70 74 2b 2b 29 20 3d 20 65 74 5f 67 65 74 64  fpt++) = et_getd
50d0: 69 67 69 74 28 26 72 65 61 6c 76 61 6c 75 65 2c  igit(&realvalue,
50e0: 26 6e 73 64 29 3b 0a 20 20 20 20 20 20 20 20 7d  &nsd);.        }
50f0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f  .        /* Remo
5100: 76 65 20 74 72 61 69 6c 69 6e 67 20 7a 65 72 6f  ve trailing zero
5110: 73 20 61 6e 64 20 74 68 65 20 22 2e 22 20 69 66  s and the "." if
5120: 20 6e 6f 20 64 69 67 69 74 73 20 66 6f 6c 6c 6f   no digits follo
5130: 77 20 74 68 65 20 22 2e 22 20 2a 2f 0a 20 20 20  w the "." */.   
5140: 20 20 20 20 20 69 66 28 20 66 6c 61 67 5f 72 74       if( flag_rt
5150: 7a 20 26 26 20 66 6c 61 67 5f 64 70 20 29 7b 0a  z && flag_dp ){.
5160: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
5170: 20 62 75 66 70 74 5b 2d 31 5d 3d 3d 27 30 27 20   bufpt[-1]=='0' 
5180: 29 20 2a 28 2d 2d 62 75 66 70 74 29 20 3d 20 30  ) *(--bufpt) = 0
5190: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
51a0: 72 74 28 20 62 75 66 70 74 3e 7a 4f 75 74 20 29  rt( bufpt>zOut )
51b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
51c0: 62 75 66 70 74 5b 2d 31 5d 3d 3d 27 2e 27 20 29  bufpt[-1]=='.' )
51d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
51e0: 28 20 66 6c 61 67 5f 61 6c 74 66 6f 72 6d 32 20  ( flag_altform2 
51f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
5200: 20 2a 28 62 75 66 70 74 2b 2b 29 20 3d 20 27 30   *(bufpt++) = '0
5210: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ';.            }
5220: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
5230: 20 20 20 20 2a 28 2d 2d 62 75 66 70 74 29 20 3d      *(--bufpt) =
5240: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
5250: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
5260: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5270: 2f 2a 20 41 64 64 20 74 68 65 20 22 65 4e 4e 4e  /* Add the "eNNN
5280: 22 20 73 75 66 66 69 78 20 2a 2f 0a 20 20 20 20  " suffix */.    
5290: 20 20 20 20 69 66 28 20 78 74 79 70 65 3d 3d 65      if( xtype==e
52a0: 74 45 58 50 20 29 7b 0a 20 20 20 20 20 20 20 20  tEXP ){.        
52b0: 20 20 2a 28 62 75 66 70 74 2b 2b 29 20 3d 20 61    *(bufpt++) = a
52c0: 44 69 67 69 74 73 5b 69 6e 66 6f 70 2d 3e 63 68  Digits[infop->ch
52d0: 61 72 73 65 74 5d 3b 0a 20 20 20 20 20 20 20 20  arset];.        
52e0: 20 20 69 66 28 20 65 78 70 3c 30 20 29 7b 0a 20    if( exp<0 ){. 
52f0: 20 20 20 20 20 20 20 20 20 20 20 2a 28 62 75 66             *(buf
5300: 70 74 2b 2b 29 20 3d 20 27 2d 27 3b 20 65 78 70  pt++) = '-'; exp
5310: 20 3d 20 2d 65 78 70 3b 0a 20 20 20 20 20 20 20   = -exp;.       
5320: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5330: 20 20 20 20 20 20 2a 28 62 75 66 70 74 2b 2b 29        *(bufpt++)
5340: 20 3d 20 27 2b 27 3b 0a 20 20 20 20 20 20 20 20   = '+';.        
5350: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
5360: 28 20 65 78 70 3e 3d 31 30 30 20 29 7b 0a 20 20  ( exp>=100 ){.  
5370: 20 20 20 20 20 20 20 20 20 20 2a 28 62 75 66 70            *(bufp
5380: 74 2b 2b 29 20 3d 20 28 63 68 61 72 29 28 28 65  t++) = (char)((e
5390: 78 70 2f 31 30 30 29 2b 27 30 27 29 3b 20 20 20  xp/100)+'0');   
53a0: 20 20 20 20 20 2f 2a 20 31 30 30 27 73 20 64 69       /* 100's di
53b0: 67 69 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  git */.         
53c0: 20 20 20 65 78 70 20 25 3d 20 31 30 30 3b 0a 20     exp %= 100;. 
53d0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
53e0: 20 20 20 20 20 2a 28 62 75 66 70 74 2b 2b 29 20       *(bufpt++) 
53f0: 3d 20 28 63 68 61 72 29 28 65 78 70 2f 31 30 2b  = (char)(exp/10+
5400: 27 30 27 29 3b 20 20 20 20 20 20 20 20 20 20 20  '0');           
5410: 20 20 2f 2a 20 31 30 27 73 20 64 69 67 69 74 20    /* 10's digit 
5420: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 2a 28 62  */.          *(b
5430: 75 66 70 74 2b 2b 29 20 3d 20 28 63 68 61 72 29  ufpt++) = (char)
5440: 28 65 78 70 25 31 30 2b 27 30 27 29 3b 20 20 20  (exp%10+'0');   
5450: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 27 73            /* 1's
5460: 20 64 69 67 69 74 20 2a 2f 0a 20 20 20 20 20 20   digit */.      
5470: 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 62 75 66    }.        *buf
5480: 70 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20  pt = 0;..       
5490: 20 2f 2a 20 54 68 65 20 63 6f 6e 76 65 72 74 65   /* The converte
54a0: 64 20 6e 75 6d 62 65 72 20 69 73 20 69 6e 20 62  d number is in b
54b0: 75 66 5b 5d 20 61 6e 64 20 7a 65 72 6f 20 74 65  uf[] and zero te
54c0: 72 6d 69 6e 61 74 65 64 2e 20 4f 75 74 70 75 74  rminated. Output
54d0: 20 69 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20   it..        ** 
54e0: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6e 75  Note that the nu
54f0: 6d 62 65 72 20 69 73 20 69 6e 20 74 68 65 20 75  mber is in the u
5500: 73 75 61 6c 20 6f 72 64 65 72 2c 20 6e 6f 74 20  sual order, not 
5510: 72 65 76 65 72 73 65 64 20 61 73 20 77 69 74 68  reversed as with
5520: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65  .        ** inte
5530: 67 65 72 20 63 6f 6e 76 65 72 73 69 6f 6e 73 2e  ger conversions.
5540: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c 65 6e 67   */.        leng
5550: 74 68 20 3d 20 28 69 6e 74 29 28 62 75 66 70 74  th = (int)(bufpt
5560: 2d 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  -zOut);.        
5570: 62 75 66 70 74 20 3d 20 7a 4f 75 74 3b 0a 0a 20  bufpt = zOut;.. 
5580: 20 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69 61         /* Specia
5590: 6c 20 63 61 73 65 3a 20 20 41 64 64 20 6c 65 61  l case:  Add lea
55a0: 64 69 6e 67 20 7a 65 72 6f 73 20 69 66 20 74 68  ding zeros if th
55b0: 65 20 66 6c 61 67 5f 7a 65 72 6f 70 61 64 20 66  e flag_zeropad f
55c0: 6c 61 67 20 69 73 0a 20 20 20 20 20 20 20 20 2a  lag is.        *
55d0: 2a 20 73 65 74 20 61 6e 64 20 77 65 20 61 72 65  * set and we are
55e0: 20 6e 6f 74 20 6c 65 66 74 20 6a 75 73 74 69 66   not left justif
55f0: 69 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ied */.        i
5600: 66 28 20 66 6c 61 67 5f 7a 65 72 6f 70 61 64 20  f( flag_zeropad 
5610: 26 26 20 21 66 6c 61 67 5f 6c 65 66 74 6a 75 73  && !flag_leftjus
5620: 74 69 66 79 20 26 26 20 6c 65 6e 67 74 68 20 3c  tify && length <
5630: 20 77 69 64 74 68 29 7b 0a 20 20 20 20 20 20 20   width){.       
5640: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
5650: 20 20 20 20 69 6e 74 20 6e 50 61 64 20 3d 20 77      int nPad = w
5660: 69 64 74 68 20 2d 20 6c 65 6e 67 74 68 3b 0a 20  idth - length;. 
5670: 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 77           for(i=w
5680: 69 64 74 68 3b 20 69 3e 3d 6e 50 61 64 3b 20 69  idth; i>=nPad; i
5690: 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  --){.           
56a0: 20 62 75 66 70 74 5b 69 5d 20 3d 20 62 75 66 70   bufpt[i] = bufp
56b0: 74 5b 69 2d 6e 50 61 64 5d 3b 0a 20 20 20 20 20  t[i-nPad];.     
56c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
56d0: 20 69 20 3d 20 70 72 65 66 69 78 21 3d 30 3b 0a   i = prefix!=0;.
56e0: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
56f0: 20 6e 50 61 64 2d 2d 20 29 20 62 75 66 70 74 5b   nPad-- ) bufpt[
5700: 69 2b 2b 5d 20 3d 20 27 30 27 3b 0a 20 20 20 20  i++] = '0';.    
5710: 20 20 20 20 20 20 6c 65 6e 67 74 68 20 3d 20 77        length = w
5720: 69 64 74 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a  idth;.        }.
5730: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
5740: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
5750: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 20 2a  LOATING_POINT) *
5760: 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
5770: 0a 20 20 20 20 20 20 63 61 73 65 20 65 74 53 49  .      case etSI
5780: 5a 45 3a 0a 20 20 20 20 20 20 20 20 69 66 28 20  ZE:.        if( 
5790: 21 62 41 72 67 4c 69 73 74 20 29 7b 0a 20 20 20  !bArgList ){.   
57a0: 20 20 20 20 20 20 20 2a 28 76 61 5f 61 72 67 28         *(va_arg(
57b0: 61 70 2c 69 6e 74 2a 29 29 20 3d 20 70 41 63 63  ap,int*)) = pAcc
57c0: 75 6d 2d 3e 6e 43 68 61 72 3b 0a 20 20 20 20 20  um->nChar;.     
57d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 65 6e     }.        len
57e0: 67 74 68 20 3d 20 77 69 64 74 68 20 3d 20 30 3b  gth = width = 0;
57f0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
5800: 20 20 20 20 20 20 63 61 73 65 20 65 74 50 45 52        case etPER
5810: 43 45 4e 54 3a 0a 20 20 20 20 20 20 20 20 62 75  CENT:.        bu
5820: 66 5b 30 5d 20 3d 20 27 25 27 3b 0a 20 20 20 20  f[0] = '%';.    
5830: 20 20 20 20 62 75 66 70 74 20 3d 20 62 75 66 3b      bufpt = buf;
5840: 0a 20 20 20 20 20 20 20 20 6c 65 6e 67 74 68 20  .        length 
5850: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 1;.        bre
5860: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 65  ak;.      case e
5870: 74 43 48 41 52 58 3a 0a 20 20 20 20 20 20 20 20  tCHARX:.        
5880: 69 66 28 20 62 41 72 67 4c 69 73 74 20 29 7b 0a  if( bArgList ){.
5890: 20 20 20 20 20 20 20 20 20 20 62 75 66 70 74 20            bufpt 
58a0: 3d 20 67 65 74 54 65 78 74 41 72 67 28 70 41 72  = getTextArg(pAr
58b0: 67 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  gList);.        
58c0: 20 20 6c 65 6e 67 74 68 20 3d 20 31 3b 0a 20 20    length = 1;.  
58d0: 20 20 20 20 20 20 20 20 69 66 28 20 62 75 66 70          if( bufp
58e0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
58f0: 20 62 75 66 5b 30 5d 20 3d 20 63 20 3d 20 2a 28   buf[0] = c = *(
5900: 62 75 66 70 74 2b 2b 29 3b 0a 20 20 20 20 20 20  bufpt++);.      
5910: 20 20 20 20 20 20 69 66 28 20 28 63 26 30 78 63        if( (c&0xc
5920: 30 29 3d 3d 30 78 63 30 20 29 7b 0a 20 20 20 20  0)==0xc0 ){.    
5930: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
5940: 20 6c 65 6e 67 74 68 3c 34 20 26 26 20 28 62 75   length<4 && (bu
5950: 66 70 74 5b 30 5d 26 30 78 63 30 29 3d 3d 30 78  fpt[0]&0xc0)==0x
5960: 38 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  80 ){.          
5970: 20 20 20 20 20 20 62 75 66 5b 6c 65 6e 67 74 68        buf[length
5980: 2b 2b 5d 20 3d 20 2a 28 62 75 66 70 74 2b 2b 29  ++] = *(bufpt++)
5990: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
59a0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
59b0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
59c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 75 66  .            buf
59d0: 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  [0] = 0;.       
59e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
59f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75 6e  se{.          un
5a00: 73 69 67 6e 65 64 20 69 6e 74 20 63 68 20 3d 20  signed int ch = 
5a10: 76 61 5f 61 72 67 28 61 70 2c 75 6e 73 69 67 6e  va_arg(ap,unsign
5a20: 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  ed int);.       
5a30: 20 20 20 69 66 28 20 63 68 3c 30 78 30 30 30 38     if( ch<0x0008
5a40: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
5a50: 20 62 75 66 5b 30 5d 20 3d 20 63 68 20 26 20 30   buf[0] = ch & 0
5a60: 78 66 66 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xff;.           
5a70: 20 6c 65 6e 67 74 68 20 3d 20 31 3b 0a 20 20 20   length = 1;.   
5a80: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
5a90: 20 63 68 3c 30 78 30 30 38 30 30 20 29 7b 0a 20   ch<0x00800 ){. 
5aa0: 20 20 20 20 20 20 20 20 20 20 20 62 75 66 5b 30             buf[0
5ab0: 5d 20 3d 20 30 78 63 30 20 2b 20 28 75 38 29 28  ] = 0xc0 + (u8)(
5ac0: 28 63 68 3e 3e 36 29 26 30 78 31 66 29 3b 0a 20  (ch>>6)&0x1f);. 
5ad0: 20 20 20 20 20 20 20 20 20 20 20 62 75 66 5b 31             buf[1
5ae0: 5d 20 3d 20 30 78 38 30 20 2b 20 28 75 38 29 28  ] = 0x80 + (u8)(
5af0: 63 68 20 26 20 30 78 33 66 29 3b 0a 20 20 20 20  ch & 0x3f);.    
5b00: 20 20 20 20 20 20 20 20 6c 65 6e 67 74 68 20 3d          length =
5b10: 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   2;.          }e
5b20: 6c 73 65 20 69 66 28 20 63 68 3c 30 78 31 30 30  lse if( ch<0x100
5b30: 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  00 ){.          
5b40: 20 20 62 75 66 5b 30 5d 20 3d 20 30 78 65 30 20    buf[0] = 0xe0 
5b50: 2b 20 28 75 38 29 28 28 63 68 3e 3e 31 32 29 26  + (u8)((ch>>12)&
5b60: 30 78 30 66 29 3b 0a 20 20 20 20 20 20 20 20 20  0x0f);.         
5b70: 20 20 20 62 75 66 5b 31 5d 20 3d 20 30 78 38 30     buf[1] = 0x80
5b80: 20 2b 20 28 75 38 29 28 28 63 68 3e 3e 36 29 20   + (u8)((ch>>6) 
5b90: 26 20 30 78 33 66 29 3b 0a 20 20 20 20 20 20 20  & 0x3f);.       
5ba0: 20 20 20 20 20 62 75 66 5b 32 5d 20 3d 20 30 78       buf[2] = 0x
5bb0: 38 30 20 2b 20 28 75 38 29 28 63 68 20 26 20 30  80 + (u8)(ch & 0
5bc0: 78 33 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  x3f);.          
5bd0: 20 20 6c 65 6e 67 74 68 20 3d 20 33 3b 0a 20 20    length = 3;.  
5be0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
5bf0: 20 20 20 20 20 20 20 20 20 20 20 62 75 66 5b 30             buf[0
5c00: 5d 20 3d 20 30 78 66 30 20 2b 20 28 75 38 29 28  ] = 0xf0 + (u8)(
5c10: 28 63 68 3e 3e 31 38 29 20 26 20 30 78 30 37 29  (ch>>18) & 0x07)
5c20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 75  ;.            bu
5c30: 66 5b 31 5d 20 3d 20 30 78 38 30 20 2b 20 28 75  f[1] = 0x80 + (u
5c40: 38 29 28 28 63 68 3e 3e 31 32 29 20 26 20 30 78  8)((ch>>12) & 0x
5c50: 33 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  3f);.           
5c60: 20 62 75 66 5b 32 5d 20 3d 20 30 78 38 30 20 2b   buf[2] = 0x80 +
5c70: 20 28 75 38 29 28 28 63 68 3e 3e 36 29 20 26 20   (u8)((ch>>6) & 
5c80: 30 78 33 66 29 3b 0a 20 20 20 20 20 20 20 20 20  0x3f);.         
5c90: 20 20 20 62 75 66 5b 33 5d 20 3d 20 30 78 38 30     buf[3] = 0x80
5ca0: 20 2b 20 28 75 38 29 28 63 68 20 26 20 30 78 33   + (u8)(ch & 0x3
5cb0: 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  f);.            
5cc0: 6c 65 6e 67 74 68 20 3d 20 34 3b 0a 20 20 20 20  length = 4;.    
5cd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5ce0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 72  }.        if( pr
5cf0: 65 63 69 73 69 6f 6e 3e 31 20 29 7b 0a 20 20 20  ecision>1 ){.   
5d00: 20 20 20 20 20 20 20 77 69 64 74 68 20 2d 3d 20         width -= 
5d10: 70 72 65 63 69 73 69 6f 6e 2d 31 3b 0a 20 20 20  precision-1;.   
5d20: 20 20 20 20 20 20 20 69 66 28 20 77 69 64 74 68         if( width
5d30: 3e 31 20 26 26 20 21 66 6c 61 67 5f 6c 65 66 74  >1 && !flag_left
5d40: 6a 75 73 74 69 66 79 20 29 7b 0a 20 20 20 20 20  justify ){.     
5d50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
5d60: 74 72 5f 61 70 70 65 6e 64 63 68 61 72 28 70 41  tr_appendchar(pA
5d70: 63 63 75 6d 2c 20 77 69 64 74 68 2d 31 2c 20 27  ccum, width-1, '
5d80: 20 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   ');.           
5d90: 20 77 69 64 74 68 20 3d 20 30 3b 0a 20 20 20 20   width = 0;.    
5da0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5db0: 20 20 77 68 69 6c 65 28 20 70 72 65 63 69 73 69    while( precisi
5dc0: 6f 6e 2d 2d 20 3e 20 31 20 29 7b 0a 20 20 20 20  on-- > 1 ){.    
5dd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
5de0: 73 74 72 5f 61 70 70 65 6e 64 28 70 41 63 63 75  str_append(pAccu
5df0: 6d 2c 20 62 75 66 2c 20 6c 65 6e 67 74 68 29 3b  m, buf, length);
5e00: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
5e10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
5e20: 75 66 70 74 20 3d 20 62 75 66 3b 0a 20 20 20 20  ufpt = buf;.    
5e30: 20 20 20 20 66 6c 61 67 5f 61 6c 74 66 6f 72 6d      flag_altform
5e40: 32 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67  2 = 1;.        g
5e50: 6f 74 6f 20 61 64 6a 75 73 74 5f 77 69 64 74 68  oto adjust_width
5e60: 5f 66 6f 72 5f 75 74 66 38 3b 0a 20 20 20 20 20  _for_utf8;.     
5e70: 20 63 61 73 65 20 65 74 53 54 52 49 4e 47 3a 0a   case etSTRING:.
5e80: 20 20 20 20 20 20 63 61 73 65 20 65 74 44 59 4e        case etDYN
5e90: 53 54 52 49 4e 47 3a 0a 20 20 20 20 20 20 20 20  STRING:.        
5ea0: 69 66 28 20 62 41 72 67 4c 69 73 74 20 29 7b 0a  if( bArgList ){.
5eb0: 20 20 20 20 20 20 20 20 20 20 62 75 66 70 74 20            bufpt 
5ec0: 3d 20 67 65 74 54 65 78 74 41 72 67 28 70 41 72  = getTextArg(pAr
5ed0: 67 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  gList);.        
5ee0: 20 20 78 74 79 70 65 20 3d 20 65 74 53 54 52 49    xtype = etSTRI
5ef0: 4e 47 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  NG;.        }els
5f00: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 62 75 66  e{.          buf
5f10: 70 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 63  pt = va_arg(ap,c
5f20: 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 20 20 7d  har*);.        }
5f30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 75 66  .        if( buf
5f40: 70 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  pt==0 ){.       
5f50: 20 20 20 62 75 66 70 74 20 3d 20 22 22 3b 0a 20     bufpt = "";. 
5f60: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
5f70: 20 78 74 79 70 65 3d 3d 65 74 44 59 4e 53 54 52   xtype==etDYNSTR
5f80: 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ING ){.         
5f90: 20 69 66 28 20 70 41 63 63 75 6d 2d 3e 6e 43 68   if( pAccum->nCh
5fa0: 61 72 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ar==0.          
5fb0: 20 26 26 20 70 41 63 63 75 6d 2d 3e 6d 78 41 6c   && pAccum->mxAl
5fc0: 6c 6f 63 0a 20 20 20 20 20 20 20 20 20 20 20 26  loc.           &
5fd0: 26 20 77 69 64 74 68 3d 3d 30 0a 20 20 20 20 20  & width==0.     
5fe0: 20 20 20 20 20 20 26 26 20 70 72 65 63 69 73 69        && precisi
5ff0: 6f 6e 3c 30 0a 20 20 20 20 20 20 20 20 20 20 20  on<0.           
6000: 26 26 20 70 41 63 63 75 6d 2d 3e 61 63 63 45 72  && pAccum->accEr
6010: 72 6f 72 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ror==0.         
6020: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6030: 2f 2a 20 53 70 65 63 69 61 6c 20 6f 70 74 69 6d  /* Special optim
6040: 69 7a 61 74 69 6f 6e 20 66 6f 72 20 73 71 6c 69  ization for sqli
6050: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 2e  te3_mprintf("%z.
6060: 2e 2e 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20  .."):.          
6070: 20 20 2a 2a 20 45 78 74 65 6e 64 20 61 6e 20 65    ** Extend an e
6080: 78 69 73 74 69 6e 67 20 6d 65 6d 6f 72 79 20 61  xisting memory a
6090: 6c 6c 6f 63 61 74 69 6f 6e 20 72 61 74 68 65 72  llocation rather
60a0: 20 74 68 61 6e 20 63 72 65 61 74 69 6e 67 0a 20   than creating. 
60b0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 20             ** a 
60c0: 6e 65 77 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20  new one. */.    
60d0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
60e0: 28 70 41 63 63 75 6d 2d 3e 70 72 69 6e 74 66 46  (pAccum->printfF
60f0: 6c 61 67 73 26 53 51 4c 49 54 45 5f 50 52 49 4e  lags&SQLITE_PRIN
6100: 54 46 5f 4d 41 4c 4c 4f 43 45 44 29 3d 3d 30 20  TF_MALLOCED)==0 
6110: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
6120: 41 63 63 75 6d 2d 3e 7a 54 65 78 74 20 3d 20 62  Accum->zText = b
6130: 75 66 70 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ufpt;.          
6140: 20 20 70 41 63 63 75 6d 2d 3e 6e 41 6c 6c 6f 63    pAccum->nAlloc
6150: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
6160: 6f 63 53 69 7a 65 28 70 41 63 63 75 6d 2d 3e 64  ocSize(pAccum->d
6170: 62 2c 20 62 75 66 70 74 29 3b 0a 20 20 20 20 20  b, bufpt);.     
6180: 20 20 20 20 20 20 20 70 41 63 63 75 6d 2d 3e 6e         pAccum->n
6190: 43 68 61 72 20 3d 20 30 78 37 66 66 66 66 66 66  Char = 0x7ffffff
61a0: 66 20 26 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  f & (int)strlen(
61b0: 62 75 66 70 74 29 3b 0a 20 20 20 20 20 20 20 20  bufpt);.        
61c0: 20 20 20 20 70 41 63 63 75 6d 2d 3e 70 72 69 6e      pAccum->prin
61d0: 74 66 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  tfFlags |= SQLIT
61e0: 45 5f 50 52 49 4e 54 46 5f 4d 41 4c 4c 4f 43 45  E_PRINTF_MALLOCE
61f0: 44 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  D;.            l
6200: 65 6e 67 74 68 20 3d 20 30 3b 0a 20 20 20 20 20  ength = 0;.     
6210: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
6220: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6230: 20 20 20 20 7a 45 78 74 72 61 20 3d 20 62 75 66      zExtra = buf
6240: 70 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  pt;.        }.  
6250: 20 20 20 20 20 20 69 66 28 20 70 72 65 63 69 73        if( precis
6260: 69 6f 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ion>=0 ){.      
6270: 20 20 20 20 69 66 28 20 66 6c 61 67 5f 61 6c 74      if( flag_alt
6280: 66 6f 72 6d 32 20 29 7b 0a 20 20 20 20 20 20 20  form2 ){.       
6290: 20 20 20 20 20 2f 2a 20 53 65 74 20 6c 65 6e 67       /* Set leng
62a0: 74 68 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  th to the number
62b0: 20 6f 66 20 62 79 74 65 73 20 6e 65 65 64 65 64   of bytes needed
62c0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 64 69 73   in order to dis
62d0: 70 6c 61 79 0a 20 20 20 20 20 20 20 20 20 20 20  play.           
62e0: 20 2a 2a 20 70 72 65 63 69 73 69 6f 6e 20 63 68   ** precision ch
62f0: 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 20 20  aracters */.    
6300: 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
6310: 20 63 68 61 72 20 2a 7a 20 3d 20 28 75 6e 73 69   char *z = (unsi
6320: 67 6e 65 64 20 63 68 61 72 2a 29 62 75 66 70 74  gned char*)bufpt
6330: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 68  ;.            wh
6340: 69 6c 65 28 20 70 72 65 63 69 73 69 6f 6e 2d 2d  ile( precision--
6350: 20 3e 20 30 20 26 26 20 7a 5b 30 5d 20 29 7b 0a   > 0 && z[0] ){.
6360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
6370: 4c 49 54 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a  LITE_SKIP_UTF8(z
6380: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
6390: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 6e  .            len
63a0: 67 74 68 20 3d 20 28 69 6e 74 29 28 7a 20 2d 20  gth = (int)(z - 
63b0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
63c0: 62 75 66 70 74 29 3b 0a 20 20 20 20 20 20 20 20  bufpt);.        
63d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
63e0: 20 20 20 20 20 66 6f 72 28 6c 65 6e 67 74 68 3d       for(length=
63f0: 30 3b 20 6c 65 6e 67 74 68 3c 70 72 65 63 69 73  0; length<precis
6400: 69 6f 6e 20 26 26 20 62 75 66 70 74 5b 6c 65 6e  ion && bufpt[len
6410: 67 74 68 5d 3b 20 6c 65 6e 67 74 68 2b 2b 29 7b  gth]; length++){
6420: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
6430: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6440: 20 20 20 20 20 20 20 6c 65 6e 67 74 68 20 3d 20         length = 
6450: 30 78 37 66 66 66 66 66 66 66 20 26 20 28 69 6e  0x7fffffff & (in
6460: 74 29 73 74 72 6c 65 6e 28 62 75 66 70 74 29 3b  t)strlen(bufpt);
6470: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6480: 20 61 64 6a 75 73 74 5f 77 69 64 74 68 5f 66 6f   adjust_width_fo
6490: 72 5f 75 74 66 38 3a 0a 20 20 20 20 20 20 20 20  r_utf8:.        
64a0: 69 66 28 20 66 6c 61 67 5f 61 6c 74 66 6f 72 6d  if( flag_altform
64b0: 32 20 26 26 20 77 69 64 74 68 3e 30 20 29 7b 0a  2 && width>0 ){.
64c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 6a            /* Adj
64d0: 75 73 74 20 77 69 64 74 68 20 74 6f 20 61 63 63  ust width to acc
64e0: 6f 75 6e 74 20 66 6f 72 20 65 78 74 72 61 20 62  ount for extra b
64f0: 79 74 65 73 20 69 6e 20 55 54 46 2d 38 20 63 68  ytes in UTF-8 ch
6500: 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 20 20  aracters */.    
6510: 20 20 20 20 20 20 69 6e 74 20 69 69 20 3d 20 6c        int ii = l
6520: 65 6e 67 74 68 20 2d 20 31 3b 0a 20 20 20 20 20  ength - 1;.     
6530: 20 20 20 20 20 77 68 69 6c 65 28 20 69 69 3e 3d       while( ii>=
6540: 30 20 29 20 69 66 28 20 28 62 75 66 70 74 5b 69  0 ) if( (bufpt[i
6550: 69 2d 2d 5d 20 26 20 30 78 63 30 29 3d 3d 30 78  i--] & 0xc0)==0x
6560: 38 30 20 29 20 77 69 64 74 68 2b 2b 3b 0a 20 20  80 ) width++;.  
6570: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6580: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
6590: 65 20 65 74 53 51 4c 45 53 43 41 50 45 3a 20 20  e etSQLESCAPE:  
65a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 25 71 3a 20           /* %q: 
65b0: 45 73 63 61 70 65 20 27 20 63 68 61 72 61 63 74  Escape ' charact
65c0: 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 63 61 73  ers */.      cas
65d0: 65 20 65 74 53 51 4c 45 53 43 41 50 45 32 3a 20  e etSQLESCAPE2: 
65e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 25 51 3a 20           /* %Q: 
65f0: 45 73 63 61 70 65 20 27 20 61 6e 64 20 65 6e 63  Escape ' and enc
6600: 6c 6f 73 65 20 69 6e 20 27 2e 2e 2e 27 20 2a 2f  lose in '...' */
6610: 0a 20 20 20 20 20 20 63 61 73 65 20 65 74 53 51  .      case etSQ
6620: 4c 45 53 43 41 50 45 33 3a 20 7b 20 20 20 20 20  LESCAPE3: {     
6630: 20 20 20 2f 2a 20 25 77 3a 20 45 73 63 61 70 65     /* %w: Escape
6640: 20 22 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f   " characters */
6650: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 2c 20  .        int i, 
6660: 6a 2c 20 6b 2c 20 6e 2c 20 69 73 6e 75 6c 6c 3b  j, k, n, isnull;
6670: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 65 65  .        int nee
6680: 64 51 75 6f 74 65 3b 0a 20 20 20 20 20 20 20 20  dQuote;.        
6690: 63 68 61 72 20 63 68 3b 0a 20 20 20 20 20 20 20  char ch;.       
66a0: 20 63 68 61 72 20 71 20 3d 20 28 28 78 74 79 70   char q = ((xtyp
66b0: 65 3d 3d 65 74 53 51 4c 45 53 43 41 50 45 33 29  e==etSQLESCAPE3)
66c0: 3f 27 22 27 3a 27 5c 27 27 29 3b 20 20 20 2f 2a  ?'"':'\'');   /*
66d0: 20 51 75 6f 74 65 20 63 68 61 72 61 63 74 65 72   Quote character
66e0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72   */.        char
66f0: 20 2a 65 73 63 61 72 67 3b 0a 0a 20 20 20 20 20   *escarg;..     
6700: 20 20 20 69 66 28 20 62 41 72 67 4c 69 73 74 20     if( bArgList 
6710: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65 73 63  ){.          esc
6720: 61 72 67 20 3d 20 67 65 74 54 65 78 74 41 72 67  arg = getTextArg
6730: 28 70 41 72 67 4c 69 73 74 29 3b 0a 20 20 20 20  (pArgList);.    
6740: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6750: 20 20 20 20 20 65 73 63 61 72 67 20 3d 20 76 61       escarg = va
6760: 5f 61 72 67 28 61 70 2c 63 68 61 72 2a 29 3b 0a  _arg(ap,char*);.
6770: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6780: 20 20 69 73 6e 75 6c 6c 20 3d 20 65 73 63 61 72    isnull = escar
6790: 67 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 69 66  g==0;.        if
67a0: 28 20 69 73 6e 75 6c 6c 20 29 20 65 73 63 61 72  ( isnull ) escar
67b0: 67 20 3d 20 28 78 74 79 70 65 3d 3d 65 74 53 51  g = (xtype==etSQ
67c0: 4c 45 53 43 41 50 45 32 20 3f 20 22 4e 55 4c 4c  LESCAPE2 ? "NULL
67d0: 22 20 3a 20 22 28 4e 55 4c 4c 29 22 29 3b 0a 20  " : "(NULL)");. 
67e0: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 25 71         /* For %q
67f0: 2c 20 25 51 2c 20 61 6e 64 20 25 77 2c 20 74 68  , %Q, and %w, th
6800: 65 20 70 72 65 63 69 73 69 6f 6e 20 69 73 20 74  e precision is t
6810: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
6820: 65 20 28 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a  e (or.        **
6830: 20 63 68 61 72 61 63 74 65 72 73 20 69 66 20 74   characters if t
6840: 68 65 20 21 20 66 6c 61 67 73 20 69 73 20 70 72  he ! flags is pr
6850: 65 73 65 6e 74 29 20 74 6f 20 75 73 65 20 66 72  esent) to use fr
6860: 6f 6d 20 74 68 65 20 69 6e 70 75 74 2e 0a 20 20  om the input..  
6870: 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65        ** Because
6880: 20 6f 66 20 74 68 65 20 65 78 74 72 61 20 71 75   of the extra qu
6890: 6f 74 69 6e 67 20 63 68 61 72 61 63 74 65 72 73  oting characters
68a0: 20 69 6e 73 65 72 74 65 64 2c 20 74 68 65 20 6e   inserted, the n
68b0: 75 6d 62 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  umber.        **
68c0: 20 6f 66 20 6f 75 74 70 75 74 20 63 68 61 72 61   of output chara
68d0: 63 74 65 72 73 20 6d 61 79 20 62 65 20 6c 61 72  cters may be lar
68e0: 67 65 72 20 74 68 61 6e 20 74 68 65 20 70 72 65  ger than the pre
68f0: 63 69 73 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20  cision..        
6900: 2a 2f 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 70  */.        k = p
6910: 72 65 63 69 73 69 6f 6e 3b 0a 20 20 20 20 20 20  recision;.      
6920: 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 6b 21 3d    for(i=n=0; k!=
6930: 30 20 26 26 20 28 63 68 3d 65 73 63 61 72 67 5b  0 && (ch=escarg[
6940: 69 5d 29 21 3d 30 3b 20 69 2b 2b 2c 20 6b 2d 2d  i])!=0; i++, k--
6950: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
6960: 20 63 68 3d 3d 71 20 29 20 20 6e 2b 2b 3b 0a 20   ch==q )  n++;. 
6970: 20 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61           if( fla
6980: 67 5f 61 6c 74 66 6f 72 6d 32 20 26 26 20 28 63  g_altform2 && (c
6990: 68 26 30 78 63 30 29 3d 3d 30 78 63 30 20 29 7b  h&0xc0)==0xc0 ){
69a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 68 69  .            whi
69b0: 6c 65 28 20 28 65 73 63 61 72 67 5b 69 2b 31 5d  le( (escarg[i+1]
69c0: 26 30 78 63 30 29 3d 3d 30 78 38 30 20 29 7b 20  &0xc0)==0x80 ){ 
69d0: 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 20  i++; }.         
69e0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
69f0: 20 20 20 20 20 6e 65 65 64 51 75 6f 74 65 20 3d       needQuote =
6a00: 20 21 69 73 6e 75 6c 6c 20 26 26 20 78 74 79 70   !isnull && xtyp
6a10: 65 3d 3d 65 74 53 51 4c 45 53 43 41 50 45 32 3b  e==etSQLESCAPE2;
6a20: 0a 20 20 20 20 20 20 20 20 6e 20 2b 3d 20 69 20  .        n += i 
6a30: 2b 20 33 3b 0a 20 20 20 20 20 20 20 20 69 66 28  + 3;.        if(
6a40: 20 6e 3e 65 74 42 55 46 53 49 5a 45 20 29 7b 0a   n>etBUFSIZE ){.
6a50: 20 20 20 20 20 20 20 20 20 20 62 75 66 70 74 20            bufpt 
6a60: 3d 20 7a 45 78 74 72 61 20 3d 20 70 72 69 6e 74  = zExtra = print
6a70: 66 54 65 6d 70 42 75 66 28 70 41 63 63 75 6d 2c  fTempBuf(pAccum,
6a80: 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   n);.          i
6a90: 66 28 20 62 75 66 70 74 3d 3d 30 20 29 20 72 65  f( bufpt==0 ) re
6aa0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65  turn;.        }e
6ab0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 62  lse{.          b
6ac0: 75 66 70 74 20 3d 20 62 75 66 3b 0a 20 20 20 20  ufpt = buf;.    
6ad0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6a 20      }.        j 
6ae0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
6af0: 20 6e 65 65 64 51 75 6f 74 65 20 29 20 62 75 66   needQuote ) buf
6b00: 70 74 5b 6a 2b 2b 5d 20 3d 20 71 3b 0a 20 20 20  pt[j++] = q;.   
6b10: 20 20 20 20 20 6b 20 3d 20 69 3b 0a 20 20 20 20       k = i;.    
6b20: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b      for(i=0; i<k
6b30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
6b40: 20 20 62 75 66 70 74 5b 6a 2b 2b 5d 20 3d 20 63    bufpt[j++] = c
6b50: 68 20 3d 20 65 73 63 61 72 67 5b 69 5d 3b 0a 20  h = escarg[i];. 
6b60: 20 20 20 20 20 20 20 20 20 69 66 28 20 63 68 3d           if( ch=
6b70: 3d 71 20 29 20 62 75 66 70 74 5b 6a 2b 2b 5d 20  =q ) bufpt[j++] 
6b80: 3d 20 63 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = ch;.        }.
6b90: 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 65 64          if( need
6ba0: 51 75 6f 74 65 20 29 20 62 75 66 70 74 5b 6a 2b  Quote ) bufpt[j+
6bb0: 2b 5d 20 3d 20 71 3b 0a 20 20 20 20 20 20 20 20  +] = q;.        
6bc0: 62 75 66 70 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20  bufpt[j] = 0;.  
6bd0: 20 20 20 20 20 20 6c 65 6e 67 74 68 20 3d 20 6a        length = j
6be0: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61  ;.        goto a
6bf0: 64 6a 75 73 74 5f 77 69 64 74 68 5f 66 6f 72 5f  djust_width_for_
6c00: 75 74 66 38 3b 0a 20 20 20 20 20 20 7d 0a 20 20  utf8;.      }.  
6c10: 20 20 20 20 63 61 73 65 20 65 74 54 4f 4b 45 4e      case etTOKEN
6c20: 3a 20 7b 0a 20 20 20 20 20 20 20 20 54 6f 6b 65  : {.        Toke
6c30: 6e 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  n *pToken;.     
6c40: 20 20 20 69 66 28 20 28 70 41 63 63 75 6d 2d 3e     if( (pAccum->
6c50: 70 72 69 6e 74 66 46 6c 61 67 73 20 26 20 53 51  printfFlags & SQ
6c60: 4c 49 54 45 5f 50 52 49 4e 54 46 5f 49 4e 54 45  LITE_PRINTF_INTE
6c70: 52 4e 41 4c 29 3d 3d 30 20 29 20 72 65 74 75 72  RNAL)==0 ) retur
6c80: 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 65  n;.        pToke
6c90: 6e 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 54  n = va_arg(ap, T
6ca0: 6f 6b 65 6e 2a 29 3b 0a 20 20 20 20 20 20 20 20  oken*);.        
6cb0: 61 73 73 65 72 74 28 20 62 41 72 67 4c 69 73 74  assert( bArgList
6cc0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ==0 );.        i
6cd0: 66 28 20 70 54 6f 6b 65 6e 20 26 26 20 70 54 6f  f( pToken && pTo
6ce0: 6b 65 6e 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20  ken->n ){.      
6cf0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
6d00: 61 70 70 65 6e 64 28 70 41 63 63 75 6d 2c 20 28  append(pAccum, (
6d10: 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 54 6f 6b  const char*)pTok
6d20: 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e  en->z, pToken->n
6d30: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
6d40: 20 20 20 20 20 6c 65 6e 67 74 68 20 3d 20 77 69       length = wi
6d50: 64 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dth = 0;.       
6d60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
6d70: 20 20 20 20 20 20 63 61 73 65 20 65 74 53 52 43        case etSRC
6d80: 4c 49 53 54 3a 20 7b 0a 20 20 20 20 20 20 20 20  LIST: {.        
6d90: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
6da0: 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20         int k;.  
6db0: 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
6dc0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
6dd0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
6de0: 41 63 63 75 6d 2d 3e 70 72 69 6e 74 66 46 6c 61  Accum->printfFla
6df0: 67 73 20 26 20 53 51 4c 49 54 45 5f 50 52 49 4e  gs & SQLITE_PRIN
6e00: 54 46 5f 49 4e 54 45 52 4e 41 4c 29 3d 3d 30 20  TF_INTERNAL)==0 
6e10: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
6e20: 20 20 70 53 72 63 20 3d 20 76 61 5f 61 72 67 28    pSrc = va_arg(
6e30: 61 70 2c 20 53 72 63 4c 69 73 74 2a 29 3b 0a 20  ap, SrcList*);. 
6e40: 20 20 20 20 20 20 20 6b 20 3d 20 76 61 5f 61 72         k = va_ar
6e50: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
6e60: 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 53 72      pItem = &pSr
6e70: 63 2d 3e 61 5b 6b 5d 3b 0a 20 20 20 20 20 20 20  c->a[k];.       
6e80: 20 61 73 73 65 72 74 28 20 62 41 72 67 4c 69 73   assert( bArgLis
6e90: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
6ea0: 61 73 73 65 72 74 28 20 6b 3e 3d 30 20 26 26 20  assert( k>=0 && 
6eb0: 6b 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a  k<pSrc->nSrc );.
6ec0: 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
6ed0: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 29 7b 0a  m->zDatabase ){.
6ee0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6ef0: 33 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28  3_str_appendall(
6f00: 70 41 63 63 75 6d 2c 20 70 49 74 65 6d 2d 3e 7a  pAccum, pItem->z
6f10: 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 20  Database);.     
6f20: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
6f30: 5f 61 70 70 65 6e 64 28 70 41 63 63 75 6d 2c 20  _append(pAccum, 
6f40: 22 2e 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ".", 1);.       
6f50: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
6f60: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c  e3_str_appendall
6f70: 28 70 41 63 63 75 6d 2c 20 70 49 74 65 6d 2d 3e  (pAccum, pItem->
6f80: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
6f90: 6c 65 6e 67 74 68 20 3d 20 77 69 64 74 68 20 3d  length = width =
6fa0: 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   0;.        brea
6fb0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
6fc0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
6fd0: 20 20 20 20 61 73 73 65 72 74 28 20 78 74 79 70      assert( xtyp
6fe0: 65 3d 3d 65 74 49 4e 56 41 4c 49 44 20 29 3b 0a  e==etINVALID );.
6ff0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
7000: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 2f 2a 20        }.    }/* 
7010: 45 6e 64 20 73 77 69 74 63 68 20 6f 76 65 72 20  End switch over 
7020: 74 68 65 20 66 6f 72 6d 61 74 20 74 79 70 65 20  the format type 
7030: 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  */.    /*.    **
7040: 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   The text of the
7050: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 73 20 70   conversion is p
7060: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 22 62 75  ointed to by "bu
7070: 66 70 74 22 20 61 6e 64 20 69 73 0a 20 20 20 20  fpt" and is.    
7080: 2a 2a 20 22 6c 65 6e 67 74 68 22 20 63 68 61 72  ** "length" char
7090: 61 63 74 65 72 73 20 6c 6f 6e 67 2e 20 20 54 68  acters long.  Th
70a0: 65 20 66 69 65 6c 64 20 77 69 64 74 68 20 69 73  e field width is
70b0: 20 22 77 69 64 74 68 22 2e 20 20 44 6f 0a 20 20   "width".  Do.  
70c0: 20 20 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 2e    ** the output.
70d0: 20 20 42 6f 74 68 20 6c 65 6e 67 74 68 20 61 6e    Both length an
70e0: 64 20 77 69 64 74 68 20 61 72 65 20 69 6e 20 62  d width are in b
70f0: 79 74 65 73 2c 20 6e 6f 74 20 63 68 61 72 61 63  ytes, not charac
7100: 74 65 72 73 2c 0a 20 20 20 20 2a 2a 20 61 74 20  ters,.    ** at 
7110: 74 68 69 73 20 70 6f 69 6e 74 2e 20 20 49 66 20  this point.  If 
7120: 74 68 65 20 22 21 22 20 66 6c 61 67 20 77 61 73  the "!" flag was
7130: 20 70 72 65 73 65 6e 74 20 6f 6e 20 73 74 72 69   present on stri
7140: 6e 67 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20  ng conversions. 
7150: 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67     ** indicating
7160: 20 74 68 61 74 20 77 69 64 74 68 20 61 6e 64 20   that width and 
7170: 70 72 65 63 69 73 69 6f 6e 20 73 68 6f 75 6c 64  precision should
7180: 20 62 65 20 65 78 70 72 65 73 73 65 64 20 69 6e   be expressed in
7190: 20 63 68 61 72 61 63 74 65 72 73 2c 0a 20 20 20   characters,.   
71a0: 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c   ** then the val
71b0: 75 65 73 20 68 61 76 65 20 62 65 65 6e 20 74 72  ues have been tr
71c0: 61 6e 73 6c 61 74 65 64 20 70 72 69 6f 72 20 74  anslated prior t
71d0: 6f 20 72 65 61 63 68 69 6e 67 20 74 68 69 73 20  o reaching this 
71e0: 70 6f 69 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  point..    */.  
71f0: 20 20 77 69 64 74 68 20 2d 3d 20 6c 65 6e 67 74    width -= lengt
7200: 68 3b 0a 20 20 20 20 69 66 28 20 77 69 64 74 68  h;.    if( width
7210: 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >0 ){.      if( 
7220: 21 66 6c 61 67 5f 6c 65 66 74 6a 75 73 74 69 66  !flag_leftjustif
7230: 79 20 29 20 73 71 6c 69 74 65 33 5f 73 74 72 5f  y ) sqlite3_str_
7240: 61 70 70 65 6e 64 63 68 61 72 28 70 41 63 63 75  appendchar(pAccu
7250: 6d 2c 20 77 69 64 74 68 2c 20 27 20 27 29 3b 0a  m, width, ' ');.
7260: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
7270: 72 5f 61 70 70 65 6e 64 28 70 41 63 63 75 6d 2c  r_append(pAccum,
7280: 20 62 75 66 70 74 2c 20 6c 65 6e 67 74 68 29 3b   bufpt, length);
7290: 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 5f  .      if( flag_
72a0: 6c 65 66 74 6a 75 73 74 69 66 79 20 29 20 73 71  leftjustify ) sq
72b0: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
72c0: 63 68 61 72 28 70 41 63 63 75 6d 2c 20 77 69 64  char(pAccum, wid
72d0: 74 68 2c 20 27 20 27 29 3b 0a 20 20 20 20 7d 65  th, ' ');.    }e
72e0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
72f0: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 70 41  e3_str_append(pA
7300: 63 63 75 6d 2c 20 62 75 66 70 74 2c 20 6c 65 6e  ccum, bufpt, len
7310: 67 74 68 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  gth);.    }..   
7320: 20 69 66 28 20 7a 45 78 74 72 61 20 29 7b 0a 20   if( zExtra ){. 
7330: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
7340: 65 65 28 70 41 63 63 75 6d 2d 3e 64 62 2c 20 7a  ee(pAccum->db, z
7350: 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7a 45  Extra);.      zE
7360: 78 74 72 61 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  xtra = 0;.    }.
7370: 20 20 7d 2f 2a 20 45 6e 64 20 66 6f 72 20 6c 6f    }/* End for lo
7380: 6f 70 20 6f 76 65 72 20 74 68 65 20 66 6f 72 6d  op over the form
7390: 61 74 20 73 74 72 69 6e 67 20 2a 2f 0a 7d 20 2f  at string */.} /
73a0: 2a 20 45 6e 64 20 6f 66 20 66 75 6e 63 74 69 6f  * End of functio
73b0: 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 6e 6c 61  n */../*.** Enla
73c0: 72 67 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  rge the memory a
73d0: 6c 6c 6f 63 61 74 69 6f 6e 20 6f 6e 20 61 20 53  llocation on a S
73e0: 74 72 41 63 63 75 6d 20 6f 62 6a 65 63 74 20 73  trAccum object s
73f0: 6f 20 74 68 61 74 20 69 74 20 69 73 0a 2a 2a 20  o that it is.** 
7400: 61 62 6c 65 20 74 6f 20 61 63 63 65 70 74 20 61  able to accept a
7410: 74 20 6c 65 61 73 74 20 4e 20 6d 6f 72 65 20 62  t least N more b
7420: 79 74 65 73 20 6f 66 20 74 65 78 74 2e 0a 2a 2a  ytes of text..**
7430: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
7440: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
7450: 66 20 74 65 78 74 20 74 68 61 74 20 53 74 72 41  f text that StrA
7460: 63 63 75 6d 20 69 73 20 61 62 6c 65 20 74 6f 20  ccum is able to 
7470: 61 63 63 65 70 74 0a 2a 2a 20 61 66 74 65 72 20  accept.** after 
7480: 74 68 65 20 61 74 74 65 6d 70 74 65 64 20 65 6e  the attempted en
7490: 6c 61 72 67 65 6d 65 6e 74 2e 20 20 54 68 65 20  largement.  The 
74a0: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 6d  value returned m
74b0: 69 67 68 74 20 62 65 20 7a 65 72 6f 2e 0a 2a 2f  ight be zero..*/
74c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
74d0: 74 65 33 53 74 72 41 63 63 75 6d 45 6e 6c 61 72  te3StrAccumEnlar
74e0: 67 65 28 53 74 72 41 63 63 75 6d 20 2a 70 2c 20  ge(StrAccum *p, 
74f0: 69 6e 74 20 4e 29 7b 0a 20 20 63 68 61 72 20 2a  int N){.  char *
7500: 7a 4e 65 77 3b 0a 20 20 61 73 73 65 72 74 28 20  zNew;.  assert( 
7510: 70 2d 3e 6e 43 68 61 72 2b 28 69 36 34 29 4e 20  p->nChar+(i64)N 
7520: 3e 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 20  >= p->nAlloc ); 
7530: 2f 2a 20 4f 6e 6c 79 20 63 61 6c 6c 65 64 20 69  /* Only called i
7540: 66 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64 20  f really needed 
7550: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 61 63 63 45  */.  if( p->accE
7560: 72 72 6f 72 20 29 7b 0a 20 20 20 20 74 65 73 74  rror ){.    test
7570: 63 61 73 65 28 70 2d 3e 61 63 63 45 72 72 6f 72  case(p->accError
7580: 3d 3d 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 29  ==SQLITE_TOOBIG)
7590: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 70  ;.    testcase(p
75a0: 2d 3e 61 63 63 45 72 72 6f 72 3d 3d 53 51 4c 49  ->accError==SQLI
75b0: 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 72  TE_NOMEM);.    r
75c0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
75d0: 66 28 20 70 2d 3e 6d 78 41 6c 6c 6f 63 3d 3d 30  f( p->mxAlloc==0
75e0: 20 29 7b 0a 20 20 20 20 73 65 74 53 74 72 41 63   ){.    setStrAc
75f0: 63 75 6d 45 72 72 6f 72 28 70 2c 20 53 51 4c 49  cumError(p, SQLI
7600: 54 45 5f 54 4f 4f 42 49 47 29 3b 0a 20 20 20 20  TE_TOOBIG);.    
7610: 72 65 74 75 72 6e 20 70 2d 3e 6e 41 6c 6c 6f 63  return p->nAlloc
7620: 20 2d 20 70 2d 3e 6e 43 68 61 72 20 2d 20 31 3b   - p->nChar - 1;
7630: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
7640: 61 72 20 2a 7a 4f 6c 64 20 3d 20 69 73 4d 61 6c  ar *zOld = isMal
7650: 6c 6f 63 65 64 28 70 29 20 3f 20 70 2d 3e 7a 54  loced(p) ? p->zT
7660: 65 78 74 20 3a 20 30 3b 0a 20 20 20 20 69 36 34  ext : 0;.    i64
7670: 20 73 7a 4e 65 77 20 3d 20 70 2d 3e 6e 43 68 61   szNew = p->nCha
7680: 72 3b 0a 20 20 20 20 73 7a 4e 65 77 20 2b 3d 20  r;.    szNew += 
7690: 4e 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20 73  N + 1;.    if( s
76a0: 7a 4e 65 77 2b 70 2d 3e 6e 43 68 61 72 3c 3d 70  zNew+p->nChar<=p
76b0: 2d 3e 6d 78 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  ->mxAlloc ){.   
76c0: 20 20 20 2f 2a 20 46 6f 72 63 65 20 65 78 70 6f     /* Force expo
76d0: 6e 65 6e 74 69 61 6c 20 62 75 66 66 65 72 20 73  nential buffer s
76e0: 69 7a 65 20 67 72 6f 77 74 68 20 61 73 20 6c 6f  ize growth as lo
76f0: 6e 67 20 61 73 20 69 74 20 64 6f 65 73 20 6e 6f  ng as it does no
7700: 74 20 6f 76 65 72 66 6c 6f 77 2c 0a 20 20 20 20  t overflow,.    
7710: 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 68 61    ** to avoid ha
7720: 76 69 6e 67 20 74 6f 20 63 61 6c 6c 20 74 68 69  ving to call thi
7730: 73 20 72 6f 75 74 69 6e 65 20 74 6f 6f 20 6f 66  s routine too of
7740: 74 65 6e 20 2a 2f 0a 20 20 20 20 20 20 73 7a 4e  ten */.      szN
7750: 65 77 20 2b 3d 20 70 2d 3e 6e 43 68 61 72 3b 0a  ew += p->nChar;.
7760: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 7a      }.    if( sz
7770: 4e 65 77 20 3e 20 70 2d 3e 6d 78 41 6c 6c 6f 63  New > p->mxAlloc
7780: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7790: 33 5f 73 74 72 5f 72 65 73 65 74 28 70 29 3b 0a  3_str_reset(p);.
77a0: 20 20 20 20 20 20 73 65 74 53 74 72 41 63 63 75        setStrAccu
77b0: 6d 45 72 72 6f 72 28 70 2c 20 53 51 4c 49 54 45  mError(p, SQLITE
77c0: 5f 54 4f 4f 42 49 47 29 3b 0a 20 20 20 20 20 20  _TOOBIG);.      
77d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65  return 0;.    }e
77e0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 41  lse{.      p->nA
77f0: 6c 6c 6f 63 20 3d 20 28 69 6e 74 29 73 7a 4e 65  lloc = (int)szNe
7800: 77 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  w;.    }.    if(
7810: 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20 20 20   p->db ){.      
7820: 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  zNew = sqlite3Db
7830: 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 7a  Realloc(p->db, z
7840: 4f 6c 64 2c 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b  Old, p->nAlloc);
7850: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7860: 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    zNew = sqlite3
7870: 5f 72 65 61 6c 6c 6f 63 36 34 28 7a 4f 6c 64 2c  _realloc64(zOld,
7880: 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20   p->nAlloc);.   
7890: 20 7d 0a 20 20 20 20 69 66 28 20 7a 4e 65 77 20   }.    if( zNew 
78a0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
78b0: 20 70 2d 3e 7a 54 65 78 74 21 3d 30 20 7c 7c 20   p->zText!=0 || 
78c0: 70 2d 3e 6e 43 68 61 72 3d 3d 30 20 29 3b 0a 20  p->nChar==0 );. 
78d0: 20 20 20 20 20 69 66 28 20 21 69 73 4d 61 6c 6c       if( !isMall
78e0: 6f 63 65 64 28 70 29 20 26 26 20 70 2d 3e 6e 43  oced(p) && p->nC
78f0: 68 61 72 3e 30 20 29 20 6d 65 6d 63 70 79 28 7a  har>0 ) memcpy(z
7900: 4e 65 77 2c 20 70 2d 3e 7a 54 65 78 74 2c 20 70  New, p->zText, p
7910: 2d 3e 6e 43 68 61 72 29 3b 0a 20 20 20 20 20 20  ->nChar);.      
7920: 70 2d 3e 7a 54 65 78 74 20 3d 20 7a 4e 65 77 3b  p->zText = zNew;
7930: 0a 20 20 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63  .      p->nAlloc
7940: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
7950: 6f 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20 7a 4e  ocSize(p->db, zN
7960: 65 77 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 72  ew);.      p->pr
7970: 69 6e 74 66 46 6c 61 67 73 20 7c 3d 20 53 51 4c  intfFlags |= SQL
7980: 49 54 45 5f 50 52 49 4e 54 46 5f 4d 41 4c 4c 4f  ITE_PRINTF_MALLO
7990: 43 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  CED;.    }else{.
79a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
79b0: 72 5f 72 65 73 65 74 28 70 29 3b 0a 20 20 20 20  r_reset(p);.    
79c0: 20 20 73 65 74 53 74 72 41 63 63 75 6d 45 72 72    setStrAccumErr
79d0: 6f 72 28 70 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  or(p, SQLITE_NOM
79e0: 45 4d 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  EM);.      retur
79f0: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 0;.    }.  }. 
7a00: 20 72 65 74 75 72 6e 20 4e 3b 0a 7d 0a 0a 2f 2a   return N;.}../*
7a10: 0a 2a 2a 20 41 70 70 65 6e 64 20 4e 20 63 6f 70  .** Append N cop
7a20: 69 65 73 20 6f 66 20 63 68 61 72 61 63 74 65 72  ies of character
7a30: 20 63 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20   c to the given 
7a40: 73 74 72 69 6e 67 20 62 75 66 66 65 72 2e 0a 2a  string buffer..*
7a50: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 73  /.void sqlite3_s
7a60: 74 72 5f 61 70 70 65 6e 64 63 68 61 72 28 73 71  tr_appendchar(sq
7a70: 6c 69 74 65 33 5f 73 74 72 20 2a 70 2c 20 69 6e  lite3_str *p, in
7a80: 74 20 4e 2c 20 63 68 61 72 20 63 29 7b 0a 20 20  t N, char c){.  
7a90: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6e 43 68  testcase( p->nCh
7aa0: 61 72 20 2b 20 28 69 36 34 29 4e 20 3e 20 30 78  ar + (i64)N > 0x
7ab0: 37 66 66 66 66 66 66 66 20 29 3b 0a 20 20 69 66  7fffffff );.  if
7ac0: 28 20 70 2d 3e 6e 43 68 61 72 2b 28 69 36 34 29  ( p->nChar+(i64)
7ad0: 4e 20 3e 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 20 26  N >= p->nAlloc &
7ae0: 26 20 28 4e 20 3d 20 73 71 6c 69 74 65 33 53 74  & (N = sqlite3St
7af0: 72 41 63 63 75 6d 45 6e 6c 61 72 67 65 28 70 2c  rAccumEnlarge(p,
7b00: 20 4e 29 29 3c 3d 30 20 29 7b 0a 20 20 20 20 72   N))<=0 ){.    r
7b10: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 77 68 69  eturn;.  }.  whi
7b20: 6c 65 28 20 28 4e 2d 2d 29 3e 30 20 29 20 70 2d  le( (N--)>0 ) p-
7b30: 3e 7a 54 65 78 74 5b 70 2d 3e 6e 43 68 61 72 2b  >zText[p->nChar+
7b40: 2b 5d 20 3d 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  +] = c;.}../*.**
7b50: 20 54 68 65 20 53 74 72 41 63 63 75 6d 20 22 70   The StrAccum "p
7b60: 22 20 69 73 20 6e 6f 74 20 6c 61 72 67 65 20 65  " is not large e
7b70: 6e 6f 75 67 68 20 74 6f 20 61 63 63 65 70 74 20  nough to accept 
7b80: 4e 20 6e 65 77 20 62 79 74 65 73 20 6f 66 20 7a  N new bytes of z
7b90: 5b 5d 2e 0a 2a 2a 20 53 6f 20 65 6e 6c 61 72 67  []..** So enlarg
7ba0: 65 20 69 66 20 66 69 72 73 74 2c 20 74 68 65 6e  e if first, then
7bb0: 20 64 6f 20 74 68 65 20 61 70 70 65 6e 64 2e 0a   do the append..
7bc0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  **.** This is a 
7bd0: 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 74  helper routine t
7be0: 6f 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70  o sqlite3_str_ap
7bf0: 70 65 6e 64 28 29 20 74 68 61 74 20 64 6f 65 73  pend() that does
7c00: 20 73 70 65 63 69 61 6c 2d 63 61 73 65 0a 2a 2a   special-case.**
7c10: 20 77 6f 72 6b 20 28 65 6e 6c 61 72 67 69 6e 67   work (enlarging
7c20: 20 74 68 65 20 62 75 66 66 65 72 29 20 75 73 69   the buffer) usi
7c30: 6e 67 20 74 61 69 6c 20 72 65 63 75 72 73 69 6f  ng tail recursio
7c40: 6e 2c 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a  n, so that the.*
7c50: 2a 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70  * sqlite3_str_ap
7c60: 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 20 63  pend() routine c
7c70: 61 6e 20 75 73 65 20 66 61 73 74 20 63 61 6c 6c  an use fast call
7c80: 69 6e 67 20 73 65 6d 61 6e 74 69 63 73 2e 0a 2a  ing semantics..*
7c90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 51  /.static void SQ
7ca0: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 65 6e  LITE_NOINLINE en
7cb0: 6c 61 72 67 65 41 6e 64 41 70 70 65 6e 64 28 53  largeAndAppend(S
7cc0: 74 72 41 63 63 75 6d 20 2a 70 2c 20 63 6f 6e 73  trAccum *p, cons
7cd0: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 4e  t char *z, int N
7ce0: 29 7b 0a 20 20 4e 20 3d 20 73 71 6c 69 74 65 33  ){.  N = sqlite3
7cf0: 53 74 72 41 63 63 75 6d 45 6e 6c 61 72 67 65 28  StrAccumEnlarge(
7d00: 70 2c 20 4e 29 3b 0a 20 20 69 66 28 20 4e 3e 30  p, N);.  if( N>0
7d10: 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26   ){.    memcpy(&
7d20: 70 2d 3e 7a 54 65 78 74 5b 70 2d 3e 6e 43 68 61  p->zText[p->nCha
7d30: 72 5d 2c 20 7a 2c 20 4e 29 3b 0a 20 20 20 20 70  r], z, N);.    p
7d40: 2d 3e 6e 43 68 61 72 20 2b 3d 20 4e 3b 0a 20 20  ->nChar += N;.  
7d50: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  }.}../*.** Appen
7d60: 64 20 4e 20 62 79 74 65 73 20 6f 66 20 74 65 78  d N bytes of tex
7d70: 74 20 66 72 6f 6d 20 7a 20 74 6f 20 74 68 65 20  t from z to the 
7d80: 53 74 72 41 63 63 75 6d 20 6f 62 6a 65 63 74 2e  StrAccum object.
7d90: 20 20 49 6e 63 72 65 61 73 65 20 74 68 65 0a 2a    Increase the.*
7da0: 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 65  * size of the me
7db0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
7dc0: 66 6f 72 20 53 74 72 41 63 63 75 6d 20 69 66 20  for StrAccum if 
7dd0: 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 76 6f  necessary..*/.vo
7de0: 69 64 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61  id sqlite3_str_a
7df0: 70 70 65 6e 64 28 73 71 6c 69 74 65 33 5f 73 74  ppend(sqlite3_st
7e00: 72 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  r *p, const char
7e10: 20 2a 7a 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61   *z, int N){.  a
7e20: 73 73 65 72 74 28 20 7a 21 3d 30 20 7c 7c 20 4e  ssert( z!=0 || N
7e30: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
7e40: 20 70 2d 3e 7a 54 65 78 74 21 3d 30 20 7c 7c 20   p->zText!=0 || 
7e50: 70 2d 3e 6e 43 68 61 72 3d 3d 30 20 7c 7c 20 70  p->nChar==0 || p
7e60: 2d 3e 61 63 63 45 72 72 6f 72 20 29 3b 0a 20 20  ->accError );.  
7e70: 61 73 73 65 72 74 28 20 4e 3e 3d 30 20 29 3b 0a  assert( N>=0 );.
7e80: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 63 63    assert( p->acc
7e90: 45 72 72 6f 72 3d 3d 30 20 7c 7c 20 70 2d 3e 6e  Error==0 || p->n
7ea0: 41 6c 6c 6f 63 3d 3d 30 20 7c 7c 20 70 2d 3e 6d  Alloc==0 || p->m
7eb0: 78 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 69  xAlloc==0 );.  i
7ec0: 66 28 20 70 2d 3e 6e 43 68 61 72 2b 4e 20 3e 3d  f( p->nChar+N >=
7ed0: 20 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20   p->nAlloc ){.  
7ee0: 20 20 65 6e 6c 61 72 67 65 41 6e 64 41 70 70 65    enlargeAndAppe
7ef0: 6e 64 28 70 2c 7a 2c 4e 29 3b 0a 20 20 7d 65 6c  nd(p,z,N);.  }el
7f00: 73 65 20 69 66 28 20 4e 20 29 7b 0a 20 20 20 20  se if( N ){.    
7f10: 61 73 73 65 72 74 28 20 70 2d 3e 7a 54 65 78 74  assert( p->zText
7f20: 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 43 68 61 72   );.    p->nChar
7f30: 20 2b 3d 20 4e 3b 0a 20 20 20 20 6d 65 6d 63 70   += N;.    memcp
7f40: 79 28 26 70 2d 3e 7a 54 65 78 74 5b 70 2d 3e 6e  y(&p->zText[p->n
7f50: 43 68 61 72 2d 4e 5d 2c 20 7a 2c 20 4e 29 3b 0a  Char-N], z, N);.
7f60: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70    }.}../*.** App
7f70: 65 6e 64 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  end the complete
7f80: 20 74 65 78 74 20 6f 66 20 7a 65 72 6f 2d 74 65   text of zero-te
7f90: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
7fa0: 7a 5b 5d 20 74 6f 20 74 68 65 20 70 20 73 74 72  z[] to the p str
7fb0: 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ing..*/.void sql
7fc0: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 61  ite3_str_appenda
7fd0: 6c 6c 28 73 71 6c 69 74 65 33 5f 73 74 72 20 2a  ll(sqlite3_str *
7fe0: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
7ff0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 72  ){.  sqlite3_str
8000: 5f 61 70 70 65 6e 64 28 70 2c 20 7a 2c 20 73 71  _append(p, z, sq
8010: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
8020: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  );.}.../*.** Fin
8030: 69 73 68 20 6f 66 66 20 61 20 73 74 72 69 6e 67  ish off a string
8040: 20 62 79 20 6d 61 6b 69 6e 67 20 73 75 72 65 20   by making sure 
8050: 69 74 20 69 73 20 7a 65 72 6f 2d 74 65 72 6d 69  it is zero-termi
8060: 6e 61 74 65 64 2e 0a 2a 2a 20 52 65 74 75 72 6e  nated..** Return
8070: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
8080: 65 20 72 65 73 75 6c 74 69 6e 67 20 73 74 72 69  e resulting stri
8090: 6e 67 2e 20 20 52 65 74 75 72 6e 20 61 20 4e 55  ng.  Return a NU
80a0: 4c 4c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69 66  LL.** pointer if
80b0: 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 65 72 72   any kind of err
80c0: 6f 72 20 77 61 73 20 65 6e 63 6f 75 6e 74 65 72  or was encounter
80d0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  ed..*/.static SQ
80e0: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 63 68  LITE_NOINLINE ch
80f0: 61 72 20 2a 73 74 72 41 63 63 75 6d 46 69 6e 69  ar *strAccumFini
8100: 73 68 52 65 61 6c 6c 6f 63 28 53 74 72 41 63 63  shRealloc(StrAcc
8110: 75 6d 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a  um *p){.  char *
8120: 7a 54 65 78 74 3b 0a 20 20 61 73 73 65 72 74 28  zText;.  assert(
8130: 20 70 2d 3e 6d 78 41 6c 6c 6f 63 3e 30 20 26 26   p->mxAlloc>0 &&
8140: 20 21 69 73 4d 61 6c 6c 6f 63 65 64 28 70 29 20   !isMalloced(p) 
8150: 29 3b 0a 20 20 7a 54 65 78 74 20 3d 20 73 71 6c  );.  zText = sql
8160: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
8170: 70 2d 3e 64 62 2c 20 70 2d 3e 6e 43 68 61 72 2b  p->db, p->nChar+
8180: 31 20 29 3b 0a 20 20 69 66 28 20 7a 54 65 78 74  1 );.  if( zText
8190: 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a   ){.    memcpy(z
81a0: 54 65 78 74 2c 20 70 2d 3e 7a 54 65 78 74 2c 20  Text, p->zText, 
81b0: 70 2d 3e 6e 43 68 61 72 2b 31 29 3b 0a 20 20 20  p->nChar+1);.   
81c0: 20 70 2d 3e 70 72 69 6e 74 66 46 6c 61 67 73 20   p->printfFlags 
81d0: 7c 3d 20 53 51 4c 49 54 45 5f 50 52 49 4e 54 46  |= SQLITE_PRINTF
81e0: 5f 4d 41 4c 4c 4f 43 45 44 3b 0a 20 20 7d 65 6c  _MALLOCED;.  }el
81f0: 73 65 7b 0a 20 20 20 20 73 65 74 53 74 72 41 63  se{.    setStrAc
8200: 63 75 6d 45 72 72 6f 72 28 70 2c 20 53 51 4c 49  cumError(p, SQLI
8210: 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 0a 20  TE_NOMEM);.  }. 
8220: 20 70 2d 3e 7a 54 65 78 74 20 3d 20 7a 54 65 78   p->zText = zTex
8230: 74 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54 65 78  t;.  return zTex
8240: 74 3b 0a 7d 0a 63 68 61 72 20 2a 73 71 6c 69 74  t;.}.char *sqlit
8250: 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68  e3StrAccumFinish
8260: 28 53 74 72 41 63 63 75 6d 20 2a 70 29 7b 0a 20  (StrAccum *p){. 
8270: 20 69 66 28 20 70 2d 3e 7a 54 65 78 74 20 29 7b   if( p->zText ){
8280: 0a 20 20 20 20 70 2d 3e 7a 54 65 78 74 5b 70 2d  .    p->zText[p-
8290: 3e 6e 43 68 61 72 5d 20 3d 20 30 3b 0a 20 20 20  >nChar] = 0;.   
82a0: 20 69 66 28 20 70 2d 3e 6d 78 41 6c 6c 6f 63 3e   if( p->mxAlloc>
82b0: 30 20 26 26 20 21 69 73 4d 61 6c 6c 6f 63 65 64  0 && !isMalloced
82c0: 28 70 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  (p) ){.      ret
82d0: 75 72 6e 20 73 74 72 41 63 63 75 6d 46 69 6e 69  urn strAccumFini
82e0: 73 68 52 65 61 6c 6c 6f 63 28 70 29 3b 0a 20 20  shRealloc(p);.  
82f0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
8300: 20 70 2d 3e 7a 54 65 78 74 3b 0a 7d 0a 0a 2f 2a   p->zText;.}../*
8310: 0a 2a 2a 20 54 68 69 73 20 73 69 6e 67 6c 65 74  .** This singlet
8320: 6f 6e 20 69 73 20 61 6e 20 73 71 6c 69 74 65 33  on is an sqlite3
8330: 5f 73 74 72 20 6f 62 6a 65 63 74 20 74 68 61 74  _str object that
8340: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 0a   is returned if.
8350: 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
8360: 63 28 29 20 66 61 69 6c 73 20 74 6f 20 70 72 6f  c() fails to pro
8370: 76 69 64 65 20 73 70 61 63 65 20 66 6f 72 20 61  vide space for a
8380: 20 72 65 61 6c 20 6f 6e 65 2e 20 20 54 68 69 73   real one.  This
8390: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 73 74 72 20  .** sqlite3_str 
83a0: 6f 62 6a 65 63 74 20 61 63 63 65 70 74 73 20 6e  object accepts n
83b0: 6f 20 6e 65 77 20 74 65 78 74 20 61 6e 64 20 61  o new text and a
83c0: 6c 77 61 79 73 20 72 65 74 75 72 6e 73 0a 2a 2a  lways returns.**
83d0: 20 61 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   an SQLITE_NOMEM
83e0: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69   error..*/.stati
83f0: 63 20 73 71 6c 69 74 65 33 5f 73 74 72 20 73 71  c sqlite3_str sq
8400: 6c 69 74 65 33 4f 6f 6d 53 74 72 20 3d 20 7b 0a  lite3OomStr = {.
8410: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
8420: 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  , SQLITE_NOMEM, 
8430: 30 0a 7d 3b 0a 0a 2f 2a 20 46 69 6e 61 6c 69 7a  0.};../* Finaliz
8440: 65 20 61 20 73 74 72 69 6e 67 20 63 72 65 61 74  e a string creat
8450: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
8460: 5f 73 74 72 5f 6e 65 77 28 29 2e 0a 2a 2f 0a 63  _str_new()..*/.c
8470: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 74 72  har *sqlite3_str
8480: 5f 66 69 6e 69 73 68 28 73 71 6c 69 74 65 33 5f  _finish(sqlite3_
8490: 73 74 72 20 2a 70 29 7b 0a 20 20 63 68 61 72 20  str *p){.  char 
84a0: 2a 7a 3b 0a 20 20 69 66 28 20 70 21 3d 30 20 26  *z;.  if( p!=0 &
84b0: 26 20 70 21 3d 26 73 71 6c 69 74 65 33 4f 6f 6d  & p!=&sqlite3Oom
84c0: 53 74 72 20 29 7b 0a 20 20 20 20 7a 20 3d 20 73  Str ){.    z = s
84d0: 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69  qlite3StrAccumFi
84e0: 6e 69 73 68 28 70 29 3b 0a 20 20 20 20 73 71 6c  nish(p);.    sql
84f0: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
8500: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 30  }else{.    z = 0
8510: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
8520: 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61  ;.}../* Return a
8530: 6e 79 20 65 72 72 6f 72 20 63 6f 64 65 20 61 73  ny error code as
8540: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 20  sociated with p 
8550: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
8560: 74 72 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74  tr_errcode(sqlit
8570: 65 33 5f 73 74 72 20 2a 70 29 7b 0a 20 20 72 65  e3_str *p){.  re
8580: 74 75 72 6e 20 70 20 3f 20 70 2d 3e 61 63 63 45  turn p ? p->accE
8590: 72 72 6f 72 20 3a 20 53 51 4c 49 54 45 5f 4e 4f  rror : SQLITE_NO
85a0: 4d 45 4d 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  MEM;.}../* Retur
85b0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  n the current le
85c0: 6e 67 74 68 20 6f 66 20 70 20 69 6e 20 62 79 74  ngth of p in byt
85d0: 65 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  es */.int sqlite
85e0: 33 5f 73 74 72 5f 6c 65 6e 67 74 68 28 73 71 6c  3_str_length(sql
85f0: 69 74 65 33 5f 73 74 72 20 2a 70 29 7b 0a 20 20  ite3_str *p){.  
8600: 72 65 74 75 72 6e 20 70 20 3f 20 70 2d 3e 6e 43  return p ? p->nC
8610: 68 61 72 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52  har : 0;.}../* R
8620: 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
8630: 74 20 76 61 6c 75 65 20 66 6f 72 20 70 20 2a 2f  t value for p */
8640: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 73  .char *sqlite3_s
8650: 74 72 5f 76 61 6c 75 65 28 73 71 6c 69 74 65 33  tr_value(sqlite3
8660: 5f 73 74 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  _str *p){.  if( 
8670: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 43 68 61 72  p==0 || p->nChar
8680: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
8690: 20 20 70 2d 3e 7a 54 65 78 74 5b 70 2d 3e 6e 43    p->zText[p->nC
86a0: 68 61 72 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75  har] = 0;.  retu
86b0: 72 6e 20 70 2d 3e 7a 54 65 78 74 3b 0a 7d 0a 0a  rn p->zText;.}..
86c0: 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 61 6e 20 53  /*.** Reset an S
86d0: 74 72 41 63 63 75 6d 20 73 74 72 69 6e 67 2e 20  trAccum string. 
86e0: 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 61 6c   Reclaim all mal
86f0: 6c 6f 63 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f  loced memory..*/
8700: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 73 74  .void sqlite3_st
8710: 72 5f 72 65 73 65 74 28 53 74 72 41 63 63 75 6d  r_reset(StrAccum
8720: 20 2a 70 29 7b 0a 20 20 69 66 28 20 69 73 4d 61   *p){.  if( isMa
8730: 6c 6c 6f 63 65 64 28 70 29 20 29 7b 0a 20 20 20  lloced(p) ){.   
8740: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
8750: 2d 3e 64 62 2c 20 70 2d 3e 7a 54 65 78 74 29 3b  ->db, p->zText);
8760: 0a 20 20 20 20 70 2d 3e 70 72 69 6e 74 66 46 6c  .    p->printfFl
8770: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 50  ags &= ~SQLITE_P
8780: 52 49 4e 54 46 5f 4d 41 4c 4c 4f 43 45 44 3b 0a  RINTF_MALLOCED;.
8790: 20 20 7d 0a 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20    }.  p->nAlloc 
87a0: 3d 20 30 3b 0a 20 20 70 2d 3e 6e 43 68 61 72 20  = 0;.  p->nChar 
87b0: 3d 20 30 3b 0a 20 20 70 2d 3e 7a 54 65 78 74 20  = 0;.  p->zText 
87c0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 0;.}../*.** In
87d0: 69 74 69 61 6c 69 7a 65 20 61 20 73 74 72 69 6e  itialize a strin
87e0: 67 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a  g accumulator..*
87f0: 2a 0a 2a 2a 20 70 3a 20 20 20 20 20 54 68 65 20  *.** p:     The 
8800: 61 63 63 75 6d 75 6c 61 74 6f 72 20 74 6f 20 62  accumulator to b
8810: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 2a  e initialized..*
8820: 2a 20 64 62 3a 20 20 20 20 50 6f 69 6e 74 65 72  * db:    Pointer
8830: 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 63   to a database c
8840: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 4d 61 79 20  onnection.  May 
8850: 62 65 20 4e 55 4c 4c 2e 20 20 4c 6f 6f 6b 61 73  be NULL.  Lookas
8860: 69 64 65 0a 2a 2a 20 20 20 20 20 20 20 20 6d 65  ide.**        me
8870: 6d 6f 72 79 20 69 73 20 75 73 65 64 20 69 66 20  mory is used if 
8880: 6e 6f 74 20 4e 55 4c 4c 2e 20 64 62 2d 3e 6d 61  not NULL. db->ma
8890: 6c 6c 6f 63 46 61 69 6c 65 64 20 69 73 20 73 65  llocFailed is se
88a0: 74 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 0a  t appropriately.
88b0: 2a 2a 20 20 20 20 20 20 20 20 77 68 65 6e 20 6e  **        when n
88c0: 6f 74 20 4e 55 4c 4c 2e 0a 2a 2a 20 7a 42 61 73  ot NULL..** zBas
88d0: 65 3a 20 41 6e 20 69 6e 69 74 69 61 6c 20 62 75  e: An initial bu
88e0: 66 66 65 72 2e 20 20 4d 61 79 20 62 65 20 4e 55  ffer.  May be NU
88f0: 4c 4c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  LL in which case
8900: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 62 75 66   the initial buf
8910: 66 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 69 73  fer.**        is
8920: 20 6d 61 6c 6c 6f 63 65 64 2e 0a 2a 2a 20 6e 3a   malloced..** n:
8930: 20 20 20 20 20 53 69 7a 65 20 6f 66 20 7a 42 61       Size of zBa
8940: 73 65 20 69 6e 20 62 79 74 65 73 2e 20 20 49 66  se in bytes.  If
8950: 20 74 6f 74 61 6c 20 73 70 61 63 65 20 72 65 71   total space req
8960: 75 69 72 65 6d 65 6e 74 73 20 6e 65 76 65 72 20  uirements never 
8970: 65 78 63 65 65 64 0a 2a 2a 20 20 20 20 20 20 20  exceed.**       
8980: 20 6e 20 74 68 65 6e 20 6e 6f 20 6d 65 6d 6f 72   n then no memor
8990: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 65 76  y allocations ev
89a0: 65 72 20 6f 63 63 75 72 2e 0a 2a 2a 20 6d 78 3a  er occur..** mx:
89b0: 20 20 20 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62      Maximum numb
89c0: 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 61  er of bytes to a
89d0: 63 63 75 6d 75 6c 61 74 65 2e 20 20 49 66 20 6d  ccumulate.  If m
89e0: 78 3d 3d 30 20 74 68 65 6e 20 6e 6f 20 6d 65 6d  x==0 then no mem
89f0: 6f 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 61 6c  ory.**        al
8a00: 6c 6f 63 61 74 69 6f 6e 73 20 77 69 6c 6c 20 65  locations will e
8a10: 76 65 72 20 6f 63 63 75 72 2e 0a 2a 2f 0a 76 6f  ver occur..*/.vo
8a20: 69 64 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  id sqlite3StrAcc
8a30: 75 6d 49 6e 69 74 28 53 74 72 41 63 63 75 6d 20  umInit(StrAccum 
8a40: 2a 70 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  *p, sqlite3 *db,
8a50: 20 63 68 61 72 20 2a 7a 42 61 73 65 2c 20 69 6e   char *zBase, in
8a60: 74 20 6e 2c 20 69 6e 74 20 6d 78 29 7b 0a 20 20  t n, int mx){.  
8a70: 70 2d 3e 7a 54 65 78 74 20 3d 20 7a 42 61 73 65  p->zText = zBase
8a80: 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a  ;.  p->db = db;.
8a90: 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 3b    p->nAlloc = n;
8aa0: 0a 20 20 70 2d 3e 6d 78 41 6c 6c 6f 63 20 3d 20  .  p->mxAlloc = 
8ab0: 6d 78 3b 0a 20 20 70 2d 3e 6e 43 68 61 72 20 3d  mx;.  p->nChar =
8ac0: 20 30 3b 0a 20 20 70 2d 3e 61 63 63 45 72 72 6f   0;.  p->accErro
8ad0: 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 72 69 6e  r = 0;.  p->prin
8ae0: 74 66 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a  tfFlags = 0;.}..
8af0: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  /* Allocate and 
8b00: 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77  initialize a new
8b10: 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 20   dynamic string 
8b20: 6f 62 6a 65 63 74 20 2a 2f 0a 73 71 6c 69 74 65  object */.sqlite
8b30: 33 5f 73 74 72 20 2a 73 71 6c 69 74 65 33 5f 73  3_str *sqlite3_s
8b40: 74 72 5f 6e 65 77 28 73 71 6c 69 74 65 33 20 2a  tr_new(sqlite3 *
8b50: 64 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  db){.  sqlite3_s
8b60: 74 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f  tr *p = sqlite3_
8b70: 6d 61 6c 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28  malloc64(sizeof(
8b80: 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  *p));.  if( p ){
8b90: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41  .    sqlite3StrA
8ba0: 63 63 75 6d 49 6e 69 74 28 70 2c 20 30 2c 20 30  ccumInit(p, 0, 0
8bb0: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
8bc0: 20 64 62 20 3f 20 64 62 2d 3e 61 4c 69 6d 69 74   db ? db->aLimit
8bd0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
8be0: 4e 47 54 48 5d 20 3a 20 53 51 4c 49 54 45 5f 4d  NGTH] : SQLITE_M
8bf0: 41 58 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 7d 65  AX_LENGTH);.  }e
8c00: 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 26 73 71  lse{.    p = &sq
8c10: 6c 69 74 65 33 4f 6f 6d 53 74 72 3b 0a 20 20 7d  lite3OomStr;.  }
8c20: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
8c30: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 69 6e 74 6f  /*.** Print into
8c40: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
8c50: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
8c60: 6f 63 28 29 2e 20 20 55 73 65 20 74 68 65 20 69  oc().  Use the i
8c70: 6e 74 65 72 6e 61 6c 0a 2a 2a 20 25 2d 63 6f 6e  nternal.** %-con
8c80: 76 65 72 73 69 6f 6e 20 65 78 74 65 6e 73 69 6f  version extensio
8c90: 6e 73 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  ns..*/.char *sql
8ca0: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 73 71 6c  ite3VMPrintf(sql
8cb0: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
8cc0: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76  char *zFormat, v
8cd0: 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20 63 68  a_list ap){.  ch
8ce0: 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72 20 7a 42  ar *z;.  char zB
8cf0: 61 73 65 5b 53 51 4c 49 54 45 5f 50 52 49 4e 54  ase[SQLITE_PRINT
8d00: 5f 42 55 46 5f 53 49 5a 45 5d 3b 0a 20 20 53 74  _BUF_SIZE];.  St
8d10: 72 41 63 63 75 6d 20 61 63 63 3b 0a 20 20 61 73  rAccum acc;.  as
8d20: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
8d30: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
8d40: 49 6e 69 74 28 26 61 63 63 2c 20 64 62 2c 20 7a  Init(&acc, db, z
8d50: 42 61 73 65 2c 20 73 69 7a 65 6f 66 28 7a 42 61  Base, sizeof(zBa
8d60: 73 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  se),.           
8d70: 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61             db->a
8d80: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
8d90: 49 54 5f 4c 45 4e 47 54 48 5d 29 3b 0a 20 20 61  IT_LENGTH]);.  a
8da0: 63 63 2e 70 72 69 6e 74 66 46 6c 61 67 73 20 3d  cc.printfFlags =
8db0: 20 53 51 4c 49 54 45 5f 50 52 49 4e 54 46 5f 49   SQLITE_PRINTF_I
8dc0: 4e 54 45 52 4e 41 4c 3b 0a 20 20 73 71 6c 69 74  NTERNAL;.  sqlit
8dd0: 65 33 5f 73 74 72 5f 76 61 70 70 65 6e 64 66 28  e3_str_vappendf(
8de0: 26 61 63 63 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  &acc, zFormat, a
8df0: 70 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  p);.  z = sqlite
8e00: 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28  3StrAccumFinish(
8e10: 26 61 63 63 29 3b 0a 20 20 69 66 28 20 61 63 63  &acc);.  if( acc
8e20: 2e 61 63 63 45 72 72 6f 72 3d 3d 53 51 4c 49 54  .accError==SQLIT
8e30: 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73  E_NOMEM ){.    s
8e40: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
8e50: 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  b);.  }.  return
8e60: 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69   z;.}../*.** Pri
8e70: 6e 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f  nt into memory o
8e80: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
8e90: 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 20 55 73  iteMalloc().  Us
8ea0: 65 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a  e the internal.*
8eb0: 2a 20 25 2d 63 6f 6e 76 65 72 73 69 6f 6e 20 65  * %-conversion e
8ec0: 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 63 68  xtensions..*/.ch
8ed0: 61 72 20 2a 73 71 6c 69 74 65 33 4d 50 72 69 6e  ar *sqlite3MPrin
8ee0: 74 66 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  tf(sqlite3 *db, 
8ef0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
8f00: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
8f10: 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20  list ap;.  char 
8f20: 2a 7a 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  *z;.  va_start(a
8f30: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a  p, zFormat);.  z
8f40: 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e   = sqlite3VMPrin
8f50: 74 66 28 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20  tf(db, zFormat, 
8f60: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
8f70: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d  );.  return z;.}
8f80: 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 69 6e  ../*.** Print in
8f90: 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
8fa0: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
8fb0: 6d 61 6c 6c 6f 63 28 29 2e 20 20 4f 6d 69 74 20  malloc().  Omit 
8fc0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20  the internal.** 
8fd0: 25 2d 63 6f 6e 76 65 72 73 69 6f 6e 20 65 78 74  %-conversion ext
8fe0: 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 63 68 61 72  ensions..*/.char
8ff0: 20 2a 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e   *sqlite3_vmprin
9000: 74 66 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  tf(const char *z
9010: 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20  Format, va_list 
9020: 61 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  ap){.  char *z;.
9030: 20 20 63 68 61 72 20 7a 42 61 73 65 5b 53 51 4c    char zBase[SQL
9040: 49 54 45 5f 50 52 49 4e 54 5f 42 55 46 5f 53 49  ITE_PRINT_BUF_SI
9050: 5a 45 5d 3b 0a 20 20 53 74 72 41 63 63 75 6d 20  ZE];.  StrAccum 
9060: 61 63 63 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  acc;..#ifdef SQL
9070: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
9080: 52 4d 4f 52 20 20 0a 20 20 69 66 28 20 7a 46 6f  RMOR  .  if( zFo
9090: 72 6d 61 74 3d 3d 30 20 29 7b 0a 20 20 20 20 28  rmat==0 ){.    (
90a0: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
90b0: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
90c0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
90d0: 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
90e0: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20  _OMIT_AUTOINIT. 
90f0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69 6e 69   if( sqlite3_ini
9100: 74 69 61 6c 69 7a 65 28 29 20 29 20 72 65 74 75  tialize() ) retu
9110: 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 73  rn 0;.#endif.  s
9120: 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e  qlite3StrAccumIn
9130: 69 74 28 26 61 63 63 2c 20 30 2c 20 7a 42 61 73  it(&acc, 0, zBas
9140: 65 2c 20 73 69 7a 65 6f 66 28 7a 42 61 73 65 29  e, sizeof(zBase)
9150: 2c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  , SQLITE_MAX_LEN
9160: 47 54 48 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  GTH);.  sqlite3_
9170: 73 74 72 5f 76 61 70 70 65 6e 64 66 28 26 61 63  str_vappendf(&ac
9180: 63 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  c, zFormat, ap);
9190: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 53 74  .  z = sqlite3St
91a0: 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 61 63  rAccumFinish(&ac
91b0: 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a  c);.  return z;.
91c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 69  }../*.** Print i
91d0: 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69  nto memory obtai
91e0: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
91f0: 5f 6d 61 6c 6c 6f 63 28 29 28 29 2e 20 20 4f 6d  _malloc()().  Om
9200: 69 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a  it the internal.
9210: 2a 2a 20 25 2d 63 6f 6e 76 65 72 73 69 6f 6e 20  ** %-conversion 
9220: 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 63  extensions..*/.c
9230: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 6d 70 72  har *sqlite3_mpr
9240: 69 6e 74 66 28 63 6f 6e 73 74 20 63 68 61 72 20  intf(const char 
9250: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
9260: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
9270: 63 68 61 72 20 2a 7a 3b 0a 23 69 66 6e 64 65 66  char *z;.#ifndef
9280: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
9290: 4f 49 4e 49 54 0a 20 20 69 66 28 20 73 71 6c 69  OINIT.  if( sqli
92a0: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
92b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e   ) return 0;.#en
92c0: 64 69 66 0a 20 20 76 61 5f 73 74 61 72 74 28 61  dif.  va_start(a
92d0: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a  p, zFormat);.  z
92e0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69   = sqlite3_vmpri
92f0: 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29  ntf(zFormat, ap)
9300: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
9310: 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f    return z;.}../
9320: 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 73 6e 70  *.** sqlite3_snp
9330: 72 69 6e 74 66 28 29 20 77 6f 72 6b 73 20 6c 69  rintf() works li
9340: 6b 65 20 73 6e 70 72 69 6e 74 66 28 29 20 65 78  ke snprintf() ex
9350: 63 65 70 74 20 74 68 61 74 20 69 74 20 69 67 6e  cept that it ign
9360: 6f 72 65 73 20 74 68 65 0a 2a 2a 20 63 75 72 72  ores the.** curr
9370: 65 6e 74 20 6c 6f 63 61 6c 65 20 73 65 74 74 69  ent locale setti
9380: 6e 67 73 2e 20 20 54 68 69 73 20 69 73 20 69 6d  ngs.  This is im
9390: 70 6f 72 74 61 6e 74 20 66 6f 72 20 53 51 4c 69  portant for SQLi
93a0: 74 65 20 62 65 63 61 75 73 65 20 77 65 0a 2a 2a  te because we.**
93b0: 20 61 72 65 20 6e 6f 74 20 61 62 6c 65 20 74 6f   are not able to
93c0: 20 75 73 65 20 61 20 22 2c 22 20 61 73 20 74 68   use a "," as th
93d0: 65 20 64 65 63 69 6d 61 6c 20 70 6f 69 6e 74 20  e decimal point 
93e0: 69 6e 20 70 6c 61 63 65 20 6f 66 20 22 2e 22 20  in place of "." 
93f0: 61 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  as.** specified 
9400: 62 79 20 73 6f 6d 65 20 6c 6f 63 61 6c 65 73 2e  by some locales.
9410: 0a 2a 2a 0a 2a 2a 20 4f 6f 70 73 3a 20 20 54 68  .**.** Oops:  Th
9420: 65 20 66 69 72 73 74 20 74 77 6f 20 61 72 67 75  e first two argu
9430: 6d 65 6e 74 73 20 6f 66 20 73 71 6c 69 74 65 33  ments of sqlite3
9440: 5f 73 6e 70 72 69 6e 74 66 28 29 20 61 72 65 20  _snprintf() are 
9450: 62 61 63 6b 77 61 72 64 73 0a 2a 2a 20 66 72 6f  backwards.** fro
9460: 6d 20 74 68 65 20 73 6e 70 72 69 6e 74 66 28 29  m the snprintf()
9470: 20 73 74 61 6e 64 61 72 64 2e 20 20 55 6e 66 6f   standard.  Unfo
9480: 72 74 75 6e 61 74 65 6c 79 2c 20 69 74 20 69 73  rtunately, it is
9490: 20 74 6f 6f 20 6c 61 74 65 20 74 6f 20 63 68 61   too late to cha
94a0: 6e 67 65 0a 2a 2a 20 74 68 69 73 20 77 69 74 68  nge.** this with
94b0: 6f 75 74 20 62 72 65 61 6b 69 6e 67 20 63 6f 6d  out breaking com
94c0: 70 61 74 69 62 69 6c 69 74 79 2c 20 73 6f 20 77  patibility, so w
94d0: 65 20 6a 75 73 74 20 68 61 76 65 20 74 6f 20 6c  e just have to l
94e0: 69 76 65 20 77 69 74 68 20 74 68 65 0a 2a 2a 20  ive with the.** 
94f0: 6d 69 73 74 61 6b 65 2e 0a 2a 2a 0a 2a 2a 20 73  mistake..**.** s
9500: 71 6c 69 74 65 33 5f 76 73 6e 70 72 69 6e 74 66  qlite3_vsnprintf
9510: 28 29 20 69 73 20 74 68 65 20 76 61 72 61 72 67  () is the vararg
9520: 73 20 76 65 72 73 69 6f 6e 2e 0a 2a 2f 0a 63 68  s version..*/.ch
9530: 61 72 20 2a 73 71 6c 69 74 65 33 5f 76 73 6e 70  ar *sqlite3_vsnp
9540: 72 69 6e 74 66 28 69 6e 74 20 6e 2c 20 63 68 61  rintf(int n, cha
9550: 72 20 2a 7a 42 75 66 2c 20 63 6f 6e 73 74 20 63  r *zBuf, const c
9560: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61  har *zFormat, va
9570: 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20 53 74 72  _list ap){.  Str
9580: 41 63 63 75 6d 20 61 63 63 3b 0a 20 20 69 66 28  Accum acc;.  if(
9590: 20 6e 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 7a   n<=0 ) return z
95a0: 42 75 66 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  Buf;.#ifdef SQLI
95b0: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
95c0: 4d 4f 52 0a 20 20 69 66 28 20 7a 42 75 66 3d 3d  MOR.  if( zBuf==
95d0: 30 20 7c 7c 20 7a 46 6f 72 6d 61 74 3d 3d 30 20  0 || zFormat==0 
95e0: 29 20 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51  ) {.    (void)SQ
95f0: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
9600: 3b 0a 20 20 20 20 69 66 28 20 7a 42 75 66 20 29  ;.    if( zBuf )
9610: 20 7a 42 75 66 5b 30 5d 20 3d 20 30 3b 0a 20 20   zBuf[0] = 0;.  
9620: 20 20 72 65 74 75 72 6e 20 7a 42 75 66 3b 0a 20    return zBuf;. 
9630: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
9640: 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28  te3StrAccumInit(
9650: 26 61 63 63 2c 20 30 2c 20 7a 42 75 66 2c 20 6e  &acc, 0, zBuf, n
9660: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
9670: 73 74 72 5f 76 61 70 70 65 6e 64 66 28 26 61 63  str_vappendf(&ac
9680: 63 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  c, zFormat, ap);
9690: 0a 20 20 7a 42 75 66 5b 61 63 63 2e 6e 43 68 61  .  zBuf[acc.nCha
96a0: 72 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  r] = 0;.  return
96b0: 20 7a 42 75 66 3b 0a 7d 0a 63 68 61 72 20 2a 73   zBuf;.}.char *s
96c0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
96d0: 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 42 75  int n, char *zBu
96e0: 66 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  f, const char *z
96f0: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
9700: 63 68 61 72 20 2a 7a 3b 0a 20 20 76 61 5f 6c 69  char *z;.  va_li
9710: 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72  st ap;.  va_star
9720: 74 28 61 70 2c 7a 46 6f 72 6d 61 74 29 3b 0a 20  t(ap,zFormat);. 
9730: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 73 6e   z = sqlite3_vsn
9740: 70 72 69 6e 74 66 28 6e 2c 20 7a 42 75 66 2c 20  printf(n, zBuf, 
9750: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
9760: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65  va_end(ap);.  re
9770: 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn z;.}../*.**
9780: 20 54 68 69 73 20 69 73 20 74 68 65 20 72 6f 75   This is the rou
9790: 74 69 6e 65 20 74 68 61 74 20 61 63 74 75 61 6c  tine that actual
97a0: 6c 79 20 66 6f 72 6d 61 74 73 20 74 68 65 20 73  ly formats the s
97b0: 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 6d 65 73  qlite3_log() mes
97c0: 73 61 67 65 2e 0a 2a 2a 20 57 65 20 68 6f 75 73  sage..** We hous
97d0: 65 20 69 74 20 69 6e 20 61 20 73 65 70 61 72 61  e it in a separa
97e0: 74 65 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20  te routine from 
97f0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 74 6f  sqlite3_log() to
9800: 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20   avoid using.** 
9810: 73 74 61 63 6b 20 73 70 61 63 65 20 6f 6e 20 73  stack space on s
9820: 6d 61 6c 6c 2d 73 74 61 63 6b 20 73 79 73 74 65  mall-stack syste
9830: 6d 73 20 77 68 65 6e 20 6c 6f 67 67 69 6e 67 20  ms when logging 
9840: 69 73 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a  is disabled..**.
9850: 2a 2a 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29  ** sqlite3_log()
9860: 20 6d 75 73 74 20 72 65 6e 64 65 72 20 69 6e 74   must render int
9870: 6f 20 61 20 73 74 61 74 69 63 20 62 75 66 66 65  o a static buffe
9880: 72 2e 20 20 49 74 20 63 61 6e 6e 6f 74 20 64 79  r.  It cannot dy
9890: 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c  namically.** all
98a0: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 62 65 63  ocate memory bec
98b0: 61 75 73 65 20 69 74 20 6d 69 67 68 74 20 62 65  ause it might be
98c0: 20 63 61 6c 6c 65 64 20 77 68 69 6c 65 20 74 68   called while th
98d0: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
98e0: 6f 72 0a 2a 2a 20 6d 75 74 65 78 20 69 73 20 68  or.** mutex is h
98f0: 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74  eld..**.** sqlit
9900: 65 33 5f 73 74 72 5f 76 61 70 70 65 6e 64 66 28  e3_str_vappendf(
9910: 29 20 6d 69 67 68 74 20 61 73 6b 20 66 6f 72 20  ) might ask for 
9920: 2a 74 65 6d 70 6f 72 61 72 79 2a 20 6d 65 6d 6f  *temporary* memo
9930: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 66  ry allocations f
9940: 6f 72 0a 2a 2a 20 63 65 72 74 61 69 6e 20 66 6f  or.** certain fo
9950: 72 6d 61 74 20 63 68 61 72 61 63 74 65 72 73 20  rmat characters 
9960: 28 25 71 29 20 6f 72 20 66 6f 72 20 76 65 72 79  (%q) or for very
9970: 20 6c 61 72 67 65 20 70 72 65 63 69 73 69 6f 6e   large precision
9980: 73 20 6f 72 20 77 69 64 74 68 73 2e 0a 2a 2a 20  s or widths..** 
9990: 43 61 72 65 20 6d 75 73 74 20 62 65 20 74 61 6b  Care must be tak
99a0: 65 6e 20 74 68 61 74 20 61 6e 79 20 73 71 6c 69  en that any sqli
99b0: 74 65 33 5f 6c 6f 67 28 29 20 63 61 6c 6c 73 20  te3_log() calls 
99c0: 74 68 61 74 20 6f 63 63 75 72 20 77 68 69 6c 65  that occur while
99d0: 20 74 68 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d   the.** memory m
99e0: 75 74 65 78 20 69 73 20 68 65 6c 64 20 64 6f 20  utex is held do 
99f0: 6e 6f 74 20 75 73 65 20 74 68 65 73 65 20 6d 65  not use these me
9a00: 63 68 61 6e 69 73 6d 73 2e 0a 2a 2f 0a 73 74 61  chanisms..*/.sta
9a10: 74 69 63 20 76 6f 69 64 20 72 65 6e 64 65 72 4c  tic void renderL
9a20: 6f 67 4d 73 67 28 69 6e 74 20 69 45 72 72 43 6f  ogMsg(int iErrCo
9a30: 64 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  de, const char *
9a40: 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74  zFormat, va_list
9a50: 20 61 70 29 7b 0a 20 20 53 74 72 41 63 63 75 6d   ap){.  StrAccum
9a60: 20 61 63 63 3b 20 20 20 20 20 20 20 20 20 20 20   acc;           
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9a80: 2a 20 53 74 72 69 6e 67 20 61 63 63 75 6d 75 6c  * String accumul
9a90: 61 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 7a  ator */.  char z
9aa0: 4d 73 67 5b 53 51 4c 49 54 45 5f 50 52 49 4e 54  Msg[SQLITE_PRINT
9ab0: 5f 42 55 46 5f 53 49 5a 45 2a 33 5d 3b 20 20 20  _BUF_SIZE*3];   
9ac0: 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 6c 6f 67   /* Complete log
9ad0: 20 6d 65 73 73 61 67 65 20 2a 2f 0a 0a 20 20 73   message */..  s
9ae0: 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e  qlite3StrAccumIn
9af0: 69 74 28 26 61 63 63 2c 20 30 2c 20 7a 4d 73 67  it(&acc, 0, zMsg
9b00: 2c 20 73 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20  , sizeof(zMsg), 
9b10: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  0);.  sqlite3_st
9b20: 72 5f 76 61 70 70 65 6e 64 66 28 26 61 63 63 2c  r_vappendf(&acc,
9b30: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
9b40: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
9b50: 6e 66 69 67 2e 78 4c 6f 67 28 73 71 6c 69 74 65  nfig.xLog(sqlite
9b60: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 4c  3GlobalConfig.pL
9b70: 6f 67 41 72 67 2c 20 69 45 72 72 43 6f 64 65 2c  ogArg, iErrCode,
9b80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9b90: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
9ba0: 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73  te3StrAccumFinis
9bb0: 68 28 26 61 63 63 29 29 3b 0a 7d 0a 0a 2f 2a 0a  h(&acc));.}../*.
9bc0: 2a 2a 20 46 6f 72 6d 61 74 20 61 6e 64 20 77 72  ** Format and wr
9bd0: 69 74 65 20 61 20 6d 65 73 73 61 67 65 20 74 6f  ite a message to
9be0: 20 74 68 65 20 6c 6f 67 20 69 66 20 6c 6f 67 67   the log if logg
9bf0: 69 6e 67 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a  ing is enabled..
9c00: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  */.void sqlite3_
9c10: 6c 6f 67 28 69 6e 74 20 69 45 72 72 43 6f 64 65  log(int iErrCode
9c20: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
9c30: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
9c40: 61 5f 6c 69 73 74 20 61 70 3b 20 20 20 20 20 20  a_list ap;      
9c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c60: 20 20 20 20 20 20 20 2f 2a 20 56 61 72 61 72 67         /* Vararg
9c70: 20 6c 69 73 74 20 2a 2f 0a 20 20 69 66 28 20 73   list */.  if( s
9c80: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
9c90: 69 67 2e 78 4c 6f 67 20 29 7b 0a 20 20 20 20 76  ig.xLog ){.    v
9ca0: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
9cb0: 6d 61 74 29 3b 0a 20 20 20 20 72 65 6e 64 65 72  mat);.    render
9cc0: 4c 6f 67 4d 73 67 28 69 45 72 72 43 6f 64 65 2c  LogMsg(iErrCode,
9cd0: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
9ce0: 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
9cf0: 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65   }.}..#if define
9d00: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
9d10: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
9d20: 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45 29  E_HAVE_OS_TRACE)
9d30: 0a 2f 2a 0a 2a 2a 20 41 20 76 65 72 73 69 6f 6e  ./*.** A version
9d40: 20 6f 66 20 70 72 69 6e 74 66 28 29 20 74 68 61   of printf() tha
9d50: 74 20 75 6e 64 65 72 73 74 61 6e 64 73 20 25 6c  t understands %l
9d60: 6c 64 2e 20 20 55 73 65 64 20 66 6f 72 20 64 65  ld.  Used for de
9d70: 62 75 67 67 69 6e 67 2e 0a 2a 2a 20 54 68 65 20  bugging..** The 
9d80: 70 72 69 6e 74 66 28 29 20 62 75 69 6c 74 20 69  printf() built i
9d90: 6e 74 6f 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e  nto some version
9da0: 73 20 6f 66 20 77 69 6e 64 6f 77 73 20 64 6f 65  s of windows doe
9db0: 73 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64  s not understand
9dc0: 20 25 6c 6c 64 0a 2a 2a 20 61 6e 64 20 73 65 67   %lld.** and seg
9dd0: 66 61 75 6c 74 73 20 69 66 20 79 6f 75 20 67 69  faults if you gi
9de0: 76 65 20 69 74 20 61 20 6c 6f 6e 67 20 6c 6f 6e  ve it a long lon
9df0: 67 20 69 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  g int..*/.void s
9e00: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
9e10: 66 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  f(const char *zF
9e20: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
9e30: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 53 74 72  a_list ap;.  Str
9e40: 41 63 63 75 6d 20 61 63 63 3b 0a 20 20 63 68 61  Accum acc;.  cha
9e50: 72 20 7a 42 75 66 5b 35 30 30 5d 3b 0a 20 20 73  r zBuf[500];.  s
9e60: 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e  qlite3StrAccumIn
9e70: 69 74 28 26 61 63 63 2c 20 30 2c 20 7a 42 75 66  it(&acc, 0, zBuf
9e80: 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20  , sizeof(zBuf), 
9e90: 30 29 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  0);.  va_start(a
9ea0: 70 2c 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 73 71  p,zFormat);.  sq
9eb0: 6c 69 74 65 33 5f 73 74 72 5f 76 61 70 70 65 6e  lite3_str_vappen
9ec0: 64 66 28 26 61 63 63 2c 20 7a 46 6f 72 6d 61 74  df(&acc, zFormat
9ed0: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
9ee0: 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74  ap);.  sqlite3St
9ef0: 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 61 63  rAccumFinish(&ac
9f00: 63 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  c);.#ifdef SQLIT
9f10: 45 5f 4f 53 5f 54 52 41 43 45 5f 50 52 4f 43 0a  E_OS_TRACE_PROC.
9f20: 20 20 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 76    {.    extern v
9f30: 6f 69 64 20 53 51 4c 49 54 45 5f 4f 53 5f 54 52  oid SQLITE_OS_TR
9f40: 41 43 45 5f 50 52 4f 43 28 63 6f 6e 73 74 20 63  ACE_PROC(const c
9f50: 68 61 72 20 2a 7a 42 75 66 2c 20 69 6e 74 20 6e  har *zBuf, int n
9f60: 42 75 66 29 3b 0a 20 20 20 20 53 51 4c 49 54 45  Buf);.    SQLITE
9f70: 5f 4f 53 5f 54 52 41 43 45 5f 50 52 4f 43 28 7a  _OS_TRACE_PROC(z
9f80: 42 75 66 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66  Buf, sizeof(zBuf
9f90: 29 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ));.  }.#else.  
9fa0: 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 22  fprintf(stdout,"
9fb0: 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20 20 66 66  %s", zBuf);.  ff
9fc0: 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 23 65  lush(stdout);.#e
9fd0: 6e 64 69 66 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ndif.}.#endif...
9fe0: 2f 2a 0a 2a 2a 20 76 61 72 69 61 62 6c 65 2d 61  /*.** variable-a
9ff0: 72 67 75 6d 65 6e 74 20 77 72 61 70 70 65 72 20  rgument wrapper 
a000: 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 5f 73  around sqlite3_s
a010: 74 72 5f 76 61 70 70 65 6e 64 66 28 29 2e 20 54  tr_vappendf(). T
a020: 68 65 20 62 46 6c 61 67 73 20 61 72 67 75 6d 65  he bFlags argume
a030: 6e 74 0a 2a 2a 20 63 61 6e 20 63 6f 6e 74 61 69  nt.** can contai
a040: 6e 20 74 68 65 20 62 69 74 20 53 51 4c 49 54 45  n the bit SQLITE
a050: 5f 50 52 49 4e 54 46 5f 49 4e 54 45 52 4e 41 4c  _PRINTF_INTERNAL
a060: 20 65 6e 61 62 6c 65 20 69 6e 74 65 72 6e 61 6c   enable internal
a070: 20 66 6f 72 6d 61 74 73 2e 0a 2a 2f 0a 76 6f 69   formats..*/.voi
a080: 64 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70  d sqlite3_str_ap
a090: 70 65 6e 64 66 28 53 74 72 41 63 63 75 6d 20 2a  pendf(StrAccum *
a0a0: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
a0b0: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
a0c0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61  va_list ap;.  va
a0d0: 5f 73 74 61 72 74 28 61 70 2c 7a 46 6f 72 6d 61  _start(ap,zForma
a0e0: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  t);.  sqlite3_st
a0f0: 72 5f 76 61 70 70 65 6e 64 66 28 70 2c 20 7a 46  r_vappendf(p, zF
a100: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61  ormat, ap);.  va
a110: 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a              _end(ap);.}.