/ Hex Artifact Content
Login

Artifact a7ec02da4494c59dfd071126dd3726be5a11459d:


0000: 2f 2a 0a 2a 2a 20 32 30 31 31 2d 30 37 2d 30 39  /*.** 2011-07-09
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
0170: 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63 6f 6e  ** This file con
0180: 74 61 69 6e 73 20 63 6f 64 65 20 66 6f 72 20 74  tains code for t
0190: 68 65 20 56 64 62 65 53 6f 72 74 65 72 20 6f 62  he VdbeSorter ob
01a0: 6a 65 63 74 2c 20 75 73 65 64 20 69 6e 20 63 6f  ject, used in co
01b0: 6e 63 65 72 74 20 77 69 74 68 0a 2a 2a 20 61 20  ncert with.** a 
01c0: 56 64 62 65 43 75 72 73 6f 72 20 74 6f 20 73 6f  VdbeCursor to so
01d0: 72 74 20 6c 61 72 67 65 20 6e 75 6d 62 65 72 73  rt large numbers
01e0: 20 6f 66 20 6b 65 79 73 20 66 6f 72 20 43 52 45   of keys for CRE
01f0: 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
0200: 65 6e 74 73 0a 2a 2a 20 6f 72 20 62 79 20 53 45  ents.** or by SE
0210: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
0220: 77 69 74 68 20 4f 52 44 45 52 20 42 59 20 63 6c  with ORDER BY cl
0230: 61 75 73 65 73 20 74 68 61 74 20 63 61 6e 6e 6f  auses that canno
0240: 74 20 62 65 20 73 61 74 69 73 66 69 65 64 0a 2a  t be satisfied.*
0250: 2a 20 75 73 69 6e 67 20 69 6e 64 65 78 65 73 20  * using indexes 
0260: 61 6e 64 20 77 69 74 68 6f 75 74 20 4c 49 4d 49  and without LIMI
0270: 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  T clauses..**.**
0280: 20 54 68 65 20 56 64 62 65 53 6f 72 74 65 72 20   The VdbeSorter 
0290: 6f 62 6a 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74  object implement
02a0: 73 20 61 20 6d 75 6c 74 69 2d 74 68 72 65 61 64  s a multi-thread
02b0: 65 64 20 65 78 74 65 72 6e 61 6c 20 6d 65 72 67  ed external merg
02c0: 65 20 73 6f 72 74 0a 2a 2a 20 61 6c 67 6f 72 69  e sort.** algori
02d0: 74 68 6d 20 74 68 61 74 20 69 73 20 65 66 66 69  thm that is effi
02e0: 63 69 65 6e 74 20 65 76 65 6e 20 69 66 20 74 68  cient even if th
02f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
0300: 65 6e 74 73 20 62 65 69 6e 67 20 73 6f 72 74 65  ents being sorte
0310: 64 0a 2a 2a 20 65 78 63 65 65 64 73 20 74 68 65  d.** exceeds the
0320: 20 61 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72   available memor
0330: 79 2e 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69 73  y..**.** Here is
0340: 20 74 68 65 20 28 69 6e 74 65 72 6e 61 6c 2c 20   the (internal, 
0350: 6e 6f 6e 2d 41 50 49 29 20 69 6e 74 65 72 66 61  non-API) interfa
0360: 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
0370: 6d 6f 64 75 6c 65 20 61 6e 64 20 74 68 65 0a 2a  module and the.*
0380: 2a 20 72 65 73 74 20 6f 66 20 74 68 65 20 53 51  * rest of the SQ
0390: 4c 69 74 65 20 73 79 73 74 65 6d 3a 0a 2a 2a 0a  Lite system:.**.
03a0: 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  **    sqlite3Vdb
03b0: 65 53 6f 72 74 65 72 49 6e 69 74 28 29 20 20 20  eSorterInit()   
03c0: 20 20 20 20 43 72 65 61 74 65 20 61 20 6e 65 77      Create a new
03d0: 20 56 64 62 65 53 6f 72 74 65 72 20 6f 62 6a 65   VdbeSorter obje
03e0: 63 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c  ct..**.**    sql
03f0: 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 57 72  ite3VdbeSorterWr
0400: 69 74 65 28 29 20 20 20 20 20 20 41 64 64 20 61  ite()      Add a
0410: 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 6f 77 20   single new row 
0420: 74 6f 20 74 68 65 20 56 64 62 65 53 6f 72 74 65  to the VdbeSorte
0430: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
0440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0450: 20 20 20 20 20 20 6f 62 6a 65 63 74 2e 20 20 54        object.  T
0460: 68 65 20 72 6f 77 20 69 73 20 61 20 62 69 6e 61  he row is a bina
0470: 72 79 20 62 6c 6f 62 20 69 6e 20 74 68 65 0a 2a  ry blob in the.*
0480: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04a0: 20 20 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64     OP_MakeRecord
04b0: 20 66 6f 72 6d 61 74 20 74 68 61 74 20 63 6f 6e   format that con
04c0: 74 61 69 6e 73 20 62 6f 74 68 0a 2a 2a 20 20 20  tains both.**   
04d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
04f0: 68 65 20 4f 52 44 45 52 20 42 59 20 6b 65 79 20  he ORDER BY key 
0500: 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 72 65 73 75  columns and resu
0510: 6c 74 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 20 20  lt columns.**   
0520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
0540: 6e 20 74 68 65 20 63 61 73 65 20 6f 66 20 61 20  n the case of a 
0550: 53 45 4c 45 43 54 20 77 2f 20 4f 52 44 45 52 20  SELECT w/ ORDER 
0560: 42 59 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  BY, or.**       
0570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0580: 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 63             the c
0590: 6f 6d 70 6c 65 74 65 20 72 65 63 6f 72 64 20 66  omplete record f
05a0: 6f 72 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72  or an index entr
05b0: 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  y.**            
05c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05d0: 20 20 20 20 20 20 69 6e 20 74 68 65 20 63 61 73        in the cas
05e0: 65 20 6f 66 20 61 20 43 52 45 41 54 45 20 49 4e  e of a CREATE IN
05f0: 44 45 58 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71  DEX..**.**    sq
0600: 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 52  lite3VdbeSorterR
0610: 65 77 69 6e 64 28 29 20 20 20 20 20 53 6f 72 74  ewind()     Sort
0620: 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 70 72 65   all content pre
0630: 76 69 6f 75 73 6c 79 20 61 64 64 65 64 2e 0a 2a  viously added..*
0640: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0660: 20 20 20 50 6f 73 69 74 69 6f 6e 20 74 68 65 20     Position the 
0670: 72 65 61 64 20 63 75 72 73 6f 72 20 6f 6e 20 74  read cursor on t
0680: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
0690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06a0: 20 20 20 20 20 20 20 66 69 72 73 74 20 73 6f 72         first sor
06b0: 74 65 64 20 65 6c 65 6d 65 6e 74 2e 0a 2a 2a 0a  ted element..**.
06c0: 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  **    sqlite3Vdb
06d0: 65 53 6f 72 74 65 72 4e 65 78 74 28 29 20 20 20  eSorterNext()   
06e0: 20 20 20 20 41 64 76 61 6e 63 65 20 74 68 65 20      Advance the 
06f0: 72 65 61 64 20 63 75 72 73 6f 72 20 74 6f 20 74  read cursor to t
0700: 68 65 20 6e 65 78 74 20 73 6f 72 74 65 64 0a 2a  he next sorted.*
0710: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0730: 20 20 20 65 6c 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a     element..**.*
0740: 2a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  *    sqlite3Vdbe
0750: 53 6f 72 74 65 72 52 6f 77 6b 65 79 28 29 20 20  SorterRowkey()  
0760: 20 20 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f     Return the co
0770: 6d 70 6c 65 74 65 20 62 69 6e 61 72 79 20 62 6c  mplete binary bl
0780: 6f 62 20 66 6f 72 20 74 68 65 0a 2a 2a 20 20 20  ob for the.**   
0790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
07b0: 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  ow currently und
07c0: 65 72 20 74 68 65 20 72 65 61 64 20 63 75 72 73  er the read curs
07d0: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c  or..**.**    sql
07e0: 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 43 6f  ite3VdbeSorterCo
07f0: 6d 70 61 72 65 28 29 20 20 20 20 43 6f 6d 70 61  mpare()    Compa
0800: 72 65 20 74 68 65 20 62 69 6e 61 72 79 20 62 6c  re the binary bl
0810: 6f 62 20 66 6f 72 20 74 68 65 20 72 6f 77 0a 2a  ob for the row.*
0820: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0840: 20 20 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64     currently und
0850: 65 72 20 74 68 65 20 72 65 61 64 20 63 75 72 73  er the read curs
0860: 6f 72 20 61 67 61 69 6e 73 74 0a 2a 2a 20 20 20  or against.**   
0870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
0890: 6e 6f 74 68 65 72 20 62 69 6e 61 72 79 20 62 6c  nother binary bl
08a0: 6f 62 20 58 20 61 6e 64 20 72 65 70 6f 72 74 20  ob X and report 
08b0: 69 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  if.**           
08c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08d0: 20 20 20 20 20 20 20 58 20 69 73 20 73 74 72 69         X is stri
08e0: 63 74 6c 79 20 6c 65 73 73 20 74 68 61 6e 20 74  ctly less than t
08f0: 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 2e 0a  he read cursor..
0900: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0920: 20 20 20 20 55 73 65 64 20 74 6f 20 65 6e 66 6f      Used to enfo
0930: 72 63 65 20 75 6e 69 71 75 65 6e 65 73 73 20 69  rce uniqueness i
0940: 6e 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  n a.**          
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0960: 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20 55          CREATE U
0970: 4e 49 51 55 45 20 49 4e 44 45 58 20 73 74 61 74  NIQUE INDEX stat
0980: 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ement..**.**    
0990: 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65  sqlite3VdbeSorte
09a0: 72 43 6c 6f 73 65 28 29 20 20 20 20 20 20 43 6c  rClose()      Cl
09b0: 6f 73 65 20 74 68 65 20 56 64 62 65 53 6f 72 74  ose the VdbeSort
09c0: 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65  er object and re
09d0: 63 6c 61 69 6d 0a 2a 2a 20 20 20 20 20 20 20 20  claim.**        
09e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09f0: 20 20 20 20 20 20 20 20 20 20 61 6c 6c 20 72 65            all re
0a00: 73 6f 75 72 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  sources..**.**  
0a10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72    sqlite3VdbeSor
0a20: 74 65 72 52 65 73 65 74 28 29 20 20 20 20 20 20  terReset()      
0a30: 52 65 66 75 72 62 69 73 68 20 74 68 65 20 56 64  Refurbish the Vd
0a40: 62 65 53 6f 72 74 65 72 20 66 6f 72 20 72 65 75  beSorter for reu
0a50: 73 65 2e 20 20 54 68 69 73 0a 2a 2a 20 20 20 20  se.  This.**    
0a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
0a80: 20 6c 69 6b 65 20 43 6c 6f 73 65 28 29 20 66 6f   like Close() fo
0a90: 6c 6c 6f 77 65 64 20 62 79 20 49 6e 69 74 28 29  llowed by Init()
0aa0: 20 6f 6e 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20   only.**        
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ac0: 20 20 20 20 20 20 20 20 20 20 6d 75 63 68 20 66            much f
0ad0: 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  aster..**.** The
0ae0: 20 69 6e 74 65 72 66 61 63 65 73 20 61 62 6f 76   interfaces abov
0af0: 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  e must be called
0b00: 20 69 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   in a particular
0b10: 20 6f 72 64 65 72 2e 20 20 57 72 69 74 65 28 29   order.  Write()
0b20: 20 63 61 6e 20 0a 2a 2a 20 6f 6e 6c 79 20 6f 63   can .** only oc
0b30: 63 75 72 20 69 6e 20 62 65 74 77 65 65 6e 20 49  cur in between I
0b40: 6e 69 74 28 29 2f 52 65 73 65 74 28 29 20 61 6e  nit()/Reset() an
0b50: 64 20 52 65 77 69 6e 64 28 29 2e 20 20 4e 65 78  d Rewind().  Nex
0b60: 74 28 29 2c 20 52 6f 77 6b 65 79 28 29 2c 20 61  t(), Rowkey(), a
0b70: 6e 64 0a 2a 2a 20 43 6f 6d 70 61 72 65 28 29 20  nd.** Compare() 
0b80: 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69  can only occur i
0b90: 6e 20 62 65 74 77 65 65 6e 20 52 65 77 69 6e 64  n between Rewind
0ba0: 28 29 20 61 6e 64 20 43 6c 6f 73 65 28 29 2f 52  () and Close()/R
0bb0: 65 73 65 74 28 29 2e 20 69 2e 65 2e 0a 2a 2a 0a  eset(). i.e..**.
0bc0: 2a 2a 20 20 20 49 6e 69 74 28 29 0a 2a 2a 20 20  **   Init().**  
0bd0: 20 66 6f 72 20 65 61 63 68 20 72 65 63 6f 72 64   for each record
0be0: 3a 20 57 72 69 74 65 28 29 0a 2a 2a 20 20 20 52  : Write().**   R
0bf0: 65 77 69 6e 64 28 29 0a 2a 2a 20 20 20 20 20 52  ewind().**     R
0c00: 6f 77 6b 65 79 28 29 2f 43 6f 6d 70 61 72 65 28  owkey()/Compare(
0c10: 29 0a 2a 2a 20 20 20 4e 65 78 74 28 29 20 0a 2a  ).**   Next() .*
0c20: 2a 20 20 20 43 6c 6f 73 65 28 29 0a 2a 2a 0a 2a  *   Close().**.*
0c30: 2a 20 41 6c 67 6f 72 69 74 68 6d 3a 0a 2a 2a 0a  * Algorithm:.**.
0c40: 2a 2a 20 52 65 63 6f 72 64 73 20 70 61 73 73 65  ** Records passe
0c50: 64 20 74 6f 20 74 68 65 20 73 6f 72 74 65 72 20  d to the sorter 
0c60: 76 69 61 20 63 61 6c 6c 73 20 74 6f 20 57 72 69  via calls to Wri
0c70: 74 65 28 29 20 61 72 65 20 69 6e 69 74 69 61 6c  te() are initial
0c80: 6c 79 20 68 65 6c 64 20 0a 2a 2a 20 75 6e 73 6f  ly held .** unso
0c90: 72 74 65 64 20 69 6e 20 6d 61 69 6e 20 6d 65 6d  rted in main mem
0ca0: 6f 72 79 2e 20 41 73 73 75 6d 69 6e 67 20 74 68  ory. Assuming th
0cb0: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f  e amount of memo
0cc0: 72 79 20 75 73 65 64 20 6e 65 76 65 72 20 65 78  ry used never ex
0cd0: 63 65 65 64 73 0a 2a 2a 20 61 20 74 68 72 65 73  ceeds.** a thres
0ce0: 68 6f 6c 64 2c 20 77 68 65 6e 20 52 65 77 69 6e  hold, when Rewin
0cf0: 64 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 68  d() is called th
0d00: 65 20 73 65 74 20 6f 66 20 72 65 63 6f 72 64 73  e set of records
0d10: 20 69 73 20 73 6f 72 74 65 64 20 75 73 69 6e 67   is sorted using
0d20: 0a 2a 2a 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  .** an in-memory
0d30: 20 6d 65 72 67 65 20 73 6f 72 74 2e 20 49 6e 20   merge sort. In 
0d40: 74 68 69 73 20 63 61 73 65 2c 20 6e 6f 20 74 65  this case, no te
0d50: 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61 72  mporary files ar
0d60: 65 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 61 6e  e required.** an
0d70: 64 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  d subsequent cal
0d80: 6c 73 20 74 6f 20 52 6f 77 6b 65 79 28 29 2c 20  ls to Rowkey(), 
0d90: 4e 65 78 74 28 29 20 61 6e 64 20 43 6f 6d 70 61  Next() and Compa
0da0: 72 65 28 29 20 72 65 61 64 20 72 65 63 6f 72 64  re() read record
0db0: 73 20 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20 66  s .** directly f
0dc0: 72 6f 6d 20 6d 61 69 6e 20 6d 65 6d 6f 72 79 2e  rom main memory.
0dd0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 61 6d  .**.** If the am
0de0: 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 75 73  ount of space us
0df0: 65 64 20 74 6f 20 73 74 6f 72 65 20 72 65 63 6f  ed to store reco
0e00: 72 64 73 20 69 6e 20 6d 61 69 6e 20 6d 65 6d 6f  rds in main memo
0e10: 72 79 20 65 78 63 65 65 64 73 20 74 68 65 0a 2a  ry exceeds the.*
0e20: 2a 20 74 68 72 65 73 68 6f 6c 64 2c 20 74 68 65  * threshold, the
0e30: 6e 20 74 68 65 20 73 65 74 20 6f 66 20 72 65 63  n the set of rec
0e40: 6f 72 64 73 20 63 75 72 72 65 6e 74 6c 79 20 69  ords currently i
0e50: 6e 20 6d 65 6d 6f 72 79 20 61 72 65 20 73 6f 72  n memory are sor
0e60: 74 65 64 20 61 6e 64 0a 2a 2a 20 77 72 69 74 74  ted and.** writt
0e70: 65 6e 20 74 6f 20 61 20 74 65 6d 70 6f 72 61 72  en to a temporar
0e80: 79 20 66 69 6c 65 20 69 6e 20 22 50 61 63 6b 65  y file in "Packe
0e90: 64 20 4d 65 6d 6f 72 79 20 41 72 72 61 79 22 20  d Memory Array" 
0ea0: 28 50 4d 41 29 20 66 6f 72 6d 61 74 2e 0a 2a 2a  (PMA) format..**
0eb0: 20 41 20 50 4d 41 20 63 72 65 61 74 65 64 20 61   A PMA created a
0ec0: 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 73 20  t this point is 
0ed0: 6b 6e 6f 77 6e 20 61 73 20 61 20 22 6c 65 76 65  known as a "leve
0ee0: 6c 2d 30 20 50 4d 41 22 2e 20 48 69 67 68 65 72  l-0 PMA". Higher
0ef0: 20 6c 65 76 65 6c 73 0a 2a 2a 20 6f 66 20 50 4d   levels.** of PM
0f00: 41 73 20 6d 61 79 20 62 65 20 63 72 65 61 74 65  As may be create
0f10: 64 20 62 79 20 6d 65 72 67 69 6e 67 20 65 78 69  d by merging exi
0f20: 73 74 69 6e 67 20 50 4d 41 73 20 74 6f 67 65 74  sting PMAs toget
0f30: 68 65 72 20 2d 20 66 6f 72 20 65 78 61 6d 70 6c  her - for exampl
0f40: 65 0a 2a 2a 20 6d 65 72 67 69 6e 67 20 74 77 6f  e.** merging two
0f50: 20 6f 72 20 6d 6f 72 65 20 6c 65 76 65 6c 2d 30   or more level-0
0f60: 20 50 4d 41 73 20 74 6f 67 65 74 68 65 72 20 63   PMAs together c
0f70: 72 65 61 74 65 73 20 61 20 6c 65 76 65 6c 2d 31  reates a level-1
0f80: 20 50 4d 41 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   PMA..**.** The 
0f90: 74 68 72 65 73 68 6f 6c 64 20 66 6f 72 20 74 68  threshold for th
0fa0: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 61 69 6e  e amount of main
0fb0: 20 6d 65 6d 6f 72 79 20 74 6f 20 75 73 65 20 62   memory to use b
0fc0: 65 66 6f 72 65 20 66 6c 75 73 68 69 6e 67 20 0a  efore flushing .
0fd0: 2a 2a 20 72 65 63 6f 72 64 73 20 74 6f 20 61 20  ** records to a 
0fe0: 50 4d 41 20 69 73 20 72 6f 75 67 68 6c 79 20 74  PMA is roughly t
0ff0: 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 6c  he same as the l
1000: 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20  imit configured 
1010: 66 6f 72 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d  for the.** page-
1020: 63 61 63 68 65 20 6f 66 20 74 68 65 20 6d 61 69  cache of the mai
1030: 6e 20 64 61 74 61 62 61 73 65 2e 20 53 70 65 63  n database. Spec
1040: 69 66 69 63 61 6c 6c 79 2c 20 74 68 65 20 74 68  ifically, the th
1050: 72 65 73 68 6f 6c 64 20 69 73 20 73 65 74 20 74  reshold is set t
1060: 6f 20 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  o .** the value 
1070: 72 65 74 75 72 6e 65 64 20 62 79 20 22 50 52 41  returned by "PRA
1080: 47 4d 41 20 6d 61 69 6e 2e 70 61 67 65 5f 73 69  GMA main.page_si
1090: 7a 65 22 20 6d 75 6c 74 69 70 6c 65 64 20 62 79  ze" multipled by
10a0: 20 0a 2a 2a 20 74 68 61 74 20 72 65 74 75 72 6e   .** that return
10b0: 65 64 20 62 79 20 22 50 52 41 47 4d 41 20 6d 61  ed by "PRAGMA ma
10c0: 69 6e 2e 63 61 63 68 65 5f 73 69 7a 65 22 2c 20  in.cache_size", 
10d0: 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  in bytes..**.** 
10e0: 49 66 20 74 68 65 20 73 6f 72 74 65 72 20 69 73  If the sorter is
10f0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 69 6e 67   running in sing
1100: 6c 65 2d 74 68 72 65 61 64 65 64 20 6d 6f 64 65  le-threaded mode
1110: 2c 20 74 68 65 6e 20 61 6c 6c 20 50 4d 41 73 20  , then all PMAs 
1120: 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 61 72 65  generated.** are
1130: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 73   appended to a s
1140: 69 6e 67 6c 65 20 74 65 6d 70 6f 72 61 72 79 20  ingle temporary 
1150: 66 69 6c 65 2e 20 4f 72 2c 20 69 66 20 74 68 65  file. Or, if the
1160: 20 73 6f 72 74 65 72 20 69 73 20 72 75 6e 6e 69   sorter is runni
1170: 6e 67 20 69 6e 0a 2a 2a 20 6d 75 6c 74 69 2d 74  ng in.** multi-t
1180: 68 72 65 61 64 65 64 20 6d 6f 64 65 20 74 68 65  hreaded mode the
1190: 6e 20 75 70 20 74 6f 20 28 4e 2b 31 29 20 74 65  n up to (N+1) te
11a0: 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 6d 61  mporary files ma
11b0: 79 20 62 65 20 6f 70 65 6e 65 64 2c 20 77 68 65  y be opened, whe
11c0: 72 65 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 63  re.** N is the c
11d0: 6f 6e 66 69 67 75 72 65 64 20 6e 75 6d 62 65 72  onfigured number
11e0: 20 6f 66 20 77 6f 72 6b 65 72 20 74 68 72 65 61   of worker threa
11f0: 64 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ds. In this case
1200: 2c 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  , instead of.** 
1210: 73 6f 72 74 69 6e 67 20 74 68 65 20 72 65 63 6f  sorting the reco
1220: 72 64 73 20 61 6e 64 20 77 72 69 74 69 6e 67 20  rds and writing 
1230: 74 68 65 20 50 4d 41 20 74 6f 20 61 20 74 65 6d  the PMA to a tem
1240: 70 6f 72 61 72 79 20 66 69 6c 65 20 69 74 73 65  porary file itse
1250: 6c 66 2c 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69  lf, the.** calli
1260: 6e 67 20 74 68 72 65 61 64 20 75 73 75 61 6c 6c  ng thread usuall
1270: 79 20 6c 61 75 6e 63 68 65 73 20 61 20 77 6f 72  y launches a wor
1280: 6b 65 72 20 74 68 72 65 61 64 20 74 6f 20 64 6f  ker thread to do
1290: 20 73 6f 2e 20 45 78 63 65 70 74 2c 20 69 66 0a   so. Except, if.
12a0: 2a 2a 20 74 68 65 72 65 20 61 72 65 20 61 6c 72  ** there are alr
12b0: 65 61 64 79 20 4e 20 77 6f 72 6b 65 72 20 74 68  eady N worker th
12c0: 72 65 61 64 73 20 72 75 6e 6e 69 6e 67 2c 20 74  reads running, t
12d0: 68 65 20 6d 61 69 6e 20 74 68 72 65 61 64 20 64  he main thread d
12e0: 6f 65 73 20 74 68 65 20 77 6f 72 6b 0a 2a 2a 20  oes the work.** 
12f0: 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 54 68  itself..**.** Th
1300: 65 20 73 6f 72 74 65 72 20 69 73 20 72 75 6e 6e  e sorter is runn
1310: 69 6e 67 20 69 6e 20 6d 75 6c 74 69 2d 74 68 72  ing in multi-thr
1320: 65 61 64 65 64 20 6d 6f 64 65 20 69 66 20 28 61  eaded mode if (a
1330: 29 20 74 68 65 20 6c 69 62 72 61 72 79 20 77 61  ) the library wa
1340: 73 20 62 75 69 6c 74 0a 2a 2a 20 77 69 74 68 20  s built.** with 
1350: 70 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 73 79  pre-processor sy
1360: 6d 62 6f 6c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  mbol SQLITE_MAX_
1370: 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 20 73  WORKER_THREADS s
1380: 65 74 20 74 6f 20 61 20 76 61 6c 75 65 20 67 72  et to a value gr
1390: 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20 7a 65  eater.** than ze
13a0: 72 6f 2c 20 61 6e 64 20 28 62 29 20 77 6f 72 6b  ro, and (b) work
13b0: 65 72 20 74 68 72 65 61 64 73 20 68 61 76 65 20  er threads have 
13c0: 62 65 65 6e 20 65 6e 61 62 6c 65 64 20 61 74 20  been enabled at 
13d0: 72 75 6e 74 69 6d 65 20 62 79 20 63 61 6c 6c 69  runtime by calli
13e0: 6e 67 0a 2a 2a 20 22 50 52 41 47 4d 41 20 74 68  ng.** "PRAGMA th
13f0: 72 65 61 64 73 3d 4e 22 20 77 69 74 68 20 73 6f  reads=N" with so
1400: 6d 65 20 76 61 6c 75 65 20 6f 66 20 4e 20 67 72  me value of N gr
1410: 65 61 74 65 72 20 74 68 61 6e 20 30 2e 0a 2a 2a  eater than 0..**
1420: 0a 2a 2a 20 57 68 65 6e 20 52 65 77 69 6e 64 28  .** When Rewind(
1430: 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 61 6e 79  ) is called, any
1440: 20 64 61 74 61 20 72 65 6d 61 69 6e 69 6e 67 20   data remaining 
1450: 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 66 6c 75  in memory is flu
1460: 73 68 65 64 20 74 6f 20 61 20 0a 2a 2a 20 66 69  shed to a .** fi
1470: 6e 61 6c 20 50 4d 41 2e 20 53 6f 20 61 74 20 74  nal PMA. So at t
1480: 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 64 61  his point the da
1490: 74 61 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ta is stored in 
14a0: 73 6f 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 73  some number of s
14b0: 6f 72 74 65 64 0a 2a 2a 20 50 4d 41 73 20 77 69  orted.** PMAs wi
14c0: 74 68 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 66  thin temporary f
14d0: 69 6c 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a  iles on disk..**
14e0: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
14f0: 20 66 65 77 65 72 20 74 68 61 6e 20 53 4f 52 54   fewer than SORT
1500: 45 52 5f 4d 41 58 5f 4d 45 52 47 45 5f 43 4f 55  ER_MAX_MERGE_COU
1510: 4e 54 20 50 4d 41 73 20 69 6e 20 74 6f 74 61 6c  NT PMAs in total
1520: 20 61 6e 64 20 74 68 65 0a 2a 2a 20 73 6f 72 74   and the.** sort
1530: 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
1540: 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64   single-threaded
1550: 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 73   mode, then thes
1560: 65 20 50 4d 41 73 20 61 72 65 20 6d 65 72 67 65  e PMAs are merge
1570: 64 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c  d.** incremental
1580: 6c 79 20 61 73 20 6b 65 79 73 20 61 72 65 20 72  ly as keys are r
1590: 65 74 72 65 69 76 65 64 20 66 72 6f 6d 20 74 68  etreived from th
15a0: 65 20 73 6f 72 74 65 72 20 62 79 20 74 68 65 20  e sorter by the 
15b0: 56 44 42 45 2e 20 20 54 68 65 0a 2a 2a 20 4d 65  VDBE.  The.** Me
15c0: 72 67 65 45 6e 67 69 6e 65 20 6f 62 6a 65 63 74  rgeEngine object
15d0: 2c 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 66  , described in f
15e0: 75 72 74 68 65 72 20 64 65 74 61 69 6c 20 62 65  urther detail be
15f0: 6c 6f 77 2c 20 70 65 72 66 6f 72 6d 73 20 74 68  low, performs th
1600: 69 73 0a 2a 2a 20 6d 65 72 67 65 2e 0a 2a 2a 0a  is.** merge..**.
1610: 2a 2a 20 4f 72 2c 20 69 66 20 72 75 6e 6e 69 6e  ** Or, if runnin
1620: 67 20 69 6e 20 6d 75 6c 74 69 2d 74 68 72 65 61  g in multi-threa
1630: 64 65 64 20 6d 6f 64 65 2c 20 74 68 65 6e 20 61  ded mode, then a
1640: 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72 65   background thre
1650: 61 64 20 69 73 0a 2a 2a 20 6c 61 75 6e 63 68 65  ad is.** launche
1660: 64 20 74 6f 20 6d 65 72 67 65 20 74 68 65 20 65  d to merge the e
1670: 78 69 73 74 69 6e 67 20 50 4d 41 73 2e 20 4f 6e  xisting PMAs. On
1680: 63 65 20 74 68 65 20 62 61 63 6b 67 72 6f 75 6e  ce the backgroun
1690: 64 20 74 68 72 65 61 64 20 68 61 73 0a 2a 2a 20  d thread has.** 
16a0: 6d 65 72 67 65 64 20 54 20 62 79 74 65 73 20 6f  merged T bytes o
16b0: 66 20 64 61 74 61 20 69 6e 74 6f 20 61 20 73 69  f data into a si
16c0: 6e 67 6c 65 20 73 6f 72 74 65 64 20 50 4d 41 2c  ngle sorted PMA,
16d0: 20 74 68 65 20 6d 61 69 6e 20 74 68 72 65 61 64   the main thread
16e0: 20 0a 2a 2a 20 62 65 67 69 6e 73 20 72 65 61 64   .** begins read
16f0: 69 6e 67 20 6b 65 79 73 20 66 72 6f 6d 20 74 68  ing keys from th
1700: 61 74 20 50 4d 41 20 77 68 69 6c 65 20 74 68 65  at PMA while the
1710: 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72 65   background thre
1720: 61 64 20 70 72 6f 63 65 65 64 73 0a 2a 2a 20 77  ad proceeds.** w
1730: 69 74 68 20 6d 65 72 67 69 6e 67 20 74 68 65 20  ith merging the 
1740: 6e 65 78 74 20 54 20 62 79 74 65 73 20 6f 66 20  next T bytes of 
1750: 64 61 74 61 2e 20 41 6e 64 20 73 6f 20 6f 6e 2e  data. And so on.
1760: 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
1770: 20 54 20 69 73 20 73 65 74 20 74 6f 20 68 61 6c   T is set to hal
1780: 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  f the value of t
1790: 68 65 20 6d 65 6d 6f 72 79 20 74 68 72 65 73 68  he memory thresh
17a0: 6f 6c 64 20 75 73 65 64 20 0a 2a 2a 20 62 79 20  old used .** by 
17b0: 57 72 69 74 65 28 29 20 61 62 6f 76 65 20 74 6f  Write() above to
17c0: 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20   determine when 
17d0: 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
17e0: 50 4d 41 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  PMA..**.** If th
17f0: 65 72 65 20 61 72 65 20 6d 6f 72 65 20 74 68 61  ere are more tha
1800: 6e 20 53 4f 52 54 45 52 5f 4d 41 58 5f 4d 45 52  n SORTER_MAX_MER
1810: 47 45 5f 43 4f 55 4e 54 20 50 4d 41 73 20 69 6e  GE_COUNT PMAs in
1820: 20 74 6f 74 61 6c 20 77 68 65 6e 20 0a 2a 2a 20   total when .** 
1830: 52 65 77 69 6e 64 28 29 20 69 73 20 63 61 6c 6c  Rewind() is call
1840: 65 64 2c 20 74 68 65 6e 20 61 20 68 69 65 72 61  ed, then a hiera
1850: 72 63 68 79 20 6f 66 20 69 6e 63 72 65 6d 65 6e  rchy of incremen
1860: 74 61 6c 2d 6d 65 72 67 65 73 20 69 73 20 75 73  tal-merges is us
1870: 65 64 2e 20 0a 2a 2a 20 46 69 72 73 74 2c 20 54  ed. .** First, T
1880: 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66   bytes of data f
1890: 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 53 4f  rom the first SO
18a0: 52 54 45 52 5f 4d 41 58 5f 4d 45 52 47 45 5f 43  RTER_MAX_MERGE_C
18b0: 4f 55 4e 54 20 50 4d 41 73 20 6f 6e 20 0a 2a 2a  OUNT PMAs on .**
18c0: 20 64 69 73 6b 20 61 72 65 20 6d 65 72 67 65 64   disk are merged
18d0: 20 74 6f 67 65 74 68 65 72 2e 20 54 68 65 6e 20   together. Then 
18e0: 54 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  T bytes of data 
18f0: 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20  from the second 
1900: 73 65 74 2c 20 61 6e 64 0a 2a 2a 20 73 6f 20 6f  set, and.** so o
1910: 6e 2c 20 73 75 63 68 20 74 68 61 74 20 6e 6f 20  n, such that no 
1920: 6f 70 65 72 61 74 69 6f 6e 20 65 76 65 72 20 6d  operation ever m
1930: 65 72 67 65 73 20 6d 6f 72 65 20 74 68 61 6e 20  erges more than 
1940: 53 4f 52 54 45 52 5f 4d 41 58 5f 4d 45 52 47 45  SORTER_MAX_MERGE
1950: 5f 43 4f 55 4e 54 0a 2a 2a 20 50 4d 41 73 20 61  _COUNT.** PMAs a
1960: 74 20 61 20 74 69 6d 65 2e 20 54 68 69 73 20 64  t a time. This d
1970: 6f 6e 65 20 69 73 20 74 6f 20 69 6d 70 72 6f 76  one is to improv
1980: 65 20 6c 6f 63 61 6c 69 74 79 2e 0a 2a 2a 0a 2a  e locality..**.*
1990: 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20  * If running in 
19a0: 6d 75 6c 74 69 2d 74 68 72 65 61 64 65 64 20 6d  multi-threaded m
19b0: 6f 64 65 20 61 6e 64 20 74 68 65 72 65 20 61 72  ode and there ar
19c0: 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 53  e more than.** S
19d0: 4f 52 54 45 52 5f 4d 41 58 5f 4d 45 52 47 45 5f  ORTER_MAX_MERGE_
19e0: 43 4f 55 4e 54 20 50 4d 41 73 20 6f 6e 20 64 69  COUNT PMAs on di
19f0: 73 6b 20 77 68 65 6e 20 52 65 77 69 6e 64 28 29  sk when Rewind()
1a00: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e   is called, then
1a10: 20 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e 20 6f 6e   more.** than on
1a20: 65 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72  e background thr
1a30: 65 61 64 20 6d 61 79 20 62 65 20 63 72 65 61 74  ead may be creat
1a40: 65 64 2e 20 53 70 65 63 69 66 69 63 61 6c 6c 79  ed. Specifically
1a50: 2c 20 74 68 65 72 65 20 6d 61 79 20 62 65 0a 2a  , there may be.*
1a60: 2a 20 6f 6e 65 20 62 61 63 6b 67 72 6f 75 6e 64  * one background
1a70: 20 74 68 72 65 61 64 20 66 6f 72 20 65 61 63 68   thread for each
1a80: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
1a90: 6f 6e 20 64 69 73 6b 2c 20 61 6e 64 20 6f 6e 65  on disk, and one
1aa0: 20 62 61 63 6b 67 72 6f 75 6e 64 0a 2a 2a 20 74   background.** t
1ab0: 68 72 65 61 64 20 74 6f 20 6d 65 72 67 65 20 74  hread to merge t
1ac0: 68 65 20 6f 75 74 70 75 74 20 6f 66 20 65 61 63  he output of eac
1ad0: 68 20 6f 66 20 74 68 65 20 6f 74 68 65 72 73 20  h of the others 
1ae0: 74 6f 20 61 20 73 69 6e 67 6c 65 20 50 4d 41 20  to a single PMA 
1af0: 66 6f 72 0a 2a 2a 20 74 68 65 20 6d 61 69 6e 20  for.** the main 
1b00: 74 68 72 65 61 64 20 74 6f 20 72 65 61 64 20 66  thread to read f
1b10: 72 6f 6d 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  rom..*/.#include
1b20: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23   "sqliteInt.h".#
1b30: 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e 74  include "vdbeInt
1b40: 2e 68 22 0a 0a 2f 2a 20 0a 2a 2a 20 49 66 20 53  .h"../* .** If S
1b50: 51 4c 49 54 45 5f 44 45 42 55 47 5f 53 4f 52 54  QLITE_DEBUG_SORT
1b60: 45 52 5f 54 48 52 45 41 44 53 20 69 73 20 64 65  ER_THREADS is de
1b70: 66 69 6e 65 64 2c 20 74 68 69 73 20 6d 6f 64 75  fined, this modu
1b80: 6c 65 20 6f 75 74 70 75 74 73 20 76 61 72 69 6f  le outputs vario
1b90: 75 73 0a 2a 2a 20 6d 65 73 73 61 67 65 73 20 74  us.** messages t
1ba0: 6f 20 73 74 64 65 72 72 20 74 68 61 74 20 6d 61  o stderr that ma
1bb0: 79 20 62 65 20 68 65 6c 70 66 75 6c 20 69 6e 20  y be helpful in 
1bc0: 75 6e 64 65 72 73 74 61 6e 64 69 6e 67 20 74 68  understanding th
1bd0: 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a  e performance.**
1be0: 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
1bf0: 20 6f 66 20 74 68 65 20 73 6f 72 74 65 72 20 69   of the sorter i
1c00: 6e 20 6d 75 6c 74 69 2d 74 68 72 65 61 64 65 64  n multi-threaded
1c10: 20 6d 6f 64 65 2e 0a 2a 2f 0a 23 69 66 20 30 0a   mode..*/.#if 0.
1c20: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
1c30: 44 45 42 55 47 5f 53 4f 52 54 45 52 5f 54 48 52  DEBUG_SORTER_THR
1c40: 45 41 44 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f  EADS 1.#endif../
1c50: 2a 0a 2a 2a 20 48 61 72 64 2d 63 6f 64 65 64 20  *.** Hard-coded 
1c60: 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  maximum amount o
1c70: 66 20 64 61 74 61 20 74 6f 20 61 63 63 75 6d 75  f data to accumu
1c80: 6c 61 74 65 20 69 6e 20 6d 65 6d 6f 72 79 20 62  late in memory b
1c90: 65 66 6f 72 65 20 66 6c 75 73 68 69 6e 67 0a 2a  efore flushing.*
1ca0: 2a 20 74 6f 20 61 20 6c 65 76 65 6c 20 30 20 50  * to a level 0 P
1cb0: 4d 41 2e 20 54 68 65 20 70 75 72 70 6f 73 65 20  MA. The purpose 
1cc0: 6f 66 20 74 68 69 73 20 6c 69 6d 69 74 20 69 73  of this limit is
1cd0: 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61 72 69   to prevent vari
1ce0: 6f 75 73 20 69 6e 74 65 67 65 72 0a 2a 2a 20 6f  ous integer.** o
1cf0: 76 65 72 66 6c 6f 77 73 2e 20 35 31 32 4d 69 42  verflows. 512MiB
1d00: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c  ..*/.#define SQL
1d10: 49 54 45 5f 4d 41 58 5f 50 4d 41 53 5a 20 20 20  ITE_MAX_PMASZ   
1d20: 20 28 31 3c 3c 32 39 29 0a 0a 2f 2a 0a 2a 2a 20   (1<<29)../*.** 
1d30: 50 72 69 76 61 74 65 20 6f 62 6a 65 63 74 73 20  Private objects 
1d40: 75 73 65 64 20 62 79 20 74 68 65 20 73 6f 72 74  used by the sort
1d50: 65 72 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  er.*/.typedef st
1d60: 72 75 63 74 20 4d 65 72 67 65 45 6e 67 69 6e 65  ruct MergeEngine
1d70: 20 4d 65 72 67 65 45 6e 67 69 6e 65 3b 20 20 20   MergeEngine;   
1d80: 20 20 2f 2a 20 4d 65 72 67 65 20 50 4d 41 73 20    /* Merge PMAs 
1d90: 74 6f 67 65 74 68 65 72 20 2a 2f 0a 74 79 70 65  together */.type
1da0: 64 65 66 20 73 74 72 75 63 74 20 50 6d 61 52 65  def struct PmaRe
1db0: 61 64 65 72 20 50 6d 61 52 65 61 64 65 72 3b 20  ader PmaReader; 
1dc0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65          /* Incre
1dd0: 6d 65 6e 74 61 6c 6c 79 20 72 65 61 64 20 6f 6e  mentally read on
1de0: 65 20 50 4d 41 20 2a 2f 0a 74 79 70 65 64 65 66  e PMA */.typedef
1df0: 20 73 74 72 75 63 74 20 50 6d 61 57 72 69 74 65   struct PmaWrite
1e00: 72 20 50 6d 61 57 72 69 74 65 72 3b 20 20 20 20  r PmaWriter;    
1e10: 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e       /* Incremen
1e20: 74 61 6c 6c 79 20 77 72 69 74 65 20 6f 6e 65 20  tally write one 
1e30: 50 4d 41 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  PMA */.typedef s
1e40: 74 72 75 63 74 20 53 6f 72 74 65 72 52 65 63 6f  truct SorterReco
1e50: 72 64 20 53 6f 72 74 65 72 52 65 63 6f 72 64 3b  rd SorterRecord;
1e60: 20 20 20 2f 2a 20 41 20 72 65 63 6f 72 64 20 62     /* A record b
1e70: 65 69 6e 67 20 73 6f 72 74 65 64 20 2a 2f 0a 74  eing sorted */.t
1e80: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53 6f  ypedef struct So
1e90: 72 74 53 75 62 74 61 73 6b 20 53 6f 72 74 53 75  rtSubtask SortSu
1ea0: 62 74 61 73 6b 3b 20 20 20 20 20 2f 2a 20 41 20  btask;     /* A 
1eb0: 73 75 62 2d 74 61 73 6b 20 69 6e 20 74 68 65 20  sub-task in the 
1ec0: 73 6f 72 74 20 70 72 6f 63 65 73 73 20 2a 2f 0a  sort process */.
1ed0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
1ee0: 6f 72 74 65 72 46 69 6c 65 20 53 6f 72 74 65 72  orterFile Sorter
1ef0: 46 69 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54  File;       /* T
1f00: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6f 62  emporary file ob
1f10: 6a 65 63 74 20 77 72 61 70 70 65 72 20 2a 2f 0a  ject wrapper */.
1f20: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
1f30: 6f 72 74 65 72 4c 69 73 74 20 53 6f 72 74 65 72  orterList Sorter
1f40: 4c 69 73 74 3b 20 20 20 20 20 20 20 2f 2a 20 49  List;       /* I
1f50: 6e 2d 6d 65 6d 6f 72 79 20 6c 69 73 74 20 6f 66  n-memory list of
1f60: 20 72 65 63 6f 72 64 73 20 2a 2f 0a 74 79 70 65   records */.type
1f70: 64 65 66 20 73 74 72 75 63 74 20 49 6e 63 72 4d  def struct IncrM
1f80: 65 72 67 65 72 20 49 6e 63 72 4d 65 72 67 65 72  erger IncrMerger
1f90: 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20  ;       /* Read 
1fa0: 26 20 6d 65 72 67 65 20 6d 75 6c 74 69 70 6c 65  & merge multiple
1fb0: 20 50 4d 41 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20   PMAs */../*.** 
1fc0: 41 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f 72 20  A container for 
1fd0: 61 20 74 65 6d 70 20 66 69 6c 65 20 68 61 6e 64  a temp file hand
1fe0: 6c 65 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  le and the curre
1ff0: 6e 74 20 61 6d 6f 75 6e 74 20 6f 66 20 64 61 74  nt amount of dat
2000: 61 20 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  a .** stored in 
2010: 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 72  the file..*/.str
2020: 75 63 74 20 53 6f 72 74 65 72 46 69 6c 65 20 7b  uct SorterFile {
2030: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
2040: 2a 70 46 64 3b 20 20 20 20 20 20 20 20 20 20 20  *pFd;           
2050: 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c     /* File handl
2060: 65 20 2a 2f 0a 20 20 69 36 34 20 69 45 6f 66 3b  e */.  i64 iEof;
2070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2080: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
2090: 6f 66 20 64 61 74 61 20 73 74 6f 72 65 64 20 69  of data stored i
20a0: 6e 20 70 46 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  n pFd */.};../*.
20b0: 2a 2a 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ** An in-memory 
20c0: 6c 69 73 74 20 6f 66 20 6f 62 6a 65 63 74 73 20  list of objects 
20d0: 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a 2a 2a  to be sorted..**
20e0: 0a 2a 2a 20 49 66 20 61 4d 65 6d 6f 72 79 3d 3d  .** If aMemory==
20f0: 30 20 74 68 65 6e 20 65 61 63 68 20 6f 62 6a 65  0 then each obje
2100: 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ct is allocated 
2110: 73 65 70 61 72 61 74 65 6c 79 20 61 6e 64 20 74  separately and t
2120: 68 65 20 6f 62 6a 65 63 74 73 0a 2a 2a 20 61 72  he objects.** ar
2130: 65 20 63 6f 6e 6e 65 63 74 65 64 20 75 73 69 6e  e connected usin
2140: 67 20 53 6f 72 74 65 72 52 65 63 6f 72 64 2e 75  g SorterRecord.u
2150: 2e 70 4e 65 78 74 2e 20 20 49 66 20 61 4d 65 6d  .pNext.  If aMem
2160: 6f 72 79 21 3d 30 20 74 68 65 6e 20 61 6c 6c 20  ory!=0 then all 
2170: 6f 62 6a 65 63 74 73 0a 2a 2a 20 61 72 65 20 73  objects.** are s
2180: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 4d 65  tored in the aMe
2190: 6d 6f 72 79 5b 5d 20 62 75 6c 6b 20 6d 65 6d 6f  mory[] bulk memo
21a0: 72 79 2c 20 6f 6e 65 20 72 69 67 68 74 20 61 66  ry, one right af
21b0: 74 65 72 20 74 68 65 20 6f 74 68 65 72 2c 20 61  ter the other, a
21c0: 6e 64 0a 2a 2a 20 61 72 65 20 63 6f 6e 6e 65 63  nd.** are connec
21d0: 74 65 64 20 75 73 69 6e 67 20 53 6f 72 74 65 72  ted using Sorter
21e0: 52 65 63 6f 72 64 2e 75 2e 69 4e 65 78 74 2e 0a  Record.u.iNext..
21f0: 2a 2f 0a 73 74 72 75 63 74 20 53 6f 72 74 65 72  */.struct Sorter
2200: 4c 69 73 74 20 7b 0a 20 20 53 6f 72 74 65 72 52  List {.  SorterR
2210: 65 63 6f 72 64 20 2a 70 4c 69 73 74 3b 20 20 20  ecord *pList;   
2220: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b           /* Link
2230: 65 64 20 6c 69 73 74 20 6f 66 20 72 65 63 6f 72  ed list of recor
2240: 64 73 20 2a 2f 0a 20 20 75 38 20 2a 61 4d 65 6d  ds */.  u8 *aMem
2250: 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ory;            
2260: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
2270: 6e 2d 4e 55 4c 4c 2c 20 62 75 6c 6b 20 6d 65 6d  n-NULL, bulk mem
2280: 6f 72 79 20 74 6f 20 68 6f 6c 64 20 70 4c 69 73  ory to hold pLis
2290: 74 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 50 4d 41  t */.  int szPMA
22a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22b0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
22c0: 66 20 70 4c 69 73 74 20 61 73 20 50 4d 41 20 69  f pList as PMA i
22d0: 6e 20 62 79 74 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f  n bytes */.};../
22e0: 2a 0a 2a 2a 20 54 68 65 20 4d 65 72 67 65 45 6e  *.** The MergeEn
22f0: 67 69 6e 65 20 6f 62 6a 65 63 74 20 69 73 20 75  gine object is u
2300: 73 65 64 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74  sed to combine t
2310: 77 6f 20 6f 72 20 6d 6f 72 65 20 73 6d 61 6c 6c  wo or more small
2320: 65 72 20 50 4d 41 73 20 69 6e 74 6f 0a 2a 2a 20  er PMAs into.** 
2330: 6f 6e 65 20 62 69 67 20 50 4d 41 20 75 73 69 6e  one big PMA usin
2340: 67 20 61 20 6d 65 72 67 65 20 6f 70 65 72 61 74  g a merge operat
2350: 69 6f 6e 2e 20 20 53 65 70 61 72 61 74 65 20 50  ion.  Separate P
2360: 4d 41 73 20 61 6c 6c 20 6e 65 65 64 20 74 6f 20  MAs all need to 
2370: 62 65 0a 2a 2a 20 63 6f 6d 62 69 6e 65 64 20 69  be.** combined i
2380: 6e 74 6f 20 6f 6e 65 20 62 69 67 20 50 4d 41 20  nto one big PMA 
2390: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 61  in order to be a
23a0: 62 6c 65 20 74 6f 20 73 74 65 70 20 74 68 72 6f  ble to step thro
23b0: 75 67 68 20 74 68 65 20 73 6f 72 74 65 64 0a 2a  ugh the sorted.*
23c0: 2a 20 72 65 63 6f 72 64 73 20 69 6e 20 6f 72 64  * records in ord
23d0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 52  er..**.** The aR
23e0: 65 61 64 72 5b 5d 20 61 72 72 61 79 20 63 6f 6e  eadr[] array con
23f0: 74 61 69 6e 73 20 61 20 50 6d 61 52 65 61 64 65  tains a PmaReade
2400: 72 20 6f 62 6a 65 63 74 20 66 6f 72 20 65 61 63  r object for eac
2410: 68 20 6f 66 20 74 68 65 20 50 4d 41 73 20 62 65  h of the PMAs be
2420: 69 6e 67 0a 2a 2a 20 6d 65 72 67 65 64 2e 20 20  ing.** merged.  
2430: 41 6e 20 61 52 65 61 64 72 5b 5d 20 6f 62 6a 65  An aReadr[] obje
2440: 63 74 20 65 69 74 68 65 72 20 70 6f 69 6e 74 73  ct either points
2450: 20 74 6f 20 61 20 76 61 6c 69 64 20 6b 65 79 20   to a valid key 
2460: 6f 72 20 65 6c 73 65 20 69 73 20 61 74 20 45 4f  or else is at EO
2470: 46 2e 0a 2a 2a 20 28 22 45 4f 46 22 20 6d 65 61  F..** ("EOF" mea
2480: 6e 73 20 22 45 6e 64 20 4f 66 20 46 69 6c 65 22  ns "End Of File"
2490: 2e 20 20 57 68 65 6e 20 61 52 65 61 64 72 5b 5d  .  When aReadr[]
24a0: 20 69 73 20 61 74 20 45 4f 46 20 74 68 65 72 65   is at EOF there
24b0: 20 69 73 20 6e 6f 20 6d 6f 72 65 20 64 61 74 61   is no more data
24c0: 2e 29 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  .).** For the pu
24d0: 72 70 6f 73 65 73 20 6f 66 20 74 68 65 20 70 61  rposes of the pa
24e0: 72 61 67 72 61 70 68 73 20 62 65 6c 6f 77 2c 20  ragraphs below, 
24f0: 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  we assume that t
2500: 68 65 20 61 72 72 61 79 20 69 73 0a 2a 2a 20 61  he array is.** a
2510: 63 74 75 61 6c 6c 79 20 4e 20 65 6c 65 6d 65 6e  ctually N elemen
2520: 74 73 20 69 6e 20 73 69 7a 65 2c 20 77 68 65 72  ts in size, wher
2530: 65 20 4e 20 69 73 20 74 68 65 20 73 6d 61 6c 6c  e N is the small
2540: 65 73 74 20 70 6f 77 65 72 20 6f 66 20 32 20 67  est power of 2 g
2550: 72 65 61 74 65 72 0a 2a 2a 20 74 6f 20 6f 72 20  reater.** to or 
2560: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6e 75 6d  equal to the num
2570: 62 65 72 20 6f 66 20 50 4d 41 73 20 62 65 69 6e  ber of PMAs bein
2580: 67 20 6d 65 72 67 65 64 2e 20 54 68 65 20 65 78  g merged. The ex
2590: 74 72 61 20 61 52 65 61 64 72 5b 5d 20 65 6c 65  tra aReadr[] ele
25a0: 6d 65 6e 74 73 0a 2a 2a 20 61 72 65 20 74 72 65  ments.** are tre
25b0: 61 74 65 64 20 61 73 20 69 66 20 74 68 65 79 20  ated as if they 
25c0: 61 72 65 20 65 6d 70 74 79 20 28 61 6c 77 61 79  are empty (alway
25d0: 73 20 61 74 20 45 4f 46 29 2e 0a 2a 2a 0a 2a 2a  s at EOF)..**.**
25e0: 20 54 68 65 20 61 54 72 65 65 5b 5d 20 61 72 72   The aTree[] arr
25f0: 61 79 20 69 73 20 61 6c 73 6f 20 4e 20 65 6c 65  ay is also N ele
2600: 6d 65 6e 74 73 20 69 6e 20 73 69 7a 65 2e 20 54  ments in size. T
2610: 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 20 69 73  he value of N is
2620: 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68   stored in.** th
2630: 65 20 4d 65 72 67 65 45 6e 67 69 6e 65 2e 6e 54  e MergeEngine.nT
2640: 72 65 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2a  ree variable..**
2650: 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 28 4e  .** The final (N
2660: 2f 32 29 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  /2) elements of 
2670: 61 54 72 65 65 5b 5d 20 63 6f 6e 74 61 69 6e 20  aTree[] contain 
2680: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 63  the results of c
2690: 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 70 61 69 72  omparing.** pair
26a0: 73 20 6f 66 20 50 4d 41 20 6b 65 79 73 20 74 6f  s of PMA keys to
26b0: 67 65 74 68 65 72 2e 20 45 6c 65 6d 65 6e 74 20  gether. Element 
26c0: 69 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72  i contains the r
26d0: 65 73 75 6c 74 20 6f 66 20 0a 2a 2a 20 63 6f 6d  esult of .** com
26e0: 70 61 72 69 6e 67 20 61 52 65 61 64 72 5b 32 2a  paring aReadr[2*
26f0: 69 2d 4e 5d 20 61 6e 64 20 61 52 65 61 64 72 5b  i-N] and aReadr[
2700: 32 2a 69 2d 4e 2b 31 5d 2e 20 57 68 69 63 68 65  2*i-N+1]. Whiche
2710: 76 65 72 20 6b 65 79 20 69 73 20 73 6d 61 6c 6c  ver key is small
2720: 65 72 2c 20 74 68 65 0a 2a 2a 20 61 54 72 65 65  er, the.** aTree
2730: 20 65 6c 65 6d 65 6e 74 20 69 73 20 73 65 74 20   element is set 
2740: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
2750: 69 74 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  it. .**.** For t
2760: 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
2770: 68 69 73 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20  his comparison, 
2780: 45 4f 46 20 69 73 20 63 6f 6e 73 69 64 65 72 65  EOF is considere
2790: 64 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61  d greater than a
27a0: 6e 79 0a 2a 2a 20 6f 74 68 65 72 20 6b 65 79 20  ny.** other key 
27b0: 76 61 6c 75 65 2e 20 49 66 20 74 68 65 20 6b 65  value. If the ke
27c0: 79 73 20 61 72 65 20 65 71 75 61 6c 20 28 6f 6e  ys are equal (on
27d0: 6c 79 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68  ly possible with
27e0: 20 74 77 6f 20 45 4f 46 0a 2a 2a 20 76 61 6c 75   two EOF.** valu
27f0: 65 73 29 2c 20 69 74 20 64 6f 65 73 6e 27 74 20  es), it doesn't 
2800: 6d 61 74 74 65 72 20 77 68 69 63 68 20 69 6e 64  matter which ind
2810: 65 78 20 69 73 20 73 74 6f 72 65 64 2e 0a 2a 2a  ex is stored..**
2820: 0a 2a 2a 20 54 68 65 20 28 4e 2f 34 29 20 65 6c  .** The (N/4) el
2830: 65 6d 65 6e 74 73 20 6f 66 20 61 54 72 65 65 5b  ements of aTree[
2840: 5d 20 74 68 61 74 20 70 72 65 63 65 64 65 20 74  ] that precede t
2850: 68 65 20 66 69 6e 61 6c 20 28 4e 2f 32 29 20 64  he final (N/2) d
2860: 65 73 63 72 69 62 65 64 20 0a 2a 2a 20 61 62 6f  escribed .** abo
2870: 76 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ve contains the 
2880: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 73 6d 61  index of the sma
2890: 6c 6c 65 73 74 20 6f 66 20 65 61 63 68 20 62 6c  llest of each bl
28a0: 6f 63 6b 20 6f 66 20 34 20 50 6d 61 52 65 61 64  ock of 4 PmaRead
28b0: 65 72 73 0a 2a 2a 20 41 6e 64 20 73 6f 20 6f 6e  ers.** And so on
28c0: 2e 20 53 6f 20 74 68 61 74 20 61 54 72 65 65 5b  . So that aTree[
28d0: 31 5d 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  1] contains the 
28e0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 50 6d 61  index of the Pma
28f0: 52 65 61 64 65 72 20 74 68 61 74 20 0a 2a 2a 20  Reader that .** 
2900: 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
2910: 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65 73 74   to the smallest
2920: 20 6b 65 79 20 76 61 6c 75 65 2e 20 61 54 72 65   key value. aTre
2930: 65 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 2e 0a  e[0] is unused..
2940: 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 2a  **.** Example:.*
2950: 2a 0a 2a 2a 20 20 20 20 20 61 52 65 61 64 72 5b  *.**     aReadr[
2960: 30 5d 20 2d 3e 20 42 61 6e 61 6e 61 0a 2a 2a 20  0] -> Banana.** 
2970: 20 20 20 20 61 52 65 61 64 72 5b 31 5d 20 2d 3e      aReadr[1] ->
2980: 20 46 65 69 6a 6f 61 0a 2a 2a 20 20 20 20 20 61   Feijoa.**     a
2990: 52 65 61 64 72 5b 32 5d 20 2d 3e 20 45 6c 64 65  Readr[2] -> Elde
29a0: 72 62 65 72 72 79 0a 2a 2a 20 20 20 20 20 61 52  rberry.**     aR
29b0: 65 61 64 72 5b 33 5d 20 2d 3e 20 43 75 72 72 61  eadr[3] -> Curra
29c0: 6e 74 0a 2a 2a 20 20 20 20 20 61 52 65 61 64 72  nt.**     aReadr
29d0: 5b 34 5d 20 2d 3e 20 47 72 61 70 65 66 72 75 69  [4] -> Grapefrui
29e0: 74 0a 2a 2a 20 20 20 20 20 61 52 65 61 64 72 5b  t.**     aReadr[
29f0: 35 5d 20 2d 3e 20 41 70 70 6c 65 0a 2a 2a 20 20  5] -> Apple.**  
2a00: 20 20 20 61 52 65 61 64 72 5b 36 5d 20 2d 3e 20     aReadr[6] -> 
2a10: 44 75 72 69 61 6e 0a 2a 2a 20 20 20 20 20 61 52  Durian.**     aR
2a20: 65 61 64 72 5b 37 5d 20 2d 3e 20 45 4f 46 0a 2a  eadr[7] -> EOF.*
2a30: 2a 0a 2a 2a 20 20 20 20 20 61 54 72 65 65 5b 5d  *.**     aTree[]
2a40: 20 3d 20 7b 20 58 2c 20 35 20 20 20 30 2c 20 35   = { X, 5   0, 5
2a50: 20 20 20 20 30 2c 20 33 2c 20 35 2c 20 36 20 7d      0, 3, 5, 6 }
2a60: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72 65  .**.** The curre
2a70: 6e 74 20 65 6c 65 6d 65 6e 74 20 69 73 20 22 41  nt element is "A
2a80: 70 70 6c 65 22 20 28 74 68 65 20 76 61 6c 75 65  pple" (the value
2a90: 20 6f 66 20 74 68 65 20 6b 65 79 20 69 6e 64 69   of the key indi
2aa0: 63 61 74 65 64 20 62 79 20 0a 2a 2a 20 50 6d 61  cated by .** Pma
2ab0: 52 65 61 64 65 72 20 35 29 2e 20 57 68 65 6e 20  Reader 5). When 
2ac0: 74 68 65 20 4e 65 78 74 28 29 20 6f 70 65 72 61  the Next() opera
2ad0: 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 2c  tion is invoked,
2ae0: 20 50 6d 61 52 65 61 64 65 72 20 35 20 77 69 6c   PmaReader 5 wil
2af0: 6c 0a 2a 2a 20 62 65 20 61 64 76 61 6e 63 65 64  l.** be advanced
2b00: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6b 65 79   to the next key
2b10: 20 69 6e 20 69 74 73 20 73 65 67 6d 65 6e 74 2e   in its segment.
2b20: 20 53 61 79 20 74 68 65 20 6e 65 78 74 20 6b 65   Say the next ke
2b30: 79 20 69 73 0a 2a 2a 20 22 45 67 67 70 6c 61 6e  y is.** "Eggplan
2b40: 74 22 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61 52  t":.**.**     aR
2b50: 65 61 64 72 5b 35 5d 20 2d 3e 20 45 67 67 70 6c  eadr[5] -> Eggpl
2b60: 61 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ant.**.** The co
2b70: 6e 74 65 6e 74 73 20 6f 66 20 61 54 72 65 65 5b  ntents of aTree[
2b80: 5d 20 61 72 65 20 75 70 64 61 74 65 64 20 66 69  ] are updated fi
2b90: 72 73 74 20 62 79 20 63 6f 6d 70 61 72 69 6e 67  rst by comparing
2ba0: 20 74 68 65 20 6e 65 77 20 50 6d 61 52 65 61 64   the new PmaRead
2bb0: 65 72 0a 2a 2a 20 35 20 6b 65 79 20 74 6f 20 74  er.** 5 key to t
2bc0: 68 65 20 63 75 72 72 65 6e 74 20 6b 65 79 20 6f  he current key o
2bd0: 66 20 50 6d 61 52 65 61 64 65 72 20 34 20 28 73  f PmaReader 4 (s
2be0: 74 69 6c 6c 20 22 47 72 61 70 65 66 72 75 69 74  till "Grapefruit
2bf0: 22 29 2e 20 54 68 65 20 50 6d 61 52 65 61 64 65  "). The PmaReade
2c00: 72 0a 2a 2a 20 35 20 76 61 6c 75 65 20 69 73 20  r.** 5 value is 
2c10: 73 74 69 6c 6c 20 73 6d 61 6c 6c 65 72 2c 20 73  still smaller, s
2c20: 6f 20 61 54 72 65 65 5b 36 5d 20 69 73 20 73 65  o aTree[6] is se
2c30: 74 20 74 6f 20 35 2e 20 41 6e 64 20 73 6f 20 6f  t to 5. And so o
2c40: 6e 20 75 70 20 74 68 65 20 74 72 65 65 2e 0a 2a  n up the tree..*
2c50: 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 50  * The value of P
2c60: 6d 61 52 65 61 64 65 72 20 36 20 2d 20 22 44 75  maReader 6 - "Du
2c70: 72 69 61 6e 22 20 2d 20 69 73 20 6e 6f 77 20 73  rian" - is now s
2c80: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 61 74  maller than that
2c90: 20 6f 66 20 50 6d 61 52 65 61 64 65 72 0a 2a 2a   of PmaReader.**
2ca0: 20 35 2c 20 73 6f 20 61 54 72 65 65 5b 33 5d 20   5, so aTree[3] 
2cb0: 69 73 20 73 65 74 20 74 6f 20 36 2e 20 4b 65 79  is set to 6. Key
2cc0: 20 30 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68   0 is smaller th
2cd0: 61 6e 20 6b 65 79 20 36 20 28 42 61 6e 61 6e 61  an key 6 (Banana
2ce0: 3c 44 75 72 69 61 6e 29 2c 0a 2a 2a 20 73 6f 20  <Durian),.** so 
2cf0: 74 68 65 20 76 61 6c 75 65 20 77 72 69 74 74 65  the value writte
2d00: 6e 20 69 6e 74 6f 20 65 6c 65 6d 65 6e 74 20 31  n into element 1
2d10: 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 69 73   of the array is
2d20: 20 30 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a   0. As follows:.
2d30: 2a 2a 0a 2a 2a 20 20 20 20 20 61 54 72 65 65 5b  **.**     aTree[
2d40: 5d 20 3d 20 7b 20 58 2c 20 30 20 20 20 30 2c 20  ] = { X, 0   0, 
2d50: 36 20 20 20 20 30 2c 20 33 2c 20 35 2c 20 36 20  6    0, 3, 5, 6 
2d60: 7d 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72  }.**.** In other
2d70: 20 77 6f 72 64 73 2c 20 65 61 63 68 20 74 69 6d   words, each tim
2d80: 65 20 77 65 20 61 64 76 61 6e 63 65 20 74 6f 20  e we advance to 
2d90: 74 68 65 20 6e 65 78 74 20 73 6f 72 74 65 72 20  the next sorter 
2da0: 65 6c 65 6d 65 6e 74 2c 20 6c 6f 67 32 28 4e 29  element, log2(N)
2db0: 0a 2a 2a 20 6b 65 79 20 63 6f 6d 70 61 72 69 73  .** key comparis
2dc0: 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72  on operations ar
2dd0: 65 20 72 65 71 75 69 72 65 64 2c 20 77 68 65 72  e required, wher
2de0: 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e N is the numbe
2df0: 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 0a 2a 2a  r of segments.**
2e00: 20 62 65 69 6e 67 20 6d 65 72 67 65 64 20 28 72   being merged (r
2e10: 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 74 68 65  ounded up to the
2e20: 20 6e 65 78 74 20 70 6f 77 65 72 20 6f 66 20 32   next power of 2
2e30: 29 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 4d 65 72  )..*/.struct Mer
2e40: 67 65 45 6e 67 69 6e 65 20 7b 0a 20 20 69 6e 74  geEngine {.  int
2e50: 20 6e 54 72 65 65 3b 20 20 20 20 20 20 20 20 20   nTree;         
2e60: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
2e70: 73 69 7a 65 20 6f 66 20 61 54 72 65 65 2f 61 52  size of aTree/aR
2e80: 65 61 64 72 20 28 70 6f 77 65 72 20 6f 66 20 32  eadr (power of 2
2e90: 29 20 2a 2f 0a 20 20 53 6f 72 74 53 75 62 74 61  ) */.  SortSubta
2ea0: 73 6b 20 2a 70 54 61 73 6b 3b 20 20 20 20 20 20  sk *pTask;      
2eb0: 20 20 2f 2a 20 55 73 65 64 20 62 79 20 74 68 69    /* Used by thi
2ec0: 73 20 74 68 72 65 61 64 20 6f 6e 6c 79 20 2a 2f  s thread only */
2ed0: 0a 20 20 69 6e 74 20 2a 61 54 72 65 65 3b 20 20  .  int *aTree;  
2ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ef0: 20 43 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   Current state o
2f00: 66 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65  f incremental me
2f10: 72 67 65 20 2a 2f 0a 20 20 50 6d 61 52 65 61 64  rge */.  PmaRead
2f20: 65 72 20 2a 61 52 65 61 64 72 3b 20 20 20 20 20  er *aReadr;     
2f30: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
2f40: 50 6d 61 52 65 61 64 65 72 73 20 74 6f 20 6d 65  PmaReaders to me
2f50: 72 67 65 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f  rge data from */
2f60: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .};../*.** This 
2f70: 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74  object represent
2f80: 73 20 61 20 73 69 6e 67 6c 65 20 74 68 72 65 61  s a single threa
2f90: 64 20 6f 66 20 63 6f 6e 74 72 6f 6c 20 69 6e 20  d of control in 
2fa0: 61 20 73 6f 72 74 20 6f 70 65 72 61 74 69 6f 6e  a sort operation
2fb0: 2e 0a 2a 2a 20 45 78 61 63 74 6c 79 20 56 64 62  ..** Exactly Vdb
2fc0: 65 53 6f 72 74 65 72 2e 6e 54 61 73 6b 20 69 6e  eSorter.nTask in
2fd0: 73 74 61 6e 63 65 73 20 6f 66 20 74 68 69 73 20  stances of this 
2fe0: 6f 62 6a 65 63 74 20 61 72 65 20 61 6c 6c 6f 63  object are alloc
2ff0: 61 74 65 64 0a 2a 2a 20 61 73 20 70 61 72 74 20  ated.** as part 
3000: 6f 66 20 65 61 63 68 20 56 64 62 65 53 6f 72 74  of each VdbeSort
3010: 65 72 20 6f 62 6a 65 63 74 2e 20 49 6e 73 74 61  er object. Insta
3020: 6e 63 65 73 20 61 72 65 20 6e 65 76 65 72 20 61  nces are never a
3030: 6c 6c 6f 63 61 74 65 64 20 61 6e 79 0a 2a 2a 20  llocated any.** 
3040: 6f 74 68 65 72 20 77 61 79 2e 20 56 64 62 65 53  other way. VdbeS
3050: 6f 72 74 65 72 2e 6e 54 61 73 6b 20 69 73 20 73  orter.nTask is s
3060: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
3070: 20 6f 66 20 77 6f 72 6b 65 72 20 74 68 72 65 61   of worker threa
3080: 64 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 28 73  ds allowed.** (s
3090: 65 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ee SQLITE_CONFIG
30a0: 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 29  _WORKER_THREADS)
30b0: 20 70 6c 75 73 20 6f 6e 65 20 28 74 68 65 20 6d   plus one (the m
30c0: 61 69 6e 20 74 68 72 65 61 64 29 2e 20 20 54 68  ain thread).  Th
30d0: 75 73 20 66 6f 72 0a 2a 2a 20 73 69 6e 67 6c 65  us for.** single
30e0: 2d 74 68 72 65 61 64 65 64 20 6f 70 65 72 61 74  -threaded operat
30f0: 69 6f 6e 2c 20 74 68 65 72 65 20 69 73 20 65 78  ion, there is ex
3100: 61 63 74 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e  actly one instan
3110: 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63  ce of this objec
3120: 74 0a 2a 2a 20 61 6e 64 20 66 6f 72 20 6d 75 6c  t.** and for mul
3130: 74 69 2d 74 68 72 65 61 64 65 64 20 6f 70 65 72  ti-threaded oper
3140: 61 74 69 6f 6e 20 74 68 65 72 65 20 61 72 65 20  ation there are 
3150: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 69 6e 73 74  two or more inst
3160: 61 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 73 73  ances..**.** Ess
3170: 65 6e 74 69 61 6c 6c 79 2c 20 74 68 69 73 20 73  entially, this s
3180: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
3190: 73 20 61 6c 6c 20 74 68 6f 73 65 20 66 69 65 6c  s all those fiel
31a0: 64 73 20 6f 66 20 74 68 65 20 56 64 62 65 53 6f  ds of the VdbeSo
31b0: 72 74 65 72 0a 2a 2a 20 73 74 72 75 63 74 75 72  rter.** structur
31c0: 65 20 66 6f 72 20 77 68 69 63 68 20 65 61 63 68  e for which each
31d0: 20 74 68 72 65 61 64 20 72 65 71 75 69 72 65 73   thread requires
31e0: 20 61 20 73 65 70 61 72 61 74 65 20 69 6e 73 74   a separate inst
31f0: 61 6e 63 65 2e 20 46 6f 72 20 65 78 61 6d 70 6c  ance. For exampl
3200: 65 2c 0a 2a 2a 20 65 61 63 68 20 74 68 72 65 61  e,.** each threa
3210: 64 20 72 65 71 75 72 69 65 73 20 69 74 73 20 6f  d requries its o
3220: 77 6e 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  wn UnpackedRecor
3230: 64 20 6f 62 6a 65 63 74 20 74 6f 20 75 6e 70 61  d object to unpa
3240: 63 6b 20 72 65 63 6f 72 64 73 20 69 6e 0a 2a 2a  ck records in.**
3250: 20 61 73 20 70 61 72 74 20 6f 66 20 63 6f 6d 70   as part of comp
3260: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  arison operation
3270: 73 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  s..**.** Before 
3280: 61 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72  a background thr
3290: 65 61 64 20 69 73 20 6c 61 75 6e 63 68 65 64 2c  ead is launched,
32a0: 20 76 61 72 69 61 62 6c 65 20 62 44 6f 6e 65 20   variable bDone 
32b0: 69 73 20 73 65 74 20 74 6f 20 30 2e 20 54 68 65  is set to 0. The
32c0: 6e 2c 20 0a 2a 2a 20 72 69 67 68 74 20 62 65 66  n, .** right bef
32d0: 6f 72 65 20 69 74 20 65 78 69 74 73 2c 20 74 68  ore it exits, th
32e0: 65 20 74 68 72 65 61 64 20 69 74 73 65 6c 66 20  e thread itself 
32f0: 73 65 74 73 20 62 44 6f 6e 65 20 74 6f 20 31 2e  sets bDone to 1.
3300: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
3310: 72 20 0a 2a 2a 20 74 77 6f 20 70 75 72 70 6f 73  r .** two purpos
3320: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 57  es:.**.**   1. W
3330: 68 65 6e 20 66 6c 75 73 68 69 6e 67 20 74 68 65  hen flushing the
3340: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 65 6d   contents of mem
3350: 6f 72 79 20 74 6f 20 61 20 6c 65 76 65 6c 2d 30  ory to a level-0
3360: 20 50 4d 41 20 6f 6e 20 64 69 73 6b 2c 20 74 6f   PMA on disk, to
3370: 0a 2a 2a 20 20 20 20 20 20 61 74 74 65 6d 70 74  .**      attempt
3380: 20 74 6f 20 73 65 6c 65 63 74 20 61 20 53 6f 72   to select a Sor
3390: 74 53 75 62 74 61 73 6b 20 66 6f 72 20 77 68 69  tSubtask for whi
33a0: 63 68 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20  ch there is not 
33b0: 61 6c 72 65 61 64 79 20 61 6e 0a 2a 2a 20 20 20  already an.**   
33c0: 20 20 20 61 63 74 69 76 65 20 62 61 63 6b 67 72     active backgr
33d0: 6f 75 6e 64 20 74 68 72 65 61 64 20 28 73 69 6e  ound thread (sin
33e0: 63 65 20 64 6f 69 6e 67 20 73 6f 20 63 61 75 73  ce doing so caus
33f0: 65 73 20 74 68 65 20 6d 61 69 6e 20 74 68 72 65  es the main thre
3400: 61 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20 62 6c  ad.**      to bl
3410: 6f 63 6b 20 75 6e 74 69 6c 20 69 74 20 66 69 6e  ock until it fin
3420: 69 73 68 65 73 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  ishes)..**.**   
3430: 32 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42  2. If SQLITE_DEB
3440: 55 47 5f 53 4f 52 54 45 52 5f 54 48 52 45 41 44  UG_SORTER_THREAD
3450: 53 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 6f  S is defined, to
3460: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61 20   determine if a 
3470: 63 61 6c 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20  call.**      to 
3480: 73 71 6c 69 74 65 33 54 68 72 65 61 64 4a 6f 69  sqlite3ThreadJoi
3490: 6e 28 29 20 69 73 20 6c 69 6b 65 6c 79 20 74 6f  n() is likely to
34a0: 20 62 6c 6f 63 6b 2e 20 43 61 73 65 73 20 74 68   block. Cases th
34b0: 61 74 20 61 72 65 20 6c 69 6b 65 6c 79 20 74 6f  at are likely to
34c0: 0a 2a 2a 20 20 20 20 20 20 62 6c 6f 63 6b 20 70  .**      block p
34d0: 72 6f 76 6f 6b 65 20 64 65 62 75 67 67 69 6e 67  rovoke debugging
34e0: 20 6f 75 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 49   output..**.** I
34f0: 6e 20 62 6f 74 68 20 63 61 73 65 73 2c 20 74 68  n both cases, th
3500: 65 20 65 66 66 65 63 74 73 20 6f 66 20 74 68 65  e effects of the
3510: 20 6d 61 69 6e 20 74 68 72 65 61 64 20 73 65 65   main thread see
3520: 69 6e 67 20 28 62 44 6f 6e 65 3d 3d 30 29 20 65  ing (bDone==0) e
3530: 76 65 6e 0a 2a 2a 20 61 66 74 65 72 20 74 68 65  ven.** after the
3540: 20 74 68 72 65 61 64 20 68 61 73 20 66 69 6e 69   thread has fini
3550: 73 68 65 64 20 61 72 65 20 6e 6f 74 20 64 69 72  shed are not dir
3560: 65 2e 20 53 6f 20 77 65 20 64 6f 6e 27 74 20 77  e. So we don't w
3570: 6f 72 72 79 20 61 62 6f 75 74 0a 2a 2a 20 6d 65  orry about.** me
3580: 6d 6f 72 79 20 62 61 72 72 69 65 72 73 20 61 6e  mory barriers an
3590: 64 20 73 75 63 68 20 68 65 72 65 2e 0a 2a 2f 0a  d such here..*/.
35a0: 74 79 70 65 64 65 66 20 69 6e 74 20 28 2a 53 6f  typedef int (*So
35b0: 72 74 65 72 43 6f 6d 70 61 72 65 29 28 53 6f 72  rterCompare)(Sor
35c0: 74 53 75 62 74 61 73 6b 2a 2c 69 6e 74 2a 2c 63  tSubtask*,int*,c
35d0: 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63  onst void*,int,c
35e0: 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 29 3b  onst void*,int);
35f0: 0a 73 74 72 75 63 74 20 53 6f 72 74 53 75 62 74  .struct SortSubt
3600: 61 73 6b 20 7b 0a 20 20 53 51 4c 69 74 65 54 68  ask {.  SQLiteTh
3610: 72 65 61 64 20 2a 70 54 68 72 65 61 64 3b 20 20  read *pThread;  
3620: 20 20 20 20 20 20 20 20 2f 2a 20 42 61 63 6b 67          /* Backg
3630: 72 6f 75 6e 64 20 74 68 72 65 61 64 2c 20 69 66  round thread, if
3640: 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 62 44   any */.  int bD
3650: 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  one;            
3660: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
3670: 20 69 66 20 74 68 72 65 61 64 20 69 73 20 66 69   if thread is fi
3680: 6e 69 73 68 65 64 20 62 75 74 20 6e 6f 74 20 6a  nished but not j
3690: 6f 69 6e 65 64 20 2a 2f 0a 20 20 56 64 62 65 53  oined */.  VdbeS
36a0: 6f 72 74 65 72 20 2a 70 53 6f 72 74 65 72 3b 20  orter *pSorter; 
36b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f             /* So
36c0: 72 74 65 72 20 74 68 61 74 20 6f 77 6e 73 20 74  rter that owns t
36d0: 68 69 73 20 73 75 62 2d 74 61 73 6b 20 2a 2f 0a  his sub-task */.
36e0: 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
36f0: 20 2a 70 55 6e 70 61 63 6b 65 64 3b 20 20 20 20   *pUnpacked;    
3700: 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 75 6e    /* Space to un
3710: 70 61 63 6b 20 61 20 72 65 63 6f 72 64 20 2a 2f  pack a record */
3720: 0a 20 20 53 6f 72 74 65 72 4c 69 73 74 20 6c 69  .  SorterList li
3730: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
3740: 20 20 20 2f 2a 20 4c 69 73 74 20 66 6f 72 20 74     /* List for t
3750: 68 72 65 61 64 20 74 6f 20 77 72 69 74 65 20 74  hread to write t
3760: 6f 20 61 20 50 4d 41 20 2a 2f 0a 20 20 69 6e 74  o a PMA */.  int
3770: 20 6e 50 4d 41 3b 20 20 20 20 20 20 20 20 20 20   nPMA;          
3780: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3790: 4e 75 6d 62 65 72 20 6f 66 20 50 4d 41 73 20 63  Number of PMAs c
37a0: 75 72 72 65 6e 74 6c 79 20 69 6e 20 66 69 6c 65  urrently in file
37b0: 20 2a 2f 0a 20 20 53 6f 72 74 65 72 43 6f 6d 70   */.  SorterComp
37c0: 61 72 65 20 78 43 6f 6d 70 61 72 65 3b 20 20 20  are xCompare;   
37d0: 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65        /* Compare
37e0: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 75 73 65   function to use
37f0: 20 2a 2f 0a 20 20 53 6f 72 74 65 72 46 69 6c 65   */.  SorterFile
3800: 20 66 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20   file;          
3810: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 66 69        /* Temp fi
3820: 6c 65 20 66 6f 72 20 6c 65 76 65 6c 2d 30 20 50  le for level-0 P
3830: 4d 41 73 20 2a 2f 0a 20 20 53 6f 72 74 65 72 46  MAs */.  SorterF
3840: 69 6c 65 20 66 69 6c 65 32 3b 20 20 20 20 20 20  ile file2;      
3850: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
3860: 65 20 66 6f 72 20 6f 74 68 65 72 20 50 4d 41 73  e for other PMAs
3870: 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 4d   */.};.../*.** M
3880: 61 69 6e 20 73 6f 72 74 65 72 20 73 74 72 75 63  ain sorter struc
3890: 74 75 72 65 2e 20 41 20 73 69 6e 67 6c 65 20 69  ture. A single i
38a0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
38b0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  is allocated for
38c0: 20 65 61 63 68 20 0a 2a 2a 20 73 6f 72 74 65 72   each .** sorter
38d0: 20 63 75 72 73 6f 72 20 63 72 65 61 74 65 64 20   cursor created 
38e0: 62 79 20 74 68 65 20 56 44 42 45 2e 0a 2a 2a 0a  by the VDBE..**.
38f0: 2a 2a 20 6d 78 4b 65 79 73 69 7a 65 3a 0a 2a 2a  ** mxKeysize:.**
3900: 20 20 20 41 73 20 72 65 63 6f 72 64 73 20 61 72     As records ar
3910: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 73  e added to the s
3920: 6f 72 74 65 72 20 62 79 20 63 61 6c 6c 73 20 74  orter by calls t
3930: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72  o sqlite3VdbeSor
3940: 74 65 72 57 72 69 74 65 28 29 2c 0a 2a 2a 20 20  terWrite(),.**  
3950: 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   this variable i
3960: 73 20 75 70 64 61 74 65 64 20 73 6f 20 61 73 20  s updated so as 
3970: 74 6f 20 62 65 20 73 65 74 20 74 6f 20 74 68 65  to be set to the
3980: 20 73 69 7a 65 20 6f 6e 20 64 69 73 6b 20 6f 66   size on disk of
3990: 20 74 68 65 0a 2a 2a 20 20 20 6c 61 72 67 65 73   the.**   larges
39a0: 74 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20  t record in the 
39b0: 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 72 75 63  sorter..*/.struc
39c0: 74 20 56 64 62 65 53 6f 72 74 65 72 20 7b 0a 20  t VdbeSorter {. 
39d0: 20 69 6e 74 20 6d 6e 50 6d 61 53 69 7a 65 3b 20   int mnPmaSize; 
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39f0: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 50 4d 41 20   /* Minimum PMA 
3a00: 73 69 7a 65 2c 20 69 6e 20 62 79 74 65 73 20 2a  size, in bytes *
3a10: 2f 0a 20 20 69 6e 74 20 6d 78 50 6d 61 53 69 7a  /.  int mxPmaSiz
3a20: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
3a30: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 50      /* Maximum P
3a40: 4d 41 20 73 69 7a 65 2c 20 69 6e 20 62 79 74 65  MA size, in byte
3a50: 73 2e 20 20 30 3d 3d 6e 6f 20 6c 69 6d 69 74 20  s.  0==no limit 
3a60: 2a 2f 0a 20 20 69 6e 74 20 6d 78 4b 65 79 73 69  */.  int mxKeysi
3a70: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
3a80: 20 20 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20       /* Largest 
3a90: 73 65 72 69 61 6c 69 7a 65 64 20 6b 65 79 20 73  serialized key s
3aa0: 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  een so far */.  
3ab0: 69 6e 74 20 70 67 73 7a 3b 20 20 20 20 20 20 20  int pgsz;       
3ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ad0: 2f 2a 20 4d 61 69 6e 20 64 61 74 61 62 61 73 65  /* Main database
3ae0: 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
3af0: 50 6d 61 52 65 61 64 65 72 20 2a 70 52 65 61 64  PmaReader *pRead
3b00: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
3b10: 2f 2a 20 52 65 61 64 72 20 64 61 74 61 20 66 72  /* Readr data fr
3b20: 6f 6d 20 68 65 72 65 20 61 66 74 65 72 20 52 65  om here after Re
3b30: 77 69 6e 64 28 29 20 2a 2f 0a 20 20 4d 65 72 67  wind() */.  Merg
3b40: 65 45 6e 67 69 6e 65 20 2a 70 4d 65 72 67 65 72  eEngine *pMerger
3b50: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ;           /* O
3b60: 72 20 68 65 72 65 2c 20 69 66 20 62 55 73 65 54  r here, if bUseT
3b70: 68 72 65 61 64 73 3d 3d 30 20 2a 2f 0a 20 20 73  hreads==0 */.  s
3b80: 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
3b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3ba0: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
3bb0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 4b 65 79 49 6e  ction */.  KeyIn
3bc0: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20  fo *pKeyInfo;   
3bd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
3be0: 77 20 74 6f 20 63 6f 6d 70 61 72 65 20 72 65 63  w to compare rec
3bf0: 6f 72 64 73 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  ords */.  Unpack
3c00: 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63  edRecord *pUnpac
3c10: 6b 65 64 3b 20 20 20 20 20 20 2f 2a 20 55 73 65  ked;      /* Use
3c20: 64 20 62 79 20 56 64 62 65 53 6f 72 74 65 72 43  d by VdbeSorterC
3c30: 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 53 6f  ompare() */.  So
3c40: 72 74 65 72 4c 69 73 74 20 6c 69 73 74 3b 20 20  rterList list;  
3c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3c60: 20 4c 69 73 74 20 6f 66 20 69 6e 2d 6d 65 6d 6f   List of in-memo
3c70: 72 79 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20  ry records */.  
3c80: 69 6e 74 20 69 4d 65 6d 6f 72 79 3b 20 20 20 20  int iMemory;    
3c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ca0: 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 72 65  /* Offset of fre
3cb0: 65 20 73 70 61 63 65 20 69 6e 20 6c 69 73 74 2e  e space in list.
3cc0: 61 4d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74  aMemory */.  int
3cd0: 20 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20 20 20   nMemory;       
3ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3cf0: 53 69 7a 65 20 6f 66 20 6c 69 73 74 2e 61 4d 65  Size of list.aMe
3d00: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
3d10: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 38  in bytes */.  u8
3d20: 20 62 55 73 65 50 4d 41 3b 20 20 20 20 20 20 20   bUsePMA;       
3d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3d40: 20 54 72 75 65 20 69 66 20 6f 6e 65 20 6f 72 20   True if one or 
3d50: 6d 6f 72 65 20 50 4d 41 73 20 63 72 65 61 74 65  more PMAs create
3d60: 64 20 2a 2f 0a 20 20 75 38 20 62 55 73 65 54 68  d */.  u8 bUseTh
3d70: 72 65 61 64 73 3b 20 20 20 20 20 20 20 20 20 20  reads;          
3d80: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
3d90: 6f 20 75 73 65 20 62 61 63 6b 67 72 6f 75 6e 64  o use background
3da0: 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20 75 38   threads */.  u8
3db0: 20 69 50 72 65 76 3b 20 20 20 20 20 20 20 20 20   iPrev;         
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3dd0: 20 50 72 65 76 69 6f 75 73 20 74 68 72 65 61 64   Previous thread
3de0: 20 75 73 65 64 20 74 6f 20 66 6c 75 73 68 20 50   used to flush P
3df0: 4d 41 20 2a 2f 0a 20 20 75 38 20 6e 54 61 73 6b  MA */.  u8 nTask
3e00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3e10: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
3e20: 6f 66 20 61 54 61 73 6b 5b 5d 20 61 72 72 61 79  of aTask[] array
3e30: 20 2a 2f 0a 20 20 75 38 20 74 79 70 65 4d 61 73   */.  u8 typeMas
3e40: 6b 3b 0a 20 20 53 6f 72 74 53 75 62 74 61 73 6b  k;.  SortSubtask
3e50: 20 61 54 61 73 6b 5b 31 5d 3b 20 20 20 20 20 20   aTask[1];      
3e60: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 72 20 6d       /* One or m
3e70: 6f 72 65 20 73 75 62 74 61 73 6b 73 20 2a 2f 0a  ore subtasks */.
3e80: 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 53 4f 52 54  };..#define SORT
3e90: 45 52 5f 54 59 50 45 5f 49 4e 54 45 47 45 52 20  ER_TYPE_INTEGER 
3ea0: 30 78 30 31 0a 23 64 65 66 69 6e 65 20 53 4f 52  0x01.#define SOR
3eb0: 54 45 52 5f 54 59 50 45 5f 54 45 58 54 20 20 20  TER_TYPE_TEXT   
3ec0: 20 30 78 30 32 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20   0x02../*.** An 
3ed0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
3ee0: 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74  following object
3ef0: 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
3f00: 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66 20   records out of 
3f10: 61 0a 2a 2a 20 50 4d 41 2c 20 69 6e 20 73 6f 72  a.** PMA, in sor
3f20: 74 65 64 20 6f 72 64 65 72 2e 20 20 54 68 65 20  ted order.  The 
3f30: 6e 65 78 74 20 6b 65 79 20 74 6f 20 62 65 20 72  next key to be r
3f40: 65 61 64 20 69 73 20 63 61 63 68 65 64 20 69 6e  ead is cached in
3f50: 20 6e 4b 65 79 2f 61 4b 65 79 2e 0a 2a 2a 20 61   nKey/aKey..** a
3f60: 4b 65 79 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  Key might point 
3f70: 69 6e 74 6f 20 61 4d 61 70 20 6f 72 20 69 6e 74  into aMap or int
3f80: 6f 20 61 42 75 66 66 65 72 2e 20 20 49 66 20 6e  o aBuffer.  If n
3f90: 65 69 74 68 65 72 20 6f 66 20 74 68 6f 73 65 20  either of those 
3fa0: 6c 6f 63 61 74 69 6f 6e 73 0a 2a 2a 20 63 6f 6e  locations.** con
3fb0: 74 61 69 6e 20 61 20 63 6f 6e 74 69 67 75 6f 75  tain a contiguou
3fc0: 73 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  s representation
3fd0: 20 6f 66 20 74 68 65 20 6b 65 79 2c 20 74 68 65   of the key, the
3fe0: 6e 20 61 41 6c 6c 6f 63 20 69 73 20 61 6c 6c 6f  n aAlloc is allo
3ff0: 63 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  cated.** and the
4000: 20 6b 65 79 20 69 73 20 63 6f 70 69 65 64 20 69   key is copied i
4010: 6e 74 6f 20 61 41 6c 6c 6f 63 20 61 6e 64 20 61  nto aAlloc and a
4020: 4b 65 79 20 69 73 20 6d 61 64 65 20 74 6f 20 70  Key is made to p
4030: 6f 69 74 6e 20 74 6f 20 61 41 6c 6c 6f 63 2e 0a  oitn to aAlloc..
4040: 2a 2a 0a 2a 2a 20 70 46 64 3d 3d 30 20 61 74 20  **.** pFd==0 at 
4050: 45 4f 46 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50  EOF..*/.struct P
4060: 6d 61 52 65 61 64 65 72 20 7b 0a 20 20 69 36 34  maReader {.  i64
4070: 20 69 52 65 61 64 4f 66 66 3b 20 20 20 20 20 20   iReadOff;      
4080: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4090: 65 6e 74 20 72 65 61 64 20 6f 66 66 73 65 74 20  ent read offset 
40a0: 2a 2f 0a 20 20 69 36 34 20 69 45 6f 66 3b 20 20  */.  i64 iEof;  
40b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40c0: 20 2f 2a 20 31 20 62 79 74 65 20 70 61 73 74 20   /* 1 byte past 
40d0: 45 4f 46 20 66 6f 72 20 74 68 69 73 20 50 6d 61  EOF for this Pma
40e0: 52 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  Reader */.  int 
40f0: 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20  nAlloc;         
4100: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
4110: 20 6f 66 20 73 70 61 63 65 20 61 74 20 61 41 6c   of space at aAl
4120: 6c 6f 63 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65  loc */.  int nKe
4130: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
4140: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4150: 66 20 62 79 74 65 73 20 69 6e 20 6b 65 79 20 2a  f bytes in key *
4160: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
4170: 20 2a 70 46 64 3b 20 20 20 20 20 20 20 20 20 20   *pFd;          
4180: 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 77  /* File handle w
4190: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 66 72  e are reading fr
41a0: 6f 6d 20 2a 2f 0a 20 20 75 38 20 2a 61 41 6c 6c  om */.  u8 *aAll
41b0: 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  oc;             
41c0: 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
41d0: 20 61 4b 65 79 20 69 66 20 61 42 75 66 66 65 72   aKey if aBuffer
41e0: 20 61 6e 64 20 70 4d 61 70 20 77 6f 6e 74 20 77   and pMap wont w
41f0: 6f 72 6b 20 2a 2f 0a 20 20 75 38 20 2a 61 4b 65  ork */.  u8 *aKe
4200: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
4210: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
4220: 74 6f 20 63 75 72 72 65 6e 74 20 6b 65 79 20 2a  to current key *
4230: 2f 0a 20 20 75 38 20 2a 61 42 75 66 66 65 72 3b  /.  u8 *aBuffer;
4240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4250: 2f 2a 20 43 75 72 72 65 6e 74 20 72 65 61 64 20  /* Current read 
4260: 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
4270: 6e 42 75 66 66 65 72 3b 20 20 20 20 20 20 20 20  nBuffer;        
4280: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
4290: 6f 66 20 72 65 61 64 20 62 75 66 66 65 72 20 69  of read buffer i
42a0: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 38 20  n bytes */.  u8 
42b0: 2a 61 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20  *aMap;          
42c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
42d0: 74 65 72 20 74 6f 20 6d 61 70 70 69 6e 67 20 6f  ter to mapping o
42e0: 66 20 65 6e 74 69 72 65 20 66 69 6c 65 20 2a 2f  f entire file */
42f0: 0a 20 20 49 6e 63 72 4d 65 72 67 65 72 20 2a 70  .  IncrMerger *p
4300: 49 6e 63 72 3b 20 20 20 20 20 20 20 20 20 20 2f  Incr;          /
4310: 2a 20 49 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65  * Incremental me
4320: 72 67 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  rger */.};../*.*
4330: 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20 50 6d  * Normally, a Pm
4340: 61 52 65 61 64 65 72 20 6f 62 6a 65 63 74 20 69  aReader object i
4350: 74 65 72 61 74 65 73 20 74 68 72 6f 75 67 68 20  terates through 
4360: 61 6e 20 65 78 69 73 74 69 6e 67 20 50 4d 41 20  an existing PMA 
4370: 73 74 6f 72 65 64 20 0a 2a 2a 20 77 69 74 68 69  stored .** withi
4380: 6e 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 48  n a temp file. H
4390: 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 50  owever, if the P
43a0: 6d 61 52 65 61 64 65 72 2e 70 49 6e 63 72 20 76  maReader.pIncr v
43b0: 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20 74  ariable points t
43c0: 6f 0a 2a 2a 20 61 6e 20 6f 62 6a 65 63 74 20 6f  o.** an object o
43d0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
43e0: 74 79 70 65 2c 20 69 74 20 6d 61 79 20 62 65 20  type, it may be 
43f0: 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 2f  used to iterate/
4400: 6d 65 72 67 65 20 74 68 72 6f 75 67 68 0a 2a 2a  merge through.**
4410: 20 6d 75 6c 74 69 70 6c 65 20 50 4d 41 73 20 73   multiple PMAs s
4420: 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 2e 0a 2a  imultaneously..*
4430: 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 74  *.** There are t
4440: 77 6f 20 74 79 70 65 73 20 6f 66 20 49 6e 63 72  wo types of Incr
4450: 4d 65 72 67 65 72 20 6f 62 6a 65 63 74 20 2d 20  Merger object - 
4460: 73 69 6e 67 6c 65 20 28 62 55 73 65 54 68 72 65  single (bUseThre
4470: 61 64 3d 3d 30 29 20 61 6e 64 20 0a 2a 2a 20 6d  ad==0) and .** m
4480: 75 6c 74 69 2d 74 68 72 65 61 64 65 64 20 28 62  ulti-threaded (b
4490: 55 73 65 54 68 72 65 61 64 3d 3d 31 29 2e 20 0a  UseThread==1). .
44a0: 2a 2a 0a 2a 2a 20 41 20 6d 75 6c 74 69 2d 74 68  **.** A multi-th
44b0: 72 65 61 64 65 64 20 49 6e 63 72 4d 65 72 67 65  readed IncrMerge
44c0: 72 20 6f 62 6a 65 63 74 20 75 73 65 73 20 74 77  r object uses tw
44d0: 6f 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  o temporary file
44e0: 73 20 2d 20 61 46 69 6c 65 5b 30 5d 20 0a 2a 2a  s - aFile[0] .**
44f0: 20 61 6e 64 20 61 46 69 6c 65 5b 31 5d 2e 20 4e   and aFile[1]. N
4500: 65 69 74 68 65 72 20 66 69 6c 65 20 69 73 20 61  either file is a
4510: 6c 6c 6f 77 65 64 20 74 6f 20 67 72 6f 77 20 74  llowed to grow t
4520: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6d 78 53 7a  o more than mxSz
4530: 20 62 79 74 65 73 20 69 6e 20 0a 2a 2a 20 73 69   bytes in .** si
4540: 7a 65 2e 20 57 68 65 6e 20 74 68 65 20 49 6e 63  ze. When the Inc
4550: 72 4d 65 72 67 65 72 20 69 73 20 69 6e 69 74 69  rMerger is initi
4560: 61 6c 69 7a 65 64 2c 20 69 74 20 72 65 61 64 73  alized, it reads
4570: 20 65 6e 6f 75 67 68 20 64 61 74 61 20 66 72 6f   enough data fro
4580: 6d 20 0a 2a 2a 20 70 4d 65 72 67 65 72 20 74 6f  m .** pMerger to
4590: 20 70 6f 70 75 6c 61 74 65 20 61 46 69 6c 65 5b   populate aFile[
45a0: 30 5d 2e 20 49 74 20 74 68 65 6e 20 73 65 74 73  0]. It then sets
45b0: 20 76 61 72 69 61 62 6c 65 73 20 77 69 74 68 69   variables withi
45c0: 6e 20 74 68 65 20 0a 2a 2a 20 63 6f 72 72 65 73  n the .** corres
45d0: 70 6f 6e 64 69 6e 67 20 50 6d 61 52 65 61 64 65  ponding PmaReade
45e0: 72 20 6f 62 6a 65 63 74 20 74 6f 20 72 65 61 64  r object to read
45f0: 20 66 72 6f 6d 20 74 68 61 74 20 66 69 6c 65 20   from that file 
4600: 61 6e 64 20 6b 69 63 6b 73 20 6f 66 66 20 0a 2a  and kicks off .*
4610: 2a 20 61 20 62 61 63 6b 67 72 6f 75 6e 64 20 74  * a background t
4620: 68 72 65 61 64 20 74 6f 20 70 6f 70 75 6c 61 74  hread to populat
4630: 65 20 61 46 69 6c 65 5b 31 5d 20 77 69 74 68 20  e aFile[1] with 
4640: 74 68 65 20 6e 65 78 74 20 6d 78 53 7a 20 62 79  the next mxSz by
4650: 74 65 73 20 6f 66 20 0a 2a 2a 20 73 6f 72 74 65  tes of .** sorte
4660: 64 20 72 65 63 6f 72 64 20 64 61 74 61 20 66 72  d record data fr
4670: 6f 6d 20 70 4d 65 72 67 65 72 2e 20 0a 2a 2a 0a  om pMerger. .**.
4680: 2a 2a 20 57 68 65 6e 20 74 68 65 20 50 6d 61 52  ** When the PmaR
4690: 65 61 64 65 72 20 72 65 61 63 68 65 73 20 74 68  eader reaches th
46a0: 65 20 65 6e 64 20 6f 66 20 61 46 69 6c 65 5b 30  e end of aFile[0
46b0: 5d 2c 20 69 74 20 62 6c 6f 63 6b 73 20 75 6e 74  ], it blocks unt
46c0: 69 6c 20 74 68 65 0a 2a 2a 20 62 61 63 6b 67 72  il the.** backgr
46d0: 6f 75 6e 64 20 74 68 72 65 61 64 20 68 61 73 20  ound thread has 
46e0: 66 69 6e 69 73 68 65 64 20 70 6f 70 75 6c 61 74  finished populat
46f0: 69 6e 67 20 61 46 69 6c 65 5b 31 5d 2e 20 49 74  ing aFile[1]. It
4700: 20 74 68 65 6e 20 65 78 63 68 61 6e 67 65 73 0a   then exchanges.
4710: 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ** the contents 
4720: 6f 66 20 74 68 65 20 61 46 69 6c 65 5b 30 5d 20  of the aFile[0] 
4730: 61 6e 64 20 61 46 69 6c 65 5b 31 5d 20 76 61 72  and aFile[1] var
4740: 69 61 62 6c 65 73 20 77 69 74 68 69 6e 20 74 68  iables within th
4750: 69 73 20 73 74 72 75 63 74 75 72 65 2c 0a 2a 2a  is structure,.**
4760: 20 73 65 74 73 20 74 68 65 20 50 6d 61 52 65 61   sets the PmaRea
4770: 64 65 72 20 66 69 65 6c 64 73 20 74 6f 20 72 65  der fields to re
4780: 61 64 20 66 72 6f 6d 20 74 68 65 20 6e 65 77 20  ad from the new 
4790: 61 46 69 6c 65 5b 30 5d 20 61 6e 64 20 6b 69 63  aFile[0] and kic
47a0: 6b 73 20 6f 66 66 0a 2a 2a 20 61 6e 6f 74 68 65  ks off.** anothe
47b0: 72 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72  r background thr
47c0: 65 61 64 20 74 6f 20 70 6f 70 75 6c 61 74 65 20  ead to populate 
47d0: 74 68 65 20 6e 65 77 20 61 46 69 6c 65 5b 31 5d  the new aFile[1]
47e0: 2e 20 41 6e 64 20 73 6f 20 6f 6e 2c 20 75 6e 74  . And so on, unt
47f0: 69 6c 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  il.** the conten
4800: 74 73 20 6f 66 20 70 4d 65 72 67 65 72 20 61 72  ts of pMerger ar
4810: 65 20 65 78 68 61 75 73 74 65 64 2e 0a 2a 2a 0a  e exhausted..**.
4820: 2a 2a 20 41 20 73 69 6e 67 6c 65 2d 74 68 72 65  ** A single-thre
4830: 61 64 65 64 20 49 6e 63 72 4d 65 72 67 65 72 20  aded IncrMerger 
4840: 64 6f 65 73 20 6e 6f 74 20 6f 70 65 6e 20 61 6e  does not open an
4850: 79 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  y temporary file
4860: 73 20 6f 66 20 69 74 73 0a 2a 2a 20 6f 77 6e 2e  s of its.** own.
4870: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 68 61 73   Instead, it has
4880: 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73   exclusive acces
4890: 73 20 74 6f 20 6d 78 53 7a 20 62 79 74 65 73 20  s to mxSz bytes 
48a0: 6f 66 20 73 70 61 63 65 20 62 65 67 69 6e 6e 69  of space beginni
48b0: 6e 67 0a 2a 2a 20 61 74 20 6f 66 66 73 65 74 20  ng.** at offset 
48c0: 69 53 74 61 72 74 4f 66 66 20 6f 66 20 66 69 6c  iStartOff of fil
48d0: 65 20 70 54 61 73 6b 2d 3e 66 69 6c 65 32 2e 20  e pTask->file2. 
48e0: 41 6e 64 20 69 6e 73 74 65 61 64 20 6f 66 20 75  And instead of u
48f0: 73 69 6e 67 20 61 20 0a 2a 2a 20 62 61 63 6b 67  sing a .** backg
4900: 72 6f 75 6e 64 20 74 68 72 65 61 64 20 74 6f 20  round thread to 
4910: 70 72 65 70 61 72 65 20 64 61 74 61 20 66 6f 72  prepare data for
4920: 20 74 68 65 20 50 6d 61 52 65 61 64 65 72 2c 20   the PmaReader, 
4930: 77 69 74 68 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  with a single.**
4940: 20 74 68 72 65 61 64 65 64 20 49 6e 63 72 4d 65   threaded IncrMe
4950: 72 67 65 72 20 74 68 65 20 61 6c 6c 6f 63 61 74  rger the allocat
4960: 65 20 70 61 72 74 20 6f 66 20 70 54 61 73 6b 2d  e part of pTask-
4970: 3e 66 69 6c 65 32 20 69 73 20 22 72 65 66 69 6c  >file2 is "refil
4980: 6c 65 64 22 20 77 69 74 68 0a 2a 2a 20 6b 65 79  led" with.** key
4990: 73 20 66 72 6f 6d 20 70 4d 65 72 67 65 72 20 62  s from pMerger b
49a0: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 74 68  y the calling th
49b0: 72 65 61 64 20 77 68 65 6e 65 76 65 72 20 74 68  read whenever th
49c0: 65 20 50 6d 61 52 65 61 64 65 72 20 72 75 6e 73  e PmaReader runs
49d0: 20 6f 75 74 0a 2a 2a 20 6f 66 20 64 61 74 61 2e   out.** of data.
49e0: 0a 2a 2f 0a 73 74 72 75 63 74 20 49 6e 63 72 4d  .*/.struct IncrM
49f0: 65 72 67 65 72 20 7b 0a 20 20 53 6f 72 74 53 75  erger {.  SortSu
4a00: 62 74 61 73 6b 20 2a 70 54 61 73 6b 3b 20 20 20  btask *pTask;   
4a10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 73            /* Tas
4a20: 6b 20 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73  k that owns this
4a30: 20 6d 65 72 67 65 72 20 2a 2f 0a 20 20 4d 65 72   merger */.  Mer
4a40: 67 65 45 6e 67 69 6e 65 20 2a 70 4d 65 72 67 65  geEngine *pMerge
4a50: 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
4a60: 4d 65 72 67 65 20 65 6e 67 69 6e 65 20 74 68 72  Merge engine thr
4a70: 65 61 64 20 72 65 61 64 73 20 64 61 74 61 20 66  ead reads data f
4a80: 72 6f 6d 20 2a 2f 0a 20 20 69 36 34 20 69 53 74  rom */.  i64 iSt
4a90: 61 72 74 4f 66 66 3b 20 20 20 20 20 20 20 20 20  artOff;         
4aa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
4ab0: 65 74 20 74 6f 20 73 74 61 72 74 20 77 72 69 74  et to start writ
4ac0: 69 6e 67 20 66 69 6c 65 20 61 74 20 2a 2f 0a 20  ing file at */. 
4ad0: 20 69 6e 74 20 6d 78 53 7a 3b 20 20 20 20 20 20   int mxSz;      
4ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4af0: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 62 79 74 65   /* Maximum byte
4b00: 73 20 6f 66 20 64 61 74 61 20 74 6f 20 73 74 6f  s of data to sto
4b10: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 62 45 6f 66  re */.  int bEof
4b20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4b30: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
4b40: 6f 20 74 72 75 65 20 77 68 65 6e 20 6d 65 72 67  o true when merg
4b50: 65 20 69 73 20 66 69 6e 69 73 68 65 64 20 2a 2f  e is finished */
4b60: 0a 20 20 69 6e 74 20 62 55 73 65 54 68 72 65 61  .  int bUseThrea
4b70: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
4b80: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73     /* True to us
4b90: 65 20 61 20 62 67 20 74 68 72 65 61 64 20 66 6f  e a bg thread fo
4ba0: 72 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f  r this object */
4bb0: 0a 20 20 53 6f 72 74 65 72 46 69 6c 65 20 61 46  .  SorterFile aF
4bc0: 69 6c 65 5b 32 5d 3b 20 20 20 20 20 20 20 20 20  ile[2];         
4bd0: 20 20 20 2f 2a 20 61 46 69 6c 65 5b 30 5d 20 66     /* aFile[0] f
4be0: 6f 72 20 72 65 61 64 69 6e 67 2c 20 5b 31 5d 20  or reading, [1] 
4bf0: 66 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a 7d  for writing */.}
4c00: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
4c10: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a  ance of this obj
4c20: 65 63 74 20 69 73 20 75 73 65 64 20 66 6f 72 20  ect is used for 
4c30: 77 72 69 74 69 6e 67 20 61 20 50 4d 41 2e 0a 2a  writing a PMA..*
4c40: 2a 0a 2a 2a 20 54 68 65 20 50 4d 41 20 69 73 20  *.** The PMA is 
4c50: 77 72 69 74 74 65 6e 20 6f 6e 65 20 72 65 63 6f  written one reco
4c60: 72 64 20 61 74 20 61 20 74 69 6d 65 2e 20 20 45  rd at a time.  E
4c70: 61 63 68 20 72 65 63 6f 72 64 20 69 73 20 6f 66  ach record is of
4c80: 20 61 6e 20 61 72 62 69 74 72 61 72 79 0a 2a 2a   an arbitrary.**
4c90: 20 73 69 7a 65 2e 20 20 42 75 74 20 49 2f 4f 20   size.  But I/O 
4ca0: 69 73 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  is more efficien
4cb0: 74 20 69 66 20 69 74 20 6f 63 63 75 72 73 20 69  t if it occurs i
4cc0: 6e 20 70 61 67 65 2d 73 69 7a 65 64 20 62 6c 6f  n page-sized blo
4cd0: 63 6b 73 20 77 68 65 72 65 0a 2a 2a 20 65 61 63  cks where.** eac
4ce0: 68 20 62 6c 6f 63 6b 20 69 73 20 61 6c 69 67 6e  h block is align
4cf0: 65 64 20 6f 6e 20 61 20 70 61 67 65 20 62 6f 75  ed on a page bou
4d00: 6e 64 61 72 79 2e 20 20 54 68 69 73 20 6f 62 6a  ndary.  This obj
4d10: 65 63 74 20 63 61 63 68 65 73 20 77 72 69 74 65  ect caches write
4d20: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 50 4d 41 20  s to.** the PMA 
4d30: 73 6f 20 74 68 61 74 20 61 6c 69 67 6e 65 64 2c  so that aligned,
4d40: 20 70 61 67 65 2d 73 69 7a 65 20 62 6c 6f 63 6b   page-size block
4d50: 73 20 61 72 65 20 77 72 69 74 74 65 6e 2e 0a 2a  s are written..*
4d60: 2f 0a 73 74 72 75 63 74 20 50 6d 61 57 72 69 74  /.struct PmaWrit
4d70: 65 72 20 7b 0a 20 20 69 6e 74 20 65 46 57 45 72  er {.  int eFWEr
4d80: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
4d90: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65         /* Non-ze
4da0: 72 6f 20 69 66 20 69 6e 20 61 6e 20 65 72 72 6f  ro if in an erro
4db0: 72 20 73 74 61 74 65 20 2a 2f 0a 20 20 75 38 20  r state */.  u8 
4dc0: 2a 61 42 75 66 66 65 72 3b 20 20 20 20 20 20 20  *aBuffer;       
4dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4de0: 50 6f 69 6e 74 65 72 20 74 6f 20 77 72 69 74 65  Pointer to write
4df0: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
4e00: 20 6e 42 75 66 66 65 72 3b 20 20 20 20 20 20 20   nBuffer;       
4e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4e20: 53 69 7a 65 20 6f 66 20 77 72 69 74 65 20 62 75  Size of write bu
4e30: 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f  ffer in bytes */
4e40: 0a 20 20 69 6e 74 20 69 42 75 66 53 74 61 72 74  .  int iBufStart
4e50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4e60: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
4e70: 20 6f 66 20 62 75 66 66 65 72 20 74 6f 20 77 72   of buffer to wr
4e80: 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 42 75  ite */.  int iBu
4e90: 66 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  fEnd;           
4ea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
4eb0: 20 62 79 74 65 20 6f 66 20 62 75 66 66 65 72 20   byte of buffer 
4ec0: 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 69 36  to write */.  i6
4ed0: 34 20 69 57 72 69 74 65 4f 66 66 3b 20 20 20 20  4 iWriteOff;    
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4ef0: 20 4f 66 66 73 65 74 20 6f 66 20 73 74 61 72 74   Offset of start
4f00: 20 6f 66 20 62 75 66 66 65 72 20 69 6e 20 66 69   of buffer in fi
4f10: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
4f20: 66 69 6c 65 20 2a 70 46 64 3b 20 20 20 20 20 20  file *pFd;      
4f30: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
4f40: 68 61 6e 64 6c 65 20 74 6f 20 77 72 69 74 65 20  handle to write 
4f50: 74 6f 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  to */.};../*.** 
4f60: 54 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 74  This object is t
4f70: 68 65 20 68 65 61 64 65 72 20 6f 6e 20 61 20 73  he header on a s
4f80: 69 6e 67 6c 65 20 72 65 63 6f 72 64 20 77 68 69  ingle record whi
4f90: 6c 65 20 74 68 61 74 20 72 65 63 6f 72 64 20 69  le that record i
4fa0: 73 20 62 65 69 6e 67 0a 2a 2a 20 68 65 6c 64 20  s being.** held 
4fb0: 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20 70 72  in memory and pr
4fc0: 69 6f 72 20 74 6f 20 62 65 69 6e 67 20 77 72 69  ior to being wri
4fd0: 74 74 65 6e 20 6f 75 74 20 61 73 20 70 61 72 74  tten out as part
4fe0: 20 6f 66 20 61 20 50 4d 41 2e 0a 2a 2a 0a 2a 2a   of a PMA..**.**
4ff0: 20 48 6f 77 20 74 68 65 20 6c 69 6e 6b 65 64 20   How the linked 
5000: 6c 69 73 74 20 69 73 20 63 6f 6e 6e 65 63 74 65  list is connecte
5010: 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 68 6f 77  d depends on how
5020: 20 6d 65 6d 6f 72 79 20 69 73 20 62 65 69 6e 67   memory is being
5030: 20 6d 61 6e 61 67 65 64 0a 2a 2a 20 62 79 20 74   managed.** by t
5040: 68 69 73 20 6d 6f 64 75 6c 65 2e 20 49 66 20 75  his module. If u
5050: 73 69 6e 67 20 61 20 73 65 70 61 72 61 74 65 20  sing a separate 
5060: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 65  allocation for e
5070: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  ach in-memory re
5080: 63 6f 72 64 0a 2a 2a 20 28 56 64 62 65 53 6f 72  cord.** (VdbeSor
5090: 74 65 72 2e 6c 69 73 74 2e 61 4d 65 6d 6f 72 79  ter.list.aMemory
50a0: 3d 3d 30 29 2c 20 74 68 65 6e 20 74 68 65 20 6c  ==0), then the l
50b0: 69 73 74 20 69 73 20 61 6c 77 61 79 73 20 63 6f  ist is always co
50c0: 6e 6e 65 63 74 65 64 20 75 73 69 6e 67 20 74 68  nnected using th
50d0: 65 0a 2a 2a 20 53 6f 72 74 65 72 52 65 63 6f 72  e.** SorterRecor
50e0: 64 2e 75 2e 70 4e 65 78 74 20 70 6f 69 6e 74 65  d.u.pNext pointe
50f0: 72 73 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66  rs..**.** Or, if
5100: 20 75 73 69 6e 67 20 74 68 65 20 73 69 6e 67 6c   using the singl
5110: 65 20 6c 61 72 67 65 20 61 6c 6c 6f 63 61 74 69  e large allocati
5120: 6f 6e 20 6d 65 74 68 6f 64 20 28 56 64 62 65 53  on method (VdbeS
5130: 6f 72 74 65 72 2e 6c 69 73 74 2e 61 4d 65 6d 6f  orter.list.aMemo
5140: 72 79 21 3d 30 29 2c 0a 2a 2a 20 74 68 65 6e 20  ry!=0),.** then 
5150: 77 68 69 6c 65 20 72 65 63 6f 72 64 73 20 61 72  while records ar
5160: 65 20 62 65 69 6e 67 20 61 63 63 75 6d 75 6c 61  e being accumula
5170: 74 65 64 20 74 68 65 20 6c 69 73 74 20 69 73 20  ted the list is 
5180: 6c 69 6e 6b 65 64 20 75 73 69 6e 67 20 74 68 65  linked using the
5190: 0a 2a 2a 20 53 6f 72 74 65 72 52 65 63 6f 72 64  .** SorterRecord
51a0: 2e 75 2e 69 4e 65 78 74 20 6f 66 66 73 65 74 2e  .u.iNext offset.
51b0: 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
51c0: 20 74 68 65 20 61 4d 65 6d 6f 72 79 5b 5d 20 61   the aMemory[] a
51d0: 72 72 61 79 20 6d 61 79 0a 2a 2a 20 62 65 20 73  rray may.** be s
51e0: 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 29 65  qlite3Realloc()e
51f0: 64 20 77 68 69 6c 65 20 72 65 63 6f 72 64 73 20  d while records 
5200: 61 72 65 20 62 65 69 6e 67 20 61 63 63 75 6d 75  are being accumu
5210: 6c 61 74 65 64 2e 20 4f 6e 63 65 20 74 68 65 20  lated. Once the 
5220: 56 4d 0a 2a 2a 20 68 61 73 20 66 69 6e 69 73 68  VM.** has finish
5230: 65 64 20 70 61 73 73 69 6e 67 20 72 65 63 6f 72  ed passing recor
5240: 64 73 20 74 6f 20 74 68 65 20 73 6f 72 74 65 72  ds to the sorter
5250: 2c 20 6f 72 20 77 68 65 6e 20 74 68 65 20 69 6e  , or when the in
5260: 2d 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 0a 2a  -memory buffer.*
5270: 2a 20 69 73 20 66 75 6c 6c 2c 20 74 68 65 20 6c  * is full, the l
5280: 69 73 74 20 69 73 20 73 6f 72 74 65 64 2e 20 41  ist is sorted. A
5290: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 6f  s part of the so
52a0: 72 74 69 6e 67 20 70 72 6f 63 65 73 73 2c 20 69  rting process, i
52b0: 74 20 69 73 0a 2a 2a 20 63 6f 6e 76 65 72 74 65  t is.** converte
52c0: 64 20 74 6f 20 75 73 65 20 74 68 65 20 53 6f 72  d to use the Sor
52d0: 74 65 72 52 65 63 6f 72 64 2e 75 2e 70 4e 65 78  terRecord.u.pNex
52e0: 74 20 70 6f 69 6e 74 65 72 73 2e 20 53 65 65 20  t pointers. See 
52f0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 76 64 62 65  function.** vdbe
5300: 53 6f 72 74 65 72 53 6f 72 74 28 29 20 66 6f 72  SorterSort() for
5310: 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 73 74 72   details..*/.str
5320: 75 63 74 20 53 6f 72 74 65 72 52 65 63 6f 72 64  uct SorterRecord
5330: 20 7b 0a 20 20 69 6e 74 20 6e 56 61 6c 3b 20 20   {.  int nVal;  
5340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5350: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
5360: 74 68 65 20 72 65 63 6f 72 64 20 69 6e 20 62 79  the record in by
5370: 74 65 73 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b  tes */.  union {
5380: 0a 20 20 20 20 53 6f 72 74 65 72 52 65 63 6f 72  .    SorterRecor
5390: 64 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  d *pNext;       
53a0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
53b0: 20 6e 65 78 74 20 72 65 63 6f 72 64 20 69 6e 20   next record in 
53c0: 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  list */.    int 
53d0: 69 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  iNext;          
53e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
53f0: 73 65 74 20 77 69 74 68 69 6e 20 61 4d 65 6d 6f  set within aMemo
5400: 72 79 20 6f 66 20 6e 65 78 74 20 72 65 63 6f 72  ry of next recor
5410: 64 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20 20 2f 2a  d */.  } u;.  /*
5420: 20 54 68 65 20 64 61 74 61 20 66 6f 72 20 74 68   The data for th
5430: 65 20 72 65 63 6f 72 64 20 69 6d 6d 65 64 69 61  e record immedia
5440: 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68 69  tely follows thi
5450: 73 20 68 65 61 64 65 72 20 2a 2f 0a 7d 3b 0a 0a  s header */.};..
5460: 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  /* Return a poin
5470: 74 65 72 20 74 6f 20 74 68 65 20 62 75 66 66 65  ter to the buffe
5480: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
5490: 20 72 65 63 6f 72 64 20 64 61 74 61 20 66 6f 72   record data for
54a0: 20 53 6f 72 74 65 72 52 65 63 6f 72 64 0a 2a 2a   SorterRecord.**
54b0: 20 6f 62 6a 65 63 74 20 70 2e 20 53 68 6f 75 6c   object p. Shoul
54c0: 64 20 62 65 20 75 73 65 64 20 61 73 20 69 66 3a  d be used as if:
54d0: 0a 2a 2a 0a 2a 2a 20 20 20 76 6f 69 64 20 2a 53  .**.**   void *S
54e0: 52 56 41 4c 28 53 6f 72 74 65 72 52 65 63 6f 72  RVAL(SorterRecor
54f0: 64 20 2a 70 29 20 7b 20 72 65 74 75 72 6e 20 28  d *p) { return (
5500: 76 6f 69 64 2a 29 26 70 5b 31 5d 3b 20 7d 0a 2a  void*)&p[1]; }.*
5510: 2f 0a 23 64 65 66 69 6e 65 20 53 52 56 41 4c 28  /.#define SRVAL(
5520: 70 29 20 28 28 76 6f 69 64 2a 29 28 28 53 6f 72  p) ((void*)((Sor
5530: 74 65 72 52 65 63 6f 72 64 2a 29 28 70 29 20 2b  terRecord*)(p) +
5540: 20 31 29 29 0a 0a 0a 2f 2a 20 4d 61 78 69 6d 75   1)).../* Maximu
5550: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 50 4d 41 73  m number of PMAs
5560: 20 74 68 61 74 20 61 20 73 69 6e 67 6c 65 20 4d   that a single M
5570: 65 72 67 65 45 6e 67 69 6e 65 20 63 61 6e 20 6d  ergeEngine can m
5580: 65 72 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  erge */.#define 
5590: 53 4f 52 54 45 52 5f 4d 41 58 5f 4d 45 52 47 45  SORTER_MAX_MERGE
55a0: 5f 43 4f 55 4e 54 20 31 36 0a 0a 73 74 61 74 69  _COUNT 16..stati
55b0: 63 20 69 6e 74 20 76 64 62 65 49 6e 63 72 53 77  c int vdbeIncrSw
55c0: 61 70 28 49 6e 63 72 4d 65 72 67 65 72 2a 29 3b  ap(IncrMerger*);
55d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
55e0: 65 49 6e 63 72 46 72 65 65 28 49 6e 63 72 4d 65  eIncrFree(IncrMe
55f0: 72 67 65 72 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  rger *);../*.** 
5600: 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
5610: 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65  belonging to the
5620: 20 50 6d 61 52 65 61 64 65 72 20 6f 62 6a 65 63   PmaReader objec
5630: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a  t passed as the.
5640: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6c 6c  ** argument. All
5650: 20 73 74 72 75 63 74 75 72 65 20 66 69 65 6c 64   structure field
5660: 73 20 61 72 65 20 73 65 74 20 74 6f 20 7a 65 72  s are set to zer
5670: 6f 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  o before returni
5680: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
5690: 69 64 20 76 64 62 65 50 6d 61 52 65 61 64 65 72  id vdbePmaReader
56a0: 43 6c 65 61 72 28 50 6d 61 52 65 61 64 65 72 20  Clear(PmaReader 
56b0: 2a 70 52 65 61 64 72 29 7b 0a 20 20 73 71 6c 69  *pReadr){.  sqli
56c0: 74 65 33 5f 66 72 65 65 28 70 52 65 61 64 72 2d  te3_free(pReadr-
56d0: 3e 61 41 6c 6c 6f 63 29 3b 0a 20 20 73 71 6c 69  >aAlloc);.  sqli
56e0: 74 65 33 5f 66 72 65 65 28 70 52 65 61 64 72 2d  te3_free(pReadr-
56f0: 3e 61 42 75 66 66 65 72 29 3b 0a 20 20 69 66 28  >aBuffer);.  if(
5700: 20 70 52 65 61 64 72 2d 3e 61 4d 61 70 20 29 20   pReadr->aMap ) 
5710: 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
5720: 28 70 52 65 61 64 72 2d 3e 70 46 64 2c 20 30 2c  (pReadr->pFd, 0,
5730: 20 70 52 65 61 64 72 2d 3e 61 4d 61 70 29 3b 0a   pReadr->aMap);.
5740: 20 20 76 64 62 65 49 6e 63 72 46 72 65 65 28 70    vdbeIncrFree(p
5750: 52 65 61 64 72 2d 3e 70 49 6e 63 72 29 3b 0a 20  Readr->pIncr);. 
5760: 20 6d 65 6d 73 65 74 28 70 52 65 61 64 72 2c 20   memset(pReadr, 
5770: 30 2c 20 73 69 7a 65 6f 66 28 50 6d 61 52 65 61  0, sizeof(PmaRea
5780: 64 65 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  der));.}../*.** 
5790: 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6e 42  Read the next nB
57a0: 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  yte bytes of dat
57b0: 61 20 66 72 6f 6d 20 74 68 65 20 50 4d 41 20 70  a from the PMA p
57c0: 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  ..** If successf
57d0: 75 6c 2c 20 73 65 74 20 2a 70 70 4f 75 74 20 74  ul, set *ppOut t
57e0: 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  o point to a buf
57f0: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
5800: 68 65 20 64 61 74 61 0a 2a 2a 20 61 6e 64 20 72  he data.** and r
5810: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
5820: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
5830: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
5840: 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
5850: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  .** error code..
5860: 2a 2a 0a 2a 2a 20 54 68 65 20 62 75 66 66 65 72  **.** The buffer
5870: 20 72 65 74 75 72 6e 65 64 20 69 6e 20 2a 70 70   returned in *pp
5880: 4f 75 74 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69  Out is only vali
5890: 64 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6e  d until the.** n
58a0: 65 78 74 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  ext call to this
58b0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
58c0: 61 74 69 63 20 69 6e 74 20 76 64 62 65 50 6d 61  atic int vdbePma
58d0: 52 65 61 64 42 6c 6f 62 28 0a 20 20 50 6d 61 52  ReadBlob(.  PmaR
58e0: 65 61 64 65 72 20 2a 70 2c 20 20 20 20 20 20 20  eader *p,       
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
5900: 6d 61 52 65 61 64 65 72 20 66 72 6f 6d 20 77 68  maReader from wh
5910: 69 63 68 20 74 6f 20 74 61 6b 65 20 74 68 65 20  ich to take the 
5920: 62 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  blob */.  int nB
5930: 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  yte,            
5940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
5950: 65 73 20 6f 66 20 64 61 74 61 20 74 6f 20 72 65  es of data to re
5960: 61 64 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 4f  ad */.  u8 **ppO
5970: 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
5980: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
5990: 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
59a0: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 64 61 74  r containing dat
59b0: 61 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 42  a */.){.  int iB
59c0: 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  uf;             
59d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
59e0: 73 65 74 20 77 69 74 68 69 6e 20 62 75 66 66 65  set within buffe
59f0: 72 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  r to read from *
5a00: 2f 0a 20 20 69 6e 74 20 6e 41 76 61 69 6c 3b 20  /.  int nAvail; 
5a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a20: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
5a30: 64 61 74 61 20 61 76 61 69 6c 61 62 6c 65 20 69  data available i
5a40: 6e 20 62 75 66 66 65 72 20 2a 2f 0a 0a 20 20 69  n buffer */..  i
5a50: 66 28 20 70 2d 3e 61 4d 61 70 20 29 7b 0a 20 20  f( p->aMap ){.  
5a60: 20 20 2a 70 70 4f 75 74 20 3d 20 26 70 2d 3e 61    *ppOut = &p->a
5a70: 4d 61 70 5b 70 2d 3e 69 52 65 61 64 4f 66 66 5d  Map[p->iReadOff]
5a80: 3b 0a 20 20 20 20 70 2d 3e 69 52 65 61 64 4f 66  ;.    p->iReadOf
5a90: 66 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20  f += nByte;.    
5aa0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5ab0: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
5ac0: 20 70 2d 3e 61 42 75 66 66 65 72 20 29 3b 0a 0a   p->aBuffer );..
5ad0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
5ae0: 20 6e 6f 20 6d 6f 72 65 20 64 61 74 61 20 74 6f   no more data to
5af0: 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
5b00: 65 20 62 75 66 66 65 72 2c 20 72 65 61 64 20 74  e buffer, read t
5b10: 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20 70 2d  he next .  ** p-
5b20: 3e 6e 42 75 66 66 65 72 20 62 79 74 65 73 20 6f  >nBuffer bytes o
5b30: 66 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  f data from the 
5b40: 66 69 6c 65 20 69 6e 74 6f 20 69 74 2e 20 4f 72  file into it. Or
5b50: 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6c  , if there are l
5b60: 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 70 2d  ess.  ** than p-
5b70: 3e 6e 42 75 66 66 65 72 20 62 79 74 65 73 20 72  >nBuffer bytes r
5b80: 65 6d 61 69 6e 69 6e 67 20 69 6e 20 74 68 65 20  emaining in the 
5b90: 50 4d 41 2c 20 72 65 61 64 20 61 6c 6c 20 72 65  PMA, read all re
5ba0: 6d 61 69 6e 69 6e 67 20 64 61 74 61 2e 20 20 2a  maining data.  *
5bb0: 2f 0a 20 20 69 42 75 66 20 3d 20 70 2d 3e 69 52  /.  iBuf = p->iR
5bc0: 65 61 64 4f 66 66 20 25 20 70 2d 3e 6e 42 75 66  eadOff % p->nBuf
5bd0: 66 65 72 3b 0a 20 20 69 66 28 20 69 42 75 66 3d  fer;.  if( iBuf=
5be0: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 52  =0 ){.    int nR
5bf0: 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ead;            
5c00: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
5c10: 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 64 69   to read from di
5c20: 73 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63  sk */.    int rc
5c30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5c40: 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
5c50: 65 33 4f 73 52 65 61 64 28 29 20 72 65 74 75 72  e3OsRead() retur
5c60: 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 20 20 2f  n code */..    /
5c70: 2a 20 44 65 74 65 72 6d 69 6e 65 20 68 6f 77 20  * Determine how 
5c80: 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 64 61  many bytes of da
5c90: 74 61 20 74 6f 20 72 65 61 64 2e 20 2a 2f 0a 20  ta to read. */. 
5ca0: 20 20 20 69 66 28 20 28 70 2d 3e 69 45 6f 66 20     if( (p->iEof 
5cb0: 2d 20 70 2d 3e 69 52 65 61 64 4f 66 66 29 20 3e  - p->iReadOff) >
5cc0: 20 28 69 36 34 29 70 2d 3e 6e 42 75 66 66 65 72   (i64)p->nBuffer
5cd0: 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 61 64 20   ){.      nRead 
5ce0: 3d 20 70 2d 3e 6e 42 75 66 66 65 72 3b 0a 20 20  = p->nBuffer;.  
5cf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
5d00: 52 65 61 64 20 3d 20 28 69 6e 74 29 28 70 2d 3e  Read = (int)(p->
5d10: 69 45 6f 66 20 2d 20 70 2d 3e 69 52 65 61 64 4f  iEof - p->iReadO
5d20: 66 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ff);.    }.    a
5d30: 73 73 65 72 74 28 20 6e 52 65 61 64 3e 30 20 29  ssert( nRead>0 )
5d40: 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 72 20  ;..    /* Readr 
5d50: 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 66 69  data from the fi
5d60: 6c 65 2e 20 52 65 74 75 72 6e 20 65 61 72 6c 79  le. Return early
5d70: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
5d80: 75 72 73 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  urs. */.    rc =
5d90: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
5da0: 2d 3e 70 46 64 2c 20 70 2d 3e 61 42 75 66 66 65  ->pFd, p->aBuffe
5db0: 72 2c 20 6e 52 65 61 64 2c 20 70 2d 3e 69 52 65  r, nRead, p->iRe
5dc0: 61 64 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65  adOff);.    asse
5dd0: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 49  rt( rc!=SQLITE_I
5de0: 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
5df0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
5e00: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
5e10: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6e 41 76 61  n rc;.  }.  nAva
5e20: 69 6c 20 3d 20 70 2d 3e 6e 42 75 66 66 65 72 20  il = p->nBuffer 
5e30: 2d 20 69 42 75 66 3b 20 0a 0a 20 20 69 66 28 20  - iBuf; ..  if( 
5e40: 6e 42 79 74 65 3c 3d 6e 41 76 61 69 6c 20 29 7b  nByte<=nAvail ){
5e50: 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
5e60: 65 73 74 65 64 20 64 61 74 61 20 69 73 20 61 76  ested data is av
5e70: 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 69  ailable in the i
5e80: 6e 2d 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e  n-memory buffer.
5e90: 20 49 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   In this.    ** 
5ea0: 63 61 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f  case there is no
5eb0: 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 20   need to make a 
5ec0: 63 6f 70 79 20 6f 66 20 74 68 65 20 64 61 74 61  copy of the data
5ed0: 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20 61 20  , just return a 
5ee0: 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20  .    ** pointer 
5ef0: 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  into the buffer 
5f00: 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 20  to the caller.  
5f10: 2a 2f 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20  */.    *ppOut = 
5f20: 26 70 2d 3e 61 42 75 66 66 65 72 5b 69 42 75 66  &p->aBuffer[iBuf
5f30: 5d 3b 0a 20 20 20 20 70 2d 3e 69 52 65 61 64 4f  ];.    p->iReadO
5f40: 66 66 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d  ff += nByte;.  }
5f50: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
5f60: 20 72 65 71 75 65 73 74 65 64 20 64 61 74 61 20   requested data 
5f70: 69 73 20 6e 6f 74 20 61 6c 6c 20 61 76 61 69 6c  is not all avail
5f80: 61 62 6c 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d  able in the in-m
5f90: 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 0a 20 20  emory buffer..  
5fa0: 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
5fb0: 65 2c 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  e, allocate spac
5fc0: 65 20 61 74 20 70 2d 3e 61 41 6c 6c 6f 63 5b 5d  e at p->aAlloc[]
5fd0: 20 74 6f 20 63 6f 70 79 20 74 68 65 20 72 65 71   to copy the req
5fe0: 75 65 73 74 65 64 0a 20 20 20 20 2a 2a 20 72 61  uested.    ** ra
5ff0: 6e 67 65 20 69 6e 74 6f 2e 20 54 68 65 6e 20 72  nge into. Then r
6000: 65 74 75 72 6e 20 61 20 63 6f 70 79 20 6f 66 20  eturn a copy of 
6010: 70 6f 69 6e 74 65 72 20 70 2d 3e 61 41 6c 6c 6f  pointer p->aAllo
6020: 63 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  c to the caller.
6030: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65    */.    int nRe
6040: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
6050: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
6060: 72 65 6d 61 69 6e 69 6e 67 20 74 6f 20 63 6f 70  remaining to cop
6070: 79 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 78 74  y */..    /* Ext
6080: 65 6e 64 20 74 68 65 20 70 2d 3e 61 41 6c 6c 6f  end the p->aAllo
6090: 63 5b 5d 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  c[] allocation i
60a0: 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
60b0: 20 20 20 69 66 28 20 70 2d 3e 6e 41 6c 6c 6f 63     if( p->nAlloc
60c0: 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20  <nByte ){.      
60d0: 75 38 20 2a 61 4e 65 77 3b 0a 20 20 20 20 20 20  u8 *aNew;.      
60e0: 69 6e 74 20 6e 4e 65 77 20 3d 20 4d 41 58 28 31  int nNew = MAX(1
60f0: 32 38 2c 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 29  28, p->nAlloc*2)
6100: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 6e  ;.      while( n
6110: 42 79 74 65 3e 6e 4e 65 77 20 29 20 6e 4e 65 77  Byte>nNew ) nNew
6120: 20 3d 20 6e 4e 65 77 2a 32 3b 0a 20 20 20 20 20   = nNew*2;.     
6130: 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 52   aNew = sqlite3R
6140: 65 61 6c 6c 6f 63 28 70 2d 3e 61 41 6c 6c 6f 63  ealloc(p->aAlloc
6150: 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 69  , nNew);.      i
6160: 66 28 20 21 61 4e 65 77 20 29 20 72 65 74 75 72  f( !aNew ) retur
6170: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
6180: 20 20 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20        p->nAlloc 
6190: 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 70 2d  = nNew;.      p-
61a0: 3e 61 41 6c 6c 6f 63 20 3d 20 61 4e 65 77 3b 0a  >aAlloc = aNew;.
61b0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
61c0: 70 79 20 61 73 20 6d 75 63 68 20 64 61 74 61 20  py as much data 
61d0: 61 73 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  as is available 
61e0: 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 69 6e  in the buffer in
61f0: 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a  to the start of.
6200: 20 20 20 20 2a 2a 20 70 2d 3e 61 41 6c 6c 6f 63      ** p->aAlloc
6210: 5b 5d 2e 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 63  [].  */.    memc
6220: 70 79 28 70 2d 3e 61 41 6c 6c 6f 63 2c 20 26 70  py(p->aAlloc, &p
6230: 2d 3e 61 42 75 66 66 65 72 5b 69 42 75 66 5d 2c  ->aBuffer[iBuf],
6240: 20 6e 41 76 61 69 6c 29 3b 0a 20 20 20 20 70 2d   nAvail);.    p-
6250: 3e 69 52 65 61 64 4f 66 66 20 2b 3d 20 6e 41 76  >iReadOff += nAv
6260: 61 69 6c 3b 0a 20 20 20 20 6e 52 65 6d 20 3d 20  ail;.    nRem = 
6270: 6e 42 79 74 65 20 2d 20 6e 41 76 61 69 6c 3b 0a  nByte - nAvail;.
6280: 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
6290: 6f 77 69 6e 67 20 6c 6f 6f 70 20 63 6f 70 69 65  owing loop copie
62a0: 73 20 75 70 20 74 6f 20 70 2d 3e 6e 42 75 66 66  s up to p->nBuff
62b0: 65 72 20 62 79 74 65 73 20 70 65 72 20 69 74 65  er bytes per ite
62c0: 72 61 74 69 6f 6e 20 69 6e 74 6f 0a 20 20 20 20  ration into.    
62d0: 2a 2a 20 74 68 65 20 70 2d 3e 61 41 6c 6c 6f 63  ** the p->aAlloc
62e0: 5b 5d 20 62 75 66 66 65 72 2e 20 20 2a 2f 0a 20  [] buffer.  */. 
62f0: 20 20 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30     while( nRem>0
6300: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
6310: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6320: 20 20 20 20 20 20 2f 2a 20 76 64 62 65 50 6d 61        /* vdbePma
6330: 52 65 61 64 42 6c 6f 62 28 29 20 72 65 74 75 72  ReadBlob() retur
6340: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  n code */.      
6350: 69 6e 74 20 6e 43 6f 70 79 3b 20 20 20 20 20 20  int nCopy;      
6360: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6370: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
6380: 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 20 20 20 20  o copy */.      
6390: 75 38 20 2a 61 4e 65 78 74 3b 20 20 20 20 20 20  u8 *aNext;      
63a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
63b0: 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
63c0: 20 74 6f 20 63 6f 70 79 20 64 61 74 61 20 66 72   to copy data fr
63d0: 6f 6d 20 2a 2f 0a 0a 20 20 20 20 20 20 6e 43 6f  om */..      nCo
63e0: 70 79 20 3d 20 6e 52 65 6d 3b 0a 20 20 20 20 20  py = nRem;.     
63f0: 20 69 66 28 20 6e 52 65 6d 3e 70 2d 3e 6e 42 75   if( nRem>p->nBu
6400: 66 66 65 72 20 29 20 6e 43 6f 70 79 20 3d 20 70  ffer ) nCopy = p
6410: 2d 3e 6e 42 75 66 66 65 72 3b 0a 20 20 20 20 20  ->nBuffer;.     
6420: 20 72 63 20 3d 20 76 64 62 65 50 6d 61 52 65 61   rc = vdbePmaRea
6430: 64 42 6c 6f 62 28 70 2c 20 6e 43 6f 70 79 2c 20  dBlob(p, nCopy, 
6440: 26 61 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69  &aNext);.      i
6450: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
6460: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
6470: 20 20 20 20 61 73 73 65 72 74 28 20 61 4e 65 78      assert( aNex
6480: 74 21 3d 70 2d 3e 61 41 6c 6c 6f 63 20 29 3b 0a  t!=p->aAlloc );.
6490: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 2d        memcpy(&p-
64a0: 3e 61 41 6c 6c 6f 63 5b 6e 42 79 74 65 20 2d 20  >aAlloc[nByte - 
64b0: 6e 52 65 6d 5d 2c 20 61 4e 65 78 74 2c 20 6e 43  nRem], aNext, nC
64c0: 6f 70 79 29 3b 0a 20 20 20 20 20 20 6e 52 65 6d  opy);.      nRem
64d0: 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d   -= nCopy;.    }
64e0: 0a 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 70  ..    *ppOut = p
64f0: 2d 3e 61 41 6c 6c 6f 63 3b 0a 20 20 7d 0a 0a 20  ->aAlloc;.  }.. 
6500: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6510: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  K;.}../*.** Read
6520: 20 61 20 76 61 72 69 6e 74 20 66 72 6f 6d 20 74   a varint from t
6530: 68 65 20 73 74 72 65 61 6d 20 6f 66 20 64 61 74  he stream of dat
6540: 61 20 61 63 63 65 73 73 65 64 20 62 79 20 70 2e  a accessed by p.
6550: 20 53 65 74 20 2a 70 6e 4f 75 74 20 74 6f 0a 2a   Set *pnOut to.*
6560: 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  * the value read
6570: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6580: 76 64 62 65 50 6d 61 52 65 61 64 56 61 72 69 6e  vdbePmaReadVarin
6590: 74 28 50 6d 61 52 65 61 64 65 72 20 2a 70 2c 20  t(PmaReader *p, 
65a0: 75 36 34 20 2a 70 6e 4f 75 74 29 7b 0a 20 20 69  u64 *pnOut){.  i
65b0: 6e 74 20 69 42 75 66 3b 0a 0a 20 20 69 66 28 20  nt iBuf;..  if( 
65c0: 70 2d 3e 61 4d 61 70 20 29 7b 0a 20 20 20 20 70  p->aMap ){.    p
65d0: 2d 3e 69 52 65 61 64 4f 66 66 20 2b 3d 20 73 71  ->iReadOff += sq
65e0: 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 28 26  lite3GetVarint(&
65f0: 70 2d 3e 61 4d 61 70 5b 70 2d 3e 69 52 65 61 64  p->aMap[p->iRead
6600: 4f 66 66 5d 2c 20 70 6e 4f 75 74 29 3b 0a 20 20  Off], pnOut);.  
6610: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 42 75 66 20  }else{.    iBuf 
6620: 3d 20 70 2d 3e 69 52 65 61 64 4f 66 66 20 25 20  = p->iReadOff % 
6630: 70 2d 3e 6e 42 75 66 66 65 72 3b 0a 20 20 20 20  p->nBuffer;.    
6640: 69 66 28 20 69 42 75 66 20 26 26 20 28 70 2d 3e  if( iBuf && (p->
6650: 6e 42 75 66 66 65 72 2d 69 42 75 66 29 3e 3d 39  nBuffer-iBuf)>=9
6660: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65   ){.      p->iRe
6670: 61 64 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33  adOff += sqlite3
6680: 47 65 74 56 61 72 69 6e 74 28 26 70 2d 3e 61 42  GetVarint(&p->aB
6690: 75 66 66 65 72 5b 69 42 75 66 5d 2c 20 70 6e 4f  uffer[iBuf], pnO
66a0: 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ut);.    }else{.
66b0: 20 20 20 20 20 20 75 38 20 61 56 61 72 69 6e 74        u8 aVarint
66c0: 5b 31 36 5d 2c 20 2a 61 3b 0a 20 20 20 20 20 20  [16], *a;.      
66d0: 69 6e 74 20 69 20 3d 20 30 2c 20 72 63 3b 0a 20  int i = 0, rc;. 
66e0: 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
66f0: 20 72 63 20 3d 20 76 64 62 65 50 6d 61 52 65 61   rc = vdbePmaRea
6700: 64 42 6c 6f 62 28 70 2c 20 31 2c 20 26 61 29 3b  dBlob(p, 1, &a);
6710: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
6720: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
6730: 20 20 20 20 20 61 56 61 72 69 6e 74 5b 28 69 2b       aVarint[(i+
6740: 2b 29 26 30 78 66 5d 20 3d 20 61 5b 30 5d 3b 0a  +)&0xf] = a[0];.
6750: 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 28 61        }while( (a
6760: 5b 30 5d 26 30 78 38 30 29 21 3d 30 20 29 3b 0a  [0]&0x80)!=0 );.
6770: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 74        sqlite3Get
6780: 56 61 72 69 6e 74 28 61 56 61 72 69 6e 74 2c 20  Varint(aVarint, 
6790: 70 6e 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pnOut);.    }.  
67a0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
67b0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
67c0: 41 74 74 65 6d 70 74 20 74 6f 20 6d 65 6d 6f 72  Attempt to memor
67d0: 79 20 6d 61 70 20 66 69 6c 65 20 70 46 69 6c 65  y map file pFile
67e0: 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
67f0: 20 73 65 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e   set *pp to poin
6800: 74 20 74 6f 20 74 68 65 0a 2a 2a 20 6e 65 77 20  t to the.** new 
6810: 6d 61 70 70 69 6e 67 20 61 6e 64 20 72 65 74 75  mapping and retu
6820: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  rn SQLITE_OK. If
6830: 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20   the mapping is 
6840: 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 20 0a 2a  not attempted .*
6850: 2a 20 28 62 65 63 61 75 73 65 20 74 68 65 20 66  * (because the f
6860: 69 6c 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  ile is too large
6870: 20 6f 72 20 74 68 65 20 56 46 53 20 6c 61 79 65   or the VFS laye
6880: 72 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20  r is configured 
6890: 6e 6f 74 20 74 6f 20 75 73 65 0a 2a 2a 20 6d 6d  not to use.** mm
68a0: 61 70 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ap), return SQLI
68b0: 54 45 5f 4f 4b 20 61 6e 64 20 73 65 74 20 2a 70  TE_OK and set *p
68c0: 70 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  p to NULL..**.**
68d0: 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72   Or, if an error
68e0: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
68f0: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
6900: 63 6f 64 65 2e 20 54 68 65 20 66 69 6e 61 6c 20  code. The final 
6910: 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 2a 70 70 20  value of.** *pp 
6920: 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  is undefined in 
6930: 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74  this case..*/.st
6940: 61 74 69 63 20 69 6e 74 20 76 64 62 65 53 6f 72  atic int vdbeSor
6950: 74 65 72 4d 61 70 46 69 6c 65 28 53 6f 72 74 53  terMapFile(SortS
6960: 75 62 74 61 73 6b 20 2a 70 54 61 73 6b 2c 20 53  ubtask *pTask, S
6970: 6f 72 74 65 72 46 69 6c 65 20 2a 70 46 69 6c 65  orterFile *pFile
6980: 2c 20 75 38 20 2a 2a 70 70 29 7b 0a 20 20 69 6e  , u8 **pp){.  in
6990: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
69a0: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69  ;.  if( pFile->i
69b0: 45 6f 66 3c 3d 28 69 36 34 29 28 70 54 61 73 6b  Eof<=(i64)(pTask
69c0: 2d 3e 70 53 6f 72 74 65 72 2d 3e 64 62 2d 3e 6e  ->pSorter->db->n
69d0: 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70 29 20 29  MaxSorterMmap) )
69e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  {.    sqlite3_fi
69f0: 6c 65 20 2a 70 46 64 20 3d 20 70 46 69 6c 65 2d  le *pFd = pFile-
6a00: 3e 70 46 64 3b 0a 20 20 20 20 69 66 28 20 70 46  >pFd;.    if( pF
6a10: 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65  d->pMethods->iVe
6a20: 72 73 69 6f 6e 3e 3d 33 20 29 7b 0a 20 20 20 20  rsion>=3 ){.    
6a30: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6a40: 46 65 74 63 68 28 70 46 64 2c 20 30 2c 20 28 69  Fetch(pFd, 0, (i
6a50: 6e 74 29 70 46 69 6c 65 2d 3e 69 45 6f 66 2c 20  nt)pFile->iEof, 
6a60: 28 76 6f 69 64 2a 2a 29 70 70 29 3b 0a 20 20 20  (void**)pp);.   
6a70: 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
6a80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
6a90: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
6aa0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74   rc;.}../*.** At
6ab0: 74 61 63 68 20 50 6d 61 52 65 61 64 65 72 20 70  tach PmaReader p
6ac0: 52 65 61 64 72 20 74 6f 20 66 69 6c 65 20 70 46  Readr to file pF
6ad0: 69 6c 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f  ile (if it is no
6ae0: 74 20 61 6c 72 65 61 64 79 20 61 74 74 61 63 68  t already attach
6af0: 65 64 20 74 6f 0a 2a 2a 20 74 68 61 74 20 66 69  ed to.** that fi
6b00: 6c 65 29 20 61 6e 64 20 73 65 65 6b 20 69 74 20  le) and seek it 
6b10: 74 6f 20 6f 66 66 73 65 74 20 69 4f 66 66 20 77  to offset iOff w
6b20: 69 74 68 69 6e 20 74 68 65 20 66 69 6c 65 2e 20  ithin the file. 
6b30: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
6b40: 4b 20 0a 2a 2a 20 69 66 20 73 75 63 63 65 73 73  K .** if success
6b50: 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
6b60: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  e error code if 
6b70: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
6b80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
6b90: 64 62 65 50 6d 61 52 65 61 64 65 72 53 65 65 6b  dbePmaReaderSeek
6ba0: 28 0a 20 20 53 6f 72 74 53 75 62 74 61 73 6b 20  (.  SortSubtask 
6bb0: 2a 70 54 61 73 6b 2c 20 20 20 20 20 20 20 20 20  *pTask,         
6bc0: 20 20 20 20 2f 2a 20 54 61 73 6b 20 63 6f 6e 74      /* Task cont
6bd0: 65 78 74 20 2a 2f 0a 20 20 50 6d 61 52 65 61 64  ext */.  PmaRead
6be0: 65 72 20 2a 70 52 65 61 64 72 2c 20 20 20 20 20  er *pReadr,     
6bf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
6c00: 65 72 20 77 68 6f 73 65 20 63 75 72 73 6f 72 20  er whose cursor 
6c10: 69 73 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a  is to be moved *
6c20: 2f 0a 20 20 53 6f 72 74 65 72 46 69 6c 65 20 2a  /.  SorterFile *
6c30: 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  pFile,          
6c40: 20 20 20 20 2f 2a 20 53 6f 72 74 65 72 20 66 69      /* Sorter fi
6c50: 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  le to read from 
6c60: 2a 2f 0a 20 20 69 36 34 20 69 4f 66 66 20 20 20  */.  i64 iOff   
6c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c80: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
6c90: 6e 20 70 46 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  n pFile */.){.  
6ca0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
6cb0: 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
6cc0: 52 65 61 64 72 2d 3e 70 49 6e 63 72 3d 3d 30 20  Readr->pIncr==0 
6cd0: 7c 7c 20 70 52 65 61 64 72 2d 3e 70 49 6e 63 72  || pReadr->pIncr
6ce0: 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 0a 20 20  ->bEof==0 );..  
6cf0: 69 66 28 20 73 71 6c 69 74 65 33 46 61 75 6c 74  if( sqlite3Fault
6d00: 53 69 6d 28 32 30 31 29 20 29 20 72 65 74 75 72  Sim(201) ) retur
6d10: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  n SQLITE_IOERR_R
6d20: 45 41 44 3b 0a 20 20 69 66 28 20 70 52 65 61 64  EAD;.  if( pRead
6d30: 72 2d 3e 61 4d 61 70 20 29 7b 0a 20 20 20 20 73  r->aMap ){.    s
6d40: 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28  qlite3OsUnfetch(
6d50: 70 52 65 61 64 72 2d 3e 70 46 64 2c 20 30 2c 20  pReadr->pFd, 0, 
6d60: 70 52 65 61 64 72 2d 3e 61 4d 61 70 29 3b 0a 20  pReadr->aMap);. 
6d70: 20 20 20 70 52 65 61 64 72 2d 3e 61 4d 61 70 20     pReadr->aMap 
6d80: 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 52 65 61 64  = 0;.  }.  pRead
6d90: 72 2d 3e 69 52 65 61 64 4f 66 66 20 3d 20 69 4f  r->iReadOff = iO
6da0: 66 66 3b 0a 20 20 70 52 65 61 64 72 2d 3e 69 45  ff;.  pReadr->iE
6db0: 6f 66 20 3d 20 70 46 69 6c 65 2d 3e 69 45 6f 66  of = pFile->iEof
6dc0: 3b 0a 20 20 70 52 65 61 64 72 2d 3e 70 46 64 20  ;.  pReadr->pFd 
6dd0: 3d 20 70 46 69 6c 65 2d 3e 70 46 64 3b 0a 0a 20  = pFile->pFd;.. 
6de0: 20 72 63 20 3d 20 76 64 62 65 53 6f 72 74 65 72   rc = vdbeSorter
6df0: 4d 61 70 46 69 6c 65 28 70 54 61 73 6b 2c 20 70  MapFile(pTask, p
6e00: 46 69 6c 65 2c 20 26 70 52 65 61 64 72 2d 3e 61  File, &pReadr->a
6e10: 4d 61 70 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Map);.  if( rc==
6e20: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 52 65  SQLITE_OK && pRe
6e30: 61 64 72 2d 3e 61 4d 61 70 3d 3d 30 20 29 7b 0a  adr->aMap==0 ){.
6e40: 20 20 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70      int pgsz = p
6e50: 54 61 73 6b 2d 3e 70 53 6f 72 74 65 72 2d 3e 70  Task->pSorter->p
6e60: 67 73 7a 3b 0a 20 20 20 20 69 6e 74 20 69 42 75  gsz;.    int iBu
6e70: 66 20 3d 20 70 52 65 61 64 72 2d 3e 69 52 65 61  f = pReadr->iRea
6e80: 64 4f 66 66 20 25 20 70 67 73 7a 3b 0a 20 20 20  dOff % pgsz;.   
6e90: 20 69 66 28 20 70 52 65 61 64 72 2d 3e 61 42 75   if( pReadr->aBu
6ea0: 66 66 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ffer==0 ){.     
6eb0: 20 70 52 65 61 64 72 2d 3e 61 42 75 66 66 65 72   pReadr->aBuffer
6ec0: 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 33 4d   = (u8*)sqlite3M
6ed0: 61 6c 6c 6f 63 28 70 67 73 7a 29 3b 0a 20 20 20  alloc(pgsz);.   
6ee0: 20 20 20 69 66 28 20 70 52 65 61 64 72 2d 3e 61     if( pReadr->a
6ef0: 42 75 66 66 65 72 3d 3d 30 20 29 20 72 63 20 3d  Buffer==0 ) rc =
6f00: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
6f10: 20 20 20 20 20 70 52 65 61 64 72 2d 3e 6e 42 75       pReadr->nBu
6f20: 66 66 65 72 20 3d 20 70 67 73 7a 3b 0a 20 20 20  ffer = pgsz;.   
6f30: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
6f40: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 42 75 66  QLITE_OK && iBuf
6f50: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 52   ){.      int nR
6f60: 65 61 64 20 3d 20 70 67 73 7a 20 2d 20 69 42 75  ead = pgsz - iBu
6f70: 66 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 52  f;.      if( (pR
6f80: 65 61 64 72 2d 3e 69 52 65 61 64 4f 66 66 20 2b  eadr->iReadOff +
6f90: 20 6e 52 65 61 64 29 20 3e 20 70 52 65 61 64 72   nRead) > pReadr
6fa0: 2d 3e 69 45 6f 66 20 29 7b 0a 20 20 20 20 20 20  ->iEof ){.      
6fb0: 20 20 6e 52 65 61 64 20 3d 20 28 69 6e 74 29 28    nRead = (int)(
6fc0: 70 52 65 61 64 72 2d 3e 69 45 6f 66 20 2d 20 70  pReadr->iEof - p
6fd0: 52 65 61 64 72 2d 3e 69 52 65 61 64 4f 66 66 29  Readr->iReadOff)
6fe0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6ff0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
7000: 61 64 28 0a 20 20 20 20 20 20 20 20 20 20 70 52  ad(.          pR
7010: 65 61 64 72 2d 3e 70 46 64 2c 20 26 70 52 65 61  eadr->pFd, &pRea
7020: 64 72 2d 3e 61 42 75 66 66 65 72 5b 69 42 75 66  dr->aBuffer[iBuf
7030: 5d 2c 20 6e 52 65 61 64 2c 20 70 52 65 61 64 72  ], nRead, pReadr
7040: 2d 3e 69 52 65 61 64 4f 66 66 0a 20 20 20 20 20  ->iReadOff.     
7050: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7060: 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
7070: 4b 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  K );.    }.  }..
7080: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7090: 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 50 6d  /*.** Advance Pm
70a0: 61 52 65 61 64 65 72 20 70 52 65 61 64 72 20 74  aReader pReadr t
70b0: 6f 20 74 68 65 20 6e 65 78 74 20 6b 65 79 20 69  o the next key i
70c0: 6e 20 69 74 73 20 50 4d 41 2e 20 52 65 74 75 72  n its PMA. Retur
70d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 0a 2a  n SQLITE_OK if.*
70e0: 2a 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  * no error occur
70f0: 73 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  s, or an SQLite 
7100: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f 6e  error code if on
7110: 65 20 64 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  e does..*/.stati
7120: 63 20 69 6e 74 20 76 64 62 65 50 6d 61 52 65 61  c int vdbePmaRea
7130: 64 65 72 4e 65 78 74 28 50 6d 61 52 65 61 64 65  derNext(PmaReade
7140: 72 20 2a 70 52 65 61 64 72 29 7b 0a 20 20 69 6e  r *pReadr){.  in
7150: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
7160: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7170: 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
7180: 20 20 75 36 34 20 6e 52 65 63 20 3d 20 30 3b 20    u64 nRec = 0; 
7190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71a0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 63    /* Size of rec
71b0: 6f 72 64 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ord in bytes */.
71c0: 0a 0a 20 20 69 66 28 20 70 52 65 61 64 72 2d 3e  ..  if( pReadr->
71d0: 69 52 65 61 64 4f 66 66 3e 3d 70 52 65 61 64 72  iReadOff>=pReadr
71e0: 2d 3e 69 45 6f 66 20 29 7b 0a 20 20 20 20 49 6e  ->iEof ){.    In
71f0: 63 72 4d 65 72 67 65 72 20 2a 70 49 6e 63 72 20  crMerger *pIncr 
7200: 3d 20 70 52 65 61 64 72 2d 3e 70 49 6e 63 72 3b  = pReadr->pIncr;
7210: 0a 20 20 20 20 69 6e 74 20 62 45 6f 66 20 3d 20  .    int bEof = 
7220: 31 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 63 72  1;.    if( pIncr
7230: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 76   ){.      rc = v
7240: 64 62 65 49 6e 63 72 53 77 61 70 28 70 49 6e 63  dbeIncrSwap(pInc
7250: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
7260: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
7270: 49 6e 63 72 2d 3e 62 45 6f 66 3d 3d 30 20 29 7b  Incr->bEof==0 ){
7280: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64  .        rc = vd
7290: 62 65 50 6d 61 52 65 61 64 65 72 53 65 65 6b 28  bePmaReaderSeek(
72a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e  .            pIn
72b0: 63 72 2d 3e 70 54 61 73 6b 2c 20 70 52 65 61 64  cr->pTask, pRead
72c0: 72 2c 20 26 70 49 6e 63 72 2d 3e 61 46 69 6c 65  r, &pIncr->aFile
72d0: 5b 30 5d 2c 20 70 49 6e 63 72 2d 3e 69 53 74 61  [0], pIncr->iSta
72e0: 72 74 4f 66 66 0a 20 20 20 20 20 20 20 20 29 3b  rtOff.        );
72f0: 0a 20 20 20 20 20 20 20 20 62 45 6f 66 20 3d 20  .        bEof = 
7300: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
7310: 0a 0a 20 20 20 20 69 66 28 20 62 45 6f 66 20 29  ..    if( bEof )
7320: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
7330: 69 73 20 61 6e 20 45 4f 46 20 63 6f 6e 64 69 74  is an EOF condit
7340: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 76 64 62  ion */.      vdb
7350: 65 50 6d 61 52 65 61 64 65 72 43 6c 65 61 72 28  ePmaReaderClear(
7360: 70 52 65 61 64 72 29 3b 0a 20 20 20 20 20 20 74  pReadr);.      t
7370: 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
7380: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
7390: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
73a0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
73b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
73c0: 20 72 63 20 3d 20 76 64 62 65 50 6d 61 52 65 61   rc = vdbePmaRea
73d0: 64 56 61 72 69 6e 74 28 70 52 65 61 64 72 2c 20  dVarint(pReadr, 
73e0: 26 6e 52 65 63 29 3b 0a 20 20 7d 0a 20 20 69 66  &nRec);.  }.  if
73f0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7400: 29 7b 0a 20 20 20 20 70 52 65 61 64 72 2d 3e 6e  ){.    pReadr->n
7410: 4b 65 79 20 3d 20 28 69 6e 74 29 6e 52 65 63 3b  Key = (int)nRec;
7420: 0a 20 20 20 20 72 63 20 3d 20 76 64 62 65 50 6d  .    rc = vdbePm
7430: 61 52 65 61 64 42 6c 6f 62 28 70 52 65 61 64 72  aReadBlob(pReadr
7440: 2c 20 28 69 6e 74 29 6e 52 65 63 2c 20 26 70 52  , (int)nRec, &pR
7450: 65 61 64 72 2d 3e 61 4b 65 79 29 3b 0a 20 20 20  eadr->aKey);.   
7460: 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
7470: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
7480: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7490: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
74a0: 65 20 50 6d 61 52 65 61 64 65 72 20 70 52 65 61  e PmaReader pRea
74b0: 64 72 20 74 6f 20 73 63 61 6e 20 74 68 72 6f 75  dr to scan throu
74c0: 67 68 20 74 68 65 20 50 4d 41 20 73 74 6f 72 65  gh the PMA store
74d0: 64 20 69 6e 20 66 69 6c 65 20 70 46 69 6c 65 0a  d in file pFile.
74e0: 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 6f  ** starting at o
74f0: 66 66 73 65 74 20 69 53 74 61 72 74 20 61 6e 64  ffset iStart and
7500: 20 65 6e 64 69 6e 67 20 61 74 20 6f 66 66 73 65   ending at offse
7510: 74 20 69 45 6f 66 2d 31 2e 20 54 68 69 73 20 66  t iEof-1. This f
7520: 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6c 65 61 76  unction .** leav
7530: 65 73 20 74 68 65 20 50 6d 61 52 65 61 64 65 72  es the PmaReader
7540: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
7550: 20 66 69 72 73 74 20 6b 65 79 20 69 6e 20 74 68   first key in th
7560: 65 20 50 4d 41 20 28 6f 72 20 45 4f 46 20 69 66  e PMA (or EOF if
7570: 20 74 68 65 20 0a 2a 2a 20 50 4d 41 20 69 73 20   the .** PMA is 
7580: 65 6d 70 74 79 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  empty)..**.** If
7590: 20 74 68 65 20 70 6e 42 79 74 65 20 70 61 72 61   the pnByte para
75a0: 6d 65 74 65 72 20 69 73 20 4e 55 4c 4c 2c 20 74  meter is NULL, t
75b0: 68 65 6e 20 69 74 20 69 73 20 61 73 73 75 6d 65  hen it is assume
75c0: 64 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20  d that the file 
75d0: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20 73  .** contains a s
75e0: 69 6e 67 6c 65 20 50 4d 41 2c 20 61 6e 64 20 74  ingle PMA, and t
75f0: 68 61 74 20 74 68 61 74 20 50 4d 41 20 6f 6d 69  hat that PMA omi
7600: 74 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 6c  ts the initial l
7610: 65 6e 67 74 68 20 76 61 72 69 6e 74 2e 0a 2a 2f  ength varint..*/
7620: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
7630: 50 6d 61 52 65 61 64 65 72 49 6e 69 74 28 0a 20  PmaReaderInit(. 
7640: 20 53 6f 72 74 53 75 62 74 61 73 6b 20 2a 70 54   SortSubtask *pT
7650: 61 73 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ask,            
7660: 20 2f 2a 20 54 61 73 6b 20 63 6f 6e 74 65 78 74   /* Task context
7670: 20 2a 2f 0a 20 20 53 6f 72 74 65 72 46 69 6c 65   */.  SorterFile
7680: 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20   *pFile,        
7690: 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65 72 20        /* Sorter 
76a0: 66 69 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f  file to read fro
76b0: 6d 20 2a 2f 0a 20 20 69 36 34 20 69 53 74 61 72  m */.  i64 iStar
76c0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
76d0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20         /* Start 
76e0: 6f 66 66 73 65 74 20 69 6e 20 70 46 69 6c 65 20  offset in pFile 
76f0: 2a 2f 0a 20 20 50 6d 61 52 65 61 64 65 72 20 2a  */.  PmaReader *
7700: 70 52 65 61 64 72 2c 20 20 20 20 20 20 20 20 20  pReadr,         
7710: 20 20 20 20 20 2f 2a 20 50 6d 61 52 65 61 64 65       /* PmaReade
7720: 72 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f  r to populate */
7730: 0a 20 20 69 36 34 20 2a 70 6e 42 79 74 65 20 20  .  i64 *pnByte  
7740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7750: 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 49 6e     /* IN/OUT: In
7760: 63 72 65 6d 65 6e 74 20 74 68 69 73 20 76 61 6c  crement this val
7770: 75 65 20 62 79 20 50 4d 41 20 73 69 7a 65 20 2a  ue by PMA size *
7780: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  /.){.  int rc;..
7790: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
77a0: 3e 69 45 6f 66 3e 69 53 74 61 72 74 20 29 3b 0a  >iEof>iStart );.
77b0: 20 20 61 73 73 65 72 74 28 20 70 52 65 61 64 72    assert( pReadr
77c0: 2d 3e 61 41 6c 6c 6f 63 3d 3d 30 20 26 26 20 70  ->aAlloc==0 && p
77d0: 52 65 61 64 72 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30  Readr->nAlloc==0
77e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
77f0: 65 61 64 72 2d 3e 61 42 75 66 66 65 72 3d 3d 30  eadr->aBuffer==0
7800: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
7810: 65 61 64 72 2d 3e 61 4d 61 70 3d 3d 30 20 29 3b  eadr->aMap==0 );
7820: 0a 0a 20 20 72 63 20 3d 20 76 64 62 65 50 6d 61  ..  rc = vdbePma
7830: 52 65 61 64 65 72 53 65 65 6b 28 70 54 61 73 6b  ReaderSeek(pTask
7840: 2c 20 70 52 65 61 64 72 2c 20 70 46 69 6c 65 2c  , pReadr, pFile,
7850: 20 69 53 74 61 72 74 29 3b 0a 20 20 69 66 28 20   iStart);.  if( 
7860: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
7870: 0a 20 20 20 20 75 36 34 20 6e 42 79 74 65 3b 20  .    u64 nByte; 
7880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7890: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 50 4d     /* Size of PM
78a0: 41 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  A in bytes */.  
78b0: 20 20 72 63 20 3d 20 76 64 62 65 50 6d 61 52 65    rc = vdbePmaRe
78c0: 61 64 56 61 72 69 6e 74 28 70 52 65 61 64 72 2c  adVarint(pReadr,
78d0: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 52   &nByte);.    pR
78e0: 65 61 64 72 2d 3e 69 45 6f 66 20 3d 20 70 52 65  eadr->iEof = pRe
78f0: 61 64 72 2d 3e 69 52 65 61 64 4f 66 66 20 2b 20  adr->iReadOff + 
7900: 6e 42 79 74 65 3b 0a 20 20 20 20 2a 70 6e 42 79  nByte;.    *pnBy
7910: 74 65 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d  te += nByte;.  }
7920: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
7930: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
7940: 3d 20 76 64 62 65 50 6d 61 52 65 61 64 65 72 4e  = vdbePmaReaderN
7950: 65 78 74 28 70 52 65 61 64 72 29 3b 0a 20 20 7d  ext(pReadr);.  }
7960: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7970: 0a 2f 2a 0a 2a 2a 20 41 20 76 65 72 73 69 6f 6e  ./*.** A version
7980: 20 6f 66 20 76 64 62 65 53 6f 72 74 65 72 43 6f   of vdbeSorterCo
7990: 6d 70 61 72 65 28 29 20 74 68 61 74 20 61 73 73  mpare() that ass
79a0: 75 6d 65 73 20 74 68 61 74 20 69 74 20 68 61 73  umes that it has
79b0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a   already been.**
79c0: 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74   determined that
79d0: 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
79e0: 20 6f 66 20 6b 65 79 31 20 69 73 20 65 71 75 61   of key1 is equa
79f0: 6c 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 66  l to the first f
7a00: 69 65 6c 64 20 6f 66 20 0a 2a 2a 20 6b 65 79 32  ield of .** key2
7a10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7a20: 76 64 62 65 53 6f 72 74 65 72 43 6f 6d 70 61 72  vdbeSorterCompar
7a30: 65 54 61 69 6c 28 0a 20 20 53 6f 72 74 53 75 62  eTail(.  SortSub
7a40: 74 61 73 6b 20 2a 70 54 61 73 6b 2c 20 20 20 20  task *pTask,    
7a50: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 74           /* Subt
7a60: 61 73 6b 20 63 6f 6e 74 65 78 74 20 28 66 6f 72  ask context (for
7a70: 20 70 4b 65 79 49 6e 66 6f 29 20 2a 2f 0a 20 20   pKeyInfo) */.  
7a80: 69 6e 74 20 2a 70 62 4b 65 79 32 43 61 63 68 65  int *pbKey2Cache
7a90: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
7aa0: 2f 2a 20 54 72 75 65 20 69 66 20 70 54 61 73 6b  /* True if pTask
7ab0: 2d 3e 70 55 6e 70 61 63 6b 65 64 20 69 73 20 70  ->pUnpacked is p
7ac0: 4b 65 79 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  Key2 */.  const 
7ad0: 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 69 6e 74  void *pKey1, int
7ae0: 20 6e 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66   nKey1,   /* Lef
7af0: 74 20 73 69 64 65 20 6f 66 20 63 6f 6d 70 61 72  t side of compar
7b00: 69 73 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ison */.  const 
7b10: 76 6f 69 64 20 2a 70 4b 65 79 32 2c 20 69 6e 74  void *pKey2, int
7b20: 20 6e 4b 65 79 32 20 20 20 20 2f 2a 20 52 69 67   nKey2    /* Rig
7b30: 68 74 20 73 69 64 65 20 6f 66 20 63 6f 6d 70 61  ht side of compa
7b40: 72 69 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 55 6e  rison */.){.  Un
7b50: 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 72 32  packedRecord *r2
7b60: 20 3d 20 70 54 61 73 6b 2d 3e 70 55 6e 70 61 63   = pTask->pUnpac
7b70: 6b 65 64 3b 0a 20 20 69 66 28 20 2a 70 62 4b 65  ked;.  if( *pbKe
7b80: 79 32 43 61 63 68 65 64 3d 3d 30 20 29 7b 0a 20  y2Cached==0 ){. 
7b90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
7ba0: 63 6f 72 64 55 6e 70 61 63 6b 28 70 54 61 73 6b  cordUnpack(pTask
7bb0: 2d 3e 70 53 6f 72 74 65 72 2d 3e 70 4b 65 79 49  ->pSorter->pKeyI
7bc0: 6e 66 6f 2c 20 6e 4b 65 79 32 2c 20 70 4b 65 79  nfo, nKey2, pKey
7bd0: 32 2c 20 72 32 29 3b 0a 20 20 20 20 2a 70 62 4b  2, r2);.    *pbK
7be0: 65 79 32 43 61 63 68 65 64 20 3d 20 31 3b 0a 20  ey2Cached = 1;. 
7bf0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   }.  return sqli
7c00: 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
7c10: 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65  pareWithSkip(nKe
7c20: 79 31 2c 20 70 4b 65 79 31 2c 20 72 32 2c 20 31  y1, pKey1, r2, 1
7c30: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  );.}../*.** Comp
7c40: 61 72 65 20 6b 65 79 31 20 28 62 75 66 66 65 72  are key1 (buffer
7c50: 20 70 4b 65 79 31 2c 20 73 69 7a 65 20 6e 4b 65   pKey1, size nKe
7c60: 79 31 20 62 79 74 65 73 29 20 77 69 74 68 20 6b  y1 bytes) with k
7c70: 65 79 32 20 28 62 75 66 66 65 72 20 70 4b 65 79  ey2 (buffer pKey
7c80: 32 2c 20 0a 2a 2a 20 73 69 7a 65 20 6e 4b 65 79  2, .** size nKey
7c90: 32 20 62 79 74 65 73 29 2e 20 55 73 65 20 28 70  2 bytes). Use (p
7ca0: 54 61 73 6b 2d 3e 70 4b 65 79 49 6e 66 6f 29 20  Task->pKeyInfo) 
7cb0: 66 6f 72 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  for the collatio
7cc0: 6e 20 73 65 71 75 65 6e 63 65 73 0a 2a 2a 20 75  n sequences.** u
7cd0: 73 65 64 20 62 79 20 74 68 65 20 63 6f 6d 70 61  sed by the compa
7ce0: 72 69 73 6f 6e 2e 20 52 65 74 75 72 6e 20 74 68  rison. Return th
7cf0: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
7d00: 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a  comparison..**.*
7d10: 2a 20 49 66 20 49 4e 2f 4f 55 54 20 70 61 72 61  * If IN/OUT para
7d20: 6d 65 74 65 72 20 2a 70 62 4b 65 79 32 43 61 63  meter *pbKey2Cac
7d30: 68 65 64 20 69 73 20 74 72 75 65 20 77 68 65 6e  hed is true when
7d40: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
7d50: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 69 74 20  s called,.** it 
7d60: 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
7d70: 28 70 54 61 73 6b 2d 3e 70 55 6e 70 61 63 6b 65  (pTask->pUnpacke
7d80: 64 29 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  d) contains the 
7d90: 75 6e 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e  unpacked version
7da0: 0a 2a 2a 20 6f 66 20 6b 65 79 32 2e 20 49 66 20  .** of key2. If 
7db0: 69 74 20 69 73 20 66 61 6c 73 65 2c 20 28 70 54  it is false, (pT
7dc0: 61 73 6b 2d 3e 70 55 6e 70 61 63 6b 65 64 29 20  ask->pUnpacked) 
7dd0: 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
7de0: 68 20 74 68 65 20 75 6e 70 61 63 6b 65 64 0a 2a  h the unpacked.*
7df0: 2a 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79  * version of key
7e00: 32 20 61 6e 64 20 2a 70 62 4b 65 79 32 43 61 63  2 and *pbKey2Cac
7e10: 68 65 64 20 73 65 74 20 74 6f 20 74 72 75 65 20  hed set to true 
7e20: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
7e30: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f  ..**.** If an OO
7e40: 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  M error is encou
7e50: 6e 74 65 72 65 64 2c 20 28 70 54 61 73 6b 2d 3e  ntered, (pTask->
7e60: 70 55 6e 70 61 63 6b 65 64 2d 3e 65 72 72 6f 72  pUnpacked->error
7e70: 5f 72 63 29 20 69 73 20 73 65 74 0a 2a 2a 20 74  _rc) is set.** t
7e80: 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a  o SQLITE_NOMEM..
7e90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
7ea0: 62 65 53 6f 72 74 65 72 43 6f 6d 70 61 72 65 28  beSorterCompare(
7eb0: 0a 20 20 53 6f 72 74 53 75 62 74 61 73 6b 20 2a  .  SortSubtask *
7ec0: 70 54 61 73 6b 2c 20 20 20 20 20 20 20 20 20 20  pTask,          
7ed0: 20 20 20 2f 2a 20 53 75 62 74 61 73 6b 20 63 6f     /* Subtask co
7ee0: 6e 74 65 78 74 20 28 66 6f 72 20 70 4b 65 79 49  ntext (for pKeyI
7ef0: 6e 66 6f 29 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  nfo) */.  int *p
7f00: 62 4b 65 79 32 43 61 63 68 65 64 2c 20 20 20 20  bKey2Cached,    
7f10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7f20: 65 20 69 66 20 70 54 61 73 6b 2d 3e 70 55 6e 70  e if pTask->pUnp
7f30: 61 63 6b 65 64 20 69 73 20 70 4b 65 79 32 20 2a  acked is pKey2 *
7f40: 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
7f50: 70 4b 65 79 31 2c 20 69 6e 74 20 6e 4b 65 79 31  pKey1, int nKey1
7f60: 2c 20 20 20 2f 2a 20 4c 65 66 74 20 73 69 64 65  ,   /* Left side
7f70: 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a   of comparison *
7f80: 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
7f90: 70 4b 65 79 32 2c 20 69 6e 74 20 6e 4b 65 79 32  pKey2, int nKey2
7fa0: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 73 69 64      /* Right sid
7fb0: 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  e of comparison 
7fc0: 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64  */.){.  Unpacked
7fd0: 52 65 63 6f 72 64 20 2a 72 32 20 3d 20 70 54 61  Record *r2 = pTa
7fe0: 73 6b 2d 3e 70 55 6e 70 61 63 6b 65 64 3b 0a 20  sk->pUnpacked;. 
7ff0: 20 69 66 28 20 21 2a 70 62 4b 65 79 32 43 61 63   if( !*pbKey2Cac
8000: 68 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  hed ){.    sqlit
8010: 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
8020: 63 6b 28 70 54 61 73 6b 2d 3e 70 53 6f 72 74 65  ck(pTask->pSorte
8030: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 6e 4b 65  r->pKeyInfo, nKe
8040: 79 32 2c 20 70 4b 65 79 32 2c 20 72 32 29 3b 0a  y2, pKey2, r2);.
8050: 20 20 20 20 2a 70 62 4b 65 79 32 43 61 63 68 65      *pbKey2Cache
8060: 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  d = 1;.  }.  ret
8070: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52  urn sqlite3VdbeR
8080: 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65  ecordCompare(nKe
8090: 79 31 2c 20 70 4b 65 79 31 2c 20 72 32 29 3b 0a  y1, pKey1, r2);.
80a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 70 65 63 69  }../*.** A speci
80b0: 61 6c 6c 79 20 6f 70 74 69 6d 69 7a 65 64 20 76  ally optimized v
80c0: 65 72 73 69 6f 6e 20 6f 66 20 76 64 62 65 53 6f  ersion of vdbeSo
80d0: 72 74 65 72 43 6f 6d 70 61 72 65 28 29 20 74 68  rterCompare() th
80e0: 61 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a  at assumes that.
80f0: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 66 69 65  ** the first fie
8100: 6c 64 20 6f 66 20 65 61 63 68 20 6b 65 79 20 69  ld of each key i
8110: 73 20 61 20 54 45 58 54 20 76 61 6c 75 65 20 61  s a TEXT value a
8120: 6e 64 20 74 68 61 74 20 74 68 65 20 63 6f 6c 6c  nd that the coll
8130: 61 74 69 6f 6e 0a 2a 2a 20 73 65 71 75 65 6e 63  ation.** sequenc
8140: 65 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 68 65  e to compare the
8150: 6d 20 77 69 74 68 20 69 73 20 42 49 4e 41 52 59  m with is BINARY
8160: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8170: 76 64 62 65 53 6f 72 74 65 72 43 6f 6d 70 61 72  vdbeSorterCompar
8180: 65 54 65 78 74 28 0a 20 20 53 6f 72 74 53 75 62  eText(.  SortSub
8190: 74 61 73 6b 20 2a 70 54 61 73 6b 2c 20 20 20 20  task *pTask,    
81a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 74           /* Subt
81b0: 61 73 6b 20 63 6f 6e 74 65 78 74 20 28 66 6f 72  ask context (for
81c0: 20 70 4b 65 79 49 6e 66 6f 29 20 2a 2f 0a 20 20   pKeyInfo) */.  
81d0: 69 6e 74 20 2a 70 62 4b 65 79 32 43 61 63 68 65  int *pbKey2Cache
81e0: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
81f0: 2f 2a 20 54 72 75 65 20 69 66 20 70 54 61 73 6b  /* True if pTask
8200: 2d 3e 70 55 6e 70 61 63 6b 65 64 20 69 73 20 70  ->pUnpacked is p
8210: 4b 65 79 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  Key2 */.  const 
8220: 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 69 6e 74  void *pKey1, int
8230: 20 6e 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66   nKey1,   /* Lef
8240: 74 20 73 69 64 65 20 6f 66 20 63 6f 6d 70 61 72  t side of compar
8250: 69 73 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ison */.  const 
8260: 76 6f 69 64 20 2a 70 4b 65 79 32 2c 20 69 6e 74  void *pKey2, int
8270: 20 6e 4b 65 79 32 20 20 20 20 2f 2a 20 52 69 67   nKey2    /* Rig
8280: 68 74 20 73 69 64 65 20 6f 66 20 63 6f 6d 70 61  ht side of compa
8290: 72 69 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 63 6f  rison */.){.  co
82a0: 6e 73 74 20 75 38 20 2a 20 63 6f 6e 73 74 20 70  nst u8 * const p
82b0: 31 20 3d 20 28 63 6f 6e 73 74 20 75 38 20 2a 20  1 = (const u8 * 
82c0: 63 6f 6e 73 74 29 70 4b 65 79 31 3b 0a 20 20 63  const)pKey1;.  c
82d0: 6f 6e 73 74 20 75 38 20 2a 20 63 6f 6e 73 74 20  onst u8 * const 
82e0: 70 32 20 3d 20 28 63 6f 6e 73 74 20 75 38 20 2a  p2 = (const u8 *
82f0: 20 63 6f 6e 73 74 29 70 4b 65 79 32 3b 0a 20 20   const)pKey2;.  
8300: 63 6f 6e 73 74 20 75 38 20 2a 20 63 6f 6e 73 74  const u8 * const
8310: 20 76 31 20 3d 20 26 70 31 5b 20 70 31 5b 30 5d   v1 = &p1[ p1[0]
8320: 20 5d 3b 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72   ];   /* Pointer
8330: 20 74 6f 20 76 61 6c 75 65 20 31 20 2a 2f 0a 20   to value 1 */. 
8340: 20 63 6f 6e 73 74 20 75 38 20 2a 20 63 6f 6e 73   const u8 * cons
8350: 74 20 76 32 20 3d 20 26 70 32 5b 20 70 32 5b 30  t v2 = &p2[ p2[0
8360: 5d 20 5d 3b 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ] ];   /* Pointe
8370: 72 20 74 6f 20 76 61 6c 75 65 20 32 20 2a 2f 0a  r to value 2 */.
8380: 0a 20 20 69 6e 74 20 6e 31 3b 0a 20 20 69 6e 74  .  int n1;.  int
8390: 20 6e 32 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a   n2;.  int res;.
83a0: 0a 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  .  getVarint32(&
83b0: 70 31 5b 31 5d 2c 20 6e 31 29 3b 20 6e 31 20 3d  p1[1], n1); n1 =
83c0: 20 28 6e 31 20 2d 20 31 33 29 20 2f 20 32 3b 0a   (n1 - 13) / 2;.
83d0: 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70    getVarint32(&p
83e0: 32 5b 31 5d 2c 20 6e 32 29 3b 20 6e 32 20 3d 20  2[1], n2); n2 = 
83f0: 28 6e 32 20 2d 20 31 33 29 20 2f 20 32 3b 0a 20  (n2 - 13) / 2;. 
8400: 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 76 31   res = memcmp(v1
8410: 2c 20 76 32 2c 20 4d 49 4e 28 6e 31 2c 20 6e 32  , v2, MIN(n1, n2
8420: 29 29 3b 0a 20 20 69 66 28 20 72 65 73 3d 3d 30  ));.  if( res==0
8430: 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 6e 31   ){.    res = n1
8440: 20 2d 20 6e 32 3b 0a 20 20 7d 0a 0a 20 20 69 66   - n2;.  }..  if
8450: 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
8460: 69 66 28 20 70 54 61 73 6b 2d 3e 70 53 6f 72 74  if( pTask->pSort
8470: 65 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  er->pKeyInfo->nF
8480: 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20 20  ield>1 ){.      
8490: 72 65 73 20 3d 20 76 64 62 65 53 6f 72 74 65 72  res = vdbeSorter
84a0: 43 6f 6d 70 61 72 65 54 61 69 6c 28 0a 20 20 20  CompareTail(.   
84b0: 20 20 20 20 20 20 20 70 54 61 73 6b 2c 20 70 62         pTask, pb
84c0: 4b 65 79 32 43 61 63 68 65 64 2c 20 70 4b 65 79  Key2Cached, pKey
84d0: 31 2c 20 6e 4b 65 79 31 2c 20 70 4b 65 79 32 2c  1, nKey1, pKey2,
84e0: 20 6e 4b 65 79 32 0a 20 20 20 20 20 20 29 3b 0a   nKey2.      );.
84f0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
8500: 20 20 20 69 66 28 20 70 54 61 73 6b 2d 3e 70 53     if( pTask->pS
8510: 6f 72 74 65 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d  orter->pKeyInfo-
8520: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20 29  >aSortOrder[0] )
8530: 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 72 65  {.      res = re
8540: 73 20 2a 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  s * -1;.    }.  
8550: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  }..  return res;
8560: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 70 65 63  .}../*.** A spec
8570: 69 61 6c 6c 79 20 6f 70 74 69 6d 69 7a 65 64 20  ially optimized 
8580: 76 65 72 73 69 6f 6e 20 6f 66 20 76 64 62 65 53  version of vdbeS
8590: 6f 72 74 65 72 43 6f 6d 70 61 72 65 28 29 20 74  orterCompare() t
85a0: 68 61 74 20 61 73 73 75 6d 65 73 20 74 68 61 74  hat assumes that
85b0: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 66 69  .** the first fi
85c0: 65 6c 64 20 6f 66 20 65 61 63 68 20 6b 65 79 20  eld of each key 
85d0: 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 76 61  is an INTEGER va
85e0: 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lue..*/.static i
85f0: 6e 74 20 76 64 62 65 53 6f 72 74 65 72 43 6f 6d  nt vdbeSorterCom
8600: 70 61 72 65 49 6e 74 28 0a 20 20 53 6f 72 74 53  pareInt(.  SortS
8610: 75 62 74 61 73 6b 20 2a 70 54 61 73 6b 2c 20 20  ubtask *pTask,  
8620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
8630: 62 74 61 73 6b 20 63 6f 6e 74 65 78 74 20 28 66  btask context (f
8640: 6f 72 20 70 4b 65 79 49 6e 66 6f 29 20 2a 2f 0a  or pKeyInfo) */.
8650: 20 20 69 6e 74 20 2a 70 62 4b 65 79 32 43 61 63    int *pbKey2Cac
8660: 68 65 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  hed,            
8670: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 54 61    /* True if pTa
8680: 73 6b 2d 3e 70 55 6e 70 61 63 6b 65 64 20 69 73  sk->pUnpacked is
8690: 20 70 4b 65 79 32 20 2a 2f 0a 20 20 63 6f 6e 73   pKey2 */.  cons
86a0: 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 69  t void *pKey1, i
86b0: 6e 74 20 6e 4b 65 79 31 2c 20 20 20 2f 2a 20 4c  nt nKey1,   /* L
86c0: 65 66 74 20 73 69 64 65 20 6f 66 20 63 6f 6d 70  eft side of comp
86d0: 61 72 69 73 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  arison */.  cons
86e0: 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 2c 20 69  t void *pKey2, i
86f0: 6e 74 20 6e 4b 65 79 32 20 20 20 20 2f 2a 20 52  nt nKey2    /* R
8700: 69 67 68 74 20 73 69 64 65 20 6f 66 20 63 6f 6d  ight side of com
8710: 70 61 72 69 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  parison */.){.  
8720: 63 6f 6e 73 74 20 75 38 20 2a 20 63 6f 6e 73 74  const u8 * const
8730: 20 70 31 20 3d 20 28 63 6f 6e 73 74 20 75 38 20   p1 = (const u8 
8740: 2a 20 63 6f 6e 73 74 29 70 4b 65 79 31 3b 0a 20  * const)pKey1;. 
8750: 20 63 6f 6e 73 74 20 75 38 20 2a 20 63 6f 6e 73   const u8 * cons
8760: 74 20 70 32 20 3d 20 28 63 6f 6e 73 74 20 75 38  t p2 = (const u8
8770: 20 2a 20 63 6f 6e 73 74 29 70 4b 65 79 32 3b 0a   * const)pKey2;.
8780: 20 20 63 6f 6e 73 74 20 69 6e 74 20 73 31 20 3d    const int s1 =
8790: 20 70 31 5b 31 5d 3b 20 20 20 20 20 20 20 20 20   p1[1];         
87a0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20          /* Left 
87b0: 68 61 6e 64 20 73 65 72 69 61 6c 20 74 79 70 65  hand serial type
87c0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
87d0: 73 32 20 3d 20 70 32 5b 31 5d 3b 20 20 20 20 20  s2 = p2[1];     
87e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
87f0: 69 67 68 74 20 68 61 6e 64 20 73 65 72 69 61 6c  ight hand serial
8800: 20 74 79 70 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   type */.  const
8810: 20 75 38 20 2a 20 63 6f 6e 73 74 20 76 31 20 3d   u8 * const v1 =
8820: 20 26 70 31 5b 20 70 31 5b 30 5d 20 5d 3b 20 20   &p1[ p1[0] ];  
8830: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76   /* Pointer to v
8840: 61 6c 75 65 20 31 20 2a 2f 0a 20 20 63 6f 6e 73  alue 1 */.  cons
8850: 74 20 75 38 20 2a 20 63 6f 6e 73 74 20 76 32 20  t u8 * const v2 
8860: 3d 20 26 70 32 5b 20 70 32 5b 30 5d 20 5d 3b 20  = &p2[ p2[0] ]; 
8870: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
8880: 76 61 6c 75 65 20 32 20 2a 2f 0a 20 20 69 6e 74  value 2 */.  int
8890: 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20   res;           
88a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88b0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
88c0: 75 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ue */..  assert(
88d0: 20 28 73 31 3e 30 20 26 26 20 73 31 3c 37 29 20   (s1>0 && s1<7) 
88e0: 7c 7c 20 73 31 3d 3d 38 20 7c 7c 20 73 31 3d 3d  || s1==8 || s1==
88f0: 39 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  9 );.  assert( (
8900: 73 32 3e 30 20 26 26 20 73 32 3c 37 29 20 7c 7c  s2>0 && s2<7) ||
8910: 20 73 32 3d 3d 38 20 7c 7c 20 73 32 3d 3d 39 20   s2==8 || s2==9 
8920: 29 3b 0a 0a 20 20 69 66 28 20 73 31 3e 37 20 26  );..  if( s1>7 &
8930: 26 20 73 32 3e 37 20 29 7b 0a 20 20 20 20 72 65  & s2>7 ){.    re
8940: 73 20 3d 20 73 31 20 2d 20 73 32 3b 0a 20 20 7d  s = s1 - s2;.  }
8950: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 73 31  else{.    if( s1
8960: 3d 3d 73 32 20 29 7b 0a 20 20 20 20 20 20 69 66  ==s2 ){.      if
8970: 28 20 28 2a 76 31 20 5e 20 2a 76 32 29 20 26 20  ( (*v1 ^ *v2) & 
8980: 30 78 38 30 20 29 7b 0a 20 20 20 20 20 20 20 20  0x80 ){.        
8990: 2f 2a 20 54 68 65 20 74 77 6f 20 76 61 6c 75 65  /* The two value
89a0: 73 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74  s have different
89b0: 20 73 69 67 6e 73 20 2a 2f 0a 20 20 20 20 20 20   signs */.      
89c0: 20 20 72 65 73 20 3d 20 28 2a 76 31 20 26 20 30    res = (*v1 & 0
89d0: 78 38 30 29 20 3f 20 2d 31 20 3a 20 2b 31 3b 0a  x80) ? -1 : +1;.
89e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
89f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20       /* The two 
8a00: 76 61 6c 75 65 73 20 68 61 76 65 20 74 68 65 20  values have the 
8a10: 73 61 6d 65 20 73 69 67 6e 2e 20 43 6f 6d 70 61  same sign. Compa
8a20: 72 65 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28  re using memcmp(
8a30: 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74  ). */.        st
8a40: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 4c  atic const u8 aL
8a50: 65 6e 5b 5d 20 3d 20 7b 30 2c 20 31 2c 20 32 2c  en[] = {0, 1, 2,
8a60: 20 33 2c 20 34 2c 20 36 2c 20 38 20 7d 3b 0a 20   3, 4, 6, 8 };. 
8a70: 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
8a80: 20 20 20 20 20 20 72 65 73 20 3d 20 30 3b 0a 20        res = 0;. 
8a90: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
8aa0: 69 3c 61 4c 65 6e 5b 73 31 5d 3b 20 69 2b 2b 29  i<aLen[s1]; i++)
8ab0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
8ac0: 28 72 65 73 20 3d 20 76 31 5b 69 5d 20 2d 20 76  (res = v1[i] - v
8ad0: 32 5b 69 5d 29 20 29 20 62 72 65 61 6b 3b 0a 20  2[i]) ) break;. 
8ae0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
8af0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8b00: 20 20 69 66 28 20 73 32 3e 37 20 29 7b 0a 20 20    if( s2>7 ){.  
8b10: 20 20 20 20 20 20 72 65 73 20 3d 20 2b 31 3b 0a        res = +1;.
8b20: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8b30: 73 31 3e 37 20 29 7b 0a 20 20 20 20 20 20 20 20  s1>7 ){.        
8b40: 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  res = -1;.      
8b50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
8b60: 65 73 20 3d 20 73 31 20 2d 20 73 32 3b 0a 20 20  es = s1 - s2;.  
8b70: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
8b80: 72 74 28 20 72 65 73 21 3d 30 20 29 3b 0a 0a 20  rt( res!=0 );.. 
8b90: 20 20 20 20 20 69 66 28 20 72 65 73 3e 30 20 29       if( res>0 )
8ba0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 76  {.        if( *v
8bb0: 31 20 26 20 30 78 38 30 20 29 20 72 65 73 20 3d  1 & 0x80 ) res =
8bc0: 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
8bd0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 76  {.        if( *v
8be0: 32 20 26 20 30 78 38 30 20 29 20 72 65 73 20 3d  2 & 0x80 ) res =
8bf0: 20 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   +1;.      }.   
8c00: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 65   }.  }..  if( re
8c10: 73 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  s==0 ){.    if( 
8c20: 70 54 61 73 6b 2d 3e 70 53 6f 72 74 65 72 2d 3e  pTask->pSorter->
8c30: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
8c40: 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20  >1 ){.      res 
8c50: 3d 20 76 64 62 65 53 6f 72 74 65 72 43 6f 6d 70  = vdbeSorterComp
8c60: 61 72 65 54 61 69 6c 28 0a 20 20 20 20 20 20 20  areTail(.       
8c70: 20 20 20 70 54 61 73 6b 2c 20 70 62 4b 65 79 32     pTask, pbKey2
8c80: 43 61 63 68 65 64 2c 20 70 4b 65 79 31 2c 20 6e  Cached, pKey1, n
8c90: 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 4b 65  Key1, pKey2, nKe
8ca0: 79 32 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  y2.      );.    
8cb0: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54  }.  }else if( pT
8cc0: 61 73 6b 2d 3e 70 53 6f 72 74 65 72 2d 3e 70 4b  ask->pSorter->pK
8cd0: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
8ce0: 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 65 73  er[0] ){.    res
8cf0: 20 3d 20 72 65 73 20 2a 20 2d 31 3b 0a 20 20 7d   = res * -1;.  }
8d00: 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ..  return res;.
8d10: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
8d20: 69 7a 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ize the temporar
8d30: 79 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 6a  y index cursor j
8d40: 75 73 74 20 6f 70 65 6e 65 64 20 61 73 20 61 20  ust opened as a 
8d50: 73 6f 72 74 65 72 20 63 75 72 73 6f 72 2e 0a 2a  sorter cursor..*
8d60: 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68  *.** Usually, th
8d70: 65 20 73 6f 72 74 65 72 20 6d 6f 64 75 6c 65 20  e sorter module 
8d80: 75 73 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f  uses the value o
8d90: 66 20 28 70 43 73 72 2d 3e 70 4b 65 79 49 6e 66  f (pCsr->pKeyInf
8da0: 6f 2d 3e 6e 46 69 65 6c 64 29 0a 2a 2a 20 74 6f  o->nField).** to
8db0: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e   determine the n
8dc0: 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20  umber of fields 
8dd0: 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 63  that should be c
8de0: 6f 6d 70 61 72 65 64 20 66 72 6f 6d 20 74 68 65  ompared from the
8df0: 0a 2a 2a 20 72 65 63 6f 72 64 73 20 62 65 69 6e  .** records bein
8e00: 67 20 73 6f 72 74 65 64 2e 20 48 6f 77 65 76 65  g sorted. Howeve
8e10: 72 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 20  r, if the value 
8e20: 70 61 73 73 65 64 20 61 73 20 61 72 67 75 6d 65  passed as argume
8e30: 6e 74 20 6e 46 69 65 6c 64 0a 2a 2a 20 69 73 20  nt nField.** is 
8e40: 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65  non-zero and the
8e50: 20 73 6f 72 74 65 72 20 69 73 20 61 62 6c 65 20   sorter is able 
8e60: 74 6f 20 67 75 61 72 61 6e 74 65 65 20 61 20 73  to guarantee a s
8e70: 74 61 62 6c 65 20 73 6f 72 74 2c 20 6e 46 69 65  table sort, nFie
8e80: 6c 64 0a 2a 2a 20 69 73 20 75 73 65 64 20 69 6e  ld.** is used in
8e90: 73 74 65 61 64 2e 20 54 68 69 73 20 69 73 20 75  stead. This is u
8ea0: 73 65 64 20 77 68 65 6e 20 73 6f 72 74 69 6e 67  sed when sorting
8eb0: 20 72 65 63 6f 72 64 73 20 66 6f 72 20 61 20 43   records for a C
8ec0: 52 45 41 54 45 20 49 4e 44 45 58 0a 2a 2a 20 73  REATE INDEX.** s
8ed0: 74 61 74 65 6d 65 6e 74 2e 20 49 6e 20 74 68 69  tatement. In thi
8ee0: 73 20 63 61 73 65 2c 20 6b 65 79 73 20 61 72 65  s case, keys are
8ef0: 20 61 6c 77 61 79 73 20 64 65 6c 69 76 65 72 65   always delivere
8f00: 64 20 74 6f 20 74 68 65 20 73 6f 72 74 65 72 20  d to the sorter 
8f10: 69 6e 0a 2a 2a 20 6f 72 64 65 72 20 6f 66 20 74  in.** order of t
8f20: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2c 20  he primary key, 
8f30: 77 68 69 63 68 20 68 61 70 70 65 6e 73 20 74 6f  which happens to
8f40: 20 62 65 20 6d 61 6b 65 20 75 70 20 74 68 65 20   be make up the 
8f50: 66 69 6e 61 6c 20 70 61 72 74 20 0a 2a 2a 20 6f  final part .** o
8f60: 66 20 74 68 65 20 72 65 63 6f 72 64 73 20 62 65  f the records be
8f70: 69 6e 67 20 73 6f 72 74 65 64 2e 20 53 6f 20 69  ing sorted. So i
8f80: 66 20 74 68 65 20 73 6f 72 74 20 69 73 20 73 74  f the sort is st
8f90: 61 62 6c 65 2c 20 74 68 65 72 65 20 69 73 20 6e  able, there is n
8fa0: 65 76 65 72 0a 2a 2a 20 61 6e 79 20 72 65 61 73  ever.** any reas
8fb0: 6f 6e 20 74 6f 20 63 6f 6d 70 61 72 65 20 50 4b  on to compare PK
8fc0: 20 66 69 65 6c 64 73 20 61 6e 64 20 74 68 65 79   fields and they
8fd0: 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 20   can be ignored 
8fe0: 66 6f 72 20 61 20 73 6d 61 6c 6c 0a 2a 2a 20 70  for a small.** p
8ff0: 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74  erformance boost
9000: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 72 74  ..**.** The sort
9010: 65 72 20 63 61 6e 20 67 75 61 72 61 6e 74 65 65  er can guarantee
9020: 20 61 20 73 74 61 62 6c 65 20 73 6f 72 74 20 77   a stable sort w
9030: 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73  hen running in s
9040: 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 0a 2a  ingle-threaded.*
9050: 2a 20 6d 6f 64 65 2c 20 62 75 74 20 6e 6f 74 20  * mode, but not 
9060: 69 6e 20 6d 75 6c 74 69 2d 74 68 72 65 61 64 65  in multi-threade
9070: 64 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  d mode..**.** SQ
9080: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
9090: 6e 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75  ned if successfu
90a0: 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  l, or an SQLite 
90b0: 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72  error code other
90c0: 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  wise..*/.int sql
90d0: 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 49 6e  ite3VdbeSorterIn
90e0: 69 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  it(.  sqlite3 *d
90f0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
9100: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
9110: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 66 6f  e connection (fo
9120: 72 20 6d 61 6c 6c 6f 63 28 29 29 20 2a 2f 0a 20  r malloc()) */. 
9130: 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20 20 20 20   int nField,    
9140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9150: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65   /* Number of ke
9160: 79 20 66 69 65 6c 64 73 20 69 6e 20 65 61 63 68  y fields in each
9170: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 56 64 62   record */.  Vdb
9180: 65 43 75 72 73 6f 72 20 2a 70 43 73 72 20 20 20  eCursor *pCsr   
9190: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
91a0: 43 75 72 73 6f 72 20 74 68 61 74 20 68 6f 6c 64  Cursor that hold
91b0: 73 20 74 68 65 20 6e 65 77 20 73 6f 72 74 65 72  s the new sorter
91c0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 67 73   */.){.  int pgs
91d0: 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z;              
91e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
91f0: 20 73 69 7a 65 20 6f 66 20 6d 61 69 6e 20 64 61   size of main da
9200: 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
9210: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
9220: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
9230: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
9240: 68 72 6f 75 67 68 20 61 54 61 73 6b 5b 5d 20 2a  hrough aTask[] *
9250: 2f 0a 20 20 69 6e 74 20 6d 78 43 61 63 68 65 3b  /.  int mxCache;
9260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9270: 20 20 20 20 2f 2a 20 43 61 63 68 65 20 73 69 7a      /* Cache siz
9280: 65 20 2a 2f 0a 20 20 56 64 62 65 53 6f 72 74 65  e */.  VdbeSorte
9290: 72 20 2a 70 53 6f 72 74 65 72 3b 20 20 20 20 20  r *pSorter;     
92a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
92b0: 77 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 4b 65  w sorter */.  Ke
92c0: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
92d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
92e0: 20 43 6f 70 79 20 6f 66 20 70 43 73 72 2d 3e 70   Copy of pCsr->p
92f0: 4b 65 79 49 6e 66 6f 20 77 69 74 68 20 64 62 3d  KeyInfo with db=
9300: 3d 30 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4b 65  =0 */.  int szKe
9310: 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  yInfo;          
9320: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
9330: 6f 66 20 70 43 73 72 2d 3e 70 4b 65 79 49 6e 66  of pCsr->pKeyInf
9340: 6f 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  o in bytes */.  
9350: 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20  int sz;         
9360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9370: 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53 6f 72 74  /* Size of pSort
9380: 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  er in bytes */. 
9390: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
93a0: 5f 4f 4b 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  _OK;.#if SQLITE_
93b0: 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MAX_WORKER_THREA
93c0: 44 53 3d 3d 30 0a 23 20 64 65 66 69 6e 65 20 6e  DS==0.# define n
93d0: 57 6f 72 6b 65 72 20 30 0a 23 65 6c 73 65 0a 20  Worker 0.#else. 
93e0: 20 69 6e 74 20 6e 57 6f 72 6b 65 72 3b 0a 23 65   int nWorker;.#e
93f0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  ndif..  /* Initi
9400: 61 6c 69 7a 65 20 74 68 65 20 75 70 70 65 72 20  alize the upper 
9410: 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d  limit on the num
9420: 62 65 72 20 6f 66 20 77 6f 72 6b 65 72 20 74 68  ber of worker th
9430: 72 65 61 64 73 20 2a 2f 0a 23 69 66 20 53 51 4c  reads */.#if SQL
9440: 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54  ITE_MAX_WORKER_T
9450: 48 52 45 41 44 53 3e 30 0a 20 20 69 66 28 20 73  HREADS>0.  if( s
9460: 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f  qlite3TempInMemo
9470: 72 79 28 64 62 29 20 7c 7c 20 73 71 6c 69 74 65  ry(db) || sqlite
9480: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43  3GlobalConfig.bC
9490: 6f 72 65 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  oreMutex==0 ){. 
94a0: 20 20 20 6e 57 6f 72 6b 65 72 20 3d 20 30 3b 0a     nWorker = 0;.
94b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 57 6f    }else{.    nWo
94c0: 72 6b 65 72 20 3d 20 64 62 2d 3e 61 4c 69 6d 69  rker = db->aLimi
94d0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57  t[SQLITE_LIMIT_W
94e0: 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 5d 3b 0a  ORKER_THREADS];.
94f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
9500: 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68   Do not allow th
9510: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
9520: 66 20 74 68 72 65 61 64 73 20 28 6d 61 69 6e 20  f threads (main 
9530: 74 68 72 65 61 64 20 2b 20 61 6c 6c 20 77 6f 72  thread + all wor
9540: 6b 65 72 73 29 0a 20 20 2a 2a 20 74 6f 20 65 78  kers).  ** to ex
9550: 63 65 65 64 20 74 68 65 20 6d 61 78 69 6d 75 6d  ceed the maximum
9560: 20 6d 65 72 67 65 20 63 6f 75 6e 74 20 2a 2f 0a   merge count */.
9570: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57  #if SQLITE_MAX_W
9580: 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3e 3d 53  ORKER_THREADS>=S
9590: 4f 52 54 45 52 5f 4d 41 58 5f 4d 45 52 47 45 5f  ORTER_MAX_MERGE_
95a0: 43 4f 55 4e 54 0a 20 20 69 66 28 20 6e 57 6f 72  COUNT.  if( nWor
95b0: 6b 65 72 3e 3d 53 4f 52 54 45 52 5f 4d 41 58 5f  ker>=SORTER_MAX_
95c0: 4d 45 52 47 45 5f 43 4f 55 4e 54 20 29 7b 0a 20  MERGE_COUNT ){. 
95d0: 20 20 20 6e 57 6f 72 6b 65 72 20 3d 20 53 4f 52     nWorker = SOR
95e0: 54 45 52 5f 4d 41 58 5f 4d 45 52 47 45 5f 43 4f  TER_MAX_MERGE_CO
95f0: 55 4e 54 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  UNT-1;.  }.#endi
9600: 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 73  f..  assert( pCs
9610: 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 26 26 20 70  r->pKeyInfo && p
9620: 43 73 72 2d 3e 70 42 74 3d 3d 30 20 29 3b 0a 20  Csr->pBt==0 );. 
9630: 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 65   assert( pCsr->e
9640: 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
9650: 5f 53 4f 52 54 45 52 20 29 3b 0a 20 20 73 7a 4b  _SORTER );.  szK
9660: 65 79 49 6e 66 6f 20 3d 20 73 69 7a 65 6f 66 28  eyInfo = sizeof(
9670: 4b 65 79 49 6e 66 6f 29 20 2b 20 28 70 43 73 72  KeyInfo) + (pCsr
9680: 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  ->pKeyInfo->nFie
9690: 6c 64 2d 31 29 2a 73 69 7a 65 6f 66 28 43 6f 6c  ld-1)*sizeof(Col
96a0: 6c 53 65 71 2a 29 3b 0a 20 20 73 7a 20 3d 20 73  lSeq*);.  sz = s
96b0: 69 7a 65 6f 66 28 56 64 62 65 53 6f 72 74 65 72  izeof(VdbeSorter
96c0: 29 20 2b 20 6e 57 6f 72 6b 65 72 20 2a 20 73 69  ) + nWorker * si
96d0: 7a 65 6f 66 28 53 6f 72 74 53 75 62 74 61 73 6b  zeof(SortSubtask
96e0: 29 3b 0a 0a 20 20 70 53 6f 72 74 65 72 20 3d 20  );..  pSorter = 
96f0: 28 56 64 62 65 53 6f 72 74 65 72 2a 29 73 71 6c  (VdbeSorter*)sql
9700: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
9710: 28 64 62 2c 20 73 7a 20 2b 20 73 7a 4b 65 79 49  (db, sz + szKeyI
9720: 6e 66 6f 29 3b 0a 20 20 70 43 73 72 2d 3e 75 63  nfo);.  pCsr->uc
9730: 2e 70 53 6f 72 74 65 72 20 3d 20 70 53 6f 72 74  .pSorter = pSort
9740: 65 72 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 65  er;.  if( pSorte
9750: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  r==0 ){.    rc =
9760: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
9770: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 6f 72   }else{.    pSor
9780: 74 65 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20  ter->pKeyInfo = 
9790: 70 4b 65 79 49 6e 66 6f 20 3d 20 28 4b 65 79 49  pKeyInfo = (KeyI
97a0: 6e 66 6f 2a 29 28 28 75 38 2a 29 70 53 6f 72 74  nfo*)((u8*)pSort
97b0: 65 72 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65  er + sz);.    me
97c0: 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f 2c 20 70  mcpy(pKeyInfo, p
97d0: 43 73 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 73  Csr->pKeyInfo, s
97e0: 7a 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 70  zKeyInfo);.    p
97f0: 4b 65 79 49 6e 66 6f 2d 3e 64 62 20 3d 20 30 3b  KeyInfo->db = 0;
9800: 0a 20 20 20 20 69 66 28 20 6e 46 69 65 6c 64 20  .    if( nField 
9810: 26 26 20 6e 57 6f 72 6b 65 72 3d 3d 30 20 29 7b  && nWorker==0 ){
9820: 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d  .      pKeyInfo-
9830: 3e 6e 58 46 69 65 6c 64 20 2b 3d 20 28 70 4b 65  >nXField += (pKe
9840: 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2d 20  yInfo->nField - 
9850: 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 70  nField);.      p
9860: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
9870: 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 7d 0a  = nField;.    }.
9880: 20 20 20 20 70 53 6f 72 74 65 72 2d 3e 70 67 73      pSorter->pgs
9890: 7a 20 3d 20 70 67 73 7a 20 3d 20 73 71 6c 69 74  z = pgsz = sqlit
98a0: 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69  e3BtreeGetPageSi
98b0: 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  ze(db->aDb[0].pB
98c0: 74 29 3b 0a 20 20 20 20 70 53 6f 72 74 65 72 2d  t);.    pSorter-
98d0: 3e 6e 54 61 73 6b 20 3d 20 6e 57 6f 72 6b 65 72  >nTask = nWorker
98e0: 20 2b 20 31 3b 0a 20 20 20 20 70 53 6f 72 74 65   + 1;.    pSorte
98f0: 72 2d 3e 69 50 72 65 76 20 3d 20 28 75 38 29 28  r->iPrev = (u8)(
9900: 6e 57 6f 72 6b 65 72 20 2d 20 31 29 3b 0a 20 20  nWorker - 1);.  
9910: 20 20 70 53 6f 72 74 65 72 2d 3e 62 55 73 65 54    pSorter->bUseT
9920: 68 72 65 61 64 73 20 3d 20 28 70 53 6f 72 74 65  hreads = (pSorte
9930: 72 2d 3e 6e 54 61 73 6b 3e 31 29 3b 0a 20 20 20  r->nTask>1);.   
9940: 20 70 53 6f 72 74 65 72 2d 3e 64 62 20 3d 20 64   pSorter->db = d
9950: 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  b;.    for(i=0; 
9960: 69 3c 70 53 6f 72 74 65 72 2d 3e 6e 54 61 73 6b  i<pSorter->nTask
9970: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 53 6f  ; i++){.      So
9980: 72 74 53 75 62 74 61 73 6b 20 2a 70 54 61 73 6b  rtSubtask *pTask
9990: 20 3d 20 26 70 53 6f 72 74 65 72 2d 3e 61 54 61   = &pSorter->aTa
99a0: 73 6b 5b 69 5d 3b 0a 20 20 20 20 20 20 70 54 61  sk[i];.      pTa
99b0: 73 6b 2d 3e 70 53 6f 72 74 65 72 20 3d 20 70 53  sk->pSorter = pS
99c0: 6f 72 74 65 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  orter;.    }..  
99d0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 54 65    if( !sqlite3Te
99e0: 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29 20 29  mpInMemory(db) )
99f0: 7b 0a 20 20 20 20 20 20 75 33 32 20 73 7a 50 6d  {.      u32 szPm
9a00: 61 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  a = sqlite3Globa
9a10: 6c 43 6f 6e 66 69 67 2e 73 7a 50 6d 61 3b 0a 20  lConfig.szPma;. 
9a20: 20 20 20 20 20 70 53 6f 72 74 65 72 2d 3e 6d 6e       pSorter->mn
9a30: 50 6d 61 53 69 7a 65 20 3d 20 73 7a 50 6d 61 20  PmaSize = szPma 
9a40: 2a 20 70 67 73 7a 3b 0a 20 20 20 20 20 20 6d 78  * pgsz;.      mx
9a50: 43 61 63 68 65 20 3d 20 64 62 2d 3e 61 44 62 5b  Cache = db->aDb[
9a60: 30 5d 2e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68  0].pSchema->cach
9a70: 65 5f 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  e_size;.      if
9a80: 28 20 6d 78 43 61 63 68 65 3c 28 69 6e 74 29 73  ( mxCache<(int)s
9a90: 7a 50 6d 61 20 29 20 6d 78 43 61 63 68 65 20 3d  zPma ) mxCache =
9aa0: 20 28 69 6e 74 29 73 7a 50 6d 61 3b 0a 20 20 20   (int)szPma;.   
9ab0: 20 20 20 70 53 6f 72 74 65 72 2d 3e 6d 78 50 6d     pSorter->mxPm
9ac0: 61 53 69 7a 65 20 3d 20 4d 49 4e 28 28 69 36 34  aSize = MIN((i64
9ad0: 29 6d 78 43 61 63 68 65 2a 70 67 73 7a 2c 20 53  )mxCache*pgsz, S
9ae0: 51 4c 49 54 45 5f 4d 41 58 5f 50 4d 41 53 5a 29  QLITE_MAX_PMASZ)
9af0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  ;..      /* EVID
9b00: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 36 37 34 37  ENCE-OF: R-26747
9b10: 2d 36 31 37 31 39 20 57 68 65 6e 20 74 68 65 20  -61719 When the 
9b20: 61 70 70 6c 69 63 61 74 69 6f 6e 20 70 72 6f 76  application prov
9b30: 69 64 65 73 20 61 6e 79 20 61 6d 6f 75 6e 74 20  ides any amount 
9b40: 6f 66 0a 20 20 20 20 20 20 2a 2a 20 73 63 72 61  of.      ** scra
9b50: 74 63 68 20 6d 65 6d 6f 72 79 20 75 73 69 6e 67  tch memory using
9b60: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
9b70: 43 52 41 54 43 48 2c 20 53 51 4c 69 74 65 20 61  CRATCH, SQLite a
9b80: 76 6f 69 64 73 20 75 6e 6e 65 63 65 73 73 61 72  voids unnecessar
9b90: 79 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72 67 65  y.      ** large
9ba0: 20 68 65 61 70 20 61 6c 6c 6f 63 61 74 69 6f 6e   heap allocation
9bb0: 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
9bc0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
9bd0: 62 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72 61 74  balConfig.pScrat
9be0: 63 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ch==0 ){.       
9bf0: 20 61 73 73 65 72 74 28 20 70 53 6f 72 74 65 72   assert( pSorter
9c00: 2d 3e 69 4d 65 6d 6f 72 79 3d 3d 30 20 29 3b 0a  ->iMemory==0 );.
9c10: 20 20 20 20 20 20 20 20 70 53 6f 72 74 65 72 2d          pSorter-
9c20: 3e 6e 4d 65 6d 6f 72 79 20 3d 20 70 67 73 7a 3b  >nMemory = pgsz;
9c30: 0a 20 20 20 20 20 20 20 20 70 53 6f 72 74 65 72  .        pSorter
9c40: 2d 3e 6c 69 73 74 2e 61 4d 65 6d 6f 72 79 20 3d  ->list.aMemory =
9c50: 20 28 75 38 2a 29 73 71 6c 69 74 65 33 4d 61 6c   (u8*)sqlite3Mal
9c60: 6c 6f 63 28 70 67 73 7a 29 3b 0a 20 20 20 20 20  loc(pgsz);.     
9c70: 20 20 20 69 66 28 20 21 70 53 6f 72 74 65 72 2d     if( !pSorter-
9c80: 3e 6c 69 73 74 2e 61 4d 65 6d 6f 72 79 20 29 20  >list.aMemory ) 
9c90: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
9ca0: 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  M;.      }.    }
9cb0: 0a 0a 20 20 20 20 69 66 28 20 28 70 4b 65 79 49  ..    if( (pKeyI
9cc0: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79  nfo->nField+pKey
9cd0: 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 29 3c 31  Info->nXField)<1
9ce0: 33 20 0a 20 20 20 20 20 26 26 20 28 70 4b 65 79  3 .     && (pKey
9cf0: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d  Info->aColl[0]==
9d00: 30 20 7c 7c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  0 || pKeyInfo->a
9d10: 43 6f 6c 6c 5b 30 5d 3d 3d 64 62 2d 3e 70 44 66  Coll[0]==db->pDf
9d20: 6c 74 43 6f 6c 6c 29 0a 20 20 20 20 29 7b 0a 20  ltColl).    ){. 
9d30: 20 20 20 20 20 70 53 6f 72 74 65 72 2d 3e 74 79       pSorter->ty
9d40: 70 65 4d 61 73 6b 20 3d 20 53 4f 52 54 45 52 5f  peMask = SORTER_
9d50: 54 59 50 45 5f 49 4e 54 45 47 45 52 20 7c 20 53  TYPE_INTEGER | S
9d60: 4f 52 54 45 52 5f 54 59 50 45 5f 54 45 58 54 3b  ORTER_TYPE_TEXT;
9d70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
9d80: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 75 6e 64 65  turn rc;.}.#unde
9d90: 66 20 6e 57 6f 72 6b 65 72 20 20 20 2f 2a 20 44  f nWorker   /* D
9da0: 65 66 69 6e 65 64 20 61 74 20 74 68 65 20 74 6f  efined at the to
9db0: 70 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  p of this functi
9dc0: 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  on */../*.** Fre
9dd0: 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20 73 6f  e the list of so
9de0: 72 74 65 64 20 72 65 63 6f 72 64 73 20 73 74 61  rted records sta
9df0: 72 74 69 6e 67 20 61 74 20 70 52 65 63 6f 72 64  rting at pRecord
9e00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9e10: 20 76 64 62 65 53 6f 72 74 65 72 52 65 63 6f 72   vdbeSorterRecor
9e20: 64 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64  dFree(sqlite3 *d
9e30: 62 2c 20 53 6f 72 74 65 72 52 65 63 6f 72 64 20  b, SorterRecord 
9e40: 2a 70 52 65 63 6f 72 64 29 7b 0a 20 20 53 6f 72  *pRecord){.  Sor
9e50: 74 65 72 52 65 63 6f 72 64 20 2a 70 3b 0a 20 20  terRecord *p;.  
9e60: 53 6f 72 74 65 72 52 65 63 6f 72 64 20 2a 70 4e  SorterRecord *pN
9e70: 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 52 65  ext;.  for(p=pRe
9e80: 63 6f 72 64 3b 20 70 3b 20 70 3d 70 4e 65 78 74  cord; p; p=pNext
9e90: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
9ea0: 2d 3e 75 2e 70 4e 65 78 74 3b 0a 20 20 20 20 73  ->u.pNext;.    s
9eb0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
9ec0: 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   p);.  }.}../*.*
9ed0: 2a 20 46 72 65 65 20 61 6c 6c 20 72 65 73 6f 75  * Free all resou
9ee0: 72 63 65 73 20 6f 77 6e 65 64 20 62 79 20 74 68  rces owned by th
9ef0: 65 20 6f 62 6a 65 63 74 20 69 6e 64 69 63 61 74  e object indicat
9f00: 65 64 20 62 79 20 61 72 67 75 6d 65 6e 74 20 70  ed by argument p
9f10: 54 61 73 6b 2e 20 41 6c 6c 20 0a 2a 2a 20 66 69  Task. All .** fi
9f20: 65 6c 64 73 20 6f 66 20 2a 70 54 61 73 6b 20 61  elds of *pTask a
9f30: 72 65 20 7a 65 72 6f 65 64 20 62 65 66 6f 72 65  re zeroed before
9f40: 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
9f50: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 53  tatic void vdbeS
9f60: 6f 72 74 53 75 62 74 61 73 6b 43 6c 65 61 6e 75  ortSubtaskCleanu
9f70: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
9f80: 6f 72 74 53 75 62 74 61 73 6b 20 2a 70 54 61 73  ortSubtask *pTas
9f90: 6b 29 7b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  k){.  sqlite3DbF
9fa0: 72 65 65 28 64 62 2c 20 70 54 61 73 6b 2d 3e 70  ree(db, pTask->p
9fb0: 55 6e 70 61 63 6b 65 64 29 3b 0a 23 69 66 20 53  Unpacked);.#if S
9fc0: 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52  QLITE_MAX_WORKER
9fd0: 5f 54 48 52 45 41 44 53 3e 30 0a 20 20 2f 2a 20  _THREADS>0.  /* 
9fe0: 70 54 61 73 6b 2d 3e 6c 69 73 74 2e 61 4d 65 6d  pTask->list.aMem
9ff0: 6f 72 79 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  ory can only be 
a000: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 69 74 20 77  non-zero if it w
a010: 61 73 20 68 61 6e 64 65 64 20 6d 65 6d 6f 72 79  as handed memory
a020: 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 6d  .  ** from the m
a030: 61 69 6e 20 74 68 72 65 61 64 2e 20 20 54 68 61  ain thread.  Tha
a040: 74 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 53 51  t only occurs SQ
a050: 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f  LITE_MAX_WORKER_
a060: 54 48 52 45 41 44 53 3e 30 20 2a 2f 0a 20 20 69  THREADS>0 */.  i
a070: 66 28 20 70 54 61 73 6b 2d 3e 6c 69 73 74 2e 61  f( pTask->list.a
a080: 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 73 71  Memory ){.    sq
a090: 6c 69 74 65 33 5f 66 72 65 65 28 70 54 61 73 6b  lite3_free(pTask
a0a0: 2d 3e 6c 69 73 74 2e 61 4d 65 6d 6f 72 79 29 3b  ->list.aMemory);
a0b0: 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
a0c0: 20 20 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20    {.    assert( 
a0d0: 70 54 61 73 6b 2d 3e 6c 69 73 74 2e 61 4d 65 6d  pTask->list.aMem
a0e0: 6f 72 79 3d 3d 30 20 29 3b 0a 20 20 20 20 76 64  ory==0 );.    vd
a0f0: 62 65 53 6f 72 74 65 72 52 65 63 6f 72 64 46 72  beSorterRecordFr
a100: 65 65 28 30 2c 20 70 54 61 73 6b 2d 3e 6c 69 73  ee(0, pTask->lis
a110: 74 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20  t.pList);.  }.  
a120: 69 66 28 20 70 54 61 73 6b 2d 3e 66 69 6c 65 2e  if( pTask->file.
a130: 70 46 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pFd ){.    sqlit
a140: 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 54  e3OsCloseFree(pT
a150: 61 73 6b 2d 3e 66 69 6c 65 2e 70 46 64 29 3b 0a  ask->file.pFd);.
a160: 20 20 7d 0a 20 20 69 66 28 20 70 54 61 73 6b 2d    }.  if( pTask-
a170: 3e 66 69 6c 65 32 2e 70 46 64 20 29 7b 0a 20 20  >file2.pFd ){.  
a180: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
a190: 46 72 65 65 28 70 54 61 73 6b 2d 3e 66 69 6c 65  Free(pTask->file
a1a0: 32 2e 70 46 64 29 3b 0a 20 20 7d 0a 20 20 6d 65  2.pFd);.  }.  me
a1b0: 6d 73 65 74 28 70 54 61 73 6b 2c 20 30 2c 20 73  mset(pTask, 0, s
a1c0: 69 7a 65 6f 66 28 53 6f 72 74 53 75 62 74 61 73  izeof(SortSubtas
a1d0: 6b 29 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  k));.}..#ifdef S
a1e0: 51 4c 49 54 45 5f 44 45 42 55 47 5f 53 4f 52 54  QLITE_DEBUG_SORT
a1f0: 45 52 5f 54 48 52 45 41 44 53 0a 73 74 61 74 69  ER_THREADS.stati
a200: 63 20 76 6f 69 64 20 76 64 62 65 53 6f 72 74 65  c void vdbeSorte
a210: 72 57 6f 72 6b 44 65 62 75 67 28 53 6f 72 74 53  rWorkDebug(SortS
a220: 75 62 74 61 73 6b 20 2a 70 54 61 73 6b 2c 20 63  ubtask *pTask, c
a230: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 76 65 6e  onst char *zEven
a240: 74 29 7b 0a 20 20 69 36 34 20 74 3b 0a 20 20 69  t){.  i64 t;.  i
a250: 6e 74 20 69 54 61 73 6b 20 3d 20 28 70 54 61 73  nt iTask = (pTas
a260: 6b 20 2d 20 70 54 61 73 6b 2d 3e 70 53 6f 72 74  k - pTask->pSort
a270: 65 72 2d 3e 61 54 61 73 6b 29 3b 0a 20 20 73 71  er->aTask);.  sq
a280: 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69  lite3OsCurrentTi
a290: 6d 65 49 6e 74 36 34 28 70 54 61 73 6b 2d 3e 70  meInt64(pTask->p
a2a0: 53 6f 72 74 65 72 2d 3e 64 62 2d 3e 70 56 66 73  Sorter->db->pVfs
a2b0: 2c 20 26 74 29 3b 0a 20 20 66 70 72 69 6e 74 66  , &t);.  fprintf
a2c0: 28 73 74 64 65 72 72 2c 20 22 25 6c 6c 64 3a 25  (stderr, "%lld:%
a2d0: 64 20 25 73 5c 6e 22 2c 20 74 2c 20 69 54 61 73  d %s\n", t, iTas
a2e0: 6b 2c 20 7a 45 76 65 6e 74 29 3b 0a 7d 0a 73 74  k, zEvent);.}.st
a2f0: 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 53 6f  atic void vdbeSo
a300: 72 74 65 72 52 65 77 69 6e 64 44 65 62 75 67 28  rterRewindDebug(
a310: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 76 65  const char *zEve
a320: 6e 74 29 7b 0a 20 20 69 36 34 20 74 3b 0a 20 20  nt){.  i64 t;.  
a330: 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74  sqlite3OsCurrent
a340: 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65  TimeInt64(sqlite
a350: 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 2c 20 26  3_vfs_find(0), &
a360: 74 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74  t);.  fprintf(st
a370: 64 65 72 72 2c 20 22 25 6c 6c 64 3a 58 20 25 73  derr, "%lld:X %s
a380: 5c 6e 22 2c 20 74 2c 20 7a 45 76 65 6e 74 29 3b  \n", t, zEvent);
a390: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  .}.static void v
a3a0: 64 62 65 53 6f 72 74 65 72 50 6f 70 75 6c 61 74  dbeSorterPopulat
a3b0: 65 44 65 62 75 67 28 0a 20 20 53 6f 72 74 53 75  eDebug(.  SortSu
a3c0: 62 74 61 73 6b 20 2a 70 54 61 73 6b 2c 0a 20 20  btask *pTask,.  
a3d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 76 65  const char *zEve
a3e0: 6e 74 0a 29 7b 0a 20 20 69 36 34 20 74 3b 0a 20  nt.){.  i64 t;. 
a3f0: 20 69 6e 74 20 69 54 61 73 6b 20 3d 20 28 70 54   int iTask = (pT
a400: 61 73 6b 20 2d 20 70 54 61 73 6b 2d 3e 70 53 6f  ask - pTask->pSo
a410: 72 74 65 72 2d 3e 61 54 61 73 6b 29 3b 0a 20 20  rter->aTask);.  
a420: 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74  sqlite3OsCurrent
a430: 54 69 6d 65 49 6e 74 36 34 28 70 54 61 73 6b 2d  TimeInt64(pTask-
a440: 3e 70 53 6f 72 74 65 72 2d 3e 64 62 2d 3e 70 56  >pSorter->db->pV
a450: 66 73 2c 20 26 74 29 3b 0a 20 20 66 70 72 69 6e  fs, &t);.  fprin
a460: 74 66 28 73 74 64 65 72 72 2c 20 22 25 6c 6c 64  tf(stderr, "%lld
a470: 3a 62 67 25 64 20 25 73 5c 6e 22 2c 20 74 2c 20  :bg%d %s\n", t, 
a480: 69 54 61 73 6b 2c 20 7a 45 76 65 6e 74 29 3b 0a  iTask, zEvent);.
a490: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  }.static void vd
a4a0: 62 65 53 6f 72 74 65 72 42 6c 6f 63 6b 44 65 62  beSorterBlockDeb
a4b0: 75 67 28 0a 20 20 53 6f 72 74 53 75 62 74 61 73  ug(.  SortSubtas
a4c0: 6b 20 2a 70 54 61 73 6b 2c 0a 20 20 69 6e 74 20  k *pTask,.  int 
a4d0: 62 42 6c 6f 63 6b 65 64 2c 0a 20 20 63 6f 6e 73  bBlocked,.  cons
a4e0: 74 20 63 68 61 72 20 2a 7a 45 76 65 6e 74 0a 29  t char *zEvent.)
a4f0: 7b 0a 20 20 69 66 28 20 62 42 6c 6f 63 6b 65 64  {.  if( bBlocked
a500: 20 29 7b 0a 20 20 20 20 69 36 34 20 74 3b 0a 20   ){.    i64 t;. 
a510: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72     sqlite3OsCurr
a520: 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 70 54 61  entTimeInt64(pTa
a530: 73 6b 2d 3e 70 53 6f 72 74 65 72 2d 3e 64 62 2d  sk->pSorter->db-
a540: 3e 70 56 66 73 2c 20 26 74 29 3b 0a 20 20 20 20  >pVfs, &t);.    
a550: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
a560: 22 25 6c 6c 64 3a 6d 61 69 6e 20 25 73 5c 6e 22  "%lld:main %s\n"
a570: 2c 20 74 2c 20 7a 45 76 65 6e 74 29 3b 0a 20 20  , t, zEvent);.  
a580: 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
a590: 6e 65 20 76 64 62 65 53 6f 72 74 65 72 57 6f 72  ne vdbeSorterWor
a5a0: 6b 44 65 62 75 67 28 78 2c 79 29 0a 23 20 64 65  kDebug(x,y).# de
a5b0: 66 69 6e 65 20 76 64 62 65 53 6f 72 74 65 72 52  fine vdbeSorterR
a5c0: 65 77 69 6e 64 44 65 62 75 67 28 79 29 0a 23 20  ewindDebug(y).# 
a5d0: 64 65 66 69 6e 65 20 76 64 62 65 53 6f 72 74 65  define vdbeSorte
a5e0: 72 50 6f 70 75 6c 61 74 65 44 65 62 75 67 28 78  rPopulateDebug(x
a5f0: 2c 79 29 0a 23 20 64 65 66 69 6e 65 20 76 64 62  ,y).# define vdb
a600: 65 53 6f 72 74 65 72 42 6c 6f 63 6b 44 65 62 75  eSorterBlockDebu
a610: 67 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a  g(x,y,z).#endif.
a620: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
a630: 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3e 30  WORKER_THREADS>0
a640: 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 68 72 65  ./*.** Join thre
a650: 61 64 20 70 54 61 73 6b 2d 3e 74 68 72 65 61 64  ad pTask->thread
a660: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a670: 76 64 62 65 53 6f 72 74 65 72 4a 6f 69 6e 54 68  vdbeSorterJoinTh
a680: 72 65 61 64 28 53 6f 72 74 53 75 62 74 61 73 6b  read(SortSubtask
a690: 20 2a 70 54 61 73 6b 29 7b 0a 20 20 69 6e 74 20   *pTask){.  int 
a6a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
a6b0: 20 20 69 66 28 20 70 54 61 73 6b 2d 3e 70 54 68    if( pTask->pTh
a6c0: 72 65 61 64 20 29 7b 0a 23 69 66 64 65 66 20 53  read ){.#ifdef S
a6d0: 51 4c 49 54 45 5f 44 45 42 55 47 5f 53 4f 52 54  QLITE_DEBUG_SORT
a6e0: 45 52 5f 54 48 52 45 41 44 53 0a 20 20 20 20 69  ER_THREADS.    i
a6f0: 6e 74 20 62 44 6f 6e 65 20 3d 20 70 54 61 73 6b  nt bDone = pTask
a700: 2d 3e 62 44 6f 6e 65 3b 0a 23 65 6e 64 69 66 0a  ->bDone;.#endif.
a710: 20 20 20 20 76 6f 69 64 20 2a 70 52 65 74 20 3d      void *pRet =
a720: 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
a730: 54 52 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 29  TR(SQLITE_ERROR)
a740: 3b 0a 20 20 20 20 76 64 62 65 53 6f 72 74 65 72  ;.    vdbeSorter
a750: 42 6c 6f 63 6b 44 65 62 75 67 28 70 54 61 73 6b  BlockDebug(pTask
a760: 2c 20 21 62 44 6f 6e 65 2c 20 22 65 6e 74 65 72  , !bDone, "enter
a770: 22 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 73 71  ");.    (void)sq
a780: 6c 69 74 65 33 54 68 72 65 61 64 4a 6f 69 6e 28  lite3ThreadJoin(
a790: 70 54 61 73 6b 2d 3e 70 54 68 72 65 61 64 2c 20  pTask->pThread, 
a7a0: 26 70 52 65 74 29 3b 0a 20 20 20 20 76 64 62 65  &pRet);.    vdbe
a7b0: 53 6f 72 74 65 72 42 6c 6f 63 6b 44 65 62 75 67  SorterBlockDebug
a7c0: 28 70 54 61 73 6b 2c 20 21 62 44 6f 6e 65 2c 20  (pTask, !bDone, 
a7d0: 22 65 78 69 74 22 29 3b 0a 20 20 20 20 72 63 20  "exit");.    rc 
a7e0: 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  = SQLITE_PTR_TO_
a7f0: 49 4e 54 28 70 52 65 74 29 3b 0a 20 20 20 20 61  INT(pRet);.    a
a800: 73 73 65 72 74 28 20 70 54 61 73 6b 2d 3e 62 44  ssert( pTask->bD
a810: 6f 6e 65 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54  one==1 );.    pT
a820: 61 73 6b 2d 3e 62 44 6f 6e 65 20 3d 20 30 3b 0a  ask->bDone = 0;.
a830: 20 20 20 20 70 54 61 73 6b 2d 3e 70 54 68 72 65      pTask->pThre
a840: 61 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ad = 0;.  }.  re
a850: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
a860: 2a 20 4c 61 75 6e 63 68 20 61 20 62 61 63 6b 67  * Launch a backg
a870: 72 6f 75 6e 64 20 74 68 72 65 61 64 20 74 6f 20  round thread to 
a880: 72 75 6e 20 78 54 61 73 6b 28 70 49 6e 29 2e 0a  run xTask(pIn)..
a890: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
a8a0: 62 65 53 6f 72 74 65 72 43 72 65 61 74 65 54 68  beSorterCreateTh
a8b0: 72 65 61 64 28 0a 20 20 53 6f 72 74 53 75 62 74  read(.  SortSubt
a8c0: 61 73 6b 20 2a 70 54 61 73 6b 2c 20 20 20 20 20  ask *pTask,     
a8d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 72 65 61          /* Threa
a8e0: 64 20 77 69 6c 6c 20 75 73 65 20 74 68 69 73 20  d will use this 
a8f0: 74 61 73 6b 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  task object */. 
a900: 20 76 6f 69 64 20 2a 28 2a 78 54 61 73 6b 29 28   void *(*xTask)(
a910: 76 6f 69 64 2a 29 2c 20 20 20 20 20 20 20 20 20  void*),         
a920: 20 2f 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 72   /* Routine to r
a930: 75 6e 20 69 6e 20 61 20 73 65 70 61 72 61 74 65  un in a separate
a940: 20 74 68 72 65 61 64 20 2a 2f 0a 20 20 76 6f 69   thread */.  voi
a950: 64 20 2a 70 49 6e 20 20 20 20 20 20 20 20 20 20  d *pIn          
a960: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a970: 41 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  Argument passed 
a980: 69 6e 74 6f 20 78 54 61 73 6b 28 29 20 2a 2f 0a  into xTask() */.
a990: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  ){.  assert( pTa
a9a0: 73 6b 2d 3e 70 54 68 72 65 61 64 3d 3d 30 20 26  sk->pThread==0 &
a9b0: 26 20 70 54 61 73 6b 2d 3e 62 44 6f 6e 65 3d 3d  & pTask->bDone==
a9c0: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  0 );.  return sq
a9d0: 6c 69 74 65 33 54 68 72 65 61 64 43 72 65 61 74  lite3ThreadCreat
a9e0: 65 28 26 70 54 61 73 6b 2d 3e 70 54 68 72 65 61  e(&pTask->pThrea
a9f0: 64 2c 20 78 54 61 73 6b 2c 20 70 49 6e 29 3b 0a  d, xTask, pIn);.
aa00: 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 61 6c  }../*.** Join al
aa10: 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 74 68  l outstanding th
aa20: 72 65 61 64 73 20 6c 61 75 6e 63 68 65 64 20 62  reads launched b
aa30: 79 20 53 6f 72 74 65 72 57 72 69 74 65 28 29 20  y SorterWrite() 
aa40: 74 6f 20 63 72 65 61 74 65 20 0a 2a 2a 20 6c 65  to create .** le
aa50: 76 65 6c 2d 30 20 50 4d 41 73 2e 0a 2a 2f 0a 73  vel-0 PMAs..*/.s
aa60: 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 53 6f  tatic int vdbeSo
aa70: 72 74 65 72 4a 6f 69 6e 41 6c 6c 28 56 64 62 65  rterJoinAll(Vdbe
aa80: 53 6f 72 74 65 72 20 2a 70 53 6f 72 74 65 72 2c  Sorter *pSorter,
aa90: 20 69 6e 74 20 72 63 69 6e 29 7b 0a 20 20 69 6e   int rcin){.  in
aaa0: 74 20 72 63 20 3d 20 72 63 69 6e 3b 0a 20 20 69  t rc = rcin;.  i
aab0: 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  nt i;..  /* This
aac0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c 77   function is alw
aad0: 61 79 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68  ays called by th
aae0: 65 20 6d 61 69 6e 20 75 73 65 72 20 74 68 72 65  e main user thre
aaf0: 61 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ad..  **.  ** If
ab00: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
ab10: 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 61  s being called a
ab20: 66 74 65 72 20 53 6f 72 74 65 72 52 65 77 69 6e  fter SorterRewin
ab30: 64 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c  d() has been cal
ab40: 6c 65 64 2c 20 0a 20 20 2a 2a 20 69 74 20 69 73  led, .  ** it is
ab50: 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 74   possible that t
ab60: 68 72 65 61 64 20 70 53 6f 72 74 65 72 2d 3e 61  hread pSorter->a
ab70: 54 61 73 6b 5b 70 53 6f 72 74 65 72 2d 3e 6e 54  Task[pSorter->nT
ab80: 61 73 6b 2d 31 5d 2e 70 54 68 72 65 61 64 0a 20  ask-1].pThread. 
ab90: 20 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79   ** is currently
aba0: 20 61 74 74 65 6d 70 74 20 74 6f 20 6a 6f 69 6e   attempt to join
abb0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 74 68 65   one of the othe
abc0: 72 20 74 68 72 65 61 64 73 2e 20 54 6f 20 61 76  r threads. To av
abd0: 6f 69 64 20 61 20 72 61 63 65 0a 20 20 2a 2a 20  oid a race.  ** 
abe0: 63 6f 6e 64 69 74 69 6f 6e 20 77 68 65 72 65 20  condition where 
abf0: 74 68 69 73 20 74 68 72 65 61 64 20 61 6c 73 6f  this thread also
ac00: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6a 6f 69   attempts to joi
ac10: 6e 20 74 68 65 20 73 61 6d 65 20 6f 62 6a 65 63  n the same objec
ac20: 74 2c 20 6a 6f 69 6e 20 0a 20 20 2a 2a 20 74 68  t, join .  ** th
ac30: 72 65 61 64 20 70 53 6f 72 74 65 72 2d 3e 61 54  read pSorter->aT
ac40: 61 73 6b 5b 70 53 6f 72 74 65 72 2d 3e 6e 54 61  ask[pSorter->nTa
ac50: 73 6b 2d 31 5d 2e 70 54 68 72 65 61 64 20 66 69  sk-1].pThread fi
ac60: 72 73 74 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  rst. */.  for(i=
ac70: 70 53 6f 72 74 65 72 2d 3e 6e 54 61 73 6b 2d 31  pSorter->nTask-1
ac80: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
ac90: 20 20 53 6f 72 74 53 75 62 74 61 73 6b 20 2a 70    SortSubtask *p
aca0: 54 61 73 6b 20 3d 20 26 70 53 6f 72 74 65 72 2d  Task = &pSorter-
acb0: 3e 61 54 61 73 6b 5b 69 5d 3b 0a 20 20 20 20 69  >aTask[i];.    i
acc0: 6e 74 20 72 63 32 20 3d 20 76 64 62 65 53 6f 72  nt rc2 = vdbeSor
acd0: 74 65 72 4a 6f 69 6e 54 68 72 65 61 64 28 70 54  terJoinThread(pT
ace0: 61 73 6b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ask);.    if( rc
acf0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
ad00: 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20 20 72 65   = rc2;.  }.  re
ad10: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65  turn rc;.}.#else
ad20: 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 53 6f  .# define vdbeSo
ad30: 72 74 65 72 4a 6f 69 6e 41 6c 6c 28 78 2c 72 63  rterJoinAll(x,rc
ad40: 69 6e 29 20 28 72 63 69 6e 29 0a 23 20 64 65 66  in) (rcin).# def
ad50: 69 6e 65 20 76 64 62 65 53 6f 72 74 65 72 4a 6f  ine vdbeSorterJo
ad60: 69 6e 54 68 72 65 61 64 28 70 54 61 73 6b 29 20  inThread(pTask) 
ad70: 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66  SQLITE_OK.#endif
ad80: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
ad90: 20 61 20 6e 65 77 20 4d 65 72 67 65 45 6e 67 69   a new MergeEngi
ada0: 6e 65 20 6f 62 6a 65 63 74 20 63 61 70 61 62 6c  ne object capabl
adb0: 65 20 6f 66 20 68 61 6e 64 6c 69 6e 67 20 75 70  e of handling up
adc0: 20 74 6f 0a 2a 2a 20 6e 52 65 61 64 65 72 20 50   to.** nReader P
add0: 6d 61 52 65 61 64 65 72 20 69 6e 70 75 74 73 2e  maReader inputs.
ade0: 0a 2a 2a 0a 2a 2a 20 6e 52 65 61 64 65 72 20 69  .**.** nReader i
adf0: 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  s automatically 
ae00: 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 74 68  rounded up to th
ae10: 65 20 6e 65 78 74 20 70 6f 77 65 72 20 6f 66 20  e next power of 
ae20: 74 77 6f 2e 0a 2a 2a 20 6e 52 65 61 64 65 72 20  two..** nReader 
ae30: 6d 61 79 20 6e 6f 74 20 65 78 63 65 65 64 20 53  may not exceed S
ae40: 4f 52 54 45 52 5f 4d 41 58 5f 4d 45 52 47 45 5f  ORTER_MAX_MERGE_
ae50: 43 4f 55 4e 54 20 65 76 65 6e 20 61 66 74 65 72  COUNT even after
ae60: 20 72 6f 75 6e 64 69 6e 67 20 75 70 2e 0a 2a 2f   rounding up..*/
ae70: 0a 73 74 61 74 69 63 20 4d 65 72 67 65 45 6e 67  .static MergeEng
ae80: 69 6e 65 20 2a 76 64 62 65 4d 65 72 67 65 45 6e  ine *vdbeMergeEn
ae90: 67 69 6e 65 4e 65 77 28 69 6e 74 20 6e 52 65 61  gineNew(int nRea
aea0: 64 65 72 29 7b 0a 20 20 69 6e 74 20 4e 20 3d 20  der){.  int N = 
aeb0: 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
aec0: 20 20 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c          /* Small
aed0: 65 73 74 20 70 6f 77 65 72 20 6f 66 20 74 77 6f  est power of two
aee0: 20 3e 3d 20 6e 52 65 61 64 65 72 20 2a 2f 0a 20   >= nReader */. 
aef0: 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
af00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af10: 20 2f 2a 20 54 6f 74 61 6c 20 62 79 74 65 73 20   /* Total bytes 
af20: 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f  of space to allo
af30: 63 61 74 65 20 2a 2f 0a 20 20 4d 65 72 67 65 45  cate */.  MergeE
af40: 6e 67 69 6e 65 20 2a 70 4e 65 77 3b 20 20 20 20  ngine *pNew;    
af50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
af60: 6e 74 65 72 20 74 6f 20 61 6c 6c 6f 63 61 74 65  nter to allocate
af70: 64 20 6f 62 6a 65 63 74 20 74 6f 20 72 65 74 75  d object to retu
af80: 72 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  rn */..  assert(
af90: 20 6e 52 65 61 64 65 72 3c 3d 53 4f 52 54 45 52   nReader<=SORTER
afa0: 5f 4d 41 58 5f 4d 45 52 47 45 5f 43 4f 55 4e 54  _MAX_MERGE_COUNT
afb0: 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 4e 3c   );..  while( N<
afc0: 6e 52 65 61 64 65 72 20 29 20 4e 20 2b 3d 20 4e  nReader ) N += N
afd0: 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  ;.  nByte = size
afe0: 6f 66 28 4d 65 72 67 65 45 6e 67 69 6e 65 29 20  of(MergeEngine) 
aff0: 2b 20 4e 20 2a 20 28 73 69 7a 65 6f 66 28 69 6e  + N * (sizeof(in
b000: 74 29 20 2b 20 73 69 7a 65 6f 66 28 50 6d 61 52  t) + sizeof(PmaR
b010: 65 61 64 65 72 29 29 3b 0a 0a 20 20 70 4e 65 77  eader));..  pNew
b020: 20 3d 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53   = sqlite3FaultS
b030: 69 6d 28 31 30 30 29 20 3f 20 30 20 3a 20 28 4d  im(100) ? 0 : (M
b040: 65 72 67 65 45 6e 67 69 6e 65 2a 29 73 71 6c 69  ergeEngine*)sqli
b050: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 6e 42  te3MallocZero(nB
b060: 79 74 65 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  yte);.  if( pNew
b070: 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 54   ){.    pNew->nT
b080: 72 65 65 20 3d 20 4e 3b 0a 20 20 20 20 70 4e 65  ree = N;.    pNe
b090: 77 2d 3e 70 54 61 73 6b 20 3d 20 30 3b 0a 20 20  w->pTask = 0;.  
b0a0: 20 20 70 4e 65 77 2d 3e 61 52 65 61 64 72 20 3d    pNew->aReadr =
b0b0: 20 28 50 6d 61 52 65 61 64 65 72 2a 29 26 70 4e   (PmaReader*)&pN
b0c0: 65 77 5b 31 5d 3b 0a 20 20 20 20 70 4e 65 77 2d  ew[1];.    pNew-
b0d0: 3e 61 54 72 65 65 20 3d 20 28 69 6e 74 2a 29 26  >aTree = (int*)&
b0e0: 70 4e 65 77 2d 3e 61 52 65 61 64 72 5b 4e 5d 3b  pNew->aReadr[N];
b0f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
b100: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  ew;.}../*.** Fre
b110: 65 20 74 68 65 20 4d 65 72 67 65 45 6e 67 69 6e  e the MergeEngin
b120: 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  e object passed 
b130: 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
b140: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
b150: 76 6f 69 64 20 76 64 62 65 4d 65 72 67 65 45 6e  void vdbeMergeEn
b160: 67 69 6e 65 46 72 65 65 28 4d 65 72 67 65 45 6e  gineFree(MergeEn
b170: 67 69 6e 65 20 2a 70 4d 65 72 67 65 72 29 7b 0a  gine *pMerger){.
b180: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
b190: 4d 65 72 67 65 72 20 29 7b 0a 20 20 20 20 66 6f  Merger ){.    fo
b1a0: 72 28 69 3d 30 3b 20 69 3c 70 4d 65 72 67 65 72  r(i=0; i<pMerger
b1b0: 2d 3e 6e 54 72 65 65 3b 20 69 2b 2b 29 7b 0a 20  ->nTree; i++){. 
b1c0: 20 20 20 20 20 76 64 62 65 50 6d 61 52 65 61 64       vdbePmaRead
b1d0: 65 72 43 6c 65 61 72 28 26 70 4d 65 72 67 65 72  erClear(&pMerger
b1e0: 2d 3e 61 52 65 61 64 72 5b 69 5d 29 3b 0a 20 20  ->aReadr[i]);.  
b1f0: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
b200: 33 5f 66 72 65 65 28 70 4d 65 72 67 65 72 29 3b  3_free(pMerger);
b210: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
b220: 6c 6c 20 72 65 73 6f 75 72 63 65 73 20 61 73 73  ll resources ass
b230: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
b240: 20 49 6e 63 72 4d 65 72 67 65 72 20 6f 62 6a 65   IncrMerger obje
b250: 63 74 20 69 6e 64 69 63 61 74 65 64 20 62 79 0a  ct indicated by.
b260: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72 67  ** the first arg
b270: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
b280: 20 76 6f 69 64 20 76 64 62 65 49 6e 63 72 46 72   void vdbeIncrFr
b290: 65 65 28 49 6e 63 72 4d 65 72 67 65 72 20 2a 70  ee(IncrMerger *p
b2a0: 49 6e 63 72 29 7b 0a 20 20 69 66 28 20 70 49 6e  Incr){.  if( pIn
b2b0: 63 72 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  cr ){.#if SQLITE
b2c0: 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45  _MAX_WORKER_THRE
b2d0: 41 44 53 3e 30 0a 20 20 20 20 69 66 28 20 70 49  ADS>0.    if( pI
b2e0: 6e 63 72 2d 3e 62 55 73 65 54 68 72 65 61 64 20  ncr->bUseThread 
b2f0: 29 7b 0a 20 20 20 20 20 20 76 64 62 65 53 6f 72  ){.      vdbeSor
b300: 74 65 72 4a 6f 69 6e 54 68 72 65 61 64 28 70 49  terJoinThread(pI
b310: 6e 63 72 2d 3e 70 54 61 73 6b 29 3b 0a 20 20 20  ncr->pTask);.   
b320: 20 20 20 69 66 28 20 70 49 6e 63 72 2d 3e 61 46     if( pIncr->aF
b330: 69 6c 65 5b 30 5d 2e 70 46 64 20 29 20 73 71 6c  ile[0].pFd ) sql
b340: 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
b350: 70 49 6e 63 72 2d 3e 61 46 69 6c 65 5b 30 5d 2e  pIncr->aFile[0].
b360: 70 46 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pFd);.      if( 
b370: 70 49 6e 63 72 2d 3e 61 46 69 6c 65 5b 31 5d 2e  pIncr->aFile[1].
b380: 70 46 64 20 29 20 73 71 6c 69 74 65 33 4f 73 43  pFd ) sqlite3OsC
b390: 6c 6f 73 65 46 72 65 65 28 70 49 6e 63 72 2d 3e  loseFree(pIncr->
b3a0: 61 46 69 6c 65 5b 31 5d 2e 70 46 64 29 3b 0a 20  aFile[1].pFd);. 
b3b0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
b3c0: 76 64 62 65 4d 65 72 67 65 45 6e 67 69 6e 65 46  vdbeMergeEngineF
b3d0: 72 65 65 28 70 49 6e 63 72 2d 3e 70 4d 65 72 67  ree(pIncr->pMerg
b3e0: 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  er);.    sqlite3
b3f0: 5f 66 72 65 65 28 70 49 6e 63 72 29 3b 0a 20 20  _free(pIncr);.  
b400: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74  }.}../*.** Reset
b410: 20 61 20 73 6f 72 74 69 6e 67 20 63 75 72 73 6f   a sorting curso
b420: 72 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  r back to its or
b430: 69 67 69 6e 61 6c 20 65 6d 70 74 79 20 73 74 61  iginal empty sta
b440: 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  te..*/.void sqli
b450: 74 65 33 56 64 62 65 53 6f 72 74 65 72 52 65 73  te3VdbeSorterRes
b460: 65 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  et(sqlite3 *db, 
b470: 56 64 62 65 53 6f 72 74 65 72 20 2a 70 53 6f 72  VdbeSorter *pSor
b480: 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ter){.  int i;. 
b490: 20 28 76 6f 69 64 29 76 64 62 65 53 6f 72 74 65   (void)vdbeSorte
b4a0: 72 4a 6f 69 6e 41 6c 6c 28 70 53 6f 72 74 65 72  rJoinAll(pSorter
b4b0: 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20  , SQLITE_OK);.  
b4c0: 61 73 73 65 72 74 28 20 70 53 6f 72 74 65 72 2d  assert( pSorter-
b4d0: 3e 62 55 73 65 54 68 72 65 61 64 73 20 7c 7c 20  >bUseThreads || 
b4e0: 70 53 6f 72 74 65 72 2d 3e 70 52 65 61 64 65 72  pSorter->pReader
b4f0: 3d 3d 30 20 29 3b 0a 23 69 66 20 53 51 4c 49 54  ==0 );.#if SQLIT
b500: 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
b510: 45 41 44 53 3e 30 0a 20 20 69 66 28 20 70 53 6f  EADS>0.  if( pSo
b520: 72 74 65 72 2d 3e 70 52 65 61 64 65 72 20 29 7b  rter->pReader ){
b530: 0a 20 20 20 20 76 64 62 65 50 6d 61 52 65 61 64  .    vdbePmaRead
b540: 65 72 43 6c 65 61 72 28 70 53 6f 72 74 65 72 2d  erClear(pSorter-
b550: 3e 70 52 65 61 64 65 72 29 3b 0a 20 20 20 20 73  >pReader);.    s
b560: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
b570: 20 70 53 6f 72 74 65 72 2d 3e 70 52 65 61 64 65   pSorter->pReade
b580: 72 29 3b 0a 20 20 20 20 70 53 6f 72 74 65 72 2d  r);.    pSorter-
b590: 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  >pReader = 0;.  
b5a0: 7d 0a 23 65 6e 64 69 66 0a 20 20 76 64 62 65 4d  }.#endif.  vdbeM
b5b0: 65 72 67 65 45 6e 67 69 6e 65 46 72 65 65 28 70  ergeEngineFree(p
b5c0: 53 6f 72 74 65 72 2d 3e 70 4d 65 72 67 65 72 29  Sorter->pMerger)
b5d0: 3b 0a 20 20 70 53 6f 72 74 65 72 2d 3e 70 4d 65  ;.  pSorter->pMe
b5e0: 72 67 65 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28  rger = 0;.  for(
b5f0: 69 3d 30 3b 20 69 3c 70 53 6f 72 74 65 72 2d 3e  i=0; i<pSorter->
b600: 6e 54 61 73 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  nTask; i++){.   
b610: 20 53 6f 72 74 53 75 62 74 61 73 6b 20 2a 70 54   SortSubtask *pT
b620: 61 73 6b 20 3d 20 26 70 53 6f 72 74 65 72 2d 3e  ask = &pSorter->
b630: 61 54 61 73 6b 5b 69 5d 3b 0a 20 20 20 20 76 64  aTask[i];.    vd
b640: 62 65 53 6f 72 74 53 75 62 74 61 73 6b 43 6c 65  beSortSubtaskCle
b650: 61 6e 75 70 28 64 62 2c 20 70 54 61 73 6b 29 3b  anup(db, pTask);
b660: 0a 20 20 20 20 70 54 61 73 6b 2d 3e 70 53 6f 72  .    pTask->pSor
b670: 74 65 72 20 3d 20 70 53 6f 72 74 65 72 3b 0a 20  ter = pSorter;. 
b680: 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 65 72   }.  if( pSorter
b690: 2d 3e 6c 69 73 74 2e 61 4d 65 6d 6f 72 79 3d 3d  ->list.aMemory==
b6a0: 30 20 29 7b 0a 20 20 20 20 76 64 62 65 53 6f 72  0 ){.    vdbeSor
b6b0: 74 65 72 52 65 63 6f 72 64 46 72 65 65 28 30 2c  terRecordFree(0,
b6c0: 20 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74 2e 70   pSorter->list.p
b6d0: 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 70 53 6f  List);.  }.  pSo
b6e0: 72 74 65 72 2d 3e 6c 69 73 74 2e 70 4c 69 73 74  rter->list.pList
b6f0: 20 3d 20 30 3b 0a 20 20 70 53 6f 72 74 65 72 2d   = 0;.  pSorter-
b700: 3e 6c 69 73 74 2e 73 7a 50 4d 41 20 3d 20 30 3b  >list.szPMA = 0;
b710: 0a 20 20 70 53 6f 72 74 65 72 2d 3e 62 55 73 65  .  pSorter->bUse
b720: 50 4d 41 20 3d 20 30 3b 0a 20 20 70 53 6f 72 74  PMA = 0;.  pSort
b730: 65 72 2d 3e 69 4d 65 6d 6f 72 79 20 3d 20 30 3b  er->iMemory = 0;
b740: 0a 20 20 70 53 6f 72 74 65 72 2d 3e 6d 78 4b 65  .  pSorter->mxKe
b750: 79 73 69 7a 65 20 3d 20 30 3b 0a 20 20 73 71 6c  ysize = 0;.  sql
b760: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
b770: 53 6f 72 74 65 72 2d 3e 70 55 6e 70 61 63 6b 65  Sorter->pUnpacke
b780: 64 29 3b 0a 20 20 70 53 6f 72 74 65 72 2d 3e 70  d);.  pSorter->p
b790: 55 6e 70 61 63 6b 65 64 20 3d 20 30 3b 0a 7d 0a  Unpacked = 0;.}.
b7a0: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20  ./*.** Free any 
b7b0: 63 75 72 73 6f 72 20 63 6f 6d 70 6f 6e 65 6e 74  cursor component
b7c0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 73  s allocated by s
b7d0: 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72  qlite3VdbeSorter
b7e0: 58 58 58 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2f  XXX routines..*/
b7f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
b800: 65 53 6f 72 74 65 72 43 6c 6f 73 65 28 73 71 6c  eSorterClose(sql
b810: 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 43 75  ite3 *db, VdbeCu
b820: 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 56  rsor *pCsr){.  V
b830: 64 62 65 53 6f 72 74 65 72 20 2a 70 53 6f 72 74  dbeSorter *pSort
b840: 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  er;.  assert( pC
b850: 73 72 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55  sr->eCurType==CU
b860: 52 54 59 50 45 5f 53 4f 52 54 45 52 20 29 3b 0a  RTYPE_SORTER );.
b870: 20 20 70 53 6f 72 74 65 72 20 3d 20 70 43 73 72    pSorter = pCsr
b880: 2d 3e 75 63 2e 70 53 6f 72 74 65 72 3b 0a 20 20  ->uc.pSorter;.  
b890: 69 66 28 20 70 53 6f 72 74 65 72 20 29 7b 0a 20  if( pSorter ){. 
b8a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f     sqlite3VdbeSo
b8b0: 72 74 65 72 52 65 73 65 74 28 64 62 2c 20 70 53  rterReset(db, pS
b8c0: 6f 72 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69  orter);.    sqli
b8d0: 74 65 33 5f 66 72 65 65 28 70 53 6f 72 74 65 72  te3_free(pSorter
b8e0: 2d 3e 6c 69 73 74 2e 61 4d 65 6d 6f 72 79 29 3b  ->list.aMemory);
b8f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
b900: 65 65 28 64 62 2c 20 70 53 6f 72 74 65 72 29 3b  ee(db, pSorter);
b910: 0a 20 20 20 20 70 43 73 72 2d 3e 75 63 2e 70 53  .    pCsr->uc.pS
b920: 6f 72 74 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 7d  orter = 0;.  }.}
b930: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
b940: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a  _MMAP_SIZE>0./*.
b950: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
b960: 75 6d 65 6e 74 20 69 73 20 61 20 66 69 6c 65 2d  ument is a file-
b970: 68 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 61  handle open on a
b980: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
b990: 20 54 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20   The file.** is 
b9a0: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
b9b0: 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 72 20   nByte bytes or 
b9c0: 73 6d 61 6c 6c 65 72 20 69 6e 20 73 69 7a 65 2e  smaller in size.
b9d0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   This function.*
b9e0: 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 65 78  * attempts to ex
b9f0: 74 65 6e 64 20 74 68 65 20 66 69 6c 65 20 74 6f  tend the file to
ba00: 20 6e 42 79 74 65 20 62 79 74 65 73 20 69 6e 20   nByte bytes in 
ba10: 73 69 7a 65 20 61 6e 64 20 74 6f 20 65 6e 73 75  size and to ensu
ba20: 72 65 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 56  re that.** the V
ba30: 46 53 20 68 61 73 20 6d 65 6d 6f 72 79 20 6d 61  FS has memory ma
ba40: 70 70 65 64 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 57  pped it..**.** W
ba50: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
ba60: 65 20 66 69 6c 65 20 64 6f 65 73 20 65 6e 64 20  e file does end 
ba70: 75 70 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64  up memory mapped
ba80: 20 6f 66 20 63 6f 75 72 73 65 20 64 65 70 65 6e   of course depen
ba90: 64 73 20 6f 6e 0a 2a 2a 20 74 68 65 20 73 70 65  ds on.** the spe
baa0: 63 69 66 69 63 20 56 46 53 20 69 6d 70 6c 65 6d  cific VFS implem
bab0: 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  entation..*/.sta
bac0: 74 69 63 20 76 6f 69 64 20 76 64 62 65 53 6f 72  tic void vdbeSor
bad0: 74 65 72 45 78 74 65 6e 64 46 69 6c 65 28 73 71  terExtendFile(sq
bae0: 6c 69 74 65 33 20 2a 64 62 2c 20 73 71 6c 69 74  lite3 *db, sqlit
baf0: 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69 36  e3_file *pFd, i6
bb00: 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 66 28 20  4 nByte){.  if( 
bb10: 6e 42 79 74 65 3c 3d 28 69 36 34 29 28 64 62 2d  nByte<=(i64)(db-
bb20: 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70 29  >nMaxSorterMmap)
bb30: 20 26 26 20 70 46 64 2d 3e 70 4d 65 74 68 6f 64   && pFd->pMethod
bb40: 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29  s->iVersion>=3 )
bb50: 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 20 3d 20  {.    void *p = 
bb60: 30 3b 0a 20 20 20 20 69 6e 74 20 63 68 75 6e 6b  0;.    int chunk
bb70: 73 69 7a 65 20 3d 20 34 2a 31 30 32 34 3b 0a 20  size = 4*1024;. 
bb80: 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
bb90: 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 46 64 2c  ControlHint(pFd,
bba0: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48   SQLITE_FCNTL_CH
bbb0: 55 4e 4b 5f 53 49 5a 45 2c 20 26 63 68 75 6e 6b  UNK_SIZE, &chunk
bbc0: 73 69 7a 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  size);.    sqlit
bbd0: 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48  e3OsFileControlH
bbe0: 69 6e 74 28 70 46 64 2c 20 53 51 4c 49 54 45 5f  int(pFd, SQLITE_
bbf0: 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c  FCNTL_SIZE_HINT,
bc00: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 73 71   &nByte);.    sq
bc10: 6c 69 74 65 33 4f 73 46 65 74 63 68 28 70 46 64  lite3OsFetch(pFd
bc20: 2c 20 30 2c 20 28 69 6e 74 29 6e 42 79 74 65 2c  , 0, (int)nByte,
bc30: 20 26 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   &p);.    sqlite
bc40: 33 4f 73 55 6e 66 65 74 63 68 28 70 46 64 2c 20  3OsUnfetch(pFd, 
bc50: 30 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  0, p);.  }.}.#el
bc60: 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65  se.# define vdbe
bc70: 53 6f 72 74 65 72 45 78 74 65 6e 64 46 69 6c 65  SorterExtendFile
bc80: 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a  (x,y,z).#endif..
bc90: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73  /*.** Allocate s
bca0: 70 61 63 65 20 66 6f 72 20 61 20 66 69 6c 65 2d  pace for a file-
bcb0: 68 61 6e 64 6c 65 20 61 6e 64 20 6f 70 65 6e 20  handle and open 
bcc0: 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
bcd0: 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
bce0: 0a 2a 2a 20 73 65 74 20 2a 70 70 46 64 20 74 6f  .** set *ppFd to
bcf0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61   point to the ma
bd00: 6c 6c 6f 63 27 64 20 66 69 6c 65 2d 68 61 6e 64  lloc'd file-hand
bd10: 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  le and return SQ
bd20: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68 65  LITE_OK..** Othe
bd30: 72 77 69 73 65 2c 20 73 65 74 20 2a 70 70 46 64  rwise, set *ppFd
bd40: 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e   to 0 and return
bd50: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
bd60: 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
bd70: 20 69 6e 74 20 76 64 62 65 53 6f 72 74 65 72 4f   int vdbeSorterO
bd80: 70 65 6e 54 65 6d 70 46 69 6c 65 28 0a 20 20 73  penTempFile(.  s
bd90: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
bda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bdb0: 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
bdc0: 65 20 64 6f 69 6e 67 20 73 6f 72 74 20 2a 2f 0a  e doing sort */.
bdd0: 20 20 69 36 34 20 6e 45 78 74 65 6e 64 2c 20 20    i64 nExtend,  
bde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdf0: 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20    /* Attempt to 
be00: 65 78 74 65 6e 64 20 66 69 6c 65 20 74 6f 20 74  extend file to t
be10: 68 69 73 20 73 69 7a 65 20 2a 2f 0a 20 20 73 71  his size */.  sq
be20: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 2a 70 70 46  lite3_file **ppF
be30: 64 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  d.){.  int rc;. 
be40: 20 69 66 28 20 73 71 6c 69 74 65 33 46 61 75 6c   if( sqlite3Faul
be50: 74 53 69 6d 28 32 30 32 29 20 29 20 72 65 74 75  tSim(202) ) retu
be60: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
be70: 41 43 43 45 53 53 3b 0a 20 20 72 63 20 3d 20 73  ACCESS;.  rc = s
be80: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c  qlite3OsOpenMall
be90: 6f 63 28 64 62 2d 3e 70 56 66 73 2c 20 30 2c 20  oc(db->pVfs, 0, 
bea0: 70 70 46 64 2c 0a 20 20 20 20 20 20 53 51 4c 49  ppFd,.      SQLI
beb0: 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
bec0: 52 4e 41 4c 20 7c 0a 20 20 20 20 20 20 53 51 4c  RNAL |.      SQL
bed0: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
bee0: 54 45 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f  TE    | SQLITE_O
bef0: 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20  PEN_CREATE |.   
bf00: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
bf10: 58 43 4c 55 53 49 56 45 20 20 20 20 7c 20 53 51  XCLUSIVE    | SQ
bf20: 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
bf30: 4f 4e 43 4c 4f 53 45 2c 20 26 72 63 0a 20 20 29  ONCLOSE, &rc.  )
bf40: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
bf50: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 36 34  TE_OK ){.    i64
bf60: 20 6d 61 78 20 3d 20 53 51 4c 49 54 45 5f 4d 41   max = SQLITE_MA
bf70: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20  X_MMAP_SIZE;.   
bf80: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
bf90: 6e 74 72 6f 6c 48 69 6e 74 28 2a 70 70 46 64 2c  ntrolHint(*ppFd,
bfa0: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d   SQLITE_FCNTL_MM
bfb0: 41 50 5f 53 49 5a 45 2c 20 28 76 6f 69 64 2a 29  AP_SIZE, (void*)
bfc0: 26 6d 61 78 29 3b 0a 20 20 20 20 69 66 28 20 6e  &max);.    if( n
bfd0: 45 78 74 65 6e 64 3e 30 20 29 7b 0a 20 20 20 20  Extend>0 ){.    
bfe0: 20 20 76 64 62 65 53 6f 72 74 65 72 45 78 74 65    vdbeSorterExte
bff0: 6e 64 46 69 6c 65 28 64 62 2c 20 2a 70 70 46 64  ndFile(db, *ppFd
c000: 2c 20 6e 45 78 74 65 6e 64 29 3b 0a 20 20 20 20  , nExtend);.    
c010: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
c020: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 69  c;.}../*.** If i
c030: 74 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64  t has not alread
c040: 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
c050: 2c 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 55  , allocate the U
c060: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 0a 2a  npackedRecord .*
c070: 2a 20 73 74 72 75 63 74 75 72 65 20 61 74 20 70  * structure at p
c080: 54 61 73 6b 2d 3e 70 55 6e 70 61 63 6b 65 64 2e  Task->pUnpacked.
c090: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
c0a0: 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20  K if successful 
c0b0: 28 6f 72 20 0a 2a 2a 20 69 66 20 6e 6f 20 61 6c  (or .** if no al
c0c0: 6c 6f 63 61 74 69 6f 6e 20 77 61 73 20 72 65 71  location was req
c0d0: 75 69 72 65 64 29 2c 20 6f 72 20 53 51 4c 49 54  uired), or SQLIT
c0e0: 45 5f 4e 4f 4d 45 4d 20 6f 74 68 65 72 77 69 73  E_NOMEM otherwis
c0f0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
c100: 20 76 64 62 65 53 6f 72 74 41 6c 6c 6f 63 55 6e   vdbeSortAllocUn
c110: 70 61 63 6b 65 64 28 53 6f 72 74 53 75 62 74 61  packed(SortSubta
c120: 73 6b 20 2a 70 54 61 73 6b 29 7b 0a 20 20 69 66  sk *pTask){.  if
c130: 28 20 70 54 61 73 6b 2d 3e 70 55 6e 70 61 63 6b  ( pTask->pUnpack
c140: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61  ed==0 ){.    cha
c150: 72 20 2a 70 46 72 65 65 3b 0a 20 20 20 20 70 54  r *pFree;.    pT
c160: 61 73 6b 2d 3e 70 55 6e 70 61 63 6b 65 64 20 3d  ask->pUnpacked =
c170: 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f   sqlite3VdbeAllo
c180: 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  cUnpackedRecord(
c190: 0a 20 20 20 20 20 20 20 20 70 54 61 73 6b 2d 3e  .        pTask->
c1a0: 70 53 6f 72 74 65 72 2d 3e 70 4b 65 79 49 6e 66  pSorter->pKeyInf
c1b0: 6f 2c 20 30 2c 20 30 2c 20 26 70 46 72 65 65 0a  o, 0, 0, &pFree.
c1c0: 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72      );.    asser
c1d0: 74 28 20 70 54 61 73 6b 2d 3e 70 55 6e 70 61 63  t( pTask->pUnpac
c1e0: 6b 65 64 3d 3d 28 55 6e 70 61 63 6b 65 64 52 65  ked==(UnpackedRe
c1f0: 63 6f 72 64 2a 29 70 46 72 65 65 20 29 3b 0a 20  cord*)pFree );. 
c200: 20 20 20 69 66 28 20 70 46 72 65 65 3d 3d 30 20     if( pFree==0 
c210: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
c220: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 54 61 73 6b  NOMEM;.    pTask
c230: 2d 3e 70 55 6e 70 61 63 6b 65 64 2d 3e 6e 46 69  ->pUnpacked->nFi
c240: 65 6c 64 20 3d 20 70 54 61 73 6b 2d 3e 70 53 6f  eld = pTask->pSo
c250: 72 74 65 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  rter->pKeyInfo->
c260: 6e 46 69 65 6c 64 3b 0a 20 20 20 20 70 54 61 73  nField;.    pTas
c270: 6b 2d 3e 70 55 6e 70 61 63 6b 65 64 2d 3e 65 72  k->pUnpacked->er
c280: 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  rCode = 0;.  }. 
c290: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c2a0: 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72  K;.}.../*.** Mer
c2b0: 67 65 20 74 68 65 20 74 77 6f 20 73 6f 72 74 65  ge the two sorte
c2c0: 64 20 6c 69 73 74 73 20 70 31 20 61 6e 64 20 70  d lists p1 and p
c2d0: 32 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  2 into a single 
c2e0: 6c 69 73 74 2e 0a 2a 2a 20 53 65 74 20 2a 70 70  list..** Set *pp
c2f0: 4f 75 74 20 74 6f 20 74 68 65 20 68 65 61 64 20  Out to the head 
c300: 6f 66 20 74 68 65 20 6e 65 77 20 6c 69 73 74 2e  of the new list.
c310: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c320: 76 64 62 65 53 6f 72 74 65 72 4d 65 72 67 65 28  vdbeSorterMerge(
c330: 0a 20 20 53 6f 72 74 53 75 62 74 61 73 6b 20 2a  .  SortSubtask *
c340: 70 54 61 73 6b 2c 20 20 20 20 20 20 20 20 20 20  pTask,          
c350: 20 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 74 68     /* Calling th
c360: 72 65 61 64 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  read context */.
c370: 20 20 53 6f 72 74 65 72 52 65 63 6f 72 64 20 2a    SorterRecord *
c380: 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p1,             
c390: 20 20 2f 2a 20 46 69 72 73 74 20 6c 69 73 74 20    /* First list 
c3a0: 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20 53 6f  to merge */.  So
c3b0: 72 74 65 72 52 65 63 6f 72 64 20 2a 70 32 2c 20  rterRecord *p2, 
c3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c3d0: 20 53 65 63 6f 6e 64 20 6c 69 73 74 20 74 6f 20   Second list to 
c3e0: 6d 65 72 67 65 20 2a 2f 0a 20 20 53 6f 72 74 65  merge */.  Sorte
c3f0: 72 52 65 63 6f 72 64 20 2a 2a 70 70 4f 75 74 20  rRecord **ppOut 
c400: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
c410: 54 3a 20 48 65 61 64 20 6f 66 20 6d 65 72 67 65  T: Head of merge
c420: 64 20 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 53  d list */.){.  S
c430: 6f 72 74 65 72 52 65 63 6f 72 64 20 2a 70 46 69  orterRecord *pFi
c440: 6e 61 6c 20 3d 20 30 3b 0a 20 20 53 6f 72 74 65  nal = 0;.  Sorte
c450: 72 52 65 63 6f 72 64 20 2a 2a 70 70 20 3d 20 26  rRecord **pp = &
c460: 70 46 69 6e 61 6c 3b 0a 20 20 69 6e 74 20 62 43  pFinal;.  int bC
c470: 61 63 68 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68  ached = 0;..  wh
c480: 69 6c 65 28 20 70 31 20 26 26 20 70 32 20 29 7b  ile( p1 && p2 ){
c490: 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  .    int res;.  
c4a0: 20 20 72 65 73 20 3d 20 70 54 61 73 6b 2d 3e 78    res = pTask->x
c4b0: 43 6f 6d 70 61 72 65 28 0a 20 20 20 20 20 20 20  Compare(.       
c4c0: 20 70 54 61 73 6b 2c 20 26 62 43 61 63 68 65 64   pTask, &bCached
c4d0: 2c 20 53 52 56 41 4c 28 70 31 29 2c 20 70 31 2d  , SRVAL(p1), p1-
c4e0: 3e 6e 56 61 6c 2c 20 53 52 56 41 4c 28 70 32 29  >nVal, SRVAL(p2)
c4f0: 2c 20 70 32 2d 3e 6e 56 61 6c 0a 20 20 20 20 29  , p2->nVal.    )
c500: 3b 0a 0a 20 20 20 20 69 66 28 20 72 65 73 3c 3d  ;..    if( res<=
c510: 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d  0 ){.      *pp =
c520: 20 70 31 3b 0a 20 20 20 20 20 20 70 70 20 3d 20   p1;.      pp = 
c530: 26 70 31 2d 3e 75 2e 70 4e 65 78 74 3b 0a 20 20  &p1->u.pNext;.  
c540: 20 20 20 20 70 31 20 3d 20 70 31 2d 3e 75 2e 70      p1 = p1->u.p
c550: 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
c560: 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 32 3b  .      *pp = p2;
c570: 0a 20 20 20 20 20 20 70 70 20 3d 20 26 70 32 2d  .      pp = &p2-
c580: 3e 75 2e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  >u.pNext;.      
c590: 70 32 20 3d 20 70 32 2d 3e 75 2e 70 4e 65 78 74  p2 = p2->u.pNext
c5a0: 3b 0a 20 20 20 20 20 20 62 43 61 63 68 65 64 20  ;.      bCached 
c5b0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
c5c0: 20 2a 70 70 20 3d 20 70 31 20 3f 20 70 31 20 3a   *pp = p1 ? p1 :
c5d0: 20 70 32 3b 0a 20 20 2a 70 70 4f 75 74 20 3d 20   p2;.  *ppOut = 
c5e0: 70 46 69 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pFinal;.}../*.**
c5f0: 20 52 65 74 75 72 6e 20 74 68 65 20 53 6f 72 74   Return the Sort
c600: 65 72 43 6f 6d 70 61 72 65 20 66 75 6e 63 74 69  erCompare functi
c610: 6f 6e 20 74 6f 20 63 6f 6d 70 61 72 65 20 76 61  on to compare va
c620: 6c 75 65 73 20 63 6f 6c 6c 65 63 74 65 64 20 62  lues collected b
c630: 79 20 74 68 65 0a 2a 2a 20 73 6f 72 74 65 72 20  y the.** sorter 
c640: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
c650: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
c660: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 6f  nt..*/.static So
c670: 72 74 65 72 43 6f 6d 70 61 72 65 20 76 64 62 65  rterCompare vdbe
c680: 53 6f 72 74 65 72 47 65 74 43 6f 6d 70 61 72 65  SorterGetCompare
c690: 28 56 64 62 65 53 6f 72 74 65 72 20 2a 70 29 7b  (VdbeSorter *p){
c6a0: 0a 20 20 69 66 28 20 70 2d 3e 74 79 70 65 4d 61  .  if( p->typeMa
c6b0: 73 6b 3d 3d 53 4f 52 54 45 52 5f 54 59 50 45 5f  sk==SORTER_TYPE_
c6c0: 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 72  INTEGER ){.    r
c6d0: 65 74 75 72 6e 20 76 64 62 65 53 6f 72 74 65 72  eturn vdbeSorter
c6e0: 43 6f 6d 70 61 72 65 49 6e 74 3b 0a 20 20 7d 65  CompareInt;.  }e
c6f0: 6c 73 65 20 69 66 28 20 70 2d 3e 74 79 70 65 4d  lse if( p->typeM
c700: 61 73 6b 3d 3d 53 4f 52 54 45 52 5f 54 59 50 45  ask==SORTER_TYPE
c710: 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 72 65 74  _TEXT ){.    ret
c720: 75 72 6e 20 76 64 62 65 53 6f 72 74 65 72 43 6f  urn vdbeSorterCo
c730: 6d 70 61 72 65 54 65 78 74 3b 20 0a 20 20 7d 0a  mpareText; .  }.
c740: 20 20 72 65 74 75 72 6e 20 76 64 62 65 53 6f 72    return vdbeSor
c750: 74 65 72 43 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f  terCompare;.}../
c760: 2a 0a 2a 2a 20 53 6f 72 74 20 74 68 65 20 6c 69  *.** Sort the li
c770: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 72 65 63  nked list of rec
c780: 6f 72 64 73 20 68 65 61 64 65 64 20 61 74 20 70  ords headed at p
c790: 54 61 73 6b 2d 3e 70 4c 69 73 74 2e 20 52 65 74  Task->pList. Ret
c7a0: 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  urn .** SQLITE_O
c7b0: 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  K if successful,
c7c0: 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
c7d0: 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 53  ror code (i.e. S
c7e0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 20 69 66 20  QLITE_NOMEM) if 
c7f0: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  .** an error occ
c800: 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  urs..*/.static i
c810: 6e 74 20 76 64 62 65 53 6f 72 74 65 72 53 6f 72  nt vdbeSorterSor
c820: 74 28 53 6f 72 74 53 75 62 74 61 73 6b 20 2a 70  t(SortSubtask *p
c830: 54 61 73 6b 2c 20 53 6f 72 74 65 72 4c 69 73 74  Task, SorterList
c840: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
c850: 69 3b 0a 20 20 53 6f 72 74 65 72 52 65 63 6f 72  i;.  SorterRecor
c860: 64 20 2a 2a 61 53 6c 6f 74 3b 0a 20 20 53 6f 72  d **aSlot;.  Sor
c870: 74 65 72 52 65 63 6f 72 64 20 2a 70 3b 0a 20 20  terRecord *p;.  
c880: 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
c890: 76 64 62 65 53 6f 72 74 41 6c 6c 6f 63 55 6e 70  vdbeSortAllocUnp
c8a0: 61 63 6b 65 64 28 70 54 61 73 6b 29 3b 0a 20 20  acked(pTask);.  
c8b0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
c8c0: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
c8d0: 20 20 70 20 3d 20 70 4c 69 73 74 2d 3e 70 4c 69    p = pList->pLi
c8e0: 73 74 3b 0a 20 20 70 54 61 73 6b 2d 3e 78 43 6f  st;.  pTask->xCo
c8f0: 6d 70 61 72 65 20 3d 20 76 64 62 65 53 6f 72 74  mpare = vdbeSort
c900: 65 72 47 65 74 43 6f 6d 70 61 72 65 28 70 54 61  erGetCompare(pTa
c910: 73 6b 2d 3e 70 53 6f 72 74 65 72 29 3b 0a 0a 20  sk->pSorter);.. 
c920: 20 61 53 6c 6f 74 20 3d 20 28 53 6f 72 74 65 72   aSlot = (Sorter
c930: 52 65 63 6f 72 64 20 2a 2a 29 73 71 6c 69 74 65  Record **)sqlite
c940: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 36 34 20 2a  3MallocZero(64 *
c950: 20 73 69 7a 65 6f 66 28 53 6f 72 74 65 72 52 65   sizeof(SorterRe
c960: 63 6f 72 64 20 2a 29 29 3b 0a 20 20 69 66 28 20  cord *));.  if( 
c970: 21 61 53 6c 6f 74 20 29 7b 0a 20 20 20 20 72 65  !aSlot ){.    re
c980: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
c990: 4d 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  M;.  }..  while(
c9a0: 20 70 20 29 7b 0a 20 20 20 20 53 6f 72 74 65 72   p ){.    Sorter
c9b0: 52 65 63 6f 72 64 20 2a 70 4e 65 78 74 3b 0a 20  Record *pNext;. 
c9c0: 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 4d     if( pList->aM
c9d0: 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 69  emory ){.      i
c9e0: 66 28 20 28 75 38 2a 29 70 3d 3d 70 4c 69 73 74  f( (u8*)p==pList
c9f0: 2d 3e 61 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20  ->aMemory ){.   
ca00: 20 20 20 20 20 70 4e 65 78 74 20 3d 20 30 3b 0a       pNext = 0;.
ca10: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ca20: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
ca30: 75 2e 69 4e 65 78 74 3c 73 71 6c 69 74 65 33 4d  u.iNext<sqlite3M
ca40: 61 6c 6c 6f 63 53 69 7a 65 28 70 4c 69 73 74 2d  allocSize(pList-
ca50: 3e 61 4d 65 6d 6f 72 79 29 20 29 3b 0a 20 20 20  >aMemory) );.   
ca60: 20 20 20 20 20 70 4e 65 78 74 20 3d 20 28 53 6f       pNext = (So
ca70: 72 74 65 72 52 65 63 6f 72 64 2a 29 26 70 4c 69  rterRecord*)&pLi
ca80: 73 74 2d 3e 61 4d 65 6d 6f 72 79 5b 70 2d 3e 75  st->aMemory[p->u
ca90: 2e 69 4e 65 78 74 5d 3b 0a 20 20 20 20 20 20 7d  .iNext];.      }
caa0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
cab0: 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 75 2e 70    pNext = p->u.p
cac0: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Next;.    }..   
cad0: 20 70 2d 3e 75 2e 70 4e 65 78 74 20 3d 20 30 3b   p->u.pNext = 0;
cae0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 53  .    for(i=0; aS
caf0: 6c 6f 74 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  lot[i]; i++){.  
cb00: 20 20 20 20 76 64 62 65 53 6f 72 74 65 72 4d 65      vdbeSorterMe
cb10: 72 67 65 28 70 54 61 73 6b 2c 20 70 2c 20 61 53  rge(pTask, p, aS
cb20: 6c 6f 74 5b 69 5d 2c 20 26 70 29 3b 0a 20 20 20  lot[i], &p);.   
cb30: 20 20 20 61 53 6c 6f 74 5b 69 5d 20 3d 20 30 3b     aSlot[i] = 0;
cb40: 0a 20 20 20 20 7d 0a 20 20 20 20 61 53 6c 6f 74  .    }.    aSlot
cb50: 5b 69 5d 20 3d 20 70 3b 0a 20 20 20 20 70 20 3d  [i] = p;.    p =
cb60: 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 70   pNext;.  }..  p
cb70: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
cb80: 20 69 3c 36 34 3b 20 69 2b 2b 29 7b 0a 20 20 20   i<64; i++){.   
cb90: 20 76 64 62 65 53 6f 72 74 65 72 4d 65 72 67 65   vdbeSorterMerge
cba0: 28 70 54 61 73 6b 2c 20 70 2c 20 61 53 6c 6f 74  (pTask, p, aSlot
cbb0: 5b 69 5d 2c 20 26 70 29 3b 0a 20 20 7d 0a 20 20  [i], &p);.  }.  
cbc0: 70 4c 69 73 74 2d 3e 70 4c 69 73 74 20 3d 20 70  pList->pList = p
cbd0: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ;..  sqlite3_fre
cbe0: 65 28 61 53 6c 6f 74 29 3b 0a 20 20 61 73 73 65  e(aSlot);.  asse
cbf0: 72 74 28 20 70 54 61 73 6b 2d 3e 70 55 6e 70 61  rt( pTask->pUnpa
cc00: 63 6b 65 64 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  cked->errCode==S
cc10: 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20 20 20  QLITE_OK .      
cc20: 20 7c 7c 20 70 54 61 73 6b 2d 3e 70 55 6e 70 61   || pTask->pUnpa
cc30: 63 6b 65 64 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  cked->errCode==S
cc40: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 20 20 29  QLITE_NOMEM .  )
cc50: 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 61 73 6b  ;.  return pTask
cc60: 2d 3e 70 55 6e 70 61 63 6b 65 64 2d 3e 65 72 72  ->pUnpacked->err
cc70: 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  Code;.}../*.** I
cc80: 6e 69 74 69 61 6c 69 7a 65 20 61 20 50 4d 41 2d  nitialize a PMA-
cc90: 77 72 69 74 65 72 20 6f 62 6a 65 63 74 2e 0a 2a  writer object..*
cca0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
ccb0: 62 65 50 6d 61 57 72 69 74 65 72 49 6e 69 74 28  bePmaWriterInit(
ccc0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
ccd0: 2a 70 46 64 2c 20 20 20 20 20 20 20 20 20 20 20  *pFd,           
cce0: 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c     /* File handl
ccf0: 65 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f  e to write to */
cd00: 0a 20 20 50 6d 61 57 72 69 74 65 72 20 2a 70 2c  .  PmaWriter *p,
cd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd20: 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20     /* Object to 
cd30: 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 20 20 69 6e  populate */.  in
cd40: 74 20 6e 42 75 66 2c 20 20 20 20 20 20 20 20 20  t nBuf,         
cd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cd60: 20 42 75 66 66 65 72 20 73 69 7a 65 20 2a 2f 0a   Buffer size */.
cd70: 20 20 69 36 34 20 69 53 74 61 72 74 20 20 20 20    i64 iStart    
cd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd90: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 70    /* Offset of p
cda0: 46 64 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74  Fd to begin writ
cdb0: 69 6e 67 20 61 74 20 2a 2f 0a 29 7b 0a 20 20 6d  ing at */.){.  m
cdc0: 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
cdd0: 6f 66 28 50 6d 61 57 72 69 74 65 72 29 29 3b 0a  of(PmaWriter));.
cde0: 20 20 70 2d 3e 61 42 75 66 66 65 72 20 3d 20 28    p->aBuffer = (
cdf0: 75 38 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  u8*)sqlite3Mallo
ce00: 63 28 6e 42 75 66 29 3b 0a 20 20 69 66 28 20 21  c(nBuf);.  if( !
ce10: 70 2d 3e 61 42 75 66 66 65 72 20 29 7b 0a 20 20  p->aBuffer ){.  
ce20: 20 20 70 2d 3e 65 46 57 45 72 72 20 3d 20 53 51    p->eFWErr = SQ
ce30: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
ce40: 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 69 42 75 66  lse{.    p->iBuf
ce50: 45 6e 64 20 3d 20 70 2d 3e 69 42 75 66 53 74 61  End = p->iBufSta
ce60: 72 74 20 3d 20 28 69 53 74 61 72 74 20 25 20 6e  rt = (iStart % n
ce70: 42 75 66 29 3b 0a 20 20 20 20 70 2d 3e 69 57 72  Buf);.    p->iWr
ce80: 69 74 65 4f 66 66 20 3d 20 69 53 74 61 72 74 20  iteOff = iStart 
ce90: 2d 20 70 2d 3e 69 42 75 66 53 74 61 72 74 3b 0a  - p->iBufStart;.
cea0: 20 20 20 20 70 2d 3e 6e 42 75 66 66 65 72 20 3d      p->nBuffer =
ceb0: 20 6e 42 75 66 3b 0a 20 20 20 20 70 2d 3e 70 46   nBuf;.    p->pF
cec0: 64 20 3d 20 70 46 64 3b 0a 20 20 7d 0a 7d 0a 0a  d = pFd;.  }.}..
ced0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 44 61 74  /*.** Write nDat
cee0: 61 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  a bytes of data 
cef0: 74 6f 20 74 68 65 20 50 4d 41 2e 20 52 65 74 75  to the PMA. Retu
cf00: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
cf10: 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  if successful, o
cf20: 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
cf30: 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72  r code if an err
cf40: 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  or occurs..*/.st
cf50: 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 50 6d  atic void vdbePm
cf60: 61 57 72 69 74 65 42 6c 6f 62 28 50 6d 61 57 72  aWriteBlob(PmaWr
cf70: 69 74 65 72 20 2a 70 2c 20 75 38 20 2a 70 44 61  iter *p, u8 *pDa
cf80: 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a  ta, int nData){.
cf90: 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 6e 44 61    int nRem = nDa
cfa0: 74 61 3b 0a 20 20 77 68 69 6c 65 28 20 6e 52 65  ta;.  while( nRe
cfb0: 6d 3e 30 20 26 26 20 70 2d 3e 65 46 57 45 72 72  m>0 && p->eFWErr
cfc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ==0 ){.    int n
cfd0: 43 6f 70 79 20 3d 20 6e 52 65 6d 3b 0a 20 20 20  Copy = nRem;.   
cfe0: 20 69 66 28 20 6e 43 6f 70 79 3e 28 70 2d 3e 6e   if( nCopy>(p->n
cff0: 42 75 66 66 65 72 20 2d 20 70 2d 3e 69 42 75 66  Buffer - p->iBuf
d000: 45 6e 64 29 20 29 7b 0a 20 20 20 20 20 20 6e 43  End) ){.      nC
d010: 6f 70 79 20 3d 20 70 2d 3e 6e 42 75 66 66 65 72  opy = p->nBuffer
d020: 20 2d 20 70 2d 3e 69 42 75 66 45 6e 64 3b 0a 20   - p->iBufEnd;. 
d030: 20 20 20 7d 0a 0a 20 20 20 20 6d 65 6d 63 70 79     }..    memcpy
d040: 28 26 70 2d 3e 61 42 75 66 66 65 72 5b 70 2d 3e  (&p->aBuffer[p->
d050: 69 42 75 66 45 6e 64 5d 2c 20 26 70 44 61 74 61  iBufEnd], &pData
d060: 5b 6e 44 61 74 61 2d 6e 52 65 6d 5d 2c 20 6e 43  [nData-nRem], nC
d070: 6f 70 79 29 3b 0a 20 20 20 20 70 2d 3e 69 42 75  opy);.    p->iBu
d080: 66 45 6e 64 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20  fEnd += nCopy;. 
d090: 20 20 20 69 66 28 20 70 2d 3e 69 42 75 66 45 6e     if( p->iBufEn
d0a0: 64 3d 3d 70 2d 3e 6e 42 75 66 66 65 72 20 29 7b  d==p->nBuffer ){
d0b0: 0a 20 20 20 20 20 20 70 2d 3e 65 46 57 45 72 72  .      p->eFWErr
d0c0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
d0d0: 65 28 70 2d 3e 70 46 64 2c 20 0a 20 20 20 20 20  e(p->pFd, .     
d0e0: 20 20 20 20 20 26 70 2d 3e 61 42 75 66 66 65 72       &p->aBuffer
d0f0: 5b 70 2d 3e 69 42 75 66 53 74 61 72 74 5d 2c 20  [p->iBufStart], 
d100: 70 2d 3e 69 42 75 66 45 6e 64 20 2d 20 70 2d 3e  p->iBufEnd - p->
d110: 69 42 75 66 53 74 61 72 74 2c 20 0a 20 20 20 20  iBufStart, .    
d120: 20 20 20 20 20 20 70 2d 3e 69 57 72 69 74 65 4f        p->iWriteO
d130: 66 66 20 2b 20 70 2d 3e 69 42 75 66 53 74 61 72  ff + p->iBufStar
d140: 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  t.      );.     
d150: 20 70 2d 3e 69 42 75 66 53 74 61 72 74 20 3d 20   p->iBufStart = 
d160: 70 2d 3e 69 42 75 66 45 6e 64 20 3d 20 30 3b 0a  p->iBufEnd = 0;.
d170: 20 20 20 20 20 20 70 2d 3e 69 57 72 69 74 65 4f        p->iWriteO
d180: 66 66 20 2b 3d 20 70 2d 3e 6e 42 75 66 66 65 72  ff += p->nBuffer
d190: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
d1a0: 72 74 28 20 70 2d 3e 69 42 75 66 45 6e 64 3c 70  rt( p->iBufEnd<p
d1b0: 2d 3e 6e 42 75 66 66 65 72 20 29 3b 0a 0a 20 20  ->nBuffer );..  
d1c0: 20 20 6e 52 65 6d 20 2d 3d 20 6e 43 6f 70 79 3b    nRem -= nCopy;
d1d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c  .  }.}../*.** Fl
d1e0: 75 73 68 20 61 6e 79 20 62 75 66 66 65 72 65 64  ush any buffered
d1f0: 20 64 61 74 61 20 74 6f 20 64 69 73 6b 20 61 6e   data to disk an
d200: 64 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 50  d clean up the P
d210: 4d 41 2d 77 72 69 74 65 72 20 6f 62 6a 65 63 74  MA-writer object
d220: 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73  ..** The results
d230: 20 6f 66 20 75 73 69 6e 67 20 74 68 65 20 50 4d   of using the PM
d240: 41 2d 77 72 69 74 65 72 20 61 66 74 65 72 20 74  A-writer after t
d250: 68 69 73 20 63 61 6c 6c 20 61 72 65 20 75 6e 64  his call are und
d260: 65 66 69 6e 65 64 2e 0a 2a 2a 20 52 65 74 75 72  efined..** Retur
d270: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 66  n SQLITE_OK if f
d280: 6c 75 73 68 69 6e 67 20 74 68 65 20 62 75 66 66  lushing the buff
d290: 65 72 65 64 20 64 61 74 61 20 73 75 63 63 65 65  ered data succee
d2a0: 64 73 20 6f 72 20 69 73 20 6e 6f 74 20 0a 2a 2a  ds or is not .**
d2b0: 20 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72   required. Other
d2c0: 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  wise, return an 
d2d0: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
d2e0: 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  e..**.** Before 
d2f0: 72 65 74 75 72 6e 69 6e 67 2c 20 73 65 74 20 2a  returning, set *
d300: 70 69 45 6f 66 20 74 6f 20 74 68 65 20 6f 66 66  piEof to the off
d310: 73 65 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  set immediately 
d320: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 0a 2a 2a  following the.**
d330: 20 6c 61 73 74 20 62 79 74 65 20 77 72 69 74 74   last byte writt
d340: 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a  en to the file..
d350: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
d360: 62 65 50 6d 61 57 72 69 74 65 72 46 69 6e 69 73  bePmaWriterFinis
d370: 68 28 50 6d 61 57 72 69 74 65 72 20 2a 70 2c 20  h(PmaWriter *p, 
d380: 69 36 34 20 2a 70 69 45 6f 66 29 7b 0a 20 20 69  i64 *piEof){.  i
d390: 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 2d 3e  nt rc;.  if( p->
d3a0: 65 46 57 45 72 72 3d 3d 30 20 26 26 20 41 4c 57  eFWErr==0 && ALW
d3b0: 41 59 53 28 70 2d 3e 61 42 75 66 66 65 72 29 20  AYS(p->aBuffer) 
d3c0: 26 26 20 70 2d 3e 69 42 75 66 45 6e 64 3e 70 2d  && p->iBufEnd>p-
d3d0: 3e 69 42 75 66 53 74 61 72 74 20 29 7b 0a 20 20  >iBufStart ){.  
d3e0: 20 20 70 2d 3e 65 46 57 45 72 72 20 3d 20 73 71    p->eFWErr = sq
d3f0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 2d 3e  lite3OsWrite(p->
d400: 70 46 64 2c 20 0a 20 20 20 20 20 20 20 20 26 70  pFd, .        &p
d410: 2d 3e 61 42 75 66 66 65 72 5b 70 2d 3e 69 42 75  ->aBuffer[p->iBu
d420: 66 53 74 61 72 74 5d 2c 20 70 2d 3e 69 42 75 66  fStart], p->iBuf
d430: 45 6e 64 20 2d 20 70 2d 3e 69 42 75 66 53 74 61  End - p->iBufSta
d440: 72 74 2c 20 0a 20 20 20 20 20 20 20 20 70 2d 3e  rt, .        p->
d450: 69 57 72 69 74 65 4f 66 66 20 2b 20 70 2d 3e 69  iWriteOff + p->i
d460: 42 75 66 53 74 61 72 74 0a 20 20 20 20 29 3b 0a  BufStart.    );.
d470: 20 20 7d 0a 20 20 2a 70 69 45 6f 66 20 3d 20 28    }.  *piEof = (
d480: 70 2d 3e 69 57 72 69 74 65 4f 66 66 20 2b 20 70  p->iWriteOff + p
d490: 2d 3e 69 42 75 66 45 6e 64 29 3b 0a 20 20 73 71  ->iBufEnd);.  sq
d4a0: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 42  lite3_free(p->aB
d4b0: 75 66 66 65 72 29 3b 0a 20 20 72 63 20 3d 20 70  uffer);.  rc = p
d4c0: 2d 3e 65 46 57 45 72 72 3b 0a 20 20 6d 65 6d 73  ->eFWErr;.  mems
d4d0: 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
d4e0: 50 6d 61 57 72 69 74 65 72 29 29 3b 0a 20 20 72  PmaWriter));.  r
d4f0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
d500: 2a 2a 20 57 72 69 74 65 20 76 61 6c 75 65 20 69  ** Write value i
d510: 56 61 6c 20 65 6e 63 6f 64 65 64 20 61 73 20 61  Val encoded as a
d520: 20 76 61 72 69 6e 74 20 74 6f 20 74 68 65 20 50   varint to the P
d530: 4d 41 2e 20 52 65 74 75 72 6e 20 0a 2a 2a 20 53  MA. Return .** S
d540: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
d550: 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51  essful, or an SQ
d560: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
d570: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
d580: 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rs..*/.static vo
d590: 69 64 20 76 64 62 65 50 6d 61 57 72 69 74 65 56  id vdbePmaWriteV
d5a0: 61 72 69 6e 74 28 50 6d 61 57 72 69 74 65 72 20  arint(PmaWriter 
d5b0: 2a 70 2c 20 75 36 34 20 69 56 61 6c 29 7b 0a 20  *p, u64 iVal){. 
d5c0: 20 69 6e 74 20 6e 42 79 74 65 3b 20 0a 20 20 75   int nByte; .  u
d5d0: 38 20 61 42 79 74 65 5b 31 30 5d 3b 0a 20 20 6e  8 aByte[10];.  n
d5e0: 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33 50 75  Byte = sqlite3Pu
d5f0: 74 56 61 72 69 6e 74 28 61 42 79 74 65 2c 20 69  tVarint(aByte, i
d600: 56 61 6c 29 3b 0a 20 20 76 64 62 65 50 6d 61 57  Val);.  vdbePmaW
d610: 72 69 74 65 42 6c 6f 62 28 70 2c 20 61 42 79 74  riteBlob(p, aByt
d620: 65 2c 20 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a  e, nByte);.}../*
d630: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 63 75  .** Write the cu
d640: 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f  rrent contents o
d650: 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 6c 69 6e 6b  f in-memory link
d660: 65 64 2d 6c 69 73 74 20 70 4c 69 73 74 20 74 6f  ed-list pList to
d670: 20 61 20 6c 65 76 65 6c 2d 30 0a 2a 2a 20 50 4d   a level-0.** PM
d680: 41 20 69 6e 20 74 68 65 20 74 65 6d 70 20 66 69  A in the temp fi
d690: 6c 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  le belonging to 
d6a0: 73 75 62 2d 74 61 73 6b 20 70 54 61 73 6b 2e 20  sub-task pTask. 
d6b0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
d6c0: 20 69 66 20 0a 2a 2a 20 73 75 63 63 65 73 73 66   if .** successf
d6d0: 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ul, or an SQLite
d6e0: 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
d6f0: 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rwise..**.** The
d700: 20 66 6f 72 6d 61 74 20 6f 66 20 61 20 50 4d 41   format of a PMA
d710: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a   is:.**.**     *
d720: 20 41 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20   A varint. This 
d730: 76 61 72 69 6e 74 20 63 6f 6e 74 61 69 6e 73 20  varint contains 
d740: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
d750: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 6f 6e   of bytes of con
d760: 74 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 69 6e  tent.**       in
d770: 20 74 68 65 20 50 4d 41 20 28 6e 6f 74 20 69 6e   the PMA (not in
d780: 63 6c 75 64 69 6e 67 20 74 68 65 20 76 61 72 69  cluding the vari
d790: 6e 74 20 69 74 73 65 6c 66 29 2e 0a 2a 2a 0a 2a  nt itself)..**.*
d7a0: 2a 20 20 20 20 20 2a 20 4f 6e 65 20 6f 72 20 6d  *     * One or m
d7b0: 6f 72 65 20 72 65 63 6f 72 64 73 20 70 61 63 6b  ore records pack
d7c0: 65 64 20 65 6e 64 2d 74 6f 2d 65 6e 64 20 69 6e  ed end-to-end in
d7d0: 20 6f 72 64 65 72 20 6f 66 20 61 73 63 65 6e 64   order of ascend
d7e0: 69 6e 67 20 6b 65 79 73 2e 20 0a 2a 2a 20 20 20  ing keys. .**   
d7f0: 20 20 20 20 45 61 63 68 20 72 65 63 6f 72 64 20      Each record 
d800: 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 76 61  consists of a va
d810: 72 69 6e 74 20 66 6f 6c 6c 6f 77 65 64 20 62 79  rint followed by
d820: 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20   a blob of data 
d830: 28 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 6b  (the .**       k
d840: 65 79 29 2e 20 54 68 65 20 76 61 72 69 6e 74 20  ey). The varint 
d850: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
d860: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 62 6c   bytes in the bl
d870: 6f 62 20 6f 66 20 64 61 74 61 2e 0a 2a 2f 0a 73  ob of data..*/.s
d880: 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 53 6f  tatic int vdbeSo
d890: 72 74 65 72 4c 69 73 74 54 6f 50 4d 41 28 53 6f  rterListToPMA(So
d8a0: 72 74 53 75 62 74 61 73 6b 20 2a 70 54 61 73 6b  rtSubtask *pTask
d8b0: 2c 20 53 6f 72 74 65 72 4c 69 73 74 20 2a 70 4c  , SorterList *pL
d8c0: 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  ist){.  sqlite3 
d8d0: 2a 64 62 20 3d 20 70 54 61 73 6b 2d 3e 70 53 6f  *db = pTask->pSo
d8e0: 72 74 65 72 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  rter->db;.  int 
d8f0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
d900: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
d910: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
d920: 50 6d 61 57 72 69 74 65 72 20 77 72 69 74 65 72  PmaWriter writer
d930: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d940: 2f 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74  /* Object used t
d950: 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 66  o write to the f
d960: 69 6c 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  ile */..#ifdef S
d970: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
d980: 20 53 65 74 20 69 53 7a 20 74 6f 20 74 68 65 20   Set iSz to the 
d990: 65 78 70 65 63 74 65 64 20 73 69 7a 65 20 6f 66  expected size of
d9a0: 20 66 69 6c 65 20 70 54 61 73 6b 2d 3e 66 69 6c   file pTask->fil
d9b0: 65 20 61 66 74 65 72 20 77 72 69 74 69 6e 67 20  e after writing 
d9c0: 74 68 65 20 50 4d 41 2e 20 0a 20 20 2a 2a 20 54  the PMA. .  ** T
d9d0: 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 61  his is used by a
d9e0: 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
d9f0: 6d 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20  ment at the end 
da00: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
da10: 2e 20 20 2a 2f 0a 20 20 69 36 34 20 69 53 7a 20  .  */.  i64 iSz 
da20: 3d 20 70 4c 69 73 74 2d 3e 73 7a 50 4d 41 20 2b  = pList->szPMA +
da30: 20 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65   sqlite3VarintLe
da40: 6e 28 70 4c 69 73 74 2d 3e 73 7a 50 4d 41 29 20  n(pList->szPMA) 
da50: 2b 20 70 54 61 73 6b 2d 3e 66 69 6c 65 2e 69 45  + pTask->file.iE
da60: 6f 66 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 76 64  of;.#endif..  vd
da70: 62 65 53 6f 72 74 65 72 57 6f 72 6b 44 65 62 75  beSorterWorkDebu
da80: 67 28 70 54 61 73 6b 2c 20 22 65 6e 74 65 72 22  g(pTask, "enter"
da90: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 72 69  );.  memset(&wri
daa0: 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50  ter, 0, sizeof(P
dab0: 6d 61 57 72 69 74 65 72 29 29 3b 0a 20 20 61 73  maWriter));.  as
dac0: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 73 7a 50  sert( pList->szP
dad0: 4d 41 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  MA>0 );..  /* If
dae0: 20 74 68 65 20 66 69 72 73 74 20 74 65 6d 70 6f   the first tempo
daf0: 72 61 72 79 20 50 4d 41 20 66 69 6c 65 20 68 61  rary PMA file ha
db00: 73 20 6e 6f 74 20 62 65 65 6e 20 6f 70 65 6e 65  s not been opene
db10: 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20  d, open it now. 
db20: 2a 2f 0a 20 20 69 66 28 20 70 54 61 73 6b 2d 3e  */.  if( pTask->
db30: 66 69 6c 65 2e 70 46 64 3d 3d 30 20 29 7b 0a 20  file.pFd==0 ){. 
db40: 20 20 20 72 63 20 3d 20 76 64 62 65 53 6f 72 74     rc = vdbeSort
db50: 65 72 4f 70 65 6e 54 65 6d 70 46 69 6c 65 28 64  erOpenTempFile(d
db60: 62 2c 20 30 2c 20 26 70 54 61 73 6b 2d 3e 66 69  b, 0, &pTask->fi
db70: 6c 65 2e 70 46 64 29 3b 0a 20 20 20 20 61 73 73  le.pFd);.    ass
db80: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
db90: 4f 4b 20 7c 7c 20 70 54 61 73 6b 2d 3e 66 69 6c  OK || pTask->fil
dba0: 65 2e 70 46 64 20 29 3b 0a 20 20 20 20 61 73 73  e.pFd );.    ass
dbb0: 65 72 74 28 20 70 54 61 73 6b 2d 3e 66 69 6c 65  ert( pTask->file
dbc0: 2e 69 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 20 20  .iEof==0 );.    
dbd0: 61 73 73 65 72 74 28 20 70 54 61 73 6b 2d 3e 6e  assert( pTask->n
dbe0: 50 4d 41 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20  PMA==0 );.  }.. 
dbf0: 20 2f 2a 20 54 72 79 20 74 6f 20 67 65 74 20 74   /* Try to get t
dc00: 68 65 20 66 69 6c 65 20 74 6f 20 6d 65 6d 6f 72  he file to memor
dc10: 79 20 6d 61 70 20 2a 2f 0a 20 20 69 66 28 20 72  y map */.  if( r
dc20: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
dc30: 20 20 20 20 76 64 62 65 53 6f 72 74 65 72 45 78      vdbeSorterEx
dc40: 74 65 6e 64 46 69 6c 65 28 64 62 2c 20 70 54 61  tendFile(db, pTa
dc50: 73 6b 2d 3e 66 69 6c 65 2e 70 46 64 2c 20 70 54  sk->file.pFd, pT
dc60: 61 73 6b 2d 3e 66 69 6c 65 2e 69 45 6f 66 2b 70  ask->file.iEof+p
dc70: 4c 69 73 74 2d 3e 73 7a 50 4d 41 2b 39 29 3b 0a  List->szPMA+9);.
dc80: 20 20 7d 0a 0a 20 20 2f 2a 20 53 6f 72 74 20 74    }..  /* Sort t
dc90: 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 66 28  he list */.  if(
dca0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
dcb0: 7b 0a 20 20 20 20 72 63 20 3d 20 76 64 62 65 53  {.    rc = vdbeS
dcc0: 6f 72 74 65 72 53 6f 72 74 28 70 54 61 73 6b 2c  orterSort(pTask,
dcd0: 20 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20   pList);.  }..  
dce0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
dcf0: 4b 20 29 7b 0a 20 20 20 20 53 6f 72 74 65 72 52  K ){.    SorterR
dd00: 65 63 6f 72 64 20 2a 70 3b 0a 20 20 20 20 53 6f  ecord *p;.    So
dd10: 72 74 65 72 52 65 63 6f 72 64 20 2a 70 4e 65 78  rterRecord *pNex
dd20: 74 20 3d 20 30 3b 0a 0a 20 20 20 20 76 64 62 65  t = 0;..    vdbe
dd30: 50 6d 61 57 72 69 74 65 72 49 6e 69 74 28 70 54  PmaWriterInit(pT
dd40: 61 73 6b 2d 3e 66 69 6c 65 2e 70 46 64 2c 20 26  ask->file.pFd, &
dd50: 77 72 69 74 65 72 2c 20 70 54 61 73 6b 2d 3e 70  writer, pTask->p
dd60: 53 6f 72 74 65 72 2d 3e 70 67 73 7a 2c 0a 20 20  Sorter->pgsz,.  
dd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd80: 20 20 20 20 70 54 61 73 6b 2d 3e 66 69 6c 65 2e      pTask->file.
dd90: 69 45 6f 66 29 3b 0a 20 20 20 20 70 54 61 73 6b  iEof);.    pTask
dda0: 2d 3e 6e 50 4d 41 2b 2b 3b 0a 20 20 20 20 76 64  ->nPMA++;.    vd
ddb0: 62 65 50 6d 61 57 72 69 74 65 56 61 72 69 6e 74  bePmaWriteVarint
ddc0: 28 26 77 72 69 74 65 72 2c 20 70 4c 69 73 74 2d  (&writer, pList-
ddd0: 3e 73 7a 50 4d 41 29 3b 0a 20 20 20 20 66 6f 72  >szPMA);.    for
dde0: 28 70 3d 70 4c 69 73 74 2d 3e 70 4c 69 73 74 3b  (p=pList->pList;
ddf0: 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20   p; p=pNext){.  
de00: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 75      pNext = p->u
de10: 2e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 76 64  .pNext;.      vd
de20: 62 65 50 6d 61 57 72 69 74 65 56 61 72 69 6e 74  bePmaWriteVarint
de30: 28 26 77 72 69 74 65 72 2c 20 70 2d 3e 6e 56 61  (&writer, p->nVa
de40: 6c 29 3b 0a 20 20 20 20 20 20 76 64 62 65 50 6d  l);.      vdbePm
de50: 61 57 72 69 74 65 42 6c 6f 62 28 26 77 72 69 74  aWriteBlob(&writ
de60: 65 72 2c 20 53 52 56 41 4c 28 70 29 2c 20 70 2d  er, SRVAL(p), p-
de70: 3e 6e 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66  >nVal);.      if
de80: 28 20 70 4c 69 73 74 2d 3e 61 4d 65 6d 6f 72 79  ( pList->aMemory
de90: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 5f 66 72  ==0 ) sqlite3_fr
dea0: 65 65 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ee(p);.    }.   
deb0: 20 70 4c 69 73 74 2d 3e 70 4c 69 73 74 20 3d 20   pList->pList = 
dec0: 70 3b 0a 20 20 20 20 72 63 20 3d 20 76 64 62 65  p;.    rc = vdbe
ded0: 50 6d 61 57 72 69 74 65 72 46 69 6e 69 73 68 28  PmaWriterFinish(
dee0: 26 77 72 69 74 65 72 2c 20 26 70 54 61 73 6b 2d  &writer, &pTask-
def0: 3e 66 69 6c 65 2e 69 45 6f 66 29 3b 0a 20 20 7d  >file.iEof);.  }
df00: 0a 0a 20 20 76 64 62 65 53 6f 72 74 65 72 57 6f  ..  vdbeSorterWo
df10: 72 6b 44 65 62 75 67 28 70 54 61 73 6b 2c 20 22  rkDebug(pTask, "
df20: 65 78 69 74 22 29 3b 0a 20 20 61 73 73 65 72 74  exit");.  assert
df30: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
df40: 7c 7c 20 70 4c 69 73 74 2d 3e 70 4c 69 73 74 3d  || pList->pList=
df50: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
df60: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
df70: 20 70 54 61 73 6b 2d 3e 66 69 6c 65 2e 69 45 6f   pTask->file.iEo
df80: 66 3d 3d 69 53 7a 20 29 3b 0a 20 20 72 65 74 75  f==iSz );.  retu
df90: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
dfa0: 41 64 76 61 6e 63 65 20 74 68 65 20 4d 65 72 67  Advance the Merg
dfb0: 65 45 6e 67 69 6e 65 20 74 6f 20 69 74 73 20 6e  eEngine to its n
dfc0: 65 78 74 20 65 6e 74 72 79 2e 0a 2a 2a 20 53 65  ext entry..** Se
dfd0: 74 20 2a 70 62 45 6f 66 20 74 6f 20 74 72 75 65  t *pbEof to true
dfe0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 78   there is no nex
dff0: 74 20 65 6e 74 72 79 20 62 65 63 61 75 73 65 0a  t entry because.
e000: 2a 2a 20 74 68 65 20 4d 65 72 67 65 45 6e 67 69  ** the MergeEngi
e010: 6e 65 20 68 61 73 20 72 65 61 63 68 65 64 20 74  ne has reached t
e020: 68 65 20 65 6e 64 20 6f 66 20 61 6c 6c 20 69 74  he end of all it
e030: 73 20 69 6e 70 75 74 73 2e 0a 2a 2a 0a 2a 2a 20  s inputs..**.** 
e040: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
e050: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f   if successful o
e060: 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
e070: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
e080: 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
e090: 74 20 76 64 62 65 4d 65 72 67 65 45 6e 67 69 6e  t vdbeMergeEngin
e0a0: 65 53 74 65 70 28 0a 20 20 4d 65 72 67 65 45 6e  eStep(.  MergeEn
e0b0: 67 69 6e 65 20 2a 70 4d 65 72 67 65 72 2c 20 20  gine *pMerger,  
e0c0: 20 20 20 20 2f 2a 20 54 68 65 20 6d 65 72 67 65      /* The merge
e0d0: 20 65 6e 67 69 6e 65 20 74 6f 20 61 64 76 61 6e   engine to advan
e0e0: 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72  ce to the next r
e0f0: 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 45  ow */.  int *pbE
e100: 6f 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  of              
e110: 20 20 20 2f 2a 20 53 65 74 20 54 52 55 45 20 61     /* Set TRUE a
e120: 74 20 45 4f 46 2e 20 20 53 65 74 20 66 61 6c 73  t EOF.  Set fals
e130: 65 20 66 6f 72 20 6d 6f 72 65 20 63 6f 6e 74 65  e for more conte
e140: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  nt */.){.  int r
e150: 63 3b 0a 20 20 69 6e 74 20 69 50 72 65 76 20 3d  c;.  int iPrev =
e160: 20 70 4d 65 72 67 65 72 2d 3e 61 54 72 65 65 5b   pMerger->aTree[
e170: 31 5d 3b 2f 2a 20 49 6e 64 65 78 20 6f 66 20 50  1];/* Index of P
e180: 6d 61 52 65 61 64 65 72 20 74 6f 20 61 64 76 61  maReader to adva
e190: 6e 63 65 20 2a 2f 0a 20 20 53 6f 72 74 53 75 62  nce */.  SortSub
e1a0: 74 61 73 6b 20 2a 70 54 61 73 6b 20 3d 20 70 4d  task *pTask = pM
e1b0: 65 72 67 65 72 2d 3e 70 54 61 73 6b 3b 0a 0a 20  erger->pTask;.. 
e1c0: 20 2f 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20   /* Advance the 
e1d0: 63 75 72 72 65 6e 74 20 50 6d 61 52 65 61 64 65  current PmaReade
e1e0: 72 20 2a 2f 0a 20 20 72 63 20 3d 20 76 64 62 65  r */.  rc = vdbe
e1f0: 50 6d 61 52 65 61 64 65 72 4e 65 78 74 28 26 70  PmaReaderNext(&p
e200: 4d 65 72 67 65 72 2d 3e 61 52 65 61 64 72 5b 69  Merger->aReadr[i
e210: 50 72 65 76 5d 29 3b 0a 0a 20 20 2f 2a 20 55 70  Prev]);..  /* Up
e220: 64 61 74 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  date contents of
e230: 20 61 54 72 65 65 5b 5d 20 2a 2f 0a 20 20 69 66   aTree[] */.  if
e240: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
e250: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20  ){.    int i;   
e260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e270: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 61     /* Index of a
e280: 54 72 65 65 5b 5d 20 74 6f 20 72 65 63 61 6c 63  Tree[] to recalc
e290: 75 6c 61 74 65 20 2a 2f 0a 20 20 20 20 50 6d 61  ulate */.    Pma
e2a0: 52 65 61 64 65 72 20 2a 70 52 65 61 64 72 31 3b  Reader *pReadr1;
e2b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
e2c0: 74 20 50 6d 61 52 65 61 64 65 72 20 74 6f 20 63  t PmaReader to c
e2d0: 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 20 20 50 6d  ompare */.    Pm
e2e0: 61 52 65 61 64 65 72 20 2a 70 52 65 61 64 72 32  aReader *pReadr2
e2f0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63  ;         /* Sec
e300: 6f 6e 64 20 50 6d 61 52 65 61 64 65 72 20 74 6f  ond PmaReader to
e310: 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 20 20   compare */.    
e320: 69 6e 74 20 62 43 61 63 68 65 64 20 3d 20 30 3b  int bCached = 0;
e330: 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68  ..    /* Find th
e340: 65 20 66 69 72 73 74 20 74 77 6f 20 50 6d 61 52  e first two PmaR
e350: 65 61 64 65 72 73 20 74 6f 20 63 6f 6d 70 61 72  eaders to compar
e360: 65 2e 20 54 68 65 20 6f 6e 65 20 74 68 61 74 20  e. The one that 
e370: 77 61 73 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20  was just.    ** 
e380: 61 64 76 61 6e 63 65 64 20 28 69 50 72 65 76 29  advanced (iPrev)
e390: 20 61 6e 64 20 74 68 65 20 6f 6e 65 20 6e 65 78   and the one nex
e3a0: 74 20 74 6f 20 69 74 20 69 6e 20 74 68 65 20 61  t to it in the a
e3b0: 72 72 61 79 2e 20 20 2a 2f 0a 20 20 20 20 70 52  rray.  */.    pR
e3c0: 65 61 64 72 31 20 3d 20 26 70 4d 65 72 67 65 72  eadr1 = &pMerger
e3d0: 2d 3e 61 52 65 61 64 72 5b 28 69 50 72 65 76 20  ->aReadr[(iPrev 
e3e0: 26 20 30 78 46 46 46 45 29 5d 3b 0a 20 20 20 20  & 0xFFFE)];.    
e3f0: 70 52 65 61 64 72 32 20 3d 20 26 70 4d 65 72 67  pReadr2 = &pMerg
e400: 65 72 2d 3e 61 52 65 61 64 72 5b 28 69 50 72 65  er->aReadr[(iPre
e410: 76 20 7c 20 30 78 30 30 30 31 29 5d 3b 0a 0a 20  v | 0x0001)];.. 
e420: 20 20 20 66 6f 72 28 69 3d 28 70 4d 65 72 67 65     for(i=(pMerge
e430: 72 2d 3e 6e 54 72 65 65 2b 69 50 72 65 76 29 2f  r->nTree+iPrev)/
e440: 32 3b 20 69 3e 30 3b 20 69 3d 69 2f 32 29 7b 0a  2; i>0; i=i/2){.
e450: 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65        /* Compare
e460: 20 70 52 65 61 64 72 31 20 61 6e 64 20 70 52 65   pReadr1 and pRe
e470: 61 64 72 32 2e 20 53 74 6f 72 65 20 74 68 65 20  adr2. Store the 
e480: 72 65 73 75 6c 74 20 69 6e 20 76 61 72 69 61 62  result in variab
e490: 6c 65 20 69 52 65 73 2e 20 2a 2f 0a 20 20 20 20  le iRes. */.    
e4a0: 20 20 69 6e 74 20 69 52 65 73 3b 0a 20 20 20 20    int iRes;.    
e4b0: 20 20 69 66 28 20 70 52 65 61 64 72 31 2d 3e 70    if( pReadr1->p
e4c0: 46 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Fd==0 ){.       
e4d0: 20 69 52 65 73 20 3d 20 2b 31 3b 0a 20 20 20 20   iRes = +1;.    
e4e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 65 61    }else if( pRea
e4f0: 64 72 32 2d 3e 70 46 64 3d 3d 30 20 29 7b 0a 20  dr2->pFd==0 ){. 
e500: 20 20 20 20 20 20 20 69 52 65 73 20 3d 20 2d 31         iRes = -1
e510: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e520: 20 20 20 20 20 20 20 69 52 65 73 20 3d 20 70 54         iRes = pT
e530: 61 73 6b 2d 3e 78 43 6f 6d 70 61 72 65 28 70 54  ask->xCompare(pT
e540: 61 73 6b 2c 20 26 62 43 61 63 68 65 64 2c 0a 20  ask, &bCached,. 
e550: 20 20 20 20 20 20 20 20 20 20 20 70 52 65 61 64             pRead
e560: 72 31 2d 3e 61 4b 65 79 2c 20 70 52 65 61 64 72  r1->aKey, pReadr
e570: 31 2d 3e 6e 4b 65 79 2c 20 70 52 65 61 64 72 32  1->nKey, pReadr2
e580: 2d 3e 61 4b 65 79 2c 20 70 52 65 61 64 72 32 2d  ->aKey, pReadr2-
e590: 3e 6e 4b 65 79 0a 20 20 20 20 20 20 20 20 29 3b  >nKey.        );
e5a0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
e5b0: 2f 2a 20 49 66 20 70 52 65 61 64 72 31 20 63 6f  /* If pReadr1 co
e5c0: 6e 74 61 69 6e 65 64 20 74 68 65 20 73 6d 61 6c  ntained the smal
e5d0: 6c 65 72 20 76 61 6c 75 65 2c 20 73 65 74 20 61  ler value, set a
e5e0: 54 72 65 65 5b 69 5d 20 74 6f 20 69 74 73 20 69  Tree[i] to its i
e5f0: 6e 64 65 78 2e 0a 20 20 20 20 20 20 2a 2a 20 54  ndex..      ** T
e600: 68 65 6e 20 73 65 74 20 70 52 65 61 64 72 32 20  hen set pReadr2 
e610: 74 6f 20 74 68 65 20 6e 65 78 74 20 50 6d 61 52  to the next PmaR
e620: 65 61 64 65 72 20 74 6f 20 63 6f 6d 70 61 72 65  eader to compare
e630: 20 74 6f 20 70 52 65 61 64 72 31 2e 20 49 6e 20   to pReadr1. In 
e640: 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61  this.      ** ca
e650: 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63  se there is no c
e660: 61 63 68 65 20 6f 66 20 70 52 65 61 64 72 32 20  ache of pReadr2 
e670: 69 6e 20 70 54 61 73 6b 2d 3e 70 55 6e 70 61 63  in pTask->pUnpac
e680: 6b 65 64 2c 20 73 6f 20 73 65 74 0a 20 20 20 20  ked, so set.    
e690: 20 20 2a 2a 20 70 4b 65 79 32 20 74 6f 20 70 6f    ** pKey2 to po
e6a0: 69 6e 74 20 74 6f 20 74 68 65 20 72 65 63 6f 72  int to the recor
e6b0: 64 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 70  d belonging to p
e6c0: 52 65 61 64 72 32 2e 0a 20 20 20 20 20 20 2a 2a  Readr2..      **
e6d0: 0a 20 20 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e  .      ** Altern
e6e0: 61 74 69 76 65 6c 79 2c 20 69 66 20 70 52 65 61  atively, if pRea
e6f0: 64 72 32 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  dr2 contains the
e700: 20 73 6d 61 6c 6c 65 72 20 6f 66 20 74 68 65 20   smaller of the 
e710: 74 77 6f 20 76 61 6c 75 65 73 2c 0a 20 20 20 20  two values,.    
e720: 20 20 2a 2a 20 73 65 74 20 61 54 72 65 65 5b 69    ** set aTree[i
e730: 5d 20 74 6f 20 69 74 73 20 69 6e 64 65 78 20 61  ] to its index a
e740: 6e 64 20 75 70 64 61 74 65 20 70 52 65 61 64 72  nd update pReadr
e750: 31 2e 20 49 66 20 76 64 62 65 53 6f 72 74 65 72  1. If vdbeSorter
e760: 43 6f 6d 70 61 72 65 28 29 0a 20 20 20 20 20 20  Compare().      
e770: 2a 2a 20 77 61 73 20 61 63 74 75 61 6c 6c 79 20  ** was actually 
e780: 63 61 6c 6c 65 64 20 61 62 6f 76 65 2c 20 74 68  called above, th
e790: 65 6e 20 70 54 61 73 6b 2d 3e 70 55 6e 70 61 63  en pTask->pUnpac
e7a0: 6b 65 64 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73  ked now contains
e7b0: 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 75  .      ** a valu
e7c0: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  e equivalent to 
e7d0: 70 52 65 61 64 72 32 2e 20 53 6f 20 73 65 74 20  pReadr2. So set 
e7e0: 70 4b 65 79 32 20 74 6f 20 4e 55 4c 4c 20 74 6f  pKey2 to NULL to
e7f0: 20 70 72 65 76 65 6e 74 0a 20 20 20 20 20 20 2a   prevent.      *
e800: 2a 20 76 64 62 65 53 6f 72 74 65 72 43 6f 6d 70  * vdbeSorterComp
e810: 61 72 65 28 29 20 66 72 6f 6d 20 64 65 63 6f 64  are() from decod
e820: 69 6e 67 20 70 52 65 61 64 72 32 20 61 67 61 69  ing pReadr2 agai
e830: 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  n..      **.    
e840: 20 20 2a 2a 20 49 66 20 74 68 65 20 74 77 6f 20    ** If the two 
e850: 76 61 6c 75 65 73 20 77 65 72 65 20 65 71 75 61  values were equa
e860: 6c 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  l, then the valu
e870: 65 20 66 72 6f 6d 20 74 68 65 20 6f 6c 64 65 73  e from the oldes
e880: 74 0a 20 20 20 20 20 20 2a 2a 20 50 4d 41 20 73  t.      ** PMA s
e890: 68 6f 75 6c 64 20 62 65 20 63 6f 6e 73 69 64 65  hould be conside
e8a0: 72 65 64 20 73 6d 61 6c 6c 65 72 2e 20 54 68 65  red smaller. The
e8b0: 20 56 64 62 65 53 6f 72 74 65 72 2e 61 52 65 61   VdbeSorter.aRea
e8c0: 64 72 5b 5d 20 61 72 72 61 79 0a 20 20 20 20 20  dr[] array.     
e8d0: 20 2a 2a 20 69 73 20 73 6f 72 74 65 64 20 66 72   ** is sorted fr
e8e0: 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77  om oldest to new
e8f0: 65 73 74 2c 20 73 6f 20 70 52 65 61 64 72 31 20  est, so pReadr1 
e900: 63 6f 6e 74 61 69 6e 73 20 6f 6c 64 65 72 20 76  contains older v
e910: 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 74  alues.      ** t
e920: 68 61 6e 20 70 52 65 61 64 72 32 20 69 66 66 20  han pReadr2 iff 
e930: 28 70 52 65 61 64 72 31 3c 70 52 65 61 64 72 32  (pReadr1<pReadr2
e940: 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ).  */.      if(
e950: 20 69 52 65 73 3c 30 20 7c 7c 20 28 69 52 65 73   iRes<0 || (iRes
e960: 3d 3d 30 20 26 26 20 70 52 65 61 64 72 31 3c 70  ==0 && pReadr1<p
e970: 52 65 61 64 72 32 29 20 29 7b 0a 20 20 20 20 20  Readr2) ){.     
e980: 20 20 20 70 4d 65 72 67 65 72 2d 3e 61 54 72 65     pMerger->aTre
e990: 65 5b 69 5d 20 3d 20 28 69 6e 74 29 28 70 52 65  e[i] = (int)(pRe
e9a0: 61 64 72 31 20 2d 20 70 4d 65 72 67 65 72 2d 3e  adr1 - pMerger->
e9b0: 61 52 65 61 64 72 29 3b 0a 20 20 20 20 20 20 20  aReadr);.       
e9c0: 20 70 52 65 61 64 72 32 20 3d 20 26 70 4d 65 72   pReadr2 = &pMer
e9d0: 67 65 72 2d 3e 61 52 65 61 64 72 5b 20 70 4d 65  ger->aReadr[ pMe
e9e0: 72 67 65 72 2d 3e 61 54 72 65 65 5b 69 20 5e 20  rger->aTree[i ^ 
e9f0: 30 78 30 30 30 31 5d 20 5d 3b 0a 20 20 20 20 20  0x0001] ];.     
ea00: 20 20 20 62 43 61 63 68 65 64 20 3d 20 30 3b 0a     bCached = 0;.
ea10: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ea20: 20 20 20 20 20 69 66 28 20 70 52 65 61 64 72 31       if( pReadr1
ea30: 2d 3e 70 46 64 20 29 20 62 43 61 63 68 65 64 20  ->pFd ) bCached 
ea40: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  = 0;.        pMe
ea50: 72 67 65 72 2d 3e 61 54 72 65 65 5b 69 5d 20 3d  rger->aTree[i] =
ea60: 20 28 69 6e 74 29 28 70 52 65 61 64 72 32 20 2d   (int)(pReadr2 -
ea70: 20 70 4d 65 72 67 65 72 2d 3e 61 52 65 61 64 72   pMerger->aReadr
ea80: 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 61 64  );.        pRead
ea90: 72 31 20 3d 20 26 70 4d 65 72 67 65 72 2d 3e 61  r1 = &pMerger->a
eaa0: 52 65 61 64 72 5b 20 70 4d 65 72 67 65 72 2d 3e  Readr[ pMerger->
eab0: 61 54 72 65 65 5b 69 20 5e 20 30 78 30 30 30 31  aTree[i ^ 0x0001
eac0: 5d 20 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ] ];.      }.   
ead0: 20 7d 0a 20 20 20 20 2a 70 62 45 6f 66 20 3d 20   }.    *pbEof = 
eae0: 28 70 4d 65 72 67 65 72 2d 3e 61 52 65 61 64 72  (pMerger->aReadr
eaf0: 5b 70 4d 65 72 67 65 72 2d 3e 61 54 72 65 65 5b  [pMerger->aTree[
eb00: 31 5d 5d 2e 70 46 64 3d 3d 30 29 3b 0a 20 20 7d  1]].pFd==0);.  }
eb10: 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
eb20: 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 70 54 61 73  SQLITE_OK ? pTas
eb30: 6b 2d 3e 70 55 6e 70 61 63 6b 65 64 2d 3e 65 72  k->pUnpacked->er
eb40: 72 43 6f 64 65 20 3a 20 72 63 29 3b 0a 7d 0a 0a  rCode : rc);.}..
eb50: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57  #if SQLITE_MAX_W
eb60: 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3e 30 0a  ORKER_THREADS>0.
eb70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 72  /*.** The main r
eb80: 6f 75 74 69 6e 65 20 66 6f 72 20 62 61 63 6b 67  outine for backg
eb90: 72 6f 75 6e 64 20 74 68 72 65 61 64 73 20 74 68  round threads th
eba0: 61 74 20 77 72 69 74 65 20 6c 65 76 65 6c 2d 30  at write level-0
ebb0: 20 50 4d 41 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   PMAs..*/.static
ebc0: 20 76 6f 69 64 20 2a 76 64 62 65 53 6f 72 74 65   void *vdbeSorte
ebd0: 72 46 6c 75 73 68 54 68 72 65 61 64 28 76 6f 69  rFlushThread(voi
ebe0: 64 20 2a 70 43 74 78 29 7b 0a 20 20 53 6f 72 74  d *pCtx){.  Sort
ebf0: 53 75 62 74 61 73 6b 20 2a 70 54 61 73 6b 20 3d  Subtask *pTask =
ec00: 20 28 53 6f 72 74 53 75 62 74 61 73 6b 2a 29 70   (SortSubtask*)p
ec10: 43 74 78 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Ctx;.  int rc;  
ec20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec30: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
ec40: 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72   code */.  asser
ec50: 74 28 20 70 54 61 73 6b 2d 3e 62 44 6f 6e 65 3d  t( pTask->bDone=
ec60: 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 76 64 62  =0 );.  rc = vdb
ec70: 65 53 6f 72 74 65 72 4c 69 73 74 54 6f 50 4d 41  eSorterListToPMA
ec80: 28 70 54 61 73 6b 2c 20 26 70 54 61 73 6b 2d 3e  (pTask, &pTask->
ec90: 6c 69 73 74 29 3b 0a 20 20 70 54 61 73 6b 2d 3e  list);.  pTask->
eca0: 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 72 65 74  bDone = 1;.  ret
ecb0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54  urn SQLITE_INT_T
ecc0: 4f 5f 50 54 52 28 72 63 29 3b 0a 7d 0a 23 65 6e  O_PTR(rc);.}.#en
ecd0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41  dif /* SQLITE_MA
ece0: 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  X_WORKER_THREADS
ecf0: 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75  >0 */../*.** Flu
ed00: 73 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  sh the current c
ed10: 6f 6e 74 65 6e 74 73 20 6f 66 20 56 64 62 65 53  ontents of VdbeS
ed20: 6f 72 74 65 72 2e 6c 69 73 74 20 74 6f 20 61 20  orter.list to a 
ed30: 6e 65 77 20 50 4d 41 2c 20 70 6f 73 73 69 62 6c  new PMA, possibl
ed40: 79 0a 2a 2a 20 75 73 69 6e 67 20 61 20 62 61 63  y.** using a bac
ed50: 6b 67 72 6f 75 6e 64 20 74 68 72 65 61 64 2e 0a  kground thread..
ed60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
ed70: 62 65 53 6f 72 74 65 72 46 6c 75 73 68 50 4d 41  beSorterFlushPMA
ed80: 28 56 64 62 65 53 6f 72 74 65 72 20 2a 70 53 6f  (VdbeSorter *pSo
ed90: 72 74 65 72 29 7b 0a 23 69 66 20 53 51 4c 49 54  rter){.#if SQLIT
eda0: 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
edb0: 45 41 44 53 3d 3d 30 0a 20 20 70 53 6f 72 74 65  EADS==0.  pSorte
edc0: 72 2d 3e 62 55 73 65 50 4d 41 20 3d 20 31 3b 0a  r->bUsePMA = 1;.
edd0: 20 20 72 65 74 75 72 6e 20 76 64 62 65 53 6f 72    return vdbeSor
ede0: 74 65 72 4c 69 73 74 54 6f 50 4d 41 28 26 70 53  terListToPMA(&pS
edf0: 6f 72 74 65 72 2d 3e 61 54 61 73 6b 5b 30 5d 2c  orter->aTask[0],
ee00: 20 26 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74 29   &pSorter->list)
ee10: 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63  ;.#else.  int rc
ee20: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
ee30: 69 6e 74 20 69 3b 0a 20 20 53 6f 72 74 53 75 62  int i;.  SortSub
ee40: 74 61 73 6b 20 2a 70 54 61 73 6b 20 3d 20 30 3b  task *pTask = 0;
ee50: 20 20 20 20 2f 2a 20 54 68 72 65 61 64 20 63 6f      /* Thread co
ee60: 6e 74 65 78 74 20 75 73 65 64 20 74 6f 20 63 72  ntext used to cr
ee70: 65 61 74 65 20 6e 65 77 20 50 4d 41 20 2a 2f 0a  eate new PMA */.
ee80: 20 20 69 6e 74 20 6e 57 6f 72 6b 65 72 20 3d 20    int nWorker = 
ee90: 28 70 53 6f 72 74 65 72 2d 3e 6e 54 61 73 6b 2d  (pSorter->nTask-
eea0: 31 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  1);..  /* Set th
eeb0: 65 20 66 6c 61 67 20 74 6f 20 69 6e 64 69 63 61  e flag to indica
eec0: 74 65 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  te that at least
eed0: 20 6f 6e 65 20 50 4d 41 20 68 61 73 20 62 65 65   one PMA has bee
eee0: 6e 20 77 72 69 74 74 65 6e 2e 20 0a 20 20 2a 2a  n written. .  **
eef0: 20 4f 72 20 77 69 6c 6c 20 62 65 2c 20 61 6e 79   Or will be, any
ef00: 68 6f 77 2e 20 20 2a 2f 0a 20 20 70 53 6f 72 74  how.  */.  pSort
ef10: 65 72 2d 3e 62 55 73 65 50 4d 41 20 3d 20 31 3b  er->bUsePMA = 1;
ef20: 0a 0a 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20  ..  /* Select a 
ef30: 73 75 62 2d 74 61 73 6b 20 74 6f 20 73 6f 72 74  sub-task to sort
ef40: 20 61 6e 64 20 66 6c 75 73 68 20 74 68 65 20 63   and flush the c
ef50: 75 72 72 65 6e 74 20 6c 69 73 74 20 6f 66 20 69  urrent list of i
ef60: 6e 2d 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65  n-memory.  ** re
ef70: 63 6f 72 64 73 20 74 6f 20 64 69 73 6b 2e 20 49  cords to disk. I
ef80: 66 20 74 68 65 20 73 6f 72 74 65 72 20 69 73 20  f the sorter is 
ef90: 72 75 6e 6e 69 6e 67 20 69 6e 20 6d 75 6c 74 69  running in multi
efa0: 2d 74 68 72 65 61 64 65 64 20 6d 6f 64 65 2c 0a  -threaded mode,.
efb0: 20 20 2a 2a 20 72 6f 75 6e 64 2d 72 6f 62 69 6e    ** round-robin
efc0: 20 62 65 74 77 65 65 6e 20 74 68 65 20 66 69 72   between the fir
efd0: 73 74 20 28 70 53 6f 72 74 65 72 2d 3e 6e 54 61  st (pSorter->nTa
efe0: 73 6b 2d 31 29 20 74 61 73 6b 73 2e 20 45 78 63  sk-1) tasks. Exc
eff0: 65 70 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65  ept, if.  ** the
f000: 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72 65   background thre
f010: 61 64 20 66 72 6f 6d 20 61 20 73 75 62 2d 74 61  ad from a sub-ta
f020: 73 6b 73 20 70 72 65 76 69 6f 75 73 20 74 75 72  sks previous tur
f030: 6e 20 69 73 20 73 74 69 6c 6c 20 72 75 6e 6e 69  n is still runni
f040: 6e 67 2c 0a 20 20 2a 2a 20 73 6b 69 70 20 69 74  ng,.  ** skip it
f050: 2e 20 49 66 20 74 68 65 20 66 69 72 73 74 20 28  . If the first (
f060: 70 53 6f 72 74 65 72 2d 3e 6e 54 61 73 6b 2d 31  pSorter->nTask-1
f070: 29 20 73 75 62 2d 74 61 73 6b 73 20 61 72 65 20  ) sub-tasks are 
f080: 61 6c 6c 20 73 74 69 6c 6c 20 62 75 73 79 2c 0a  all still busy,.
f090: 20 20 2a 2a 20 66 61 6c 6c 20 62 61 63 6b 20 74    ** fall back t
f0a0: 6f 20 75 73 69 6e 67 20 74 68 65 20 66 69 6e 61  o using the fina
f0b0: 6c 20 73 75 62 2d 74 61 73 6b 2e 20 54 68 65 20  l sub-task. The 
f0c0: 66 69 72 73 74 20 28 70 53 6f 72 74 65 72 2d 3e  first (pSorter->
f0d0: 6e 54 61 73 6b 2d 31 29 0a 20 20 2a 2a 20 73 75  nTask-1).  ** su
f0e0: 62 2d 74 61 73 6b 73 20 61 72 65 20 70 72 65 66  b-tasks are pref
f0f0: 65 72 65 64 20 61 73 20 74 68 65 79 20 75 73 65  ered as they use
f100: 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72 65   background thre
f110: 61 64 73 20 2d 20 74 68 65 20 66 69 6e 61 6c 20  ads - the final 
f120: 0a 20 20 2a 2a 20 73 75 62 2d 74 61 73 6b 20 75  .  ** sub-task u
f130: 73 65 73 20 74 68 65 20 6d 61 69 6e 20 74 68 72  ses the main thr
f140: 65 61 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ead. */.  for(i=
f150: 30 3b 20 69 3c 6e 57 6f 72 6b 65 72 3b 20 69 2b  0; i<nWorker; i+
f160: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 54 65 73  +){.    int iTes
f170: 74 20 3d 20 28 70 53 6f 72 74 65 72 2d 3e 69 50  t = (pSorter->iP
f180: 72 65 76 20 2b 20 69 20 2b 20 31 29 20 25 20 6e  rev + i + 1) % n
f190: 57 6f 72 6b 65 72 3b 0a 20 20 20 20 70 54 61 73  Worker;.    pTas
f1a0: 6b 20 3d 20 26 70 53 6f 72 74 65 72 2d 3e 61 54  k = &pSorter->aT
f1b0: 61 73 6b 5b 69 54 65 73 74 5d 3b 0a 20 20 20 20  ask[iTest];.    
f1c0: 69 66 28 20 70 54 61 73 6b 2d 3e 62 44 6f 6e 65  if( pTask->bDone
f1d0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 76   ){.      rc = v
f1e0: 64 62 65 53 6f 72 74 65 72 4a 6f 69 6e 54 68 72  dbeSorterJoinThr
f1f0: 65 61 64 28 70 54 61 73 6b 29 3b 0a 20 20 20 20  ead(pTask);.    
f200: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
f210: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 54 61 73 6b  LITE_OK || pTask
f220: 2d 3e 70 54 68 72 65 61 64 3d 3d 30 20 29 20 62  ->pThread==0 ) b
f230: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  reak;.  }..  if(
f240: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
f250: 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 57 6f  {.    if( i==nWo
f260: 72 6b 65 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a  rker ){.      /*
f270: 20 55 73 65 20 74 68 65 20 66 6f 72 65 67 72 6f   Use the foregro
f280: 75 6e 64 20 74 68 72 65 61 64 20 66 6f 72 20 74  und thread for t
f290: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  his operation */
f2a0: 0a 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65  .      rc = vdbe
f2b0: 53 6f 72 74 65 72 4c 69 73 74 54 6f 50 4d 41 28  SorterListToPMA(
f2c0: 26 70 53 6f 72 74 65 72 2d 3e 61 54 61 73 6b 5b  &pSorter->aTask[
f2d0: 6e 57 6f 72 6b 65 72 5d 2c 20 26 70 53 6f 72 74  nWorker], &pSort
f2e0: 65 72 2d 3e 6c 69 73 74 29 3b 0a 20 20 20 20 7d  er->list);.    }
f2f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4c  else{.      /* L
f300: 61 75 6e 63 68 20 61 20 62 61 63 6b 67 72 6f 75  aunch a backgrou
f310: 6e 64 20 74 68 72 65 61 64 20 66 6f 72 20 74 68  nd thread for th
f320: 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  is operation */.
f330: 20 20 20 20 20 20 75 38 20 2a 61 4d 65 6d 20 3d        u8 *aMem =
f340: 20 70 54 61 73 6b 2d 3e 6c 69 73 74 2e 61 4d 65   pTask->list.aMe
f350: 6d 6f 72 79 3b 0a 20 20 20 20 20 20 76 6f 69 64  mory;.      void
f360: 20 2a 70 43 74 78 20 3d 20 28 76 6f 69 64 2a 29   *pCtx = (void*)
f370: 70 54 61 73 6b 3b 0a 0a 20 20 20 20 20 20 61 73  pTask;..      as
f380: 73 65 72 74 28 20 70 54 61 73 6b 2d 3e 70 54 68  sert( pTask->pTh
f390: 72 65 61 64 3d 3d 30 20 26 26 20 70 54 61 73 6b  read==0 && pTask
f3a0: 2d 3e 62 44 6f 6e 65 3d 3d 30 20 29 3b 0a 20 20  ->bDone==0 );.  
f3b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 73      assert( pTas
f3c0: 6b 2d 3e 6c 69 73 74 2e 70 4c 69 73 74 3d 3d 30  k->list.pList==0
f3d0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
f3e0: 28 20 70 54 61 73 6b 2d 3e 6c 69 73 74 2e 61 4d  ( pTask->list.aM
f3f0: 65 6d 6f 72 79 3d 3d 30 20 7c 7c 20 70 53 6f 72  emory==0 || pSor
f400: 74 65 72 2d 3e 6c 69 73 74 2e 61 4d 65 6d 6f 72  ter->list.aMemor
f410: 79 21 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 70  y!=0 );..      p
f420: 53 6f 72 74 65 72 2d 3e 69 50 72 65 76 20 3d 20  Sorter->iPrev = 
f430: 28 75 38 29 28 70 54 61 73 6b 20 2d 20 70 53 6f  (u8)(pTask - pSo
f440: 72 74 65 72 2d 3e 61 54 61 73 6b 29 3b 0a 20 20  rter->aTask);.  
f450: 20 20 20 20 70 54 61 73 6b 2d 3e 6c 69 73 74 20      pTask->list 
f460: 3d 20 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74 3b  = pSorter->list;
f470: 0a 20 20 20 20 20 20 70 53 6f 72 74 65 72 2d 3e  .      pSorter->
f480: 6c 69 73 74 2e 70 4c 69 73 74 20 3d 20 30 3b 0a  list.pList = 0;.
f490: 20 20 20 20 20 20 70 53 6f 72 74 65 72 2d 3e 6c        pSorter->l
f4a0: 69 73 74 2e 73 7a 50 4d 41 20 3d 20 30 3b 0a 20  ist.szPMA = 0;. 
f4b0: 20 20 20 20 20 69 66 28 20 61 4d 65 6d 20 29 7b       if( aMem ){
f4c0: 0a 20 20 20 20 20 20 20 20 70 53 6f 72 74 65 72  .        pSorter
f4d0: 2d 3e 6c 69 73 74 2e 61 4d 65 6d 6f 72 79 20 3d  ->list.aMemory =
f4e0: 20 61 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 70   aMem;.        p
f4f0: 53 6f 72 74 65 72 2d 3e 6e 4d 65 6d 6f 72 79 20  Sorter->nMemory 
f500: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53  = sqlite3MallocS
f510: 69 7a 65 28 61 4d 65 6d 29 3b 0a 20 20 20 20 20  ize(aMem);.     
f520: 20 7d 65 6c 73 65 20 69 66 28 20 70 53 6f 72 74   }else if( pSort
f530: 65 72 2d 3e 6c 69 73 74 2e 61 4d 65 6d 6f 72 79  er->list.aMemory
f540: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 6f 72   ){.        pSor
f550: 74 65 72 2d 3e 6c 69 73 74 2e 61 4d 65 6d 6f 72  ter->list.aMemor
f560: 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  y = sqlite3Mallo
f570: 63 28 70 53 6f 72 74 65 72 2d 3e 6e 4d 65 6d 6f  c(pSorter->nMemo
f580: 72 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ry);.        if(
f590: 20 21 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74 2e   !pSorter->list.
f5a0: 61 4d 65 6d 6f 72 79 20 29 20 72 65 74 75 72 6e  aMemory ) return
f5b0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
f5c0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63       }..      rc
f5d0: 20 3d 20 76 64 62 65 53 6f 72 74 65 72 43 72 65   = vdbeSorterCre
f5e0: 61 74 65 54 68 72 65 61 64 28 70 54 61 73 6b 2c  ateThread(pTask,
f5f0: 20 76 64 62 65 53 6f 72 74 65 72 46 6c 75 73 68   vdbeSorterFlush
f600: 54 68 72 65 61 64 2c 20 70 43 74 78 29 3b 0a 20  Thread, pCtx);. 
f610: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
f620: 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 20 2f 2a  rn rc;.#endif /*
f630: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b   SQLITE_MAX_WORK
f640: 45 52 5f 54 48 52 45 41 44 53 21 3d 30 20 2a 2f  ER_THREADS!=0 */
f650: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
f660: 72 65 63 6f 72 64 20 74 6f 20 74 68 65 20 73 6f  record to the so
f670: 72 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rter..*/.int sql
f680: 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 57 72  ite3VdbeSorterWr
f690: 69 74 65 28 0a 20 20 63 6f 6e 73 74 20 56 64 62  ite(.  const Vdb
f6a0: 65 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 20  eCursor *pCsr,  
f6b0: 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65 72         /* Sorter
f6c0: 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 4d 65 6d   cursor */.  Mem
f6d0: 20 2a 70 56 61 6c 20 20 20 20 20 20 20 20 20 20   *pVal          
f6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f6f0: 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 63 6f 6e 74  Memory cell cont
f700: 61 69 6e 69 6e 67 20 72 65 63 6f 72 64 20 2a 2f  aining record */
f710: 0a 29 7b 0a 20 20 56 64 62 65 53 6f 72 74 65 72  .){.  VdbeSorter
f720: 20 2a 70 53 6f 72 74 65 72 3b 0a 20 20 69 6e 74   *pSorter;.  int
f730: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
f740: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f750: 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
f760: 20 53 6f 72 74 65 72 52 65 63 6f 72 64 20 2a 70   SorterRecord *p
f770: 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
f780: 20 2f 2a 20 4e 65 77 20 6c 69 73 74 20 65 6c 65   /* New list ele
f790: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 62 46  ment */.  int bF
f7a0: 6c 75 73 68 3b 20 20 20 20 20 20 20 20 20 20 20  lush;           
f7b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
f7c0: 65 20 74 6f 20 66 6c 75 73 68 20 63 6f 6e 74 65  e to flush conte
f7d0: 6e 74 73 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f  nts of memory to
f7e0: 20 50 4d 41 20 2a 2f 0a 20 20 69 6e 74 20 6e 52   PMA */.  int nR
f7f0: 65 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eq;             
f800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
f810: 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 71  es of memory req
f820: 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  uired */.  int n
f830: 50 4d 41 3b 20 20 20 20 20 20 20 20 20 20 20 20  PMA;            
f840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
f850: 74 65 73 20 6f 66 20 50 4d 41 20 73 70 61 63 65  tes of PMA space
f860: 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69   required */.  i
f870: 6e 74 20 74 3b 20 20 20 20 20 20 20 20 20 20 20  nt t;           
f880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f890: 2a 20 73 65 72 69 61 6c 20 74 79 70 65 20 6f 66  * serial type of
f8a0: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 66 69   first record fi
f8b0: 65 6c 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  eld */..  assert
f8c0: 28 20 70 43 73 72 2d 3e 65 43 75 72 54 79 70 65  ( pCsr->eCurType
f8d0: 3d 3d 43 55 52 54 59 50 45 5f 53 4f 52 54 45 52  ==CURTYPE_SORTER
f8e0: 20 29 3b 0a 20 20 70 53 6f 72 74 65 72 20 3d 20   );.  pSorter = 
f8f0: 70 43 73 72 2d 3e 75 63 2e 70 53 6f 72 74 65 72  pCsr->uc.pSorter
f900: 3b 0a 20 20 67 65 74 56 61 72 69 6e 74 33 32 28  ;.  getVarint32(
f910: 28 63 6f 6e 73 74 20 75 38 2a 29 26 70 56 61 6c  (const u8*)&pVal
f920: 2d 3e 7a 5b 31 5d 2c 20 74 29 3b 0a 20 20 69 66  ->z[1], t);.  if
f930: 28 20 74 3e 30 20 26 26 20 74 3c 31 30 20 26 26  ( t>0 && t<10 &&
f940: 20 74 21 3d 37 20 29 7b 0a 20 20 20 20 70 53 6f   t!=7 ){.    pSo
f950: 72 74 65 72 2d 3e 74 79 70 65 4d 61 73 6b 20 26  rter->typeMask &
f960: 3d 20 53 4f 52 54 45 52 5f 54 59 50 45 5f 49 4e  = SORTER_TYPE_IN
f970: 54 45 47 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69  TEGER;.  }else i
f980: 66 28 20 74 3e 31 30 20 26 26 20 28 74 20 26 20  f( t>10 && (t & 
f990: 30 78 30 31 29 20 29 7b 0a 20 20 20 20 70 53 6f  0x01) ){.    pSo
f9a0: 72 74 65 72 2d 3e 74 79 70 65 4d 61 73 6b 20 26  rter->typeMask &
f9b0: 3d 20 53 4f 52 54 45 52 5f 54 59 50 45 5f 54 45  = SORTER_TYPE_TE
f9c0: 58 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  XT;.  }else{.   
f9d0: 20 70 53 6f 72 74 65 72 2d 3e 74 79 70 65 4d 61   pSorter->typeMa
f9e0: 73 6b 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 61  sk = 0;.  }..  a
f9f0: 73 73 65 72 74 28 20 70 53 6f 72 74 65 72 20 29  ssert( pSorter )
fa00: 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
fa10: 75 74 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ut whether or no
fa20: 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  t the current co
fa30: 6e 74 65 6e 74 73 20 6f 66 20 6d 65 6d 6f 72 79  ntents of memory
fa40: 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 2a 2a 20   should be.  ** 
fa50: 66 6c 75 73 68 65 64 20 74 6f 20 61 20 50 4d 41  flushed to a PMA
fa60: 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69   before continui
fa70: 6e 67 2e 20 49 66 20 73 6f 2c 20 64 6f 20 73 6f  ng. If so, do so
fa80: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 75  ..  **.  ** If u
fa90: 73 69 6e 67 20 74 68 65 20 73 69 6e 67 6c 65 20  sing the single 
faa0: 6c 61 72 67 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  large allocation
fab0: 20 6d 6f 64 65 20 28 70 53 6f 72 74 65 72 2d 3e   mode (pSorter->
fac0: 61 4d 65 6d 6f 72 79 21 3d 30 29 2c 20 74 68 65  aMemory!=0), the
fad0: 6e 0a 20 20 2a 2a 20 66 6c 75 73 68 20 74 68 65  n.  ** flush the
fae0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 65 6d   contents of mem
faf0: 6f 72 79 20 74 6f 20 61 20 6e 65 77 20 50 4d 41  ory to a new PMA
fb00: 20 69 66 20 28 61 29 20 61 74 20 6c 65 61 73 74   if (a) at least
fb10: 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 0a 20 20   one value is.  
fb20: 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 6d 65  ** already in me
fb30: 6d 6f 72 79 20 61 6e 64 20 28 62 29 20 74 68 65  mory and (b) the
fb40: 20 6e 65 77 20 76 61 6c 75 65 20 77 69 6c 6c 20   new value will 
fb50: 6e 6f 74 20 66 69 74 20 69 6e 20 6d 65 6d 6f 72  not fit in memor
fb60: 79 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f 72  y..  ** .  ** Or
fb70: 2c 20 69 66 20 75 73 69 6e 67 20 73 65 70 61 72  , if using separ
fb80: 61 74 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  ate allocations 
fb90: 66 6f 72 20 65 61 63 68 20 72 65 63 6f 72 64 2c  for each record,
fba0: 20 66 6c 75 73 68 20 74 68 65 20 63 6f 6e 74 65   flush the conte
fbb0: 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 6d 65 6d 6f  nts.  ** of memo
fbc0: 72 79 20 74 6f 20 61 20 50 4d 41 20 69 66 20 65  ry to a PMA if e
fbd0: 69 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f 6c  ither of the fol
fbe0: 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
fbf0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 54  .  **.  **   * T
fc00: 68 65 20 74 6f 74 61 6c 20 6d 65 6d 6f 72 79 20  he total memory 
fc10: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
fc20: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6c 69 73 74  e in-memory list
fc30: 20 69 73 20 67 72 65 61 74 65 72 20 0a 20 20 2a   is greater .  *
fc40: 2a 20 20 20 20 20 74 68 61 6e 20 28 70 61 67 65  *     than (page
fc50: 2d 73 69 7a 65 20 2a 20 63 61 63 68 65 2d 73 69  -size * cache-si
fc60: 7a 65 29 2c 20 6f 72 0a 20 20 2a 2a 0a 20 20 2a  ze), or.  **.  *
fc70: 2a 20 20 20 2a 20 54 68 65 20 74 6f 74 61 6c 20  *   * The total 
fc80: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64  memory allocated
fc90: 20 66 6f 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f   for the in-memo
fca0: 72 79 20 6c 69 73 74 20 69 73 20 67 72 65 61 74  ry list is great
fcb0: 65 72 20 0a 20 20 2a 2a 20 20 20 20 20 74 68 61  er .  **     tha
fcc0: 6e 20 28 70 61 67 65 2d 73 69 7a 65 20 2a 20 31  n (page-size * 1
fcd0: 30 29 20 61 6e 64 20 73 71 6c 69 74 65 33 48 65  0) and sqlite3He
fce0: 61 70 4e 65 61 72 6c 79 46 75 6c 6c 28 29 20 72  apNearlyFull() r
fcf0: 65 74 75 72 6e 73 20 74 72 75 65 2e 0a 20 20 2a  eturns true..  *
fd00: 2f 0a 20 20 6e 52 65 71 20 3d 20 70 56 61 6c 2d  /.  nReq = pVal-
fd10: 3e 6e 20 2b 20 73 69 7a 65 6f 66 28 53 6f 72 74  >n + sizeof(Sort
fd20: 65 72 52 65 63 6f 72 64 29 3b 0a 20 20 6e 50 4d  erRecord);.  nPM
fd30: 41 20 3d 20 70 56 61 6c 2d 3e 6e 20 2b 20 73 71  A = pVal->n + sq
fd40: 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 70  lite3VarintLen(p
fd50: 56 61 6c 2d 3e 6e 29 3b 0a 20 20 69 66 28 20 70  Val->n);.  if( p
fd60: 53 6f 72 74 65 72 2d 3e 6d 78 50 6d 61 53 69 7a  Sorter->mxPmaSiz
fd70: 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 6f  e ){.    if( pSo
fd80: 72 74 65 72 2d 3e 6c 69 73 74 2e 61 4d 65 6d 6f  rter->list.aMemo
fd90: 72 79 20 29 7b 0a 20 20 20 20 20 20 62 46 6c 75  ry ){.      bFlu
fda0: 73 68 20 3d 20 70 53 6f 72 74 65 72 2d 3e 69 4d  sh = pSorter->iM
fdb0: 65 6d 6f 72 79 20 26 26 20 28 70 53 6f 72 74 65  emory && (pSorte
fdc0: 72 2d 3e 69 4d 65 6d 6f 72 79 2b 6e 52 65 71 29  r->iMemory+nReq)
fdd0: 20 3e 20 70 53 6f 72 74 65 72 2d 3e 6d 78 50 6d   > pSorter->mxPm
fde0: 61 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65  aSize;.    }else
fdf0: 7b 0a 20 20 20 20 20 20 62 46 6c 75 73 68 20 3d  {.      bFlush =
fe00: 20 28 0a 20 20 20 20 20 20 20 20 20 20 28 70 53   (.          (pS
fe10: 6f 72 74 65 72 2d 3e 6c 69 73 74 2e 73 7a 50 4d  orter->list.szPM
fe20: 41 20 3e 20 70 53 6f 72 74 65 72 2d 3e 6d 78 50  A > pSorter->mxP
fe30: 6d 61 53 69 7a 65 29 0a 20 20 20 20 20 20 20 7c  maSize).       |
fe40: 7c 20 28 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74  | (pSorter->list
fe50: 2e 73 7a 50 4d 41 20 3e 20 70 53 6f 72 74 65 72  .szPMA > pSorter
fe60: 2d 3e 6d 6e 50 6d 61 53 69 7a 65 20 26 26 20 73  ->mnPmaSize && s
fe70: 71 6c 69 74 65 33 48 65 61 70 4e 65 61 72 6c 79  qlite3HeapNearly
fe80: 46 75 6c 6c 28 29 29 0a 20 20 20 20 20 20 29 3b  Full()).      );
fe90: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62  .    }.    if( b
fea0: 46 6c 75 73 68 20 29 7b 0a 20 20 20 20 20 20 72  Flush ){.      r
feb0: 63 20 3d 20 76 64 62 65 53 6f 72 74 65 72 46 6c  c = vdbeSorterFl
fec0: 75 73 68 50 4d 41 28 70 53 6f 72 74 65 72 29 3b  ushPMA(pSorter);
fed0: 0a 20 20 20 20 20 20 70 53 6f 72 74 65 72 2d 3e  .      pSorter->
fee0: 6c 69 73 74 2e 73 7a 50 4d 41 20 3d 20 30 3b 0a  list.szPMA = 0;.
fef0: 20 20 20 20 20 20 70 53 6f 72 74 65 72 2d 3e 69        pSorter->i
ff00: 4d 65 6d 6f 72 79 20 3d 20 30 3b 0a 20 20 20 20  Memory = 0;.    
ff10: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
ff20: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 6f 72 74  LITE_OK || pSort
ff30: 65 72 2d 3e 6c 69 73 74 2e 70 4c 69 73 74 3d 3d  er->list.pList==
ff40: 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  0 );.    }.  }..
ff50: 20 20 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74 2e    pSorter->list.
ff60: 73 7a 50 4d 41 20 2b 3d 20 6e 50 4d 41 3b 0a 20  szPMA += nPMA;. 
ff70: 20 69 66 28 20 6e 50 4d 41 3e 70 53 6f 72 74 65   if( nPMA>pSorte
ff80: 72 2d 3e 6d 78 4b 65 79 73 69 7a 65 20 29 7b 0a  r->mxKeysize ){.
ff90: 20 20 20 20 70 53 6f 72 74 65 72 2d 3e 6d 78 4b      pSorter->mxK
ffa0: 65 79 73 69 7a 65 20 3d 20 6e 50 4d 41 3b 0a 20  eysize = nPMA;. 
ffb0: 20 7d 0a 0a 20 20 69 66 28 20 70 53 6f 72 74 65   }..  if( pSorte
ffc0: 72 2d 3e 6c 69 73 74 2e 61 4d 65 6d 6f 72 79 20  r->list.aMemory 
ffd0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4d 69 6e 20  ){.    int nMin 
ffe0: 3d 20 70 53 6f 72 74 65 72 2d 3e 69 4d 65 6d 6f  = pSorter->iMemo
fff0: 72 79 20 2b 20 6e 52 65 71 3b 0a 0a 20 20 20 20  ry + nReq;..    
10000 69 66 28 20 6e 4d 69 6e 3e 70 53 6f 72 74 65 72  if( nMin>pSorter
10010 2d 3e 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20  ->nMemory ){.   
10020 20 20 20 75 38 20 2a 61 4e 65 77 3b 0a 20 20 20     u8 *aNew;.   
10030 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70 53     int nNew = pS
10040 6f 72 74 65 72 2d 3e 6e 4d 65 6d 6f 72 79 20 2a  orter->nMemory *
10050 20 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   2;.      while(
10060 20 6e 4e 65 77 20 3c 20 6e 4d 69 6e 20 29 20 6e   nNew < nMin ) n
10070 4e 65 77 20 3d 20 6e 4e 65 77 2a 32 3b 0a 20 20  New = nNew*2;.  
10080 20 20 20 20 69 66 28 20 6e 4e 65 77 20 3e 20 70      if( nNew > p
10090 53 6f 72 74 65 72 2d 3e 6d 78 50 6d 61 53 69 7a  Sorter->mxPmaSiz
100a0 65 20 29 20 6e 4e 65 77 20 3d 20 70 53 6f 72 74  e ) nNew = pSort
100b0 65 72 2d 3e 6d 78 50 6d 61 53 69 7a 65 3b 0a 20  er->mxPmaSize;. 
100c0 20 20 20 20 20 69 66 28 20 6e 4e 65 77 20 3c 20       if( nNew < 
100d0 6e 4d 69 6e 20 29 20 6e 4e 65 77 20 3d 20 6e 4d  nMin ) nNew = nM
100e0 69 6e 3b 0a 0a 20 20 20 20 20 20 61 4e 65 77 20  in;..      aNew 
100f0 3d 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  = sqlite3Realloc
10100 28 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74 2e 61  (pSorter->list.a
10110 4d 65 6d 6f 72 79 2c 20 6e 4e 65 77 29 3b 0a 20  Memory, nNew);. 
10120 20 20 20 20 20 69 66 28 20 21 61 4e 65 77 20 29       if( !aNew )
10130 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
10140 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 70 53 6f 72  OMEM;.      pSor
10150 74 65 72 2d 3e 6c 69 73 74 2e 70 4c 69 73 74 20  ter->list.pList 
10160 3d 20 28 53 6f 72 74 65 72 52 65 63 6f 72 64 2a  = (SorterRecord*
10170 29 28 0a 20 20 20 20 20 20 20 20 20 20 61 4e 65  )(.          aNe
10180 77 20 2b 20 28 28 75 38 2a 29 70 53 6f 72 74 65  w + ((u8*)pSorte
10190 72 2d 3e 6c 69 73 74 2e 70 4c 69 73 74 20 2d 20  r->list.pList - 
101a0 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74 2e 61 4d  pSorter->list.aM
101b0 65 6d 6f 72 79 29 0a 20 20 20 20 20 20 29 3b 0a  emory).      );.
101c0 20 20 20 20 20 20 70 53 6f 72 74 65 72 2d 3e 6c        pSorter->l
101d0 69 73 74 2e 61 4d 65 6d 6f 72 79 20 3d 20 61 4e  ist.aMemory = aN
101e0 65 77 3b 0a 20 20 20 20 20 20 70 53 6f 72 74 65  ew;.      pSorte
101f0 72 2d 3e 6e 4d 65 6d 6f 72 79 20 3d 20 6e 4e 65  r->nMemory = nNe
10200 77 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4e  w;.    }..    pN
10210 65 77 20 3d 20 28 53 6f 72 74 65 72 52 65 63 6f  ew = (SorterReco
10220 72 64 2a 29 26 70 53 6f 72 74 65 72 2d 3e 6c 69  rd*)&pSorter->li
10230 73 74 2e 61 4d 65 6d 6f 72 79 5b 70 53 6f 72 74  st.aMemory[pSort
10240 65 72 2d 3e 69 4d 65 6d 6f 72 79 5d 3b 0a 20 20  er->iMemory];.  
10250 20 20 70 53 6f 72 74 65 72 2d 3e 69 4d 65 6d 6f    pSorter->iMemo
10260 72 79 20 2b 3d 20 52 4f 55 4e 44 38 28 6e 52 65  ry += ROUND8(nRe
10270 71 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  q);.    pNew->u.
10280 69 4e 65 78 74 20 3d 20 28 69 6e 74 29 28 28 75  iNext = (int)((u
10290 38 2a 29 28 70 53 6f 72 74 65 72 2d 3e 6c 69 73  8*)(pSorter->lis
102a0 74 2e 70 4c 69 73 74 29 20 2d 20 70 53 6f 72 74  t.pList) - pSort
102b0 65 72 2d 3e 6c 69 73 74 2e 61 4d 65 6d 6f 72 79  er->list.aMemory
102c0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
102d0 70 4e 65 77 20 3d 20 28 53 6f 72 74 65 72 52 65  pNew = (SorterRe
102e0 63 6f 72 64 20 2a 29 73 71 6c 69 74 65 33 4d 61  cord *)sqlite3Ma
102f0 6c 6c 6f 63 28 6e 52 65 71 29 3b 0a 20 20 20 20  lloc(nReq);.    
10300 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
10310 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10320 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
10330 20 20 20 20 70 4e 65 77 2d 3e 75 2e 70 4e 65 78      pNew->u.pNex
10340 74 20 3d 20 70 53 6f 72 74 65 72 2d 3e 6c 69 73  t = pSorter->lis
10350 74 2e 70 4c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20  t.pList;.  }..  
10360 6d 65 6d 63 70 79 28 53 52 56 41 4c 28 70 4e 65  memcpy(SRVAL(pNe
10370 77 29 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56 61  w), pVal->z, pVa
10380 6c 2d 3e 6e 29 3b 0a 20 20 70 4e 65 77 2d 3e 6e  l->n);.  pNew->n
10390 56 61 6c 20 3d 20 70 56 61 6c 2d 3e 6e 3b 0a 20  Val = pVal->n;. 
103a0 20 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74 2e 70   pSorter->list.p
103b0 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 0a 20 20  List = pNew;..  
103c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
103d0 0a 2a 2a 20 52 65 61 64 20 6b 65 79 73 20 66 72  .** Read keys fr
103e0 6f 6d 20 70 49 6e 63 72 2d 3e 70 4d 65 72 67 65  om pIncr->pMerge
103f0 72 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 70  r and populate p
10400 49 6e 63 72 2d 3e 61 46 69 6c 65 5b 31 5d 2e 20  Incr->aFile[1]. 
10410 54 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 6f 66  The format.** of
10420 20 74 68 65 20 64 61 74 61 20 73 74 6f 72 65 64   the data stored
10430 20 69 6e 20 61 46 69 6c 65 5b 31 5d 20 69 73 20   in aFile[1] is 
10440 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 61 74  the same as that
10450 20 75 73 65 64 20 62 79 20 72 65 67 75 6c 61 72   used by regular
10460 20 50 4d 41 73 2c 0a 2a 2a 20 65 78 63 65 70 74   PMAs,.** except
10470 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
10480 2d 6f 66 2d 62 79 74 65 73 20 76 61 72 69 6e 74  -of-bytes varint
10490 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d   is omitted from
104a0 20 74 68 65 20 73 74 61 72 74 2e 0a 2a 2f 0a 73   the start..*/.s
104b0 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 49 6e  tatic int vdbeIn
104c0 63 72 50 6f 70 75 6c 61 74 65 28 49 6e 63 72 4d  crPopulate(IncrM
104d0 65 72 67 65 72 20 2a 70 49 6e 63 72 29 7b 0a 20  erger *pIncr){. 
104e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
104f0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 63 32 3b 0a  _OK;.  int rc2;.
10500 20 20 69 36 34 20 69 53 74 61 72 74 20 3d 20 70    i64 iStart = p
10510 49 6e 63 72 2d 3e 69 53 74 61 72 74 4f 66 66 3b  Incr->iStartOff;
10520 0a 20 20 53 6f 72 74 65 72 46 69 6c 65 20 2a 70  .  SorterFile *p
10530 4f 75 74 20 3d 20 26 70 49 6e 63 72 2d 3e 61 46  Out = &pIncr->aF
10540 69 6c 65 5b 31 5d 3b 0a 20 20 53 6f 72 74 53 75  ile[1];.  SortSu
10550 62 74 61 73 6b 20 2a 70 54 61 73 6b 20 3d 20 70  btask *pTask = p
10560 49 6e 63 72 2d 3e 70 54 61 73 6b 3b 0a 20 20 4d  Incr->pTask;.  M
10570 65 72 67 65 45 6e 67 69 6e 65 20 2a 70 4d 65 72  ergeEngine *pMer
10580 67 65 72 20 3d 20 70 49 6e 63 72 2d 3e 70 4d 65  ger = pIncr->pMe
10590 72 67 65 72 3b 0a 20 20 50 6d 61 57 72 69 74 65  rger;.  PmaWrite
105a0 72 20 77 72 69 74 65 72 3b 0a 20 20 61 73 73 65  r writer;.  asse
105b0 72 74 28 20 70 49 6e 63 72 2d 3e 62 45 6f 66 3d  rt( pIncr->bEof=
105c0 3d 30 20 29 3b 0a 0a 20 20 76 64 62 65 53 6f 72  =0 );..  vdbeSor
105d0 74 65 72 50 6f 70 75 6c 61 74 65 44 65 62 75 67  terPopulateDebug
105e0 28 70 54 61 73 6b 2c 20 22 65 6e 74 65 72 22 29  (pTask, "enter")
105f0 3b 0a 0a 20 20 76 64 62 65 50 6d 61 57 72 69 74  ;..  vdbePmaWrit
10600 65 72 49 6e 69 74 28 70 4f 75 74 2d 3e 70 46 64  erInit(pOut->pFd
10610 2c 20 26 77 72 69 74 65 72 2c 20 70 54 61 73 6b  , &writer, pTask
10620 2d 3e 70 53 6f 72 74 65 72 2d 3e 70 67 73 7a 2c  ->pSorter->pgsz,
10630 20 69 53 74 61 72 74 29 3b 0a 20 20 77 68 69 6c   iStart);.  whil
10640 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
10650 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 75 6d 6d   ){.    int dumm
10660 79 3b 0a 20 20 20 20 50 6d 61 52 65 61 64 65 72  y;.    PmaReader
10670 20 2a 70 52 65 61 64 65 72 20 3d 20 26 70 4d 65   *pReader = &pMe
10680 72 67 65 72 2d 3e 61 52 65 61 64 72 5b 20 70 4d  rger->aReadr[ pM
10690 65 72 67 65 72 2d 3e 61 54 72 65 65 5b 31 5d 20  erger->aTree[1] 
106a0 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 20  ];.    int nKey 
106b0 3d 20 70 52 65 61 64 65 72 2d 3e 6e 4b 65 79 3b  = pReader->nKey;
106c0 0a 20 20 20 20 69 36 34 20 69 45 6f 66 20 3d 20  .    i64 iEof = 
106d0 77 72 69 74 65 72 2e 69 57 72 69 74 65 4f 66 66  writer.iWriteOff
106e0 20 2b 20 77 72 69 74 65 72 2e 69 42 75 66 45 6e   + writer.iBufEn
106f0 64 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  d;..    /* Check
10700 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 66   if the output f
10710 69 6c 65 20 69 73 20 66 75 6c 6c 20 6f 72 20 69  ile is full or i
10720 66 20 74 68 65 20 69 6e 70 75 74 20 68 61 73 20  f the input has 
10730 62 65 65 6e 20 65 78 68 61 75 73 74 65 64 2e 0a  been exhausted..
10740 20 20 20 20 2a 2a 20 49 6e 20 65 69 74 68 65 72      ** In either
10750 20 63 61 73 65 20 65 78 69 74 20 74 68 65 20 6c   case exit the l
10760 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  oop. */.    if( 
10770 70 52 65 61 64 65 72 2d 3e 70 46 64 3d 3d 30 20  pReader->pFd==0 
10780 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
10790 20 28 69 45 6f 66 20 2b 20 6e 4b 65 79 20 2b 20   (iEof + nKey + 
107a0 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e  sqlite3VarintLen
107b0 28 6e 4b 65 79 29 29 3e 28 69 53 74 61 72 74 20  (nKey))>(iStart 
107c0 2b 20 70 49 6e 63 72 2d 3e 6d 78 53 7a 29 20 29  + pIncr->mxSz) )
107d0 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20   break;..    /* 
107e0 57 72 69 74 65 20 74 68 65 20 6e 65 78 74 20 6b  Write the next k
107f0 65 79 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ey to the output
10800 2e 20 2a 2f 0a 20 20 20 20 76 64 62 65 50 6d 61  . */.    vdbePma
10810 57 72 69 74 65 56 61 72 69 6e 74 28 26 77 72 69  WriteVarint(&wri
10820 74 65 72 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20  ter, nKey);.    
10830 76 64 62 65 50 6d 61 57 72 69 74 65 42 6c 6f 62  vdbePmaWriteBlob
10840 28 26 77 72 69 74 65 72 2c 20 70 52 65 61 64 65  (&writer, pReade
10850 72 2d 3e 61 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a  r->aKey, nKey);.
10860 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 63      assert( pInc
10870 72 2d 3e 70 4d 65 72 67 65 72 2d 3e 70 54 61 73  r->pMerger->pTas
10880 6b 3d 3d 70 54 61 73 6b 20 29 3b 0a 20 20 20 20  k==pTask );.    
10890 72 63 20 3d 20 76 64 62 65 4d 65 72 67 65 45 6e  rc = vdbeMergeEn
108a0 67 69 6e 65 53 74 65 70 28 70 49 6e 63 72 2d 3e  gineStep(pIncr->
108b0 70 4d 65 72 67 65 72 2c 20 26 64 75 6d 6d 79 29  pMerger, &dummy)
108c0 3b 0a 20 20 7d 0a 0a 20 20 72 63 32 20 3d 20 76  ;.  }..  rc2 = v
108d0 64 62 65 50 6d 61 57 72 69 74 65 72 46 69 6e 69  dbePmaWriterFini
108e0 73 68 28 26 77 72 69 74 65 72 2c 20 26 70 4f 75  sh(&writer, &pOu
108f0 74 2d 3e 69 45 6f 66 29 3b 0a 20 20 69 66 28 20  t->iEof);.  if( 
10900 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
10910 72 63 20 3d 20 72 63 32 3b 0a 20 20 76 64 62 65  rc = rc2;.  vdbe
10920 53 6f 72 74 65 72 50 6f 70 75 6c 61 74 65 44 65  SorterPopulateDe
10930 62 75 67 28 70 54 61 73 6b 2c 20 22 65 78 69 74  bug(pTask, "exit
10940 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ");.  return rc;
10950 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .}..#if SQLITE_M
10960 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  AX_WORKER_THREAD
10970 53 3e 30 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  S>0./*.** The ma
10980 69 6e 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 62  in routine for b
10990 61 63 6b 67 72 6f 75 6e 64 20 74 68 72 65 61 64  ackground thread
109a0 73 20 74 68 61 74 20 70 6f 70 75 6c 61 74 65 20  s that populate 
109b0 61 46 69 6c 65 5b 31 5d 20 6f 66 0a 2a 2a 20 6d  aFile[1] of.** m
109c0 75 6c 74 69 2d 74 68 72 65 61 64 65 64 20 49 6e  ulti-threaded In
109d0 63 72 4d 65 72 67 65 72 20 6f 62 6a 65 63 74 73  crMerger objects
109e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
109f0 20 2a 76 64 62 65 49 6e 63 72 50 6f 70 75 6c 61   *vdbeIncrPopula
10a00 74 65 54 68 72 65 61 64 28 76 6f 69 64 20 2a 70  teThread(void *p
10a10 43 74 78 29 7b 0a 20 20 49 6e 63 72 4d 65 72 67  Ctx){.  IncrMerg
10a20 65 72 20 2a 70 49 6e 63 72 20 3d 20 28 49 6e 63  er *pIncr = (Inc
10a30 72 4d 65 72 67 65 72 2a 29 70 43 74 78 3b 0a 20  rMerger*)pCtx;. 
10a40 20 76 6f 69 64 20 2a 70 52 65 74 20 3d 20 53 51   void *pRet = SQ
10a50 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
10a60 20 76 64 62 65 49 6e 63 72 50 6f 70 75 6c 61 74   vdbeIncrPopulat
10a70 65 28 70 49 6e 63 72 29 20 29 3b 0a 20 20 70 49  e(pIncr) );.  pI
10a80 6e 63 72 2d 3e 70 54 61 73 6b 2d 3e 62 44 6f 6e  ncr->pTask->bDon
10a90 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  e = 1;.  return 
10aa0 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  pRet;.}../*.** L
10ab0 61 75 6e 63 68 20 61 20 62 61 63 6b 67 72 6f 75  aunch a backgrou
10ac0 6e 64 20 74 68 72 65 61 64 20 74 6f 20 70 6f 70  nd thread to pop
10ad0 75 6c 61 74 65 20 61 46 69 6c 65 5b 31 5d 20 6f  ulate aFile[1] o
10ae0 66 20 70 49 6e 63 72 2e 0a 2a 2f 0a 73 74 61 74  f pIncr..*/.stat
10af0 69 63 20 69 6e 74 20 76 64 62 65 49 6e 63 72 42  ic int vdbeIncrB
10b00 67 50 6f 70 75 6c 61 74 65 28 49 6e 63 72 4d 65  gPopulate(IncrMe
10b10 72 67 65 72 20 2a 70 49 6e 63 72 29 7b 0a 20 20  rger *pIncr){.  
10b20 76 6f 69 64 20 2a 70 20 3d 20 28 76 6f 69 64 2a  void *p = (void*
10b30 29 70 49 6e 63 72 3b 0a 20 20 61 73 73 65 72 74  )pIncr;.  assert
10b40 28 20 70 49 6e 63 72 2d 3e 62 55 73 65 54 68 72  ( pIncr->bUseThr
10b50 65 61 64 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ead );.  return 
10b60 76 64 62 65 53 6f 72 74 65 72 43 72 65 61 74 65  vdbeSorterCreate
10b70 54 68 72 65 61 64 28 70 49 6e 63 72 2d 3e 70 54  Thread(pIncr->pT
10b80 61 73 6b 2c 20 76 64 62 65 49 6e 63 72 50 6f 70  ask, vdbeIncrPop
10b90 75 6c 61 74 65 54 68 72 65 61 64 2c 20 70 29 3b  ulateThread, p);
10ba0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
10bb0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
10bc0 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  s called when th
10bd0 65 20 50 6d 61 52 65 61 64 65 72 20 63 6f 72 72  e PmaReader corr
10be0 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 49 6e  esponding to pIn
10bf0 63 72 20 68 61 73 0a 2a 2a 20 66 69 6e 69 73 68  cr has.** finish
10c00 65 64 20 72 65 61 64 69 6e 67 20 74 68 65 20 63  ed reading the c
10c10 6f 6e 74 65 6e 74 73 20 6f 66 20 61 46 69 6c 65  ontents of aFile
10c20 5b 30 5d 2e 20 49 74 73 20 70 75 72 70 6f 73 65  [0]. Its purpose
10c30 20 69 73 20 74 6f 20 22 72 65 66 69 6c 6c 22 0a   is to "refill".
10c40 2a 2a 20 61 46 69 6c 65 5b 30 5d 20 73 75 63 68  ** aFile[0] such
10c50 20 74 68 61 74 20 74 68 65 20 50 6d 61 52 65 61   that the PmaRea
10c60 64 65 72 20 73 68 6f 75 6c 64 20 73 74 61 72 74  der should start
10c70 20 72 65 72 65 61 64 69 6e 67 20 69 74 20 66 72   rereading it fr
10c80 6f 6d 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e  om the.** beginn
10c90 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 73  ing..**.** For s
10ca0 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 20 6f  ingle-threaded o
10cb0 62 6a 65 63 74 73 2c 20 74 68 69 73 20 69 73 20  bjects, this is 
10cc0 61 63 63 6f 6d 70 6c 69 73 68 65 64 20 62 79 20  accomplished by 
10cd0 6c 69 74 65 72 61 6c 6c 79 20 72 65 61 64 69 6e  literally readin
10ce0 67 20 0a 2a 2a 20 6b 65 79 73 20 66 72 6f 6d 20  g .** keys from 
10cf0 70 49 6e 63 72 2d 3e 70 4d 65 72 67 65 72 20 61  pIncr->pMerger a
10d00 6e 64 20 72 65 70 6f 70 75 6c 61 74 69 6e 67 20  nd repopulating 
10d10 61 46 69 6c 65 5b 30 5d 2e 20 0a 2a 2a 0a 2a 2a  aFile[0]. .**.**
10d20 20 46 6f 72 20 6d 75 6c 74 69 2d 74 68 72 65 61   For multi-threa
10d30 64 65 64 20 6f 62 6a 65 63 74 73 2c 20 61 6c 6c  ded objects, all
10d40 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
10d50 64 20 69 73 20 74 6f 20 77 61 69 74 20 75 6e 74  d is to wait unt
10d60 69 6c 20 74 68 65 20 0a 2a 2a 20 62 61 63 6b 67  il the .** backg
10d70 72 6f 75 6e 64 20 74 68 72 65 61 64 20 69 73 20  round thread is 
10d80 66 69 6e 69 73 68 65 64 20 28 69 66 20 69 74 20  finished (if it 
10d90 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 29 20  is not already) 
10da0 61 6e 64 20 74 68 65 6e 20 73 77 61 70 20 0a 2a  and then swap .*
10db0 2a 20 61 46 69 6c 65 5b 30 5d 20 61 6e 64 20 61  * aFile[0] and a
10dc0 46 69 6c 65 5b 31 5d 20 69 6e 20 70 6c 61 63 65  File[1] in place
10dd0 2e 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  . If the content
10de0 73 20 6f 66 20 70 4d 65 72 67 65 72 20 68 61 76  s of pMerger hav
10df0 65 20 6e 6f 74 0a 2a 2a 20 62 65 65 6e 20 65 78  e not.** been ex
10e00 68 61 75 73 74 65 64 2c 20 74 68 69 73 20 66 75  hausted, this fu
10e10 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 6c 61 75 6e  nction also laun
10e20 63 68 65 73 20 61 20 6e 65 77 20 62 61 63 6b 67  ches a new backg
10e30 72 6f 75 6e 64 20 74 68 72 65 61 64 0a 2a 2a 20  round thread.** 
10e40 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
10e50 6e 65 77 20 61 46 69 6c 65 5b 31 5d 2e 0a 2a 2a  new aFile[1]..**
10e60 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
10e70 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
10e80 63 65 73 73 2c 20 6f 72 20 61 6e 20 53 51 4c 69  cess, or an SQLi
10e90 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  te error code ot
10ea0 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
10eb0 69 63 20 69 6e 74 20 76 64 62 65 49 6e 63 72 53  ic int vdbeIncrS
10ec0 77 61 70 28 49 6e 63 72 4d 65 72 67 65 72 20 2a  wap(IncrMerger *
10ed0 70 49 6e 63 72 29 7b 0a 20 20 69 6e 74 20 72 63  pIncr){.  int rc
10ee0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23   = SQLITE_OK;..#
10ef0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f  if SQLITE_MAX_WO
10f00 52 4b 45 52 5f 54 48 52 45 41 44 53 3e 30 0a 20  RKER_THREADS>0. 
10f10 20 69 66 28 20 70 49 6e 63 72 2d 3e 62 55 73 65   if( pIncr->bUse
10f20 54 68 72 65 61 64 20 29 7b 0a 20 20 20 20 72 63  Thread ){.    rc
10f30 20 3d 20 76 64 62 65 53 6f 72 74 65 72 4a 6f 69   = vdbeSorterJoi
10f40 6e 54 68 72 65 61 64 28 70 49 6e 63 72 2d 3e 70  nThread(pIncr->p
10f50 54 61 73 6b 29 3b 0a 0a 20 20 20 20 69 66 28 20  Task);..    if( 
10f60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10f70 0a 20 20 20 20 20 20 53 6f 72 74 65 72 46 69 6c  .      SorterFil
10f80 65 20 66 30 20 3d 20 70 49 6e 63 72 2d 3e 61 46  e f0 = pIncr->aF
10f90 69 6c 65 5b 30 5d 3b 0a 20 20 20 20 20 20 70 49  ile[0];.      pI
10fa0 6e 63 72 2d 3e 61 46 69 6c 65 5b 30 5d 20 3d 20  ncr->aFile[0] = 
10fb0 70 49 6e 63 72 2d 3e 61 46 69 6c 65 5b 31 5d 3b  pIncr->aFile[1];
10fc0 0a 20 20 20 20 20 20 70 49 6e 63 72 2d 3e 61 46  .      pIncr->aF
10fd0 69 6c 65 5b 31 5d 20 3d 20 66 30 3b 0a 20 20 20  ile[1] = f0;.   
10fe0 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
10ff0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11000 20 20 20 69 66 28 20 70 49 6e 63 72 2d 3e 61 46     if( pIncr->aF
11010 69 6c 65 5b 30 5d 2e 69 45 6f 66 3d 3d 70 49 6e  ile[0].iEof==pIn
11020 63 72 2d 3e 69 53 74 61 72 74 4f 66 66 20 29 7b  cr->iStartOff ){
11030 0a 20 20 20 20 20 20 20 20 70 49 6e 63 72 2d 3e  .        pIncr->
11040 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  bEof = 1;.      
11050 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
11060 63 20 3d 20 76 64 62 65 49 6e 63 72 42 67 50 6f  c = vdbeIncrBgPo
11070 70 75 6c 61 74 65 28 70 49 6e 63 72 29 3b 0a 20  pulate(pIncr);. 
11080 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
11090 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a  else.#endif.  {.
110a0 20 20 20 20 72 63 20 3d 20 76 64 62 65 49 6e 63      rc = vdbeInc
110b0 72 50 6f 70 75 6c 61 74 65 28 70 49 6e 63 72 29  rPopulate(pIncr)
110c0 3b 0a 20 20 20 20 70 49 6e 63 72 2d 3e 61 46 69  ;.    pIncr->aFi
110d0 6c 65 5b 30 5d 20 3d 20 70 49 6e 63 72 2d 3e 61  le[0] = pIncr->a
110e0 46 69 6c 65 5b 31 5d 3b 0a 20 20 20 20 69 66 28  File[1];.    if(
110f0 20 70 49 6e 63 72 2d 3e 61 46 69 6c 65 5b 30 5d   pIncr->aFile[0]
11100 2e 69 45 6f 66 3d 3d 70 49 6e 63 72 2d 3e 69 53  .iEof==pIncr->iS
11110 74 61 72 74 4f 66 66 20 29 7b 0a 20 20 20 20 20  tartOff ){.     
11120 20 70 49 6e 63 72 2d 3e 62 45 6f 66 20 3d 20 31   pIncr->bEof = 1
11130 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
11140 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11150 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
11160 72 65 74 75 72 6e 20 61 20 6e 65 77 20 49 6e 63  return a new Inc
11170 72 4d 65 72 67 65 72 20 6f 62 6a 65 63 74 20 74  rMerger object t
11180 6f 20 72 65 61 64 20 64 61 74 61 20 66 72 6f 6d  o read data from
11190 20 70 4d 65 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20   pMerger..**.** 
111a0 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74  If an OOM condit
111b0 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ion is encounter
111c0 65 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  ed, return NULL.
111d0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 66 72   In this case fr
111e0 65 65 20 74 68 65 0a 2a 2a 20 70 4d 65 72 67 65  ee the.** pMerge
111f0 72 20 61 72 67 75 6d 65 6e 74 20 62 65 66 6f 72  r argument befor
11200 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
11210 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 49  static int vdbeI
11220 6e 63 72 4d 65 72 67 65 72 4e 65 77 28 0a 20 20  ncrMergerNew(.  
11230 53 6f 72 74 53 75 62 74 61 73 6b 20 2a 70 54 61  SortSubtask *pTa
11240 73 6b 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74  sk,     /* The t
11250 68 72 65 61 64 20 74 68 61 74 20 77 69 6c 6c 20  hread that will 
11260 62 65 20 75 73 69 6e 67 20 74 68 65 20 6e 65 77  be using the new
11270 20 49 6e 63 72 4d 65 72 67 65 72 20 2a 2f 0a 20   IncrMerger */. 
11280 20 4d 65 72 67 65 45 6e 67 69 6e 65 20 2a 70 4d   MergeEngine *pM
11290 65 72 67 65 72 2c 20 20 20 2f 2a 20 54 68 65 20  erger,   /* The 
112a0 4d 65 72 67 65 45 6e 67 69 6e 65 20 74 68 61 74  MergeEngine that
112b0 20 74 68 65 20 49 6e 63 72 4d 65 72 67 65 72 20   the IncrMerger 
112c0 77 69 6c 6c 20 63 6f 6e 74 72 6f 6c 20 2a 2f 0a  will control */.
112d0 20 20 49 6e 63 72 4d 65 72 67 65 72 20 2a 2a 70    IncrMerger **p
112e0 70 4f 75 74 20 20 20 20 20 20 2f 2a 20 57 72 69  pOut      /* Wri
112f0 74 65 20 74 68 65 20 6e 65 77 20 49 6e 63 72 4d  te the new IncrM
11300 65 72 67 65 72 20 68 65 72 65 20 2a 2f 0a 29 7b  erger here */.){
11310 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11320 54 45 5f 4f 4b 3b 0a 20 20 49 6e 63 72 4d 65 72  TE_OK;.  IncrMer
11330 67 65 72 20 2a 70 49 6e 63 72 20 3d 20 2a 70 70  ger *pIncr = *pp
11340 4f 75 74 20 3d 20 28 49 6e 63 72 4d 65 72 67 65  Out = (IncrMerge
11350 72 2a 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69  r*).       (sqli
11360 74 65 33 46 61 75 6c 74 53 69 6d 28 31 30 30 29  te3FaultSim(100)
11370 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33 4d 61   ? 0 : sqlite3Ma
11380 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
11390 2a 70 49 6e 63 72 29 29 29 3b 0a 20 20 69 66 28  *pIncr)));.  if(
113a0 20 70 49 6e 63 72 20 29 7b 0a 20 20 20 20 70 49   pIncr ){.    pI
113b0 6e 63 72 2d 3e 70 4d 65 72 67 65 72 20 3d 20 70  ncr->pMerger = p
113c0 4d 65 72 67 65 72 3b 0a 20 20 20 20 70 49 6e 63  Merger;.    pInc
113d0 72 2d 3e 70 54 61 73 6b 20 3d 20 70 54 61 73 6b  r->pTask = pTask
113e0 3b 0a 20 20 20 20 70 49 6e 63 72 2d 3e 6d 78 53  ;.    pIncr->mxS
113f0 7a 20 3d 20 4d 41 58 28 70 54 61 73 6b 2d 3e 70  z = MAX(pTask->p
11400 53 6f 72 74 65 72 2d 3e 6d 78 4b 65 79 73 69 7a  Sorter->mxKeysiz
11410 65 2b 39 2c 70 54 61 73 6b 2d 3e 70 53 6f 72 74  e+9,pTask->pSort
11420 65 72 2d 3e 6d 78 50 6d 61 53 69 7a 65 2f 32 29  er->mxPmaSize/2)
11430 3b 0a 20 20 20 20 70 54 61 73 6b 2d 3e 66 69 6c  ;.    pTask->fil
11440 65 32 2e 69 45 6f 66 20 2b 3d 20 70 49 6e 63 72  e2.iEof += pIncr
11450 2d 3e 6d 78 53 7a 3b 0a 20 20 7d 65 6c 73 65 7b  ->mxSz;.  }else{
11460 0a 20 20 20 20 76 64 62 65 4d 65 72 67 65 45 6e  .    vdbeMergeEn
11470 67 69 6e 65 46 72 65 65 28 70 4d 65 72 67 65 72  gineFree(pMerger
11480 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
11490 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
114a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
114b0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52  f SQLITE_MAX_WOR
114c0 4b 45 52 5f 54 48 52 45 41 44 53 3e 30 0a 2f 2a  KER_THREADS>0./*
114d0 0a 2a 2a 20 53 65 74 20 74 68 65 20 22 75 73 65  .** Set the "use
114e0 2d 74 68 72 65 61 64 73 22 20 66 6c 61 67 20 6f  -threads" flag o
114f0 6e 20 6f 62 6a 65 63 74 20 70 49 6e 63 72 2e 0a  n object pIncr..
11500 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
11510 64 62 65 49 6e 63 72 4d 65 72 67 65 72 53 65 74  dbeIncrMergerSet
11520 54 68 72 65 61 64 73 28 49 6e 63 72 4d 65 72 67  Threads(IncrMerg
11530 65 72 20 2a 70 49 6e 63 72 29 7b 0a 20 20 70 49  er *pIncr){.  pI
11540 6e 63 72 2d 3e 62 55 73 65 54 68 72 65 61 64 20  ncr->bUseThread 
11550 3d 20 31 3b 0a 20 20 70 49 6e 63 72 2d 3e 70 54  = 1;.  pIncr->pT
11560 61 73 6b 2d 3e 66 69 6c 65 32 2e 69 45 6f 66 20  ask->file2.iEof 
11570 2d 3d 20 70 49 6e 63 72 2d 3e 6d 78 53 7a 3b 0a  -= pIncr->mxSz;.
11580 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
11590 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48  TE_MAX_WORKER_TH
115a0 52 45 41 44 53 3e 30 20 2a 2f 0a 0a 0a 0a 2f 2a  READS>0 */..../*
115b0 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 70 4d  .** Recompute pM
115c0 65 72 67 65 72 2d 3e 61 54 72 65 65 5b 69 4f 75  erger->aTree[iOu
115d0 74 5d 20 62 79 20 63 6f 6d 70 61 72 69 6e 67 20  t] by comparing 
115e0 74 68 65 20 6e 65 78 74 20 6b 65 79 73 20 6f 6e  the next keys on
115f0 20 74 68 65 0a 2a 2a 20 74 77 6f 20 50 6d 61 52   the.** two PmaR
11600 65 61 64 65 72 73 20 74 68 61 74 20 66 65 65 64  eaders that feed
11610 20 74 68 61 74 20 65 6e 74 72 79 2e 20 20 4e 65   that entry.  Ne
11620 69 74 68 65 72 20 6f 66 20 74 68 65 20 50 6d 61  ither of the Pma
11630 52 65 61 64 65 72 73 0a 2a 2a 20 61 72 65 20 61  Readers.** are a
11640 64 76 61 6e 63 65 64 2e 20 20 54 68 69 73 20 72  dvanced.  This r
11650 6f 75 74 69 6e 65 20 6d 65 72 65 6c 79 20 64 6f  outine merely do
11660 65 73 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  es the compariso
11670 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
11680 64 20 76 64 62 65 4d 65 72 67 65 45 6e 67 69 6e  d vdbeMergeEngin
11690 65 43 6f 6d 70 61 72 65 28 0a 20 20 4d 65 72 67  eCompare(.  Merg
116a0 65 45 6e 67 69 6e 65 20 2a 70 4d 65 72 67 65 72  eEngine *pMerger
116b0 2c 20 20 2f 2a 20 4d 65 72 67 65 20 65 6e 67 69  ,  /* Merge engi
116c0 6e 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 50 6d  ne containing Pm
116d0 61 52 65 61 64 65 72 73 20 74 6f 20 63 6f 6d 70  aReaders to comp
116e0 61 72 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 75  are */.  int iOu
116f0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
11700 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
11710 75 6c 74 20 69 6e 20 70 4d 65 72 67 65 72 2d 3e  ult in pMerger->
11720 61 54 72 65 65 5b 69 4f 75 74 5d 20 2a 2f 0a 29  aTree[iOut] */.)
11730 7b 0a 20 20 69 6e 74 20 69 31 3b 0a 20 20 69 6e  {.  int i1;.  in
11740 74 20 69 32 3b 0a 20 20 69 6e 74 20 69 52 65 73  t i2;.  int iRes
11750 3b 0a 20 20 50 6d 61 52 65 61 64 65 72 20 2a 70  ;.  PmaReader *p
11760 31 3b 0a 20 20 50 6d 61 52 65 61 64 65 72 20 2a  1;.  PmaReader *
11770 70 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  p2;..  assert( i
11780 4f 75 74 3c 70 4d 65 72 67 65 72 2d 3e 6e 54 72  Out<pMerger->nTr
11790 65 65 20 26 26 20 69 4f 75 74 3e 30 20 29 3b 0a  ee && iOut>0 );.
117a0 0a 20 20 69 66 28 20 69 4f 75 74 3e 3d 28 70 4d  .  if( iOut>=(pM
117b0 65 72 67 65 72 2d 3e 6e 54 72 65 65 2f 32 29 20  erger->nTree/2) 
117c0 29 7b 0a 20 20 20 20 69 31 20 3d 20 28 69 4f 75  ){.    i1 = (iOu
117d0 74 20 2d 20 70 4d 65 72 67 65 72 2d 3e 6e 54 72  t - pMerger->nTr
117e0 65 65 2f 32 29 20 2a 20 32 3b 0a 20 20 20 20 69  ee/2) * 2;.    i
117f0 32 20 3d 20 69 31 20 2b 20 31 3b 0a 20 20 7d 65  2 = i1 + 1;.  }e
11800 6c 73 65 7b 0a 20 20 20 20 69 31 20 3d 20 70 4d  lse{.    i1 = pM
11810 65 72 67 65 72 2d 3e 61 54 72 65 65 5b 69 4f 75  erger->aTree[iOu
11820 74 2a 32 5d 3b 0a 20 20 20 20 69 32 20 3d 20 70  t*2];.    i2 = p
11830 4d 65 72 67 65 72 2d 3e 61 54 72 65 65 5b 69 4f  Merger->aTree[iO
11840 75 74 2a 32 2b 31 5d 3b 0a 20 20 7d 0a 0a 20 20  ut*2+1];.  }..  
11850 70 31 20 3d 20 26 70 4d 65 72 67 65 72 2d 3e 61  p1 = &pMerger->a
11860 52 65 61 64 72 5b 69 31 5d 3b 0a 20 20 70 32 20  Readr[i1];.  p2 
11870 3d 20 26 70 4d 65 72 67 65 72 2d 3e 61 52 65 61  = &pMerger->aRea
11880 64 72 5b 69 32 5d 3b 0a 0a 20 20 69 66 28 20 70  dr[i2];..  if( p
11890 31 2d 3e 70 46 64 3d 3d 30 20 29 7b 0a 20 20 20  1->pFd==0 ){.   
118a0 20 69 52 65 73 20 3d 20 69 32 3b 0a 20 20 7d 65   iRes = i2;.  }e
118b0 6c 73 65 20 69 66 28 20 70 32 2d 3e 70 46 64 3d  lse if( p2->pFd=
118c0 3d 30 20 29 7b 0a 20 20 20 20 69 52 65 73 20 3d  =0 ){.    iRes =
118d0 20 69 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   i1;.  }else{.  
118e0 20 20 53 6f 72 74 53 75 62 74 61 73 6b 20 2a 70    SortSubtask *p
118f0 54 61 73 6b 20 3d 20 70 4d 65 72 67 65 72 2d 3e  Task = pMerger->
11900 70 54 61 73 6b 3b 0a 20 20 20 20 69 6e 74 20 62  pTask;.    int b
11910 43 61 63 68 65 64 20 3d 20 30 3b 0a 20 20 20 20  Cached = 0;.    
11920 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 61 73 73  int res;.    ass
11930 65 72 74 28 20 70 54 61 73 6b 2d 3e 70 55 6e 70  ert( pTask->pUnp
11940 61 63 6b 65 64 21 3d 30 20 29 3b 20 20 2f 2a 20  acked!=0 );  /* 
11950 66 72 6f 6d 20 76 64 62 65 53 6f 72 74 53 75 62  from vdbeSortSub
11960 74 61 73 6b 4d 61 69 6e 28 29 20 2a 2f 0a 20 20  taskMain() */.  
11970 20 20 72 65 73 20 3d 20 70 54 61 73 6b 2d 3e 78    res = pTask->x
11980 43 6f 6d 70 61 72 65 28 0a 20 20 20 20 20 20 20  Compare(.       
11990 20 70 54 61 73 6b 2c 20 26 62 43 61 63 68 65 64   pTask, &bCached
119a0 2c 20 70 31 2d 3e 61 4b 65 79 2c 20 70 31 2d 3e  , p1->aKey, p1->
119b0 6e 4b 65 79 2c 20 70 32 2d 3e 61 4b 65 79 2c 20  nKey, p2->aKey, 
119c0 70 32 2d 3e 6e 4b 65 79 0a 20 20 20 20 29 3b 0a  p2->nKey.    );.
119d0 20 20 20 20 69 66 28 20 72 65 73 3c 3d 30 20 29      if( res<=0 )
119e0 7b 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20 69  {.      iRes = i
119f0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
11a00 20 20 20 20 69 52 65 73 20 3d 20 69 32 3b 0a 20      iRes = i2;. 
11a10 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 4d 65 72     }.  }..  pMer
11a20 67 65 72 2d 3e 61 54 72 65 65 5b 69 4f 75 74 5d  ger->aTree[iOut]
11a30 20 3d 20 69 52 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a   = iRes;.}../*.*
11a40 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  * Allowed values
11a50 20 66 6f 72 20 74 68 65 20 65 4d 6f 64 65 20 70   for the eMode p
11a60 61 72 61 6d 65 74 65 72 20 74 6f 20 76 64 62 65  arameter to vdbe
11a70 4d 65 72 67 65 45 6e 67 69 6e 65 49 6e 69 74 28  MergeEngineInit(
11a80 29 0a 2a 2a 20 61 6e 64 20 76 64 62 65 50 6d 61  ).** and vdbePma
11a90 52 65 61 64 65 72 49 6e 63 72 4d 65 72 67 65 49  ReaderIncrMergeI
11aa0 6e 69 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  nit()..**.** Onl
11ab0 79 20 49 4e 43 52 49 4e 49 54 5f 4e 4f 52 4d 41  y INCRINIT_NORMA
11ac0 4c 20 69 73 20 76 61 6c 69 64 20 69 6e 20 73 69  L is valid in si
11ad0 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 20 62 75  ngle-threaded bu
11ae0 69 6c 64 73 20 28 77 68 65 6e 0a 2a 2a 20 53 51  ilds (when.** SQ
11af0 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f  LITE_MAX_WORKER_
11b00 54 48 52 45 41 44 53 3d 3d 30 29 2e 20 20 54 68  THREADS==0).  Th
11b10 65 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 61  e other values a
11b20 72 65 20 6f 6e 6c 79 20 75 73 65 64 0a 2a 2a 20  re only used.** 
11b30 77 68 65 6e 20 74 68 65 72 65 20 65 78 69 73 74  when there exist
11b40 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65  s one or more se
11b50 70 61 72 61 74 65 20 77 6f 72 6b 65 72 20 74 68  parate worker th
11b60 72 65 61 64 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  reads..*/.#defin
11b70 65 20 49 4e 43 52 49 4e 49 54 5f 4e 4f 52 4d 41  e INCRINIT_NORMA
11b80 4c 20 30 0a 23 64 65 66 69 6e 65 20 49 4e 43 52  L 0.#define INCR
11b90 49 4e 49 54 5f 54 41 53 4b 20 20 20 31 0a 23 64  INIT_TASK   1.#d
11ba0 65 66 69 6e 65 20 49 4e 43 52 49 4e 49 54 5f 52  efine INCRINIT_R
11bb0 4f 4f 54 20 20 20 32 0a 0a 2f 2a 20 0a 2a 2a 20  OOT   2../* .** 
11bc0 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
11bd0 65 20 72 65 71 75 69 72 65 64 20 61 73 20 74 68  e required as th
11be0 65 20 76 64 62 65 49 6e 63 72 4d 65 72 67 65 49  e vdbeIncrMergeI
11bf0 6e 69 74 28 29 20 61 6e 64 0a 2a 2a 20 76 64 62  nit() and.** vdb
11c00 65 50 6d 61 52 65 61 64 65 72 49 6e 63 72 49 6e  ePmaReaderIncrIn
11c10 69 74 28 29 20 72 6f 75 74 69 6e 65 73 20 61 72  it() routines ar
11c20 65 20 63 61 6c 6c 65 64 20 6d 75 74 75 61 6c 6c  e called mutuall
11c30 79 20 72 65 63 75 72 73 69 76 65 6c 79 20 77 68  y recursively wh
11c40 65 6e 0a 2a 2a 20 62 75 69 6c 64 69 6e 67 20 61  en.** building a
11c50 20 6d 65 72 67 65 20 74 72 65 65 2e 0a 2a 2f 0a   merge tree..*/.
11c60 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 50  static int vdbeP
11c70 6d 61 52 65 61 64 65 72 49 6e 63 72 49 6e 69 74  maReaderIncrInit
11c80 28 50 6d 61 52 65 61 64 65 72 20 2a 70 52 65 61  (PmaReader *pRea
11c90 64 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 3b 0a  dr, int eMode);.
11ca0 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
11cb0 65 20 74 68 65 20 4d 65 72 67 65 45 6e 67 69 6e  e the MergeEngin
11cc0 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  e object passed 
11cd0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
11ce0 67 75 6d 65 6e 74 2e 20 4f 6e 63 65 20 74 68 69  gument. Once thi
11cf0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65  s.** function re
11d00 74 75 72 6e 73 2c 20 74 68 65 20 66 69 72 73 74  turns, the first
11d10 20 6b 65 79 20 6f 66 20 6d 65 72 67 65 64 20 64   key of merged d
11d20 61 74 61 20 6d 61 79 20 62 65 20 72 65 61 64 20  ata may be read 
11d30 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 4d 65 72  from the .** Mer
11d40 67 65 45 6e 67 69 6e 65 20 6f 62 6a 65 63 74 20  geEngine object 
11d50 69 6e 20 74 68 65 20 75 73 75 61 6c 20 66 61 73  in the usual fas
11d60 68 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  hion..**.** If a
11d70 72 67 75 6d 65 6e 74 20 65 4d 6f 64 65 20 69 73  rgument eMode is
11d80 20 49 4e 43 52 49 4e 49 54 5f 52 4f 4f 54 2c 20   INCRINIT_ROOT, 
11d90 74 68 65 6e 20 69 74 20 69 73 20 61 73 73 75 6d  then it is assum
11da0 65 64 20 74 68 61 74 20 61 6e 79 20 49 6e 63 72  ed that any Incr
11db0 4d 65 72 67 65 0a 2a 2a 20 6f 62 6a 65 63 74 73  Merge.** objects
11dc0 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
11dd0 20 50 6d 61 52 65 61 64 65 72 20 6f 62 6a 65 63   PmaReader objec
11de0 74 73 20 74 68 61 74 20 74 68 65 20 6d 65 72 67  ts that the merg
11df0 65 72 20 72 65 61 64 73 20 66 72 6f 6d 20 68 61  er reads from ha
11e00 76 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65  ve.** already be
11e10 65 6e 20 70 6f 70 75 6c 61 74 65 64 2c 20 62 75  en populated, bu
11e20 74 20 74 68 61 74 20 74 68 65 79 20 68 61 76 65  t that they have
11e30 20 6e 6f 74 20 79 65 74 20 70 6f 70 75 6c 61 74   not yet populat
11e40 65 64 20 61 46 69 6c 65 5b 30 5d 20 61 6e 64 0a  ed aFile[0] and.
11e50 2a 2a 20 73 65 74 20 74 68 65 20 50 6d 61 52 65  ** set the PmaRe
11e60 61 64 65 72 20 6f 62 6a 65 63 74 73 20 75 70 20  ader objects up 
11e70 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 69 74 2e  to read from it.
11e80 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c   In this case al
11e90 6c 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65 71  l that is.** req
11ea0 75 69 72 65 64 20 69 73 20 74 6f 20 63 61 6c 6c  uired is to call
11eb0 20 76 64 62 65 50 6d 61 52 65 61 64 65 72 4e 65   vdbePmaReaderNe
11ec0 78 74 28 29 20 6f 6e 20 65 61 63 68 20 50 6d 61  xt() on each Pma
11ed0 52 65 61 64 65 72 20 74 6f 20 70 6f 69 6e 74 20  Reader to point 
11ee0 69 74 20 61 74 0a 2a 2a 20 69 74 73 20 66 69 72  it at.** its fir
11ef0 73 74 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 4f 74  st key..**.** Ot
11f00 68 65 72 77 69 73 65 2c 20 69 66 20 65 4d 6f 64  herwise, if eMod
11f10 65 20 69 73 20 61 6e 79 20 76 61 6c 75 65 20 6f  e is any value o
11f20 74 68 65 72 20 74 68 61 6e 20 49 4e 43 52 49 4e  ther than INCRIN
11f30 49 54 5f 52 4f 4f 54 2c 20 74 68 65 6e 20 75 73  IT_ROOT, then us
11f40 65 20 0a 2a 2a 20 76 64 62 65 50 6d 61 52 65 61  e .** vdbePmaRea
11f50 64 65 72 49 6e 63 72 4d 65 72 67 65 49 6e 69 74  derIncrMergeInit
11f60 28 29 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  () to initialize
11f70 20 65 61 63 68 20 50 6d 61 52 65 61 64 65 72 20   each PmaReader 
11f80 74 68 61 74 20 66 65 65 64 73 20 64 61 74 61 20  that feeds data 
11f90 0a 2a 2a 20 74 6f 20 70 4d 65 72 67 65 72 2e 0a  .** to pMerger..
11fa0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
11fb0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
11fc0 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e  uccessful, or an
11fd0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
11fe0 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  de otherwise..*/
11ff0 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
12000 4d 65 72 67 65 45 6e 67 69 6e 65 49 6e 69 74 28  MergeEngineInit(
12010 0a 20 20 53 6f 72 74 53 75 62 74 61 73 6b 20 2a  .  SortSubtask *
12020 70 54 61 73 6b 2c 20 20 20 20 20 20 20 20 20 20  pTask,          
12030 20 20 20 2f 2a 20 54 68 72 65 61 64 20 74 68 61     /* Thread tha
12040 74 20 77 69 6c 6c 20 72 75 6e 20 70 4d 65 72 67  t will run pMerg
12050 65 72 20 2a 2f 0a 20 20 4d 65 72 67 65 45 6e 67  er */.  MergeEng
12060 69 6e 65 20 2a 70 4d 65 72 67 65 72 2c 20 20 20  ine *pMerger,   
12070 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 72 67 65          /* Merge
12080 45 6e 67 69 6e 65 20 74 6f 20 69 6e 69 74 69 61  Engine to initia
12090 6c 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4d  lize */.  int eM
120a0 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ode             
120b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
120c0 20 6f 66 20 74 68 65 20 49 4e 43 52 49 4e 49 54   of the INCRINIT
120d0 5f 58 58 58 20 63 6f 6e 73 74 61 6e 74 73 20 2a  _XXX constants *
120e0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
120f0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
12100 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
12110 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
12120 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
12140 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 50  r looping over P
12150 6d 61 52 65 61 64 65 72 20 6f 62 6a 65 63 74 73  maReader objects
12160 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 72 65 65 20   */.  int nTree 
12170 3d 20 70 4d 65 72 67 65 72 2d 3e 6e 54 72 65 65  = pMerger->nTree
12180 3b 0a 0a 20 20 2f 2a 20 65 4d 6f 64 65 20 69 73  ;..  /* eMode is
12190 20 61 6c 77 61 79 73 20 49 4e 43 52 49 4e 49 54   always INCRINIT
121a0 5f 4e 4f 52 4d 41 4c 20 69 6e 20 73 69 6e 67 6c  _NORMAL in singl
121b0 65 2d 74 68 72 65 61 64 65 64 20 6d 6f 64 65 20  e-threaded mode 
121c0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  */.  assert( SQL
121d0 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54  ITE_MAX_WORKER_T
121e0 48 52 45 41 44 53 3e 30 20 7c 7c 20 65 4d 6f 64  HREADS>0 || eMod
121f0 65 3d 3d 49 4e 43 52 49 4e 49 54 5f 4e 4f 52 4d  e==INCRINIT_NORM
12200 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69  AL );..  /* Veri
12210 66 79 20 74 68 61 74 20 74 68 65 20 4d 65 72 67  fy that the Merg
12220 65 45 6e 67 69 6e 65 20 69 73 20 61 73 73 69 67  eEngine is assig
12230 6e 65 64 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  ned to a single 
12240 74 68 72 65 61 64 20 2a 2f 0a 20 20 61 73 73 65  thread */.  asse
12250 72 74 28 20 70 4d 65 72 67 65 72 2d 3e 70 54 61  rt( pMerger->pTa
12260 73 6b 3d 3d 30 20 29 3b 0a 20 20 70 4d 65 72 67  sk==0 );.  pMerg
12270 65 72 2d 3e 70 54 61 73 6b 20 3d 20 70 54 61 73  er->pTask = pTas
12280 6b 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  k;..  for(i=0; i
12290 3c 6e 54 72 65 65 3b 20 69 2b 2b 29 7b 0a 20 20  <nTree; i++){.  
122a0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4d 41 58    if( SQLITE_MAX
122b0 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3e  _WORKER_THREADS>
122c0 30 20 26 26 20 65 4d 6f 64 65 3d 3d 49 4e 43 52  0 && eMode==INCR
122d0 49 4e 49 54 5f 52 4f 4f 54 20 29 7b 0a 20 20 20  INIT_ROOT ){.   
122e0 20 20 20 2f 2a 20 50 6d 61 52 65 61 64 65 72 73     /* PmaReaders
122f0 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 72 6d 61   should be norma
12300 6c 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  lly initialized 
12310 69 6e 20 6f 72 64 65 72 2c 20 61 73 20 69 66 20  in order, as if 
12320 74 68 65 79 20 61 72 65 0a 20 20 20 20 20 20 2a  they are.      *
12330 2a 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74  * reading from t
12340 68 65 20 73 61 6d 65 20 74 65 6d 70 20 66 69 6c  he same temp fil
12350 65 20 74 68 69 73 20 6d 61 6b 65 73 20 66 6f 72  e this makes for
12360 20 6d 6f 72 65 20 6c 69 6e 65 61 72 20 66 69 6c   more linear fil
12370 65 20 49 4f 2e 0a 20 20 20 20 20 20 2a 2a 20 48  e IO..      ** H
12380 6f 77 65 76 65 72 2c 20 69 6e 20 74 68 65 20 49  owever, in the I
12390 4e 43 52 49 4e 49 54 5f 52 4f 4f 54 20 63 61 73  NCRINIT_ROOT cas
123a0 65 2c 20 69 66 20 50 6d 61 52 65 61 64 65 72 20  e, if PmaReader 
123b0 61 52 65 61 64 72 5b 6e 54 61 73 6b 2d 31 5d 20  aReadr[nTask-1] 
123c0 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 75  is.      ** in u
123d0 73 65 20 69 74 20 77 69 6c 6c 20 62 6c 6f 63 6b  se it will block
123e0 20 74 68 65 20 76 64 62 65 50 6d 61 52 65 61 64   the vdbePmaRead
123f0 65 72 4e 65 78 74 28 29 20 63 61 6c 6c 20 77 68  erNext() call wh
12400 69 6c 65 20 69 74 20 75 73 65 73 0a 20 20 20 20  ile it uses.    
12410 20 20 2a 2a 20 74 68 65 20 6d 61 69 6e 20 74 68    ** the main th
12420 72 65 61 64 20 74 6f 20 66 69 6c 6c 20 69 74 73  read to fill its
12430 20 62 75 66 66 65 72 2e 20 53 6f 20 63 61 6c 6c   buffer. So call
12440 69 6e 67 20 50 6d 61 52 65 61 64 65 72 4e 65 78  ing PmaReaderNex
12450 74 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20  t().      ** on 
12460 74 68 69 73 20 50 6d 61 52 65 61 64 65 72 20 62  this PmaReader b
12470 65 66 6f 72 65 20 61 6e 79 20 6f 66 20 74 68 65  efore any of the
12480 20 6d 75 6c 74 69 2d 74 68 72 65 61 64 65 64 20   multi-threaded 
12490 50 6d 61 52 65 61 64 65 72 73 20 74 61 6b 65 73  PmaReaders takes
124a0 0a 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72  .      ** better
124b0 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 6d 75   advantage of mu
124c0 6c 74 69 2d 70 72 6f 63 65 73 73 6f 72 20 68 61  lti-processor ha
124d0 72 64 77 61 72 65 2e 20 2a 2f 0a 20 20 20 20 20  rdware. */.     
124e0 20 72 63 20 3d 20 76 64 62 65 50 6d 61 52 65 61   rc = vdbePmaRea
124f0 64 65 72 4e 65 78 74 28 26 70 4d 65 72 67 65 72  derNext(&pMerger
12500 2d 3e 61 52 65 61 64 72 5b 6e 54 72 65 65 2d 69  ->aReadr[nTree-i
12510 2d 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  -1]);.    }else{
12520 0a 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65  .      rc = vdbe
12530 50 6d 61 52 65 61 64 65 72 49 6e 63 72 49 6e 69  PmaReaderIncrIni
12540 74 28 26 70 4d 65 72 67 65 72 2d 3e 61 52 65 61  t(&pMerger->aRea
12550 64 72 5b 69 5d 2c 20 49 4e 43 52 49 4e 49 54 5f  dr[i], INCRINIT_
12560 4e 4f 52 4d 41 4c 29 3b 0a 20 20 20 20 7d 0a 20  NORMAL);.    }. 
12570 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
12580 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
12590 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 70  ;.  }..  for(i=p
125a0 4d 65 72 67 65 72 2d 3e 6e 54 72 65 65 2d 31 3b  Merger->nTree-1;
125b0 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   i>0; i--){.    
125c0 76 64 62 65 4d 65 72 67 65 45 6e 67 69 6e 65 43  vdbeMergeEngineC
125d0 6f 6d 70 61 72 65 28 70 4d 65 72 67 65 72 2c 20  ompare(pMerger, 
125e0 69 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  i);.  }.  return
125f0 20 70 54 61 73 6b 2d 3e 70 55 6e 70 61 63 6b 65   pTask->pUnpacke
12600 64 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a 2f  d->errCode;.}../
12610 2a 0a 2a 2a 20 54 68 65 20 50 6d 61 52 65 61 64  *.** The PmaRead
12620 65 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  er passed as the
12630 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
12640 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
12650 20 62 65 20 61 6e 0a 2a 2a 20 69 6e 63 72 65 6d   be an.** increm
12660 65 6e 74 61 6c 2d 72 65 61 64 65 72 20 28 70 52  ental-reader (pR
12670 65 61 64 72 2d 3e 70 49 6e 63 72 21 3d 30 29 2e  eadr->pIncr!=0).
12680 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
12690 65 72 76 65 73 20 74 6f 20 6f 70 65 6e 0a 2a 2a  erves to open.**
126a0 20 61 6e 64 2f 6f 72 20 69 6e 69 74 69 61 6c 69   and/or initiali
126b0 7a 65 20 74 68 65 20 74 65 6d 70 20 66 69 6c 65  ze the temp file
126c0 20 72 65 6c 61 74 65 64 20 66 69 65 6c 64 73 20   related fields 
126d0 6f 66 20 74 68 65 20 49 6e 63 72 4d 65 72 67 65  of the IncrMerge
126e0 0a 2a 2a 20 6f 62 6a 65 63 74 20 61 74 20 28 70  .** object at (p
126f0 52 65 61 64 72 2d 3e 70 49 6e 63 72 29 2e 0a 2a  Readr->pIncr)..*
12700 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  *.** If argument
12710 20 65 4d 6f 64 65 20 69 73 20 73 65 74 20 74 6f   eMode is set to
12720 20 49 4e 43 52 49 4e 49 54 5f 4e 4f 52 4d 41 4c   INCRINIT_NORMAL
12730 2c 20 74 68 65 6e 20 61 6c 6c 20 50 6d 61 52 65  , then all PmaRe
12740 61 64 65 72 73 0a 2a 2a 20 69 6e 20 74 68 65 20  aders.** in the 
12750 73 75 62 2d 74 72 65 65 20 68 65 61 64 65 64 20  sub-tree headed 
12760 62 79 20 70 52 65 61 64 72 20 61 72 65 20 61 6c  by pReadr are al
12770 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  so initialized. 
12780 44 61 74 61 20 69 73 20 74 68 65 6e 20 0a 2a 2a  Data is then .**
12790 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74 68 65   loaded into the
127a0 20 62 75 66 66 65 72 73 20 62 65 6c 6f 6e 67 69   buffers belongi
127b0 6e 67 20 74 6f 20 70 52 65 61 64 72 20 61 6e 64  ng to pReadr and
127c0 20 69 74 20 69 73 20 73 65 74 20 74 6f 20 70 6f   it is set to po
127d0 69 6e 74 20 74 6f 20 0a 2a 2a 20 74 68 65 20 66  int to .** the f
127e0 69 72 73 74 20 6b 65 79 20 69 6e 20 69 74 73 20  irst key in its 
127f0 72 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  range..**.** If 
12800 61 72 67 75 6d 65 6e 74 20 65 4d 6f 64 65 20 69  argument eMode i
12810 73 20 73 65 74 20 74 6f 20 49 4e 43 52 49 4e 49  s set to INCRINI
12820 54 5f 54 41 53 4b 2c 20 74 68 65 6e 20 70 52 65  T_TASK, then pRe
12830 61 64 72 20 69 73 20 67 75 61 72 61 6e 74 65 65  adr is guarantee
12840 64 0a 2a 2a 20 74 6f 20 62 65 20 61 20 6d 75 6c  d.** to be a mul
12850 74 69 2d 74 68 72 65 61 64 65 64 20 50 6d 61 52  ti-threaded PmaR
12860 65 61 64 65 72 20 61 6e 64 20 74 68 69 73 20 66  eader and this f
12870 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  unction is being
12880 20 63 61 6c 6c 65 64 20 69 6e 20 61 0a 2a 2a 20   called in a.** 
12890 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72 65 61  background threa
128a0 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
128b0 61 6c 6c 20 50 6d 61 52 65 61 64 65 72 73 20 69  all PmaReaders i
128c0 6e 20 74 68 65 20 73 75 62 2d 74 72 65 65 20 61  n the sub-tree a
128d0 72 65 20 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a  re .** initializ
128e0 65 64 20 61 73 20 66 6f 72 20 49 4e 43 52 49 4e  ed as for INCRIN
128f0 49 54 5f 4e 4f 52 4d 41 4c 20 61 6e 64 20 74 68  IT_NORMAL and th
12900 65 20 61 46 69 6c 65 5b 31 5d 20 62 75 66 66 65  e aFile[1] buffe
12910 72 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 0a 2a  r belonging to.*
12920 2a 20 70 52 65 61 64 72 20 69 73 20 70 6f 70 75  * pReadr is popu
12930 6c 61 74 65 64 2e 20 48 6f 77 65 76 65 72 2c 20  lated. However, 
12940 70 52 65 61 64 72 20 69 74 73 65 6c 66 20 69 73  pReadr itself is
12950 20 6e 6f 74 20 73 65 74 20 75 70 20 74 6f 20 70   not set up to p
12960 6f 69 6e 74 0a 2a 2a 20 74 6f 20 69 74 73 20 66  oint.** to its f
12970 69 72 73 74 20 6b 65 79 2e 20 41 20 63 61 6c 6c  irst key. A call
12980 20 74 6f 20 76 64 62 65 50 6d 61 52 65 61 64 65   to vdbePmaReade
12990 72 4e 65 78 74 28 29 20 69 73 20 73 74 69 6c 6c  rNext() is still
129a0 20 72 65 71 75 69 72 65 64 20 74 6f 20 64 6f 0a   required to do.
129b0 2a 2a 20 74 68 61 74 2e 20 0a 2a 2a 0a 2a 2a 20  ** that. .**.** 
129c0 54 68 65 20 72 65 61 73 6f 6e 20 74 68 69 73 20  The reason this 
129d0 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
129e0 74 20 63 61 6c 6c 20 76 64 62 65 50 6d 61 52 65  t call vdbePmaRe
129f0 61 64 65 72 4e 65 78 74 28 29 20 69 6d 6d 65 64  aderNext() immed
12a00 69 61 74 65 6c 79 20 0a 2a 2a 20 69 6e 20 74 68  iately .** in th
12a10 65 20 49 4e 43 52 49 4e 49 54 5f 54 41 53 4b 20  e INCRINIT_TASK 
12a20 63 61 73 65 20 69 73 20 74 68 61 74 20 76 64 62  case is that vdb
12a30 65 50 6d 61 52 65 61 64 65 72 4e 65 78 74 28 29  ePmaReaderNext()
12a40 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 69 74   assumes that it
12a50 20 68 61 73 0a 2a 2a 20 74 6f 20 62 6c 6f 63 6b   has.** to block
12a60 20 6f 6e 20 74 68 72 65 61 64 20 28 70 54 61 73   on thread (pTas
12a70 6b 2d 3e 74 68 72 65 61 64 29 20 62 65 66 6f 72  k->thread) befor
12a80 65 20 61 63 63 65 73 73 69 6e 67 20 61 46 69 6c  e accessing aFil
12a90 65 5b 31 5d 2e 20 42 75 74 2c 20 73 69 6e 63 65  e[1]. But, since
12aa0 0a 2a 2a 20 74 68 69 73 20 65 6e 74 69 72 65 20  .** this entire 
12ab0 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  function is bein
12ac0 67 20 72 75 6e 20 62 79 20 74 68 72 65 61 64 20  g run by thread 
12ad0 28 70 54 61 73 6b 2d 3e 74 68 72 65 61 64 29 2c  (pTask->thread),
12ae0 20 74 68 61 74 20 77 69 6c 6c 0a 2a 2a 20 6c 65   that will.** le
12af0 61 64 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ad to the curren
12b00 74 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72  t background thr
12b10 65 61 64 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ead attempting t
12b20 6f 20 6a 6f 69 6e 20 69 74 73 65 6c 66 2e 0a 2a  o join itself..*
12b30 2a 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66  *.** Finally, if
12b40 20 61 72 67 75 6d 65 6e 74 20 65 4d 6f 64 65 20   argument eMode 
12b50 69 73 20 73 65 74 20 74 6f 20 49 4e 43 52 49 4e  is set to INCRIN
12b60 49 54 5f 52 4f 4f 54 2c 20 69 74 20 6d 61 79 20  IT_ROOT, it may 
12b70 62 65 20 61 73 73 75 6d 65 64 0a 2a 2a 20 74 68  be assumed.** th
12b80 61 74 20 70 52 65 61 64 72 2d 3e 70 49 6e 63 72  at pReadr->pIncr
12b90 20 69 73 20 61 20 6d 75 6c 74 69 2d 74 68 72 65   is a multi-thre
12ba0 61 64 65 64 20 49 6e 63 72 4d 65 72 67 65 20 6f  aded IncrMerge o
12bb0 62 6a 65 63 74 73 2c 20 61 6e 64 20 74 68 61 74  bjects, and that
12bc0 20 61 6c 6c 0a 2a 2a 20 63 68 69 6c 64 2d 74 72   all.** child-tr
12bd0 65 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  ees have already
12be0 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65   been initialize
12bf0 64 20 75 73 69 6e 67 20 49 6e 63 72 49 6e 69 74  d using IncrInit
12c00 28 49 4e 43 52 49 4e 49 54 5f 54 41 53 4b 29 2e  (INCRINIT_TASK).
12c10 0a 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65  .** In this case
12c20 20 76 64 62 65 50 6d 61 52 65 61 64 65 72 4e 65   vdbePmaReaderNe
12c30 78 74 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  xt() is called o
12c40 6e 20 61 6c 6c 20 63 68 69 6c 64 20 50 6d 61 52  n all child PmaR
12c50 65 61 64 65 72 73 20 61 6e 64 0a 2a 2a 20 74 68  eaders and.** th
12c60 65 20 63 75 72 72 65 6e 74 20 50 6d 61 52 65 61  e current PmaRea
12c70 64 65 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74  der set to point
12c80 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 6b 65   to the first ke
12c90 79 20 69 6e 20 69 74 73 20 72 61 6e 67 65 2e 0a  y in its range..
12ca0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
12cb0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
12cc0 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e  uccessful, or an
12cd0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
12ce0 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  de otherwise..*/
12cf0 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
12d00 50 6d 61 52 65 61 64 65 72 49 6e 63 72 4d 65 72  PmaReaderIncrMer
12d10 67 65 49 6e 69 74 28 50 6d 61 52 65 61 64 65 72  geInit(PmaReader
12d20 20 2a 70 52 65 61 64 72 2c 20 69 6e 74 20 65 4d   *pReadr, int eM
12d30 6f 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ode){.  int rc =
12d40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 49 6e   SQLITE_OK;.  In
12d50 63 72 4d 65 72 67 65 72 20 2a 70 49 6e 63 72 20  crMerger *pIncr 
12d60 3d 20 70 52 65 61 64 72 2d 3e 70 49 6e 63 72 3b  = pReadr->pIncr;
12d70 0a 20 20 53 6f 72 74 53 75 62 74 61 73 6b 20 2a  .  SortSubtask *
12d80 70 54 61 73 6b 20 3d 20 70 49 6e 63 72 2d 3e 70  pTask = pIncr->p
12d90 54 61 73 6b 3b 0a 20 20 73 71 6c 69 74 65 33 20  Task;.  sqlite3 
12da0 2a 64 62 20 3d 20 70 54 61 73 6b 2d 3e 70 53 6f  *db = pTask->pSo
12db0 72 74 65 72 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  rter->db;..  /* 
12dc0 65 4d 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20  eMode is always 
12dd0 49 4e 43 52 49 4e 49 54 5f 4e 4f 52 4d 41 4c 20  INCRINIT_NORMAL 
12de0 69 6e 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64  in single-thread
12df0 65 64 20 6d 6f 64 65 20 2a 2f 0a 20 20 61 73 73  ed mode */.  ass
12e00 65 72 74 28 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ert( SQLITE_MAX_
12e10 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3e 30  WORKER_THREADS>0
12e20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 49 4e 43 52 49   || eMode==INCRI
12e30 4e 49 54 5f 4e 4f 52 4d 41 4c 20 29 3b 0a 0a 20  NIT_NORMAL );.. 
12e40 20 72 63 20 3d 20 76 64 62 65 4d 65 72 67 65 45   rc = vdbeMergeE
12e50 6e 67 69 6e 65 49 6e 69 74 28 70 54 61 73 6b 2c  ngineInit(pTask,
12e60 20 70 49 6e 63 72 2d 3e 70 4d 65 72 67 65 72 2c   pIncr->pMerger,
12e70 20 65 4d 6f 64 65 29 3b 0a 0a 20 20 2f 2a 20 53   eMode);..  /* S
12e80 65 74 20 75 70 20 74 68 65 20 72 65 71 75 69 72  et up the requir
12e90 65 64 20 66 69 6c 65 73 20 66 6f 72 20 70 49 6e  ed files for pIn
12ea0 63 72 2e 20 41 20 6d 75 6c 74 69 2d 74 68 65 61  cr. A multi-thea
12eb0 64 65 64 20 49 6e 63 72 4d 65 72 67 65 20 6f 62  ded IncrMerge ob
12ec0 6a 65 63 74 0a 20 20 2a 2a 20 72 65 71 75 69 72  ject.  ** requir
12ed0 65 73 20 74 77 6f 20 74 65 6d 70 20 66 69 6c 65  es two temp file
12ee0 73 20 74 6f 20 69 74 73 65 6c 66 2c 20 77 68 65  s to itself, whe
12ef0 72 65 61 73 20 61 20 73 69 6e 67 6c 65 2d 74 68  reas a single-th
12f00 72 65 61 64 65 64 20 6f 62 6a 65 63 74 0a 20 20  readed object.  
12f10 2a 2a 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 73  ** only requires
12f20 20 61 20 72 65 67 69 6f 6e 20 6f 66 20 70 54 61   a region of pTa
12f30 73 6b 2d 3e 66 69 6c 65 32 2e 20 2a 2f 0a 20 20  sk->file2. */.  
12f40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
12f50 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 78 53  K ){.    int mxS
12f60 7a 20 3d 20 70 49 6e 63 72 2d 3e 6d 78 53 7a 3b  z = pIncr->mxSz;
12f70 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
12f80 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3e 30  WORKER_THREADS>0
12f90 0a 20 20 20 20 69 66 28 20 70 49 6e 63 72 2d 3e  .    if( pIncr->
12fa0 62 55 73 65 54 68 72 65 61 64 20 29 7b 0a 20 20  bUseThread ){.  
12fb0 20 20 20 20 72 63 20 3d 20 76 64 62 65 53 6f 72      rc = vdbeSor
12fc0 74 65 72 4f 70 65 6e 54 65 6d 70 46 69 6c 65 28  terOpenTempFile(
12fd0 64 62 2c 20 6d 78 53 7a 2c 20 26 70 49 6e 63 72  db, mxSz, &pIncr
12fe0 2d 3e 61 46 69 6c 65 5b 30 5d 2e 70 46 64 29 3b  ->aFile[0].pFd);
12ff0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
13000 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13010 20 20 20 20 72 63 20 3d 20 76 64 62 65 53 6f 72      rc = vdbeSor
13020 74 65 72 4f 70 65 6e 54 65 6d 70 46 69 6c 65 28  terOpenTempFile(
13030 64 62 2c 20 6d 78 53 7a 2c 20 26 70 49 6e 63 72  db, mxSz, &pIncr
13040 2d 3e 61 46 69 6c 65 5b 31 5d 2e 70 46 64 29 3b  ->aFile[1].pFd);
13050 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
13060 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a  se.#endif.    /*
13070 69 66 28 20 21 70 49 6e 63 72 2d 3e 62 55 73 65  if( !pIncr->bUse
13080 54 68 72 65 61 64 20 29 2a 2f 7b 0a 20 20 20 20  Thread )*/{.    
13090 20 20 69 66 28 20 70 54 61 73 6b 2d 3e 66 69 6c    if( pTask->fil
130a0 65 32 2e 70 46 64 3d 3d 30 20 29 7b 0a 20 20 20  e2.pFd==0 ){.   
130b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
130c0 73 6b 2d 3e 66 69 6c 65 32 2e 69 45 6f 66 3e 30  sk->file2.iEof>0
130d0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
130e0 20 76 64 62 65 53 6f 72 74 65 72 4f 70 65 6e 54   vdbeSorterOpenT
130f0 65 6d 70 46 69 6c 65 28 64 62 2c 20 70 54 61 73  empFile(db, pTas
13100 6b 2d 3e 66 69 6c 65 32 2e 69 45 6f 66 2c 20 26  k->file2.iEof, &
13110 70 54 61 73 6b 2d 3e 66 69 6c 65 32 2e 70 46 64  pTask->file2.pFd
13120 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 73 6b  );.        pTask
13130 2d 3e 66 69 6c 65 32 2e 69 45 6f 66 20 3d 20 30  ->file2.iEof = 0
13140 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13150 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
13160 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  K ){.        pIn
13170 63 72 2d 3e 61 46 69 6c 65 5b 31 5d 2e 70 46 64  cr->aFile[1].pFd
13180 20 3d 20 70 54 61 73 6b 2d 3e 66 69 6c 65 32 2e   = pTask->file2.
13190 70 46 64 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  pFd;.        pIn
131a0 63 72 2d 3e 69 53 74 61 72 74 4f 66 66 20 3d 20  cr->iStartOff = 
131b0 70 54 61 73 6b 2d 3e 66 69 6c 65 32 2e 69 45 6f  pTask->file2.iEo
131c0 66 3b 0a 20 20 20 20 20 20 20 20 70 54 61 73 6b  f;.        pTask
131d0 2d 3e 66 69 6c 65 32 2e 69 45 6f 66 20 2b 3d 20  ->file2.iEof += 
131e0 6d 78 53 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mxSz;.      }.  
131f0 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c    }.  }..#if SQL
13200 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54  ITE_MAX_WORKER_T
13210 48 52 45 41 44 53 3e 30 0a 20 20 69 66 28 20 72  HREADS>0.  if( r
13220 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
13230 70 49 6e 63 72 2d 3e 62 55 73 65 54 68 72 65 61  pIncr->bUseThrea
13240 64 20 29 7b 0a 20 20 20 20 2f 2a 20 55 73 65 20  d ){.    /* Use 
13250 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
13260 61 64 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 61  ad to populate a
13270 46 69 6c 65 5b 31 5d 2c 20 65 76 65 6e 20 74 68  File[1], even th
13280 6f 75 67 68 20 74 68 69 73 0a 20 20 20 20 2a 2a  ough this.    **
13290 20 50 6d 61 52 65 61 64 65 72 20 69 73 20 6d 75   PmaReader is mu
132a0 6c 74 69 2d 74 68 72 65 61 64 65 64 2e 20 49 66  lti-threaded. If
132b0 20 74 68 69 73 20 69 73 20 61 6e 20 49 4e 43 52   this is an INCR
132c0 49 4e 49 54 5f 54 41 53 4b 20 6f 62 6a 65 63 74  INIT_TASK object
132d0 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
132e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
132f0 6c 72 65 61 64 79 20 72 75 6e 6e 69 6e 67 20 69  lready running i
13300 6e 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72  n background thr
13310 65 61 64 20 0a 20 20 20 20 2a 2a 20 70 49 6e 63  ead .    ** pInc
13320 72 2d 3e 70 54 61 73 6b 2d 3e 74 68 72 65 61 64  r->pTask->thread
13330 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
13340 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
13350 49 4e 43 52 49 4e 49 54 5f 52 4f 4f 54 20 6f 62  INCRINIT_ROOT ob
13360 6a 65 63 74 2c 20 74 68 65 6e 20 69 74 20 69 73  ject, then it is
13370 20 72 75 6e 6e 69 6e 67 20 69 6e 20 74 68 65 20   running in the 
13380 0a 20 20 20 20 2a 2a 20 6d 61 69 6e 20 56 44 42  .    ** main VDB
13390 45 20 74 68 72 65 61 64 2e 20 42 75 74 20 74 68  E thread. But th
133a0 61 74 20 69 73 20 4f 6b 2c 20 61 73 20 74 68 61  at is Ok, as tha
133b0 74 20 74 68 72 65 61 64 20 63 61 6e 6e 6f 74 20  t thread cannot 
133c0 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 63 6f  return.    ** co
133d0 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 56 44 42  ntrol to the VDB
133e0 45 20 6f 72 20 70 72 6f 63 65 65 64 20 77 69 74  E or proceed wit
133f0 68 20 61 6e 79 74 68 69 6e 67 20 75 73 65 66 75  h anything usefu
13400 6c 20 75 6e 74 69 6c 20 74 68 65 20 0a 20 20 20  l until the .   
13410 20 2a 2a 20 66 69 72 73 74 20 72 65 73 75 6c 74   ** first result
13420 73 20 61 72 65 20 72 65 61 64 79 20 66 72 6f 6d  s are ready from
13430 20 74 68 69 73 20 6d 65 72 67 65 72 20 6f 62 6a   this merger obj
13440 65 63 74 20 61 6e 79 77 61 79 2e 0a 20 20 20 20  ect anyway..    
13450 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  */.    assert( e
13460 4d 6f 64 65 3d 3d 49 4e 43 52 49 4e 49 54 5f 52  Mode==INCRINIT_R
13470 4f 4f 54 20 7c 7c 20 65 4d 6f 64 65 3d 3d 49 4e  OOT || eMode==IN
13480 43 52 49 4e 49 54 5f 54 41 53 4b 20 29 3b 0a 20  CRINIT_TASK );. 
13490 20 20 20 72 63 20 3d 20 76 64 62 65 49 6e 63 72     rc = vdbeIncr
134a0 50 6f 70 75 6c 61 74 65 28 70 49 6e 63 72 29 3b  Populate(pIncr);
134b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
134c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
134d0 20 26 26 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f   && (SQLITE_MAX_
134e0 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3d 3d  WORKER_THREADS==
134f0 30 20 7c 7c 20 65 4d 6f 64 65 21 3d 49 4e 43 52  0 || eMode!=INCR
13500 49 4e 49 54 5f 54 41 53 4b 29 20 29 7b 0a 20 20  INIT_TASK) ){.  
13510 20 20 72 63 20 3d 20 76 64 62 65 50 6d 61 52 65    rc = vdbePmaRe
13520 61 64 65 72 4e 65 78 74 28 70 52 65 61 64 72 29  aderNext(pReadr)
13530 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
13540 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  rc;.}..#if SQLIT
13550 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
13560 45 41 44 53 3e 30 0a 2f 2a 0a 2a 2a 20 54 68 65  EADS>0./*.** The
13570 20 6d 61 69 6e 20 72 6f 75 74 69 6e 65 20 66 6f   main routine fo
13580 72 20 76 64 62 65 50 6d 61 52 65 61 64 65 72 49  r vdbePmaReaderI
13590 6e 63 72 4d 65 72 67 65 49 6e 69 74 28 29 20 6f  ncrMergeInit() o
135a0 70 65 72 61 74 69 6f 6e 73 20 72 75 6e 20 69 6e  perations run in
135b0 20 0a 2a 2a 20 62 61 63 6b 67 72 6f 75 6e 64 20   .** background 
135c0 74 68 72 65 61 64 73 2e 0a 2a 2f 0a 73 74 61 74  threads..*/.stat
135d0 69 63 20 76 6f 69 64 20 2a 76 64 62 65 50 6d 61  ic void *vdbePma
135e0 52 65 61 64 65 72 42 67 49 6e 63 72 49 6e 69 74  ReaderBgIncrInit
135f0 28 76 6f 69 64 20 2a 70 43 74 78 29 7b 0a 20 20  (void *pCtx){.  
13600 50 6d 61 52 65 61 64 65 72 20 2a 70 52 65 61 64  PmaReader *pRead
13610 65 72 20 3d 20 28 50 6d 61 52 65 61 64 65 72 2a  er = (PmaReader*
13620 29 70 43 74 78 3b 0a 20 20 76 6f 69 64 20 2a 70  )pCtx;.  void *p
13630 52 65 74 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  Ret = SQLITE_INT
13640 5f 54 4f 5f 50 54 52 28 0a 20 20 20 20 20 20 20  _TO_PTR(.       
13650 20 20 20 20 20 20 20 20 20 20 20 76 64 62 65 50             vdbeP
13660 6d 61 52 65 61 64 65 72 49 6e 63 72 4d 65 72 67  maReaderIncrMerg
13670 65 49 6e 69 74 28 70 52 65 61 64 65 72 2c 49 4e  eInit(pReader,IN
13680 43 52 49 4e 49 54 5f 54 41 53 4b 29 0a 20 20 20  CRINIT_TASK).   
13690 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20              );. 
136a0 20 70 52 65 61 64 65 72 2d 3e 70 49 6e 63 72 2d   pReader->pIncr-
136b0 3e 70 54 61 73 6b 2d 3e 62 44 6f 6e 65 20 3d 20  >pTask->bDone = 
136c0 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  1;.  return pRet
136d0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
136e0 2a 20 49 66 20 74 68 65 20 50 6d 61 52 65 61 64  * If the PmaRead
136f0 65 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  er passed as the
13700 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
13710 69 73 20 6e 6f 74 20 61 6e 20 69 6e 63 72 65 6d  is not an increm
13720 65 6e 74 61 6c 2d 72 65 61 64 65 72 0a 2a 2a 20  ental-reader.** 
13730 28 69 66 20 70 52 65 61 64 72 2d 3e 70 49 6e 63  (if pReadr->pInc
13740 72 3d 3d 30 29 2c 20 74 68 65 6e 20 74 68 69 73  r==0), then this
13750 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
13760 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  o-op. Otherwise,
13770 20 69 74 20 69 6e 76 6f 6b 65 73 0a 2a 2a 20 74   it invokes.** t
13780 68 65 20 76 64 62 65 50 6d 61 52 65 61 64 65 72  he vdbePmaReader
13790 49 6e 63 72 4d 65 72 67 65 49 6e 69 74 28 29 20  IncrMergeInit() 
137a0 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68  function with th
137b0 65 20 70 61 72 61 6d 65 74 65 72 73 20 70 61 73  e parameters pas
137c0 73 65 64 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72  sed to.** this r
137d0 6f 75 74 69 6e 65 20 74 6f 20 69 6e 69 74 69 61  outine to initia
137e0 6c 69 7a 65 20 74 68 65 20 69 6e 63 72 65 6d 65  lize the increme
137f0 6e 74 61 6c 20 6d 65 72 67 65 2e 0a 2a 2a 20 0a  ntal merge..** .
13800 2a 2a 20 49 66 20 74 68 65 20 49 6e 63 72 4d 65  ** If the IncrMe
13810 72 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 6d  rger object is m
13820 75 6c 74 69 2d 74 68 72 65 61 64 65 64 20 28 49  ulti-threaded (I
13830 6e 63 72 4d 65 72 67 65 72 2e 62 55 73 65 54 68  ncrMerger.bUseTh
13840 72 65 61 64 3d 3d 31 29 2c 20 0a 2a 2a 20 74 68  read==1), .** th
13850 65 6e 20 61 20 62 61 63 6b 67 72 6f 75 6e 64 20  en a background 
13860 74 68 72 65 61 64 20 69 73 20 6c 61 75 6e 63 68  thread is launch
13870 65 64 20 74 6f 20 63 61 6c 6c 20 76 64 62 65 50  ed to call vdbeP
13880 6d 61 52 65 61 64 65 72 49 6e 63 72 4d 65 72 67  maReaderIncrMerg
13890 65 49 6e 69 74 28 29 2e 0a 2a 2a 20 4f 72 2c 20  eInit()..** Or, 
138a0 69 66 20 74 68 65 20 49 6e 63 72 4d 65 72 67 65  if the IncrMerge
138b0 72 20 69 73 20 73 69 6e 67 6c 65 20 74 68 72 65  r is single thre
138c0 61 64 65 64 2c 20 74 68 65 20 73 61 6d 65 20 66  aded, the same f
138d0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
138e0 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 63  d.** using the c
138f0 75 72 72 65 6e 74 20 74 68 72 65 61 64 2e 0a 2a  urrent thread..*
13900 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
13910 65 50 6d 61 52 65 61 64 65 72 49 6e 63 72 49 6e  ePmaReaderIncrIn
13920 69 74 28 50 6d 61 52 65 61 64 65 72 20 2a 70 52  it(PmaReader *pR
13930 65 61 64 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29  eadr, int eMode)
13940 7b 0a 20 20 49 6e 63 72 4d 65 72 67 65 72 20 2a  {.  IncrMerger *
13950 70 49 6e 63 72 20 3d 20 70 52 65 61 64 72 2d 3e  pIncr = pReadr->
13960 70 49 6e 63 72 3b 20 20 20 2f 2a 20 49 6e 63 72  pIncr;   /* Incr
13970 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 72 20 2a  emental merger *
13980 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
13990 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
139a0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
139b0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 66 28  rn code */.  if(
139c0 20 70 49 6e 63 72 20 29 7b 0a 23 69 66 20 53 51   pIncr ){.#if SQ
139d0 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f  LITE_MAX_WORKER_
139e0 54 48 52 45 41 44 53 3e 30 0a 20 20 20 20 61 73  THREADS>0.    as
139f0 73 65 72 74 28 20 70 49 6e 63 72 2d 3e 62 55 73  sert( pIncr->bUs
13a00 65 54 68 72 65 61 64 3d 3d 30 20 7c 7c 20 65 4d  eThread==0 || eM
13a10 6f 64 65 3d 3d 49 4e 43 52 49 4e 49 54 5f 54 41  ode==INCRINIT_TA
13a20 53 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  SK );.    if( pI
13a30 6e 63 72 2d 3e 62 55 73 65 54 68 72 65 61 64 20  ncr->bUseThread 
13a40 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  ){.      void *p
13a50 43 74 78 20 3d 20 28 76 6f 69 64 2a 29 70 52 65  Ctx = (void*)pRe
13a60 61 64 72 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  adr;.      rc = 
13a70 76 64 62 65 53 6f 72 74 65 72 43 72 65 61 74 65  vdbeSorterCreate
13a80 54 68 72 65 61 64 28 70 49 6e 63 72 2d 3e 70 54  Thread(pIncr->pT
13a90 61 73 6b 2c 20 76 64 62 65 50 6d 61 52 65 61 64  ask, vdbePmaRead
13aa0 65 72 42 67 49 6e 63 72 49 6e 69 74 2c 20 70 43  erBgIncrInit, pC
13ab0 74 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23  tx);.    }else.#
13ac0 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20  endif.    {.    
13ad0 20 20 72 63 20 3d 20 76 64 62 65 50 6d 61 52 65    rc = vdbePmaRe
13ae0 61 64 65 72 49 6e 63 72 4d 65 72 67 65 49 6e 69  aderIncrMergeIni
13af0 74 28 70 52 65 61 64 72 2c 20 65 4d 6f 64 65 29  t(pReadr, eMode)
13b00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
13b10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
13b20 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
13b30 20 4d 65 72 67 65 45 6e 67 69 6e 65 20 6f 62 6a   MergeEngine obj
13b40 65 63 74 20 74 6f 20 6d 65 72 67 65 20 74 68 65  ect to merge the
13b50 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 6e 50 4d   contents of nPM
13b60 41 20 6c 65 76 65 6c 2d 30 0a 2a 2a 20 50 4d 41  A level-0.** PMA
13b70 73 20 66 72 6f 6d 20 70 54 61 73 6b 2d 3e 66 69  s from pTask->fi
13b80 6c 65 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20  le. If no error 
13b90 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70 4f  occurs, set *ppO
13ba0 75 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a  ut to point to.*
13bb0 2a 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  * the new object
13bc0 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
13bd0 54 45 5f 4f 4b 2e 20 4f 72 2c 20 69 66 20 61 6e  TE_OK. Or, if an
13be0 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75   error does occu
13bf0 72 2c 20 73 65 74 20 2a 70 70 4f 75 74 0a 2a 2a  r, set *ppOut.**
13c00 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 72 65 74   to NULL and ret
13c10 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
13c20 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
13c30 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
13c40 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70  on is called, *p
13c50 69 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74  iOffset is set t
13c60 6f 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20  o the offset of 
13c70 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 50 4d 41  the.** first PMA
13c80 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 70 54   to read from pT
13c90 61 73 6b 2d 3e 66 69 6c 65 2e 20 41 73 73 75 6d  ask->file. Assum
13ca0 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  ing no error occ
13cb0 75 72 73 2c 20 69 74 20 69 73 20 0a 2a 2a 20 73  urs, it is .** s
13cc0 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  et to the offset
13cd0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
13ce0 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
13cf0 62 79 74 65 20 6f 66 20 74 68 65 20 6c 61 73 74  byte of the last
13d00 0a 2a 2a 20 50 4d 41 20 62 65 66 6f 72 65 20 72  .** PMA before r
13d10 65 74 75 72 6e 69 6e 67 2e 20 49 66 20 61 6e 20  eturning. If an 
13d20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72  error does occur
13d30 2c 20 74 68 65 6e 20 74 68 65 20 66 69 6e 61 6c  , then the final
13d40 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 2a 70 69   value of.** *pi
13d50 4f 66 66 73 65 74 20 69 73 20 75 6e 64 65 66 69  Offset is undefi
13d60 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
13d70 6e 74 20 76 64 62 65 4d 65 72 67 65 45 6e 67 69  nt vdbeMergeEngi
13d80 6e 65 4c 65 76 65 6c 30 28 0a 20 20 53 6f 72 74  neLevel0(.  Sort
13d90 53 75 62 74 61 73 6b 20 2a 70 54 61 73 6b 2c 20  Subtask *pTask, 
13da0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
13db0 6f 72 74 65 72 20 74 61 73 6b 20 74 6f 20 72 65  orter task to re
13dc0 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ad from */.  int
13dd0 20 6e 50 4d 41 2c 20 20 20 20 20 20 20 20 20 20   nPMA,          
13de0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13df0 4e 75 6d 62 65 72 20 6f 66 20 50 4d 41 73 20 74  Number of PMAs t
13e00 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 36 34 20  o read */.  i64 
13e10 2a 70 69 4f 66 66 73 65 74 2c 20 20 20 20 20 20  *piOffset,      
13e20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
13e30 4e 2f 4f 55 54 3a 20 52 65 61 64 72 20 6f 66 66  N/OUT: Readr off
13e40 73 65 74 20 69 6e 20 70 54 61 73 6b 2d 3e 66 69  set in pTask->fi
13e50 6c 65 20 2a 2f 0a 20 20 4d 65 72 67 65 45 6e 67  le */.  MergeEng
13e60 69 6e 65 20 2a 2a 70 70 4f 75 74 20 20 20 20 20  ine **ppOut     
13e70 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
13e80 4e 65 77 20 6d 65 72 67 65 2d 65 6e 67 69 6e 65  New merge-engine
13e90 20 2a 2f 0a 29 7b 0a 20 20 4d 65 72 67 65 45 6e   */.){.  MergeEn
13ea0 67 69 6e 65 20 2a 70 4e 65 77 3b 20 20 20 20 20  gine *pNew;     
13eb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 72 67           /* Merg
13ec0 65 20 65 6e 67 69 6e 65 20 74 6f 20 72 65 74 75  e engine to retu
13ed0 72 6e 20 2a 2f 0a 20 20 69 36 34 20 69 4f 66 66  rn */.  i64 iOff
13ee0 20 3d 20 2a 70 69 4f 66 66 73 65 74 3b 0a 20 20   = *piOffset;.  
13ef0 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20  int i;.  int rc 
13f00 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
13f10 2a 70 70 4f 75 74 20 3d 20 70 4e 65 77 20 3d 20  *ppOut = pNew = 
13f20 76 64 62 65 4d 65 72 67 65 45 6e 67 69 6e 65 4e  vdbeMergeEngineN
13f30 65 77 28 6e 50 4d 41 29 3b 0a 20 20 69 66 28 20  ew(nPMA);.  if( 
13f40 70 4e 65 77 3d 3d 30 20 29 20 72 63 20 3d 20 53  pNew==0 ) rc = S
13f50 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20  QLITE_NOMEM;..  
13f60 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 4d 41 20  for(i=0; i<nPMA 
13f70 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
13f80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 36 34 20  ; i++){.    i64 
13f90 6e 44 75 6d 6d 79 3b 0a 20 20 20 20 50 6d 61 52  nDummy;.    PmaR
13fa0 65 61 64 65 72 20 2a 70 52 65 61 64 72 20 3d 20  eader *pReadr = 
13fb0 26 70 4e 65 77 2d 3e 61 52 65 61 64 72 5b 69 5d  &pNew->aReadr[i]
13fc0 3b 0a 20 20 20 20 72 63 20 3d 20 76 64 62 65 50  ;.    rc = vdbeP
13fd0 6d 61 52 65 61 64 65 72 49 6e 69 74 28 70 54 61  maReaderInit(pTa
13fe0 73 6b 2c 20 26 70 54 61 73 6b 2d 3e 66 69 6c 65  sk, &pTask->file
13ff0 2c 20 69 4f 66 66 2c 20 70 52 65 61 64 72 2c 20  , iOff, pReadr, 
14000 26 6e 44 75 6d 6d 79 29 3b 0a 20 20 20 20 69 4f  &nDummy);.    iO
14010 66 66 20 3d 20 70 52 65 61 64 72 2d 3e 69 45 6f  ff = pReadr->iEo
14020 66 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  f;.  }..  if( rc
14030 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14040 20 20 20 76 64 62 65 4d 65 72 67 65 45 6e 67 69     vdbeMergeEngi
14050 6e 65 46 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  neFree(pNew);.  
14060 20 20 2a 70 70 4f 75 74 20 3d 20 30 3b 0a 20 20    *ppOut = 0;.  
14070 7d 0a 20 20 2a 70 69 4f 66 66 73 65 74 20 3d 20  }.  *piOffset = 
14080 69 4f 66 66 3b 0a 20 20 72 65 74 75 72 6e 20 72  iOff;.  return r
14090 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
140a0 72 6e 20 74 68 65 20 64 65 70 74 68 20 6f 66 20  rn the depth of 
140b0 61 20 74 72 65 65 20 63 6f 6d 70 72 69 73 69 6e  a tree comprisin
140c0 67 20 6e 50 4d 41 20 50 4d 41 73 2c 20 61 73 73  g nPMA PMAs, ass
140d0 75 6d 69 6e 67 20 61 20 66 61 6e 6f 75 74 20 6f  uming a fanout o
140e0 66 0a 2a 2a 20 53 4f 52 54 45 52 5f 4d 41 58 5f  f.** SORTER_MAX_
140f0 4d 45 52 47 45 5f 43 4f 55 4e 54 2e 20 54 68 65  MERGE_COUNT. The
14100 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
14110 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65  does not include
14120 20 6c 65 61 66 20 6e 6f 64 65 73 2e 0a 2a 2a 0a   leaf nodes..**.
14130 2a 2a 20 69 2e 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  ** i.e..**.**   
14140 6e 50 4d 41 3c 3d 31 36 20 20 20 20 2d 3e 20 54  nPMA<=16    -> T
14150 72 65 65 44 65 70 74 68 28 29 20 3d 3d 20 30 0a  reeDepth() == 0.
14160 2a 2a 20 20 20 6e 50 4d 41 3c 3d 32 35 36 20 20  **   nPMA<=256  
14170 20 2d 3e 20 54 72 65 65 44 65 70 74 68 28 29 20   -> TreeDepth() 
14180 3d 3d 20 31 0a 2a 2a 20 20 20 6e 50 4d 41 3c 3d  == 1.**   nPMA<=
14190 36 35 35 33 36 20 2d 3e 20 54 72 65 65 44 65 70  65536 -> TreeDep
141a0 74 68 28 29 20 3d 3d 20 32 0a 2a 2f 0a 73 74 61  th() == 2.*/.sta
141b0 74 69 63 20 69 6e 74 20 76 64 62 65 53 6f 72 74  tic int vdbeSort
141c0 65 72 54 72 65 65 44 65 70 74 68 28 69 6e 74 20  erTreeDepth(int 
141d0 6e 50 4d 41 29 7b 0a 20 20 69 6e 74 20 6e 44 65  nPMA){.  int nDe
141e0 70 74 68 20 3d 20 30 3b 0a 20 20 69 36 34 20 6e  pth = 0;.  i64 n
141f0 44 69 76 20 3d 20 53 4f 52 54 45 52 5f 4d 41 58  Div = SORTER_MAX
14200 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 3b 0a 20 20  _MERGE_COUNT;.  
14210 77 68 69 6c 65 28 20 6e 44 69 76 20 3c 20 28 69  while( nDiv < (i
14220 36 34 29 6e 50 4d 41 20 29 7b 0a 20 20 20 20 6e  64)nPMA ){.    n
14230 44 69 76 20 3d 20 6e 44 69 76 20 2a 20 53 4f 52  Div = nDiv * SOR
14240 54 45 52 5f 4d 41 58 5f 4d 45 52 47 45 5f 43 4f  TER_MAX_MERGE_CO
14250 55 4e 54 3b 0a 20 20 20 20 6e 44 65 70 74 68 2b  UNT;.    nDepth+
14260 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
14270 6e 44 65 70 74 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nDepth;.}../*.**
14280 20 70 52 6f 6f 74 20 69 73 20 74 68 65 20 72 6f   pRoot is the ro
14290 6f 74 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65  ot of an increme
142a0 6e 74 61 6c 20 6d 65 72 67 65 2d 74 72 65 65 20  ntal merge-tree 
142b0 77 69 74 68 20 64 65 70 74 68 20 6e 44 65 70 74  with depth nDept
142c0 68 20 28 61 63 63 6f 72 64 69 6e 67 0a 2a 2a 20  h (according.** 
142d0 74 6f 20 76 64 62 65 53 6f 72 74 65 72 54 72 65  to vdbeSorterTre
142e0 65 44 65 70 74 68 28 29 29 2e 20 70 4c 65 61 66  eDepth()). pLeaf
142f0 20 69 73 20 74 68 65 20 69 53 65 71 27 74 68 20   is the iSeq'th 
14300 6c 65 61 66 20 74 6f 20 62 65 20 61 64 64 65 64  leaf to be added
14310 20 74 6f 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c   to the.** tree,
14320 20 63 6f 75 6e 74 69 6e 67 20 66 72 6f 6d 20 7a   counting from z
14330 65 72 6f 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ero. This functi
14340 6f 6e 20 61 64 64 73 20 70 4c 65 61 66 20 74 6f  on adds pLeaf to
14350 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a   the tree..**.**
14360 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
14370 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
14380 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72  urned. If an err
14390 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51  or occurs, an SQ
143a0 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  Lite error.** co
143b0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
143c0 6e 64 20 70 4c 65 61 66 20 69 73 20 66 72 65 65  nd pLeaf is free
143d0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
143e0 20 76 64 62 65 53 6f 72 74 65 72 41 64 64 54 6f   vdbeSorterAddTo
143f0 54 72 65 65 28 0a 20 20 53 6f 72 74 53 75 62 74  Tree(.  SortSubt
14400 61 73 6b 20 2a 70 54 61 73 6b 2c 20 20 20 20 20  ask *pTask,     
14410 20 20 20 20 20 20 20 20 2f 2a 20 54 61 73 6b 20          /* Task 
14420 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
14430 20 6e 44 65 70 74 68 2c 20 20 20 20 20 20 20 20   nDepth,        
14440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14450 44 65 70 74 68 20 6f 66 20 74 72 65 65 20 61 63  Depth of tree ac
14460 63 6f 72 64 69 6e 67 20 74 6f 20 54 72 65 65 44  cording to TreeD
14470 65 70 74 68 28 29 20 2a 2f 0a 20 20 69 6e 74 20  epth() */.  int 
14480 69 53 65 71 2c 20 20 20 20 20 20 20 20 20 20 20  iSeq,           
14490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
144a0 65 71 75 65 6e 63 65 20 6e 75 6d 62 65 72 20 6f  equence number o
144b0 66 20 6c 65 61 66 20 77 69 74 68 69 6e 20 74 72  f leaf within tr
144c0 65 65 20 2a 2f 0a 20 20 4d 65 72 67 65 45 6e 67  ee */.  MergeEng
144d0 69 6e 65 20 2a 70 52 6f 6f 74 2c 20 20 20 20 20  ine *pRoot,     
144e0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
144f0 6f 66 20 74 72 65 65 20 2a 2f 0a 20 20 4d 65 72  of tree */.  Mer
14500 67 65 45 6e 67 69 6e 65 20 2a 70 4c 65 61 66 20  geEngine *pLeaf 
14510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14520 4c 65 61 66 20 74 6f 20 61 64 64 20 74 6f 20 74  Leaf to add to t
14530 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ree */.){.  int 
14540 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14550 20 20 69 6e 74 20 6e 44 69 76 20 3d 20 31 3b 0a    int nDiv = 1;.
14560 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 72 67 65    int i;.  Merge
14570 45 6e 67 69 6e 65 20 2a 70 20 3d 20 70 52 6f 6f  Engine *p = pRoo
14580 74 3b 0a 20 20 49 6e 63 72 4d 65 72 67 65 72 20  t;.  IncrMerger 
14590 2a 70 49 6e 63 72 3b 0a 0a 20 20 72 63 20 3d 20  *pIncr;..  rc = 
145a0 76 64 62 65 49 6e 63 72 4d 65 72 67 65 72 4e 65  vdbeIncrMergerNe
145b0 77 28 70 54 61 73 6b 2c 20 70 4c 65 61 66 2c 20  w(pTask, pLeaf, 
145c0 26 70 49 6e 63 72 29 3b 0a 0a 20 20 66 6f 72 28  &pIncr);..  for(
145d0 69 3d 31 3b 20 69 3c 6e 44 65 70 74 68 3b 20 69  i=1; i<nDepth; i
145e0 2b 2b 29 7b 0a 20 20 20 20 6e 44 69 76 20 3d 20  ++){.    nDiv = 
145f0 6e 44 69 76 20 2a 20 53 4f 52 54 45 52 5f 4d 41  nDiv * SORTER_MA
14600 58 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 3b 0a 20  X_MERGE_COUNT;. 
14610 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69   }..  for(i=1; i
14620 3c 6e 44 65 70 74 68 20 26 26 20 72 63 3d 3d 53  <nDepth && rc==S
14630 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a  QLITE_OK; i++){.
14640 20 20 20 20 69 6e 74 20 69 49 74 65 72 20 3d 20      int iIter = 
14650 28 69 53 65 71 20 2f 20 6e 44 69 76 29 20 25 20  (iSeq / nDiv) % 
14660 53 4f 52 54 45 52 5f 4d 41 58 5f 4d 45 52 47 45  SORTER_MAX_MERGE
14670 5f 43 4f 55 4e 54 3b 0a 20 20 20 20 50 6d 61 52  _COUNT;.    PmaR
14680 65 61 64 65 72 20 2a 70 52 65 61 64 72 20 3d 20  eader *pReadr = 
14690 26 70 2d 3e 61 52 65 61 64 72 5b 69 49 74 65 72  &p->aReadr[iIter
146a0 5d 3b 0a 0a 20 20 20 20 69 66 28 20 70 52 65 61  ];..    if( pRea
146b0 64 72 2d 3e 70 49 6e 63 72 3d 3d 30 20 29 7b 0a  dr->pIncr==0 ){.
146c0 20 20 20 20 20 20 4d 65 72 67 65 45 6e 67 69 6e        MergeEngin
146d0 65 20 2a 70 4e 65 77 20 3d 20 76 64 62 65 4d 65  e *pNew = vdbeMe
146e0 72 67 65 45 6e 67 69 6e 65 4e 65 77 28 53 4f 52  rgeEngineNew(SOR
146f0 54 45 52 5f 4d 41 58 5f 4d 45 52 47 45 5f 43 4f  TER_MAX_MERGE_CO
14700 55 4e 54 29 3b 0a 20 20 20 20 20 20 69 66 28 20  UNT);.      if( 
14710 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
14720 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
14730 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  OMEM;.      }els
14740 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
14750 76 64 62 65 49 6e 63 72 4d 65 72 67 65 72 4e 65  vdbeIncrMergerNe
14760 77 28 70 54 61 73 6b 2c 20 70 4e 65 77 2c 20 26  w(pTask, pNew, &
14770 70 52 65 61 64 72 2d 3e 70 49 6e 63 72 29 3b 0a  pReadr->pIncr);.
14780 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14790 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
147a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 20 3d  _OK ){.      p =
147b0 20 70 52 65 61 64 72 2d 3e 70 49 6e 63 72 2d 3e   pReadr->pIncr->
147c0 70 4d 65 72 67 65 72 3b 0a 20 20 20 20 20 20 6e  pMerger;.      n
147d0 44 69 76 20 3d 20 6e 44 69 76 20 2f 20 53 4f 52  Div = nDiv / SOR
147e0 54 45 52 5f 4d 41 58 5f 4d 45 52 47 45 5f 43 4f  TER_MAX_MERGE_CO
147f0 55 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  UNT;.    }.  }..
14800 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14810 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 61 52  _OK ){.    p->aR
14820 65 61 64 72 5b 69 53 65 71 20 25 20 53 4f 52 54  eadr[iSeq % SORT
14830 45 52 5f 4d 41 58 5f 4d 45 52 47 45 5f 43 4f 55  ER_MAX_MERGE_COU
14840 4e 54 5d 2e 70 49 6e 63 72 20 3d 20 70 49 6e 63  NT].pIncr = pInc
14850 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  r;.  }else{.    
14860 76 64 62 65 49 6e 63 72 46 72 65 65 28 70 49 6e  vdbeIncrFree(pIn
14870 63 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  cr);.  }.  retur
14880 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
14890 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
148a0 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f  called as part o
148b0 66 20 61 20 53 6f 72 74 65 72 52 65 77 69 6e 64  f a SorterRewind
148c0 28 29 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20  () operation on 
148d0 61 20 73 6f 72 74 65 72 0a 2a 2a 20 74 68 61 74  a sorter.** that
148e0 20 68 61 73 20 61 6c 72 65 61 64 79 20 77 72 69   has already wri
148f0 74 74 65 6e 20 74 77 6f 20 6f 72 20 6d 6f 72 65  tten two or more
14900 20 6c 65 76 65 6c 2d 30 20 50 4d 41 73 20 74 6f   level-0 PMAs to
14910 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 65 6d   one or more tem
14920 70 0a 2a 2a 20 66 69 6c 65 73 2e 20 49 74 20 62  p.** files. It b
14930 75 69 6c 64 73 20 61 20 74 72 65 65 20 6f 66 20  uilds a tree of 
14940 4d 65 72 67 65 45 6e 67 69 6e 65 2f 49 6e 63 72  MergeEngine/Incr
14950 4d 65 72 67 65 72 2f 50 6d 61 52 65 61 64 65 72  Merger/PmaReader
14960 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20 0a 2a   objects that .*
14970 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  * can be used to
14980 20 69 6e 63 72 65 6d 65 6e 74 61 6c 6c 79 20 6d   incrementally m
14990 65 72 67 65 20 61 6c 6c 20 50 4d 41 73 20 6f 6e  erge all PMAs on
149a0 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   disk..**.** If 
149b0 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
149c0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
149d0 64 20 61 6e 64 20 2a 70 70 4f 75 74 20 73 65 74  d and *ppOut set
149e0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
149f0 0a 2a 2a 20 4d 65 72 67 65 45 6e 67 69 6e 65 20  .** MergeEngine 
14a00 6f 62 6a 65 63 74 20 61 74 20 74 68 65 20 72 6f  object at the ro
14a10 6f 74 20 6f 66 20 74 68 65 20 74 72 65 65 20 62  ot of the tree b
14a20 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
14a30 20 4f 72 2c 20 69 66 20 61 6e 0a 2a 2a 20 65 72   Or, if an.** er
14a40 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53  ror occurs, an S
14a50 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
14a60 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
14a70 20 74 68 65 20 66 69 6e 61 6c 20 76 61 6c 75 65   the final value
14a80 20 0a 2a 2a 20 6f 66 20 2a 70 70 4f 75 74 20 69   .** of *ppOut i
14a90 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  s undefined..*/.
14aa0 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 53  static int vdbeS
14ab0 6f 72 74 65 72 4d 65 72 67 65 54 72 65 65 42 75  orterMergeTreeBu
14ac0 69 6c 64 28 0a 20 20 56 64 62 65 53 6f 72 74 65  ild(.  VdbeSorte
14ad0 72 20 2a 70 53 6f 72 74 65 72 2c 20 20 20 20 20  r *pSorter,     
14ae0 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75    /* The VDBE cu
14af0 72 73 6f 72 20 74 68 61 74 20 69 6d 70 6c 65 6d  rsor that implem
14b00 65 6e 74 73 20 74 68 65 20 73 6f 72 74 20 2a 2f  ents the sort */
14b10 0a 20 20 4d 65 72 67 65 45 6e 67 69 6e 65 20 2a  .  MergeEngine *
14b20 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20 2f 2a  *ppOut        /*
14b30 20 57 72 69 74 65 20 74 68 65 20 4d 65 72 67 65   Write the Merge
14b40 45 6e 67 69 6e 65 20 68 65 72 65 20 2a 2f 0a 29  Engine here */.)
14b50 7b 0a 20 20 4d 65 72 67 65 45 6e 67 69 6e 65 20  {.  MergeEngine 
14b60 2a 70 4d 61 69 6e 20 3d 20 30 3b 0a 20 20 69 6e  *pMain = 0;.  in
14b70 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14b80 3b 0a 20 20 69 6e 74 20 69 54 61 73 6b 3b 0a 0a  ;.  int iTask;..
14b90 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57  #if SQLITE_MAX_W
14ba0 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3e 30 0a  ORKER_THREADS>0.
14bb0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 6f 72 74    /* If the sort
14bc0 65 72 20 75 73 65 73 20 6d 6f 72 65 20 74 68 61  er uses more tha
14bd0 6e 20 6f 6e 65 20 74 61 73 6b 2c 20 74 68 65 6e  n one task, then
14be0 20 63 72 65 61 74 65 20 74 68 65 20 74 6f 70 2d   create the top-
14bf0 6c 65 76 65 6c 20 0a 20 20 2a 2a 20 4d 65 72 67  level .  ** Merg
14c00 65 45 6e 67 69 6e 65 20 68 65 72 65 2e 20 54 68  eEngine here. Th
14c10 69 73 20 4d 65 72 67 65 45 6e 67 69 6e 65 20 77  is MergeEngine w
14c20 69 6c 6c 20 72 65 61 64 20 64 61 74 61 20 66 72  ill read data fr
14c30 6f 6d 20 65 78 61 63 74 6c 79 20 0a 20 20 2a 2a  om exactly .  **
14c40 20 6f 6e 65 20 50 6d 61 52 65 61 64 65 72 20 70   one PmaReader p
14c50 65 72 20 73 75 62 2d 74 61 73 6b 2e 20 20 2a 2f  er sub-task.  */
14c60 0a 20 20 61 73 73 65 72 74 28 20 70 53 6f 72 74  .  assert( pSort
14c70 65 72 2d 3e 62 55 73 65 54 68 72 65 61 64 73 20  er->bUseThreads 
14c80 7c 7c 20 70 53 6f 72 74 65 72 2d 3e 6e 54 61 73  || pSorter->nTas
14c90 6b 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 53  k==1 );.  if( pS
14ca0 6f 72 74 65 72 2d 3e 6e 54 61 73 6b 3e 31 20 29  orter->nTask>1 )
14cb0 7b 0a 20 20 20 20 70 4d 61 69 6e 20 3d 20 76 64  {.    pMain = vd
14cc0 62 65 4d 65 72 67 65 45 6e 67 69 6e 65 4e 65 77  beMergeEngineNew
14cd0 28 70 53 6f 72 74 65 72 2d 3e 6e 54 61 73 6b 29  (pSorter->nTask)
14ce0 3b 0a 20 20 20 20 69 66 28 20 70 4d 61 69 6e 3d  ;.    if( pMain=
14cf0 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  =0 ) rc = SQLITE
14d00 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64  _NOMEM;.  }.#end
14d10 69 66 0a 0a 20 20 66 6f 72 28 69 54 61 73 6b 3d  if..  for(iTask=
14d20 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
14d30 20 26 26 20 69 54 61 73 6b 3c 70 53 6f 72 74 65   && iTask<pSorte
14d40 72 2d 3e 6e 54 61 73 6b 3b 20 69 54 61 73 6b 2b  r->nTask; iTask+
14d50 2b 29 7b 0a 20 20 20 20 53 6f 72 74 53 75 62 74  +){.    SortSubt
14d60 61 73 6b 20 2a 70 54 61 73 6b 20 3d 20 26 70 53  ask *pTask = &pS
14d70 6f 72 74 65 72 2d 3e 61 54 61 73 6b 5b 69 54 61  orter->aTask[iTa
14d80 73 6b 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  sk];.    assert(
14d90 20 70 54 61 73 6b 2d 3e 6e 50 4d 41 3e 30 20 7c   pTask->nPMA>0 |
14da0 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52  | SQLITE_MAX_WOR
14db0 4b 45 52 5f 54 48 52 45 41 44 53 3e 30 20 29 3b  KER_THREADS>0 );
14dc0 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
14dd0 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MAX_WORKER_THREA
14de0 44 53 3d 3d 30 20 7c 7c 20 70 54 61 73 6b 2d 3e  DS==0 || pTask->
14df0 6e 50 4d 41 20 29 7b 0a 20 20 20 20 20 20 4d 65  nPMA ){.      Me
14e00 72 67 65 45 6e 67 69 6e 65 20 2a 70 52 6f 6f 74  rgeEngine *pRoot
14e10 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 52 6f 6f   = 0;     /* Roo
14e20 74 20 6e 6f 64 65 20 6f 66 20 74 72 65 65 20 66  t node of tree f
14e30 6f 72 20 74 68 69 73 20 74 61 73 6b 20 2a 2f 0a  or this task */.
14e40 20 20 20 20 20 20 69 6e 74 20 6e 44 65 70 74 68        int nDepth
14e50 20 3d 20 76 64 62 65 53 6f 72 74 65 72 54 72 65   = vdbeSorterTre
14e60 65 44 65 70 74 68 28 70 54 61 73 6b 2d 3e 6e 50  eDepth(pTask->nP
14e70 4d 41 29 3b 0a 20 20 20 20 20 20 69 36 34 20 69  MA);.      i64 i
14e80 52 65 61 64 4f 66 66 20 3d 20 30 3b 0a 0a 20 20  ReadOff = 0;..  
14e90 20 20 20 20 69 66 28 20 70 54 61 73 6b 2d 3e 6e      if( pTask->n
14ea0 50 4d 41 3c 3d 53 4f 52 54 45 52 5f 4d 41 58 5f  PMA<=SORTER_MAX_
14eb0 4d 45 52 47 45 5f 43 4f 55 4e 54 20 29 7b 0a 20  MERGE_COUNT ){. 
14ec0 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65         rc = vdbe
14ed0 4d 65 72 67 65 45 6e 67 69 6e 65 4c 65 76 65 6c  MergeEngineLevel
14ee0 30 28 70 54 61 73 6b 2c 20 70 54 61 73 6b 2d 3e  0(pTask, pTask->
14ef0 6e 50 4d 41 2c 20 26 69 52 65 61 64 4f 66 66 2c  nPMA, &iReadOff,
14f00 20 26 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20   &pRoot);.      
14f10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
14f20 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 69 6e  nt i;.        in
14f30 74 20 69 53 65 71 20 3d 20 30 3b 0a 20 20 20 20  t iSeq = 0;.    
14f40 20 20 20 20 70 52 6f 6f 74 20 3d 20 76 64 62 65      pRoot = vdbe
14f50 4d 65 72 67 65 45 6e 67 69 6e 65 4e 65 77 28 53  MergeEngineNew(S
14f60 4f 52 54 45 52 5f 4d 41 58 5f 4d 45 52 47 45 5f  ORTER_MAX_MERGE_
14f70 43 4f 55 4e 54 29 3b 0a 20 20 20 20 20 20 20 20  COUNT);.        
14f80 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 20 72  if( pRoot==0 ) r
14f90 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
14fa0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
14fb0 30 3b 20 69 3c 70 54 61 73 6b 2d 3e 6e 50 4d 41  0; i<pTask->nPMA
14fc0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
14fd0 4b 3b 20 69 20 2b 3d 20 53 4f 52 54 45 52 5f 4d  K; i += SORTER_M
14fe0 41 58 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 29 7b  AX_MERGE_COUNT){
14ff0 0a 20 20 20 20 20 20 20 20 20 20 4d 65 72 67 65  .          Merge
15000 45 6e 67 69 6e 65 20 2a 70 4d 65 72 67 65 72 20  Engine *pMerger 
15010 3d 20 30 3b 20 2f 2a 20 4e 65 77 20 6c 65 76 65  = 0; /* New leve
15020 6c 2d 30 20 50 4d 41 20 6d 65 72 67 65 72 20 2a  l-0 PMA merger *
15030 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  /.          int 
15040 6e 52 65 61 64 65 72 3b 20 20 20 20 20 20 20 20  nReader;        
15050 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
15060 6f 66 20 6c 65 76 65 6c 2d 30 20 50 4d 41 73 20  of level-0 PMAs 
15070 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 0a 20 20 20  to merge */..   
15080 20 20 20 20 20 20 20 6e 52 65 61 64 65 72 20 3d         nReader =
15090 20 4d 49 4e 28 70 54 61 73 6b 2d 3e 6e 50 4d 41   MIN(pTask->nPMA
150a0 20 2d 20 69 2c 20 53 4f 52 54 45 52 5f 4d 41 58   - i, SORTER_MAX
150b0 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 29 3b 0a 20  _MERGE_COUNT);. 
150c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64           rc = vd
150d0 62 65 4d 65 72 67 65 45 6e 67 69 6e 65 4c 65 76  beMergeEngineLev
150e0 65 6c 30 28 70 54 61 73 6b 2c 20 6e 52 65 61 64  el0(pTask, nRead
150f0 65 72 2c 20 26 69 52 65 61 64 4f 66 66 2c 20 26  er, &iReadOff, &
15100 70 4d 65 72 67 65 72 29 3b 0a 20 20 20 20 20 20  pMerger);.      
15110 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
15120 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
15130 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 53 6f       rc = vdbeSo
15140 72 74 65 72 41 64 64 54 6f 54 72 65 65 28 70 54  rterAddToTree(pT
15150 61 73 6b 2c 20 6e 44 65 70 74 68 2c 20 69 53 65  ask, nDepth, iSe
15160 71 2b 2b 2c 20 70 52 6f 6f 74 2c 20 70 4d 65 72  q++, pRoot, pMer
15170 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
15180 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
15190 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72    }..      if( r
151a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
151b0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57  #if SQLITE_MAX_W
151c0 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3e 30 0a  ORKER_THREADS>0.
151d0 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 61 69          if( pMai
151e0 6e 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n!=0 ){.        
151f0 20 20 72 63 20 3d 20 76 64 62 65 49 6e 63 72 4d    rc = vdbeIncrM
15200 65 72 67 65 72 4e 65 77 28 70 54 61 73 6b 2c 20  ergerNew(pTask, 
15210 70 52 6f 6f 74 2c 20 26 70 4d 61 69 6e 2d 3e 61  pRoot, &pMain->a
15220 52 65 61 64 72 5b 69 54 61 73 6b 5d 2e 70 49 6e  Readr[iTask].pIn
15230 63 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  cr);.        }el
15240 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
15250 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73    {.          as
15260 73 65 72 74 28 20 70 4d 61 69 6e 3d 3d 30 20 29  sert( pMain==0 )
15270 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 61 69  ;.          pMai
15280 6e 20 3d 20 70 52 6f 6f 74 3b 0a 20 20 20 20 20  n = pRoot;.     
15290 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
152a0 7b 0a 20 20 20 20 20 20 20 20 76 64 62 65 4d 65  {.        vdbeMe
152b0 72 67 65 45 6e 67 69 6e 65 46 72 65 65 28 70 52  rgeEngineFree(pR
152c0 6f 6f 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  oot);.      }.  
152d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
152e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
152f0 20 20 20 20 76 64 62 65 4d 65 72 67 65 45 6e 67      vdbeMergeEng
15300 69 6e 65 46 72 65 65 28 70 4d 61 69 6e 29 3b 0a  ineFree(pMain);.
15310 20 20 20 20 70 4d 61 69 6e 20 3d 20 30 3b 0a 20      pMain = 0;. 
15320 20 7d 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70 4d   }.  *ppOut = pM
15330 61 69 6e 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ain;.  return rc
15340 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
15350 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
15360 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e  ed as part of an
15370 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74   sqlite3VdbeSort
15380 65 72 52 65 77 69 6e 64 28 29 20 6f 70 65 72 61  erRewind() opera
15390 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 61 20 73 6f 72  tion.** on a sor
153a0 74 65 72 20 74 68 61 74 20 68 61 73 20 77 72 69  ter that has wri
153b0 74 74 65 6e 20 74 77 6f 20 6f 72 20 6d 6f 72 65  tten two or more
153c0 20 50 4d 41 73 20 74 6f 20 74 65 6d 70 6f 72 61   PMAs to tempora
153d0 72 79 20 66 69 6c 65 73 2e 20 49 74 20 73 65 74  ry files. It set
153e0 73 0a 2a 2a 20 75 70 20 65 69 74 68 65 72 20 56  s.** up either V
153f0 64 62 65 53 6f 72 74 65 72 2e 70 4d 65 72 67 65  dbeSorter.pMerge
15400 72 20 28 66 6f 72 20 73 69 6e 67 6c 65 20 74 68  r (for single th
15410 72 65 61 64 65 64 20 73 6f 72 74 65 72 73 29 20  readed sorters) 
15420 6f 72 20 70 52 65 61 64 65 72 0a 2a 2a 20 28 66  or pReader.** (f
15430 6f 72 20 6d 75 6c 74 69 2d 74 68 72 65 61 64 65  or multi-threade
15440 64 20 73 6f 72 74 65 72 73 29 20 73 6f 20 74 68  d sorters) so th
15450 61 74 20 69 74 20 63 61 6e 20 62 65 20 75 73 65  at it can be use
15460 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
15470 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20 72 65 63 6f  ough.** all reco
15480 72 64 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  rds stored in th
15490 65 20 73 6f 72 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  e sorter..**.** 
154a0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
154b0 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
154c0 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
154d0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  e error code oth
154e0 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
154f0 63 20 69 6e 74 20 76 64 62 65 53 6f 72 74 65 72  c int vdbeSorter
15500 53 65 74 75 70 4d 65 72 67 65 28 56 64 62 65 53  SetupMerge(VdbeS
15510 6f 72 74 65 72 20 2a 70 53 6f 72 74 65 72 29 7b  orter *pSorter){
15520 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
15530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15540 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
15550 65 20 2a 2f 0a 20 20 53 6f 72 74 53 75 62 74 61  e */.  SortSubta
15560 73 6b 20 2a 70 54 61 73 6b 30 20 3d 20 26 70 53  sk *pTask0 = &pS
15570 6f 72 74 65 72 2d 3e 61 54 61 73 6b 5b 30 5d 3b  orter->aTask[0];
15580 0a 20 20 4d 65 72 67 65 45 6e 67 69 6e 65 20 2a  .  MergeEngine *
15590 70 4d 61 69 6e 20 3d 20 30 3b 0a 23 69 66 20 53  pMain = 0;.#if S
155a0 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52  QLITE_MAX_WORKER
155b0 5f 54 48 52 45 41 44 53 0a 20 20 73 71 6c 69 74  _THREADS.  sqlit
155c0 65 33 20 2a 64 62 20 3d 20 70 54 61 73 6b 30 2d  e3 *db = pTask0-
155d0 3e 70 53 6f 72 74 65 72 2d 3e 64 62 3b 0a 20 20  >pSorter->db;.  
155e0 69 6e 74 20 69 3b 0a 20 20 53 6f 72 74 65 72 43  int i;.  SorterC
155f0 6f 6d 70 61 72 65 20 78 43 6f 6d 70 61 72 65 20  ompare xCompare 
15600 3d 20 76 64 62 65 53 6f 72 74 65 72 47 65 74 43  = vdbeSorterGetC
15610 6f 6d 70 61 72 65 28 70 53 6f 72 74 65 72 29 3b  ompare(pSorter);
15620 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53  .  for(i=0; i<pS
15630 6f 72 74 65 72 2d 3e 6e 54 61 73 6b 3b 20 69 2b  orter->nTask; i+
15640 2b 29 7b 0a 20 20 20 20 70 53 6f 72 74 65 72 2d  +){.    pSorter-
15650 3e 61 54 61 73 6b 5b 69 5d 2e 78 43 6f 6d 70 61  >aTask[i].xCompa
15660 72 65 20 3d 20 78 43 6f 6d 70 61 72 65 3b 0a 20  re = xCompare;. 
15670 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 63 20   }.#endif..  rc 
15680 3d 20 76 64 62 65 53 6f 72 74 65 72 4d 65 72 67  = vdbeSorterMerg
15690 65 54 72 65 65 42 75 69 6c 64 28 70 53 6f 72 74  eTreeBuild(pSort
156a0 65 72 2c 20 26 70 4d 61 69 6e 29 3b 0a 20 20 69  er, &pMain);.  i
156b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
156c0 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d   ){.#if SQLITE_M
156d0 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  AX_WORKER_THREAD
156e0 53 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  S.    assert( pS
156f0 6f 72 74 65 72 2d 3e 62 55 73 65 54 68 72 65 61  orter->bUseThrea
15700 64 73 3d 3d 30 20 7c 7c 20 70 53 6f 72 74 65 72  ds==0 || pSorter
15710 2d 3e 6e 54 61 73 6b 3e 31 20 29 3b 0a 20 20 20  ->nTask>1 );.   
15720 20 69 66 28 20 70 53 6f 72 74 65 72 2d 3e 62 55   if( pSorter->bU
15730 73 65 54 68 72 65 61 64 73 20 29 7b 0a 20 20 20  seThreads ){.   
15740 20 20 20 69 6e 74 20 69 54 61 73 6b 3b 0a 20 20     int iTask;.  
15750 20 20 20 20 50 6d 61 52 65 61 64 65 72 20 2a 70      PmaReader *p
15760 52 65 61 64 72 20 3d 20 30 3b 0a 20 20 20 20 20  Readr = 0;.     
15770 20 53 6f 72 74 53 75 62 74 61 73 6b 20 2a 70 4c   SortSubtask *pL
15780 61 73 74 20 3d 20 26 70 53 6f 72 74 65 72 2d 3e  ast = &pSorter->
15790 61 54 61 73 6b 5b 70 53 6f 72 74 65 72 2d 3e 6e  aTask[pSorter->n
157a0 54 61 73 6b 2d 31 5d 3b 0a 20 20 20 20 20 20 72  Task-1];.      r
157b0 63 20 3d 20 76 64 62 65 53 6f 72 74 41 6c 6c 6f  c = vdbeSortAllo
157c0 63 55 6e 70 61 63 6b 65 64 28 70 4c 61 73 74 29  cUnpacked(pLast)
157d0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
157e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
157f0 20 20 20 20 20 70 52 65 61 64 72 20 3d 20 28 50       pReadr = (P
15800 6d 61 52 65 61 64 65 72 2a 29 73 71 6c 69 74 65  maReader*)sqlite
15810 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
15820 2c 20 73 69 7a 65 6f 66 28 50 6d 61 52 65 61 64  , sizeof(PmaRead
15830 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20 70 53  er));.        pS
15840 6f 72 74 65 72 2d 3e 70 52 65 61 64 65 72 20 3d  orter->pReader =
15850 20 70 52 65 61 64 72 3b 0a 20 20 20 20 20 20 20   pReadr;.       
15860 20 69 66 28 20 70 52 65 61 64 72 3d 3d 30 20 29   if( pReadr==0 )
15870 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
15880 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
15890 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
158a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
158b0 63 20 3d 20 76 64 62 65 49 6e 63 72 4d 65 72 67  c = vdbeIncrMerg
158c0 65 72 4e 65 77 28 70 4c 61 73 74 2c 20 70 4d 61  erNew(pLast, pMa
158d0 69 6e 2c 20 26 70 52 65 61 64 72 2d 3e 70 49 6e  in, &pReadr->pIn
158e0 63 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  cr);.        if(
158f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
15900 7b 0a 20 20 20 20 20 20 20 20 20 20 76 64 62 65  {.          vdbe
15910 49 6e 63 72 4d 65 72 67 65 72 53 65 74 54 68 72  IncrMergerSetThr
15920 65 61 64 73 28 70 52 65 61 64 72 2d 3e 70 49 6e  eads(pReadr->pIn
15930 63 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  cr);.          f
15940 6f 72 28 69 54 61 73 6b 3d 30 3b 20 69 54 61 73  or(iTask=0; iTas
15950 6b 3c 28 70 53 6f 72 74 65 72 2d 3e 6e 54 61 73  k<(pSorter->nTas
15960 6b 2d 31 29 3b 20 69 54 61 73 6b 2b 2b 29 7b 0a  k-1); iTask++){.
15970 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 63 72              Incr
15980 4d 65 72 67 65 72 20 2a 70 49 6e 63 72 3b 0a 20  Merger *pIncr;. 
15990 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
159a0 70 49 6e 63 72 20 3d 20 70 4d 61 69 6e 2d 3e 61  pIncr = pMain->a
159b0 52 65 61 64 72 5b 69 54 61 73 6b 5d 2e 70 49 6e  Readr[iTask].pIn
159c0 63 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  cr) ){.         
159d0 20 20 20 20 20 76 64 62 65 49 6e 63 72 4d 65 72       vdbeIncrMer
159e0 67 65 72 53 65 74 54 68 72 65 61 64 73 28 70 49  gerSetThreads(pI
159f0 6e 63 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ncr);.          
15a00 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 63      assert( pInc
15a10 72 2d 3e 70 54 61 73 6b 21 3d 70 4c 61 73 74 20  r->pTask!=pLast 
15a20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
15a30 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
15a40 20 20 20 20 20 20 20 66 6f 72 28 69 54 61 73 6b         for(iTask
15a50 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
15a60 4b 20 26 26 20 69 54 61 73 6b 3c 70 53 6f 72 74  K && iTask<pSort
15a70 65 72 2d 3e 6e 54 61 73 6b 3b 20 69 54 61 73 6b  er->nTask; iTask
15a80 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
15a90 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 3a 0a   /* Check that:.
15aa0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20              **  
15ab0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
15ac0 20 20 20 61 29 20 54 68 65 20 69 6e 63 72 65 6d     a) The increm
15ad0 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 62 6a 65  ental merge obje
15ae0 63 74 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64  ct is configured
15af0 20 74 6f 20 75 73 65 20 74 68 65 0a 20 20 20 20   to use the.    
15b00 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20          **      
15b10 72 69 67 68 74 20 74 61 73 6b 2c 20 61 6e 64 0a  right task, and.
15b20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20              **  
15b30 20 62 29 20 49 66 20 69 74 20 69 73 20 75 73 69   b) If it is usi
15b40 6e 67 20 74 61 73 6b 20 28 6e 54 61 73 6b 2d 31  ng task (nTask-1
15b50 29 2c 20 69 74 20 69 73 20 63 6f 6e 66 69 67 75  ), it is configu
15b60 72 65 64 20 74 6f 20 72 75 6e 0a 20 20 20 20 20  red to run.     
15b70 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 69         **      i
15b80 6e 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65  n single-threade
15b90 64 20 6d 6f 64 65 2e 20 54 68 69 73 20 69 73 20  d mode. This is 
15ba0 69 6d 70 6f 72 74 61 6e 74 2c 20 61 73 20 74 68  important, as th
15bb0 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
15bc0 20 20 20 20 20 20 72 6f 6f 74 20 6d 65 72 67 65        root merge
15bd0 20 28 49 4e 43 52 49 4e 49 54 5f 52 4f 4f 54 29   (INCRINIT_ROOT)
15be0 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74   will be using t
15bf0 68 65 20 73 61 6d 65 20 74 61 73 6b 0a 20 20 20  he same task.   
15c00 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20           **     
15c10 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 20 20 20   object..       
15c20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
15c30 20 20 20 20 50 6d 61 52 65 61 64 65 72 20 2a 70      PmaReader *p
15c40 20 3d 20 26 70 4d 61 69 6e 2d 3e 61 52 65 61 64   = &pMain->aRead
15c50 72 5b 69 54 61 73 6b 5d 3b 0a 20 20 20 20 20 20  r[iTask];.      
15c60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
15c70 3e 70 49 6e 63 72 3d 3d 30 20 7c 7c 20 28 0a 20  >pIncr==0 || (. 
15c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
15c90 70 2d 3e 70 49 6e 63 72 2d 3e 70 54 61 73 6b 3d  p->pIncr->pTask=
15ca0 3d 26 70 53 6f 72 74 65 72 2d 3e 61 54 61 73 6b  =&pSorter->aTask
15cb0 5b 69 54 61 73 6b 5d 29 20 20 20 20 20 20 20 20  [iTask])        
15cc0 20 20 20 20 20 2f 2a 20 61 20 2a 2f 0a 20 20 20       /* a */.   
15cd0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 69 54            && (iT
15ce0 61 73 6b 21 3d 70 53 6f 72 74 65 72 2d 3e 6e 54  ask!=pSorter->nT
15cf0 61 73 6b 2d 31 20 7c 7c 20 70 2d 3e 70 49 6e 63  ask-1 || p->pInc
15d00 72 2d 3e 62 55 73 65 54 68 72 65 61 64 3d 3d 30  r->bUseThread==0
15d10 29 20 20 2f 2a 20 62 20 2a 2f 0a 20 20 20 20 20  )  /* b */.     
15d20 20 20 20 20 20 20 20 29 29 3b 0a 20 20 20 20 20         ));.     
15d30 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65         rc = vdbe
15d40 50 6d 61 52 65 61 64 65 72 49 6e 63 72 49 6e 69  PmaReaderIncrIni
15d50 74 28 70 2c 20 49 4e 43 52 49 4e 49 54 5f 54 41  t(p, INCRINIT_TA
15d60 53 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  SK);.          }
15d70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15d80 20 20 20 70 4d 61 69 6e 20 3d 20 30 3b 0a 20 20     pMain = 0;.  
15d90 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
15da0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
15db0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64  .        rc = vd
15dc0 62 65 50 6d 61 52 65 61 64 65 72 49 6e 63 72 4d  bePmaReaderIncrM
15dd0 65 72 67 65 49 6e 69 74 28 70 52 65 61 64 72 2c  ergeInit(pReadr,
15de0 20 49 4e 43 52 49 4e 49 54 5f 52 4f 4f 54 29 3b   INCRINIT_ROOT);
15df0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
15e00 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a  se.#endif.    {.
15e10 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 4d        rc = vdbeM
15e20 65 72 67 65 45 6e 67 69 6e 65 49 6e 69 74 28 70  ergeEngineInit(p
15e30 54 61 73 6b 30 2c 20 70 4d 61 69 6e 2c 20 49 4e  Task0, pMain, IN
15e40 43 52 49 4e 49 54 5f 4e 4f 52 4d 41 4c 29 3b 0a  CRINIT_NORMAL);.
15e50 20 20 20 20 20 20 70 53 6f 72 74 65 72 2d 3e 70        pSorter->p
15e60 4d 65 72 67 65 72 20 3d 20 70 4d 61 69 6e 3b 0a  Merger = pMain;.
15e70 20 20 20 20 20 20 70 4d 61 69 6e 20 3d 20 30 3b        pMain = 0;
15e80 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
15e90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15ea0 29 7b 0a 20 20 20 20 76 64 62 65 4d 65 72 67 65  ){.    vdbeMerge
15eb0 45 6e 67 69 6e 65 46 72 65 65 28 70 4d 61 69 6e  EngineFree(pMain
15ec0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
15ed0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 6e  rc;.}.../*.** On
15ee0 63 65 20 74 68 65 20 73 6f 72 74 65 72 20 68 61  ce the sorter ha
15ef0 73 20 62 65 65 6e 20 70 6f 70 75 6c 61 74 65 64  s been populated
15f00 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   by calls to sql
15f10 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 57 72  ite3VdbeSorterWr
15f20 69 74 65 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e  ite,.** this fun
15f30 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
15f40 74 6f 20 70 72 65 70 61 72 65 20 66 6f 72 20 69  to prepare for i
15f50 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
15f60 20 74 68 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20   the records.** 
15f70 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2e  in sorted order.
15f80 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
15f90 64 62 65 53 6f 72 74 65 72 52 65 77 69 6e 64 28  dbeSorterRewind(
15fa0 63 6f 6e 73 74 20 56 64 62 65 43 75 72 73 6f 72  const VdbeCursor
15fb0 20 2a 70 43 73 72 2c 20 69 6e 74 20 2a 70 62 45   *pCsr, int *pbE
15fc0 6f 66 29 7b 0a 20 20 56 64 62 65 53 6f 72 74 65  of){.  VdbeSorte
15fd0 72 20 2a 70 53 6f 72 74 65 72 3b 0a 20 20 69 6e  r *pSorter;.  in
15fe0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
15ff0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
16000 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
16010 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d  .  assert( pCsr-
16020 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
16030 50 45 5f 53 4f 52 54 45 52 20 29 3b 0a 20 20 70  PE_SORTER );.  p
16040 53 6f 72 74 65 72 20 3d 20 70 43 73 72 2d 3e 75  Sorter = pCsr->u
16050 63 2e 70 53 6f 72 74 65 72 3b 0a 20 20 61 73 73  c.pSorter;.  ass
16060 65 72 74 28 20 70 53 6f 72 74 65 72 20 29 3b 0a  ert( pSorter );.
16070 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 64 61 74 61  .  /* If no data
16080 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
16090 6e 20 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20  n to disk, then 
160a0 64 6f 20 6e 6f 74 20 64 6f 20 73 6f 20 6e 6f 77  do not do so now
160b0 2e 20 49 6e 73 74 65 61 64 2c 0a 20 20 2a 2a 20  . Instead,.  ** 
160c0 73 6f 72 74 20 74 68 65 20 56 64 62 65 53 6f 72  sort the VdbeSor
160d0 74 65 72 2e 70 52 65 63 6f 72 64 20 6c 69 73 74  ter.pRecord list
160e0 2e 20 54 68 65 20 76 64 62 65 20 6c 61 79 65 72  . The vdbe layer
160f0 20 77 69 6c 6c 20 72 65 61 64 20 64 61 74 61 20   will read data 
16100 64 69 72 65 63 74 6c 79 0a 20 20 2a 2a 20 66 72  directly.  ** fr
16110 6f 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  om the in-memory
16120 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 69 66 28   list.  */.  if(
16130 20 70 53 6f 72 74 65 72 2d 3e 62 55 73 65 50 4d   pSorter->bUsePM
16140 41 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  A==0 ){.    if( 
16150 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74 2e 70 4c  pSorter->list.pL
16160 69 73 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 62  ist ){.      *pb
16170 45 6f 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Eof = 0;.      r
16180 63 20 3d 20 76 64 62 65 53 6f 72 74 65 72 53 6f  c = vdbeSorterSo
16190 72 74 28 26 70 53 6f 72 74 65 72 2d 3e 61 54 61  rt(&pSorter->aTa
161a0 73 6b 5b 30 5d 2c 20 26 70 53 6f 72 74 65 72 2d  sk[0], &pSorter-
161b0 3e 6c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73  >list);.    }els
161c0 65 7b 0a 20 20 20 20 20 20 2a 70 62 45 6f 66 20  e{.      *pbEof 
161d0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  = 1;.    }.    r
161e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
161f0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 75   /* Write the cu
16200 72 72 65 6e 74 20 69 6e 2d 6d 65 6d 6f 72 79 20  rrent in-memory 
16210 6c 69 73 74 20 74 6f 20 61 20 50 4d 41 2e 20 57  list to a PMA. W
16220 68 65 6e 20 74 68 65 20 56 64 62 65 53 6f 72 74  hen the VdbeSort
16230 65 72 57 72 69 74 65 28 29 20 0a 20 20 2a 2a 20  erWrite() .  ** 
16240 66 75 6e 63 74 69 6f 6e 20 66 6c 75 73 68 65 73  function flushes
16250 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
16260 20 6d 65 6d 6f 72 79 20 74 6f 20 64 69 73 6b 2c   memory to disk,
16270 20 69 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   it immediately 
16280 61 6c 77 61 79 73 0a 20 20 2a 2a 20 63 72 65 61  always.  ** crea
16290 74 65 73 20 61 20 6e 65 77 20 6c 69 73 74 20 63  tes a new list c
162a0 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73  onsisting of a s
162b0 69 6e 67 6c 65 20 6b 65 79 20 69 6d 6d 65 64 69  ingle key immedi
162c0 61 74 65 6c 79 20 61 66 74 65 72 77 61 72 64 73  ately afterwards
162d0 2e 0a 20 20 2a 2a 20 53 6f 20 74 68 65 20 6c 69  ..  ** So the li
162e0 73 74 20 69 73 20 6e 65 76 65 72 20 65 6d 70 74  st is never empt
162f0 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e  y at this point.
16300 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
16310 53 6f 72 74 65 72 2d 3e 6c 69 73 74 2e 70 4c 69  Sorter->list.pLi
16320 73 74 20 29 3b 0a 20 20 72 63 20 3d 20 76 64 62  st );.  rc = vdb
16330 65 53 6f 72 74 65 72 46 6c 75 73 68 50 4d 41 28  eSorterFlushPMA(
16340 70 53 6f 72 74 65 72 29 3b 0a 0a 20 20 2f 2a 20  pSorter);..  /* 
16350 4a 6f 69 6e 20 61 6c 6c 20 74 68 72 65 61 64 73  Join all threads
16360 20 2a 2f 0a 20 20 72 63 20 3d 20 76 64 62 65 53   */.  rc = vdbeS
16370 6f 72 74 65 72 4a 6f 69 6e 41 6c 6c 28 70 53 6f  orterJoinAll(pSo
16380 72 74 65 72 2c 20 72 63 29 3b 0a 0a 20 20 76 64  rter, rc);..  vd
16390 62 65 53 6f 72 74 65 72 52 65 77 69 6e 64 44 65  beSorterRewindDe
163a0 62 75 67 28 22 72 65 77 69 6e 64 22 29 3b 0a 0a  bug("rewind");..
163b0 20 20 2f 2a 20 41 73 73 75 6d 69 6e 67 20 6e 6f    /* Assuming no
163c0 20 65 72 72 6f 72 73 20 68 61 76 65 20 6f 63 63   errors have occ
163d0 75 72 72 65 64 2c 20 73 65 74 20 75 70 20 61 20  urred, set up a 
163e0 6d 65 72 67 65 72 20 73 74 72 75 63 74 75 72 65  merger structure
163f0 20 74 6f 20 0a 20 20 2a 2a 20 69 6e 63 72 65 6d   to .  ** increm
16400 65 6e 74 61 6c 6c 79 20 72 65 61 64 20 61 6e 64  entally read and
16410 20 6d 65 72 67 65 20 61 6c 6c 20 72 65 6d 61 69   merge all remai
16420 6e 69 6e 67 20 50 4d 41 73 2e 20 20 2a 2f 0a 20  ning PMAs.  */. 
16430 20 61 73 73 65 72 74 28 20 70 53 6f 72 74 65 72   assert( pSorter
16440 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20 29 3b 0a  ->pReader==0 );.
16450 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16460 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
16470 76 64 62 65 53 6f 72 74 65 72 53 65 74 75 70 4d  vdbeSorterSetupM
16480 65 72 67 65 28 70 53 6f 72 74 65 72 29 3b 0a 20  erge(pSorter);. 
16490 20 20 20 2a 70 62 45 6f 66 20 3d 20 30 3b 0a 20     *pbEof = 0;. 
164a0 20 7d 0a 0a 20 20 76 64 62 65 53 6f 72 74 65 72   }..  vdbeSorter
164b0 52 65 77 69 6e 64 44 65 62 75 67 28 22 72 65 77  RewindDebug("rew
164c0 69 6e 64 64 6f 6e 65 22 29 3b 0a 20 20 72 65 74  inddone");.  ret
164d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
164e0 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   Advance to the 
164f0 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20  next element in 
16500 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 69  the sorter..*/.i
16510 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f  nt sqlite3VdbeSo
16520 72 74 65 72 4e 65 78 74 28 73 71 6c 69 74 65 33  rterNext(sqlite3
16530 20 2a 64 62 2c 20 63 6f 6e 73 74 20 56 64 62 65   *db, const Vdbe
16540 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 69 6e  Cursor *pCsr, in
16550 74 20 2a 70 62 45 6f 66 29 7b 0a 20 20 56 64 62  t *pbEof){.  Vdb
16560 65 53 6f 72 74 65 72 20 2a 70 53 6f 72 74 65 72  eSorter *pSorter
16570 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  ;.  int rc;     
16580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16590 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
165a0 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  de */..  assert(
165b0 20 70 43 73 72 2d 3e 65 43 75 72 54 79 70 65 3d   pCsr->eCurType=
165c0 3d 43 55 52 54 59 50 45 5f 53 4f 52 54 45 52 20  =CURTYPE_SORTER 
165d0 29 3b 0a 20 20 70 53 6f 72 74 65 72 20 3d 20 70  );.  pSorter = p
165e0 43 73 72 2d 3e 75 63 2e 70 53 6f 72 74 65 72 3b  Csr->uc.pSorter;
165f0 0a 20 20 61 73 73 65 72 74 28 20 70 53 6f 72 74  .  assert( pSort
16600 65 72 2d 3e 62 55 73 65 50 4d 41 20 7c 7c 20 28  er->bUsePMA || (
16610 70 53 6f 72 74 65 72 2d 3e 70 52 65 61 64 65 72  pSorter->pReader
16620 3d 3d 30 20 26 26 20 70 53 6f 72 74 65 72 2d 3e  ==0 && pSorter->
16630 70 4d 65 72 67 65 72 3d 3d 30 29 20 29 3b 0a 20  pMerger==0) );. 
16640 20 69 66 28 20 70 53 6f 72 74 65 72 2d 3e 62 55   if( pSorter->bU
16650 73 65 50 4d 41 20 29 7b 0a 20 20 20 20 61 73 73  sePMA ){.    ass
16660 65 72 74 28 20 70 53 6f 72 74 65 72 2d 3e 70 52  ert( pSorter->pR
16670 65 61 64 65 72 3d 3d 30 20 7c 7c 20 70 53 6f 72  eader==0 || pSor
16680 74 65 72 2d 3e 70 4d 65 72 67 65 72 3d 3d 30 20  ter->pMerger==0 
16690 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
166a0 53 6f 72 74 65 72 2d 3e 62 55 73 65 54 68 72 65  Sorter->bUseThre
166b0 61 64 73 3d 3d 30 20 7c 7c 20 70 53 6f 72 74 65  ads==0 || pSorte
166c0 72 2d 3e 70 52 65 61 64 65 72 20 29 3b 0a 20 20  r->pReader );.  
166d0 20 20 61 73 73 65 72 74 28 20 70 53 6f 72 74 65    assert( pSorte
166e0 72 2d 3e 62 55 73 65 54 68 72 65 61 64 73 3d 3d  r->bUseThreads==
166f0 31 20 7c 7c 20 70 53 6f 72 74 65 72 2d 3e 70 4d  1 || pSorter->pM
16700 65 72 67 65 72 20 29 3b 0a 23 69 66 20 53 51 4c  erger );.#if SQL
16710 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54  ITE_MAX_WORKER_T
16720 48 52 45 41 44 53 3e 30 0a 20 20 20 20 69 66 28  HREADS>0.    if(
16730 20 70 53 6f 72 74 65 72 2d 3e 62 55 73 65 54 68   pSorter->bUseTh
16740 72 65 61 64 73 20 29 7b 0a 20 20 20 20 20 20 72  reads ){.      r
16750 63 20 3d 20 76 64 62 65 50 6d 61 52 65 61 64 65  c = vdbePmaReade
16760 72 4e 65 78 74 28 70 53 6f 72 74 65 72 2d 3e 70  rNext(pSorter->p
16770 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20 2a  Reader);.      *
16780 70 62 45 6f 66 20 3d 20 28 70 53 6f 72 74 65 72  pbEof = (pSorter
16790 2d 3e 70 52 65 61 64 65 72 2d 3e 70 46 64 3d 3d  ->pReader->pFd==
167a0 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65  0);.    }else.#e
167b0 6e 64 69 66 0a 20 20 20 20 2f 2a 69 66 28 20 21  ndif.    /*if( !
167c0 70 53 6f 72 74 65 72 2d 3e 62 55 73 65 54 68 72  pSorter->bUseThr
167d0 65 61 64 73 20 29 2a 2f 20 7b 0a 20 20 20 20 20  eads )*/ {.     
167e0 20 61 73 73 65 72 74 28 20 70 53 6f 72 74 65 72   assert( pSorter
167f0 2d 3e 70 4d 65 72 67 65 72 21 3d 30 20 29 3b 0a  ->pMerger!=0 );.
16800 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
16810 6f 72 74 65 72 2d 3e 70 4d 65 72 67 65 72 2d 3e  orter->pMerger->
16820 70 54 61 73 6b 3d 3d 28 26 70 53 6f 72 74 65 72  pTask==(&pSorter
16830 2d 3e 61 54 61 73 6b 5b 30 5d 29 20 29 3b 0a 20  ->aTask[0]) );. 
16840 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 4d 65       rc = vdbeMe
16850 72 67 65 45 6e 67 69 6e 65 53 74 65 70 28 70 53  rgeEngineStep(pS
16860 6f 72 74 65 72 2d 3e 70 4d 65 72 67 65 72 2c 20  orter->pMerger, 
16870 70 62 45 6f 66 29 3b 0a 20 20 20 20 7d 0a 20 20  pbEof);.    }.  
16880 7d 65 6c 73 65 7b 0a 20 20 20 20 53 6f 72 74 65  }else{.    Sorte
16890 72 52 65 63 6f 72 64 20 2a 70 46 72 65 65 20 3d  rRecord *pFree =
168a0 20 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74 2e 70   pSorter->list.p
168b0 4c 69 73 74 3b 0a 20 20 20 20 70 53 6f 72 74 65  List;.    pSorte
168c0 72 2d 3e 6c 69 73 74 2e 70 4c 69 73 74 20 3d 20  r->list.pList = 
168d0 70 46 72 65 65 2d 3e 75 2e 70 4e 65 78 74 3b 0a  pFree->u.pNext;.
168e0 20 20 20 20 70 46 72 65 65 2d 3e 75 2e 70 4e 65      pFree->u.pNe
168f0 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  xt = 0;.    if( 
16900 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74 2e 61 4d  pSorter->list.aM
16910 65 6d 6f 72 79 3d 3d 30 20 29 20 76 64 62 65 53  emory==0 ) vdbeS
16920 6f 72 74 65 72 52 65 63 6f 72 64 46 72 65 65 28  orterRecordFree(
16930 64 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20  db, pFree);.    
16940 2a 70 62 45 6f 66 20 3d 20 21 70 53 6f 72 74 65  *pbEof = !pSorte
16950 72 2d 3e 6c 69 73 74 2e 70 4c 69 73 74 3b 0a 20  r->list.pList;. 
16960 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
16970 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  K;.  }.  return 
16980 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
16990 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
169a0 20 61 20 62 75 66 66 65 72 20 6f 77 6e 65 64 20   a buffer owned 
169b0 62 79 20 74 68 65 20 73 6f 72 74 65 72 20 74 68  by the sorter th
169c0 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
169d0 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6b 65 79 2e  .** current key.
169e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
169f0 2a 76 64 62 65 53 6f 72 74 65 72 52 6f 77 6b 65  *vdbeSorterRowke
16a00 79 28 0a 20 20 63 6f 6e 73 74 20 56 64 62 65 53  y(.  const VdbeS
16a10 6f 72 74 65 72 20 2a 70 53 6f 72 74 65 72 2c 20  orter *pSorter, 
16a20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65 72 20 6f       /* Sorter o
16a30 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a  bject */.  int *
16a40 70 6e 4b 65 79 20 20 20 20 20 20 20 20 20 20 20  pnKey           
16a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
16a60 54 3a 20 53 69 7a 65 20 6f 66 20 63 75 72 72 65  T: Size of curre
16a70 6e 74 20 6b 65 79 20 69 6e 20 62 79 74 65 73 20  nt key in bytes 
16a80 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4b  */.){.  void *pK
16a90 65 79 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 65  ey;.  if( pSorte
16aa0 72 2d 3e 62 55 73 65 50 4d 41 20 29 7b 0a 20 20  r->bUsePMA ){.  
16ab0 20 20 50 6d 61 52 65 61 64 65 72 20 2a 70 52 65    PmaReader *pRe
16ac0 61 64 65 72 3b 0a 23 69 66 20 53 51 4c 49 54 45  ader;.#if SQLITE
16ad0 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45  _MAX_WORKER_THRE
16ae0 41 44 53 3e 30 0a 20 20 20 20 69 66 28 20 70 53  ADS>0.    if( pS
16af0 6f 72 74 65 72 2d 3e 62 55 73 65 54 68 72 65 61  orter->bUseThrea
16b00 64 73 20 29 7b 0a 20 20 20 20 20 20 70 52 65 61  ds ){.      pRea
16b10 64 65 72 20 3d 20 70 53 6f 72 74 65 72 2d 3e 70  der = pSorter->p
16b20 52 65 61 64 65 72 3b 0a 20 20 20 20 7d 65 6c 73  Reader;.    }els
16b30 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 69  e.#endif.    /*i
16b40 66 28 20 21 70 53 6f 72 74 65 72 2d 3e 62 55 73  f( !pSorter->bUs
16b50 65 54 68 72 65 61 64 73 20 29 2a 2f 7b 0a 20 20  eThreads )*/{.  
16b60 20 20 20 20 70 52 65 61 64 65 72 20 3d 20 26 70      pReader = &p
16b70 53 6f 72 74 65 72 2d 3e 70 4d 65 72 67 65 72 2d  Sorter->pMerger-
16b80 3e 61 52 65 61 64 72 5b 70 53 6f 72 74 65 72 2d  >aReadr[pSorter-
16b90 3e 70 4d 65 72 67 65 72 2d 3e 61 54 72 65 65 5b  >pMerger->aTree[
16ba0 31 5d 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  1]];.    }.    *
16bb0 70 6e 4b 65 79 20 3d 20 70 52 65 61 64 65 72 2d  pnKey = pReader-
16bc0 3e 6e 4b 65 79 3b 0a 20 20 20 20 70 4b 65 79 20  >nKey;.    pKey 
16bd0 3d 20 70 52 65 61 64 65 72 2d 3e 61 4b 65 79 3b  = pReader->aKey;
16be0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
16bf0 6e 4b 65 79 20 3d 20 70 53 6f 72 74 65 72 2d 3e  nKey = pSorter->
16c00 6c 69 73 74 2e 70 4c 69 73 74 2d 3e 6e 56 61 6c  list.pList->nVal
16c10 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 53 52 56  ;.    pKey = SRV
16c20 41 4c 28 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74  AL(pSorter->list
16c30 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 72  .pList);.  }.  r
16c40 65 74 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a 0a 2f  eturn pKey;.}../
16c50 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 63 75  *.** Copy the cu
16c60 72 72 65 6e 74 20 73 6f 72 74 65 72 20 6b 65 79  rrent sorter key
16c70 20 69 6e 74 6f 20 74 68 65 20 6d 65 6d 6f 72 79   into the memory
16c80 20 63 65 6c 6c 20 70 4f 75 74 2e 0a 2a 2f 0a 69   cell pOut..*/.i
16c90 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f  nt sqlite3VdbeSo
16ca0 72 74 65 72 52 6f 77 6b 65 79 28 63 6f 6e 73 74  rterRowkey(const
16cb0 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 73   VdbeCursor *pCs
16cc0 72 2c 20 4d 65 6d 20 2a 70 4f 75 74 29 7b 0a 20  r, Mem *pOut){. 
16cd0 20 56 64 62 65 53 6f 72 74 65 72 20 2a 70 53 6f   VdbeSorter *pSo
16ce0 72 74 65 72 3b 0a 20 20 76 6f 69 64 20 2a 70 4b  rter;.  void *pK
16cf0 65 79 3b 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20  ey; int nKey;   
16d00 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65          /* Sorte
16d10 72 20 6b 65 79 20 74 6f 20 63 6f 70 79 20 69 6e  r key to copy in
16d20 74 6f 20 70 4f 75 74 20 2a 2f 0a 0a 20 20 61 73  to pOut */..  as
16d30 73 65 72 74 28 20 70 43 73 72 2d 3e 65 43 75 72  sert( pCsr->eCur
16d40 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 53 4f  Type==CURTYPE_SO
16d50 52 54 45 52 20 29 3b 0a 20 20 70 53 6f 72 74 65  RTER );.  pSorte
16d60 72 20 3d 20 70 43 73 72 2d 3e 75 63 2e 70 53 6f  r = pCsr->uc.pSo
16d70 72 74 65 72 3b 0a 20 20 70 4b 65 79 20 3d 20 76  rter;.  pKey = v
16d80 64 62 65 53 6f 72 74 65 72 52 6f 77 6b 65 79 28  dbeSorterRowkey(
16d90 70 53 6f 72 74 65 72 2c 20 26 6e 4b 65 79 29 3b  pSorter, &nKey);
16da0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64  .  if( sqlite3Vd
16db0 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73  beMemClearAndRes
16dc0 69 7a 65 28 70 4f 75 74 2c 20 6e 4b 65 79 29 20  ize(pOut, nKey) 
16dd0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
16de0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
16df0 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 6e 4b 65 79    pOut->n = nKey
16e00 3b 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c  ;.  MemSetTypeFl
16e10 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 42 6c 6f  ag(pOut, MEM_Blo
16e20 62 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4f 75  b);.  memcpy(pOu
16e30 74 2d 3e 7a 2c 20 70 4b 65 79 2c 20 6e 4b 65 79  t->z, pKey, nKey
16e40 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  );..  return SQL
16e50 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
16e60 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79   Compare the key
16e70 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20   in memory cell 
16e80 70 56 61 6c 20 77 69 74 68 20 74 68 65 20 6b 65  pVal with the ke
16e90 79 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 65  y that the sorte
16ea0 72 20 63 75 72 73 6f 72 0a 2a 2a 20 70 61 73 73  r cursor.** pass
16eb0 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
16ec0 61 72 67 75 6d 65 6e 74 20 63 75 72 72 65 6e 74  argument current
16ed0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 46 6f  ly points to. Fo
16ee0 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
16ef0 66 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72 69  f.** the compari
16f00 73 6f 6e 2c 20 69 67 6e 6f 72 65 20 74 68 65 20  son, ignore the 
16f10 72 6f 77 69 64 20 66 69 65 6c 64 20 61 74 20 74  rowid field at t
16f20 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 72  he end of each r
16f30 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ecord..**.** If 
16f40 74 68 65 20 73 6f 72 74 65 72 20 63 75 72 73 6f  the sorter curso
16f50 72 20 6b 65 79 20 63 6f 6e 74 61 69 6e 73 20 61  r key contains a
16f60 6e 79 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20  ny NULL values, 
16f70 63 6f 6e 73 69 64 65 72 20 69 74 20 74 6f 20 62  consider it to b
16f80 65 0a 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 70  e.** less than p
16f90 56 61 6c 2e 20 45 76 65 6e 20 69 66 20 70 56 61  Val. Even if pVa
16fa0 6c 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20  l also contains 
16fb0 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a  NULL values..**.
16fc0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
16fd0 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e  ccurs, return an
16fe0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
16ff0 64 65 20 28 69 2e 65 2e 20 53 51 4c 49 54 45 5f  de (i.e. SQLITE_
17000 4e 4f 4d 45 4d 29 2e 0a 2a 2a 20 4f 74 68 65 72  NOMEM)..** Other
17010 77 69 73 65 2c 20 73 65 74 20 2a 70 52 65 73 20  wise, set *pRes 
17020 74 6f 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a  to a negative, z
17030 65 72 6f 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ero or positive 
17040 76 61 6c 75 65 20 69 66 20 74 68 65 0a 2a 2a 20  value if the.** 
17050 6b 65 79 20 69 6e 20 70 56 61 6c 20 69 73 20 73  key in pVal is s
17060 6d 61 6c 6c 65 72 20 74 68 61 6e 2c 20 65 71 75  maller than, equ
17070 61 6c 20 74 6f 20 6f 72 20 6c 61 72 67 65 72 20  al to or larger 
17080 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
17090 20 73 6f 72 74 65 72 0a 2a 2a 20 6b 65 79 2e 0a   sorter.** key..
170a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
170b0 6e 65 20 66 6f 72 6d 73 20 74 68 65 20 63 6f 72  ne forms the cor
170c0 65 20 6f 66 20 74 68 65 20 4f 50 5f 53 6f 72 74  e of the OP_Sort
170d0 65 72 43 6f 6d 70 61 72 65 20 6f 70 63 6f 64 65  erCompare opcode
170e0 2c 20 77 68 69 63 68 20 69 6e 0a 2a 2a 20 74 75  , which in.** tu
170f0 72 6e 20 69 73 20 75 73 65 64 20 74 6f 20 76 65  rn is used to ve
17100 72 69 66 79 20 75 6e 69 71 75 65 6e 65 73 73 20  rify uniqueness 
17110 77 68 65 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e  when constructin
17120 67 20 61 20 55 4e 49 51 55 45 20 49 4e 44 45 58  g a UNIQUE INDEX
17130 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17140 56 64 62 65 53 6f 72 74 65 72 43 6f 6d 70 61 72  VdbeSorterCompar
17150 65 28 0a 20 20 63 6f 6e 73 74 20 56 64 62 65 43  e(.  const VdbeC
17160 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 20 20 20  ursor *pCsr,    
17170 20 20 20 20 20 2f 2a 20 53 6f 72 74 65 72 20 63       /* Sorter c
17180 75 72 73 6f 72 20 2a 2f 0a 20 20 4d 65 6d 20 2a  ursor */.  Mem *
17190 70 56 61 6c 2c 20 20 20 20 20 20 20 20 20 20 20  pVal,           
171a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
171b0 6c 75 65 20 74 6f 20 63 6f 6d 70 61 72 65 20 74  lue to compare t
171c0 6f 20 63 75 72 72 65 6e 74 20 73 6f 72 74 65 72  o current sorter
171d0 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b   key */.  int nK
171e0 65 79 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20  eyCol,          
171f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
17200 70 61 72 65 20 74 68 69 73 20 6d 61 6e 79 20 63  pare this many c
17210 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  olumns */.  int 
17220 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
17230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
17240 55 54 3a 20 52 65 73 75 6c 74 20 6f 66 20 63 6f  UT: Result of co
17250 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 29 7b 0a 20  mparison */.){. 
17260 20 56 64 62 65 53 6f 72 74 65 72 20 2a 70 53 6f   VdbeSorter *pSo
17270 72 74 65 72 3b 0a 20 20 55 6e 70 61 63 6b 65 64  rter;.  Unpacked
17280 52 65 63 6f 72 64 20 2a 72 32 3b 0a 20 20 4b 65  Record *r2;.  Ke
17290 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
172a0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 76 6f 69 64  .  int i;.  void
172b0 20 2a 70 4b 65 79 3b 20 69 6e 74 20 6e 4b 65 79   *pKey; int nKey
172c0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
172d0 6f 72 74 65 72 20 6b 65 79 20 74 6f 20 63 6f 6d  orter key to com
172e0 70 61 72 65 20 70 56 61 6c 20 77 69 74 68 20 2a  pare pVal with *
172f0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 73  /..  assert( pCs
17300 72 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  r->eCurType==CUR
17310 54 59 50 45 5f 53 4f 52 54 45 52 20 29 3b 0a 20  TYPE_SORTER );. 
17320 20 70 53 6f 72 74 65 72 20 3d 20 70 43 73 72 2d   pSorter = pCsr-
17330 3e 75 63 2e 70 53 6f 72 74 65 72 3b 0a 20 20 72  >uc.pSorter;.  r
17340 32 20 3d 20 70 53 6f 72 74 65 72 2d 3e 70 55 6e  2 = pSorter->pUn
17350 70 61 63 6b 65 64 3b 0a 20 20 70 4b 65 79 49 6e  packed;.  pKeyIn
17360 66 6f 20 3d 20 70 43 73 72 2d 3e 70 4b 65 79 49  fo = pCsr->pKeyI
17370 6e 66 6f 3b 0a 20 20 69 66 28 20 72 32 3d 3d 30  nfo;.  if( r2==0
17380 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 3b   ){.    char *p;
17390 0a 20 20 20 20 72 32 20 3d 20 70 53 6f 72 74 65  .    r2 = pSorte
173a0 72 2d 3e 70 55 6e 70 61 63 6b 65 64 20 3d 20 73  r->pUnpacked = s
173b0 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55  qlite3VdbeAllocU
173c0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 70 4b  npackedRecord(pK
173d0 65 79 49 6e 66 6f 2c 30 2c 30 2c 26 70 29 3b 0a  eyInfo,0,0,&p);.
173e0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 6f 72      assert( pSor
173f0 74 65 72 2d 3e 70 55 6e 70 61 63 6b 65 64 3d 3d  ter->pUnpacked==
17400 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 2a  (UnpackedRecord*
17410 29 70 20 29 3b 0a 20 20 20 20 69 66 28 20 72 32  )p );.    if( r2
17420 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
17430 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72  ITE_NOMEM;.    r
17440 32 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 4b 65 79  2->nField = nKey
17450 43 6f 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  Col;.  }.  asser
17460 74 28 20 72 32 2d 3e 6e 46 69 65 6c 64 3d 3d 6e  t( r2->nField==n
17470 4b 65 79 43 6f 6c 20 29 3b 0a 0a 20 20 70 4b 65  KeyCol );..  pKe
17480 79 20 3d 20 76 64 62 65 53 6f 72 74 65 72 52 6f  y = vdbeSorterRo
17490 77 6b 65 79 28 70 53 6f 72 74 65 72 2c 20 26 6e  wkey(pSorter, &n
174a0 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Key);.  sqlite3V
174b0 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
174c0 70 4b 65 79 49 6e 66 6f 2c 20 6e 4b 65 79 2c 20  pKeyInfo, nKey, 
174d0 70 4b 65 79 2c 20 72 32 29 3b 0a 20 20 66 6f 72  pKey, r2);.  for
174e0 28 69 3d 30 3b 20 69 3c 6e 4b 65 79 43 6f 6c 3b  (i=0; i<nKeyCol;
174f0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72   i++){.    if( r
17500 32 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73  2->aMem[i].flags
17510 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20   & MEM_Null ){. 
17520 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b       *pRes = -1;
17530 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
17540 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
17550 20 7d 0a 0a 20 20 2a 70 52 65 73 20 3d 20 73 71   }..  *pRes = sq
17560 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
17570 6f 6d 70 61 72 65 28 70 56 61 6c 2d 3e 6e 2c 20  ompare(pVal->n, 
17580 70 56 61 6c 2d 3e 7a 2c 20 72 32 29 3b 0a 20 20  pVal->z, r2);.  
17590 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
175a0 3b 0a 7d 0a                                      ;.}.