/ Hex Artifact Content
Login

Artifact 02646a9f86421776ae5d7594f620f9ed669d3698:


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 73 71 6c 69 74 65 33 5f 63 6f  ng.** sqlite3_co
13f0: 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46  nfig(SQLITE_CONF
1400: 49 47 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  IG_WORKER_THREAD
1410: 53 2c 20 2e 2e 2e 29 2e 0a 2a 2a 0a 2a 2a 20 57  S, ...)..**.** W
1420: 68 65 6e 20 52 65 77 69 6e 64 28 29 20 69 73 20  hen Rewind() is 
1430: 63 61 6c 6c 65 64 2c 20 61 6e 79 20 64 61 74 61  called, any data
1440: 20 72 65 6d 61 69 6e 69 6e 67 20 69 6e 20 6d 65   remaining in me
1450: 6d 6f 72 79 20 69 73 20 66 6c 75 73 68 65 64 20  mory is flushed 
1460: 74 6f 20 61 20 0a 2a 2a 20 66 69 6e 61 6c 20 50  to a .** final P
1470: 4d 41 2e 20 53 6f 20 61 74 20 74 68 69 73 20 70  MA. So at this p
1480: 6f 69 6e 74 20 74 68 65 20 64 61 74 61 20 69 73  oint the data is
1490: 20 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20   stored in some 
14a0: 6e 75 6d 62 65 72 20 6f 66 20 73 6f 72 74 65 64  number of sorted
14b0: 0a 2a 2a 20 50 4d 41 73 20 77 69 74 68 69 6e 20  .** PMAs within 
14c0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20  temporary files 
14d0: 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49  on disk..**.** I
14e0: 66 20 74 68 65 72 65 20 61 72 65 20 66 65 77 65  f there are fewe
14f0: 72 20 74 68 61 6e 20 53 4f 52 54 45 52 5f 4d 41  r than SORTER_MA
1500: 58 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 20 50 4d  X_MERGE_COUNT PM
1510: 41 73 20 69 6e 20 74 6f 74 61 6c 20 61 6e 64 20  As in total and 
1520: 74 68 65 0a 2a 2a 20 73 6f 72 74 65 72 20 69 73  the.** sorter is
1530: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 69 6e 67   running in sing
1540: 6c 65 2d 74 68 72 65 61 64 65 64 20 6d 6f 64 65  le-threaded mode
1550: 2c 20 74 68 65 6e 20 74 68 65 73 65 20 50 4d 41  , then these PMA
1560: 73 20 61 72 65 20 6d 65 72 67 65 64 0a 2a 2a 20  s are merged.** 
1570: 69 6e 63 72 65 6d 65 6e 74 61 6c 6c 79 20 61 73  incrementally as
1580: 20 6b 65 79 73 20 61 72 65 20 72 65 74 72 65 69   keys are retrei
1590: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 73 6f 72  ved from the sor
15a0: 74 65 72 20 62 79 20 74 68 65 20 56 44 42 45 2e  ter by the VDBE.
15b0: 20 20 54 68 65 0a 2a 2a 20 4d 65 72 67 65 45 6e    The.** MergeEn
15c0: 67 69 6e 65 20 6f 62 6a 65 63 74 2c 20 64 65 73  gine object, des
15d0: 63 72 69 62 65 64 20 69 6e 20 66 75 72 74 68 65  cribed in furthe
15e0: 72 20 64 65 74 61 69 6c 20 62 65 6c 6f 77 2c 20  r detail below, 
15f0: 70 65 72 66 6f 72 6d 73 20 74 68 69 73 0a 2a 2a  performs this.**
1600: 20 6d 65 72 67 65 2e 0a 2a 2a 0a 2a 2a 20 4f 72   merge..**.** Or
1610: 2c 20 69 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20  , if running in 
1620: 6d 75 6c 74 69 2d 74 68 72 65 61 64 65 64 20 6d  multi-threaded m
1630: 6f 64 65 2c 20 74 68 65 6e 20 61 20 62 61 63 6b  ode, then a back
1640: 67 72 6f 75 6e 64 20 74 68 72 65 61 64 20 69 73  ground thread is
1650: 0a 2a 2a 20 6c 61 75 6e 63 68 65 64 20 74 6f 20  .** launched to 
1660: 6d 65 72 67 65 20 74 68 65 20 65 78 69 73 74 69  merge the existi
1670: 6e 67 20 50 4d 41 73 2e 20 4f 6e 63 65 20 74 68  ng PMAs. Once th
1680: 65 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72  e background thr
1690: 65 61 64 20 68 61 73 0a 2a 2a 20 6d 65 72 67 65  ead has.** merge
16a0: 64 20 54 20 62 79 74 65 73 20 6f 66 20 64 61 74  d T bytes of dat
16b0: 61 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  a into a single 
16c0: 73 6f 72 74 65 64 20 50 4d 41 2c 20 74 68 65 20  sorted PMA, the 
16d0: 6d 61 69 6e 20 74 68 72 65 61 64 20 0a 2a 2a 20  main thread .** 
16e0: 62 65 67 69 6e 73 20 72 65 61 64 69 6e 67 20 6b  begins reading k
16f0: 65 79 73 20 66 72 6f 6d 20 74 68 61 74 20 50 4d  eys from that PM
1700: 41 20 77 68 69 6c 65 20 74 68 65 20 62 61 63 6b  A while the back
1710: 67 72 6f 75 6e 64 20 74 68 72 65 61 64 20 70 72  ground thread pr
1720: 6f 63 65 65 64 73 0a 2a 2a 20 77 69 74 68 20 6d  oceeds.** with m
1730: 65 72 67 69 6e 67 20 74 68 65 20 6e 65 78 74 20  erging the next 
1740: 54 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e  T bytes of data.
1750: 20 41 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 0a 2a   And so on..**.*
1760: 2a 20 50 61 72 61 6d 65 74 65 72 20 54 20 69 73  * Parameter T is
1770: 20 73 65 74 20 74 6f 20 68 61 6c 66 20 74 68 65   set to half the
1780: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6d 65   value of the me
1790: 6d 6f 72 79 20 74 68 72 65 73 68 6f 6c 64 20 75  mory threshold u
17a0: 73 65 64 20 0a 2a 2a 20 62 79 20 57 72 69 74 65  sed .** by Write
17b0: 28 29 20 61 62 6f 76 65 20 74 6f 20 64 65 74 65  () above to dete
17c0: 72 6d 69 6e 65 20 77 68 65 6e 20 74 6f 20 63 72  rmine when to cr
17d0: 65 61 74 65 20 61 20 6e 65 77 20 50 4d 41 2e 0a  eate a new PMA..
17e0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  **.** If there a
17f0: 72 65 20 6d 6f 72 65 20 74 68 61 6e 20 53 4f 52  re more than SOR
1800: 54 45 52 5f 4d 41 58 5f 4d 45 52 47 45 5f 43 4f  TER_MAX_MERGE_CO
1810: 55 4e 54 20 50 4d 41 73 20 69 6e 20 74 6f 74 61  UNT PMAs in tota
1820: 6c 20 77 68 65 6e 20 0a 2a 2a 20 52 65 77 69 6e  l when .** Rewin
1830: 64 28 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  d() is called, t
1840: 68 65 6e 20 61 20 68 69 65 72 61 72 63 68 79 20  hen a hierarchy 
1850: 6f 66 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 6d  of incremental-m
1860: 65 72 67 65 73 20 69 73 20 75 73 65 64 2e 20 0a  erges is used. .
1870: 2a 2a 20 46 69 72 73 74 2c 20 54 20 62 79 74 65  ** First, T byte
1880: 73 20 6f 66 20 64 61 74 61 20 66 72 6f 6d 20 74  s of data from t
1890: 68 65 20 66 69 72 73 74 20 53 4f 52 54 45 52 5f  he first SORTER_
18a0: 4d 41 58 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 20  MAX_MERGE_COUNT 
18b0: 50 4d 41 73 20 6f 6e 20 0a 2a 2a 20 64 69 73 6b  PMAs on .** disk
18c0: 20 61 72 65 20 6d 65 72 67 65 64 20 74 6f 67 65   are merged toge
18d0: 74 68 65 72 2e 20 54 68 65 6e 20 54 20 62 79 74  ther. Then T byt
18e0: 65 73 20 6f 66 20 64 61 74 61 20 66 72 6f 6d 20  es of data from 
18f0: 74 68 65 20 73 65 63 6f 6e 64 20 73 65 74 2c 20  the second set, 
1900: 61 6e 64 0a 2a 2a 20 73 6f 20 6f 6e 2c 20 73 75  and.** so on, su
1910: 63 68 20 74 68 61 74 20 6e 6f 20 6f 70 65 72 61  ch that no opera
1920: 74 69 6f 6e 20 65 76 65 72 20 6d 65 72 67 65 73  tion ever merges
1930: 20 6d 6f 72 65 20 74 68 61 6e 20 53 4f 52 54 45   more than SORTE
1940: 52 5f 4d 41 58 5f 4d 45 52 47 45 5f 43 4f 55 4e  R_MAX_MERGE_COUN
1950: 54 0a 2a 2a 20 50 4d 41 73 20 61 74 20 61 20 74  T.** PMAs at a t
1960: 69 6d 65 2e 20 54 68 69 73 20 64 6f 6e 65 20 69  ime. This done i
1970: 73 20 74 6f 20 69 6d 70 72 6f 76 65 20 6c 6f 63  s to improve loc
1980: 61 6c 69 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ality..**.** If 
1990: 72 75 6e 6e 69 6e 67 20 69 6e 20 6d 75 6c 74 69  running in multi
19a0: 2d 74 68 72 65 61 64 65 64 20 6d 6f 64 65 20 61  -threaded mode a
19b0: 6e 64 20 74 68 65 72 65 20 61 72 65 20 6d 6f 72  nd there are mor
19c0: 65 20 74 68 61 6e 0a 2a 2a 20 53 4f 52 54 45 52  e than.** SORTER
19d0: 5f 4d 41 58 5f 4d 45 52 47 45 5f 43 4f 55 4e 54  _MAX_MERGE_COUNT
19e0: 20 50 4d 41 73 20 6f 6e 20 64 69 73 6b 20 77 68   PMAs on disk wh
19f0: 65 6e 20 52 65 77 69 6e 64 28 29 20 69 73 20 63  en Rewind() is c
1a00: 61 6c 6c 65 64 2c 20 74 68 65 6e 20 6d 6f 72 65  alled, then more
1a10: 0a 2a 2a 20 74 68 61 6e 20 6f 6e 65 20 62 61 63  .** than one bac
1a20: 6b 67 72 6f 75 6e 64 20 74 68 72 65 61 64 20 6d  kground thread m
1a30: 61 79 20 62 65 20 63 72 65 61 74 65 64 2e 20 53  ay be created. S
1a40: 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65  pecifically, the
1a50: 72 65 20 6d 61 79 20 62 65 0a 2a 2a 20 6f 6e 65  re may be.** one
1a60: 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72 65   background thre
1a70: 61 64 20 66 6f 72 20 65 61 63 68 20 74 65 6d 70  ad for each temp
1a80: 6f 72 61 72 79 20 66 69 6c 65 20 6f 6e 20 64 69  orary file on di
1a90: 73 6b 2c 20 61 6e 64 20 6f 6e 65 20 62 61 63 6b  sk, and one back
1aa0: 67 72 6f 75 6e 64 0a 2a 2a 20 74 68 72 65 61 64  ground.** thread
1ab0: 20 74 6f 20 6d 65 72 67 65 20 74 68 65 20 6f 75   to merge the ou
1ac0: 74 70 75 74 20 6f 66 20 65 61 63 68 20 6f 66 20  tput of each of 
1ad0: 74 68 65 20 6f 74 68 65 72 73 20 74 6f 20 61 20  the others to a 
1ae0: 73 69 6e 67 6c 65 20 50 4d 41 20 66 6f 72 0a 2a  single PMA for.*
1af0: 2a 20 74 68 65 20 6d 61 69 6e 20 74 68 72 65 61  * the main threa
1b00: 64 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 2e 0a  d to read from..
1b10: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  */.#include "sql
1b20: 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75  iteInt.h".#inclu
1b30: 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22 0a 0a  de "vdbeInt.h"..
1b40: 2f 2a 20 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  /* .** If SQLITE
1b50: 5f 44 45 42 55 47 5f 53 4f 52 54 45 52 5f 54 48  _DEBUG_SORTER_TH
1b60: 52 45 41 44 53 20 69 73 20 64 65 66 69 6e 65 64  READS is defined
1b70: 2c 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 6f 75  , this module ou
1b80: 74 70 75 74 73 20 76 61 72 69 6f 75 73 0a 2a 2a  tputs various.**
1b90: 20 6d 65 73 73 61 67 65 73 20 74 6f 20 73 74 64   messages to std
1ba0: 65 72 72 20 74 68 61 74 20 6d 61 79 20 62 65 20  err that may be 
1bb0: 68 65 6c 70 66 75 6c 20 69 6e 20 75 6e 64 65 72  helpful in under
1bc0: 73 74 61 6e 64 69 6e 67 20 74 68 65 20 70 65 72  standing the per
1bd0: 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 63 68 61 72  formance.** char
1be0: 61 63 74 65 72 69 73 74 69 63 73 20 6f 66 20 74  acteristics of t
1bf0: 68 65 20 73 6f 72 74 65 72 20 69 6e 20 6d 75 6c  he sorter in mul
1c00: 74 69 2d 74 68 72 65 61 64 65 64 20 6d 6f 64 65  ti-threaded mode
1c10: 2e 0a 2a 2f 0a 23 69 66 20 30 0a 23 20 64 65 66  ..*/.#if 0.# def
1c20: 69 6e 65 20 53 51 4c 49 54 45 5f 44 45 42 55 47  ine SQLITE_DEBUG
1c30: 5f 53 4f 52 54 45 52 5f 54 48 52 45 41 44 53 20  _SORTER_THREADS 
1c40: 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  1.#endif../*.** 
1c50: 50 72 69 76 61 74 65 20 6f 62 6a 65 63 74 73 20  Private objects 
1c60: 75 73 65 64 20 62 79 20 74 68 65 20 73 6f 72 74  used by the sort
1c70: 65 72 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  er.*/.typedef st
1c80: 72 75 63 74 20 4d 65 72 67 65 45 6e 67 69 6e 65  ruct MergeEngine
1c90: 20 4d 65 72 67 65 45 6e 67 69 6e 65 3b 20 20 20   MergeEngine;   
1ca0: 20 20 2f 2a 20 4d 65 72 67 65 20 50 4d 41 73 20    /* Merge PMAs 
1cb0: 74 6f 67 65 74 68 65 72 20 2a 2f 0a 74 79 70 65  together */.type
1cc0: 64 65 66 20 73 74 72 75 63 74 20 50 6d 61 52 65  def struct PmaRe
1cd0: 61 64 65 72 20 50 6d 61 52 65 61 64 65 72 3b 20  ader PmaReader; 
1ce0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65          /* Incre
1cf0: 6d 65 6e 74 61 6c 6c 79 20 72 65 61 64 20 6f 6e  mentally read on
1d00: 65 20 50 4d 41 20 2a 2f 0a 74 79 70 65 64 65 66  e PMA */.typedef
1d10: 20 73 74 72 75 63 74 20 50 6d 61 57 72 69 74 65   struct PmaWrite
1d20: 72 20 50 6d 61 57 72 69 74 65 72 3b 20 20 20 20  r PmaWriter;    
1d30: 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e       /* Incremen
1d40: 74 61 6c 6c 79 20 77 72 69 74 65 20 6f 6e 65 20  tally write one 
1d50: 50 4d 41 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  PMA */.typedef s
1d60: 74 72 75 63 74 20 53 6f 72 74 65 72 52 65 63 6f  truct SorterReco
1d70: 72 64 20 53 6f 72 74 65 72 52 65 63 6f 72 64 3b  rd SorterRecord;
1d80: 20 20 20 2f 2a 20 41 20 72 65 63 6f 72 64 20 62     /* A record b
1d90: 65 69 6e 67 20 73 6f 72 74 65 64 20 2a 2f 0a 74  eing sorted */.t
1da0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53 6f  ypedef struct So
1db0: 72 74 53 75 62 74 61 73 6b 20 53 6f 72 74 53 75  rtSubtask SortSu
1dc0: 62 74 61 73 6b 3b 20 20 20 20 20 2f 2a 20 41 20  btask;     /* A 
1dd0: 73 75 62 2d 74 61 73 6b 20 69 6e 20 74 68 65 20  sub-task in the 
1de0: 73 6f 72 74 20 70 72 6f 63 65 73 73 20 2a 2f 0a  sort process */.
1df0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
1e00: 6f 72 74 65 72 46 69 6c 65 20 53 6f 72 74 65 72  orterFile Sorter
1e10: 46 69 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54  File;       /* T
1e20: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6f 62  emporary file ob
1e30: 6a 65 63 74 20 77 72 61 70 70 65 72 20 2a 2f 0a  ject wrapper */.
1e40: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
1e50: 6f 72 74 65 72 4c 69 73 74 20 53 6f 72 74 65 72  orterList Sorter
1e60: 4c 69 73 74 3b 20 20 20 20 20 20 20 2f 2a 20 49  List;       /* I
1e70: 6e 2d 6d 65 6d 6f 72 79 20 6c 69 73 74 20 6f 66  n-memory list of
1e80: 20 72 65 63 6f 72 64 73 20 2a 2f 0a 74 79 70 65   records */.type
1e90: 64 65 66 20 73 74 72 75 63 74 20 49 6e 63 72 4d  def struct IncrM
1ea0: 65 72 67 65 72 20 49 6e 63 72 4d 65 72 67 65 72  erger IncrMerger
1eb0: 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20  ;       /* Read 
1ec0: 26 20 6d 65 72 67 65 20 6d 75 6c 74 69 70 6c 65  & merge multiple
1ed0: 20 50 4d 41 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20   PMAs */../*.** 
1ee0: 41 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f 72 20  A container for 
1ef0: 61 20 74 65 6d 70 20 66 69 6c 65 20 68 61 6e 64  a temp file hand
1f00: 6c 65 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  le and the curre
1f10: 6e 74 20 61 6d 6f 75 6e 74 20 6f 66 20 64 61 74  nt amount of dat
1f20: 61 20 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  a .** stored in 
1f30: 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 72  the file..*/.str
1f40: 75 63 74 20 53 6f 72 74 65 72 46 69 6c 65 20 7b  uct SorterFile {
1f50: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1f60: 2a 70 46 64 3b 20 20 20 20 20 20 20 20 20 20 20  *pFd;           
1f70: 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c     /* File handl
1f80: 65 20 2a 2f 0a 20 20 69 36 34 20 69 45 6f 66 3b  e */.  i64 iEof;
1f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa0: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
1fb0: 6f 66 20 64 61 74 61 20 73 74 6f 72 65 64 20 69  of data stored i
1fc0: 6e 20 70 46 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  n pFd */.};../*.
1fd0: 2a 2a 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ** An in-memory 
1fe0: 6c 69 73 74 20 6f 66 20 6f 62 6a 65 63 74 73 20  list of objects 
1ff0: 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a 2a 2a  to be sorted..**
2000: 0a 2a 2a 20 49 66 20 61 4d 65 6d 6f 72 79 3d 3d  .** If aMemory==
2010: 30 20 74 68 65 6e 20 65 61 63 68 20 6f 62 6a 65  0 then each obje
2020: 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ct is allocated 
2030: 73 65 70 61 72 61 74 65 6c 79 20 61 6e 64 20 74  separately and t
2040: 68 65 20 6f 62 6a 65 63 74 73 0a 2a 2a 20 61 72  he objects.** ar
2050: 65 20 63 6f 6e 6e 65 63 74 65 64 20 75 73 69 6e  e connected usin
2060: 67 20 53 6f 72 74 65 72 52 65 63 6f 72 64 2e 75  g SorterRecord.u
2070: 2e 70 4e 65 78 74 2e 20 20 49 66 20 61 4d 65 6d  .pNext.  If aMem
2080: 6f 72 79 21 3d 30 20 74 68 65 6e 20 61 6c 6c 20  ory!=0 then all 
2090: 6f 62 6a 65 63 74 73 0a 2a 2a 20 61 72 65 20 73  objects.** are s
20a0: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 4d 65  tored in the aMe
20b0: 6d 6f 72 79 5b 5d 20 62 75 6c 6b 20 6d 65 6d 6f  mory[] bulk memo
20c0: 72 79 2c 20 6f 6e 65 20 72 69 67 68 74 20 61 66  ry, one right af
20d0: 74 65 72 20 74 68 65 20 6f 74 68 65 72 2c 20 61  ter the other, a
20e0: 6e 64 0a 2a 2a 20 61 72 65 20 63 6f 6e 6e 65 63  nd.** are connec
20f0: 74 65 64 20 75 73 69 6e 67 20 53 6f 72 74 65 72  ted using Sorter
2100: 52 65 63 6f 72 64 2e 75 2e 69 4e 65 78 74 2e 0a  Record.u.iNext..
2110: 2a 2f 0a 73 74 72 75 63 74 20 53 6f 72 74 65 72  */.struct Sorter
2120: 4c 69 73 74 20 7b 0a 20 20 53 6f 72 74 65 72 52  List {.  SorterR
2130: 65 63 6f 72 64 20 2a 70 4c 69 73 74 3b 20 20 20  ecord *pList;   
2140: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b           /* Link
2150: 65 64 20 6c 69 73 74 20 6f 66 20 72 65 63 6f 72  ed list of recor
2160: 64 73 20 2a 2f 0a 20 20 75 38 20 2a 61 4d 65 6d  ds */.  u8 *aMem
2170: 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ory;            
2180: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
2190: 6e 2d 4e 55 4c 4c 2c 20 62 75 6c 6b 20 6d 65 6d  n-NULL, bulk mem
21a0: 6f 72 79 20 74 6f 20 68 6f 6c 64 20 70 4c 69 73  ory to hold pLis
21b0: 74 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 50 4d 41  t */.  int szPMA
21c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21d0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
21e0: 66 20 70 4c 69 73 74 20 61 73 20 50 4d 41 20 69  f pList as PMA i
21f0: 6e 20 62 79 74 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f  n bytes */.};../
2200: 2a 0a 2a 2a 20 54 68 65 20 4d 65 72 67 65 45 6e  *.** The MergeEn
2210: 67 69 6e 65 20 6f 62 6a 65 63 74 20 69 73 20 75  gine object is u
2220: 73 65 64 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74  sed to combine t
2230: 77 6f 20 6f 72 20 6d 6f 72 65 20 73 6d 61 6c 6c  wo or more small
2240: 65 72 20 50 4d 41 73 20 69 6e 74 6f 0a 2a 2a 20  er PMAs into.** 
2250: 6f 6e 65 20 62 69 67 20 50 4d 41 20 75 73 69 6e  one big PMA usin
2260: 67 20 61 20 6d 65 72 67 65 20 6f 70 65 72 61 74  g a merge operat
2270: 69 6f 6e 2e 20 20 53 65 70 61 72 61 74 65 20 50  ion.  Separate P
2280: 4d 41 73 20 61 6c 6c 20 6e 65 65 64 20 74 6f 20  MAs all need to 
2290: 62 65 0a 2a 2a 20 63 6f 6d 62 69 6e 65 64 20 69  be.** combined i
22a0: 6e 74 6f 20 6f 6e 65 20 62 69 67 20 50 4d 41 20  nto one big PMA 
22b0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 61  in order to be a
22c0: 62 6c 65 20 74 6f 20 73 74 65 70 20 74 68 72 6f  ble to step thro
22d0: 75 67 68 20 74 68 65 20 73 6f 72 74 65 64 0a 2a  ugh the sorted.*
22e0: 2a 20 72 65 63 6f 72 64 73 20 69 6e 20 6f 72 64  * records in ord
22f0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 52  er..**.** The aR
2300: 65 61 64 72 5b 5d 20 61 72 72 61 79 20 63 6f 6e  eadr[] array con
2310: 74 61 69 6e 73 20 61 20 50 6d 61 52 65 61 64 65  tains a PmaReade
2320: 72 20 6f 62 6a 65 63 74 20 66 6f 72 20 65 61 63  r object for eac
2330: 68 20 6f 66 20 74 68 65 20 50 4d 41 73 20 62 65  h of the PMAs be
2340: 69 6e 67 0a 2a 2a 20 6d 65 72 67 65 64 2e 20 20  ing.** merged.  
2350: 41 6e 20 61 52 65 61 64 72 5b 5d 20 6f 62 6a 65  An aReadr[] obje
2360: 63 74 20 65 69 74 68 65 72 20 70 6f 69 6e 74 73  ct either points
2370: 20 74 6f 20 61 20 76 61 6c 69 64 20 6b 65 79 20   to a valid key 
2380: 6f 72 20 65 6c 73 65 20 69 73 20 61 74 20 45 4f  or else is at EO
2390: 46 2e 0a 2a 2a 20 28 22 45 4f 46 22 20 6d 65 61  F..** ("EOF" mea
23a0: 6e 73 20 22 45 6e 64 20 4f 66 20 46 69 6c 65 22  ns "End Of File"
23b0: 2e 20 20 57 68 65 6e 20 61 52 65 61 64 72 5b 5d  .  When aReadr[]
23c0: 20 69 73 20 61 74 20 45 4f 46 20 74 68 65 72 65   is at EOF there
23d0: 20 69 73 20 6e 6f 20 6d 6f 72 65 20 64 61 74 61   is no more data
23e0: 2e 29 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  .).** For the pu
23f0: 72 70 6f 73 65 73 20 6f 66 20 74 68 65 20 70 61  rposes of the pa
2400: 72 61 67 72 61 70 68 73 20 62 65 6c 6f 77 2c 20  ragraphs below, 
2410: 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  we assume that t
2420: 68 65 20 61 72 72 61 79 20 69 73 0a 2a 2a 20 61  he array is.** a
2430: 63 74 75 61 6c 6c 79 20 4e 20 65 6c 65 6d 65 6e  ctually N elemen
2440: 74 73 20 69 6e 20 73 69 7a 65 2c 20 77 68 65 72  ts in size, wher
2450: 65 20 4e 20 69 73 20 74 68 65 20 73 6d 61 6c 6c  e N is the small
2460: 65 73 74 20 70 6f 77 65 72 20 6f 66 20 32 20 67  est power of 2 g
2470: 72 65 61 74 65 72 0a 2a 2a 20 74 6f 20 6f 72 20  reater.** to or 
2480: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6e 75 6d  equal to the num
2490: 62 65 72 20 6f 66 20 50 4d 41 73 20 62 65 69 6e  ber of PMAs bein
24a0: 67 20 6d 65 72 67 65 64 2e 20 54 68 65 20 65 78  g merged. The ex
24b0: 74 72 61 20 61 52 65 61 64 72 5b 5d 20 65 6c 65  tra aReadr[] ele
24c0: 6d 65 6e 74 73 0a 2a 2a 20 61 72 65 20 74 72 65  ments.** are tre
24d0: 61 74 65 64 20 61 73 20 69 66 20 74 68 65 79 20  ated as if they 
24e0: 61 72 65 20 65 6d 70 74 79 20 28 61 6c 77 61 79  are empty (alway
24f0: 73 20 61 74 20 45 4f 46 29 2e 0a 2a 2a 0a 2a 2a  s at EOF)..**.**
2500: 20 54 68 65 20 61 54 72 65 65 5b 5d 20 61 72 72   The aTree[] arr
2510: 61 79 20 69 73 20 61 6c 73 6f 20 4e 20 65 6c 65  ay is also N ele
2520: 6d 65 6e 74 73 20 69 6e 20 73 69 7a 65 2e 20 54  ments in size. T
2530: 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 20 69 73  he value of N is
2540: 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68   stored in.** th
2550: 65 20 4d 65 72 67 65 45 6e 67 69 6e 65 2e 6e 54  e MergeEngine.nT
2560: 72 65 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2a  ree variable..**
2570: 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 28 4e  .** The final (N
2580: 2f 32 29 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  /2) elements of 
2590: 61 54 72 65 65 5b 5d 20 63 6f 6e 74 61 69 6e 20  aTree[] contain 
25a0: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 63  the results of c
25b0: 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 70 61 69 72  omparing.** pair
25c0: 73 20 6f 66 20 50 4d 41 20 6b 65 79 73 20 74 6f  s of PMA keys to
25d0: 67 65 74 68 65 72 2e 20 45 6c 65 6d 65 6e 74 20  gether. Element 
25e0: 69 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72  i contains the r
25f0: 65 73 75 6c 74 20 6f 66 20 0a 2a 2a 20 63 6f 6d  esult of .** com
2600: 70 61 72 69 6e 67 20 61 52 65 61 64 72 5b 32 2a  paring aReadr[2*
2610: 69 2d 4e 5d 20 61 6e 64 20 61 52 65 61 64 72 5b  i-N] and aReadr[
2620: 32 2a 69 2d 4e 2b 31 5d 2e 20 57 68 69 63 68 65  2*i-N+1]. Whiche
2630: 76 65 72 20 6b 65 79 20 69 73 20 73 6d 61 6c 6c  ver key is small
2640: 65 72 2c 20 74 68 65 0a 2a 2a 20 61 54 72 65 65  er, the.** aTree
2650: 20 65 6c 65 6d 65 6e 74 20 69 73 20 73 65 74 20   element is set 
2660: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
2670: 69 74 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  it. .**.** For t
2680: 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
2690: 68 69 73 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20  his comparison, 
26a0: 45 4f 46 20 69 73 20 63 6f 6e 73 69 64 65 72 65  EOF is considere
26b0: 64 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61  d greater than a
26c0: 6e 79 0a 2a 2a 20 6f 74 68 65 72 20 6b 65 79 20  ny.** other key 
26d0: 76 61 6c 75 65 2e 20 49 66 20 74 68 65 20 6b 65  value. If the ke
26e0: 79 73 20 61 72 65 20 65 71 75 61 6c 20 28 6f 6e  ys are equal (on
26f0: 6c 79 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68  ly possible with
2700: 20 74 77 6f 20 45 4f 46 0a 2a 2a 20 76 61 6c 75   two EOF.** valu
2710: 65 73 29 2c 20 69 74 20 64 6f 65 73 6e 27 74 20  es), it doesn't 
2720: 6d 61 74 74 65 72 20 77 68 69 63 68 20 69 6e 64  matter which ind
2730: 65 78 20 69 73 20 73 74 6f 72 65 64 2e 0a 2a 2a  ex is stored..**
2740: 0a 2a 2a 20 54 68 65 20 28 4e 2f 34 29 20 65 6c  .** The (N/4) el
2750: 65 6d 65 6e 74 73 20 6f 66 20 61 54 72 65 65 5b  ements of aTree[
2760: 5d 20 74 68 61 74 20 70 72 65 63 65 64 65 20 74  ] that precede t
2770: 68 65 20 66 69 6e 61 6c 20 28 4e 2f 32 29 20 64  he final (N/2) d
2780: 65 73 63 72 69 62 65 64 20 0a 2a 2a 20 61 62 6f  escribed .** abo
2790: 76 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ve contains the 
27a0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 73 6d 61  index of the sma
27b0: 6c 6c 65 73 74 20 6f 66 20 65 61 63 68 20 62 6c  llest of each bl
27c0: 6f 63 6b 20 6f 66 20 34 20 50 6d 61 52 65 61 64  ock of 4 PmaRead
27d0: 65 72 73 0a 2a 2a 20 41 6e 64 20 73 6f 20 6f 6e  ers.** And so on
27e0: 2e 20 53 6f 20 74 68 61 74 20 61 54 72 65 65 5b  . So that aTree[
27f0: 31 5d 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  1] contains the 
2800: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 50 6d 61  index of the Pma
2810: 52 65 61 64 65 72 20 74 68 61 74 20 0a 2a 2a 20  Reader that .** 
2820: 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
2830: 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65 73 74   to the smallest
2840: 20 6b 65 79 20 76 61 6c 75 65 2e 20 61 54 72 65   key value. aTre
2850: 65 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 2e 0a  e[0] is unused..
2860: 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 2a  **.** Example:.*
2870: 2a 0a 2a 2a 20 20 20 20 20 61 52 65 61 64 72 5b  *.**     aReadr[
2880: 30 5d 20 2d 3e 20 42 61 6e 61 6e 61 0a 2a 2a 20  0] -> Banana.** 
2890: 20 20 20 20 61 52 65 61 64 72 5b 31 5d 20 2d 3e      aReadr[1] ->
28a0: 20 46 65 69 6a 6f 61 0a 2a 2a 20 20 20 20 20 61   Feijoa.**     a
28b0: 52 65 61 64 72 5b 32 5d 20 2d 3e 20 45 6c 64 65  Readr[2] -> Elde
28c0: 72 62 65 72 72 79 0a 2a 2a 20 20 20 20 20 61 52  rberry.**     aR
28d0: 65 61 64 72 5b 33 5d 20 2d 3e 20 43 75 72 72 61  eadr[3] -> Curra
28e0: 6e 74 0a 2a 2a 20 20 20 20 20 61 52 65 61 64 72  nt.**     aReadr
28f0: 5b 34 5d 20 2d 3e 20 47 72 61 70 65 66 72 75 69  [4] -> Grapefrui
2900: 74 0a 2a 2a 20 20 20 20 20 61 52 65 61 64 72 5b  t.**     aReadr[
2910: 35 5d 20 2d 3e 20 41 70 70 6c 65 0a 2a 2a 20 20  5] -> Apple.**  
2920: 20 20 20 61 52 65 61 64 72 5b 36 5d 20 2d 3e 20     aReadr[6] -> 
2930: 44 75 72 69 61 6e 0a 2a 2a 20 20 20 20 20 61 52  Durian.**     aR
2940: 65 61 64 72 5b 37 5d 20 2d 3e 20 45 4f 46 0a 2a  eadr[7] -> EOF.*
2950: 2a 0a 2a 2a 20 20 20 20 20 61 54 72 65 65 5b 5d  *.**     aTree[]
2960: 20 3d 20 7b 20 58 2c 20 35 20 20 20 30 2c 20 35   = { X, 5   0, 5
2970: 20 20 20 20 30 2c 20 33 2c 20 35 2c 20 36 20 7d      0, 3, 5, 6 }
2980: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72 65  .**.** The curre
2990: 6e 74 20 65 6c 65 6d 65 6e 74 20 69 73 20 22 41  nt element is "A
29a0: 70 70 6c 65 22 20 28 74 68 65 20 76 61 6c 75 65  pple" (the value
29b0: 20 6f 66 20 74 68 65 20 6b 65 79 20 69 6e 64 69   of the key indi
29c0: 63 61 74 65 64 20 62 79 20 0a 2a 2a 20 50 6d 61  cated by .** Pma
29d0: 52 65 61 64 65 72 20 35 29 2e 20 57 68 65 6e 20  Reader 5). When 
29e0: 74 68 65 20 4e 65 78 74 28 29 20 6f 70 65 72 61  the Next() opera
29f0: 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 2c  tion is invoked,
2a00: 20 50 6d 61 52 65 61 64 65 72 20 35 20 77 69 6c   PmaReader 5 wil
2a10: 6c 0a 2a 2a 20 62 65 20 61 64 76 61 6e 63 65 64  l.** be advanced
2a20: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6b 65 79   to the next key
2a30: 20 69 6e 20 69 74 73 20 73 65 67 6d 65 6e 74 2e   in its segment.
2a40: 20 53 61 79 20 74 68 65 20 6e 65 78 74 20 6b 65   Say the next ke
2a50: 79 20 69 73 0a 2a 2a 20 22 45 67 67 70 6c 61 6e  y is.** "Eggplan
2a60: 74 22 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61 52  t":.**.**     aR
2a70: 65 61 64 72 5b 35 5d 20 2d 3e 20 45 67 67 70 6c  eadr[5] -> Eggpl
2a80: 61 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ant.**.** The co
2a90: 6e 74 65 6e 74 73 20 6f 66 20 61 54 72 65 65 5b  ntents of aTree[
2aa0: 5d 20 61 72 65 20 75 70 64 61 74 65 64 20 66 69  ] are updated fi
2ab0: 72 73 74 20 62 79 20 63 6f 6d 70 61 72 69 6e 67  rst by comparing
2ac0: 20 74 68 65 20 6e 65 77 20 50 6d 61 52 65 61 64   the new PmaRead
2ad0: 65 72 0a 2a 2a 20 35 20 6b 65 79 20 74 6f 20 74  er.** 5 key to t
2ae0: 68 65 20 63 75 72 72 65 6e 74 20 6b 65 79 20 6f  he current key o
2af0: 66 20 50 6d 61 52 65 61 64 65 72 20 34 20 28 73  f PmaReader 4 (s
2b00: 74 69 6c 6c 20 22 47 72 61 70 65 66 72 75 69 74  till "Grapefruit
2b10: 22 29 2e 20 54 68 65 20 50 6d 61 52 65 61 64 65  "). The PmaReade
2b20: 72 0a 2a 2a 20 35 20 76 61 6c 75 65 20 69 73 20  r.** 5 value is 
2b30: 73 74 69 6c 6c 20 73 6d 61 6c 6c 65 72 2c 20 73  still smaller, s
2b40: 6f 20 61 54 72 65 65 5b 36 5d 20 69 73 20 73 65  o aTree[6] is se
2b50: 74 20 74 6f 20 35 2e 20 41 6e 64 20 73 6f 20 6f  t to 5. And so o
2b60: 6e 20 75 70 20 74 68 65 20 74 72 65 65 2e 0a 2a  n up the tree..*
2b70: 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 50  * The value of P
2b80: 6d 61 52 65 61 64 65 72 20 36 20 2d 20 22 44 75  maReader 6 - "Du
2b90: 72 69 61 6e 22 20 2d 20 69 73 20 6e 6f 77 20 73  rian" - is now s
2ba0: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 61 74  maller than that
2bb0: 20 6f 66 20 50 6d 61 52 65 61 64 65 72 0a 2a 2a   of PmaReader.**
2bc0: 20 35 2c 20 73 6f 20 61 54 72 65 65 5b 33 5d 20   5, so aTree[3] 
2bd0: 69 73 20 73 65 74 20 74 6f 20 36 2e 20 4b 65 79  is set to 6. Key
2be0: 20 30 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68   0 is smaller th
2bf0: 61 6e 20 6b 65 79 20 36 20 28 42 61 6e 61 6e 61  an key 6 (Banana
2c00: 3c 44 75 72 69 61 6e 29 2c 0a 2a 2a 20 73 6f 20  <Durian),.** so 
2c10: 74 68 65 20 76 61 6c 75 65 20 77 72 69 74 74 65  the value writte
2c20: 6e 20 69 6e 74 6f 20 65 6c 65 6d 65 6e 74 20 31  n into element 1
2c30: 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 69 73   of the array is
2c40: 20 30 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a   0. As follows:.
2c50: 2a 2a 0a 2a 2a 20 20 20 20 20 61 54 72 65 65 5b  **.**     aTree[
2c60: 5d 20 3d 20 7b 20 58 2c 20 30 20 20 20 30 2c 20  ] = { X, 0   0, 
2c70: 36 20 20 20 20 30 2c 20 33 2c 20 35 2c 20 36 20  6    0, 3, 5, 6 
2c80: 7d 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72  }.**.** In other
2c90: 20 77 6f 72 64 73 2c 20 65 61 63 68 20 74 69 6d   words, each tim
2ca0: 65 20 77 65 20 61 64 76 61 6e 63 65 20 74 6f 20  e we advance to 
2cb0: 74 68 65 20 6e 65 78 74 20 73 6f 72 74 65 72 20  the next sorter 
2cc0: 65 6c 65 6d 65 6e 74 2c 20 6c 6f 67 32 28 4e 29  element, log2(N)
2cd0: 0a 2a 2a 20 6b 65 79 20 63 6f 6d 70 61 72 69 73  .** key comparis
2ce0: 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72  on operations ar
2cf0: 65 20 72 65 71 75 69 72 65 64 2c 20 77 68 65 72  e required, wher
2d00: 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e N is the numbe
2d10: 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 0a 2a 2a  r of segments.**
2d20: 20 62 65 69 6e 67 20 6d 65 72 67 65 64 20 28 72   being merged (r
2d30: 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 74 68 65  ounded up to the
2d40: 20 6e 65 78 74 20 70 6f 77 65 72 20 6f 66 20 32   next power of 2
2d50: 29 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 4d 65 72  )..*/.struct Mer
2d60: 67 65 45 6e 67 69 6e 65 20 7b 0a 20 20 69 6e 74  geEngine {.  int
2d70: 20 6e 54 72 65 65 3b 20 20 20 20 20 20 20 20 20   nTree;         
2d80: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
2d90: 73 69 7a 65 20 6f 66 20 61 54 72 65 65 2f 61 52  size of aTree/aR
2da0: 65 61 64 72 20 28 70 6f 77 65 72 20 6f 66 20 32  eadr (power of 2
2db0: 29 20 2a 2f 0a 20 20 53 6f 72 74 53 75 62 74 61  ) */.  SortSubta
2dc0: 73 6b 20 2a 70 54 61 73 6b 3b 20 20 20 20 20 20  sk *pTask;      
2dd0: 20 20 2f 2a 20 55 73 65 64 20 62 79 20 74 68 69    /* Used by thi
2de0: 73 20 74 68 72 65 61 64 20 6f 6e 6c 79 20 2a 2f  s thread only */
2df0: 0a 20 20 69 6e 74 20 2a 61 54 72 65 65 3b 20 20  .  int *aTree;  
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e10: 20 43 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   Current state o
2e20: 66 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65  f incremental me
2e30: 72 67 65 20 2a 2f 0a 20 20 50 6d 61 52 65 61 64  rge */.  PmaRead
2e40: 65 72 20 2a 61 52 65 61 64 72 3b 20 20 20 20 20  er *aReadr;     
2e50: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
2e60: 50 6d 61 52 65 61 64 65 72 73 20 74 6f 20 6d 65  PmaReaders to me
2e70: 72 67 65 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f  rge data from */
2e80: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .};../*.** This 
2e90: 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74  object represent
2ea0: 73 20 61 20 73 69 6e 67 6c 65 20 74 68 72 65 61  s a single threa
2eb0: 64 20 6f 66 20 63 6f 6e 74 72 6f 6c 20 69 6e 20  d of control in 
2ec0: 61 20 73 6f 72 74 20 6f 70 65 72 61 74 69 6f 6e  a sort operation
2ed0: 2e 0a 2a 2a 20 45 78 61 63 74 6c 79 20 56 64 62  ..** Exactly Vdb
2ee0: 65 53 6f 72 74 65 72 2e 6e 54 61 73 6b 20 69 6e  eSorter.nTask in
2ef0: 73 74 61 6e 63 65 73 20 6f 66 20 74 68 69 73 20  stances of this 
2f00: 6f 62 6a 65 63 74 20 61 72 65 20 61 6c 6c 6f 63  object are alloc
2f10: 61 74 65 64 0a 2a 2a 20 61 73 20 70 61 72 74 20  ated.** as part 
2f20: 6f 66 20 65 61 63 68 20 56 64 62 65 53 6f 72 74  of each VdbeSort
2f30: 65 72 20 6f 62 6a 65 63 74 2e 20 49 6e 73 74 61  er object. Insta
2f40: 6e 63 65 73 20 61 72 65 20 6e 65 76 65 72 20 61  nces are never a
2f50: 6c 6c 6f 63 61 74 65 64 20 61 6e 79 0a 2a 2a 20  llocated any.** 
2f60: 6f 74 68 65 72 20 77 61 79 2e 20 56 64 62 65 53  other way. VdbeS
2f70: 6f 72 74 65 72 2e 6e 54 61 73 6b 20 69 73 20 73  orter.nTask is s
2f80: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
2f90: 20 6f 66 20 77 6f 72 6b 65 72 20 74 68 72 65 61   of worker threa
2fa0: 64 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 28 73  ds allowed.** (s
2fb0: 65 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ee SQLITE_CONFIG
2fc0: 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 29  _WORKER_THREADS)
2fd0: 20 70 6c 75 73 20 6f 6e 65 20 28 74 68 65 20 6d   plus one (the m
2fe0: 61 69 6e 20 74 68 72 65 61 64 29 2e 20 20 54 68  ain thread).  Th
2ff0: 75 73 20 66 6f 72 0a 2a 2a 20 73 69 6e 67 6c 65  us for.** single
3000: 2d 74 68 72 65 61 64 65 64 20 6f 70 65 72 61 74  -threaded operat
3010: 69 6f 6e 2c 20 74 68 65 72 65 20 69 73 20 65 78  ion, there is ex
3020: 61 63 74 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e  actly one instan
3030: 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63  ce of this objec
3040: 74 0a 2a 2a 20 61 6e 64 20 66 6f 72 20 6d 75 6c  t.** and for mul
3050: 74 69 2d 74 68 72 65 61 64 65 64 20 6f 70 65 72  ti-threaded oper
3060: 61 74 69 6f 6e 20 74 68 65 72 65 20 61 72 65 20  ation there are 
3070: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 69 6e 73 74  two or more inst
3080: 61 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 73 73  ances..**.** Ess
3090: 65 6e 74 69 61 6c 6c 79 2c 20 74 68 69 73 20 73  entially, this s
30a0: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
30b0: 73 20 61 6c 6c 20 74 68 6f 73 65 20 66 69 65 6c  s all those fiel
30c0: 64 73 20 6f 66 20 74 68 65 20 56 64 62 65 53 6f  ds of the VdbeSo
30d0: 72 74 65 72 0a 2a 2a 20 73 74 72 75 63 74 75 72  rter.** structur
30e0: 65 20 66 6f 72 20 77 68 69 63 68 20 65 61 63 68  e for which each
30f0: 20 74 68 72 65 61 64 20 72 65 71 75 69 72 65 73   thread requires
3100: 20 61 20 73 65 70 61 72 61 74 65 20 69 6e 73 74   a separate inst
3110: 61 6e 63 65 2e 20 46 6f 72 20 65 78 61 6d 70 6c  ance. For exampl
3120: 65 2c 0a 2a 2a 20 65 61 63 68 20 74 68 72 65 61  e,.** each threa
3130: 64 20 72 65 71 75 72 69 65 73 20 69 74 73 20 6f  d requries its o
3140: 77 6e 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  wn UnpackedRecor
3150: 64 20 6f 62 6a 65 63 74 20 74 6f 20 75 6e 70 61  d object to unpa
3160: 63 6b 20 72 65 63 6f 72 64 73 20 69 6e 0a 2a 2a  ck records in.**
3170: 20 61 73 20 70 61 72 74 20 6f 66 20 63 6f 6d 70   as part of comp
3180: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  arison operation
3190: 73 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  s..**.** Before 
31a0: 61 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72  a background thr
31b0: 65 61 64 20 69 73 20 6c 61 75 6e 63 68 65 64 2c  ead is launched,
31c0: 20 76 61 72 69 61 62 6c 65 20 62 44 6f 6e 65 20   variable bDone 
31d0: 69 73 20 73 65 74 20 74 6f 20 30 2e 20 54 68 65  is set to 0. The
31e0: 6e 2c 20 0a 2a 2a 20 72 69 67 68 74 20 62 65 66  n, .** right bef
31f0: 6f 72 65 20 69 74 20 65 78 69 74 73 2c 20 74 68  ore it exits, th
3200: 65 20 74 68 72 65 61 64 20 69 74 73 65 6c 66 20  e thread itself 
3210: 73 65 74 73 20 62 44 6f 6e 65 20 74 6f 20 31 2e  sets bDone to 1.
3220: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
3230: 72 20 0a 2a 2a 20 74 77 6f 20 70 75 72 70 6f 73  r .** two purpos
3240: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 57  es:.**.**   1. W
3250: 68 65 6e 20 66 6c 75 73 68 69 6e 67 20 74 68 65  hen flushing the
3260: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 65 6d   contents of mem
3270: 6f 72 79 20 74 6f 20 61 20 6c 65 76 65 6c 2d 30  ory to a level-0
3280: 20 50 4d 41 20 6f 6e 20 64 69 73 6b 2c 20 74 6f   PMA on disk, to
3290: 0a 2a 2a 20 20 20 20 20 20 61 74 74 65 6d 70 74  .**      attempt
32a0: 20 74 6f 20 73 65 6c 65 63 74 20 61 20 53 6f 72   to select a Sor
32b0: 74 53 75 62 74 61 73 6b 20 66 6f 72 20 77 68 69  tSubtask for whi
32c0: 63 68 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20  ch there is not 
32d0: 61 6c 72 65 61 64 79 20 61 6e 0a 2a 2a 20 20 20  already an.**   
32e0: 20 20 20 61 63 74 69 76 65 20 62 61 63 6b 67 72     active backgr
32f0: 6f 75 6e 64 20 74 68 72 65 61 64 20 28 73 69 6e  ound thread (sin
3300: 63 65 20 64 6f 69 6e 67 20 73 6f 20 63 61 75 73  ce doing so caus
3310: 65 73 20 74 68 65 20 6d 61 69 6e 20 74 68 72 65  es the main thre
3320: 61 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20 62 6c  ad.**      to bl
3330: 6f 63 6b 20 75 6e 74 69 6c 20 69 74 20 66 69 6e  ock until it fin
3340: 69 73 68 65 73 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  ishes)..**.**   
3350: 32 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42  2. If SQLITE_DEB
3360: 55 47 5f 53 4f 52 54 45 52 5f 54 48 52 45 41 44  UG_SORTER_THREAD
3370: 53 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 6f  S is defined, to
3380: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61 20   determine if a 
3390: 63 61 6c 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20  call.**      to 
33a0: 73 71 6c 69 74 65 33 54 68 72 65 61 64 4a 6f 69  sqlite3ThreadJoi
33b0: 6e 28 29 20 69 73 20 6c 69 6b 65 6c 79 20 74 6f  n() is likely to
33c0: 20 62 6c 6f 63 6b 2e 20 43 61 73 65 73 20 74 68   block. Cases th
33d0: 61 74 20 61 72 65 20 6c 69 6b 65 6c 79 20 74 6f  at are likely to
33e0: 0a 2a 2a 20 20 20 20 20 20 62 6c 6f 63 6b 20 70  .**      block p
33f0: 72 6f 76 6f 6b 65 20 64 65 62 75 67 67 69 6e 67  rovoke debugging
3400: 20 6f 75 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 49   output..**.** I
3410: 6e 20 62 6f 74 68 20 63 61 73 65 73 2c 20 74 68  n both cases, th
3420: 65 20 65 66 66 65 63 74 73 20 6f 66 20 74 68 65  e effects of the
3430: 20 6d 61 69 6e 20 74 68 72 65 61 64 20 73 65 65   main thread see
3440: 69 6e 67 20 28 62 44 6f 6e 65 3d 3d 30 29 20 65  ing (bDone==0) e
3450: 76 65 6e 0a 2a 2a 20 61 66 74 65 72 20 74 68 65  ven.** after the
3460: 20 74 68 72 65 61 64 20 68 61 73 20 66 69 6e 69   thread has fini
3470: 73 68 65 64 20 61 72 65 20 6e 6f 74 20 64 69 72  shed are not dir
3480: 65 2e 20 53 6f 20 77 65 20 64 6f 6e 27 74 20 77  e. So we don't w
3490: 6f 72 72 79 20 61 62 6f 75 74 0a 2a 2a 20 6d 65  orry about.** me
34a0: 6d 6f 72 79 20 62 61 72 72 69 65 72 73 20 61 6e  mory barriers an
34b0: 64 20 73 75 63 68 20 68 65 72 65 2e 0a 2a 2f 0a  d such here..*/.
34c0: 73 74 72 75 63 74 20 53 6f 72 74 53 75 62 74 61  struct SortSubta
34d0: 73 6b 20 7b 0a 20 20 53 51 4c 69 74 65 54 68 72  sk {.  SQLiteThr
34e0: 65 61 64 20 2a 70 54 68 72 65 61 64 3b 20 20 20  ead *pThread;   
34f0: 20 20 20 20 20 20 20 2f 2a 20 42 61 63 6b 67 72         /* Backgr
3500: 6f 75 6e 64 20 74 68 72 65 61 64 2c 20 69 66 20  ound thread, if 
3510: 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 62 44 6f  any */.  int bDo
3520: 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ne;             
3530: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
3540: 69 66 20 74 68 72 65 61 64 20 69 73 20 66 69 6e  if thread is fin
3550: 69 73 68 65 64 20 62 75 74 20 6e 6f 74 20 6a 6f  ished but not jo
3560: 69 6e 65 64 20 2a 2f 0a 20 20 56 64 62 65 53 6f  ined */.  VdbeSo
3570: 72 74 65 72 20 2a 70 53 6f 72 74 65 72 3b 20 20  rter *pSorter;  
3580: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72            /* Sor
3590: 74 65 72 20 74 68 61 74 20 6f 77 6e 73 20 74 68  ter that owns th
35a0: 69 73 20 73 75 62 2d 74 61 73 6b 20 2a 2f 0a 20  is sub-task */. 
35b0: 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
35c0: 2a 70 55 6e 70 61 63 6b 65 64 3b 20 20 20 20 20  *pUnpacked;     
35d0: 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 75 6e 70   /* Space to unp
35e0: 61 63 6b 20 61 20 72 65 63 6f 72 64 20 2a 2f 0a  ack a record */.
35f0: 20 20 53 6f 72 74 65 72 4c 69 73 74 20 6c 69 73    SorterList lis
3600: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
3610: 20 20 2f 2a 20 4c 69 73 74 20 66 6f 72 20 74 68    /* List for th
3620: 72 65 61 64 20 74 6f 20 77 72 69 74 65 20 74 6f  read to write to
3630: 20 61 20 50 4d 41 20 2a 2f 0a 20 20 69 6e 74 20   a PMA */.  int 
3640: 6e 50 4d 41 3b 20 20 20 20 20 20 20 20 20 20 20  nPMA;           
3650: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3660: 75 6d 62 65 72 20 6f 66 20 50 4d 41 73 20 63 75  umber of PMAs cu
3670: 72 72 65 6e 74 6c 79 20 69 6e 20 66 69 6c 65 20  rrently in file 
3680: 2a 2f 0a 20 20 53 6f 72 74 65 72 46 69 6c 65 20  */.  SorterFile 
3690: 66 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  file;           
36a0: 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c       /* Temp fil
36b0: 65 20 66 6f 72 20 6c 65 76 65 6c 2d 30 20 50 4d  e for level-0 PM
36c0: 41 73 20 2a 2f 0a 20 20 53 6f 72 74 65 72 46 69  As */.  SorterFi
36d0: 6c 65 20 66 69 6c 65 32 3b 20 20 20 20 20 20 20  le file2;       
36e0: 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
36f0: 20 66 6f 72 20 6f 74 68 65 72 20 50 4d 41 73 20   for other PMAs 
3700: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 69  */.};../*.** Mai
3710: 6e 20 73 6f 72 74 65 72 20 73 74 72 75 63 74 75  n sorter structu
3720: 72 65 2e 20 41 20 73 69 6e 67 6c 65 20 69 6e 73  re. A single ins
3730: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 69 73  tance of this is
3740: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65   allocated for e
3750: 61 63 68 20 0a 2a 2a 20 73 6f 72 74 65 72 20 63  ach .** sorter c
3760: 75 72 73 6f 72 20 63 72 65 61 74 65 64 20 62 79  ursor created by
3770: 20 74 68 65 20 56 44 42 45 2e 0a 2a 2a 0a 2a 2a   the VDBE..**.**
3780: 20 6d 78 4b 65 79 73 69 7a 65 3a 0a 2a 2a 20 20   mxKeysize:.**  
3790: 20 41 73 20 72 65 63 6f 72 64 73 20 61 72 65 20   As records are 
37a0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 73 6f 72  added to the sor
37b0: 74 65 72 20 62 79 20 63 61 6c 6c 73 20 74 6f 20  ter by calls to 
37c0: 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65  sqlite3VdbeSorte
37d0: 72 57 72 69 74 65 28 29 2c 0a 2a 2a 20 20 20 74  rWrite(),.**   t
37e0: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
37f0: 75 70 64 61 74 65 64 20 73 6f 20 61 73 20 74 6f  updated so as to
3800: 20 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 73   be set to the s
3810: 69 7a 65 20 6f 6e 20 64 69 73 6b 20 6f 66 20 74  ize on disk of t
3820: 68 65 0a 2a 2a 20 20 20 6c 61 72 67 65 73 74 20  he.**   largest 
3830: 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 73 6f  record in the so
3840: 72 74 65 72 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  rter..*/.struct 
3850: 56 64 62 65 53 6f 72 74 65 72 20 7b 0a 20 20 69  VdbeSorter {.  i
3860: 6e 74 20 6d 6e 50 6d 61 53 69 7a 65 3b 20 20 20  nt mnPmaSize;   
3870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3880: 2a 20 4d 69 6e 69 6d 75 6d 20 50 4d 41 20 73 69  * Minimum PMA si
3890: 7a 65 2c 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ze, in bytes */.
38a0: 20 20 69 6e 74 20 6d 78 50 6d 61 53 69 7a 65 3b    int mxPmaSize;
38b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38c0: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 50 4d 41    /* Maximum PMA
38d0: 20 73 69 7a 65 2c 20 69 6e 20 62 79 74 65 73 2e   size, in bytes.
38e0: 20 20 30 3d 3d 6e 6f 20 6c 69 6d 69 74 20 2a 2f    0==no limit */
38f0: 0a 20 20 69 6e 74 20 6d 78 4b 65 79 73 69 7a 65  .  int mxKeysize
3900: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3910: 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20 73 65     /* Largest se
3920: 72 69 61 6c 69 7a 65 64 20 6b 65 79 20 73 65 65  rialized key see
3930: 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 69 6e  n so far */.  in
3940: 74 20 70 67 73 7a 3b 20 20 20 20 20 20 20 20 20  t pgsz;         
3950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3960: 20 4d 61 69 6e 20 64 61 74 61 62 61 73 65 20 70   Main database p
3970: 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 50 6d  age size */.  Pm
3980: 61 52 65 61 64 65 72 20 2a 70 52 65 61 64 65 72  aReader *pReader
3990: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
39a0: 20 52 65 61 64 72 20 64 61 74 61 20 66 72 6f 6d   Readr data from
39b0: 20 68 65 72 65 20 61 66 74 65 72 20 52 65 77 69   here after Rewi
39c0: 6e 64 28 29 20 2a 2f 0a 20 20 4d 65 72 67 65 45  nd() */.  MergeE
39d0: 6e 67 69 6e 65 20 2a 70 4d 65 72 67 65 72 3b 20  ngine *pMerger; 
39e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 20            /* Or 
39f0: 68 65 72 65 2c 20 69 66 20 62 55 73 65 54 68 72  here, if bUseThr
3a00: 65 61 64 73 3d 3d 30 20 2a 2f 0a 20 20 73 71 6c  eads==0 */.  sql
3a10: 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3a30: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
3a40: 69 6f 6e 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  ion */.  KeyInfo
3a50: 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20   *pKeyInfo;     
3a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
3a70: 74 6f 20 63 6f 6d 70 61 72 65 20 72 65 63 6f 72  to compare recor
3a80: 64 73 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ds */.  Unpacked
3a90: 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65  Record *pUnpacke
3aa0: 64 3b 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20  d;      /* Used 
3ab0: 62 79 20 56 64 62 65 53 6f 72 74 65 72 43 6f 6d  by VdbeSorterCom
3ac0: 70 61 72 65 28 29 20 2a 2f 0a 20 20 53 6f 72 74  pare() */.  Sort
3ad0: 65 72 4c 69 73 74 20 6c 69 73 74 3b 20 20 20 20  erList list;    
3ae0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
3af0: 69 73 74 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ist of in-memory
3b00: 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e   records */.  in
3b10: 74 20 69 4d 65 6d 6f 72 79 3b 20 20 20 20 20 20  t iMemory;      
3b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3b30: 20 4f 66 66 73 65 74 20 6f 66 20 66 72 65 65 20   Offset of free 
3b40: 73 70 61 63 65 20 69 6e 20 6c 69 73 74 2e 61 4d  space in list.aM
3b50: 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  emory */.  int n
3b60: 4d 65 6d 6f 72 79 3b 20 20 20 20 20 20 20 20 20  Memory;         
3b70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
3b80: 7a 65 20 6f 66 20 6c 69 73 74 2e 61 4d 65 6d 6f  ze of list.aMemo
3b90: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 6e  ry allocation in
3ba0: 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 38 20 62   bytes */.  u8 b
3bb0: 55 73 65 50 4d 41 3b 20 20 20 20 20 20 20 20 20  UsePMA;         
3bc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3bd0: 72 75 65 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f  rue if one or mo
3be0: 72 65 20 50 4d 41 73 20 63 72 65 61 74 65 64 20  re PMAs created 
3bf0: 2a 2f 0a 20 20 75 38 20 62 55 73 65 54 68 72 65  */.  u8 bUseThre
3c00: 61 64 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ads;            
3c10: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
3c20: 75 73 65 20 62 61 63 6b 67 72 6f 75 6e 64 20 74  use background t
3c30: 68 72 65 61 64 73 20 2a 2f 0a 20 20 75 38 20 69  hreads */.  u8 i
3c40: 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20  Prev;           
3c50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3c60: 72 65 76 69 6f 75 73 20 74 68 72 65 61 64 20 75  revious thread u
3c70: 73 65 64 20 74 6f 20 66 6c 75 73 68 20 50 4d 41  sed to flush PMA
3c80: 20 2a 2f 0a 20 20 75 38 20 6e 54 61 73 6b 3b 20   */.  u8 nTask; 
3c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ca0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
3cb0: 20 61 54 61 73 6b 5b 5d 20 61 72 72 61 79 20 2a   aTask[] array *
3cc0: 2f 0a 20 20 53 6f 72 74 53 75 62 74 61 73 6b 20  /.  SortSubtask 
3cd0: 61 54 61 73 6b 5b 31 5d 3b 20 20 20 20 20 20 20  aTask[1];       
3ce0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 72 20 6d 6f      /* One or mo
3cf0: 72 65 20 73 75 62 74 61 73 6b 73 20 2a 2f 0a 7d  re subtasks */.}
3d00: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
3d10: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
3d20: 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20 69 73 20  owing object is 
3d30: 75 73 65 64 20 74 6f 20 72 65 61 64 20 72 65 63  used to read rec
3d40: 6f 72 64 73 20 6f 75 74 20 6f 66 20 61 0a 2a 2a  ords out of a.**
3d50: 20 50 4d 41 2c 20 69 6e 20 73 6f 72 74 65 64 20   PMA, in sorted 
3d60: 6f 72 64 65 72 2e 20 20 54 68 65 20 6e 65 78 74  order.  The next
3d70: 20 6b 65 79 20 74 6f 20 62 65 20 72 65 61 64 20   key to be read 
3d80: 69 73 20 63 61 63 68 65 64 20 69 6e 20 6e 4b 65  is cached in nKe
3d90: 79 2f 61 4b 65 79 2e 0a 2a 2a 20 61 4b 65 79 20  y/aKey..** aKey 
3da0: 6d 69 67 68 74 20 70 6f 69 6e 74 20 69 6e 74 6f  might point into
3db0: 20 61 4d 61 70 20 6f 72 20 69 6e 74 6f 20 61 42   aMap or into aB
3dc0: 75 66 66 65 72 2e 20 20 49 66 20 6e 65 69 74 68  uffer.  If neith
3dd0: 65 72 20 6f 66 20 74 68 6f 73 65 20 6c 6f 63 61  er of those loca
3de0: 74 69 6f 6e 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e  tions.** contain
3df0: 20 61 20 63 6f 6e 74 69 67 75 6f 75 73 20 72 65   a contiguous re
3e00: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
3e10: 74 68 65 20 6b 65 79 2c 20 74 68 65 6e 20 61 41  the key, then aA
3e20: 6c 6c 6f 63 20 69 73 20 61 6c 6c 6f 63 61 74 65  lloc is allocate
3e30: 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6b 65 79  d.** and the key
3e40: 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20   is copied into 
3e50: 61 41 6c 6c 6f 63 20 61 6e 64 20 61 4b 65 79 20  aAlloc and aKey 
3e60: 69 73 20 6d 61 64 65 20 74 6f 20 70 6f 69 74 6e  is made to poitn
3e70: 20 74 6f 20 61 41 6c 6c 6f 63 2e 0a 2a 2a 0a 2a   to aAlloc..**.*
3e80: 2a 20 70 46 64 3d 3d 30 20 61 74 20 45 4f 46 2e  * pFd==0 at EOF.
3e90: 0a 2a 2f 0a 73 74 72 75 63 74 20 50 6d 61 52 65  .*/.struct PmaRe
3ea0: 61 64 65 72 20 7b 0a 20 20 69 36 34 20 69 52 65  ader {.  i64 iRe
3eb0: 61 64 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  adOff;          
3ec0: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
3ed0: 72 65 61 64 20 6f 66 66 73 65 74 20 2a 2f 0a 20  read offset */. 
3ee0: 20 69 36 34 20 69 45 6f 66 3b 20 20 20 20 20 20   i64 iEof;      
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3f00: 31 20 62 79 74 65 20 70 61 73 74 20 45 4f 46 20  1 byte past EOF 
3f10: 66 6f 72 20 74 68 69 73 20 50 6d 61 52 65 61 64  for this PmaRead
3f20: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c  er */.  int nAll
3f30: 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  oc;             
3f40: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
3f50: 73 70 61 63 65 20 61 74 20 61 41 6c 6c 6f 63 20  space at aAlloc 
3f60: 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20  */.  int nKey;  
3f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f80: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
3f90: 74 65 73 20 69 6e 20 6b 65 79 20 2a 2f 0a 20 20  tes in key */.  
3fa0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
3fb0: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  d;          /* F
3fc0: 69 6c 65 20 68 61 6e 64 6c 65 20 77 65 20 61 72  ile handle we ar
3fd0: 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a  e reading from *
3fe0: 2f 0a 20 20 75 38 20 2a 61 41 6c 6c 6f 63 3b 20  /.  u8 *aAlloc; 
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4000: 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 61 4b 65  /* Space for aKe
4010: 79 20 69 66 20 61 42 75 66 66 65 72 20 61 6e 64  y if aBuffer and
4020: 20 70 4d 61 70 20 77 6f 6e 74 20 77 6f 72 6b 20   pMap wont work 
4030: 2a 2f 0a 20 20 75 38 20 2a 61 4b 65 79 3b 20 20  */.  u8 *aKey;  
4040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4050: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63   /* Pointer to c
4060: 75 72 72 65 6e 74 20 6b 65 79 20 2a 2f 0a 20 20  urrent key */.  
4070: 75 38 20 2a 61 42 75 66 66 65 72 3b 20 20 20 20  u8 *aBuffer;    
4080: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
4090: 75 72 72 65 6e 74 20 72 65 61 64 20 62 75 66 66  urrent read buff
40a0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 75 66  er */.  int nBuf
40b0: 66 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  fer;            
40c0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72      /* Size of r
40d0: 65 61 64 20 62 75 66 66 65 72 20 69 6e 20 62 79  ead buffer in by
40e0: 74 65 73 20 2a 2f 0a 20 20 75 38 20 2a 61 4d 61  tes */.  u8 *aMa
40f0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
4100: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
4110: 74 6f 20 6d 61 70 70 69 6e 67 20 6f 66 20 65 6e  to mapping of en
4120: 74 69 72 65 20 66 69 6c 65 20 2a 2f 0a 20 20 49  tire file */.  I
4130: 6e 63 72 4d 65 72 67 65 72 20 2a 70 49 6e 63 72  ncrMerger *pIncr
4140: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ;          /* In
4150: 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 72  cremental merger
4160: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 6f   */.};../*.** No
4170: 72 6d 61 6c 6c 79 2c 20 61 20 50 6d 61 52 65 61  rmally, a PmaRea
4180: 64 65 72 20 6f 62 6a 65 63 74 20 69 74 65 72 61  der object itera
4190: 74 65 73 20 74 68 72 6f 75 67 68 20 61 6e 20 65  tes through an e
41a0: 78 69 73 74 69 6e 67 20 50 4d 41 20 73 74 6f 72  xisting PMA stor
41b0: 65 64 20 0a 2a 2a 20 77 69 74 68 69 6e 20 61 20  ed .** within a 
41c0: 74 65 6d 70 20 66 69 6c 65 2e 20 48 6f 77 65 76  temp file. Howev
41d0: 65 72 2c 20 69 66 20 74 68 65 20 50 6d 61 52 65  er, if the PmaRe
41e0: 61 64 65 72 2e 70 49 6e 63 72 20 76 61 72 69 61  ader.pIncr varia
41f0: 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a  ble points to.**
4200: 20 61 6e 20 6f 62 6a 65 63 74 20 6f 66 20 74 68   an object of th
4210: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65  e following type
4220: 2c 20 69 74 20 6d 61 79 20 62 65 20 75 73 65 64  , it may be used
4230: 20 74 6f 20 69 74 65 72 61 74 65 2f 6d 65 72 67   to iterate/merg
4240: 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 6d 75 6c  e through.** mul
4250: 74 69 70 6c 65 20 50 4d 41 73 20 73 69 6d 75 6c  tiple PMAs simul
4260: 74 61 6e 65 6f 75 73 6c 79 2e 0a 2a 2a 0a 2a 2a  taneously..**.**
4270: 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 74   There are two t
4280: 79 70 65 73 20 6f 66 20 49 6e 63 72 4d 65 72 67  ypes of IncrMerg
4290: 65 72 20 6f 62 6a 65 63 74 20 2d 20 73 69 6e 67  er object - sing
42a0: 6c 65 20 28 62 55 73 65 54 68 72 65 61 64 3d 3d  le (bUseThread==
42b0: 30 29 20 61 6e 64 20 0a 2a 2a 20 6d 75 6c 74 69  0) and .** multi
42c0: 2d 74 68 72 65 61 64 65 64 20 28 62 55 73 65 54  -threaded (bUseT
42d0: 68 72 65 61 64 3d 3d 31 29 2e 20 0a 2a 2a 0a 2a  hread==1). .**.*
42e0: 2a 20 41 20 6d 75 6c 74 69 2d 74 68 72 65 61 64  * A multi-thread
42f0: 65 64 20 49 6e 63 72 4d 65 72 67 65 72 20 6f 62  ed IncrMerger ob
4300: 6a 65 63 74 20 75 73 65 73 20 74 77 6f 20 74 65  ject uses two te
4310: 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 2d 20  mporary files - 
4320: 61 46 69 6c 65 5b 30 5d 20 0a 2a 2a 20 61 6e 64  aFile[0] .** and
4330: 20 61 46 69 6c 65 5b 31 5d 2e 20 4e 65 69 74 68   aFile[1]. Neith
4340: 65 72 20 66 69 6c 65 20 69 73 20 61 6c 6c 6f 77  er file is allow
4350: 65 64 20 74 6f 20 67 72 6f 77 20 74 6f 20 6d 6f  ed to grow to mo
4360: 72 65 20 74 68 61 6e 20 6d 78 53 7a 20 62 79 74  re than mxSz byt
4370: 65 73 20 69 6e 20 0a 2a 2a 20 73 69 7a 65 2e 20  es in .** size. 
4380: 57 68 65 6e 20 74 68 65 20 49 6e 63 72 4d 65 72  When the IncrMer
4390: 67 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ger is initializ
43a0: 65 64 2c 20 69 74 20 72 65 61 64 73 20 65 6e 6f  ed, it reads eno
43b0: 75 67 68 20 64 61 74 61 20 66 72 6f 6d 20 0a 2a  ugh data from .*
43c0: 2a 20 70 4d 65 72 67 65 72 20 74 6f 20 70 6f 70  * pMerger to pop
43d0: 75 6c 61 74 65 20 61 46 69 6c 65 5b 30 5d 2e 20  ulate aFile[0]. 
43e0: 49 74 20 74 68 65 6e 20 73 65 74 73 20 76 61 72  It then sets var
43f0: 69 61 62 6c 65 73 20 77 69 74 68 69 6e 20 74 68  iables within th
4400: 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  e .** correspond
4410: 69 6e 67 20 50 6d 61 52 65 61 64 65 72 20 6f 62  ing PmaReader ob
4420: 6a 65 63 74 20 74 6f 20 72 65 61 64 20 66 72 6f  ject to read fro
4430: 6d 20 74 68 61 74 20 66 69 6c 65 20 61 6e 64 20  m that file and 
4440: 6b 69 63 6b 73 20 6f 66 66 20 0a 2a 2a 20 61 20  kicks off .** a 
4450: 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72 65 61  background threa
4460: 64 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 61 46  d to populate aF
4470: 69 6c 65 5b 31 5d 20 77 69 74 68 20 74 68 65 20  ile[1] with the 
4480: 6e 65 78 74 20 6d 78 53 7a 20 62 79 74 65 73 20  next mxSz bytes 
4490: 6f 66 20 0a 2a 2a 20 73 6f 72 74 65 64 20 72 65  of .** sorted re
44a0: 63 6f 72 64 20 64 61 74 61 20 66 72 6f 6d 20 70  cord data from p
44b0: 4d 65 72 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 57  Merger. .**.** W
44c0: 68 65 6e 20 74 68 65 20 50 6d 61 52 65 61 64 65  hen the PmaReade
44d0: 72 20 72 65 61 63 68 65 73 20 74 68 65 20 65 6e  r reaches the en
44e0: 64 20 6f 66 20 61 46 69 6c 65 5b 30 5d 2c 20 69  d of aFile[0], i
44f0: 74 20 62 6c 6f 63 6b 73 20 75 6e 74 69 6c 20 74  t blocks until t
4500: 68 65 0a 2a 2a 20 62 61 63 6b 67 72 6f 75 6e 64  he.** background
4510: 20 74 68 72 65 61 64 20 68 61 73 20 66 69 6e 69   thread has fini
4520: 73 68 65 64 20 70 6f 70 75 6c 61 74 69 6e 67 20  shed populating 
4530: 61 46 69 6c 65 5b 31 5d 2e 20 49 74 20 74 68 65  aFile[1]. It the
4540: 6e 20 65 78 63 68 61 6e 67 65 73 0a 2a 2a 20 74  n exchanges.** t
4550: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
4560: 68 65 20 61 46 69 6c 65 5b 30 5d 20 61 6e 64 20  he aFile[0] and 
4570: 61 46 69 6c 65 5b 31 5d 20 76 61 72 69 61 62 6c  aFile[1] variabl
4580: 65 73 20 77 69 74 68 69 6e 20 74 68 69 73 20 73  es within this s
4590: 74 72 75 63 74 75 72 65 2c 0a 2a 2a 20 73 65 74  tructure,.** set
45a0: 73 20 74 68 65 20 50 6d 61 52 65 61 64 65 72 20  s the PmaReader 
45b0: 66 69 65 6c 64 73 20 74 6f 20 72 65 61 64 20 66  fields to read f
45c0: 72 6f 6d 20 74 68 65 20 6e 65 77 20 61 46 69 6c  rom the new aFil
45d0: 65 5b 30 5d 20 61 6e 64 20 6b 69 63 6b 73 20 6f  e[0] and kicks o
45e0: 66 66 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 62 61  ff.** another ba
45f0: 63 6b 67 72 6f 75 6e 64 20 74 68 72 65 61 64 20  ckground thread 
4600: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
4610: 6e 65 77 20 61 46 69 6c 65 5b 31 5d 2e 20 41 6e  new aFile[1]. An
4620: 64 20 73 6f 20 6f 6e 2c 20 75 6e 74 69 6c 0a 2a  d so on, until.*
4630: 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * the contents o
4640: 66 20 70 4d 65 72 67 65 72 20 61 72 65 20 65 78  f pMerger are ex
4650: 68 61 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  hausted..**.** A
4660: 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64   single-threaded
4670: 20 49 6e 63 72 4d 65 72 67 65 72 20 64 6f 65 73   IncrMerger does
4680: 20 6e 6f 74 20 6f 70 65 6e 20 61 6e 79 20 74 65   not open any te
4690: 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 6f 66  mporary files of
46a0: 20 69 74 73 0a 2a 2a 20 6f 77 6e 2e 20 49 6e 73   its.** own. Ins
46b0: 74 65 61 64 2c 20 69 74 20 68 61 73 20 65 78 63  tead, it has exc
46c0: 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 74 6f  lusive access to
46d0: 20 6d 78 53 7a 20 62 79 74 65 73 20 6f 66 20 73   mxSz bytes of s
46e0: 70 61 63 65 20 62 65 67 69 6e 6e 69 6e 67 0a 2a  pace beginning.*
46f0: 2a 20 61 74 20 6f 66 66 73 65 74 20 69 53 74 61  * at offset iSta
4700: 72 74 4f 66 66 20 6f 66 20 66 69 6c 65 20 70 54  rtOff of file pT
4710: 61 73 6b 2d 3e 66 69 6c 65 32 2e 20 41 6e 64 20  ask->file2. And 
4720: 69 6e 73 74 65 61 64 20 6f 66 20 75 73 69 6e 67  instead of using
4730: 20 61 20 0a 2a 2a 20 62 61 63 6b 67 72 6f 75 6e   a .** backgroun
4740: 64 20 74 68 72 65 61 64 20 74 6f 20 70 72 65 70  d thread to prep
4750: 61 72 65 20 64 61 74 61 20 66 6f 72 20 74 68 65  are data for the
4760: 20 50 6d 61 52 65 61 64 65 72 2c 20 77 69 74 68   PmaReader, with
4770: 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 74 68 72   a single.** thr
4780: 65 61 64 65 64 20 49 6e 63 72 4d 65 72 67 65 72  eaded IncrMerger
4790: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 20 70 61   the allocate pa
47a0: 72 74 20 6f 66 20 70 54 61 73 6b 2d 3e 66 69 6c  rt of pTask->fil
47b0: 65 32 20 69 73 20 22 72 65 66 69 6c 6c 65 64 22  e2 is "refilled"
47c0: 20 77 69 74 68 0a 2a 2a 20 6b 65 79 73 20 66 72   with.** keys fr
47d0: 6f 6d 20 70 4d 65 72 67 65 72 20 62 79 20 74 68  om pMerger by th
47e0: 65 20 63 61 6c 6c 69 6e 67 20 74 68 72 65 61 64  e calling thread
47f0: 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 50 6d   whenever the Pm
4800: 61 52 65 61 64 65 72 20 72 75 6e 73 20 6f 75 74  aReader runs out
4810: 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 0a 2a 2f 0a  .** of data..*/.
4820: 73 74 72 75 63 74 20 49 6e 63 72 4d 65 72 67 65  struct IncrMerge
4830: 72 20 7b 0a 20 20 53 6f 72 74 53 75 62 74 61 73  r {.  SortSubtas
4840: 6b 20 2a 70 54 61 73 6b 3b 20 20 20 20 20 20 20  k *pTask;       
4850: 20 20 20 20 20 20 2f 2a 20 54 61 73 6b 20 74 68        /* Task th
4860: 61 74 20 6f 77 6e 73 20 74 68 69 73 20 6d 65 72  at owns this mer
4870: 67 65 72 20 2a 2f 0a 20 20 4d 65 72 67 65 45 6e  ger */.  MergeEn
4880: 67 69 6e 65 20 2a 70 4d 65 72 67 65 72 3b 20 20  gine *pMerger;  
4890: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 72 67           /* Merg
48a0: 65 20 65 6e 67 69 6e 65 20 74 68 72 65 61 64 20  e engine thread 
48b0: 72 65 61 64 73 20 64 61 74 61 20 66 72 6f 6d 20  reads data from 
48c0: 2a 2f 0a 20 20 69 36 34 20 69 53 74 61 72 74 4f  */.  i64 iStartO
48d0: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
48e0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
48f0: 6f 20 73 74 61 72 74 20 77 72 69 74 69 6e 67 20  o start writing 
4900: 66 69 6c 65 20 61 74 20 2a 2f 0a 20 20 69 6e 74  file at */.  int
4910: 20 6d 78 53 7a 3b 20 20 20 20 20 20 20 20 20 20   mxSz;          
4920: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4930: 4d 61 78 69 6d 75 6d 20 62 79 74 65 73 20 6f 66  Maximum bytes of
4940: 20 64 61 74 61 20 74 6f 20 73 74 6f 72 65 20 2a   data to store *
4950: 2f 0a 20 20 69 6e 74 20 62 45 6f 66 3b 20 20 20  /.  int bEof;   
4960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4970: 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72      /* Set to tr
4980: 75 65 20 77 68 65 6e 20 6d 65 72 67 65 20 69 73  ue when merge is
4990: 20 66 69 6e 69 73 68 65 64 20 2a 2f 0a 20 20 69   finished */.  i
49a0: 6e 74 20 62 55 73 65 54 68 72 65 61 64 3b 20 20  nt bUseThread;  
49b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
49c0: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 61 20  * True to use a 
49d0: 62 67 20 74 68 72 65 61 64 20 66 6f 72 20 74 68  bg thread for th
49e0: 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 53  is object */.  S
49f0: 6f 72 74 65 72 46 69 6c 65 20 61 46 69 6c 65 5b  orterFile aFile[
4a00: 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  2];            /
4a10: 2a 20 61 46 69 6c 65 5b 30 5d 20 66 6f 72 20 72  * aFile[0] for r
4a20: 65 61 64 69 6e 67 2c 20 5b 31 5d 20 66 6f 72 20  eading, [1] for 
4a30: 77 72 69 74 69 6e 67 20 2a 2f 0a 7d 3b 0a 0a 2f  writing */.};../
4a40: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
4a50: 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20   of this object 
4a60: 69 73 20 75 73 65 64 20 66 6f 72 20 77 72 69 74  is used for writ
4a70: 69 6e 67 20 61 20 50 4d 41 2e 0a 2a 2a 0a 2a 2a  ing a PMA..**.**
4a80: 20 54 68 65 20 50 4d 41 20 69 73 20 77 72 69 74   The PMA is writ
4a90: 74 65 6e 20 6f 6e 65 20 72 65 63 6f 72 64 20 61  ten one record a
4aa0: 74 20 61 20 74 69 6d 65 2e 20 20 45 61 63 68 20  t a time.  Each 
4ab0: 72 65 63 6f 72 64 20 69 73 20 6f 66 20 61 6e 20  record is of an 
4ac0: 61 72 62 69 74 72 61 72 79 0a 2a 2a 20 73 69 7a  arbitrary.** siz
4ad0: 65 2e 20 20 42 75 74 20 49 2f 4f 20 69 73 20 6d  e.  But I/O is m
4ae0: 6f 72 65 20 65 66 66 69 63 69 65 6e 74 20 69 66  ore efficient if
4af0: 20 69 74 20 6f 63 63 75 72 73 20 69 6e 20 70 61   it occurs in pa
4b00: 67 65 2d 73 69 7a 65 64 20 62 6c 6f 63 6b 73 20  ge-sized blocks 
4b10: 77 68 65 72 65 0a 2a 2a 20 65 61 63 68 20 62 6c  where.** each bl
4b20: 6f 63 6b 20 69 73 20 61 6c 69 67 6e 65 64 20 6f  ock is aligned o
4b30: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
4b40: 79 2e 20 20 54 68 69 73 20 6f 62 6a 65 63 74 20  y.  This object 
4b50: 63 61 63 68 65 73 20 77 72 69 74 65 73 20 74 6f  caches writes to
4b60: 0a 2a 2a 20 74 68 65 20 50 4d 41 20 73 6f 20 74  .** the PMA so t
4b70: 68 61 74 20 61 6c 69 67 6e 65 64 2c 20 70 61 67  hat aligned, pag
4b80: 65 2d 73 69 7a 65 20 62 6c 6f 63 6b 73 20 61 72  e-size blocks ar
4b90: 65 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 73 74  e written..*/.st
4ba0: 72 75 63 74 20 50 6d 61 57 72 69 74 65 72 20 7b  ruct PmaWriter {
4bb0: 0a 20 20 69 6e 74 20 65 46 57 45 72 72 3b 20 20  .  int eFWErr;  
4bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bd0: 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69     /* Non-zero i
4be0: 66 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74  f in an error st
4bf0: 61 74 65 20 2a 2f 0a 20 20 75 38 20 2a 61 42 75  ate */.  u8 *aBu
4c00: 66 66 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ffer;           
4c10: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
4c20: 74 65 72 20 74 6f 20 77 72 69 74 65 20 62 75 66  ter to write buf
4c30: 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 75  fer */.  int nBu
4c40: 66 66 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ffer;           
4c50: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
4c60: 20 6f 66 20 77 72 69 74 65 20 62 75 66 66 65 72   of write buffer
4c70: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
4c80: 6e 74 20 69 42 75 66 53 74 61 72 74 3b 20 20 20  nt iBufStart;   
4c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4ca0: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
4cb0: 62 75 66 66 65 72 20 74 6f 20 77 72 69 74 65 20  buffer to write 
4cc0: 2a 2f 0a 20 20 69 6e 74 20 69 42 75 66 45 6e 64  */.  int iBufEnd
4cd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4ce0: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 62 79 74       /* Last byt
4cf0: 65 20 6f 66 20 62 75 66 66 65 72 20 74 6f 20 77  e of buffer to w
4d00: 72 69 74 65 20 2a 2f 0a 20 20 69 36 34 20 69 57  rite */.  i64 iW
4d10: 72 69 74 65 4f 66 66 3b 20 20 20 20 20 20 20 20  riteOff;        
4d20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
4d30: 73 65 74 20 6f 66 20 73 74 61 72 74 20 6f 66 20  set of start of 
4d40: 62 75 66 66 65 72 20 69 6e 20 66 69 6c 65 20 2a  buffer in file *
4d50: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
4d60: 20 2a 70 46 64 3b 20 20 20 20 20 20 20 20 20 20   *pFd;          
4d70: 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64      /* File hand
4d80: 6c 65 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a  le to write to *
4d90: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  /.};../*.** This
4da0: 20 6f 62 6a 65 63 74 20 69 73 20 74 68 65 20 68   object is the h
4db0: 65 61 64 65 72 20 6f 6e 20 61 20 73 69 6e 67 6c  eader on a singl
4dc0: 65 20 72 65 63 6f 72 64 20 77 68 69 6c 65 20 74  e record while t
4dd0: 68 61 74 20 72 65 63 6f 72 64 20 69 73 20 62 65  hat record is be
4de0: 69 6e 67 0a 2a 2a 20 68 65 6c 64 20 69 6e 20 6d  ing.** held in m
4df0: 65 6d 6f 72 79 20 61 6e 64 20 70 72 69 6f 72 20  emory and prior 
4e00: 74 6f 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  to being written
4e10: 20 6f 75 74 20 61 73 20 70 61 72 74 20 6f 66 20   out as part of 
4e20: 61 20 50 4d 41 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77  a PMA..**.** How
4e30: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
4e40: 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 64 65   is connected de
4e50: 70 65 6e 64 73 20 6f 6e 20 68 6f 77 20 6d 65 6d  pends on how mem
4e60: 6f 72 79 20 69 73 20 62 65 69 6e 67 20 6d 61 6e  ory is being man
4e70: 61 67 65 64 0a 2a 2a 20 62 79 20 74 68 69 73 20  aged.** by this 
4e80: 6d 6f 64 75 6c 65 2e 20 49 66 20 75 73 69 6e 67  module. If using
4e90: 20 61 20 73 65 70 61 72 61 74 65 20 61 6c 6c 6f   a separate allo
4ea0: 63 61 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20  cation for each 
4eb0: 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 63 6f 72 64  in-memory record
4ec0: 0a 2a 2a 20 28 56 64 62 65 53 6f 72 74 65 72 2e  .** (VdbeSorter.
4ed0: 6c 69 73 74 2e 61 4d 65 6d 6f 72 79 3d 3d 30 29  list.aMemory==0)
4ee0: 2c 20 74 68 65 6e 20 74 68 65 20 6c 69 73 74 20  , then the list 
4ef0: 69 73 20 61 6c 77 61 79 73 20 63 6f 6e 6e 65 63  is always connec
4f00: 74 65 64 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a  ted using the.**
4f10: 20 53 6f 72 74 65 72 52 65 63 6f 72 64 2e 75 2e   SorterRecord.u.
4f20: 70 4e 65 78 74 20 70 6f 69 6e 74 65 72 73 2e 0a  pNext pointers..
4f30: 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 75 73 69  **.** Or, if usi
4f40: 6e 67 20 74 68 65 20 73 69 6e 67 6c 65 20 6c 61  ng the single la
4f50: 72 67 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6d  rge allocation m
4f60: 65 74 68 6f 64 20 28 56 64 62 65 53 6f 72 74 65  ethod (VdbeSorte
4f70: 72 2e 6c 69 73 74 2e 61 4d 65 6d 6f 72 79 21 3d  r.list.aMemory!=
4f80: 30 29 2c 0a 2a 2a 20 74 68 65 6e 20 77 68 69 6c  0),.** then whil
4f90: 65 20 72 65 63 6f 72 64 73 20 61 72 65 20 62 65  e records are be
4fa0: 69 6e 67 20 61 63 63 75 6d 75 6c 61 74 65 64 20  ing accumulated 
4fb0: 74 68 65 20 6c 69 73 74 20 69 73 20 6c 69 6e 6b  the list is link
4fc0: 65 64 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20  ed using the.** 
4fd0: 53 6f 72 74 65 72 52 65 63 6f 72 64 2e 75 2e 69  SorterRecord.u.i
4fe0: 4e 65 78 74 20 6f 66 66 73 65 74 2e 20 54 68 69  Next offset. Thi
4ff0: 73 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65  s is because the
5000: 20 61 4d 65 6d 6f 72 79 5b 5d 20 61 72 72 61 79   aMemory[] array
5010: 20 6d 61 79 0a 2a 2a 20 62 65 20 73 71 6c 69 74   may.** be sqlit
5020: 65 33 52 65 61 6c 6c 6f 63 28 29 65 64 20 77 68  e3Realloc()ed wh
5030: 69 6c 65 20 72 65 63 6f 72 64 73 20 61 72 65 20  ile records are 
5040: 62 65 69 6e 67 20 61 63 63 75 6d 75 6c 61 74 65  being accumulate
5050: 64 2e 20 4f 6e 63 65 20 74 68 65 20 56 4d 0a 2a  d. Once the VM.*
5060: 2a 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 70  * has finished p
5070: 61 73 73 69 6e 67 20 72 65 63 6f 72 64 73 20 74  assing records t
5080: 6f 20 74 68 65 20 73 6f 72 74 65 72 2c 20 6f 72  o the sorter, or
5090: 20 77 68 65 6e 20 74 68 65 20 69 6e 2d 6d 65 6d   when the in-mem
50a0: 6f 72 79 20 62 75 66 66 65 72 0a 2a 2a 20 69 73  ory buffer.** is
50b0: 20 66 75 6c 6c 2c 20 74 68 65 20 6c 69 73 74 20   full, the list 
50c0: 69 73 20 73 6f 72 74 65 64 2e 20 41 73 20 70 61  is sorted. As pa
50d0: 72 74 20 6f 66 20 74 68 65 20 73 6f 72 74 69 6e  rt of the sortin
50e0: 67 20 70 72 6f 63 65 73 73 2c 20 69 74 20 69 73  g process, it is
50f0: 0a 2a 2a 20 63 6f 6e 76 65 72 74 65 64 20 74 6f  .** converted to
5100: 20 75 73 65 20 74 68 65 20 53 6f 72 74 65 72 52   use the SorterR
5110: 65 63 6f 72 64 2e 75 2e 70 4e 65 78 74 20 70 6f  ecord.u.pNext po
5120: 69 6e 74 65 72 73 2e 20 53 65 65 20 66 75 6e 63  inters. See func
5130: 74 69 6f 6e 0a 2a 2a 20 76 64 62 65 53 6f 72 74  tion.** vdbeSort
5140: 65 72 53 6f 72 74 28 29 20 66 6f 72 20 64 65 74  erSort() for det
5150: 61 69 6c 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ails..*/.struct 
5160: 53 6f 72 74 65 72 52 65 63 6f 72 64 20 7b 0a 20  SorterRecord {. 
5170: 20 69 6e 74 20 6e 56 61 6c 3b 20 20 20 20 20 20   int nVal;      
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5190: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
51a0: 72 65 63 6f 72 64 20 69 6e 20 62 79 74 65 73 20  record in bytes 
51b0: 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20  */.  union {.   
51c0: 20 53 6f 72 74 65 72 52 65 63 6f 72 64 20 2a 70   SorterRecord *p
51d0: 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 2f  Next;          /
51e0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 78  * Pointer to nex
51f0: 74 20 72 65 63 6f 72 64 20 69 6e 20 6c 69 73 74  t record in list
5200: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4e 65 78   */.    int iNex
5210: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
5220: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
5230: 77 69 74 68 69 6e 20 61 4d 65 6d 6f 72 79 20 6f  within aMemory o
5240: 66 20 6e 65 78 74 20 72 65 63 6f 72 64 20 2a 2f  f next record */
5250: 0a 20 20 7d 20 75 3b 0a 20 20 2f 2a 20 54 68 65  .  } u;.  /* The
5260: 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 72 65   data for the re
5270: 63 6f 72 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  cord immediately
5280: 20 66 6f 6c 6c 6f 77 73 20 74 68 69 73 20 68 65   follows this he
5290: 61 64 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 52  ader */.};../* R
52a0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
52b0: 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 63 6f  to the buffer co
52c0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 65 63  ntaining the rec
52d0: 6f 72 64 20 64 61 74 61 20 66 6f 72 20 53 6f 72  ord data for Sor
52e0: 74 65 72 52 65 63 6f 72 64 0a 2a 2a 20 6f 62 6a  terRecord.** obj
52f0: 65 63 74 20 70 2e 20 53 68 6f 75 6c 64 20 62 65  ect p. Should be
5300: 20 75 73 65 64 20 61 73 20 69 66 3a 0a 2a 2a 0a   used as if:.**.
5310: 2a 2a 20 20 20 76 6f 69 64 20 2a 53 52 56 41 4c  **   void *SRVAL
5320: 28 53 6f 72 74 65 72 52 65 63 6f 72 64 20 2a 70  (SorterRecord *p
5330: 29 20 7b 20 72 65 74 75 72 6e 20 28 76 6f 69 64  ) { return (void
5340: 2a 29 26 70 5b 31 5d 3b 20 7d 0a 2a 2f 0a 23 64  *)&p[1]; }.*/.#d
5350: 65 66 69 6e 65 20 53 52 56 41 4c 28 70 29 20 28  efine SRVAL(p) (
5360: 28 76 6f 69 64 2a 29 28 28 53 6f 72 74 65 72 52  (void*)((SorterR
5370: 65 63 6f 72 64 2a 29 28 70 29 20 2b 20 31 29 29  ecord*)(p) + 1))
5380: 0a 0a 2f 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d  ../* The minimum
5390: 20 50 4d 41 20 73 69 7a 65 20 69 73 20 73 65 74   PMA size is set
53a0: 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 6d   to this value m
53b0: 75 6c 74 69 70 6c 69 65 64 20 62 79 20 74 68 65  ultiplied by the
53c0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 70 61 67   database.** pag
53d0: 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 2e  e size in bytes.
53e0: 20 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 4f 52    */.#define SOR
53f0: 54 45 52 5f 4d 49 4e 5f 57 4f 52 4b 49 4e 47 20  TER_MIN_WORKING 
5400: 31 30 0a 0a 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e  10../* Maximum n
5410: 75 6d 62 65 72 20 6f 66 20 50 4d 41 73 20 74 68  umber of PMAs th
5420: 61 74 20 61 20 73 69 6e 67 6c 65 20 4d 65 72 67  at a single Merg
5430: 65 45 6e 67 69 6e 65 20 63 61 6e 20 6d 65 72 67  eEngine can merg
5440: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 4f 52  e */.#define SOR
5450: 54 45 52 5f 4d 41 58 5f 4d 45 52 47 45 5f 43 4f  TER_MAX_MERGE_CO
5460: 55 4e 54 20 31 36 0a 0a 73 74 61 74 69 63 20 69  UNT 16..static i
5470: 6e 74 20 76 64 62 65 49 6e 63 72 53 77 61 70 28  nt vdbeIncrSwap(
5480: 49 6e 63 72 4d 65 72 67 65 72 2a 29 3b 0a 73 74  IncrMerger*);.st
5490: 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 49 6e  atic void vdbeIn
54a0: 63 72 46 72 65 65 28 49 6e 63 72 4d 65 72 67 65  crFree(IncrMerge
54b0: 72 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  r *);../*.** Fre
54c0: 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 62 65 6c  e all memory bel
54d0: 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 50 6d  onging to the Pm
54e0: 61 52 65 61 64 65 72 20 6f 62 6a 65 63 74 20 70  aReader object p
54f0: 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20  assed as the.** 
5500: 61 72 67 75 6d 65 6e 74 2e 20 41 6c 6c 20 73 74  argument. All st
5510: 72 75 63 74 75 72 65 20 66 69 65 6c 64 73 20 61  ructure fields a
5520: 72 65 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 62  re set to zero b
5530: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
5540: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5550: 76 64 62 65 50 6d 61 52 65 61 64 65 72 43 6c 65  vdbePmaReaderCle
5560: 61 72 28 50 6d 61 52 65 61 64 65 72 20 2a 70 52  ar(PmaReader *pR
5570: 65 61 64 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  eadr){.  sqlite3
5580: 5f 66 72 65 65 28 70 52 65 61 64 72 2d 3e 61 41  _free(pReadr->aA
5590: 6c 6c 6f 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  lloc);.  sqlite3
55a0: 5f 66 72 65 65 28 70 52 65 61 64 72 2d 3e 61 42  _free(pReadr->aB
55b0: 75 66 66 65 72 29 3b 0a 20 20 69 66 28 20 70 52  uffer);.  if( pR
55c0: 65 61 64 72 2d 3e 61 4d 61 70 20 29 20 73 71 6c  eadr->aMap ) sql
55d0: 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 52  ite3OsUnfetch(pR
55e0: 65 61 64 72 2d 3e 70 46 64 2c 20 30 2c 20 70 52  eadr->pFd, 0, pR
55f0: 65 61 64 72 2d 3e 61 4d 61 70 29 3b 0a 20 20 76  eadr->aMap);.  v
5600: 64 62 65 49 6e 63 72 46 72 65 65 28 70 52 65 61  dbeIncrFree(pRea
5610: 64 72 2d 3e 70 49 6e 63 72 29 3b 0a 20 20 6d 65  dr->pIncr);.  me
5620: 6d 73 65 74 28 70 52 65 61 64 72 2c 20 30 2c 20  mset(pReadr, 0, 
5630: 73 69 7a 65 6f 66 28 50 6d 61 52 65 61 64 65 72  sizeof(PmaReader
5640: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  ));.}../*.** Rea
5650: 64 20 74 68 65 20 6e 65 78 74 20 6e 42 79 74 65  d the next nByte
5660: 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66   bytes of data f
5670: 72 6f 6d 20 74 68 65 20 50 4d 41 20 70 2e 0a 2a  rom the PMA p..*
5680: 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
5690: 20 73 65 74 20 2a 70 70 4f 75 74 20 74 6f 20 70   set *ppOut to p
56a0: 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
56b0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
56c0: 64 61 74 61 0a 2a 2a 20 61 6e 64 20 72 65 74 75  data.** and retu
56d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74  rn SQLITE_OK. Ot
56e0: 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65  herwise, if an e
56f0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
5700: 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a  urn an SQLite.**
5710: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
5720: 2a 2a 20 54 68 65 20 62 75 66 66 65 72 20 72 65  ** The buffer re
5730: 74 75 72 6e 65 64 20 69 6e 20 2a 70 70 4f 75 74  turned in *ppOut
5740: 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20 75   is only valid u
5750: 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6e 65 78 74  ntil the.** next
5760: 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 66 75   call to this fu
5770: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
5780: 63 20 69 6e 74 20 76 64 62 65 50 6d 61 52 65 61  c int vdbePmaRea
5790: 64 42 6c 6f 62 28 0a 20 20 50 6d 61 52 65 61 64  dBlob(.  PmaRead
57a0: 65 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  er *p,          
57b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6d 61 52           /* PmaR
57c0: 65 61 64 65 72 20 66 72 6f 6d 20 77 68 69 63 68  eader from which
57d0: 20 74 6f 20 74 61 6b 65 20 74 68 65 20 62 6c 6f   to take the blo
57e0: 62 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  b */.  int nByte
57f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5800: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
5810: 6f 66 20 64 61 74 61 20 74 6f 20 72 65 61 64 20  of data to read 
5820: 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 4f 75 74 20  */.  u8 **ppOut 
5830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5840: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69       /* OUT: Poi
5850: 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63  nter to buffer c
5860: 6f 6e 74 61 69 6e 69 6e 67 20 64 61 74 61 20 2a  ontaining data *
5870: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 42 75 66 3b  /.){.  int iBuf;
5880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5890: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
58a0: 20 77 69 74 68 69 6e 20 62 75 66 66 65 72 20 74   within buffer t
58b0: 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
58c0: 20 69 6e 74 20 6e 41 76 61 69 6c 3b 20 20 20 20   int nAvail;    
58d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58e0: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 64 61 74   /* Bytes of dat
58f0: 61 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 62  a available in b
5900: 75 66 66 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20  uffer */..  if( 
5910: 70 2d 3e 61 4d 61 70 20 29 7b 0a 20 20 20 20 2a  p->aMap ){.    *
5920: 70 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4d 61 70  ppOut = &p->aMap
5930: 5b 70 2d 3e 69 52 65 61 64 4f 66 66 5d 3b 0a 20  [p->iReadOff];. 
5940: 20 20 20 70 2d 3e 69 52 65 61 64 4f 66 66 20 2b     p->iReadOff +
5950: 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 72 65 74  = nByte;.    ret
5960: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
5970: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d   }..  assert( p-
5980: 3e 61 42 75 66 66 65 72 20 29 3b 0a 0a 20 20 2f  >aBuffer );..  /
5990: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
59a0: 20 6d 6f 72 65 20 64 61 74 61 20 74 6f 20 62 65   more data to be
59b0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 62   read from the b
59c0: 75 66 66 65 72 2c 20 72 65 61 64 20 74 68 65 20  uffer, read the 
59d0: 6e 65 78 74 20 0a 20 20 2a 2a 20 70 2d 3e 6e 42  next .  ** p->nB
59e0: 75 66 66 65 72 20 62 79 74 65 73 20 6f 66 20 64  uffer bytes of d
59f0: 61 74 61 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  ata from the fil
5a00: 65 20 69 6e 74 6f 20 69 74 2e 20 4f 72 2c 20 69  e into it. Or, i
5a10: 66 20 74 68 65 72 65 20 61 72 65 20 6c 65 73 73  f there are less
5a20: 0a 20 20 2a 2a 20 74 68 61 6e 20 70 2d 3e 6e 42  .  ** than p->nB
5a30: 75 66 66 65 72 20 62 79 74 65 73 20 72 65 6d 61  uffer bytes rema
5a40: 69 6e 69 6e 67 20 69 6e 20 74 68 65 20 50 4d 41  ining in the PMA
5a50: 2c 20 72 65 61 64 20 61 6c 6c 20 72 65 6d 61 69  , read all remai
5a60: 6e 69 6e 67 20 64 61 74 61 2e 20 20 2a 2f 0a 20  ning data.  */. 
5a70: 20 69 42 75 66 20 3d 20 70 2d 3e 69 52 65 61 64   iBuf = p->iRead
5a80: 4f 66 66 20 25 20 70 2d 3e 6e 42 75 66 66 65 72  Off % p->nBuffer
5a90: 3b 0a 20 20 69 66 28 20 69 42 75 66 3d 3d 30 20  ;.  if( iBuf==0 
5aa0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 52 65 61 64  ){.    int nRead
5ab0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5ac0: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f       /* Bytes to
5ad0: 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20   read from disk 
5ae0: 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20  */.    int rc;  
5af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b00: 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f       /* sqlite3O
5b10: 73 52 65 61 64 28 29 20 72 65 74 75 72 6e 20 63  sRead() return c
5b20: 6f 64 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 44  ode */..    /* D
5b30: 65 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e  etermine how man
5b40: 79 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  y bytes of data 
5b50: 74 6f 20 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20  to read. */.    
5b60: 69 66 28 20 28 70 2d 3e 69 45 6f 66 20 2d 20 70  if( (p->iEof - p
5b70: 2d 3e 69 52 65 61 64 4f 66 66 29 20 3e 20 28 69  ->iReadOff) > (i
5b80: 36 34 29 70 2d 3e 6e 42 75 66 66 65 72 20 29 7b  64)p->nBuffer ){
5b90: 0a 20 20 20 20 20 20 6e 52 65 61 64 20 3d 20 70  .      nRead = p
5ba0: 2d 3e 6e 42 75 66 66 65 72 3b 0a 20 20 20 20 7d  ->nBuffer;.    }
5bb0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 61  else{.      nRea
5bc0: 64 20 3d 20 28 69 6e 74 29 28 70 2d 3e 69 45 6f  d = (int)(p->iEo
5bd0: 66 20 2d 20 70 2d 3e 69 52 65 61 64 4f 66 66 29  f - p->iReadOff)
5be0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
5bf0: 72 74 28 20 6e 52 65 61 64 3e 30 20 29 3b 0a 0a  rt( nRead>0 );..
5c00: 20 20 20 20 2f 2a 20 52 65 61 64 72 20 64 61 74      /* Readr dat
5c10: 61 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 2e  a from the file.
5c20: 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66   Return early if
5c30: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
5c40: 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  . */.    rc = sq
5c50: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 2d 3e 70  lite3OsRead(p->p
5c60: 46 64 2c 20 70 2d 3e 61 42 75 66 66 65 72 2c 20  Fd, p->aBuffer, 
5c70: 6e 52 65 61 64 2c 20 70 2d 3e 69 52 65 61 64 4f  nRead, p->iReadO
5c80: 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ff);.    assert(
5c90: 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
5ca0: 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 3b 0a  R_SHORT_READ );.
5cb0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
5cc0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
5cd0: 63 3b 0a 20 20 7d 0a 20 20 6e 41 76 61 69 6c 20  c;.  }.  nAvail 
5ce0: 3d 20 70 2d 3e 6e 42 75 66 66 65 72 20 2d 20 69  = p->nBuffer - i
5cf0: 42 75 66 3b 20 0a 0a 20 20 69 66 28 20 6e 42 79  Buf; ..  if( nBy
5d00: 74 65 3c 3d 6e 41 76 61 69 6c 20 29 7b 0a 20 20  te<=nAvail ){.  
5d10: 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
5d20: 65 64 20 64 61 74 61 20 69 73 20 61 76 61 69 6c  ed data is avail
5d30: 61 62 6c 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d  able in the in-m
5d40: 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 49 6e  emory buffer. In
5d50: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 63 61 73   this.    ** cas
5d60: 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  e there is no ne
5d70: 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f 70  ed to make a cop
5d80: 79 20 6f 66 20 74 68 65 20 64 61 74 61 2c 20 6a  y of the data, j
5d90: 75 73 74 20 72 65 74 75 72 6e 20 61 20 0a 20 20  ust return a .  
5da0: 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 74    ** pointer int
5db0: 6f 20 74 68 65 20 62 75 66 66 65 72 20 74 6f 20  o the buffer to 
5dc0: 74 68 65 20 63 61 6c 6c 65 72 2e 20 20 2a 2f 0a  the caller.  */.
5dd0: 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 26 70 2d      *ppOut = &p-
5de0: 3e 61 42 75 66 66 65 72 5b 69 42 75 66 5d 3b 0a  >aBuffer[iBuf];.
5df0: 20 20 20 20 70 2d 3e 69 52 65 61 64 4f 66 66 20      p->iReadOff 
5e00: 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 65 6c 73  += nByte;.  }els
5e10: 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  e{.    /* The re
5e20: 71 75 65 73 74 65 64 20 64 61 74 61 20 69 73 20  quested data is 
5e30: 6e 6f 74 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c  not all availabl
5e40: 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e in the in-memo
5e50: 72 79 20 62 75 66 66 65 72 2e 0a 20 20 20 20 2a  ry buffer..    *
5e60: 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  * In this case, 
5e70: 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 61  allocate space a
5e80: 74 20 70 2d 3e 61 41 6c 6c 6f 63 5b 5d 20 74 6f  t p->aAlloc[] to
5e90: 20 63 6f 70 79 20 74 68 65 20 72 65 71 75 65 73   copy the reques
5ea0: 74 65 64 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65  ted.    ** range
5eb0: 20 69 6e 74 6f 2e 20 54 68 65 6e 20 72 65 74 75   into. Then retu
5ec0: 72 6e 20 61 20 63 6f 70 79 20 6f 66 20 70 6f 69  rn a copy of poi
5ed0: 6e 74 65 72 20 70 2d 3e 61 41 6c 6c 6f 63 20 74  nter p->aAlloc t
5ee0: 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 20 2a  o the caller.  *
5ef0: 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d 3b 20  /.    int nRem; 
5f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f10: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 72 65 6d      /* Bytes rem
5f20: 61 69 6e 69 6e 67 20 74 6f 20 63 6f 70 79 20 2a  aining to copy *
5f30: 2f 0a 0a 20 20 20 20 2f 2a 20 45 78 74 65 6e 64  /..    /* Extend
5f40: 20 74 68 65 20 70 2d 3e 61 41 6c 6c 6f 63 5b 5d   the p->aAlloc[]
5f50: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 66 20 72   allocation if r
5f60: 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
5f70: 69 66 28 20 70 2d 3e 6e 41 6c 6c 6f 63 3c 6e 42  if( p->nAlloc<nB
5f80: 79 74 65 20 29 7b 0a 20 20 20 20 20 20 75 38 20  yte ){.      u8 
5f90: 2a 61 4e 65 77 3b 0a 20 20 20 20 20 20 69 6e 74  *aNew;.      int
5fa0: 20 6e 4e 65 77 20 3d 20 4d 41 58 28 31 32 38 2c   nNew = MAX(128,
5fb0: 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 29 3b 0a 20   p->nAlloc*2);. 
5fc0: 20 20 20 20 20 77 68 69 6c 65 28 20 6e 42 79 74       while( nByt
5fd0: 65 3e 6e 4e 65 77 20 29 20 6e 4e 65 77 20 3d 20  e>nNew ) nNew = 
5fe0: 6e 4e 65 77 2a 32 3b 0a 20 20 20 20 20 20 61 4e  nNew*2;.      aN
5ff0: 65 77 20 3d 20 73 71 6c 69 74 65 33 52 65 61 6c  ew = sqlite3Real
6000: 6c 6f 63 28 70 2d 3e 61 41 6c 6c 6f 63 2c 20 6e  loc(p->aAlloc, n
6010: 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20  New);.      if( 
6020: 21 61 4e 65 77 20 29 20 72 65 74 75 72 6e 20 53  !aNew ) return S
6030: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
6040: 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e     p->nAlloc = n
6050: 4e 65 77 3b 0a 20 20 20 20 20 20 70 2d 3e 61 41  New;.      p->aA
6060: 6c 6c 6f 63 20 3d 20 61 4e 65 77 3b 0a 20 20 20  lloc = aNew;.   
6070: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20   }..    /* Copy 
6080: 61 73 20 6d 75 63 68 20 64 61 74 61 20 61 73 20  as much data as 
6090: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  is available in 
60a0: 74 68 65 20 62 75 66 66 65 72 20 69 6e 74 6f 20  the buffer into 
60b0: 74 68 65 20 73 74 61 72 74 20 6f 66 0a 20 20 20  the start of.   
60c0: 20 2a 2a 20 70 2d 3e 61 41 6c 6c 6f 63 5b 5d 2e   ** p->aAlloc[].
60d0: 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28    */.    memcpy(
60e0: 70 2d 3e 61 41 6c 6c 6f 63 2c 20 26 70 2d 3e 61  p->aAlloc, &p->a
60f0: 42 75 66 66 65 72 5b 69 42 75 66 5d 2c 20 6e 41  Buffer[iBuf], nA
6100: 76 61 69 6c 29 3b 0a 20 20 20 20 70 2d 3e 69 52  vail);.    p->iR
6110: 65 61 64 4f 66 66 20 2b 3d 20 6e 41 76 61 69 6c  eadOff += nAvail
6120: 3b 0a 20 20 20 20 6e 52 65 6d 20 3d 20 6e 42 79  ;.    nRem = nBy
6130: 74 65 20 2d 20 6e 41 76 61 69 6c 3b 0a 0a 20 20  te - nAvail;..  
6140: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
6150: 6e 67 20 6c 6f 6f 70 20 63 6f 70 69 65 73 20 75  ng loop copies u
6160: 70 20 74 6f 20 70 2d 3e 6e 42 75 66 66 65 72 20  p to p->nBuffer 
6170: 62 79 74 65 73 20 70 65 72 20 69 74 65 72 61 74  bytes per iterat
6180: 69 6f 6e 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20  ion into.    ** 
6190: 74 68 65 20 70 2d 3e 61 41 6c 6c 6f 63 5b 5d 20  the p->aAlloc[] 
61a0: 62 75 66 66 65 72 2e 20 20 2a 2f 0a 20 20 20 20  buffer.  */.    
61b0: 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20 29 7b  while( nRem>0 ){
61c0: 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 20 20  .      int rc;  
61d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61e0: 20 20 20 2f 2a 20 76 64 62 65 50 6d 61 52 65 61     /* vdbePmaRea
61f0: 64 42 6c 6f 62 28 29 20 72 65 74 75 72 6e 20 63  dBlob() return c
6200: 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ode */.      int
6210: 20 6e 43 6f 70 79 3b 20 20 20 20 20 20 20 20 20   nCopy;         
6220: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
6230: 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63  er of bytes to c
6240: 6f 70 79 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  opy */.      u8 
6250: 2a 61 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *aNext;         
6260: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
6270: 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 74 6f  ter to buffer to
6280: 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   copy data from 
6290: 2a 2f 0a 0a 20 20 20 20 20 20 6e 43 6f 70 79 20  */..      nCopy 
62a0: 3d 20 6e 52 65 6d 3b 0a 20 20 20 20 20 20 69 66  = nRem;.      if
62b0: 28 20 6e 52 65 6d 3e 70 2d 3e 6e 42 75 66 66 65  ( nRem>p->nBuffe
62c0: 72 20 29 20 6e 43 6f 70 79 20 3d 20 70 2d 3e 6e  r ) nCopy = p->n
62d0: 42 75 66 66 65 72 3b 0a 20 20 20 20 20 20 72 63  Buffer;.      rc
62e0: 20 3d 20 76 64 62 65 50 6d 61 52 65 61 64 42 6c   = vdbePmaReadBl
62f0: 6f 62 28 70 2c 20 6e 43 6f 70 79 2c 20 26 61 4e  ob(p, nCopy, &aN
6300: 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ext);.      if( 
6310: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
6320: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
6330: 20 61 73 73 65 72 74 28 20 61 4e 65 78 74 21 3d   assert( aNext!=
6340: 70 2d 3e 61 41 6c 6c 6f 63 20 29 3b 0a 20 20 20  p->aAlloc );.   
6350: 20 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 61 41     memcpy(&p->aA
6360: 6c 6c 6f 63 5b 6e 42 79 74 65 20 2d 20 6e 52 65  lloc[nByte - nRe
6370: 6d 5d 2c 20 61 4e 65 78 74 2c 20 6e 43 6f 70 79  m], aNext, nCopy
6380: 29 3b 0a 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d  );.      nRem -=
6390: 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 0a 20   nCopy;.    }.. 
63a0: 20 20 20 2a 70 70 4f 75 74 20 3d 20 70 2d 3e 61     *ppOut = p->a
63b0: 41 6c 6c 6f 63 3b 0a 20 20 7d 0a 0a 20 20 72 65  Alloc;.  }..  re
63c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
63d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
63e0: 76 61 72 69 6e 74 20 66 72 6f 6d 20 74 68 65 20  varint from the 
63f0: 73 74 72 65 61 6d 20 6f 66 20 64 61 74 61 20 61  stream of data a
6400: 63 63 65 73 73 65 64 20 62 79 20 70 2e 20 53 65  ccessed by p. Se
6410: 74 20 2a 70 6e 4f 75 74 20 74 6f 0a 2a 2a 20 74  t *pnOut to.** t
6420: 68 65 20 76 61 6c 75 65 20 72 65 61 64 2e 0a 2a  he value read..*
6430: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
6440: 65 50 6d 61 52 65 61 64 56 61 72 69 6e 74 28 50  ePmaReadVarint(P
6450: 6d 61 52 65 61 64 65 72 20 2a 70 2c 20 75 36 34  maReader *p, u64
6460: 20 2a 70 6e 4f 75 74 29 7b 0a 20 20 69 6e 74 20   *pnOut){.  int 
6470: 69 42 75 66 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  iBuf;..  if( p->
6480: 61 4d 61 70 20 29 7b 0a 20 20 20 20 70 2d 3e 69  aMap ){.    p->i
6490: 52 65 61 64 4f 66 66 20 2b 3d 20 73 71 6c 69 74  ReadOff += sqlit
64a0: 65 33 47 65 74 56 61 72 69 6e 74 28 26 70 2d 3e  e3GetVarint(&p->
64b0: 61 4d 61 70 5b 70 2d 3e 69 52 65 61 64 4f 66 66  aMap[p->iReadOff
64c0: 5d 2c 20 70 6e 4f 75 74 29 3b 0a 20 20 7d 65 6c  ], pnOut);.  }el
64d0: 73 65 7b 0a 20 20 20 20 69 42 75 66 20 3d 20 70  se{.    iBuf = p
64e0: 2d 3e 69 52 65 61 64 4f 66 66 20 25 20 70 2d 3e  ->iReadOff % p->
64f0: 6e 42 75 66 66 65 72 3b 0a 20 20 20 20 69 66 28  nBuffer;.    if(
6500: 20 69 42 75 66 20 26 26 20 28 70 2d 3e 6e 42 75   iBuf && (p->nBu
6510: 66 66 65 72 2d 69 42 75 66 29 3e 3d 39 20 29 7b  ffer-iBuf)>=9 ){
6520: 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 61 64 4f  .      p->iReadO
6530: 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 47 65 74  ff += sqlite3Get
6540: 56 61 72 69 6e 74 28 26 70 2d 3e 61 42 75 66 66  Varint(&p->aBuff
6550: 65 72 5b 69 42 75 66 5d 2c 20 70 6e 4f 75 74 29  er[iBuf], pnOut)
6560: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6570: 20 20 20 75 38 20 61 56 61 72 69 6e 74 5b 31 36     u8 aVarint[16
6580: 5d 2c 20 2a 61 3b 0a 20 20 20 20 20 20 69 6e 74  ], *a;.      int
6590: 20 69 20 3d 20 30 2c 20 72 63 3b 0a 20 20 20 20   i = 0, rc;.    
65a0: 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 72 63    do{.        rc
65b0: 20 3d 20 76 64 62 65 50 6d 61 52 65 61 64 42 6c   = vdbePmaReadBl
65c0: 6f 62 28 70 2c 20 31 2c 20 26 61 29 3b 0a 20 20  ob(p, 1, &a);.  
65d0: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
65e0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
65f0: 20 20 61 56 61 72 69 6e 74 5b 28 69 2b 2b 29 26    aVarint[(i++)&
6600: 30 78 66 5d 20 3d 20 61 5b 30 5d 3b 0a 20 20 20  0xf] = a[0];.   
6610: 20 20 20 7d 77 68 69 6c 65 28 20 28 61 5b 30 5d     }while( (a[0]
6620: 26 30 78 38 30 29 21 3d 30 20 29 3b 0a 20 20 20  &0x80)!=0 );.   
6630: 20 20 20 73 71 6c 69 74 65 33 47 65 74 56 61 72     sqlite3GetVar
6640: 69 6e 74 28 61 56 61 72 69 6e 74 2c 20 70 6e 4f  int(aVarint, pnO
6650: 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ut);.    }.  }..
6660: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6670: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  OK;.}../*.** Att
6680: 65 6d 70 74 20 74 6f 20 6d 65 6d 6f 72 79 20 6d  empt to memory m
6690: 61 70 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 49  ap file pFile. I
66a0: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
66b0: 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20 74  t *pp to point t
66c0: 6f 20 74 68 65 0a 2a 2a 20 6e 65 77 20 6d 61 70  o the.** new map
66d0: 70 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20  ping and return 
66e0: 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68  SQLITE_OK. If th
66f0: 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74  e mapping is not
6700: 20 61 74 74 65 6d 70 74 65 64 20 0a 2a 2a 20 28   attempted .** (
6710: 62 65 63 61 75 73 65 20 74 68 65 20 66 69 6c 65  because the file
6720: 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 6f 72   is too large or
6730: 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 69   the VFS layer i
6740: 73 20 63 6f 6e 66 69 67 75 72 65 64 20 6e 6f 74  s configured not
6750: 20 74 6f 20 75 73 65 0a 2a 2a 20 6d 6d 61 70 29   to use.** mmap)
6760: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
6770: 4f 4b 20 61 6e 64 20 73 65 74 20 2a 70 70 20 74  OK and set *pp t
6780: 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 72  o NULL..**.** Or
6790: 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  , if an error oc
67a0: 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20  curs, return an 
67b0: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
67c0: 65 2e 20 54 68 65 20 66 69 6e 61 6c 20 76 61 6c  e. The final val
67d0: 75 65 20 6f 66 0a 2a 2a 20 2a 70 70 20 69 73 20  ue of.** *pp is 
67e0: 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69  undefined in thi
67f0: 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  s case..*/.stati
6800: 63 20 69 6e 74 20 76 64 62 65 53 6f 72 74 65 72  c int vdbeSorter
6810: 4d 61 70 46 69 6c 65 28 53 6f 72 74 53 75 62 74  MapFile(SortSubt
6820: 61 73 6b 20 2a 70 54 61 73 6b 2c 20 53 6f 72 74  ask *pTask, Sort
6830: 65 72 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75  erFile *pFile, u
6840: 38 20 2a 2a 70 70 29 7b 0a 20 20 69 6e 74 20 72  8 **pp){.  int r
6850: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
6860: 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 45 6f 66   if( pFile->iEof
6870: 3c 3d 28 69 36 34 29 28 70 54 61 73 6b 2d 3e 70  <=(i64)(pTask->p
6880: 53 6f 72 74 65 72 2d 3e 64 62 2d 3e 6e 4d 61 78  Sorter->db->nMax
6890: 53 6f 72 74 65 72 4d 6d 61 70 29 20 29 7b 0a 20  SorterMmap) ){. 
68a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
68b0: 73 46 65 74 63 68 28 70 46 69 6c 65 2d 3e 70 46  sFetch(pFile->pF
68c0: 64 2c 20 30 2c 20 28 69 6e 74 29 70 46 69 6c 65  d, 0, (int)pFile
68d0: 2d 3e 69 45 6f 66 2c 20 28 76 6f 69 64 2a 2a 29  ->iEof, (void**)
68e0: 70 70 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  pp);.    testcas
68f0: 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
6900: 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   );.  }.  return
6910: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74   rc;.}../*.** At
6920: 74 61 63 68 20 50 6d 61 52 65 61 64 65 72 20 70  tach PmaReader p
6930: 52 65 61 64 72 20 74 6f 20 66 69 6c 65 20 70 46  Readr to file pF
6940: 69 6c 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f  ile (if it is no
6950: 74 20 61 6c 72 65 61 64 79 20 61 74 74 61 63 68  t already attach
6960: 65 64 20 74 6f 0a 2a 2a 20 74 68 61 74 20 66 69  ed to.** that fi
6970: 6c 65 29 20 61 6e 64 20 73 65 65 6b 20 69 74 20  le) and seek it 
6980: 74 6f 20 6f 66 66 73 65 74 20 69 4f 66 66 20 77  to offset iOff w
6990: 69 74 68 69 6e 20 74 68 65 20 66 69 6c 65 2e 20  ithin the file. 
69a0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
69b0: 4b 20 0a 2a 2a 20 69 66 20 73 75 63 63 65 73 73  K .** if success
69c0: 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
69d0: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  e error code if 
69e0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
69f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
6a00: 64 62 65 50 6d 61 52 65 61 64 65 72 53 65 65 6b  dbePmaReaderSeek
6a10: 28 0a 20 20 53 6f 72 74 53 75 62 74 61 73 6b 20  (.  SortSubtask 
6a20: 2a 70 54 61 73 6b 2c 20 20 20 20 20 20 20 20 20  *pTask,         
6a30: 20 20 20 20 2f 2a 20 54 61 73 6b 20 63 6f 6e 74      /* Task cont
6a40: 65 78 74 20 2a 2f 0a 20 20 50 6d 61 52 65 61 64  ext */.  PmaRead
6a50: 65 72 20 2a 70 52 65 61 64 72 2c 20 20 20 20 20  er *pReadr,     
6a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
6a70: 65 72 20 77 68 6f 73 65 20 63 75 72 73 6f 72 20  er whose cursor 
6a80: 69 73 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a  is to be moved *
6a90: 2f 0a 20 20 53 6f 72 74 65 72 46 69 6c 65 20 2a  /.  SorterFile *
6aa0: 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  pFile,          
6ab0: 20 20 20 20 2f 2a 20 53 6f 72 74 65 72 20 66 69      /* Sorter fi
6ac0: 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  le to read from 
6ad0: 2a 2f 0a 20 20 69 36 34 20 69 4f 66 66 20 20 20  */.  i64 iOff   
6ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6af0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
6b00: 6e 20 70 46 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  n pFile */.){.  
6b10: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
6b20: 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
6b30: 52 65 61 64 72 2d 3e 70 49 6e 63 72 3d 3d 30 20  Readr->pIncr==0 
6b40: 7c 7c 20 70 52 65 61 64 72 2d 3e 70 49 6e 63 72  || pReadr->pIncr
6b50: 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 0a 20 20  ->bEof==0 );..  
6b60: 69 66 28 20 73 71 6c 69 74 65 33 46 61 75 6c 74  if( sqlite3Fault
6b70: 53 69 6d 28 32 30 31 29 20 29 20 72 65 74 75 72  Sim(201) ) retur
6b80: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  n SQLITE_IOERR_R
6b90: 45 41 44 3b 0a 20 20 69 66 28 20 70 52 65 61 64  EAD;.  if( pRead
6ba0: 72 2d 3e 61 4d 61 70 20 29 7b 0a 20 20 20 20 73  r->aMap ){.    s
6bb0: 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28  qlite3OsUnfetch(
6bc0: 70 52 65 61 64 72 2d 3e 70 46 64 2c 20 30 2c 20  pReadr->pFd, 0, 
6bd0: 70 52 65 61 64 72 2d 3e 61 4d 61 70 29 3b 0a 20  pReadr->aMap);. 
6be0: 20 20 20 70 52 65 61 64 72 2d 3e 61 4d 61 70 20     pReadr->aMap 
6bf0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 52 65 61 64  = 0;.  }.  pRead
6c00: 72 2d 3e 69 52 65 61 64 4f 66 66 20 3d 20 69 4f  r->iReadOff = iO
6c10: 66 66 3b 0a 20 20 70 52 65 61 64 72 2d 3e 69 45  ff;.  pReadr->iE
6c20: 6f 66 20 3d 20 70 46 69 6c 65 2d 3e 69 45 6f 66  of = pFile->iEof
6c30: 3b 0a 20 20 70 52 65 61 64 72 2d 3e 70 46 64 20  ;.  pReadr->pFd 
6c40: 3d 20 70 46 69 6c 65 2d 3e 70 46 64 3b 0a 0a 20  = pFile->pFd;.. 
6c50: 20 72 63 20 3d 20 76 64 62 65 53 6f 72 74 65 72   rc = vdbeSorter
6c60: 4d 61 70 46 69 6c 65 28 70 54 61 73 6b 2c 20 70  MapFile(pTask, p
6c70: 46 69 6c 65 2c 20 26 70 52 65 61 64 72 2d 3e 61  File, &pReadr->a
6c80: 4d 61 70 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Map);.  if( rc==
6c90: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 52 65  SQLITE_OK && pRe
6ca0: 61 64 72 2d 3e 61 4d 61 70 3d 3d 30 20 29 7b 0a  adr->aMap==0 ){.
6cb0: 20 20 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70      int pgsz = p
6cc0: 54 61 73 6b 2d 3e 70 53 6f 72 74 65 72 2d 3e 70  Task->pSorter->p
6cd0: 67 73 7a 3b 0a 20 20 20 20 69 6e 74 20 69 42 75  gsz;.    int iBu
6ce0: 66 20 3d 20 70 52 65 61 64 72 2d 3e 69 52 65 61  f = pReadr->iRea
6cf0: 64 4f 66 66 20 25 20 70 67 73 7a 3b 0a 20 20 20  dOff % pgsz;.   
6d00: 20 69 66 28 20 70 52 65 61 64 72 2d 3e 61 42 75   if( pReadr->aBu
6d10: 66 66 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ffer==0 ){.     
6d20: 20 70 52 65 61 64 72 2d 3e 61 42 75 66 66 65 72   pReadr->aBuffer
6d30: 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 33 4d   = (u8*)sqlite3M
6d40: 61 6c 6c 6f 63 28 70 67 73 7a 29 3b 0a 20 20 20  alloc(pgsz);.   
6d50: 20 20 20 69 66 28 20 70 52 65 61 64 72 2d 3e 61     if( pReadr->a
6d60: 42 75 66 66 65 72 3d 3d 30 20 29 20 72 63 20 3d  Buffer==0 ) rc =
6d70: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
6d80: 20 20 20 20 20 70 52 65 61 64 72 2d 3e 6e 42 75       pReadr->nBu
6d90: 66 66 65 72 20 3d 20 70 67 73 7a 3b 0a 20 20 20  ffer = pgsz;.   
6da0: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
6db0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 42 75 66  QLITE_OK && iBuf
6dc0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 52   ){.      int nR
6dd0: 65 61 64 20 3d 20 70 67 73 7a 20 2d 20 69 42 75  ead = pgsz - iBu
6de0: 66 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 52  f;.      if( (pR
6df0: 65 61 64 72 2d 3e 69 52 65 61 64 4f 66 66 20 2b  eadr->iReadOff +
6e00: 20 6e 52 65 61 64 29 20 3e 20 70 52 65 61 64 72   nRead) > pReadr
6e10: 2d 3e 69 45 6f 66 20 29 7b 0a 20 20 20 20 20 20  ->iEof ){.      
6e20: 20 20 6e 52 65 61 64 20 3d 20 28 69 6e 74 29 28    nRead = (int)(
6e30: 70 52 65 61 64 72 2d 3e 69 45 6f 66 20 2d 20 70  pReadr->iEof - p
6e40: 52 65 61 64 72 2d 3e 69 52 65 61 64 4f 66 66 29  Readr->iReadOff)
6e50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6e60: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
6e70: 61 64 28 0a 20 20 20 20 20 20 20 20 20 20 70 52  ad(.          pR
6e80: 65 61 64 72 2d 3e 70 46 64 2c 20 26 70 52 65 61  eadr->pFd, &pRea
6e90: 64 72 2d 3e 61 42 75 66 66 65 72 5b 69 42 75 66  dr->aBuffer[iBuf
6ea0: 5d 2c 20 6e 52 65 61 64 2c 20 70 52 65 61 64 72  ], nRead, pReadr
6eb0: 2d 3e 69 52 65 61 64 4f 66 66 0a 20 20 20 20 20  ->iReadOff.     
6ec0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
6ed0: 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
6ee0: 4b 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  K );.    }.  }..
6ef0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
6f00: 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 50 6d  /*.** Advance Pm
6f10: 61 52 65 61 64 65 72 20 70 52 65 61 64 72 20 74  aReader pReadr t
6f20: 6f 20 74 68 65 20 6e 65 78 74 20 6b 65 79 20 69  o the next key i
6f30: 6e 20 69 74 73 20 50 4d 41 2e 20 52 65 74 75 72  n its PMA. Retur
6f40: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 0a 2a  n SQLITE_OK if.*
6f50: 2a 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  * no error occur
6f60: 73 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  s, or an SQLite 
6f70: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f 6e  error code if on
6f80: 65 20 64 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  e does..*/.stati
6f90: 63 20 69 6e 74 20 76 64 62 65 50 6d 61 52 65 61  c int vdbePmaRea
6fa0: 64 65 72 4e 65 78 74 28 50 6d 61 52 65 61 64 65  derNext(PmaReade
6fb0: 72 20 2a 70 52 65 61 64 72 29 7b 0a 20 20 69 6e  r *pReadr){.  in
6fc0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
6fd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
6fe0: 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
6ff0: 20 20 75 36 34 20 6e 52 65 63 20 3d 20 30 3b 20    u64 nRec = 0; 
7000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7010: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 63    /* Size of rec
7020: 6f 72 64 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ord in bytes */.
7030: 0a 0a 20 20 69 66 28 20 70 52 65 61 64 72 2d 3e  ..  if( pReadr->
7040: 69 52 65 61 64 4f 66 66 3e 3d 70 52 65 61 64 72  iReadOff>=pReadr
7050: 2d 3e 69 45 6f 66 20 29 7b 0a 20 20 20 20 49 6e  ->iEof ){.    In
7060: 63 72 4d 65 72 67 65 72 20 2a 70 49 6e 63 72 20  crMerger *pIncr 
7070: 3d 20 70 52 65 61 64 72 2d 3e 70 49 6e 63 72 3b  = pReadr->pIncr;
7080: 0a 20 20 20 20 69 6e 74 20 62 45 6f 66 20 3d 20  .    int bEof = 
7090: 31 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 63 72  1;.    if( pIncr
70a0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 76   ){.      rc = v
70b0: 64 62 65 49 6e 63 72 53 77 61 70 28 70 49 6e 63  dbeIncrSwap(pInc
70c0: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
70d0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
70e0: 49 6e 63 72 2d 3e 62 45 6f 66 3d 3d 30 20 29 7b  Incr->bEof==0 ){
70f0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64  .        rc = vd
7100: 62 65 50 6d 61 52 65 61 64 65 72 53 65 65 6b 28  bePmaReaderSeek(
7110: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e  .            pIn
7120: 63 72 2d 3e 70 54 61 73 6b 2c 20 70 52 65 61 64  cr->pTask, pRead
7130: 72 2c 20 26 70 49 6e 63 72 2d 3e 61 46 69 6c 65  r, &pIncr->aFile
7140: 5b 30 5d 2c 20 70 49 6e 63 72 2d 3e 69 53 74 61  [0], pIncr->iSta
7150: 72 74 4f 66 66 0a 20 20 20 20 20 20 20 20 29 3b  rtOff.        );
7160: 0a 20 20 20 20 20 20 20 20 62 45 6f 66 20 3d 20  .        bEof = 
7170: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
7180: 0a 0a 20 20 20 20 69 66 28 20 62 45 6f 66 20 29  ..    if( bEof )
7190: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
71a0: 69 73 20 61 6e 20 45 4f 46 20 63 6f 6e 64 69 74  is an EOF condit
71b0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 76 64 62  ion */.      vdb
71c0: 65 50 6d 61 52 65 61 64 65 72 43 6c 65 61 72 28  ePmaReaderClear(
71d0: 70 52 65 61 64 72 29 3b 0a 20 20 20 20 20 20 74  pReadr);.      t
71e0: 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
71f0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
7200: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
7210: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
7220: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7230: 20 72 63 20 3d 20 76 64 62 65 50 6d 61 52 65 61   rc = vdbePmaRea
7240: 64 56 61 72 69 6e 74 28 70 52 65 61 64 72 2c 20  dVarint(pReadr, 
7250: 26 6e 52 65 63 29 3b 0a 20 20 7d 0a 20 20 69 66  &nRec);.  }.  if
7260: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7270: 29 7b 0a 20 20 20 20 70 52 65 61 64 72 2d 3e 6e  ){.    pReadr->n
7280: 4b 65 79 20 3d 20 28 69 6e 74 29 6e 52 65 63 3b  Key = (int)nRec;
7290: 0a 20 20 20 20 72 63 20 3d 20 76 64 62 65 50 6d  .    rc = vdbePm
72a0: 61 52 65 61 64 42 6c 6f 62 28 70 52 65 61 64 72  aReadBlob(pReadr
72b0: 2c 20 28 69 6e 74 29 6e 52 65 63 2c 20 26 70 52  , (int)nRec, &pR
72c0: 65 61 64 72 2d 3e 61 4b 65 79 29 3b 0a 20 20 20  eadr->aKey);.   
72d0: 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
72e0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
72f0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7300: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
7310: 65 20 50 6d 61 52 65 61 64 65 72 20 70 52 65 61  e PmaReader pRea
7320: 64 72 20 74 6f 20 73 63 61 6e 20 74 68 72 6f 75  dr to scan throu
7330: 67 68 20 74 68 65 20 50 4d 41 20 73 74 6f 72 65  gh the PMA store
7340: 64 20 69 6e 20 66 69 6c 65 20 70 46 69 6c 65 0a  d in file pFile.
7350: 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 6f  ** starting at o
7360: 66 66 73 65 74 20 69 53 74 61 72 74 20 61 6e 64  ffset iStart and
7370: 20 65 6e 64 69 6e 67 20 61 74 20 6f 66 66 73 65   ending at offse
7380: 74 20 69 45 6f 66 2d 31 2e 20 54 68 69 73 20 66  t iEof-1. This f
7390: 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6c 65 61 76  unction .** leav
73a0: 65 73 20 74 68 65 20 50 6d 61 52 65 61 64 65 72  es the PmaReader
73b0: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
73c0: 20 66 69 72 73 74 20 6b 65 79 20 69 6e 20 74 68   first key in th
73d0: 65 20 50 4d 41 20 28 6f 72 20 45 4f 46 20 69 66  e PMA (or EOF if
73e0: 20 74 68 65 20 0a 2a 2a 20 50 4d 41 20 69 73 20   the .** PMA is 
73f0: 65 6d 70 74 79 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  empty)..**.** If
7400: 20 74 68 65 20 70 6e 42 79 74 65 20 70 61 72 61   the pnByte para
7410: 6d 65 74 65 72 20 69 73 20 4e 55 4c 4c 2c 20 74  meter is NULL, t
7420: 68 65 6e 20 69 74 20 69 73 20 61 73 73 75 6d 65  hen it is assume
7430: 64 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20  d that the file 
7440: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20 73  .** contains a s
7450: 69 6e 67 6c 65 20 50 4d 41 2c 20 61 6e 64 20 74  ingle PMA, and t
7460: 68 61 74 20 74 68 61 74 20 50 4d 41 20 6f 6d 69  hat that PMA omi
7470: 74 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 6c  ts the initial l
7480: 65 6e 67 74 68 20 76 61 72 69 6e 74 2e 0a 2a 2f  ength varint..*/
7490: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
74a0: 50 6d 61 52 65 61 64 65 72 49 6e 69 74 28 0a 20  PmaReaderInit(. 
74b0: 20 53 6f 72 74 53 75 62 74 61 73 6b 20 2a 70 54   SortSubtask *pT
74c0: 61 73 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ask,            
74d0: 20 2f 2a 20 54 61 73 6b 20 63 6f 6e 74 65 78 74   /* Task context
74e0: 20 2a 2f 0a 20 20 53 6f 72 74 65 72 46 69 6c 65   */.  SorterFile
74f0: 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20   *pFile,        
7500: 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65 72 20        /* Sorter 
7510: 66 69 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f  file to read fro
7520: 6d 20 2a 2f 0a 20 20 69 36 34 20 69 53 74 61 72  m */.  i64 iStar
7530: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
7540: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20         /* Start 
7550: 6f 66 66 73 65 74 20 69 6e 20 70 46 69 6c 65 20  offset in pFile 
7560: 2a 2f 0a 20 20 50 6d 61 52 65 61 64 65 72 20 2a  */.  PmaReader *
7570: 70 52 65 61 64 72 2c 20 20 20 20 20 20 20 20 20  pReadr,         
7580: 20 20 20 20 20 2f 2a 20 50 6d 61 52 65 61 64 65       /* PmaReade
7590: 72 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f  r to populate */
75a0: 0a 20 20 69 36 34 20 2a 70 6e 42 79 74 65 20 20  .  i64 *pnByte  
75b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75c0: 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 49 6e     /* IN/OUT: In
75d0: 63 72 65 6d 65 6e 74 20 74 68 69 73 20 76 61 6c  crement this val
75e0: 75 65 20 62 79 20 50 4d 41 20 73 69 7a 65 20 2a  ue by PMA size *
75f0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  /.){.  int rc;..
7600: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
7610: 3e 69 45 6f 66 3e 69 53 74 61 72 74 20 29 3b 0a  >iEof>iStart );.
7620: 20 20 61 73 73 65 72 74 28 20 70 52 65 61 64 72    assert( pReadr
7630: 2d 3e 61 41 6c 6c 6f 63 3d 3d 30 20 26 26 20 70  ->aAlloc==0 && p
7640: 52 65 61 64 72 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30  Readr->nAlloc==0
7650: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
7660: 65 61 64 72 2d 3e 61 42 75 66 66 65 72 3d 3d 30  eadr->aBuffer==0
7670: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
7680: 65 61 64 72 2d 3e 61 4d 61 70 3d 3d 30 20 29 3b  eadr->aMap==0 );
7690: 0a 0a 20 20 72 63 20 3d 20 76 64 62 65 50 6d 61  ..  rc = vdbePma
76a0: 52 65 61 64 65 72 53 65 65 6b 28 70 54 61 73 6b  ReaderSeek(pTask
76b0: 2c 20 70 52 65 61 64 72 2c 20 70 46 69 6c 65 2c  , pReadr, pFile,
76c0: 20 69 53 74 61 72 74 29 3b 0a 20 20 69 66 28 20   iStart);.  if( 
76d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
76e0: 0a 20 20 20 20 75 36 34 20 6e 42 79 74 65 3b 20  .    u64 nByte; 
76f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7700: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 50 4d     /* Size of PM
7710: 41 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  A in bytes */.  
7720: 20 20 72 63 20 3d 20 76 64 62 65 50 6d 61 52 65    rc = vdbePmaRe
7730: 61 64 56 61 72 69 6e 74 28 70 52 65 61 64 72 2c  adVarint(pReadr,
7740: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 52   &nByte);.    pR
7750: 65 61 64 72 2d 3e 69 45 6f 66 20 3d 20 70 52 65  eadr->iEof = pRe
7760: 61 64 72 2d 3e 69 52 65 61 64 4f 66 66 20 2b 20  adr->iReadOff + 
7770: 6e 42 79 74 65 3b 0a 20 20 20 20 2a 70 6e 42 79  nByte;.    *pnBy
7780: 74 65 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d  te += nByte;.  }
7790: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
77a0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
77b0: 3d 20 76 64 62 65 50 6d 61 52 65 61 64 65 72 4e  = vdbePmaReaderN
77c0: 65 78 74 28 70 52 65 61 64 72 29 3b 0a 20 20 7d  ext(pReadr);.  }
77d0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
77e0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
77f0: 6b 65 79 31 20 28 62 75 66 66 65 72 20 70 4b 65  key1 (buffer pKe
7800: 79 31 2c 20 73 69 7a 65 20 6e 4b 65 79 31 20 62  y1, size nKey1 b
7810: 79 74 65 73 29 20 77 69 74 68 20 6b 65 79 32 20  ytes) with key2 
7820: 28 62 75 66 66 65 72 20 70 4b 65 79 32 2c 20 0a  (buffer pKey2, .
7830: 2a 2a 20 73 69 7a 65 20 6e 4b 65 79 32 20 62 79  ** size nKey2 by
7840: 74 65 73 29 2e 20 55 73 65 20 28 70 54 61 73 6b  tes). Use (pTask
7850: 2d 3e 70 4b 65 79 49 6e 66 6f 29 20 66 6f 72 20  ->pKeyInfo) for 
7860: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
7870: 71 75 65 6e 63 65 73 0a 2a 2a 20 75 73 65 64 20  quences.** used 
7880: 62 79 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  by the compariso
7890: 6e 2e 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  n. Return the re
78a0: 73 75 6c 74 20 6f 66 20 74 68 65 20 63 6f 6d 70  sult of the comp
78b0: 61 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65  arison..**.** Be
78c0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
78d0: 6f 62 6a 65 63 74 20 28 70 54 61 73 6b 2d 3e 70  object (pTask->p
78e0: 55 6e 70 61 63 6b 65 64 29 20 69 73 20 70 6f 70  Unpacked) is pop
78f0: 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ulated with the.
7900: 2a 2a 20 75 6e 70 61 63 6b 65 64 20 76 65 72 73  ** unpacked vers
7910: 69 6f 6e 20 6f 66 20 6b 65 79 32 2e 20 4f 72 2c  ion of key2. Or,
7920: 20 69 66 20 70 4b 65 79 32 20 69 73 20 70 61 73   if pKey2 is pas
7930: 73 65 64 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74  sed a NULL point
7940: 65 72 2c 20 74 68 65 6e 20 69 74 20 0a 2a 2a 20  er, then it .** 
7950: 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
7960: 74 68 65 20 28 70 54 61 73 6b 2d 3e 70 55 6e 70  the (pTask->pUnp
7970: 61 63 6b 65 64 29 20 73 74 72 75 63 74 75 72 65  acked) structure
7980: 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e   already contain
7990: 73 20 74 68 65 20 0a 2a 2a 20 75 6e 70 61 63 6b  s the .** unpack
79a0: 65 64 20 6b 65 79 20 74 6f 20 75 73 65 20 61 73  ed key to use as
79b0: 20 6b 65 79 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   key2..**.** If 
79c0: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20  an OOM error is 
79d0: 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 28 70 54  encountered, (pT
79e0: 61 73 6b 2d 3e 70 55 6e 70 61 63 6b 65 64 2d 3e  ask->pUnpacked->
79f0: 65 72 72 6f 72 5f 72 63 29 20 69 73 20 73 65 74  error_rc) is set
7a00: 0a 2a 2a 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f  .** to SQLITE_NO
7a10: 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  MEM..*/.static i
7a20: 6e 74 20 76 64 62 65 53 6f 72 74 65 72 43 6f 6d  nt vdbeSorterCom
7a30: 70 61 72 65 28 0a 20 20 53 6f 72 74 53 75 62 74  pare(.  SortSubt
7a40: 61 73 6b 20 2a 70 54 61 73 6b 2c 20 20 20 20 20  ask *pTask,     
7a50: 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 74 61          /* Subta
7a60: 73 6b 20 63 6f 6e 74 65 78 74 20 28 66 6f 72 20  sk context (for 
7a70: 70 4b 65 79 49 6e 66 6f 29 20 2a 2f 0a 20 20 63  pKeyInfo) */.  c
7a80: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
7a90: 2c 20 69 6e 74 20 6e 4b 65 79 31 2c 20 20 20 2f  , int nKey1,   /
7aa0: 2a 20 4c 65 66 74 20 73 69 64 65 20 6f 66 20 63  * Left side of c
7ab0: 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 20 20 63  omparison */.  c
7ac0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32  onst void *pKey2
7ad0: 2c 20 69 6e 74 20 6e 4b 65 79 32 20 20 20 20 2f  , int nKey2    /
7ae0: 2a 20 52 69 67 68 74 20 73 69 64 65 20 6f 66 20  * Right side of 
7af0: 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 29 7b  comparison */.){
7b00: 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
7b10: 64 20 2a 72 32 20 3d 20 70 54 61 73 6b 2d 3e 70  d *r2 = pTask->p
7b20: 55 6e 70 61 63 6b 65 64 3b 0a 20 20 69 66 28 20  Unpacked;.  if( 
7b30: 70 4b 65 79 32 20 29 7b 0a 20 20 20 20 73 71 6c  pKey2 ){.    sql
7b40: 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
7b50: 70 61 63 6b 28 70 54 61 73 6b 2d 3e 70 53 6f 72  pack(pTask->pSor
7b60: 74 65 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 6e  ter->pKeyInfo, n
7b70: 4b 65 79 32 2c 20 70 4b 65 79 32 2c 20 72 32 29  Key2, pKey2, r2)
7b80: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
7b90: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
7ba0: 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70  Compare(nKey1, p
7bb0: 4b 65 79 31 2c 20 72 32 2c 20 30 29 3b 0a 7d 0a  Key1, r2, 0);.}.
7bc0: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
7bd0: 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
7be0: 69 6e 64 65 78 20 63 75 72 73 6f 72 20 6a 75 73  index cursor jus
7bf0: 74 20 6f 70 65 6e 65 64 20 61 73 20 61 20 73 6f  t opened as a so
7c00: 72 74 65 72 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a  rter cursor..**.
7c10: 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68 65 20  ** Usually, the 
7c20: 73 6f 72 74 65 72 20 6d 6f 64 75 6c 65 20 75 73  sorter module us
7c30: 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  es the value of 
7c40: 28 70 43 73 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d  (pCsr->pKeyInfo-
7c50: 3e 6e 46 69 65 6c 64 29 0a 2a 2a 20 74 6f 20 64  >nField).** to d
7c60: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 75 6d  etermine the num
7c70: 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 74 68  ber of fields th
7c80: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  at should be com
7c90: 70 61 72 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a  pared from the.*
7ca0: 2a 20 72 65 63 6f 72 64 73 20 62 65 69 6e 67 20  * records being 
7cb0: 73 6f 72 74 65 64 2e 20 48 6f 77 65 76 65 72 2c  sorted. However,
7cc0: 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 70 61   if the value pa
7cd0: 73 73 65 64 20 61 73 20 61 72 67 75 6d 65 6e 74  ssed as argument
7ce0: 20 6e 46 69 65 6c 64 0a 2a 2a 20 69 73 20 6e 6f   nField.** is no
7cf0: 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 73  n-zero and the s
7d00: 6f 72 74 65 72 20 69 73 20 61 62 6c 65 20 74 6f  orter is able to
7d10: 20 67 75 61 72 61 6e 74 65 65 20 61 20 73 74 61   guarantee a sta
7d20: 62 6c 65 20 73 6f 72 74 2c 20 6e 46 69 65 6c 64  ble sort, nField
7d30: 0a 2a 2a 20 69 73 20 75 73 65 64 20 69 6e 73 74  .** is used inst
7d40: 65 61 64 2e 20 54 68 69 73 20 69 73 20 75 73 65  ead. This is use
7d50: 64 20 77 68 65 6e 20 73 6f 72 74 69 6e 67 20 72  d when sorting r
7d60: 65 63 6f 72 64 73 20 66 6f 72 20 61 20 43 52 45  ecords for a CRE
7d70: 41 54 45 20 49 4e 44 45 58 0a 2a 2a 20 73 74 61  ATE INDEX.** sta
7d80: 74 65 6d 65 6e 74 2e 20 49 6e 20 74 68 69 73 20  tement. In this 
7d90: 63 61 73 65 2c 20 6b 65 79 73 20 61 72 65 20 61  case, keys are a
7da0: 6c 77 61 79 73 20 64 65 6c 69 76 65 72 65 64 20  lways delivered 
7db0: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 20 69 6e  to the sorter in
7dc0: 0a 2a 2a 20 6f 72 64 65 72 20 6f 66 20 74 68 65  .** order of the
7dd0: 20 70 72 69 6d 61 72 79 20 6b 65 79 2c 20 77 68   primary key, wh
7de0: 69 63 68 20 68 61 70 70 65 6e 73 20 74 6f 20 62  ich happens to b
7df0: 65 20 6d 61 6b 65 20 75 70 20 74 68 65 20 66 69  e make up the fi
7e00: 6e 61 6c 20 70 61 72 74 20 0a 2a 2a 20 6f 66 20  nal part .** of 
7e10: 74 68 65 20 72 65 63 6f 72 64 73 20 62 65 69 6e  the records bein
7e20: 67 20 73 6f 72 74 65 64 2e 20 53 6f 20 69 66 20  g sorted. So if 
7e30: 74 68 65 20 73 6f 72 74 20 69 73 20 73 74 61 62  the sort is stab
7e40: 6c 65 2c 20 74 68 65 72 65 20 69 73 20 6e 65 76  le, there is nev
7e50: 65 72 0a 2a 2a 20 61 6e 79 20 72 65 61 73 6f 6e  er.** any reason
7e60: 20 74 6f 20 63 6f 6d 70 61 72 65 20 50 4b 20 66   to compare PK f
7e70: 69 65 6c 64 73 20 61 6e 64 20 74 68 65 79 20 63  ields and they c
7e80: 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 20 66 6f  an be ignored fo
7e90: 72 20 61 20 73 6d 61 6c 6c 0a 2a 2a 20 70 65 72  r a small.** per
7ea0: 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e 0a  formance boost..
7eb0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 72 74 65 72  **.** The sorter
7ec0: 20 63 61 6e 20 67 75 61 72 61 6e 74 65 65 20 61   can guarantee a
7ed0: 20 73 74 61 62 6c 65 20 73 6f 72 74 20 77 68 65   stable sort whe
7ee0: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 69 6e  n running in sin
7ef0: 67 6c 65 2d 74 68 72 65 61 64 65 64 0a 2a 2a 20  gle-threaded.** 
7f00: 6d 6f 64 65 2c 20 62 75 74 20 6e 6f 74 20 69 6e  mode, but not in
7f10: 20 6d 75 6c 74 69 2d 74 68 72 65 61 64 65 64 20   multi-threaded 
7f20: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  mode..**.** SQLI
7f30: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
7f40: 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  d if successful,
7f50: 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
7f60: 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
7f70: 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
7f80: 65 33 56 64 62 65 53 6f 72 74 65 72 49 6e 69 74  e3VdbeSorterInit
7f90: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fb0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
7fc0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 66 6f 72 20  connection (for 
7fd0: 6d 61 6c 6c 6f 63 28 29 29 20 2a 2f 0a 20 20 69  malloc()) */.  i
7fe0: 6e 74 20 6e 46 69 65 6c 64 2c 20 20 20 20 20 20  nt nField,      
7ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8000: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79 20  * Number of key 
8010: 66 69 65 6c 64 73 20 69 6e 20 65 61 63 68 20 72  fields in each r
8020: 65 63 6f 72 64 20 2a 2f 0a 20 20 56 64 62 65 43  ecord */.  VdbeC
8030: 75 72 73 6f 72 20 2a 70 43 73 72 20 20 20 20 20  ursor *pCsr     
8040: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
8050: 72 73 6f 72 20 74 68 61 74 20 68 6f 6c 64 73 20  rsor that holds 
8060: 74 68 65 20 6e 65 77 20 73 6f 72 74 65 72 20 2a  the new sorter *
8070: 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 67 73 7a 3b  /.){.  int pgsz;
8080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8090: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73         /* Page s
80a0: 69 7a 65 20 6f 66 20 6d 61 69 6e 20 64 61 74 61  ize of main data
80b0: 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  base */.  int i;
80c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
80e0: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
80f0: 6f 75 67 68 20 61 54 61 73 6b 5b 5d 20 2a 2f 0a  ough aTask[] */.
8100: 20 20 69 6e 74 20 6d 78 43 61 63 68 65 3b 20 20    int mxCache;  
8110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8120: 20 20 2f 2a 20 43 61 63 68 65 20 73 69 7a 65 20    /* Cache size 
8130: 2a 2f 0a 20 20 56 64 62 65 53 6f 72 74 65 72 20  */.  VdbeSorter 
8140: 2a 70 53 6f 72 74 65 72 3b 20 20 20 20 20 20 20  *pSorter;       
8150: 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20       /* The new 
8160: 73 6f 72 74 65 72 20 2a 2f 0a 20 20 4b 65 79 49  sorter */.  KeyI
8170: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
8180: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
8190: 6f 70 79 20 6f 66 20 70 43 73 72 2d 3e 70 4b 65  opy of pCsr->pKe
81a0: 79 49 6e 66 6f 20 77 69 74 68 20 64 62 3d 3d 30  yInfo with db==0
81b0: 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4b 65 79 49   */.  int szKeyI
81c0: 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  nfo;            
81d0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
81e0: 20 70 43 73 72 2d 3e 70 4b 65 79 49 6e 66 6f 20   pCsr->pKeyInfo 
81f0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
8200: 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20  t sz;           
8210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8220: 20 53 69 7a 65 20 6f 66 20 70 53 6f 72 74 65 72   Size of pSorter
8230: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
8240: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
8250: 4b 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  K;.#if SQLITE_MA
8260: 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  X_WORKER_THREADS
8270: 3d 3d 30 0a 23 20 64 65 66 69 6e 65 20 6e 57 6f  ==0.# define nWo
8280: 72 6b 65 72 20 30 0a 23 65 6c 73 65 0a 20 20 69  rker 0.#else.  i
8290: 6e 74 20 6e 57 6f 72 6b 65 72 3b 0a 23 65 6e 64  nt nWorker;.#end
82a0: 69 66 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  if..  /* Initial
82b0: 69 7a 65 20 74 68 65 20 75 70 70 65 72 20 6c 69  ize the upper li
82c0: 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65  mit on the numbe
82d0: 72 20 6f 66 20 77 6f 72 6b 65 72 20 74 68 72 65  r of worker thre
82e0: 61 64 73 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ads */.#if SQLIT
82f0: 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
8300: 45 41 44 53 3e 30 0a 20 20 69 66 28 20 73 71 6c  EADS>0.  if( sql
8310: 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79  ite3TempInMemory
8320: 28 64 62 29 20 7c 7c 20 73 71 6c 69 74 65 33 47  (db) || sqlite3G
8330: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
8340: 65 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  eMutex==0 ){.   
8350: 20 6e 57 6f 72 6b 65 72 20 3d 20 30 3b 0a 20 20   nWorker = 0;.  
8360: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 57 6f 72 6b  }else{.    nWork
8370: 65 72 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b  er = db->aLimit[
8380: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52  SQLITE_LIMIT_WOR
8390: 4b 45 52 5f 54 48 52 45 41 44 53 5d 3b 0a 20 20  KER_THREADS];.  
83a0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  }.#endif..  /* D
83b0: 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20  o not allow the 
83c0: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
83d0: 74 68 72 65 61 64 73 20 28 6d 61 69 6e 20 74 68  threads (main th
83e0: 72 65 61 64 20 2b 20 61 6c 6c 20 77 6f 72 6b 65  read + all worke
83f0: 72 73 29 0a 20 20 2a 2a 20 74 6f 20 65 78 63 65  rs).  ** to exce
8400: 65 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6d  ed the maximum m
8410: 65 72 67 65 20 63 6f 75 6e 74 20 2a 2f 0a 23 69  erge count */.#i
8420: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52  f SQLITE_MAX_WOR
8430: 4b 45 52 5f 54 48 52 45 41 44 53 3e 3d 53 4f 52  KER_THREADS>=SOR
8440: 54 45 52 5f 4d 41 58 5f 4d 45 52 47 45 5f 43 4f  TER_MAX_MERGE_CO
8450: 55 4e 54 0a 20 20 69 66 28 20 6e 57 6f 72 6b 65  UNT.  if( nWorke
8460: 72 3e 3d 53 4f 52 54 45 52 5f 4d 41 58 5f 4d 45  r>=SORTER_MAX_ME
8470: 52 47 45 5f 43 4f 55 4e 54 20 29 7b 0a 20 20 20  RGE_COUNT ){.   
8480: 20 6e 57 6f 72 6b 65 72 20 3d 20 53 4f 52 54 45   nWorker = SORTE
8490: 52 5f 4d 41 58 5f 4d 45 52 47 45 5f 43 4f 55 4e  R_MAX_MERGE_COUN
84a0: 54 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  T-1;.  }.#endif.
84b0: 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d  .  assert( pCsr-
84c0: 3e 70 4b 65 79 49 6e 66 6f 20 26 26 20 70 43 73  >pKeyInfo && pCs
84d0: 72 2d 3e 70 42 74 3d 3d 30 20 29 3b 0a 20 20 73  r->pBt==0 );.  s
84e0: 7a 4b 65 79 49 6e 66 6f 20 3d 20 73 69 7a 65 6f  zKeyInfo = sizeo
84f0: 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 28 70 43  f(KeyInfo) + (pC
8500: 73 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  sr->pKeyInfo->nF
8510: 69 65 6c 64 2d 31 29 2a 73 69 7a 65 6f 66 28 43  ield-1)*sizeof(C
8520: 6f 6c 6c 53 65 71 2a 29 3b 0a 20 20 73 7a 20 3d  ollSeq*);.  sz =
8530: 20 73 69 7a 65 6f 66 28 56 64 62 65 53 6f 72 74   sizeof(VdbeSort
8540: 65 72 29 20 2b 20 6e 57 6f 72 6b 65 72 20 2a 20  er) + nWorker * 
8550: 73 69 7a 65 6f 66 28 53 6f 72 74 53 75 62 74 61  sizeof(SortSubta
8560: 73 6b 29 3b 0a 0a 20 20 70 53 6f 72 74 65 72 20  sk);..  pSorter 
8570: 3d 20 28 56 64 62 65 53 6f 72 74 65 72 2a 29 73  = (VdbeSorter*)s
8580: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
8590: 72 6f 28 64 62 2c 20 73 7a 20 2b 20 73 7a 4b 65  ro(db, sz + szKe
85a0: 79 49 6e 66 6f 29 3b 0a 20 20 70 43 73 72 2d 3e  yInfo);.  pCsr->
85b0: 70 53 6f 72 74 65 72 20 3d 20 70 53 6f 72 74 65  pSorter = pSorte
85c0: 72 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 65 72  r;.  if( pSorter
85d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
85e0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
85f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 6f 72 74  }else{.    pSort
8600: 65 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  er->pKeyInfo = p
8610: 4b 65 79 49 6e 66 6f 20 3d 20 28 4b 65 79 49 6e  KeyInfo = (KeyIn
8620: 66 6f 2a 29 28 28 75 38 2a 29 70 53 6f 72 74 65  fo*)((u8*)pSorte
8630: 72 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d  r + sz);.    mem
8640: 63 70 79 28 70 4b 65 79 49 6e 66 6f 2c 20 70 43  cpy(pKeyInfo, pC
8650: 73 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 73 7a  sr->pKeyInfo, sz
8660: 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 70 4b  KeyInfo);.    pK
8670: 65 79 49 6e 66 6f 2d 3e 64 62 20 3d 20 30 3b 0a  eyInfo->db = 0;.
8680: 20 20 20 20 69 66 28 20 6e 46 69 65 6c 64 20 26      if( nField &
8690: 26 20 6e 57 6f 72 6b 65 72 3d 3d 30 20 29 20 70  & nWorker==0 ) p
86a0: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
86b0: 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 70 53  = nField;.    pS
86c0: 6f 72 74 65 72 2d 3e 70 67 73 7a 20 3d 20 70 67  orter->pgsz = pg
86d0: 73 7a 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  sz = sqlite3Btre
86e0: 65 47 65 74 50 61 67 65 53 69 7a 65 28 64 62 2d  eGetPageSize(db-
86f0: 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[0].pBt);.  
8700: 20 20 70 53 6f 72 74 65 72 2d 3e 6e 54 61 73 6b    pSorter->nTask
8710: 20 3d 20 6e 57 6f 72 6b 65 72 20 2b 20 31 3b 0a   = nWorker + 1;.
8720: 20 20 20 20 70 53 6f 72 74 65 72 2d 3e 62 55 73      pSorter->bUs
8730: 65 54 68 72 65 61 64 73 20 3d 20 28 70 53 6f 72  eThreads = (pSor
8740: 74 65 72 2d 3e 6e 54 61 73 6b 3e 31 29 3b 0a 20  ter->nTask>1);. 
8750: 20 20 20 70 53 6f 72 74 65 72 2d 3e 64 62 20 3d     pSorter->db =
8760: 20 64 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30   db;.    for(i=0
8770: 3b 20 69 3c 70 53 6f 72 74 65 72 2d 3e 6e 54 61  ; i<pSorter->nTa
8780: 73 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  sk; i++){.      
8790: 53 6f 72 74 53 75 62 74 61 73 6b 20 2a 70 54 61  SortSubtask *pTa
87a0: 73 6b 20 3d 20 26 70 53 6f 72 74 65 72 2d 3e 61  sk = &pSorter->a
87b0: 54 61 73 6b 5b 69 5d 3b 0a 20 20 20 20 20 20 70  Task[i];.      p
87c0: 54 61 73 6b 2d 3e 70 53 6f 72 74 65 72 20 3d 20  Task->pSorter = 
87d0: 70 53 6f 72 74 65 72 3b 0a 20 20 20 20 7d 0a 0a  pSorter;.    }..
87e0: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
87f0: 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29  TempInMemory(db)
8800: 20 29 7b 0a 20 20 20 20 20 20 70 53 6f 72 74 65   ){.      pSorte
8810: 72 2d 3e 6d 6e 50 6d 61 53 69 7a 65 20 3d 20 53  r->mnPmaSize = S
8820: 4f 52 54 45 52 5f 4d 49 4e 5f 57 4f 52 4b 49 4e  ORTER_MIN_WORKIN
8830: 47 20 2a 20 70 67 73 7a 3b 0a 20 20 20 20 20 20  G * pgsz;.      
8840: 6d 78 43 61 63 68 65 20 3d 20 64 62 2d 3e 61 44  mxCache = db->aD
8850: 62 5b 30 5d 2e 70 53 63 68 65 6d 61 2d 3e 63 61  b[0].pSchema->ca
8860: 63 68 65 5f 73 69 7a 65 3b 0a 20 20 20 20 20 20  che_size;.      
8870: 69 66 28 20 6d 78 43 61 63 68 65 3c 53 4f 52 54  if( mxCache<SORT
8880: 45 52 5f 4d 49 4e 5f 57 4f 52 4b 49 4e 47 20 29  ER_MIN_WORKING )
8890: 20 6d 78 43 61 63 68 65 20 3d 20 53 4f 52 54 45   mxCache = SORTE
88a0: 52 5f 4d 49 4e 5f 57 4f 52 4b 49 4e 47 3b 0a 20  R_MIN_WORKING;. 
88b0: 20 20 20 20 20 70 53 6f 72 74 65 72 2d 3e 6d 78       pSorter->mx
88c0: 50 6d 61 53 69 7a 65 20 3d 20 6d 78 43 61 63 68  PmaSize = mxCach
88d0: 65 20 2a 20 70 67 73 7a 3b 0a 0a 20 20 20 20 20  e * pgsz;..     
88e0: 20 2f 2a 20 49 66 20 74 68 65 20 61 70 70 6c 69   /* If the appli
88f0: 63 61 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20 63  cation has not c
8900: 6f 6e 66 69 67 75 72 65 20 73 63 72 61 74 63 68  onfigure scratch
8910: 20 6d 65 6d 6f 72 79 20 75 73 69 6e 67 0a 20 20   memory using.  
8920: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f      ** SQLITE_CO
8930: 4e 46 49 47 5f 53 43 52 41 54 43 48 20 74 68 65  NFIG_SCRATCH the
8940: 6e 20 77 65 20 61 73 73 75 6d 65 20 69 74 20 69  n we assume it i
8950: 73 20 4f 4b 20 74 6f 20 64 6f 20 6c 61 72 67 65  s OK to do large
8960: 20 6d 65 6d 6f 72 79 0a 20 20 20 20 20 20 2a 2a   memory.      **
8970: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e 20 20 49   allocations.  I
8980: 66 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79  f scratch memory
8990: 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67   has been config
89a0: 75 72 65 64 2c 20 74 68 65 6e 20 61 73 73 75 6d  ured, then assum
89b0: 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72 67 65  e.      ** large
89c0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
89d0: 6f 6e 73 20 73 68 6f 75 6c 64 20 62 65 20 61 76  ons should be av
89e0: 6f 69 64 65 64 20 74 6f 20 70 72 65 76 65 6e 74  oided to prevent
89f0: 20 68 65 61 70 0a 20 20 20 20 20 20 2a 2a 20 66   heap.      ** f
8a00: 72 61 67 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 20  ragmentation..  
8a10: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
8a20: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
8a30: 6e 66 69 67 2e 70 53 63 72 61 74 63 68 3d 3d 30  nfig.pScratch==0
8a40: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
8a50: 72 74 28 20 70 53 6f 72 74 65 72 2d 3e 69 4d 65  rt( pSorter->iMe
8a60: 6d 6f 72 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  mory==0 );.     
8a70: 20 20 20 70 53 6f 72 74 65 72 2d 3e 6e 4d 65 6d     pSorter->nMem
8a80: 6f 72 79 20 3d 20 70 67 73 7a 3b 0a 20 20 20 20  ory = pgsz;.    
8a90: 20 20 20 20 70 53 6f 72 74 65 72 2d 3e 6c 69 73      pSorter->lis
8aa0: 74 2e 61 4d 65 6d 6f 72 79 20 3d 20 28 75 38 2a  t.aMemory = (u8*
8ab0: 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 70  )sqlite3Malloc(p
8ac0: 67 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  gsz);.        if
8ad0: 28 20 21 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74  ( !pSorter->list
8ae0: 2e 61 4d 65 6d 6f 72 79 20 29 20 72 63 20 3d 20  .aMemory ) rc = 
8af0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
8b00: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
8b10: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
8b20: 23 75 6e 64 65 66 20 6e 57 6f 72 6b 65 72 20 20  #undef nWorker  
8b30: 20 2f 2a 20 44 65 66 69 6e 65 64 20 61 74 20 74   /* Defined at t
8b40: 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20 66  he top of this f
8b50: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a  unction */../*.*
8b60: 2a 20 46 72 65 65 20 74 68 65 20 6c 69 73 74 20  * Free the list 
8b70: 6f 66 20 73 6f 72 74 65 64 20 72 65 63 6f 72 64  of sorted record
8b80: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 52  s starting at pR
8b90: 65 63 6f 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ecord..*/.static
8ba0: 20 76 6f 69 64 20 76 64 62 65 53 6f 72 74 65 72   void vdbeSorter
8bb0: 52 65 63 6f 72 64 46 72 65 65 28 73 71 6c 69 74  RecordFree(sqlit
8bc0: 65 33 20 2a 64 62 2c 20 53 6f 72 74 65 72 52 65  e3 *db, SorterRe
8bd0: 63 6f 72 64 20 2a 70 52 65 63 6f 72 64 29 7b 0a  cord *pRecord){.
8be0: 20 20 53 6f 72 74 65 72 52 65 63 6f 72 64 20 2a    SorterRecord *
8bf0: 70 3b 0a 20 20 53 6f 72 74 65 72 52 65 63 6f 72  p;.  SorterRecor
8c00: 64 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28  d *pNext;.  for(
8c10: 70 3d 70 52 65 63 6f 72 64 3b 20 70 3b 20 70 3d  p=pRecord; p; p=
8c20: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
8c30: 74 20 3d 20 70 2d 3e 75 2e 70 4e 65 78 74 3b 0a  t = p->u.pNext;.
8c40: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8c50: 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a  e(db, p);.  }.}.
8c60: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
8c70: 72 65 73 6f 75 72 63 65 73 20 6f 77 6e 65 64 20  resources owned 
8c80: 62 79 20 74 68 65 20 6f 62 6a 65 63 74 20 69 6e  by the object in
8c90: 64 69 63 61 74 65 64 20 62 79 20 61 72 67 75 6d  dicated by argum
8ca0: 65 6e 74 20 70 54 61 73 6b 2e 20 41 6c 6c 20 0a  ent pTask. All .
8cb0: 2a 2a 20 66 69 65 6c 64 73 20 6f 66 20 2a 70 54  ** fields of *pT
8cc0: 61 73 6b 20 61 72 65 20 7a 65 72 6f 65 64 20 62  ask are zeroed b
8cd0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
8ce0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8cf0: 76 64 62 65 53 6f 72 74 53 75 62 74 61 73 6b 43  vdbeSortSubtaskC
8d00: 6c 65 61 6e 75 70 28 73 71 6c 69 74 65 33 20 2a  leanup(sqlite3 *
8d10: 64 62 2c 20 53 6f 72 74 53 75 62 74 61 73 6b 20  db, SortSubtask 
8d20: 2a 70 54 61 73 6b 29 7b 0a 20 20 73 71 6c 69 74  *pTask){.  sqlit
8d30: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
8d40: 73 6b 2d 3e 70 55 6e 70 61 63 6b 65 64 29 3b 0a  sk->pUnpacked);.
8d50: 20 20 70 54 61 73 6b 2d 3e 70 55 6e 70 61 63 6b    pTask->pUnpack
8d60: 65 64 20 3d 20 30 3b 0a 23 69 66 20 53 51 4c 49  ed = 0;.#if SQLI
8d70: 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48  TE_MAX_WORKER_TH
8d80: 52 45 41 44 53 3e 30 0a 20 20 2f 2a 20 70 54 61  READS>0.  /* pTa
8d90: 73 6b 2d 3e 6c 69 73 74 2e 61 4d 65 6d 6f 72 79  sk->list.aMemory
8da0: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e   can only be non
8db0: 2d 7a 65 72 6f 20 69 66 20 69 74 20 77 61 73 20  -zero if it was 
8dc0: 68 61 6e 64 65 64 20 6d 65 6d 6f 72 79 0a 20 20  handed memory.  
8dd0: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ** from the main
8de0: 20 74 68 72 65 61 64 2e 20 20 54 68 61 74 20 6f   thread.  That o
8df0: 6e 6c 79 20 6f 63 63 75 72 73 20 53 51 4c 49 54  nly occurs SQLIT
8e00: 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
8e10: 45 41 44 53 3e 30 20 2a 2f 0a 20 20 69 66 28 20  EADS>0 */.  if( 
8e20: 70 54 61 73 6b 2d 3e 6c 69 73 74 2e 61 4d 65 6d  pTask->list.aMem
8e30: 6f 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ory ){.    sqlit
8e40: 65 33 5f 66 72 65 65 28 70 54 61 73 6b 2d 3e 6c  e3_free(pTask->l
8e50: 69 73 74 2e 61 4d 65 6d 6f 72 79 29 3b 0a 20 20  ist.aMemory);.  
8e60: 20 20 70 54 61 73 6b 2d 3e 6c 69 73 74 2e 61 4d    pTask->list.aM
8e70: 65 6d 6f 72 79 20 3d 20 30 3b 0a 20 20 7d 65 6c  emory = 0;.  }el
8e80: 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20  se.#endif.  {.  
8e90: 20 20 61 73 73 65 72 74 28 20 70 54 61 73 6b 2d    assert( pTask-
8ea0: 3e 6c 69 73 74 2e 61 4d 65 6d 6f 72 79 3d 3d 30  >list.aMemory==0
8eb0: 20 29 3b 0a 20 20 20 20 76 64 62 65 53 6f 72 74   );.    vdbeSort
8ec0: 65 72 52 65 63 6f 72 64 46 72 65 65 28 30 2c 20  erRecordFree(0, 
8ed0: 70 54 61 73 6b 2d 3e 6c 69 73 74 2e 70 4c 69 73  pTask->list.pLis
8ee0: 74 29 3b 0a 20 20 7d 0a 20 20 70 54 61 73 6b 2d  t);.  }.  pTask-
8ef0: 3e 6c 69 73 74 2e 70 4c 69 73 74 20 3d 20 30 3b  >list.pList = 0;
8f00: 0a 20 20 69 66 28 20 70 54 61 73 6b 2d 3e 66 69  .  if( pTask->fi
8f10: 6c 65 2e 70 46 64 20 29 7b 0a 20 20 20 20 73 71  le.pFd ){.    sq
8f20: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
8f30: 28 70 54 61 73 6b 2d 3e 66 69 6c 65 2e 70 46 64  (pTask->file.pFd
8f40: 29 3b 0a 20 20 20 20 70 54 61 73 6b 2d 3e 66 69  );.    pTask->fi
8f50: 6c 65 2e 70 46 64 20 3d 20 30 3b 0a 20 20 20 20  le.pFd = 0;.    
8f60: 70 54 61 73 6b 2d 3e 66 69 6c 65 2e 69 45 6f 66  pTask->file.iEof
8f70: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
8f80: 70 54 61 73 6b 2d 3e 66 69 6c 65 32 2e 70 46 64  pTask->file2.pFd
8f90: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
8fa0: 73 43 6c 6f 73 65 46 72 65 65 28 70 54 61 73 6b  sCloseFree(pTask
8fb0: 2d 3e 66 69 6c 65 32 2e 70 46 64 29 3b 0a 20 20  ->file2.pFd);.  
8fc0: 20 20 70 54 61 73 6b 2d 3e 66 69 6c 65 32 2e 70    pTask->file2.p
8fd0: 46 64 20 3d 20 30 3b 0a 20 20 20 20 70 54 61 73  Fd = 0;.    pTas
8fe0: 6b 2d 3e 66 69 6c 65 32 2e 69 45 6f 66 20 3d 20  k->file2.iEof = 
8ff0: 30 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 64 65 66  0;.  }.}..#ifdef
9000: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 5f 53 4f   SQLITE_DEBUG_SO
9010: 52 54 45 52 5f 54 48 52 45 41 44 53 0a 73 74 61  RTER_THREADS.sta
9020: 74 69 63 20 76 6f 69 64 20 76 64 62 65 53 6f 72  tic void vdbeSor
9030: 74 65 72 57 6f 72 6b 44 65 62 75 67 28 53 6f 72  terWorkDebug(Sor
9040: 74 53 75 62 74 61 73 6b 20 2a 70 54 61 73 6b 2c  tSubtask *pTask,
9050: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 76   const char *zEv
9060: 65 6e 74 29 7b 0a 20 20 69 36 34 20 74 3b 0a 20  ent){.  i64 t;. 
9070: 20 69 6e 74 20 69 54 61 73 6b 20 3d 20 28 70 54   int iTask = (pT
9080: 61 73 6b 20 2d 20 70 54 61 73 6b 2d 3e 70 53 6f  ask - pTask->pSo
9090: 72 74 65 72 2d 3e 61 54 61 73 6b 29 3b 0a 20 20  rter->aTask);.  
90a0: 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74  sqlite3OsCurrent
90b0: 54 69 6d 65 49 6e 74 36 34 28 70 54 61 73 6b 2d  TimeInt64(pTask-
90c0: 3e 70 53 6f 72 74 65 72 2d 3e 64 62 2d 3e 70 56  >pSorter->db->pV
90d0: 66 73 2c 20 26 74 29 3b 0a 20 20 66 70 72 69 6e  fs, &t);.  fprin
90e0: 74 66 28 73 74 64 65 72 72 2c 20 22 25 6c 6c 64  tf(stderr, "%lld
90f0: 3a 25 64 20 25 73 5c 6e 22 2c 20 74 2c 20 69 54  :%d %s\n", t, iT
9100: 61 73 6b 2c 20 7a 45 76 65 6e 74 29 3b 0a 7d 0a  ask, zEvent);.}.
9110: 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65  static void vdbe
9120: 53 6f 72 74 65 72 52 65 77 69 6e 64 44 65 62 75  SorterRewindDebu
9130: 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45  g(const char *zE
9140: 76 65 6e 74 29 7b 0a 20 20 69 36 34 20 74 3b 0a  vent){.  i64 t;.
9150: 20 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65    sqlite3OsCurre
9160: 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69  ntTimeInt64(sqli
9170: 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 2c  te3_vfs_find(0),
9180: 20 26 74 29 3b 0a 20 20 66 70 72 69 6e 74 66 28   &t);.  fprintf(
9190: 73 74 64 65 72 72 2c 20 22 25 6c 6c 64 3a 58 20  stderr, "%lld:X 
91a0: 25 73 5c 6e 22 2c 20 74 2c 20 7a 45 76 65 6e 74  %s\n", t, zEvent
91b0: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
91c0: 20 76 64 62 65 53 6f 72 74 65 72 50 6f 70 75 6c   vdbeSorterPopul
91d0: 61 74 65 44 65 62 75 67 28 0a 20 20 53 6f 72 74  ateDebug(.  Sort
91e0: 53 75 62 74 61 73 6b 20 2a 70 54 61 73 6b 2c 0a  Subtask *pTask,.
91f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
9200: 76 65 6e 74 0a 29 7b 0a 20 20 69 36 34 20 74 3b  vent.){.  i64 t;
9210: 0a 20 20 69 6e 74 20 69 54 61 73 6b 20 3d 20 28  .  int iTask = (
9220: 70 54 61 73 6b 20 2d 20 70 54 61 73 6b 2d 3e 70  pTask - pTask->p
9230: 53 6f 72 74 65 72 2d 3e 61 54 61 73 6b 29 3b 0a  Sorter->aTask);.
9240: 20 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65    sqlite3OsCurre
9250: 6e 74 54 69 6d 65 49 6e 74 36 34 28 70 54 61 73  ntTimeInt64(pTas
9260: 6b 2d 3e 70 53 6f 72 74 65 72 2d 3e 64 62 2d 3e  k->pSorter->db->
9270: 70 56 66 73 2c 20 26 74 29 3b 0a 20 20 66 70 72  pVfs, &t);.  fpr
9280: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 6c  intf(stderr, "%l
9290: 6c 64 3a 62 67 25 64 20 25 73 5c 6e 22 2c 20 74  ld:bg%d %s\n", t
92a0: 2c 20 69 54 61 73 6b 2c 20 7a 45 76 65 6e 74 29  , iTask, zEvent)
92b0: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
92c0: 76 64 62 65 53 6f 72 74 65 72 42 6c 6f 63 6b 44  vdbeSorterBlockD
92d0: 65 62 75 67 28 0a 20 20 53 6f 72 74 53 75 62 74  ebug(.  SortSubt
92e0: 61 73 6b 20 2a 70 54 61 73 6b 2c 0a 20 20 69 6e  ask *pTask,.  in
92f0: 74 20 62 42 6c 6f 63 6b 65 64 2c 0a 20 20 63 6f  t bBlocked,.  co
9300: 6e 73 74 20 63 68 61 72 20 2a 7a 45 76 65 6e 74  nst char *zEvent
9310: 0a 29 7b 0a 20 20 69 66 28 20 62 42 6c 6f 63 6b  .){.  if( bBlock
9320: 65 64 20 29 7b 0a 20 20 20 20 69 36 34 20 74 3b  ed ){.    i64 t;
9330: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 75  .    sqlite3OsCu
9340: 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 70  rrentTimeInt64(p
9350: 54 61 73 6b 2d 3e 70 53 6f 72 74 65 72 2d 3e 64  Task->pSorter->d
9360: 62 2d 3e 70 56 66 73 2c 20 26 74 29 3b 0a 20 20  b->pVfs, &t);.  
9370: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
9380: 2c 20 22 25 6c 6c 64 3a 6d 61 69 6e 20 25 73 5c  , "%lld:main %s\
9390: 6e 22 2c 20 74 2c 20 7a 45 76 65 6e 74 29 3b 0a  n", t, zEvent);.
93a0: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
93b0: 66 69 6e 65 20 76 64 62 65 53 6f 72 74 65 72 57  fine vdbeSorterW
93c0: 6f 72 6b 44 65 62 75 67 28 78 2c 79 29 0a 23 20  orkDebug(x,y).# 
93d0: 64 65 66 69 6e 65 20 76 64 62 65 53 6f 72 74 65  define vdbeSorte
93e0: 72 52 65 77 69 6e 64 44 65 62 75 67 28 79 29 0a  rRewindDebug(y).
93f0: 23 20 64 65 66 69 6e 65 20 76 64 62 65 53 6f 72  # define vdbeSor
9400: 74 65 72 50 6f 70 75 6c 61 74 65 44 65 62 75 67  terPopulateDebug
9410: 28 78 2c 79 29 0a 23 20 64 65 66 69 6e 65 20 76  (x,y).# define v
9420: 64 62 65 53 6f 72 74 65 72 42 6c 6f 63 6b 44 65  dbeSorterBlockDe
9430: 62 75 67 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69  bug(x,y,z).#endi
9440: 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  f..#if SQLITE_MA
9450: 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  X_WORKER_THREADS
9460: 3e 30 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 68  >0./*.** Join th
9470: 72 65 61 64 20 70 54 61 73 6b 2d 3e 74 68 72 65  read pTask->thre
9480: 61 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ad..*/.static in
9490: 74 20 76 64 62 65 53 6f 72 74 65 72 4a 6f 69 6e  t vdbeSorterJoin
94a0: 54 68 72 65 61 64 28 53 6f 72 74 53 75 62 74 61  Thread(SortSubta
94b0: 73 6b 20 2a 70 54 61 73 6b 29 7b 0a 20 20 69 6e  sk *pTask){.  in
94c0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
94d0: 3b 0a 20 20 69 66 28 20 70 54 61 73 6b 2d 3e 70  ;.  if( pTask->p
94e0: 54 68 72 65 61 64 20 29 7b 0a 23 69 66 64 65 66  Thread ){.#ifdef
94f0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 5f 53 4f   SQLITE_DEBUG_SO
9500: 52 54 45 52 5f 54 48 52 45 41 44 53 0a 20 20 20  RTER_THREADS.   
9510: 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20 70 54 61   int bDone = pTa
9520: 73 6b 2d 3e 62 44 6f 6e 65 3b 0a 23 65 6e 64 69  sk->bDone;.#endi
9530: 66 0a 20 20 20 20 76 6f 69 64 20 2a 70 52 65 74  f.    void *pRet
9540: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f   = SQLITE_INT_TO
9550: 5f 50 54 52 28 53 51 4c 49 54 45 5f 45 52 52 4f  _PTR(SQLITE_ERRO
9560: 52 29 3b 0a 20 20 20 20 76 64 62 65 53 6f 72 74  R);.    vdbeSort
9570: 65 72 42 6c 6f 63 6b 44 65 62 75 67 28 70 54 61  erBlockDebug(pTa
9580: 73 6b 2c 20 21 62 44 6f 6e 65 2c 20 22 65 6e 74  sk, !bDone, "ent
9590: 65 72 22 29 3b 0a 20 20 20 20 28 76 6f 69 64 29  er");.    (void)
95a0: 73 71 6c 69 74 65 33 54 68 72 65 61 64 4a 6f 69  sqlite3ThreadJoi
95b0: 6e 28 70 54 61 73 6b 2d 3e 70 54 68 72 65 61 64  n(pTask->pThread
95c0: 2c 20 26 70 52 65 74 29 3b 0a 20 20 20 20 76 64  , &pRet);.    vd
95d0: 62 65 53 6f 72 74 65 72 42 6c 6f 63 6b 44 65 62  beSorterBlockDeb
95e0: 75 67 28 70 54 61 73 6b 2c 20 21 62 44 6f 6e 65  ug(pTask, !bDone
95f0: 2c 20 22 65 78 69 74 22 29 3b 0a 20 20 20 20 72  , "exit");.    r
9600: 63 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54  c = SQLITE_PTR_T
9610: 4f 5f 49 4e 54 28 70 52 65 74 29 3b 0a 20 20 20  O_INT(pRet);.   
9620: 20 61 73 73 65 72 74 28 20 70 54 61 73 6b 2d 3e   assert( pTask->
9630: 62 44 6f 6e 65 3d 3d 31 20 29 3b 0a 20 20 20 20  bDone==1 );.    
9640: 70 54 61 73 6b 2d 3e 62 44 6f 6e 65 20 3d 20 30  pTask->bDone = 0
9650: 3b 0a 20 20 20 20 70 54 61 73 6b 2d 3e 70 54 68  ;.    pTask->pTh
9660: 72 65 61 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  read = 0;.  }.  
9670: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
9680: 0a 2a 2a 20 4c 61 75 6e 63 68 20 61 20 62 61 63  .** Launch a bac
9690: 6b 67 72 6f 75 6e 64 20 74 68 72 65 61 64 20 74  kground thread t
96a0: 6f 20 72 75 6e 20 78 54 61 73 6b 28 70 49 6e 29  o run xTask(pIn)
96b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
96c0: 76 64 62 65 53 6f 72 74 65 72 43 72 65 61 74 65  vdbeSorterCreate
96d0: 54 68 72 65 61 64 28 0a 20 20 53 6f 72 74 53 75  Thread(.  SortSu
96e0: 62 74 61 73 6b 20 2a 70 54 61 73 6b 2c 20 20 20  btask *pTask,   
96f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 72            /* Thr
9700: 65 61 64 20 77 69 6c 6c 20 75 73 65 20 74 68 69  ead will use thi
9710: 73 20 74 61 73 6b 20 6f 62 6a 65 63 74 20 2a 2f  s task object */
9720: 0a 20 20 76 6f 69 64 20 2a 28 2a 78 54 61 73 6b  .  void *(*xTask
9730: 29 28 76 6f 69 64 2a 29 2c 20 20 20 20 20 20 20  )(void*),       
9740: 20 20 20 2f 2a 20 52 6f 75 74 69 6e 65 20 74 6f     /* Routine to
9750: 20 72 75 6e 20 69 6e 20 61 20 73 65 70 61 72 61   run in a separa
9760: 74 65 20 74 68 72 65 61 64 20 2a 2f 0a 20 20 76  te thread */.  v
9770: 6f 69 64 20 2a 70 49 6e 20 20 20 20 20 20 20 20  oid *pIn        
9780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9790: 2a 20 41 72 67 75 6d 65 6e 74 20 70 61 73 73 65  * Argument passe
97a0: 64 20 69 6e 74 6f 20 78 54 61 73 6b 28 29 20 2a  d into xTask() *
97b0: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  /.){.  assert( p
97c0: 54 61 73 6b 2d 3e 70 54 68 72 65 61 64 3d 3d 30  Task->pThread==0
97d0: 20 26 26 20 70 54 61 73 6b 2d 3e 62 44 6f 6e 65   && pTask->bDone
97e0: 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
97f0: 73 71 6c 69 74 65 33 54 68 72 65 61 64 43 72 65  sqlite3ThreadCre
9800: 61 74 65 28 26 70 54 61 73 6b 2d 3e 70 54 68 72  ate(&pTask->pThr
9810: 65 61 64 2c 20 78 54 61 73 6b 2c 20 70 49 6e 29  ead, xTask, pIn)
9820: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20  ;.}../*.** Join 
9830: 61 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  all outstanding 
9840: 74 68 72 65 61 64 73 20 6c 61 75 6e 63 68 65 64  threads launched
9850: 20 62 79 20 53 6f 72 74 65 72 57 72 69 74 65 28   by SorterWrite(
9860: 29 20 74 6f 20 63 72 65 61 74 65 20 0a 2a 2a 20  ) to create .** 
9870: 6c 65 76 65 6c 2d 30 20 50 4d 41 73 2e 0a 2a 2f  level-0 PMAs..*/
9880: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
9890: 53 6f 72 74 65 72 4a 6f 69 6e 41 6c 6c 28 56 64  SorterJoinAll(Vd
98a0: 62 65 53 6f 72 74 65 72 20 2a 70 53 6f 72 74 65  beSorter *pSorte
98b0: 72 2c 20 69 6e 74 20 72 63 69 6e 29 7b 0a 20 20  r, int rcin){.  
98c0: 69 6e 74 20 72 63 20 3d 20 72 63 69 6e 3b 0a 20  int rc = rcin;. 
98d0: 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 54 68   int i;..  /* Th
98e0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
98f0: 6c 77 61 79 73 20 63 61 6c 6c 65 64 20 62 79 20  lways called by 
9900: 74 68 65 20 6d 61 69 6e 20 75 73 65 72 20 74 68  the main user th
9910: 72 65 61 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  read..  **.  ** 
9920: 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  If this function
9930: 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
9940: 20 61 66 74 65 72 20 53 6f 72 74 65 72 52 65 77   after SorterRew
9950: 69 6e 64 28 29 20 68 61 73 20 62 65 65 6e 20 63  ind() has been c
9960: 61 6c 6c 65 64 2c 20 0a 20 20 2a 2a 20 69 74 20  alled, .  ** it 
9970: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
9980: 20 74 68 72 65 61 64 20 70 53 6f 72 74 65 72 2d   thread pSorter-
9990: 3e 61 54 61 73 6b 5b 70 53 6f 72 74 65 72 2d 3e  >aTask[pSorter->
99a0: 6e 54 61 73 6b 2d 31 5d 2e 70 54 68 72 65 61 64  nTask-1].pThread
99b0: 0a 20 20 2a 2a 20 69 73 20 63 75 72 72 65 6e 74  .  ** is current
99c0: 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6a 6f  ly attempt to jo
99d0: 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 74  in one of the ot
99e0: 68 65 72 20 74 68 72 65 61 64 73 2e 20 54 6f 20  her threads. To 
99f0: 61 76 6f 69 64 20 61 20 72 61 63 65 0a 20 20 2a  avoid a race.  *
9a00: 2a 20 63 6f 6e 64 69 74 69 6f 6e 20 77 68 65 72  * condition wher
9a10: 65 20 74 68 69 73 20 74 68 72 65 61 64 20 61 6c  e this thread al
9a20: 73 6f 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6a  so attempts to j
9a30: 6f 69 6e 20 74 68 65 20 73 61 6d 65 20 6f 62 6a  oin the same obj
9a40: 65 63 74 2c 20 6a 6f 69 6e 20 0a 20 20 2a 2a 20  ect, join .  ** 
9a50: 74 68 72 65 61 64 20 70 53 6f 72 74 65 72 2d 3e  thread pSorter->
9a60: 61 54 61 73 6b 5b 70 53 6f 72 74 65 72 2d 3e 6e  aTask[pSorter->n
9a70: 54 61 73 6b 2d 31 5d 2e 70 54 68 72 65 61 64 20  Task-1].pThread 
9a80: 66 69 72 73 74 2e 20 2a 2f 0a 20 20 66 6f 72 28  first. */.  for(
9a90: 69 3d 70 53 6f 72 74 65 72 2d 3e 6e 54 61 73 6b  i=pSorter->nTask
9aa0: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
9ab0: 20 20 20 20 53 6f 72 74 53 75 62 74 61 73 6b 20      SortSubtask 
9ac0: 2a 70 54 61 73 6b 20 3d 20 26 70 53 6f 72 74 65  *pTask = &pSorte
9ad0: 72 2d 3e 61 54 61 73 6b 5b 69 5d 3b 0a 20 20 20  r->aTask[i];.   
9ae0: 20 69 6e 74 20 72 63 32 20 3d 20 76 64 62 65 53   int rc2 = vdbeS
9af0: 6f 72 74 65 72 4a 6f 69 6e 54 68 72 65 61 64 28  orterJoinThread(
9b00: 70 54 61 73 6b 29 3b 0a 20 20 20 20 69 66 28 20  pTask);.    if( 
9b10: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
9b20: 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20 20  rc = rc2;.  }.  
9b30: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c  return rc;.}.#el
9b40: 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65  se.# define vdbe
9b50: 53 6f 72 74 65 72 4a 6f 69 6e 41 6c 6c 28 78 2c  SorterJoinAll(x,
9b60: 72 63 69 6e 29 20 28 72 63 69 6e 29 0a 23 20 64  rcin) (rcin).# d
9b70: 65 66 69 6e 65 20 76 64 62 65 53 6f 72 74 65 72  efine vdbeSorter
9b80: 4a 6f 69 6e 54 68 72 65 61 64 28 70 54 61 73 6b  JoinThread(pTask
9b90: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64  ) SQLITE_OK.#end
9ba0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  if../*.** Alloca
9bb0: 74 65 20 61 20 6e 65 77 20 4d 65 72 67 65 45 6e  te a new MergeEn
9bc0: 67 69 6e 65 20 6f 62 6a 65 63 74 20 63 61 70 61  gine object capa
9bd0: 62 6c 65 20 6f 66 20 68 61 6e 64 6c 69 6e 67 20  ble of handling 
9be0: 75 70 20 74 6f 0a 2a 2a 20 6e 52 65 61 64 65 72  up to.** nReader
9bf0: 20 50 6d 61 52 65 61 64 65 72 20 69 6e 70 75 74   PmaReader input
9c00: 73 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65 61 64 65 72  s..**.** nReader
9c10: 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   is automaticall
9c20: 79 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20  y rounded up to 
9c30: 74 68 65 20 6e 65 78 74 20 70 6f 77 65 72 20 6f  the next power o
9c40: 66 20 74 77 6f 2e 0a 2a 2a 20 6e 52 65 61 64 65  f two..** nReade
9c50: 72 20 6d 61 79 20 6e 6f 74 20 65 78 63 65 65 64  r may not exceed
9c60: 20 53 4f 52 54 45 52 5f 4d 41 58 5f 4d 45 52 47   SORTER_MAX_MERG
9c70: 45 5f 43 4f 55 4e 54 20 65 76 65 6e 20 61 66 74  E_COUNT even aft
9c80: 65 72 20 72 6f 75 6e 64 69 6e 67 20 75 70 2e 0a  er rounding up..
9c90: 2a 2f 0a 73 74 61 74 69 63 20 4d 65 72 67 65 45  */.static MergeE
9ca0: 6e 67 69 6e 65 20 2a 76 64 62 65 4d 65 72 67 65  ngine *vdbeMerge
9cb0: 45 6e 67 69 6e 65 4e 65 77 28 69 6e 74 20 6e 52  EngineNew(int nR
9cc0: 65 61 64 65 72 29 7b 0a 20 20 69 6e 74 20 4e 20  eader){.  int N 
9cd0: 3d 20 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 2;            
9ce0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6d 61            /* Sma
9cf0: 6c 6c 65 73 74 20 70 6f 77 65 72 20 6f 66 20 74  llest power of t
9d00: 77 6f 20 3e 3d 20 6e 52 65 61 64 65 72 20 2a 2f  wo >= nReader */
9d10: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
9d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d30: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 62 79 74 65     /* Total byte
9d40: 73 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c  s of space to al
9d50: 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 4d 65 72 67  locate */.  Merg
9d60: 65 45 6e 67 69 6e 65 20 2a 70 4e 65 77 3b 20 20  eEngine *pNew;  
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
9d80: 6f 69 6e 74 65 72 20 74 6f 20 61 6c 6c 6f 63 61  ointer to alloca
9d90: 74 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 72 65  ted object to re
9da0: 74 75 72 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72  turn */..  asser
9db0: 74 28 20 6e 52 65 61 64 65 72 3c 3d 53 4f 52 54  t( nReader<=SORT
9dc0: 45 52 5f 4d 41 58 5f 4d 45 52 47 45 5f 43 4f 55  ER_MAX_MERGE_COU
9dd0: 4e 54 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20  NT );..  while( 
9de0: 4e 3c 6e 52 65 61 64 65 72 20 29 20 4e 20 2b 3d  N<nReader ) N +=
9df0: 20 4e 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69   N;.  nByte = si
9e00: 7a 65 6f 66 28 4d 65 72 67 65 45 6e 67 69 6e 65  zeof(MergeEngine
9e10: 29 20 2b 20 4e 20 2a 20 28 73 69 7a 65 6f 66 28  ) + N * (sizeof(
9e20: 69 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28 50 6d  int) + sizeof(Pm
9e30: 61 52 65 61 64 65 72 29 29 3b 0a 0a 20 20 70 4e  aReader));..  pN
9e40: 65 77 20 3d 20 73 71 6c 69 74 65 33 46 61 75 6c  ew = sqlite3Faul
9e50: 74 53 69 6d 28 31 30 30 29 20 3f 20 30 20 3a 20  tSim(100) ? 0 : 
9e60: 28 4d 65 72 67 65 45 6e 67 69 6e 65 2a 29 73 71  (MergeEngine*)sq
9e70: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
9e80: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 70 4e  nByte);.  if( pN
9e90: 65 77 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  ew ){.    pNew->
9ea0: 6e 54 72 65 65 20 3d 20 4e 3b 0a 20 20 20 20 70  nTree = N;.    p
9eb0: 4e 65 77 2d 3e 70 54 61 73 6b 20 3d 20 30 3b 0a  New->pTask = 0;.
9ec0: 20 20 20 20 70 4e 65 77 2d 3e 61 52 65 61 64 72      pNew->aReadr
9ed0: 20 3d 20 28 50 6d 61 52 65 61 64 65 72 2a 29 26   = (PmaReader*)&
9ee0: 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 70 4e 65  pNew[1];.    pNe
9ef0: 77 2d 3e 61 54 72 65 65 20 3d 20 28 69 6e 74 2a  w->aTree = (int*
9f00: 29 26 70 4e 65 77 2d 3e 61 52 65 61 64 72 5b 4e  )&pNew->aReadr[N
9f10: 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ];.  }.  return 
9f20: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  pNew;.}../*.** F
9f30: 72 65 65 20 74 68 65 20 4d 65 72 67 65 45 6e 67  ree the MergeEng
9f40: 69 6e 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ine object passe
9f50: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
9f60: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
9f70: 63 20 76 6f 69 64 20 76 64 62 65 4d 65 72 67 65  c void vdbeMerge
9f80: 45 6e 67 69 6e 65 46 72 65 65 28 4d 65 72 67 65  EngineFree(Merge
9f90: 45 6e 67 69 6e 65 20 2a 70 4d 65 72 67 65 72 29  Engine *pMerger)
9fa0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
9fb0: 20 70 4d 65 72 67 65 72 20 29 7b 0a 20 20 20 20   pMerger ){.    
9fc0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 65 72 67  for(i=0; i<pMerg
9fd0: 65 72 2d 3e 6e 54 72 65 65 3b 20 69 2b 2b 29 7b  er->nTree; i++){
9fe0: 0a 20 20 20 20 20 20 76 64 62 65 50 6d 61 52 65  .      vdbePmaRe
9ff0: 61 64 65 72 43 6c 65 61 72 28 26 70 4d 65 72 67  aderClear(&pMerg
a000: 65 72 2d 3e 61 52 65 61 64 72 5b 69 5d 29 3b 0a  er->aReadr[i]);.
a010: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
a020: 74 65 33 5f 66 72 65 65 28 70 4d 65 72 67 65 72  te3_free(pMerger
a030: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  );.}../*.** Free
a040: 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 20 61   all resources a
a050: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
a060: 68 65 20 49 6e 63 72 4d 65 72 67 65 72 20 6f 62  he IncrMerger ob
a070: 6a 65 63 74 20 69 6e 64 69 63 61 74 65 64 20 62  ject indicated b
a080: 79 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61  y.** the first a
a090: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
a0a0: 69 63 20 76 6f 69 64 20 76 64 62 65 49 6e 63 72  ic void vdbeIncr
a0b0: 46 72 65 65 28 49 6e 63 72 4d 65 72 67 65 72 20  Free(IncrMerger 
a0c0: 2a 70 49 6e 63 72 29 7b 0a 20 20 69 66 28 20 70  *pIncr){.  if( p
a0d0: 49 6e 63 72 20 29 7b 0a 23 69 66 20 53 51 4c 49  Incr ){.#if SQLI
a0e0: 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48  TE_MAX_WORKER_TH
a0f0: 52 45 41 44 53 3e 30 0a 20 20 20 20 69 66 28 20  READS>0.    if( 
a100: 70 49 6e 63 72 2d 3e 62 55 73 65 54 68 72 65 61  pIncr->bUseThrea
a110: 64 20 29 7b 0a 20 20 20 20 20 20 76 64 62 65 53  d ){.      vdbeS
a120: 6f 72 74 65 72 4a 6f 69 6e 54 68 72 65 61 64 28  orterJoinThread(
a130: 70 49 6e 63 72 2d 3e 70 54 61 73 6b 29 3b 0a 20  pIncr->pTask);. 
a140: 20 20 20 20 20 69 66 28 20 70 49 6e 63 72 2d 3e       if( pIncr->
a150: 61 46 69 6c 65 5b 30 5d 2e 70 46 64 20 29 20 73  aFile[0].pFd ) s
a160: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
a170: 65 28 70 49 6e 63 72 2d 3e 61 46 69 6c 65 5b 30  e(pIncr->aFile[0
a180: 5d 2e 70 46 64 29 3b 0a 20 20 20 20 20 20 69 66  ].pFd);.      if
a190: 28 20 70 49 6e 63 72 2d 3e 61 46 69 6c 65 5b 31  ( pIncr->aFile[1
a1a0: 5d 2e 70 46 64 20 29 20 73 71 6c 69 74 65 33 4f  ].pFd ) sqlite3O
a1b0: 73 43 6c 6f 73 65 46 72 65 65 28 70 49 6e 63 72  sCloseFree(pIncr
a1c0: 2d 3e 61 46 69 6c 65 5b 31 5d 2e 70 46 64 29 3b  ->aFile[1].pFd);
a1d0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
a1e0: 20 20 76 64 62 65 4d 65 72 67 65 45 6e 67 69 6e    vdbeMergeEngin
a1f0: 65 46 72 65 65 28 70 49 6e 63 72 2d 3e 70 4d 65  eFree(pIncr->pMe
a200: 72 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  rger);.    sqlit
a210: 65 33 5f 66 72 65 65 28 70 49 6e 63 72 29 3b 0a  e3_free(pIncr);.
a220: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73    }.}../*.** Res
a230: 65 74 20 61 20 73 6f 72 74 69 6e 67 20 63 75 72  et a sorting cur
a240: 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74 73 20  sor back to its 
a250: 6f 72 69 67 69 6e 61 6c 20 65 6d 70 74 79 20 73  original empty s
a260: 74 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tate..*/.void sq
a270: 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 52  lite3VdbeSorterR
a280: 65 73 65 74 28 73 71 6c 69 74 65 33 20 2a 64 62  eset(sqlite3 *db
a290: 2c 20 56 64 62 65 53 6f 72 74 65 72 20 2a 70 53  , VdbeSorter *pS
a2a0: 6f 72 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b  orter){.  int i;
a2b0: 0a 20 20 28 76 6f 69 64 29 76 64 62 65 53 6f 72  .  (void)vdbeSor
a2c0: 74 65 72 4a 6f 69 6e 41 6c 6c 28 70 53 6f 72 74  terJoinAll(pSort
a2d0: 65 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  er, SQLITE_OK);.
a2e0: 20 20 61 73 73 65 72 74 28 20 70 53 6f 72 74 65    assert( pSorte
a2f0: 72 2d 3e 62 55 73 65 54 68 72 65 61 64 73 20 7c  r->bUseThreads |
a300: 7c 20 70 53 6f 72 74 65 72 2d 3e 70 52 65 61 64  | pSorter->pRead
a310: 65 72 3d 3d 30 20 29 3b 0a 23 69 66 20 53 51 4c  er==0 );.#if SQL
a320: 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54  ITE_MAX_WORKER_T
a330: 48 52 45 41 44 53 3e 30 0a 20 20 69 66 28 20 70  HREADS>0.  if( p
a340: 53 6f 72 74 65 72 2d 3e 70 52 65 61 64 65 72 20  Sorter->pReader 
a350: 29 7b 0a 20 20 20 20 76 64 62 65 50 6d 61 52 65  ){.    vdbePmaRe
a360: 61 64 65 72 43 6c 65 61 72 28 70 53 6f 72 74 65  aderClear(pSorte
a370: 72 2d 3e 70 52 65 61 64 65 72 29 3b 0a 20 20 20  r->pReader);.   
a380: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
a390: 62 2c 20 70 53 6f 72 74 65 72 2d 3e 70 52 65 61  b, pSorter->pRea
a3a0: 64 65 72 29 3b 0a 20 20 20 20 70 53 6f 72 74 65  der);.    pSorte
a3b0: 72 2d 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a  r->pReader = 0;.
a3c0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 76 64 62    }.#endif.  vdb
a3d0: 65 4d 65 72 67 65 45 6e 67 69 6e 65 46 72 65 65  eMergeEngineFree
a3e0: 28 70 53 6f 72 74 65 72 2d 3e 70 4d 65 72 67 65  (pSorter->pMerge
a3f0: 72 29 3b 0a 20 20 70 53 6f 72 74 65 72 2d 3e 70  r);.  pSorter->p
a400: 4d 65 72 67 65 72 20 3d 20 30 3b 0a 20 20 66 6f  Merger = 0;.  fo
a410: 72 28 69 3d 30 3b 20 69 3c 70 53 6f 72 74 65 72  r(i=0; i<pSorter
a420: 2d 3e 6e 54 61 73 6b 3b 20 69 2b 2b 29 7b 0a 20  ->nTask; i++){. 
a430: 20 20 20 53 6f 72 74 53 75 62 74 61 73 6b 20 2a     SortSubtask *
a440: 70 54 61 73 6b 20 3d 20 26 70 53 6f 72 74 65 72  pTask = &pSorter
a450: 2d 3e 61 54 61 73 6b 5b 69 5d 3b 0a 20 20 20 20  ->aTask[i];.    
a460: 76 64 62 65 53 6f 72 74 53 75 62 74 61 73 6b 43  vdbeSortSubtaskC
a470: 6c 65 61 6e 75 70 28 64 62 2c 20 70 54 61 73 6b  leanup(db, pTask
a480: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f  );.  }.  if( pSo
a490: 72 74 65 72 2d 3e 6c 69 73 74 2e 61 4d 65 6d 6f  rter->list.aMemo
a4a0: 72 79 3d 3d 30 20 29 7b 0a 20 20 20 20 76 64 62  ry==0 ){.    vdb
a4b0: 65 53 6f 72 74 65 72 52 65 63 6f 72 64 46 72 65  eSorterRecordFre
a4c0: 65 28 30 2c 20 70 53 6f 72 74 65 72 2d 3e 6c 69  e(0, pSorter->li
a4d0: 73 74 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20  st.pList);.  }. 
a4e0: 20 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74 2e 70   pSorter->list.p
a4f0: 4c 69 73 74 20 3d 20 30 3b 0a 20 20 70 53 6f 72  List = 0;.  pSor
a500: 74 65 72 2d 3e 6c 69 73 74 2e 73 7a 50 4d 41 20  ter->list.szPMA 
a510: 3d 20 30 3b 0a 20 20 70 53 6f 72 74 65 72 2d 3e  = 0;.  pSorter->
a520: 62 55 73 65 50 4d 41 20 3d 20 30 3b 0a 20 20 70  bUsePMA = 0;.  p
a530: 53 6f 72 74 65 72 2d 3e 69 4d 65 6d 6f 72 79 20  Sorter->iMemory 
a540: 3d 20 30 3b 0a 20 20 70 53 6f 72 74 65 72 2d 3e  = 0;.  pSorter->
a550: 6d 78 4b 65 79 73 69 7a 65 20 3d 20 30 3b 0a 20  mxKeysize = 0;. 
a560: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
a570: 62 2c 20 70 53 6f 72 74 65 72 2d 3e 70 55 6e 70  b, pSorter->pUnp
a580: 61 63 6b 65 64 29 3b 0a 20 20 70 53 6f 72 74 65  acked);.  pSorte
a590: 72 2d 3e 70 55 6e 70 61 63 6b 65 64 20 3d 20 30  r->pUnpacked = 0
a5a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
a5b0: 61 6e 79 20 63 75 72 73 6f 72 20 63 6f 6d 70 6f  any cursor compo
a5c0: 6e 65 6e 74 73 20 61 6c 6c 6f 63 61 74 65 64 20  nents allocated 
a5d0: 62 79 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f  by sqlite3VdbeSo
a5e0: 72 74 65 72 58 58 58 20 72 6f 75 74 69 6e 65 73  rterXXX routines
a5f0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
a600: 33 56 64 62 65 53 6f 72 74 65 72 43 6c 6f 73 65  3VdbeSorterClose
a610: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64  (sqlite3 *db, Vd
a620: 62 65 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b  beCursor *pCsr){
a630: 0a 20 20 56 64 62 65 53 6f 72 74 65 72 20 2a 70  .  VdbeSorter *p
a640: 53 6f 72 74 65 72 20 3d 20 70 43 73 72 2d 3e 70  Sorter = pCsr->p
a650: 53 6f 72 74 65 72 3b 0a 20 20 69 66 28 20 70 53  Sorter;.  if( pS
a660: 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  orter ){.    sql
a670: 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 52 65  ite3VdbeSorterRe
a680: 73 65 74 28 64 62 2c 20 70 53 6f 72 74 65 72 29  set(db, pSorter)
a690: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
a6a0: 65 65 28 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74  ee(pSorter->list
a6b0: 2e 61 4d 65 6d 6f 72 79 29 3b 0a 20 20 20 20 73  .aMemory);.    s
a6c0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
a6d0: 20 70 53 6f 72 74 65 72 29 3b 0a 20 20 20 20 70   pSorter);.    p
a6e0: 43 73 72 2d 3e 70 53 6f 72 74 65 72 20 3d 20 30  Csr->pSorter = 0
a6f0: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 53 51 4c  ;.  }.}..#if SQL
a700: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
a710: 45 3e 30 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  E>0./*.** The fi
a720: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
a730: 61 20 66 69 6c 65 2d 68 61 6e 64 6c 65 20 6f 70  a file-handle op
a740: 65 6e 20 6f 6e 20 61 20 74 65 6d 70 6f 72 61 72  en on a temporar
a750: 79 20 66 69 6c 65 2e 20 54 68 65 20 66 69 6c 65  y file. The file
a760: 0a 2a 2a 20 69 73 20 67 75 61 72 61 6e 74 65 65  .** is guarantee
a770: 64 20 74 6f 20 62 65 20 6e 42 79 74 65 20 62 79  d to be nByte by
a780: 74 65 73 20 6f 72 20 73 6d 61 6c 6c 65 72 20 69  tes or smaller i
a790: 6e 20 73 69 7a 65 2e 20 54 68 69 73 20 66 75 6e  n size. This fun
a7a0: 63 74 69 6f 6e 0a 2a 2a 20 61 74 74 65 6d 70 74  ction.** attempt
a7b0: 73 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20  s to extend the 
a7c0: 66 69 6c 65 20 74 6f 20 6e 42 79 74 65 20 62 79  file to nByte by
a7d0: 74 65 73 20 69 6e 20 73 69 7a 65 20 61 6e 64 20  tes in size and 
a7e0: 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 0a 2a  to ensure that.*
a7f0: 2a 20 74 68 65 20 56 46 53 20 68 61 73 20 6d 65  * the VFS has me
a800: 6d 6f 72 79 20 6d 61 70 70 65 64 20 69 74 2e 0a  mory mapped it..
a810: 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72  **.** Whether or
a820: 20 6e 6f 74 20 74 68 65 20 66 69 6c 65 20 64 6f   not the file do
a830: 65 73 20 65 6e 64 20 75 70 20 6d 65 6d 6f 72 79  es end up memory
a840: 20 6d 61 70 70 65 64 20 6f 66 20 63 6f 75 72 73   mapped of cours
a850: 65 20 64 65 70 65 6e 64 73 20 6f 6e 0a 2a 2a 20  e depends on.** 
a860: 74 68 65 20 73 70 65 63 69 66 69 63 20 56 46 53  the specific VFS
a870: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
a880: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a890: 76 64 62 65 53 6f 72 74 65 72 45 78 74 65 6e 64  vdbeSorterExtend
a8a0: 46 69 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62  File(sqlite3 *db
a8b0: 2c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  , sqlite3_file *
a8c0: 70 46 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b  pFd, i64 nByte){
a8d0: 0a 20 20 69 66 28 20 6e 42 79 74 65 3c 3d 28 69  .  if( nByte<=(i
a8e0: 36 34 29 28 64 62 2d 3e 6e 4d 61 78 53 6f 72 74  64)(db->nMaxSort
a8f0: 65 72 4d 6d 61 70 29 20 29 7b 0a 20 20 20 20 69  erMmap) ){.    i
a900: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  nt rc = sqlite3O
a910: 73 54 72 75 6e 63 61 74 65 28 70 46 64 2c 20 6e  sTruncate(pFd, n
a920: 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Byte);.    if( r
a930: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
a940: 20 20 20 20 20 20 76 6f 69 64 20 2a 70 20 3d 20        void *p = 
a950: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
a960: 4f 73 46 65 74 63 68 28 70 46 64 2c 20 30 2c 20  OsFetch(pFd, 0, 
a970: 28 69 6e 74 29 6e 42 79 74 65 2c 20 26 70 29 3b  (int)nByte, &p);
a980: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
a990: 55 6e 66 65 74 63 68 28 70 46 64 2c 20 30 2c 20  Unfetch(pFd, 0, 
a9a0: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  p);.    }.  }.}.
a9b0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76  #else.# define v
a9c0: 64 62 65 53 6f 72 74 65 72 45 78 74 65 6e 64 46  dbeSorterExtendF
a9d0: 69 6c 65 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69  ile(x,y,z).#endi
a9e0: 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  f../*.** Allocat
a9f0: 65 20 73 70 61 63 65 20 66 6f 72 20 61 20 66 69  e space for a fi
aa00: 6c 65 2d 68 61 6e 64 6c 65 20 61 6e 64 20 6f 70  le-handle and op
aa10: 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
aa20: 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 66  ile. If successf
aa30: 75 6c 2c 0a 2a 2a 20 73 65 74 20 2a 70 70 46 64  ul,.** set *ppFd
aa40: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
aa50: 20 6d 61 6c 6c 6f 63 27 64 20 66 69 6c 65 2d 68   malloc'd file-h
aa60: 61 6e 64 6c 65 20 61 6e 64 20 72 65 74 75 72 6e  andle and return
aa70: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f   SQLITE_OK..** O
aa80: 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 2a 70  therwise, set *p
aa90: 70 46 64 20 74 6f 20 30 20 61 6e 64 20 72 65 74  pFd to 0 and ret
aaa0: 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
aab0: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
aac0: 74 69 63 20 69 6e 74 20 76 64 62 65 53 6f 72 74  tic int vdbeSort
aad0: 65 72 4f 70 65 6e 54 65 6d 70 46 69 6c 65 28 0a  erOpenTempFile(.
aae0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
aaf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab00: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
ab10: 6e 64 6c 65 20 64 6f 69 6e 67 20 73 6f 72 74 20  ndle doing sort 
ab20: 2a 2f 0a 20 20 69 36 34 20 6e 45 78 74 65 6e 64  */.  i64 nExtend
ab30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
ab40: 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20       /* Attempt 
ab50: 74 6f 20 65 78 74 65 6e 64 20 66 69 6c 65 20 74  to extend file t
ab60: 6f 20 74 68 69 73 20 73 69 7a 65 20 2a 2f 0a 20  o this size */. 
ab70: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 2a   sqlite3_file **
ab80: 70 70 46 64 0a 29 7b 0a 20 20 69 6e 74 20 72 63  ppFd.){.  int rc
ab90: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
aba0: 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 64 62 2d  OsOpenMalloc(db-
abb0: 3e 70 56 66 73 2c 20 30 2c 20 70 70 46 64 2c 0a  >pVfs, 0, ppFd,.
abc0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
abd0: 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7c  N_TEMP_JOURNAL |
abe0: 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  .      SQLITE_OP
abf0: 45 4e 5f 52 45 41 44 57 52 49 54 45 20 20 20 20  EN_READWRITE    
ac00: 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
ac10: 45 41 54 45 20 7c 0a 20 20 20 20 20 20 53 51 4c  EATE |.      SQL
ac20: 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
ac30: 56 45 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f  VE    | SQLITE_O
ac40: 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
ac50: 45 2c 20 26 72 63 0a 20 20 29 3b 0a 20 20 69 66  E, &rc.  );.  if
ac60: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
ac70: 29 7b 0a 20 20 20 20 69 36 34 20 6d 61 78 20 3d  ){.    i64 max =
ac80: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
ac90: 5f 53 49 5a 45 3b 0a 20 20 20 20 73 71 6c 69 74  _SIZE;.    sqlit
aca0: 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48  e3OsFileControlH
acb0: 69 6e 74 28 2a 70 70 46 64 2c 20 53 51 4c 49 54  int(*ppFd, SQLIT
acc0: 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  E_FCNTL_MMAP_SIZ
acd0: 45 2c 20 28 76 6f 69 64 2a 29 26 6d 61 78 29 3b  E, (void*)&max);
ace0: 0a 20 20 20 20 69 66 28 20 6e 45 78 74 65 6e 64  .    if( nExtend
acf0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 76 64 62 65  >0 ){.      vdbe
ad00: 53 6f 72 74 65 72 45 78 74 65 6e 64 46 69 6c 65  SorterExtendFile
ad10: 28 64 62 2c 20 2a 70 70 46 64 2c 20 6e 45 78 74  (db, *ppFd, nExt
ad20: 65 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  end);.    }.  }.
ad30: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
ad40: 2f 2a 0a 2a 2a 20 49 66 20 69 74 20 68 61 73 20  /*.** If it has 
ad50: 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e  not already been
ad60: 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f   allocated, allo
ad70: 63 61 74 65 20 74 68 65 20 55 6e 70 61 63 6b 65  cate the Unpacke
ad80: 64 52 65 63 6f 72 64 20 0a 2a 2a 20 73 74 72 75  dRecord .** stru
ad90: 63 74 75 72 65 20 61 74 20 70 54 61 73 6b 2d 3e  cture at pTask->
ada0: 70 55 6e 70 61 63 6b 65 64 2e 20 52 65 74 75 72  pUnpacked. Retur
adb0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
adc0: 75 63 63 65 73 73 66 75 6c 20 28 6f 72 20 0a 2a  uccessful (or .*
add0: 2a 20 69 66 20 6e 6f 20 61 6c 6c 6f 63 61 74 69  * if no allocati
ade0: 6f 6e 20 77 61 73 20 72 65 71 75 69 72 65 64 29  on was required)
adf0: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  , or SQLITE_NOME
ae00: 4d 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  M otherwise..*/.
ae10: 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 53  static int vdbeS
ae20: 6f 72 74 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64  ortAllocUnpacked
ae30: 28 53 6f 72 74 53 75 62 74 61 73 6b 20 2a 70 54  (SortSubtask *pT
ae40: 61 73 6b 29 7b 0a 20 20 69 66 28 20 70 54 61 73  ask){.  if( pTas
ae50: 6b 2d 3e 70 55 6e 70 61 63 6b 65 64 3d 3d 30 20  k->pUnpacked==0 
ae60: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 46 72  ){.    char *pFr
ae70: 65 65 3b 0a 20 20 20 20 70 54 61 73 6b 2d 3e 70  ee;.    pTask->p
ae80: 55 6e 70 61 63 6b 65 64 20 3d 20 73 71 6c 69 74  Unpacked = sqlit
ae90: 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63  e3VdbeAllocUnpac
aea0: 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 20 20 20  kedRecord(.     
aeb0: 20 20 20 70 54 61 73 6b 2d 3e 70 53 6f 72 74 65     pTask->pSorte
aec0: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 30 2c 20  r->pKeyInfo, 0, 
aed0: 30 2c 20 26 70 46 72 65 65 0a 20 20 20 20 29 3b  0, &pFree.    );
aee0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
aef0: 73 6b 2d 3e 70 55 6e 70 61 63 6b 65 64 3d 3d 28  sk->pUnpacked==(
af00: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 2a 29  UnpackedRecord*)
af10: 70 46 72 65 65 20 29 3b 0a 20 20 20 20 69 66 28  pFree );.    if(
af20: 20 70 46 72 65 65 3d 3d 30 20 29 20 72 65 74 75   pFree==0 ) retu
af30: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
af40: 0a 20 20 20 20 70 54 61 73 6b 2d 3e 70 55 6e 70  .    pTask->pUnp
af50: 61 63 6b 65 64 2d 3e 6e 46 69 65 6c 64 20 3d 20  acked->nField = 
af60: 70 54 61 73 6b 2d 3e 70 53 6f 72 74 65 72 2d 3e  pTask->pSorter->
af70: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
af80: 3b 0a 20 20 20 20 70 54 61 73 6b 2d 3e 70 55 6e  ;.    pTask->pUn
af90: 70 61 63 6b 65 64 2d 3e 65 72 72 43 6f 64 65 20  packed->errCode 
afa0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
afb0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
afc0: 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 74 68 65  ./*.** Merge the
afd0: 20 74 77 6f 20 73 6f 72 74 65 64 20 6c 69 73 74   two sorted list
afe0: 73 20 70 31 20 61 6e 64 20 70 32 20 69 6e 74 6f  s p1 and p2 into
aff0: 20 61 20 73 69 6e 67 6c 65 20 6c 69 73 74 2e 0a   a single list..
b000: 2a 2a 20 53 65 74 20 2a 70 70 4f 75 74 20 74 6f  ** Set *ppOut to
b010: 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68 65   the head of the
b020: 20 6e 65 77 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74   new list..*/.st
b030: 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 53 6f  atic void vdbeSo
b040: 72 74 65 72 4d 65 72 67 65 28 0a 20 20 53 6f 72  rterMerge(.  Sor
b050: 74 53 75 62 74 61 73 6b 20 2a 70 54 61 73 6b 2c  tSubtask *pTask,
b060: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b070: 43 61 6c 6c 69 6e 67 20 74 68 72 65 61 64 20 63  Calling thread c
b080: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6f 72 74  ontext */.  Sort
b090: 65 72 52 65 63 6f 72 64 20 2a 70 31 2c 20 20 20  erRecord *p1,   
b0a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
b0b0: 69 72 73 74 20 6c 69 73 74 20 74 6f 20 6d 65 72  irst list to mer
b0c0: 67 65 20 2a 2f 0a 20 20 53 6f 72 74 65 72 52 65  ge */.  SorterRe
b0d0: 63 6f 72 64 20 2a 70 32 2c 20 20 20 20 20 20 20  cord *p2,       
b0e0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e          /* Secon
b0f0: 64 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20  d list to merge 
b100: 2a 2f 0a 20 20 53 6f 72 74 65 72 52 65 63 6f 72  */.  SorterRecor
b110: 64 20 2a 2a 70 70 4f 75 74 20 20 20 20 20 20 20  d **ppOut       
b120: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 48 65 61       /* OUT: Hea
b130: 64 20 6f 66 20 6d 65 72 67 65 64 20 6c 69 73 74  d of merged list
b140: 20 2a 2f 0a 29 7b 0a 20 20 53 6f 72 74 65 72 52   */.){.  SorterR
b150: 65 63 6f 72 64 20 2a 70 46 69 6e 61 6c 20 3d 20  ecord *pFinal = 
b160: 30 3b 0a 20 20 53 6f 72 74 65 72 52 65 63 6f 72  0;.  SorterRecor
b170: 64 20 2a 2a 70 70 20 3d 20 26 70 46 69 6e 61 6c  d **pp = &pFinal
b180: 3b 0a 20 20 76 6f 69 64 20 2a 70 56 61 6c 32 20  ;.  void *pVal2 
b190: 3d 20 70 32 20 3f 20 53 52 56 41 4c 28 70 32 29  = p2 ? SRVAL(p2)
b1a0: 20 3a 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20   : 0;..  while( 
b1b0: 70 31 20 26 26 20 70 32 20 29 7b 0a 20 20 20 20  p1 && p2 ){.    
b1c0: 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 72 65 73  int res;.    res
b1d0: 20 3d 20 76 64 62 65 53 6f 72 74 65 72 43 6f 6d   = vdbeSorterCom
b1e0: 70 61 72 65 28 70 54 61 73 6b 2c 20 53 52 56 41  pare(pTask, SRVA
b1f0: 4c 28 70 31 29 2c 20 70 31 2d 3e 6e 56 61 6c 2c  L(p1), p1->nVal,
b200: 20 70 56 61 6c 32 2c 20 70 32 2d 3e 6e 56 61 6c   pVal2, p2->nVal
b210: 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c 3d  );.    if( res<=
b220: 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d  0 ){.      *pp =
b230: 20 70 31 3b 0a 20 20 20 20 20 20 70 70 20 3d 20   p1;.      pp = 
b240: 26 70 31 2d 3e 75 2e 70 4e 65 78 74 3b 0a 20 20  &p1->u.pNext;.  
b250: 20 20 20 20 70 31 20 3d 20 70 31 2d 3e 75 2e 70      p1 = p1->u.p
b260: 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 56 61 6c  Next;.      pVal
b270: 32 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  2 = 0;.    }else
b280: 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 32  {.      *pp = p2
b290: 3b 0a 20 20 20 20 20 20 20 70 70 20 3d 20 26 70  ;.       pp = &p
b2a0: 32 2d 3e 75 2e 70 4e 65 78 74 3b 0a 20 20 20 20  2->u.pNext;.    
b2b0: 20 20 70 32 20 3d 20 70 32 2d 3e 75 2e 70 4e 65    p2 = p2->u.pNe
b2c0: 78 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 32  xt;.      if( p2
b2d0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
b2e0: 20 20 20 70 56 61 6c 32 20 3d 20 53 52 56 41 4c     pVal2 = SRVAL
b2f0: 28 70 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (p2);.    }.  }.
b300: 20 20 2a 70 70 20 3d 20 70 31 20 3f 20 70 31 20    *pp = p1 ? p1 
b310: 3a 20 70 32 3b 0a 20 20 2a 70 70 4f 75 74 20 3d  : p2;.  *ppOut =
b320: 20 70 46 69 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a   pFinal;.}../*.*
b330: 2a 20 53 6f 72 74 20 74 68 65 20 6c 69 6e 6b 65  * Sort the linke
b340: 64 20 6c 69 73 74 20 6f 66 20 72 65 63 6f 72 64  d list of record
b350: 73 20 68 65 61 64 65 64 20 61 74 20 70 54 61 73  s headed at pTas
b360: 6b 2d 3e 70 4c 69 73 74 2e 20 52 65 74 75 72 6e  k->pList. Return
b370: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69   .** SQLITE_OK i
b380: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
b390: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
b3a0: 20 63 6f 64 65 20 28 69 2e 65 2e 20 53 51 4c 49   code (i.e. SQLI
b3b0: 54 45 5f 4e 4f 4d 45 4d 29 20 69 66 20 0a 2a 2a  TE_NOMEM) if .**
b3c0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
b3d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b3e0: 76 64 62 65 53 6f 72 74 65 72 53 6f 72 74 28 53  vdbeSorterSort(S
b3f0: 6f 72 74 53 75 62 74 61 73 6b 20 2a 70 54 61 73  ortSubtask *pTas
b400: 6b 2c 20 53 6f 72 74 65 72 4c 69 73 74 20 2a 70  k, SorterList *p
b410: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
b420: 20 20 53 6f 72 74 65 72 52 65 63 6f 72 64 20 2a    SorterRecord *
b430: 2a 61 53 6c 6f 74 3b 0a 20 20 53 6f 72 74 65 72  *aSlot;.  Sorter
b440: 52 65 63 6f 72 64 20 2a 70 3b 0a 20 20 69 6e 74  Record *p;.  int
b450: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 76 64 62   rc;..  rc = vdb
b460: 65 53 6f 72 74 41 6c 6c 6f 63 55 6e 70 61 63 6b  eSortAllocUnpack
b470: 65 64 28 70 54 61 73 6b 29 3b 0a 20 20 69 66 28  ed(pTask);.  if(
b480: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
b490: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 61   return rc;..  a
b4a0: 53 6c 6f 74 20 3d 20 28 53 6f 72 74 65 72 52 65  Slot = (SorterRe
b4b0: 63 6f 72 64 20 2a 2a 29 73 71 6c 69 74 65 33 4d  cord **)sqlite3M
b4c0: 61 6c 6c 6f 63 5a 65 72 6f 28 36 34 20 2a 20 73  allocZero(64 * s
b4d0: 69 7a 65 6f 66 28 53 6f 72 74 65 72 52 65 63 6f  izeof(SorterReco
b4e0: 72 64 20 2a 29 29 3b 0a 20 20 69 66 28 20 21 61  rd *));.  if( !a
b4f0: 53 6c 6f 74 20 29 7b 0a 20 20 20 20 72 65 74 75  Slot ){.    retu
b500: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
b510: 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 70 4c 69 73  .  }..  p = pLis
b520: 74 2d 3e 70 4c 69 73 74 3b 0a 20 20 77 68 69 6c  t->pList;.  whil
b530: 65 28 20 70 20 29 7b 0a 20 20 20 20 53 6f 72 74  e( p ){.    Sort
b540: 65 72 52 65 63 6f 72 64 20 2a 70 4e 65 78 74 3b  erRecord *pNext;
b550: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
b560: 61 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20  aMemory ){.     
b570: 20 69 66 28 20 28 75 38 2a 29 70 3d 3d 70 4c 69   if( (u8*)p==pLi
b580: 73 74 2d 3e 61 4d 65 6d 6f 72 79 20 29 7b 0a 20  st->aMemory ){. 
b590: 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 30         pNext = 0
b5a0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
b5b0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
b5c0: 2d 3e 75 2e 69 4e 65 78 74 3c 73 71 6c 69 74 65  ->u.iNext<sqlite
b5d0: 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 4c 69 73  3MallocSize(pLis
b5e0: 74 2d 3e 61 4d 65 6d 6f 72 79 29 20 29 3b 0a 20  t->aMemory) );. 
b5f0: 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 28         pNext = (
b600: 53 6f 72 74 65 72 52 65 63 6f 72 64 2a 29 26 70  SorterRecord*)&p
b610: 4c 69 73 74 2d 3e 61 4d 65 6d 6f 72 79 5b 70 2d  List->aMemory[p-
b620: 3e 75 2e 69 4e 65 78 74 5d 3b 0a 20 20 20 20 20  >u.iNext];.     
b630: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
b640: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 75      pNext = p->u
b650: 2e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20  .pNext;.    }.. 
b660: 20 20 20 70 2d 3e 75 2e 70 4e 65 78 74 20 3d 20     p->u.pNext = 
b670: 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
b680: 61 53 6c 6f 74 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  aSlot[i]; i++){.
b690: 20 20 20 20 20 20 76 64 62 65 53 6f 72 74 65 72        vdbeSorter
b6a0: 4d 65 72 67 65 28 70 54 61 73 6b 2c 20 70 2c 20  Merge(pTask, p, 
b6b0: 61 53 6c 6f 74 5b 69 5d 2c 20 26 70 29 3b 0a 20  aSlot[i], &p);. 
b6c0: 20 20 20 20 20 61 53 6c 6f 74 5b 69 5d 20 3d 20       aSlot[i] = 
b6d0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53 6c  0;.    }.    aSl
b6e0: 6f 74 5b 69 5d 20 3d 20 70 3b 0a 20 20 20 20 70  ot[i] = p;.    p
b6f0: 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20   = pNext;.  }.. 
b700: 20 70 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d   p = 0;.  for(i=
b710: 30 3b 20 69 3c 36 34 3b 20 69 2b 2b 29 7b 0a 20  0; i<64; i++){. 
b720: 20 20 20 76 64 62 65 53 6f 72 74 65 72 4d 65 72     vdbeSorterMer
b730: 67 65 28 70 54 61 73 6b 2c 20 70 2c 20 61 53 6c  ge(pTask, p, aSl
b740: 6f 74 5b 69 5d 2c 20 26 70 29 3b 0a 20 20 7d 0a  ot[i], &p);.  }.
b750: 20 20 70 4c 69 73 74 2d 3e 70 4c 69 73 74 20 3d    pList->pList =
b760: 20 70 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66   p;..  sqlite3_f
b770: 72 65 65 28 61 53 6c 6f 74 29 3b 0a 20 20 61 73  ree(aSlot);.  as
b780: 73 65 72 74 28 20 70 54 61 73 6b 2d 3e 70 55 6e  sert( pTask->pUn
b790: 70 61 63 6b 65 64 2d 3e 65 72 72 43 6f 64 65 3d  packed->errCode=
b7a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20  =SQLITE_OK .    
b7b0: 20 20 20 7c 7c 20 70 54 61 73 6b 2d 3e 70 55 6e     || pTask->pUn
b7c0: 70 61 63 6b 65 64 2d 3e 65 72 72 43 6f 64 65 3d  packed->errCode=
b7d0: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 20  =SQLITE_NOMEM . 
b7e0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 61   );.  return pTa
b7f0: 73 6b 2d 3e 70 55 6e 70 61 63 6b 65 64 2d 3e 65  sk->pUnpacked->e
b800: 72 72 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rrCode;.}../*.**
b810: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 50 4d   Initialize a PM
b820: 41 2d 77 72 69 74 65 72 20 6f 62 6a 65 63 74 2e  A-writer object.
b830: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b840: 76 64 62 65 50 6d 61 57 72 69 74 65 72 49 6e 69  vdbePmaWriterIni
b850: 74 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  t(.  sqlite3_fil
b860: 65 20 2a 70 46 64 2c 20 20 20 20 20 20 20 20 20  e *pFd,         
b870: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e       /* File han
b880: 64 6c 65 20 74 6f 20 77 72 69 74 65 20 74 6f 20  dle to write to 
b890: 2a 2f 0a 20 20 50 6d 61 57 72 69 74 65 72 20 2a  */.  PmaWriter *
b8a0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
b8b0: 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74       /* Object t
b8c0: 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 20 20  o populate */.  
b8d0: 69 6e 74 20 6e 42 75 66 2c 20 20 20 20 20 20 20  int nBuf,       
b8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8f0: 2f 2a 20 42 75 66 66 65 72 20 73 69 7a 65 20 2a  /* Buffer size *
b900: 2f 0a 20 20 69 36 34 20 69 53 74 61 72 74 20 20  /.  i64 iStart  
b910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b920: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
b930: 20 70 46 64 20 74 6f 20 62 65 67 69 6e 20 77 72   pFd to begin wr
b940: 69 74 69 6e 67 20 61 74 20 2a 2f 0a 29 7b 0a 20  iting at */.){. 
b950: 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
b960: 7a 65 6f 66 28 50 6d 61 57 72 69 74 65 72 29 29  zeof(PmaWriter))
b970: 3b 0a 20 20 70 2d 3e 61 42 75 66 66 65 72 20 3d  ;.  p->aBuffer =
b980: 20 28 75 38 2a 29 73 71 6c 69 74 65 33 4d 61 6c   (u8*)sqlite3Mal
b990: 6c 6f 63 28 6e 42 75 66 29 3b 0a 20 20 69 66 28  loc(nBuf);.  if(
b9a0: 20 21 70 2d 3e 61 42 75 66 66 65 72 20 29 7b 0a   !p->aBuffer ){.
b9b0: 20 20 20 20 70 2d 3e 65 46 57 45 72 72 20 3d 20      p->eFWErr = 
b9c0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
b9d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 69 42  }else{.    p->iB
b9e0: 75 66 45 6e 64 20 3d 20 70 2d 3e 69 42 75 66 53  ufEnd = p->iBufS
b9f0: 74 61 72 74 20 3d 20 28 69 53 74 61 72 74 20 25  tart = (iStart %
ba00: 20 6e 42 75 66 29 3b 0a 20 20 20 20 70 2d 3e 69   nBuf);.    p->i
ba10: 57 72 69 74 65 4f 66 66 20 3d 20 69 53 74 61 72  WriteOff = iStar
ba20: 74 20 2d 20 70 2d 3e 69 42 75 66 53 74 61 72 74  t - p->iBufStart
ba30: 3b 0a 20 20 20 20 70 2d 3e 6e 42 75 66 66 65 72  ;.    p->nBuffer
ba40: 20 3d 20 6e 42 75 66 3b 0a 20 20 20 20 70 2d 3e   = nBuf;.    p->
ba50: 70 46 64 20 3d 20 70 46 64 3b 0a 20 20 7d 0a 7d  pFd = pFd;.  }.}
ba60: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 44  ../*.** Write nD
ba70: 61 74 61 20 62 79 74 65 73 20 6f 66 20 64 61 74  ata bytes of dat
ba80: 61 20 74 6f 20 74 68 65 20 50 4d 41 2e 20 52 65  a to the PMA. Re
ba90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
baa0: 2a 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * if successful,
bab0: 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
bac0: 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65  ror code if an e
bad0: 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  rror occurs..*/.
bae0: 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65  static void vdbe
baf0: 50 6d 61 57 72 69 74 65 42 6c 6f 62 28 50 6d 61  PmaWriteBlob(Pma
bb00: 57 72 69 74 65 72 20 2a 70 2c 20 75 38 20 2a 70  Writer *p, u8 *p
bb10: 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29  Data, int nData)
bb20: 7b 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 6e  {.  int nRem = n
bb30: 44 61 74 61 3b 0a 20 20 77 68 69 6c 65 28 20 6e  Data;.  while( n
bb40: 52 65 6d 3e 30 20 26 26 20 70 2d 3e 65 46 57 45  Rem>0 && p->eFWE
bb50: 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  rr==0 ){.    int
bb60: 20 6e 43 6f 70 79 20 3d 20 6e 52 65 6d 3b 0a 20   nCopy = nRem;. 
bb70: 20 20 20 69 66 28 20 6e 43 6f 70 79 3e 28 70 2d     if( nCopy>(p-
bb80: 3e 6e 42 75 66 66 65 72 20 2d 20 70 2d 3e 69 42  >nBuffer - p->iB
bb90: 75 66 45 6e 64 29 20 29 7b 0a 20 20 20 20 20 20  ufEnd) ){.      
bba0: 6e 43 6f 70 79 20 3d 20 70 2d 3e 6e 42 75 66 66  nCopy = p->nBuff
bbb0: 65 72 20 2d 20 70 2d 3e 69 42 75 66 45 6e 64 3b  er - p->iBufEnd;
bbc0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 6d 63  .    }..    memc
bbd0: 70 79 28 26 70 2d 3e 61 42 75 66 66 65 72 5b 70  py(&p->aBuffer[p
bbe0: 2d 3e 69 42 75 66 45 6e 64 5d 2c 20 26 70 44 61  ->iBufEnd], &pDa
bbf0: 74 61 5b 6e 44 61 74 61 2d 6e 52 65 6d 5d 2c 20  ta[nData-nRem], 
bc00: 6e 43 6f 70 79 29 3b 0a 20 20 20 20 70 2d 3e 69  nCopy);.    p->i
bc10: 42 75 66 45 6e 64 20 2b 3d 20 6e 43 6f 70 79 3b  BufEnd += nCopy;
bc20: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 42 75 66  .    if( p->iBuf
bc30: 45 6e 64 3d 3d 70 2d 3e 6e 42 75 66 66 65 72 20  End==p->nBuffer 
bc40: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 46 57 45  ){.      p->eFWE
bc50: 72 72 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rr = sqlite3OsWr
bc60: 69 74 65 28 70 2d 3e 70 46 64 2c 20 0a 20 20 20  ite(p->pFd, .   
bc70: 20 20 20 20 20 20 20 26 70 2d 3e 61 42 75 66 66         &p->aBuff
bc80: 65 72 5b 70 2d 3e 69 42 75 66 53 74 61 72 74 5d  er[p->iBufStart]
bc90: 2c 20 70 2d 3e 69 42 75 66 45 6e 64 20 2d 20 70  , p->iBufEnd - p
bca0: 2d 3e 69 42 75 66 53 74 61 72 74 2c 20 0a 20 20  ->iBufStart, .  
bcb0: 20 20 20 20 20 20 20 20 70 2d 3e 69 57 72 69 74          p->iWrit
bcc0: 65 4f 66 66 20 2b 20 70 2d 3e 69 42 75 66 53 74  eOff + p->iBufSt
bcd0: 61 72 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  art.      );.   
bce0: 20 20 20 70 2d 3e 69 42 75 66 53 74 61 72 74 20     p->iBufStart 
bcf0: 3d 20 70 2d 3e 69 42 75 66 45 6e 64 20 3d 20 30  = p->iBufEnd = 0
bd00: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 57 72 69 74  ;.      p->iWrit
bd10: 65 4f 66 66 20 2b 3d 20 70 2d 3e 6e 42 75 66 66  eOff += p->nBuff
bd20: 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  er;.    }.    as
bd30: 73 65 72 74 28 20 70 2d 3e 69 42 75 66 45 6e 64  sert( p->iBufEnd
bd40: 3c 70 2d 3e 6e 42 75 66 66 65 72 20 29 3b 0a 0a  <p->nBuffer );..
bd50: 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 43 6f 70      nRem -= nCop
bd60: 79 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  y;.  }.}../*.** 
bd70: 46 6c 75 73 68 20 61 6e 79 20 62 75 66 66 65 72  Flush any buffer
bd80: 65 64 20 64 61 74 61 20 74 6f 20 64 69 73 6b 20  ed data to disk 
bd90: 61 6e 64 20 63 6c 65 61 6e 20 75 70 20 74 68 65  and clean up the
bda0: 20 50 4d 41 2d 77 72 69 74 65 72 20 6f 62 6a 65   PMA-writer obje
bdb0: 63 74 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  ct..** The resul
bdc0: 74 73 20 6f 66 20 75 73 69 6e 67 20 74 68 65 20  ts of using the 
bdd0: 50 4d 41 2d 77 72 69 74 65 72 20 61 66 74 65 72  PMA-writer after
bde0: 20 74 68 69 73 20 63 61 6c 6c 20 61 72 65 20 75   this call are u
bdf0: 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 20 52 65 74  ndefined..** Ret
be00: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
be10: 20 66 6c 75 73 68 69 6e 67 20 74 68 65 20 62 75   flushing the bu
be20: 66 66 65 72 65 64 20 64 61 74 61 20 73 75 63 63  ffered data succ
be30: 65 65 64 73 20 6f 72 20 69 73 20 6e 6f 74 20 0a  eeds or is not .
be40: 2a 2a 20 72 65 71 75 69 72 65 64 2e 20 4f 74 68  ** required. Oth
be50: 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61  erwise, return a
be60: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
be70: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72  ode..**.** Befor
be80: 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 73 65 74  e returning, set
be90: 20 2a 70 69 45 6f 66 20 74 6f 20 74 68 65 20 6f   *piEof to the o
bea0: 66 66 73 65 74 20 69 6d 6d 65 64 69 61 74 65 6c  ffset immediatel
beb0: 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 0a  y following the.
bec0: 2a 2a 20 6c 61 73 74 20 62 79 74 65 20 77 72 69  ** last byte wri
bed0: 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65  tten to the file
bee0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bef0: 76 64 62 65 50 6d 61 57 72 69 74 65 72 46 69 6e  vdbePmaWriterFin
bf00: 69 73 68 28 50 6d 61 57 72 69 74 65 72 20 2a 70  ish(PmaWriter *p
bf10: 2c 20 69 36 34 20 2a 70 69 45 6f 66 29 7b 0a 20  , i64 *piEof){. 
bf20: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
bf30: 2d 3e 65 46 57 45 72 72 3d 3d 30 20 26 26 20 41  ->eFWErr==0 && A
bf40: 4c 57 41 59 53 28 70 2d 3e 61 42 75 66 66 65 72  LWAYS(p->aBuffer
bf50: 29 20 26 26 20 70 2d 3e 69 42 75 66 45 6e 64 3e  ) && p->iBufEnd>
bf60: 70 2d 3e 69 42 75 66 53 74 61 72 74 20 29 7b 0a  p->iBufStart ){.
bf70: 20 20 20 20 70 2d 3e 65 46 57 45 72 72 20 3d 20      p->eFWErr = 
bf80: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
bf90: 2d 3e 70 46 64 2c 20 0a 20 20 20 20 20 20 20 20  ->pFd, .        
bfa0: 26 70 2d 3e 61 42 75 66 66 65 72 5b 70 2d 3e 69  &p->aBuffer[p->i
bfb0: 42 75 66 53 74 61 72 74 5d 2c 20 70 2d 3e 69 42  BufStart], p->iB
bfc0: 75 66 45 6e 64 20 2d 20 70 2d 3e 69 42 75 66 53  ufEnd - p->iBufS
bfd0: 74 61 72 74 2c 20 0a 20 20 20 20 20 20 20 20 70  tart, .        p
bfe0: 2d 3e 69 57 72 69 74 65 4f 66 66 20 2b 20 70 2d  ->iWriteOff + p-
bff0: 3e 69 42 75 66 53 74 61 72 74 0a 20 20 20 20 29  >iBufStart.    )
c000: 3b 0a 20 20 7d 0a 20 20 2a 70 69 45 6f 66 20 3d  ;.  }.  *piEof =
c010: 20 28 70 2d 3e 69 57 72 69 74 65 4f 66 66 20 2b   (p->iWriteOff +
c020: 20 70 2d 3e 69 42 75 66 45 6e 64 29 3b 0a 20 20   p->iBufEnd);.  
c030: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
c040: 61 42 75 66 66 65 72 29 3b 0a 20 20 72 63 20 3d  aBuffer);.  rc =
c050: 20 70 2d 3e 65 46 57 45 72 72 3b 0a 20 20 6d 65   p->eFWErr;.  me
c060: 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
c070: 66 28 50 6d 61 57 72 69 74 65 72 29 29 3b 0a 20  f(PmaWriter));. 
c080: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
c090: 2a 0a 2a 2a 20 57 72 69 74 65 20 76 61 6c 75 65  *.** Write value
c0a0: 20 69 56 61 6c 20 65 6e 63 6f 64 65 64 20 61 73   iVal encoded as
c0b0: 20 61 20 76 61 72 69 6e 74 20 74 6f 20 74 68 65   a varint to the
c0c0: 20 50 4d 41 2e 20 52 65 74 75 72 6e 20 0a 2a 2a   PMA. Return .**
c0d0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
c0e0: 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20  ccessful, or an 
c0f0: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
c100: 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  e if an error oc
c110: 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  curs..*/.static 
c120: 76 6f 69 64 20 76 64 62 65 50 6d 61 57 72 69 74  void vdbePmaWrit
c130: 65 56 61 72 69 6e 74 28 50 6d 61 57 72 69 74 65  eVarint(PmaWrite
c140: 72 20 2a 70 2c 20 75 36 34 20 69 56 61 6c 29 7b  r *p, u64 iVal){
c150: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 0a 20  .  int nByte; . 
c160: 20 75 38 20 61 42 79 74 65 5b 31 30 5d 3b 0a 20   u8 aByte[10];. 
c170: 20 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33   nByte = sqlite3
c180: 50 75 74 56 61 72 69 6e 74 28 61 42 79 74 65 2c  PutVarint(aByte,
c190: 20 69 56 61 6c 29 3b 0a 20 20 76 64 62 65 50 6d   iVal);.  vdbePm
c1a0: 61 57 72 69 74 65 42 6c 6f 62 28 70 2c 20 61 42  aWriteBlob(p, aB
c1b0: 79 74 65 2c 20 6e 42 79 74 65 29 3b 0a 7d 0a 0a  yte, nByte);.}..
c1c0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
c1d0: 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73  current contents
c1e0: 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 6c 69   of in-memory li
c1f0: 6e 6b 65 64 2d 6c 69 73 74 20 70 4c 69 73 74 20  nked-list pList 
c200: 74 6f 20 61 20 6c 65 76 65 6c 2d 30 0a 2a 2a 20  to a level-0.** 
c210: 50 4d 41 20 69 6e 20 74 68 65 20 74 65 6d 70 20  PMA in the temp 
c220: 66 69 6c 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74  file belonging t
c230: 6f 20 73 75 62 2d 74 61 73 6b 20 70 54 61 73 6b  o sub-task pTask
c240: 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
c250: 4f 4b 20 69 66 20 0a 2a 2a 20 73 75 63 63 65 73  OK if .** succes
c260: 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69  sful, or an SQLi
c270: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  te error code ot
c280: 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  herwise..**.** T
c290: 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 61 20 50  he format of a P
c2a0: 4d 41 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  MA is:.**.**    
c2b0: 20 2a 20 41 20 76 61 72 69 6e 74 2e 20 54 68 69   * A varint. Thi
c2c0: 73 20 76 61 72 69 6e 74 20 63 6f 6e 74 61 69 6e  s varint contain
c2d0: 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
c2e0: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63  er of bytes of c
c2f0: 6f 6e 74 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  ontent.**       
c300: 69 6e 20 74 68 65 20 50 4d 41 20 28 6e 6f 74 20  in the PMA (not 
c310: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 76 61  including the va
c320: 72 69 6e 74 20 69 74 73 65 6c 66 29 2e 0a 2a 2a  rint itself)..**
c330: 0a 2a 2a 20 20 20 20 20 2a 20 4f 6e 65 20 6f 72  .**     * One or
c340: 20 6d 6f 72 65 20 72 65 63 6f 72 64 73 20 70 61   more records pa
c350: 63 6b 65 64 20 65 6e 64 2d 74 6f 2d 65 6e 64 20  cked end-to-end 
c360: 69 6e 20 6f 72 64 65 72 20 6f 66 20 61 73 63 65  in order of asce
c370: 6e 64 69 6e 67 20 6b 65 79 73 2e 20 0a 2a 2a 20  nding keys. .** 
c380: 20 20 20 20 20 20 45 61 63 68 20 72 65 63 6f 72        Each recor
c390: 64 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  d consists of a 
c3a0: 76 61 72 69 6e 74 20 66 6f 6c 6c 6f 77 65 64 20  varint followed 
c3b0: 62 79 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74  by a blob of dat
c3c0: 61 20 28 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  a (the .**      
c3d0: 20 6b 65 79 29 2e 20 54 68 65 20 76 61 72 69 6e   key). The varin
c3e0: 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  t is the number 
c3f0: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
c400: 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 0a 2a 2f  blob of data..*/
c410: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
c420: 53 6f 72 74 65 72 4c 69 73 74 54 6f 50 4d 41 28  SorterListToPMA(
c430: 53 6f 72 74 53 75 62 74 61 73 6b 20 2a 70 54 61  SortSubtask *pTa
c440: 73 6b 2c 20 53 6f 72 74 65 72 4c 69 73 74 20 2a  sk, SorterList *
c450: 70 4c 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65  pList){.  sqlite
c460: 33 20 2a 64 62 20 3d 20 70 54 61 73 6b 2d 3e 70  3 *db = pTask->p
c470: 53 6f 72 74 65 72 2d 3e 64 62 3b 0a 20 20 69 6e  Sorter->db;.  in
c480: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c490: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
c4a0: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
c4b0: 20 20 50 6d 61 57 72 69 74 65 72 20 77 72 69 74    PmaWriter writ
c4c0: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
c4d0: 20 20 2f 2a 20 4f 62 6a 65 63 74 20 75 73 65 64    /* Object used
c4e0: 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
c4f0: 20 66 69 6c 65 20 2a 2f 0a 0a 23 69 66 64 65 66   file */..#ifdef
c500: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
c510: 2f 2a 20 53 65 74 20 69 53 7a 20 74 6f 20 74 68  /* Set iSz to th
c520: 65 20 65 78 70 65 63 74 65 64 20 73 69 7a 65 20  e expected size 
c530: 6f 66 20 66 69 6c 65 20 70 54 61 73 6b 2d 3e 66  of file pTask->f
c540: 69 6c 65 20 61 66 74 65 72 20 77 72 69 74 69 6e  ile after writin
c550: 67 20 74 68 65 20 50 4d 41 2e 20 0a 20 20 2a 2a  g the PMA. .  **
c560: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79   This is used by
c570: 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61   an assert() sta
c580: 74 65 6d 65 6e 74 20 61 74 20 74 68 65 20 65 6e  tement at the en
c590: 64 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  d of this functi
c5a0: 6f 6e 2e 20 20 2a 2f 0a 20 20 69 36 34 20 69 53  on.  */.  i64 iS
c5b0: 7a 20 3d 20 70 4c 69 73 74 2d 3e 73 7a 50 4d 41  z = pList->szPMA
c5c0: 20 2b 20 73 71 6c 69 74 65 33 56 61 72 69 6e 74   + sqlite3Varint
c5d0: 4c 65 6e 28 70 4c 69 73 74 2d 3e 73 7a 50 4d 41  Len(pList->szPMA
c5e0: 29 20 2b 20 70 54 61 73 6b 2d 3e 66 69 6c 65 2e  ) + pTask->file.
c5f0: 69 45 6f 66 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  iEof;.#endif..  
c600: 76 64 62 65 53 6f 72 74 65 72 57 6f 72 6b 44 65  vdbeSorterWorkDe
c610: 62 75 67 28 70 54 61 73 6b 2c 20 22 65 6e 74 65  bug(pTask, "ente
c620: 72 22 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77  r");.  memset(&w
c630: 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  riter, 0, sizeof
c640: 28 50 6d 61 57 72 69 74 65 72 29 29 3b 0a 20 20  (PmaWriter));.  
c650: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 73  assert( pList->s
c660: 7a 50 4d 41 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20  zPMA>0 );..  /* 
c670: 49 66 20 74 68 65 20 66 69 72 73 74 20 74 65 6d  If the first tem
c680: 70 6f 72 61 72 79 20 50 4d 41 20 66 69 6c 65 20  porary PMA file 
c690: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6f 70 65  has not been ope
c6a0: 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77  ned, open it now
c6b0: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 73 6b  . */.  if( pTask
c6c0: 2d 3e 66 69 6c 65 2e 70 46 64 3d 3d 30 20 29 7b  ->file.pFd==0 ){
c6d0: 0a 20 20 20 20 72 63 20 3d 20 76 64 62 65 53 6f  .    rc = vdbeSo
c6e0: 72 74 65 72 4f 70 65 6e 54 65 6d 70 46 69 6c 65  rterOpenTempFile
c6f0: 28 64 62 2c 20 30 2c 20 26 70 54 61 73 6b 2d 3e  (db, 0, &pTask->
c700: 66 69 6c 65 2e 70 46 64 29 3b 0a 20 20 20 20 61  file.pFd);.    a
c710: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
c720: 45 5f 4f 4b 20 7c 7c 20 70 54 61 73 6b 2d 3e 66  E_OK || pTask->f
c730: 69 6c 65 2e 70 46 64 20 29 3b 0a 20 20 20 20 61  ile.pFd );.    a
c740: 73 73 65 72 74 28 20 70 54 61 73 6b 2d 3e 66 69  ssert( pTask->fi
c750: 6c 65 2e 69 45 6f 66 3d 3d 30 20 29 3b 0a 20 20  le.iEof==0 );.  
c760: 20 20 61 73 73 65 72 74 28 20 70 54 61 73 6b 2d    assert( pTask-
c770: 3e 6e 50 4d 41 3d 3d 30 20 29 3b 0a 20 20 7d 0a  >nPMA==0 );.  }.
c780: 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 67 65 74  .  /* Try to get
c790: 20 74 68 65 20 66 69 6c 65 20 74 6f 20 6d 65 6d   the file to mem
c7a0: 6f 72 79 20 6d 61 70 20 2a 2f 0a 20 20 69 66 28  ory map */.  if(
c7b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
c7c0: 7b 0a 20 20 20 20 76 64 62 65 53 6f 72 74 65 72  {.    vdbeSorter
c7d0: 45 78 74 65 6e 64 46 69 6c 65 28 64 62 2c 20 70  ExtendFile(db, p
c7e0: 54 61 73 6b 2d 3e 66 69 6c 65 2e 70 46 64 2c 20  Task->file.pFd, 
c7f0: 70 54 61 73 6b 2d 3e 66 69 6c 65 2e 69 45 6f 66  pTask->file.iEof
c800: 2b 70 4c 69 73 74 2d 3e 73 7a 50 4d 41 2b 39 29  +pList->szPMA+9)
c810: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 6f 72 74  ;.  }..  /* Sort
c820: 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69   the list */.  i
c830: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c840: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 76 64 62   ){.    rc = vdb
c850: 65 53 6f 72 74 65 72 53 6f 72 74 28 70 54 61 73  eSorterSort(pTas
c860: 6b 2c 20 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a  k, pList);.  }..
c870: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c880: 5f 4f 4b 20 29 7b 0a 20 20 20 20 53 6f 72 74 65  _OK ){.    Sorte
c890: 72 52 65 63 6f 72 64 20 2a 70 3b 0a 20 20 20 20  rRecord *p;.    
c8a0: 53 6f 72 74 65 72 52 65 63 6f 72 64 20 2a 70 4e  SorterRecord *pN
c8b0: 65 78 74 20 3d 20 30 3b 0a 0a 20 20 20 20 76 64  ext = 0;..    vd
c8c0: 62 65 50 6d 61 57 72 69 74 65 72 49 6e 69 74 28  bePmaWriterInit(
c8d0: 70 54 61 73 6b 2d 3e 66 69 6c 65 2e 70 46 64 2c  pTask->file.pFd,
c8e0: 20 26 77 72 69 74 65 72 2c 20 70 54 61 73 6b 2d   &writer, pTask-
c8f0: 3e 70 53 6f 72 74 65 72 2d 3e 70 67 73 7a 2c 0a  >pSorter->pgsz,.
c900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c910: 20 20 20 20 20 20 70 54 61 73 6b 2d 3e 66 69 6c        pTask->fil
c920: 65 2e 69 45 6f 66 29 3b 0a 20 20 20 20 70 54 61  e.iEof);.    pTa
c930: 73 6b 2d 3e 6e 50 4d 41 2b 2b 3b 0a 20 20 20 20  sk->nPMA++;.    
c940: 76 64 62 65 50 6d 61 57 72 69 74 65 56 61 72 69  vdbePmaWriteVari
c950: 6e 74 28 26 77 72 69 74 65 72 2c 20 70 4c 69 73  nt(&writer, pLis
c960: 74 2d 3e 73 7a 50 4d 41 29 3b 0a 20 20 20 20 66  t->szPMA);.    f
c970: 6f 72 28 70 3d 70 4c 69 73 74 2d 3e 70 4c 69 73  or(p=pList->pLis
c980: 74 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a  t; p; p=pNext){.
c990: 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d        pNext = p-
c9a0: 3e 75 2e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  >u.pNext;.      
c9b0: 76 64 62 65 50 6d 61 57 72 69 74 65 56 61 72 69  vdbePmaWriteVari
c9c0: 6e 74 28 26 77 72 69 74 65 72 2c 20 70 2d 3e 6e  nt(&writer, p->n
c9d0: 56 61 6c 29 3b 0a 20 20 20 20 20 20 76 64 62 65  Val);.      vdbe
c9e0: 50 6d 61 57 72 69 74 65 42 6c 6f 62 28 26 77 72  PmaWriteBlob(&wr
c9f0: 69 74 65 72 2c 20 53 52 56 41 4c 28 70 29 2c 20  iter, SRVAL(p), 
ca00: 70 2d 3e 6e 56 61 6c 29 3b 0a 20 20 20 20 20 20  p->nVal);.      
ca10: 69 66 28 20 70 4c 69 73 74 2d 3e 61 4d 65 6d 6f  if( pList->aMemo
ca20: 72 79 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 5f  ry==0 ) sqlite3_
ca30: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 7d 0a 20  free(p);.    }. 
ca40: 20 20 20 70 4c 69 73 74 2d 3e 70 4c 69 73 74 20     pList->pList 
ca50: 3d 20 70 3b 0a 20 20 20 20 72 63 20 3d 20 76 64  = p;.    rc = vd
ca60: 62 65 50 6d 61 57 72 69 74 65 72 46 69 6e 69 73  bePmaWriterFinis
ca70: 68 28 26 77 72 69 74 65 72 2c 20 26 70 54 61 73  h(&writer, &pTas
ca80: 6b 2d 3e 66 69 6c 65 2e 69 45 6f 66 29 3b 0a 20  k->file.iEof);. 
ca90: 20 7d 0a 0a 20 20 76 64 62 65 53 6f 72 74 65 72   }..  vdbeSorter
caa0: 57 6f 72 6b 44 65 62 75 67 28 70 54 61 73 6b 2c  WorkDebug(pTask,
cab0: 20 22 65 78 69 74 22 29 3b 0a 20 20 61 73 73 65   "exit");.  asse
cac0: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
cad0: 4b 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 4c 69 73  K || pList->pLis
cae0: 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t==0 );.  assert
caf0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
cb00: 7c 7c 20 70 54 61 73 6b 2d 3e 66 69 6c 65 2e 69  || pTask->file.i
cb10: 45 6f 66 3d 3d 69 53 7a 20 29 3b 0a 20 20 72 65  Eof==iSz );.  re
cb20: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
cb30: 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 4d 65  * Advance the Me
cb40: 72 67 65 45 6e 67 69 6e 65 20 74 6f 20 69 74 73  rgeEngine to its
cb50: 20 6e 65 78 74 20 65 6e 74 72 79 2e 0a 2a 2a 20   next entry..** 
cb60: 53 65 74 20 2a 70 62 45 6f 66 20 74 6f 20 74 72  Set *pbEof to tr
cb70: 75 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  ue there is no n
cb80: 65 78 74 20 65 6e 74 72 79 20 62 65 63 61 75 73  ext entry becaus
cb90: 65 0a 2a 2a 20 74 68 65 20 4d 65 72 67 65 45 6e  e.** the MergeEn
cba0: 67 69 6e 65 20 68 61 73 20 72 65 61 63 68 65 64  gine has reached
cbb0: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6c 6c 20   the end of all 
cbc0: 69 74 73 20 69 6e 70 75 74 73 2e 0a 2a 2a 0a 2a  its inputs..**.*
cbd0: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
cbe0: 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
cbf0: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
cc00: 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  e if an error oc
cc10: 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  curs..*/.static 
cc20: 69 6e 74 20 76 64 62 65 4d 65 72 67 65 45 6e 67  int vdbeMergeEng
cc30: 69 6e 65 53 74 65 70 28 0a 20 20 4d 65 72 67 65  ineStep(.  Merge
cc40: 45 6e 67 69 6e 65 20 2a 70 4d 65 72 67 65 72 2c  Engine *pMerger,
cc50: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 65 72        /* The mer
cc60: 67 65 20 65 6e 67 69 6e 65 20 74 6f 20 61 64 76  ge engine to adv
cc70: 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
cc80: 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   row */.  int *p
cc90: 62 45 6f 66 20 20 20 20 20 20 20 20 20 20 20 20  bEof            
cca0: 20 20 20 20 20 2f 2a 20 53 65 74 20 54 52 55 45       /* Set TRUE
ccb0: 20 61 74 20 45 4f 46 2e 20 20 53 65 74 20 66 61   at EOF.  Set fa
ccc0: 6c 73 65 20 66 6f 72 20 6d 6f 72 65 20 63 6f 6e  lse for more con
ccd0: 74 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  tent */.){.  int
cce0: 20 72 63 3b 0a 20 20 69 6e 74 20 69 50 72 65 76   rc;.  int iPrev
ccf0: 20 3d 20 70 4d 65 72 67 65 72 2d 3e 61 54 72 65   = pMerger->aTre
cd00: 65 5b 31 5d 3b 2f 2a 20 49 6e 64 65 78 20 6f 66  e[1];/* Index of
cd10: 20 50 6d 61 52 65 61 64 65 72 20 74 6f 20 61 64   PmaReader to ad
cd20: 76 61 6e 63 65 20 2a 2f 0a 20 20 53 6f 72 74 53  vance */.  SortS
cd30: 75 62 74 61 73 6b 20 2a 70 54 61 73 6b 20 3d 20  ubtask *pTask = 
cd40: 70 4d 65 72 67 65 72 2d 3e 70 54 61 73 6b 3b 0a  pMerger->pTask;.
cd50: 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 74 68  .  /* Advance th
cd60: 65 20 63 75 72 72 65 6e 74 20 50 6d 61 52 65 61  e current PmaRea
cd70: 64 65 72 20 2a 2f 0a 20 20 72 63 20 3d 20 76 64  der */.  rc = vd
cd80: 62 65 50 6d 61 52 65 61 64 65 72 4e 65 78 74 28  bePmaReaderNext(
cd90: 26 70 4d 65 72 67 65 72 2d 3e 61 52 65 61 64 72  &pMerger->aReadr
cda0: 5b 69 50 72 65 76 5d 29 3b 0a 0a 20 20 2f 2a 20  [iPrev]);..  /* 
cdb0: 55 70 64 61 74 65 20 63 6f 6e 74 65 6e 74 73 20  Update contents 
cdc0: 6f 66 20 61 54 72 65 65 5b 5d 20 2a 2f 0a 20 20  of aTree[] */.  
cdd0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
cde0: 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20  K ){.    int i; 
cdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce00: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
ce10: 20 61 54 72 65 65 5b 5d 20 74 6f 20 72 65 63 61   aTree[] to reca
ce20: 6c 63 75 6c 61 74 65 20 2a 2f 0a 20 20 20 20 50  lculate */.    P
ce30: 6d 61 52 65 61 64 65 72 20 2a 70 52 65 61 64 72  maReader *pReadr
ce40: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  1;         /* Fi
ce50: 72 73 74 20 50 6d 61 52 65 61 64 65 72 20 74 6f  rst PmaReader to
ce60: 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 20 20   compare */.    
ce70: 50 6d 61 52 65 61 64 65 72 20 2a 70 52 65 61 64  PmaReader *pRead
ce80: 72 32 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  r2;         /* S
ce90: 65 63 6f 6e 64 20 50 6d 61 52 65 61 64 65 72 20  econd PmaReader 
cea0: 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20  to compare */.  
ceb0: 20 20 75 38 20 2a 70 4b 65 79 32 3b 20 20 20 20    u8 *pKey2;    
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ced0: 20 54 6f 20 70 52 65 61 64 72 32 2d 3e 61 4b 65   To pReadr2->aKe
cee0: 79 2c 20 6f 72 20 30 20 69 66 20 72 65 63 6f 72  y, or 0 if recor
cef0: 64 20 63 61 63 68 65 64 20 2a 2f 0a 0a 20 20 20  d cached */..   
cf00: 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 66 69 72   /* Find the fir
cf10: 73 74 20 74 77 6f 20 50 6d 61 52 65 61 64 65 72  st two PmaReader
cf20: 73 20 74 6f 20 63 6f 6d 70 61 72 65 2e 20 54 68  s to compare. Th
cf30: 65 20 6f 6e 65 20 74 68 61 74 20 77 61 73 20 6a  e one that was j
cf40: 75 73 74 0a 20 20 20 20 2a 2a 20 61 64 76 61 6e  ust.    ** advan
cf50: 63 65 64 20 28 69 50 72 65 76 29 20 61 6e 64 20  ced (iPrev) and 
cf60: 74 68 65 20 6f 6e 65 20 6e 65 78 74 20 74 6f 20  the one next to 
cf70: 69 74 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e  it in the array.
cf80: 20 20 2a 2f 0a 20 20 20 20 70 52 65 61 64 72 31    */.    pReadr1
cf90: 20 3d 20 26 70 4d 65 72 67 65 72 2d 3e 61 52 65   = &pMerger->aRe
cfa0: 61 64 72 5b 28 69 50 72 65 76 20 26 20 30 78 46  adr[(iPrev & 0xF
cfb0: 46 46 45 29 5d 3b 0a 20 20 20 20 70 52 65 61 64  FFE)];.    pRead
cfc0: 72 32 20 3d 20 26 70 4d 65 72 67 65 72 2d 3e 61  r2 = &pMerger->a
cfd0: 52 65 61 64 72 5b 28 69 50 72 65 76 20 7c 20 30  Readr[(iPrev | 0
cfe0: 78 30 30 30 31 29 5d 3b 0a 20 20 20 20 70 4b 65  x0001)];.    pKe
cff0: 79 32 20 3d 20 70 52 65 61 64 72 32 2d 3e 61 4b  y2 = pReadr2->aK
d000: 65 79 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 28  ey;..    for(i=(
d010: 70 4d 65 72 67 65 72 2d 3e 6e 54 72 65 65 2b 69  pMerger->nTree+i
d020: 50 72 65 76 29 2f 32 3b 20 69 3e 30 3b 20 69 3d  Prev)/2; i>0; i=
d030: 69 2f 32 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  i/2){.      /* C
d040: 6f 6d 70 61 72 65 20 70 52 65 61 64 72 31 20 61  ompare pReadr1 a
d050: 6e 64 20 70 52 65 61 64 72 32 2e 20 53 74 6f 72  nd pReadr2. Stor
d060: 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
d070: 76 61 72 69 61 62 6c 65 20 69 52 65 73 2e 20 2a  variable iRes. *
d080: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 52 65 73  /.      int iRes
d090: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 61  ;.      if( pRea
d0a0: 64 72 31 2d 3e 70 46 64 3d 3d 30 20 29 7b 0a 20  dr1->pFd==0 ){. 
d0b0: 20 20 20 20 20 20 20 69 52 65 73 20 3d 20 2b 31         iRes = +1
d0c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
d0d0: 28 20 70 52 65 61 64 72 32 2d 3e 70 46 64 3d 3d  ( pReadr2->pFd==
d0e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 52 65  0 ){.        iRe
d0f0: 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  s = -1;.      }e
d100: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 52 65  lse{.        iRe
d110: 73 20 3d 20 76 64 62 65 53 6f 72 74 65 72 43 6f  s = vdbeSorterCo
d120: 6d 70 61 72 65 28 70 54 61 73 6b 2c 20 0a 20 20  mpare(pTask, .  
d130: 20 20 20 20 20 20 20 20 20 20 70 52 65 61 64 72            pReadr
d140: 31 2d 3e 61 4b 65 79 2c 20 70 52 65 61 64 72 31  1->aKey, pReadr1
d150: 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 32 2c 20 70  ->nKey, pKey2, p
d160: 52 65 61 64 72 32 2d 3e 6e 4b 65 79 0a 20 20 20  Readr2->nKey.   
d170: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
d180: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 52 65  .      /* If pRe
d190: 61 64 72 31 20 63 6f 6e 74 61 69 6e 65 64 20 74  adr1 contained t
d1a0: 68 65 20 73 6d 61 6c 6c 65 72 20 76 61 6c 75 65  he smaller value
d1b0: 2c 20 73 65 74 20 61 54 72 65 65 5b 69 5d 20 74  , set aTree[i] t
d1c0: 6f 20 69 74 73 20 69 6e 64 65 78 2e 0a 20 20 20  o its index..   
d1d0: 20 20 20 2a 2a 20 54 68 65 6e 20 73 65 74 20 70     ** Then set p
d1e0: 52 65 61 64 72 32 20 74 6f 20 74 68 65 20 6e 65  Readr2 to the ne
d1f0: 78 74 20 50 6d 61 52 65 61 64 65 72 20 74 6f 20  xt PmaReader to 
d200: 63 6f 6d 70 61 72 65 20 74 6f 20 70 52 65 61 64  compare to pRead
d210: 72 31 2e 20 49 6e 20 74 68 69 73 0a 20 20 20 20  r1. In this.    
d220: 20 20 2a 2a 20 63 61 73 65 20 74 68 65 72 65 20    ** case there 
d230: 69 73 20 6e 6f 20 63 61 63 68 65 20 6f 66 20 70  is no cache of p
d240: 52 65 61 64 72 32 20 69 6e 20 70 54 61 73 6b 2d  Readr2 in pTask-
d250: 3e 70 55 6e 70 61 63 6b 65 64 2c 20 73 6f 20 73  >pUnpacked, so s
d260: 65 74 0a 20 20 20 20 20 20 2a 2a 20 70 4b 65 79  et.      ** pKey
d270: 32 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  2 to point to th
d280: 65 20 72 65 63 6f 72 64 20 62 65 6c 6f 6e 67 69  e record belongi
d290: 6e 67 20 74 6f 20 70 52 65 61 64 72 32 2e 0a 20  ng to pReadr2.. 
d2a0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
d2b0: 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20   Alternatively, 
d2c0: 69 66 20 70 52 65 61 64 72 32 20 63 6f 6e 74 61  if pReadr2 conta
d2d0: 69 6e 73 20 74 68 65 20 73 6d 61 6c 6c 65 72 20  ins the smaller 
d2e0: 6f 66 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65  of the two value
d2f0: 73 2c 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20  s,.      ** set 
d300: 61 54 72 65 65 5b 69 5d 20 74 6f 20 69 74 73 20  aTree[i] to its 
d310: 69 6e 64 65 78 20 61 6e 64 20 75 70 64 61 74 65  index and update
d320: 20 70 52 65 61 64 72 31 2e 20 49 66 20 76 64 62   pReadr1. If vdb
d330: 65 53 6f 72 74 65 72 43 6f 6d 70 61 72 65 28 29  eSorterCompare()
d340: 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20 61 63  .      ** was ac
d350: 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20 61 62  tually called ab
d360: 6f 76 65 2c 20 74 68 65 6e 20 70 54 61 73 6b 2d  ove, then pTask-
d370: 3e 70 55 6e 70 61 63 6b 65 64 20 6e 6f 77 20 63  >pUnpacked now c
d380: 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a  ontains.      **
d390: 20 61 20 76 61 6c 75 65 20 65 71 75 69 76 61 6c   a value equival
d3a0: 65 6e 74 20 74 6f 20 70 52 65 61 64 72 32 2e 20  ent to pReadr2. 
d3b0: 53 6f 20 73 65 74 20 70 4b 65 79 32 20 74 6f 20  So set pKey2 to 
d3c0: 4e 55 4c 4c 20 74 6f 20 70 72 65 76 65 6e 74 0a  NULL to prevent.
d3d0: 20 20 20 20 20 20 2a 2a 20 76 64 62 65 53 6f 72        ** vdbeSor
d3e0: 74 65 72 43 6f 6d 70 61 72 65 28 29 20 66 72 6f  terCompare() fro
d3f0: 6d 20 64 65 63 6f 64 69 6e 67 20 70 52 65 61 64  m decoding pRead
d400: 72 32 20 61 67 61 69 6e 2e 0a 20 20 20 20 20 20  r2 again..      
d410: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
d420: 68 65 20 74 77 6f 20 76 61 6c 75 65 73 20 77 65  he two values we
d430: 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 74  re equal, then t
d440: 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  he value from th
d450: 65 20 6f 6c 64 65 73 74 0a 20 20 20 20 20 20 2a  e oldest.      *
d460: 2a 20 50 4d 41 20 73 68 6f 75 6c 64 20 62 65 20  * PMA should be 
d470: 63 6f 6e 73 69 64 65 72 65 64 20 73 6d 61 6c 6c  considered small
d480: 65 72 2e 20 54 68 65 20 56 64 62 65 53 6f 72 74  er. The VdbeSort
d490: 65 72 2e 61 52 65 61 64 72 5b 5d 20 61 72 72 61  er.aReadr[] arra
d4a0: 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 6f  y.      ** is so
d4b0: 72 74 65 64 20 66 72 6f 6d 20 6f 6c 64 65 73 74  rted from oldest
d4c0: 20 74 6f 20 6e 65 77 65 73 74 2c 20 73 6f 20 70   to newest, so p
d4d0: 52 65 61 64 72 31 20 63 6f 6e 74 61 69 6e 73 20  Readr1 contains 
d4e0: 6f 6c 64 65 72 20 76 61 6c 75 65 73 0a 20 20 20  older values.   
d4f0: 20 20 20 2a 2a 20 74 68 61 6e 20 70 52 65 61 64     ** than pRead
d500: 72 32 20 69 66 66 20 28 70 52 65 61 64 72 31 3c  r2 iff (pReadr1<
d510: 70 52 65 61 64 72 32 29 2e 20 20 2a 2f 0a 20 20  pReadr2).  */.  
d520: 20 20 20 20 69 66 28 20 69 52 65 73 3c 30 20 7c      if( iRes<0 |
d530: 7c 20 28 69 52 65 73 3d 3d 30 20 26 26 20 70 52  | (iRes==0 && pR
d540: 65 61 64 72 31 3c 70 52 65 61 64 72 32 29 20 29  eadr1<pReadr2) )
d550: 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 72 67 65  {.        pMerge
d560: 72 2d 3e 61 54 72 65 65 5b 69 5d 20 3d 20 28 69  r->aTree[i] = (i
d570: 6e 74 29 28 70 52 65 61 64 72 31 20 2d 20 70 4d  nt)(pReadr1 - pM
d580: 65 72 67 65 72 2d 3e 61 52 65 61 64 72 29 3b 0a  erger->aReadr);.
d590: 20 20 20 20 20 20 20 20 70 52 65 61 64 72 32 20          pReadr2 
d5a0: 3d 20 26 70 4d 65 72 67 65 72 2d 3e 61 52 65 61  = &pMerger->aRea
d5b0: 64 72 5b 20 70 4d 65 72 67 65 72 2d 3e 61 54 72  dr[ pMerger->aTr
d5c0: 65 65 5b 69 20 5e 20 30 78 30 30 30 31 5d 20 5d  ee[i ^ 0x0001] ]
d5d0: 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 32 20  ;.        pKey2 
d5e0: 3d 20 70 52 65 61 64 72 32 2d 3e 61 4b 65 79 3b  = pReadr2->aKey;
d5f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
d600: 20 20 20 20 20 20 69 66 28 20 70 52 65 61 64 72        if( pReadr
d610: 31 2d 3e 70 46 64 20 29 20 70 4b 65 79 32 20 3d  1->pFd ) pKey2 =
d620: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 72   0;.        pMer
d630: 67 65 72 2d 3e 61 54 72 65 65 5b 69 5d 20 3d 20  ger->aTree[i] = 
d640: 28 69 6e 74 29 28 70 52 65 61 64 72 32 20 2d 20  (int)(pReadr2 - 
d650: 70 4d 65 72 67 65 72 2d 3e 61 52 65 61 64 72 29  pMerger->aReadr)
d660: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 61 64 72  ;.        pReadr
d670: 31 20 3d 20 26 70 4d 65 72 67 65 72 2d 3e 61 52  1 = &pMerger->aR
d680: 65 61 64 72 5b 20 70 4d 65 72 67 65 72 2d 3e 61  eadr[ pMerger->a
d690: 54 72 65 65 5b 69 20 5e 20 30 78 30 30 30 31 5d  Tree[i ^ 0x0001]
d6a0: 20 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   ];.      }.    
d6b0: 7d 0a 20 20 20 20 2a 70 62 45 6f 66 20 3d 20 28  }.    *pbEof = (
d6c0: 70 4d 65 72 67 65 72 2d 3e 61 52 65 61 64 72 5b  pMerger->aReadr[
d6d0: 70 4d 65 72 67 65 72 2d 3e 61 54 72 65 65 5b 31  pMerger->aTree[1
d6e0: 5d 5d 2e 70 46 64 3d 3d 30 29 3b 0a 20 20 7d 0a  ]].pFd==0);.  }.
d6f0: 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
d700: 51 4c 49 54 45 5f 4f 4b 20 3f 20 70 54 61 73 6b  QLITE_OK ? pTask
d710: 2d 3e 70 55 6e 70 61 63 6b 65 64 2d 3e 65 72 72  ->pUnpacked->err
d720: 43 6f 64 65 20 3a 20 72 63 29 3b 0a 7d 0a 0a 23  Code : rc);.}..#
d730: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f  if SQLITE_MAX_WO
d740: 52 4b 45 52 5f 54 48 52 45 41 44 53 3e 30 0a 2f  RKER_THREADS>0./
d750: 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f  *.** The main ro
d760: 75 74 69 6e 65 20 66 6f 72 20 62 61 63 6b 67 72  utine for backgr
d770: 6f 75 6e 64 20 74 68 72 65 61 64 73 20 74 68 61  ound threads tha
d780: 74 20 77 72 69 74 65 20 6c 65 76 65 6c 2d 30 20  t write level-0 
d790: 50 4d 41 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  PMAs..*/.static 
d7a0: 76 6f 69 64 20 2a 76 64 62 65 53 6f 72 74 65 72  void *vdbeSorter
d7b0: 46 6c 75 73 68 54 68 72 65 61 64 28 76 6f 69 64  FlushThread(void
d7c0: 20 2a 70 43 74 78 29 7b 0a 20 20 53 6f 72 74 53   *pCtx){.  SortS
d7d0: 75 62 74 61 73 6b 20 2a 70 54 61 73 6b 20 3d 20  ubtask *pTask = 
d7e0: 28 53 6f 72 74 53 75 62 74 61 73 6b 2a 29 70 43  (SortSubtask*)pC
d7f0: 74 78 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  tx;.  int rc;   
d800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d810: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
d820: 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  code */.  assert
d830: 28 20 70 54 61 73 6b 2d 3e 62 44 6f 6e 65 3d 3d  ( pTask->bDone==
d840: 30 20 29 3b 0a 20 20 72 63 20 3d 20 76 64 62 65  0 );.  rc = vdbe
d850: 53 6f 72 74 65 72 4c 69 73 74 54 6f 50 4d 41 28  SorterListToPMA(
d860: 70 54 61 73 6b 2c 20 26 70 54 61 73 6b 2d 3e 6c  pTask, &pTask->l
d870: 69 73 74 29 3b 0a 20 20 70 54 61 73 6b 2d 3e 62  ist);.  pTask->b
d880: 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 72 65 74 75  Done = 1;.  retu
d890: 72 6e 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  rn SQLITE_INT_TO
d8a0: 5f 50 54 52 28 72 63 29 3b 0a 7d 0a 23 65 6e 64  _PTR(rc);.}.#end
d8b0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58  if /* SQLITE_MAX
d8c0: 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3e  _WORKER_THREADS>
d8d0: 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73  0 */../*.** Flus
d8e0: 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  h the current co
d8f0: 6e 74 65 6e 74 73 20 6f 66 20 56 64 62 65 53 6f  ntents of VdbeSo
d900: 72 74 65 72 2e 6c 69 73 74 20 74 6f 20 61 20 6e  rter.list to a n
d910: 65 77 20 50 4d 41 2c 20 70 6f 73 73 69 62 6c 79  ew PMA, possibly
d920: 0a 2a 2a 20 75 73 69 6e 67 20 61 20 62 61 63 6b  .** using a back
d930: 67 72 6f 75 6e 64 20 74 68 72 65 61 64 2e 0a 2a  ground thread..*
d940: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
d950: 65 53 6f 72 74 65 72 46 6c 75 73 68 50 4d 41 28  eSorterFlushPMA(
d960: 56 64 62 65 53 6f 72 74 65 72 20 2a 70 53 6f 72  VdbeSorter *pSor
d970: 74 65 72 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  ter){.#if SQLITE
d980: 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45  _MAX_WORKER_THRE
d990: 41 44 53 3d 3d 30 0a 20 20 70 53 6f 72 74 65 72  ADS==0.  pSorter
d9a0: 2d 3e 62 55 73 65 50 4d 41 20 3d 20 31 3b 0a 20  ->bUsePMA = 1;. 
d9b0: 20 72 65 74 75 72 6e 20 76 64 62 65 53 6f 72 74   return vdbeSort
d9c0: 65 72 4c 69 73 74 54 6f 50 4d 41 28 26 70 53 6f  erListToPMA(&pSo
d9d0: 72 74 65 72 2d 3e 61 54 61 73 6b 5b 30 5d 2c 20  rter->aTask[0], 
d9e0: 26 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74 29 3b  &pSorter->list);
d9f0: 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 20  .#else.  int rc 
da00: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
da10: 6e 74 20 69 3b 0a 20 20 53 6f 72 74 53 75 62 74  nt i;.  SortSubt
da20: 61 73 6b 20 2a 70 54 61 73 6b 20 3d 20 30 3b 20  ask *pTask = 0; 
da30: 20 20 20 2f 2a 20 54 68 72 65 61 64 20 63 6f 6e     /* Thread con
da40: 74 65 78 74 20 75 73 65 64 20 74 6f 20 63 72 65  text used to cre
da50: 61 74 65 20 6e 65 77 20 50 4d 41 20 2a 2f 0a 20  ate new PMA */. 
da60: 20 69 6e 74 20 6e 57 6f 72 6b 65 72 20 3d 20 28   int nWorker = (
da70: 70 53 6f 72 74 65 72 2d 3e 6e 54 61 73 6b 2d 31  pSorter->nTask-1
da80: 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
da90: 20 66 6c 61 67 20 74 6f 20 69 6e 64 69 63 61 74   flag to indicat
daa0: 65 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20  e that at least 
dab0: 6f 6e 65 20 50 4d 41 20 68 61 73 20 62 65 65 6e  one PMA has been
dac0: 20 77 72 69 74 74 65 6e 2e 20 0a 20 20 2a 2a 20   written. .  ** 
dad0: 4f 72 20 77 69 6c 6c 20 62 65 2c 20 61 6e 79 68  Or will be, anyh
dae0: 6f 77 2e 20 20 2a 2f 0a 20 20 70 53 6f 72 74 65  ow.  */.  pSorte
daf0: 72 2d 3e 62 55 73 65 50 4d 41 20 3d 20 31 3b 0a  r->bUsePMA = 1;.
db00: 0a 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 73  .  /* Select a s
db10: 75 62 2d 74 61 73 6b 20 74 6f 20 73 6f 72 74 20  ub-task to sort 
db20: 61 6e 64 20 66 6c 75 73 68 20 74 68 65 20 63 75  and flush the cu
db30: 72 72 65 6e 74 20 6c 69 73 74 20 6f 66 20 69 6e  rrent list of in
db40: 2d 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 63  -memory.  ** rec
db50: 6f 72 64 73 20 74 6f 20 64 69 73 6b 2e 20 49 66  ords to disk. If
db60: 20 74 68 65 20 73 6f 72 74 65 72 20 69 73 20 72   the sorter is r
db70: 75 6e 6e 69 6e 67 20 69 6e 20 6d 75 6c 74 69 2d  unning in multi-
db80: 74 68 72 65 61 64 65 64 20 6d 6f 64 65 2c 0a 20  threaded mode,. 
db90: 20 2a 2a 20 72 6f 75 6e 64 2d 72 6f 62 69 6e 20   ** round-robin 
dba0: 62 65 74 77 65 65 6e 20 74 68 65 20 66 69 72 73  between the firs
dbb0: 74 20 28 70 53 6f 72 74 65 72 2d 3e 6e 54 61 73  t (pSorter->nTas
dbc0: 6b 2d 31 29 20 74 61 73 6b 73 2e 20 45 78 63 65  k-1) tasks. Exce
dbd0: 70 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  pt, if.  ** the 
dbe0: 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72 65 61  background threa
dbf0: 64 20 66 72 6f 6d 20 61 20 73 75 62 2d 74 61 73  d from a sub-tas
dc00: 6b 73 20 70 72 65 76 69 6f 75 73 20 74 75 72 6e  ks previous turn
dc10: 20 69 73 20 73 74 69 6c 6c 20 72 75 6e 6e 69 6e   is still runnin
dc20: 67 2c 0a 20 20 2a 2a 20 73 6b 69 70 20 69 74 2e  g,.  ** skip it.
dc30: 20 49 66 20 74 68 65 20 66 69 72 73 74 20 28 70   If the first (p
dc40: 53 6f 72 74 65 72 2d 3e 6e 54 61 73 6b 2d 31 29  Sorter->nTask-1)
dc50: 20 73 75 62 2d 74 61 73 6b 73 20 61 72 65 20 61   sub-tasks are a
dc60: 6c 6c 20 73 74 69 6c 6c 20 62 75 73 79 2c 0a 20  ll still busy,. 
dc70: 20 2a 2a 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f   ** fall back to
dc80: 20 75 73 69 6e 67 20 74 68 65 20 66 69 6e 61 6c   using the final
dc90: 20 73 75 62 2d 74 61 73 6b 2e 20 54 68 65 20 66   sub-task. The f
dca0: 69 72 73 74 20 28 70 53 6f 72 74 65 72 2d 3e 6e  irst (pSorter->n
dcb0: 54 61 73 6b 2d 31 29 0a 20 20 2a 2a 20 73 75 62  Task-1).  ** sub
dcc0: 2d 74 61 73 6b 73 20 61 72 65 20 70 72 65 66 65  -tasks are prefe
dcd0: 72 65 64 20 61 73 20 74 68 65 79 20 75 73 65 20  red as they use 
dce0: 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72 65 61  background threa
dcf0: 64 73 20 2d 20 74 68 65 20 66 69 6e 61 6c 20 0a  ds - the final .
dd00: 20 20 2a 2a 20 73 75 62 2d 74 61 73 6b 20 75 73    ** sub-task us
dd10: 65 73 20 74 68 65 20 6d 61 69 6e 20 74 68 72 65  es the main thre
dd20: 61 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ad. */.  for(i=0
dd30: 3b 20 69 3c 6e 57 6f 72 6b 65 72 3b 20 69 2b 2b  ; i<nWorker; i++
dd40: 29 7b 0a 20 20 20 20 69 6e 74 20 69 54 65 73 74  ){.    int iTest
dd50: 20 3d 20 28 70 53 6f 72 74 65 72 2d 3e 69 50 72   = (pSorter->iPr
dd60: 65 76 20 2b 20 69 20 2b 20 31 29 20 25 20 6e 57  ev + i + 1) % nW
dd70: 6f 72 6b 65 72 3b 0a 20 20 20 20 70 54 61 73 6b  orker;.    pTask
dd80: 20 3d 20 26 70 53 6f 72 74 65 72 2d 3e 61 54 61   = &pSorter->aTa
dd90: 73 6b 5b 69 54 65 73 74 5d 3b 0a 20 20 20 20 69  sk[iTest];.    i
dda0: 66 28 20 70 54 61 73 6b 2d 3e 62 44 6f 6e 65 20  f( pTask->bDone 
ddb0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 76 64  ){.      rc = vd
ddc0: 62 65 53 6f 72 74 65 72 4a 6f 69 6e 54 68 72 65  beSorterJoinThre
ddd0: 61 64 28 70 54 61 73 6b 29 3b 0a 20 20 20 20 7d  ad(pTask);.    }
dde0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
ddf0: 49 54 45 5f 4f 4b 20 7c 7c 20 70 54 61 73 6b 2d  ITE_OK || pTask-
de00: 3e 70 54 68 72 65 61 64 3d 3d 30 20 29 20 62 72  >pThread==0 ) br
de10: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  eak;.  }..  if( 
de20: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
de30: 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 57 6f 72  .    if( i==nWor
de40: 6b 65 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ker ){.      /* 
de50: 55 73 65 20 74 68 65 20 66 6f 72 65 67 72 6f 75  Use the foregrou
de60: 6e 64 20 74 68 72 65 61 64 20 66 6f 72 20 74 68  nd thread for th
de70: 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  is operation */.
de80: 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 53        rc = vdbeS
de90: 6f 72 74 65 72 4c 69 73 74 54 6f 50 4d 41 28 26  orterListToPMA(&
dea0: 70 53 6f 72 74 65 72 2d 3e 61 54 61 73 6b 5b 6e  pSorter->aTask[n
deb0: 57 6f 72 6b 65 72 5d 2c 20 26 70 53 6f 72 74 65  Worker], &pSorte
dec0: 72 2d 3e 6c 69 73 74 29 3b 0a 20 20 20 20 7d 65  r->list);.    }e
ded0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 61  lse{.      /* La
dee0: 75 6e 63 68 20 61 20 62 61 63 6b 67 72 6f 75 6e  unch a backgroun
def0: 64 20 74 68 72 65 61 64 20 66 6f 72 20 74 68 69  d thread for thi
df00: 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  s operation */. 
df10: 20 20 20 20 20 75 38 20 2a 61 4d 65 6d 20 3d 20       u8 *aMem = 
df20: 70 54 61 73 6b 2d 3e 6c 69 73 74 2e 61 4d 65 6d  pTask->list.aMem
df30: 6f 72 79 3b 0a 20 20 20 20 20 20 76 6f 69 64 20  ory;.      void 
df40: 2a 70 43 74 78 20 3d 20 28 76 6f 69 64 2a 29 70  *pCtx = (void*)p
df50: 54 61 73 6b 3b 0a 0a 20 20 20 20 20 20 61 73 73  Task;..      ass
df60: 65 72 74 28 20 70 54 61 73 6b 2d 3e 70 54 68 72  ert( pTask->pThr
df70: 65 61 64 3d 3d 30 20 26 26 20 70 54 61 73 6b 2d  ead==0 && pTask-
df80: 3e 62 44 6f 6e 65 3d 3d 30 20 29 3b 0a 20 20 20  >bDone==0 );.   
df90: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 73 6b     assert( pTask
dfa0: 2d 3e 6c 69 73 74 2e 70 4c 69 73 74 3d 3d 30 20  ->list.pList==0 
dfb0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
dfc0: 20 70 54 61 73 6b 2d 3e 6c 69 73 74 2e 61 4d 65   pTask->list.aMe
dfd0: 6d 6f 72 79 3d 3d 30 20 7c 7c 20 70 53 6f 72 74  mory==0 || pSort
dfe0: 65 72 2d 3e 6c 69 73 74 2e 61 4d 65 6d 6f 72 79  er->list.aMemory
dff0: 21 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 70 53  !=0 );..      pS
e000: 6f 72 74 65 72 2d 3e 69 50 72 65 76 20 3d 20 28  orter->iPrev = (
e010: 75 38 29 28 70 54 61 73 6b 20 2d 20 70 53 6f 72  u8)(pTask - pSor
e020: 74 65 72 2d 3e 61 54 61 73 6b 29 3b 0a 20 20 20  ter->aTask);.   
e030: 20 20 20 70 54 61 73 6b 2d 3e 6c 69 73 74 20 3d     pTask->list =
e040: 20 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74 3b 0a   pSorter->list;.
e050: 20 20 20 20 20 20 70 53 6f 72 74 65 72 2d 3e 6c        pSorter->l
e060: 69 73 74 2e 70 4c 69 73 74 20 3d 20 30 3b 0a 20  ist.pList = 0;. 
e070: 20 20 20 20 20 70 53 6f 72 74 65 72 2d 3e 6c 69       pSorter->li
e080: 73 74 2e 73 7a 50 4d 41 20 3d 20 30 3b 0a 20 20  st.szPMA = 0;.  
e090: 20 20 20 20 69 66 28 20 61 4d 65 6d 20 29 7b 0a      if( aMem ){.
e0a0: 20 20 20 20 20 20 20 20 70 53 6f 72 74 65 72 2d          pSorter-
e0b0: 3e 6c 69 73 74 2e 61 4d 65 6d 6f 72 79 20 3d 20  >list.aMemory = 
e0c0: 61 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 70 53  aMem;.        pS
e0d0: 6f 72 74 65 72 2d 3e 6e 4d 65 6d 6f 72 79 20 3d  orter->nMemory =
e0e0: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69   sqlite3MallocSi
e0f0: 7a 65 28 61 4d 65 6d 29 3b 0a 20 20 20 20 20 20  ze(aMem);.      
e100: 7d 65 6c 73 65 20 69 66 28 20 70 53 6f 72 74 65  }else if( pSorte
e110: 72 2d 3e 6c 69 73 74 2e 61 4d 65 6d 6f 72 79 20  r->list.aMemory 
e120: 29 7b 0a 20 20 20 20 20 20 20 20 70 53 6f 72 74  ){.        pSort
e130: 65 72 2d 3e 6c 69 73 74 2e 61 4d 65 6d 6f 72 79  er->list.aMemory
e140: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
e150: 28 70 53 6f 72 74 65 72 2d 3e 6e 4d 65 6d 6f 72  (pSorter->nMemor
e160: 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  y);.        if( 
e170: 21 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74 2e 61  !pSorter->list.a
e180: 4d 65 6d 6f 72 79 20 29 20 72 65 74 75 72 6e 20  Memory ) return 
e190: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
e1a0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20      }..      rc 
e1b0: 3d 20 76 64 62 65 53 6f 72 74 65 72 43 72 65 61  = vdbeSorterCrea
e1c0: 74 65 54 68 72 65 61 64 28 70 54 61 73 6b 2c 20  teThread(pTask, 
e1d0: 76 64 62 65 53 6f 72 74 65 72 46 6c 75 73 68 54  vdbeSorterFlushT
e1e0: 68 72 65 61 64 2c 20 70 43 74 78 29 3b 0a 20 20  hread, pCtx);.  
e1f0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
e200: 6e 20 72 63 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  n rc;.#endif /* 
e210: 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45  SQLITE_MAX_WORKE
e220: 52 5f 54 48 52 45 41 44 53 21 3d 30 20 2a 2f 0a  R_THREADS!=0 */.
e230: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 72  }../*.** Add a r
e240: 65 63 6f 72 64 20 74 6f 20 74 68 65 20 73 6f 72  ecord to the sor
e250: 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ter..*/.int sqli
e260: 74 65 33 56 64 62 65 53 6f 72 74 65 72 57 72 69  te3VdbeSorterWri
e270: 74 65 28 0a 20 20 63 6f 6e 73 74 20 56 64 62 65  te(.  const Vdbe
e280: 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 20 20  Cursor *pCsr,   
e290: 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65 72 20        /* Sorter 
e2a0: 63 75 72 73 6f 72 20 2a 2f 0a 20 20 4d 65 6d 20  cursor */.  Mem 
e2b0: 2a 70 56 61 6c 20 20 20 20 20 20 20 20 20 20 20  *pVal           
e2c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
e2d0: 65 6d 6f 72 79 20 63 65 6c 6c 20 63 6f 6e 74 61  emory cell conta
e2e0: 69 6e 69 6e 67 20 72 65 63 6f 72 64 20 2a 2f 0a  ining record */.
e2f0: 29 7b 0a 20 20 56 64 62 65 53 6f 72 74 65 72 20  ){.  VdbeSorter 
e300: 2a 70 53 6f 72 74 65 72 20 3d 20 70 43 73 72 2d  *pSorter = pCsr-
e310: 3e 70 53 6f 72 74 65 72 3b 0a 20 20 69 6e 74 20  >pSorter;.  int 
e320: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
e330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
e340: 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
e350: 53 6f 72 74 65 72 52 65 63 6f 72 64 20 2a 70 4e  SorterRecord *pN
e360: 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
e370: 2f 2a 20 4e 65 77 20 6c 69 73 74 20 65 6c 65 6d  /* New list elem
e380: 65 6e 74 20 2a 2f 0a 0a 20 20 69 6e 74 20 62 46  ent */..  int bF
e390: 6c 75 73 68 3b 20 20 20 20 20 20 20 20 20 20 20  lush;           
e3a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
e3b0: 65 20 74 6f 20 66 6c 75 73 68 20 63 6f 6e 74 65  e to flush conte
e3c0: 6e 74 73 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f  nts of memory to
e3d0: 20 50 4d 41 20 2a 2f 0a 20 20 69 6e 74 20 6e 52   PMA */.  int nR
e3e0: 65 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eq;             
e3f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
e400: 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 71  es of memory req
e410: 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  uired */.  int n
e420: 50 4d 41 3b 20 20 20 20 20 20 20 20 20 20 20 20  PMA;            
e430: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
e440: 74 65 73 20 6f 66 20 50 4d 41 20 73 70 61 63 65  tes of PMA space
e450: 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 0a 20 20   required */..  
e460: 61 73 73 65 72 74 28 20 70 53 6f 72 74 65 72 20  assert( pSorter 
e470: 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  );..  /* Figure 
e480: 6f 75 74 20 77 68 65 74 68 65 72 20 6f 72 20 6e  out whether or n
e490: 6f 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ot the current c
e4a0: 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 65 6d 6f 72  ontents of memor
e4b0: 79 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 2a 2a  y should be.  **
e4c0: 20 66 6c 75 73 68 65 64 20 74 6f 20 61 20 50 4d   flushed to a PM
e4d0: 41 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75  A before continu
e4e0: 69 6e 67 2e 20 49 66 20 73 6f 2c 20 64 6f 20 73  ing. If so, do s
e4f0: 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  o..  **.  ** If 
e500: 75 73 69 6e 67 20 74 68 65 20 73 69 6e 67 6c 65  using the single
e510: 20 6c 61 72 67 65 20 61 6c 6c 6f 63 61 74 69 6f   large allocatio
e520: 6e 20 6d 6f 64 65 20 28 70 53 6f 72 74 65 72 2d  n mode (pSorter-
e530: 3e 61 4d 65 6d 6f 72 79 21 3d 30 29 2c 20 74 68  >aMemory!=0), th
e540: 65 6e 0a 20 20 2a 2a 20 66 6c 75 73 68 20 74 68  en.  ** flush th
e550: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 65  e contents of me
e560: 6d 6f 72 79 20 74 6f 20 61 20 6e 65 77 20 50 4d  mory to a new PM
e570: 41 20 69 66 20 28 61 29 20 61 74 20 6c 65 61 73  A if (a) at leas
e580: 74 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 0a 20  t one value is. 
e590: 20 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 6d   ** already in m
e5a0: 65 6d 6f 72 79 20 61 6e 64 20 28 62 29 20 74 68  emory and (b) th
e5b0: 65 20 6e 65 77 20 76 61 6c 75 65 20 77 69 6c 6c  e new value will
e5c0: 20 6e 6f 74 20 66 69 74 20 69 6e 20 6d 65 6d 6f   not fit in memo
e5d0: 72 79 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f  ry..  ** .  ** O
e5e0: 72 2c 20 69 66 20 75 73 69 6e 67 20 73 65 70 61  r, if using sepa
e5f0: 72 61 74 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  rate allocations
e600: 20 66 6f 72 20 65 61 63 68 20 72 65 63 6f 72 64   for each record
e610: 2c 20 66 6c 75 73 68 20 74 68 65 20 63 6f 6e 74  , flush the cont
e620: 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 6d 65 6d  ents.  ** of mem
e630: 6f 72 79 20 74 6f 20 61 20 50 4d 41 20 69 66 20  ory to a PMA if 
e640: 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f  either of the fo
e650: 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
e660: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20  :.  **.  **   * 
e670: 54 68 65 20 74 6f 74 61 6c 20 6d 65 6d 6f 72 79  The total memory
e680: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
e690: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6c 69 73  he in-memory lis
e6a0: 74 20 69 73 20 67 72 65 61 74 65 72 20 0a 20 20  t is greater .  
e6b0: 2a 2a 20 20 20 20 20 74 68 61 6e 20 28 70 61 67  **     than (pag
e6c0: 65 2d 73 69 7a 65 20 2a 20 63 61 63 68 65 2d 73  e-size * cache-s
e6d0: 69 7a 65 29 2c 20 6f 72 0a 20 20 2a 2a 0a 20 20  ize), or.  **.  
e6e0: 2a 2a 20 20 20 2a 20 54 68 65 20 74 6f 74 61 6c  **   * The total
e6f0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65   memory allocate
e700: 64 20 66 6f 72 20 74 68 65 20 69 6e 2d 6d 65 6d  d for the in-mem
e710: 6f 72 79 20 6c 69 73 74 20 69 73 20 67 72 65 61  ory list is grea
e720: 74 65 72 20 0a 20 20 2a 2a 20 20 20 20 20 74 68  ter .  **     th
e730: 61 6e 20 28 70 61 67 65 2d 73 69 7a 65 20 2a 20  an (page-size * 
e740: 31 30 29 20 61 6e 64 20 73 71 6c 69 74 65 33 48  10) and sqlite3H
e750: 65 61 70 4e 65 61 72 6c 79 46 75 6c 6c 28 29 20  eapNearlyFull() 
e760: 72 65 74 75 72 6e 73 20 74 72 75 65 2e 0a 20 20  returns true..  
e770: 2a 2f 0a 20 20 6e 52 65 71 20 3d 20 70 56 61 6c  */.  nReq = pVal
e780: 2d 3e 6e 20 2b 20 73 69 7a 65 6f 66 28 53 6f 72  ->n + sizeof(Sor
e790: 74 65 72 52 65 63 6f 72 64 29 3b 0a 20 20 6e 50  terRecord);.  nP
e7a0: 4d 41 20 3d 20 70 56 61 6c 2d 3e 6e 20 2b 20 73  MA = pVal->n + s
e7b0: 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28  qlite3VarintLen(
e7c0: 70 56 61 6c 2d 3e 6e 29 3b 0a 20 20 69 66 28 20  pVal->n);.  if( 
e7d0: 70 53 6f 72 74 65 72 2d 3e 6d 78 50 6d 61 53 69  pSorter->mxPmaSi
e7e0: 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53  ze ){.    if( pS
e7f0: 6f 72 74 65 72 2d 3e 6c 69 73 74 2e 61 4d 65 6d  orter->list.aMem
e800: 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 62 46 6c  ory ){.      bFl
e810: 75 73 68 20 3d 20 70 53 6f 72 74 65 72 2d 3e 69  ush = pSorter->i
e820: 4d 65 6d 6f 72 79 20 26 26 20 28 70 53 6f 72 74  Memory && (pSort
e830: 65 72 2d 3e 69 4d 65 6d 6f 72 79 2b 6e 52 65 71  er->iMemory+nReq
e840: 29 20 3e 20 70 53 6f 72 74 65 72 2d 3e 6d 78 50  ) > pSorter->mxP
e850: 6d 61 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73  maSize;.    }els
e860: 65 7b 0a 20 20 20 20 20 20 62 46 6c 75 73 68 20  e{.      bFlush 
e870: 3d 20 28 0a 20 20 20 20 20 20 20 20 20 20 28 70  = (.          (p
e880: 53 6f 72 74 65 72 2d 3e 6c 69 73 74 2e 73 7a 50  Sorter->list.szP
e890: 4d 41 20 3e 20 70 53 6f 72 74 65 72 2d 3e 6d 78  MA > pSorter->mx
e8a0: 50 6d 61 53 69 7a 65 29 0a 20 20 20 20 20 20 20  PmaSize).       
e8b0: 7c 7c 20 28 70 53 6f 72 74 65 72 2d 3e 6c 69 73  || (pSorter->lis
e8c0: 74 2e 73 7a 50 4d 41 20 3e 20 70 53 6f 72 74 65  t.szPMA > pSorte
e8d0: 72 2d 3e 6d 6e 50 6d 61 53 69 7a 65 20 26 26 20  r->mnPmaSize && 
e8e0: 73 71 6c 69 74 65 33 48 65 61 70 4e 65 61 72 6c  sqlite3HeapNearl
e8f0: 79 46 75 6c 6c 28 29 29 0a 20 20 20 20 20 20 29  yFull()).      )
e900: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
e910: 62 46 6c 75 73 68 20 29 7b 0a 20 20 20 20 20 20  bFlush ){.      
e920: 72 63 20 3d 20 76 64 62 65 53 6f 72 74 65 72 46  rc = vdbeSorterF
e930: 6c 75 73 68 50 4d 41 28 70 53 6f 72 74 65 72 29  lushPMA(pSorter)
e940: 3b 0a 20 20 20 20 20 20 70 53 6f 72 74 65 72 2d  ;.      pSorter-
e950: 3e 6c 69 73 74 2e 73 7a 50 4d 41 20 3d 20 30 3b  >list.szPMA = 0;
e960: 0a 20 20 20 20 20 20 70 53 6f 72 74 65 72 2d 3e  .      pSorter->
e970: 69 4d 65 6d 6f 72 79 20 3d 20 30 3b 0a 20 20 20  iMemory = 0;.   
e980: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
e990: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 6f 72  QLITE_OK || pSor
e9a0: 74 65 72 2d 3e 6c 69 73 74 2e 70 4c 69 73 74 3d  ter->list.pList=
e9b0: 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  =0 );.    }.  }.
e9c0: 0a 20 20 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74  .  pSorter->list
e9d0: 2e 73 7a 50 4d 41 20 2b 3d 20 6e 50 4d 41 3b 0a  .szPMA += nPMA;.
e9e0: 20 20 69 66 28 20 6e 50 4d 41 3e 70 53 6f 72 74    if( nPMA>pSort
e9f0: 65 72 2d 3e 6d 78 4b 65 79 73 69 7a 65 20 29 7b  er->mxKeysize ){
ea00: 0a 20 20 20 20 70 53 6f 72 74 65 72 2d 3e 6d 78  .    pSorter->mx
ea10: 4b 65 79 73 69 7a 65 20 3d 20 6e 50 4d 41 3b 0a  Keysize = nPMA;.
ea20: 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 6f 72 74    }..  if( pSort
ea30: 65 72 2d 3e 6c 69 73 74 2e 61 4d 65 6d 6f 72 79  er->list.aMemory
ea40: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4d 69 6e   ){.    int nMin
ea50: 20 3d 20 70 53 6f 72 74 65 72 2d 3e 69 4d 65 6d   = pSorter->iMem
ea60: 6f 72 79 20 2b 20 6e 52 65 71 3b 0a 0a 20 20 20  ory + nReq;..   
ea70: 20 69 66 28 20 6e 4d 69 6e 3e 70 53 6f 72 74 65   if( nMin>pSorte
ea80: 72 2d 3e 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20  r->nMemory ){.  
ea90: 20 20 20 20 75 38 20 2a 61 4e 65 77 3b 0a 20 20      u8 *aNew;.  
eaa0: 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70      int nNew = p
eab0: 53 6f 72 74 65 72 2d 3e 6e 4d 65 6d 6f 72 79 20  Sorter->nMemory 
eac0: 2a 20 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  * 2;.      while
ead0: 28 20 6e 4e 65 77 20 3c 20 6e 4d 69 6e 20 29 20  ( nNew < nMin ) 
eae0: 6e 4e 65 77 20 3d 20 6e 4e 65 77 2a 32 3b 0a 20  nNew = nNew*2;. 
eaf0: 20 20 20 20 20 69 66 28 20 6e 4e 65 77 20 3e 20       if( nNew > 
eb00: 70 53 6f 72 74 65 72 2d 3e 6d 78 50 6d 61 53 69  pSorter->mxPmaSi
eb10: 7a 65 20 29 20 6e 4e 65 77 20 3d 20 70 53 6f 72  ze ) nNew = pSor
eb20: 74 65 72 2d 3e 6d 78 50 6d 61 53 69 7a 65 3b 0a  ter->mxPmaSize;.
eb30: 20 20 20 20 20 20 69 66 28 20 6e 4e 65 77 20 3c        if( nNew <
eb40: 20 6e 4d 69 6e 20 29 20 6e 4e 65 77 20 3d 20 6e   nMin ) nNew = n
eb50: 4d 69 6e 3b 0a 0a 20 20 20 20 20 20 61 4e 65 77  Min;..      aNew
eb60: 20 3d 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f   = sqlite3Reallo
eb70: 63 28 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74 2e  c(pSorter->list.
eb80: 61 4d 65 6d 6f 72 79 2c 20 6e 4e 65 77 29 3b 0a  aMemory, nNew);.
eb90: 20 20 20 20 20 20 69 66 28 20 21 61 4e 65 77 20        if( !aNew 
eba0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
ebb0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 70 53 6f  NOMEM;.      pSo
ebc0: 72 74 65 72 2d 3e 6c 69 73 74 2e 70 4c 69 73 74  rter->list.pList
ebd0: 20 3d 20 28 53 6f 72 74 65 72 52 65 63 6f 72 64   = (SorterRecord
ebe0: 2a 29 28 0a 20 20 20 20 20 20 20 20 20 20 61 4e  *)(.          aN
ebf0: 65 77 20 2b 20 28 28 75 38 2a 29 70 53 6f 72 74  ew + ((u8*)pSort
ec00: 65 72 2d 3e 6c 69 73 74 2e 70 4c 69 73 74 20 2d  er->list.pList -
ec10: 20 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74 2e 61   pSorter->list.a
ec20: 4d 65 6d 6f 72 79 29 0a 20 20 20 20 20 20 29 3b  Memory).      );
ec30: 0a 20 20 20 20 20 20 70 53 6f 72 74 65 72 2d 3e  .      pSorter->
ec40: 6c 69 73 74 2e 61 4d 65 6d 6f 72 79 20 3d 20 61  list.aMemory = a
ec50: 4e 65 77 3b 0a 20 20 20 20 20 20 70 53 6f 72 74  New;.      pSort
ec60: 65 72 2d 3e 6e 4d 65 6d 6f 72 79 20 3d 20 6e 4e  er->nMemory = nN
ec70: 65 77 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  ew;.    }..    p
ec80: 4e 65 77 20 3d 20 28 53 6f 72 74 65 72 52 65 63  New = (SorterRec
ec90: 6f 72 64 2a 29 26 70 53 6f 72 74 65 72 2d 3e 6c  ord*)&pSorter->l
eca0: 69 73 74 2e 61 4d 65 6d 6f 72 79 5b 70 53 6f 72  ist.aMemory[pSor
ecb0: 74 65 72 2d 3e 69 4d 65 6d 6f 72 79 5d 3b 0a 20  ter->iMemory];. 
ecc0: 20 20 20 70 53 6f 72 74 65 72 2d 3e 69 4d 65 6d     pSorter->iMem
ecd0: 6f 72 79 20 2b 3d 20 52 4f 55 4e 44 38 28 6e 52  ory += ROUND8(nR
ece0: 65 71 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  eq);.    pNew->u
ecf0: 2e 69 4e 65 78 74 20 3d 20 28 69 6e 74 29 28 28  .iNext = (int)((
ed00: 75 38 2a 29 28 70 53 6f 72 74 65 72 2d 3e 6c 69  u8*)(pSorter->li
ed10: 73 74 2e 70 4c 69 73 74 29 20 2d 20 70 53 6f 72  st.pList) - pSor
ed20: 74 65 72 2d 3e 6c 69 73 74 2e 61 4d 65 6d 6f 72  ter->list.aMemor
ed30: 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  y);.  }else{.   
ed40: 20 70 4e 65 77 20 3d 20 28 53 6f 72 74 65 72 52   pNew = (SorterR
ed50: 65 63 6f 72 64 20 2a 29 73 71 6c 69 74 65 33 4d  ecord *)sqlite3M
ed60: 61 6c 6c 6f 63 28 6e 52 65 71 29 3b 0a 20 20 20  alloc(nReq);.   
ed70: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
ed80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
ed90: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
eda0: 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 70 4e 65  .    pNew->u.pNe
edb0: 78 74 20 3d 20 70 53 6f 72 74 65 72 2d 3e 6c 69  xt = pSorter->li
edc0: 73 74 2e 70 4c 69 73 74 3b 0a 20 20 7d 0a 0a 20  st.pList;.  }.. 
edd0: 20 6d 65 6d 63 70 79 28 53 52 56 41 4c 28 70 4e   memcpy(SRVAL(pN
ede0: 65 77 29 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56  ew), pVal->z, pV
edf0: 61 6c 2d 3e 6e 29 3b 0a 20 20 70 4e 65 77 2d 3e  al->n);.  pNew->
ee00: 6e 56 61 6c 20 3d 20 70 56 61 6c 2d 3e 6e 3b 0a  nVal = pVal->n;.
ee10: 20 20 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74 2e    pSorter->list.
ee20: 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 0a 20  pList = pNew;.. 
ee30: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ee40: 2a 0a 2a 2a 20 52 65 61 64 20 6b 65 79 73 20 66  *.** Read keys f
ee50: 72 6f 6d 20 70 49 6e 63 72 2d 3e 70 4d 65 72 67  rom pIncr->pMerg
ee60: 65 72 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20  er and populate 
ee70: 70 49 6e 63 72 2d 3e 61 46 69 6c 65 5b 31 5d 2e  pIncr->aFile[1].
ee80: 20 54 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 6f   The format.** o
ee90: 66 20 74 68 65 20 64 61 74 61 20 73 74 6f 72 65  f the data store
eea0: 64 20 69 6e 20 61 46 69 6c 65 5b 31 5d 20 69 73  d in aFile[1] is
eeb0: 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 61   the same as tha
eec0: 74 20 75 73 65 64 20 62 79 20 72 65 67 75 6c 61  t used by regula
eed0: 72 20 50 4d 41 73 2c 0a 2a 2a 20 65 78 63 65 70  r PMAs,.** excep
eee0: 74 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  t that the numbe
eef0: 72 2d 6f 66 2d 62 79 74 65 73 20 76 61 72 69 6e  r-of-bytes varin
ef00: 74 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f  t is omitted fro
ef10: 6d 20 74 68 65 20 73 74 61 72 74 2e 0a 2a 2f 0a  m the start..*/.
ef20: 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 49  static int vdbeI
ef30: 6e 63 72 50 6f 70 75 6c 61 74 65 28 49 6e 63 72  ncrPopulate(Incr
ef40: 4d 65 72 67 65 72 20 2a 70 49 6e 63 72 29 7b 0a  Merger *pIncr){.
ef50: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
ef60: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 63 32 3b  E_OK;.  int rc2;
ef70: 0a 20 20 69 36 34 20 69 53 74 61 72 74 20 3d 20  .  i64 iStart = 
ef80: 70 49 6e 63 72 2d 3e 69 53 74 61 72 74 4f 66 66  pIncr->iStartOff
ef90: 3b 0a 20 20 53 6f 72 74 65 72 46 69 6c 65 20 2a  ;.  SorterFile *
efa0: 70 4f 75 74 20 3d 20 26 70 49 6e 63 72 2d 3e 61  pOut = &pIncr->a
efb0: 46 69 6c 65 5b 31 5d 3b 0a 20 20 53 6f 72 74 53  File[1];.  SortS
efc0: 75 62 74 61 73 6b 20 2a 70 54 61 73 6b 20 3d 20  ubtask *pTask = 
efd0: 70 49 6e 63 72 2d 3e 70 54 61 73 6b 3b 0a 20 20  pIncr->pTask;.  
efe0: 4d 65 72 67 65 45 6e 67 69 6e 65 20 2a 70 4d 65  MergeEngine *pMe
eff0: 72 67 65 72 20 3d 20 70 49 6e 63 72 2d 3e 70 4d  rger = pIncr->pM
f000: 65 72 67 65 72 3b 0a 20 20 50 6d 61 57 72 69 74  erger;.  PmaWrit
f010: 65 72 20 77 72 69 74 65 72 3b 0a 20 20 61 73 73  er writer;.  ass
f020: 65 72 74 28 20 70 49 6e 63 72 2d 3e 62 45 6f 66  ert( pIncr->bEof
f030: 3d 3d 30 20 29 3b 0a 0a 20 20 76 64 62 65 53 6f  ==0 );..  vdbeSo
f040: 72 74 65 72 50 6f 70 75 6c 61 74 65 44 65 62 75  rterPopulateDebu
f050: 67 28 70 54 61 73 6b 2c 20 22 65 6e 74 65 72 22  g(pTask, "enter"
f060: 29 3b 0a 0a 20 20 76 64 62 65 50 6d 61 57 72 69  );..  vdbePmaWri
f070: 74 65 72 49 6e 69 74 28 70 4f 75 74 2d 3e 70 46  terInit(pOut->pF
f080: 64 2c 20 26 77 72 69 74 65 72 2c 20 70 54 61 73  d, &writer, pTas
f090: 6b 2d 3e 70 53 6f 72 74 65 72 2d 3e 70 67 73 7a  k->pSorter->pgsz
f0a0: 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 77 68 69  , iStart);.  whi
f0b0: 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
f0c0: 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 75 6d  K ){.    int dum
f0d0: 6d 79 3b 0a 20 20 20 20 50 6d 61 52 65 61 64 65  my;.    PmaReade
f0e0: 72 20 2a 70 52 65 61 64 65 72 20 3d 20 26 70 4d  r *pReader = &pM
f0f0: 65 72 67 65 72 2d 3e 61 52 65 61 64 72 5b 20 70  erger->aReadr[ p
f100: 4d 65 72 67 65 72 2d 3e 61 54 72 65 65 5b 31 5d  Merger->aTree[1]
f110: 20 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79   ];.    int nKey
f120: 20 3d 20 70 52 65 61 64 65 72 2d 3e 6e 4b 65 79   = pReader->nKey
f130: 3b 0a 20 20 20 20 69 36 34 20 69 45 6f 66 20 3d  ;.    i64 iEof =
f140: 20 77 72 69 74 65 72 2e 69 57 72 69 74 65 4f 66   writer.iWriteOf
f150: 66 20 2b 20 77 72 69 74 65 72 2e 69 42 75 66 45  f + writer.iBufE
f160: 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  nd;..    /* Chec
f170: 6b 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  k if the output 
f180: 66 69 6c 65 20 69 73 20 66 75 6c 6c 20 6f 72 20  file is full or 
f190: 69 66 20 74 68 65 20 69 6e 70 75 74 20 68 61 73  if the input has
f1a0: 20 62 65 65 6e 20 65 78 68 61 75 73 74 65 64 2e   been exhausted.
f1b0: 0a 20 20 20 20 2a 2a 20 49 6e 20 65 69 74 68 65  .    ** In eithe
f1c0: 72 20 63 61 73 65 20 65 78 69 74 20 74 68 65 20  r case exit the 
f1d0: 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 69 66 28  loop. */.    if(
f1e0: 20 70 52 65 61 64 65 72 2d 3e 70 46 64 3d 3d 30   pReader->pFd==0
f1f0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
f200: 28 20 28 69 45 6f 66 20 2b 20 6e 4b 65 79 20 2b  ( (iEof + nKey +
f210: 20 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65   sqlite3VarintLe
f220: 6e 28 6e 4b 65 79 29 29 3e 28 69 53 74 61 72 74  n(nKey))>(iStart
f230: 20 2b 20 70 49 6e 63 72 2d 3e 6d 78 53 7a 29 20   + pIncr->mxSz) 
f240: 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a  ) break;..    /*
f250: 20 57 72 69 74 65 20 74 68 65 20 6e 65 78 74 20   Write the next 
f260: 6b 65 79 20 74 6f 20 74 68 65 20 6f 75 74 70 75  key to the outpu
f270: 74 2e 20 2a 2f 0a 20 20 20 20 76 64 62 65 50 6d  t. */.    vdbePm
f280: 61 57 72 69 74 65 56 61 72 69 6e 74 28 26 77 72  aWriteVarint(&wr
f290: 69 74 65 72 2c 20 6e 4b 65 79 29 3b 0a 20 20 20  iter, nKey);.   
f2a0: 20 76 64 62 65 50 6d 61 57 72 69 74 65 42 6c 6f   vdbePmaWriteBlo
f2b0: 62 28 26 77 72 69 74 65 72 2c 20 70 52 65 61 64  b(&writer, pRead
f2c0: 65 72 2d 3e 61 4b 65 79 2c 20 6e 4b 65 79 29 3b  er->aKey, nKey);
f2d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
f2e0: 63 72 2d 3e 70 4d 65 72 67 65 72 2d 3e 70 54 61  cr->pMerger->pTa
f2f0: 73 6b 3d 3d 70 54 61 73 6b 20 29 3b 0a 20 20 20  sk==pTask );.   
f300: 20 72 63 20 3d 20 76 64 62 65 4d 65 72 67 65 45   rc = vdbeMergeE
f310: 6e 67 69 6e 65 53 74 65 70 28 70 49 6e 63 72 2d  ngineStep(pIncr-
f320: 3e 70 4d 65 72 67 65 72 2c 20 26 64 75 6d 6d 79  >pMerger, &dummy
f330: 29 3b 0a 20 20 7d 0a 0a 20 20 72 63 32 20 3d 20  );.  }..  rc2 = 
f340: 76 64 62 65 50 6d 61 57 72 69 74 65 72 46 69 6e  vdbePmaWriterFin
f350: 69 73 68 28 26 77 72 69 74 65 72 2c 20 26 70 4f  ish(&writer, &pO
f360: 75 74 2d 3e 69 45 6f 66 29 3b 0a 20 20 69 66 28  ut->iEof);.  if(
f370: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
f380: 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 76 64 62   rc = rc2;.  vdb
f390: 65 53 6f 72 74 65 72 50 6f 70 75 6c 61 74 65 44  eSorterPopulateD
f3a0: 65 62 75 67 28 70 54 61 73 6b 2c 20 22 65 78 69  ebug(pTask, "exi
f3b0: 74 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  t");.  return rc
f3c0: 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
f3d0: 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MAX_WORKER_THREA
f3e0: 44 53 3e 30 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d  DS>0./*.** The m
f3f0: 61 69 6e 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  ain routine for 
f400: 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72 65 61  background threa
f410: 64 73 20 74 68 61 74 20 70 6f 70 75 6c 61 74 65  ds that populate
f420: 20 61 46 69 6c 65 5b 31 5d 20 6f 66 0a 2a 2a 20   aFile[1] of.** 
f430: 6d 75 6c 74 69 2d 74 68 72 65 61 64 65 64 20 49  multi-threaded I
f440: 6e 63 72 4d 65 72 67 65 72 20 6f 62 6a 65 63 74  ncrMerger object
f450: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
f460: 64 20 2a 76 64 62 65 49 6e 63 72 50 6f 70 75 6c  d *vdbeIncrPopul
f470: 61 74 65 54 68 72 65 61 64 28 76 6f 69 64 20 2a  ateThread(void *
f480: 70 43 74 78 29 7b 0a 20 20 49 6e 63 72 4d 65 72  pCtx){.  IncrMer
f490: 67 65 72 20 2a 70 49 6e 63 72 20 3d 20 28 49 6e  ger *pIncr = (In
f4a0: 63 72 4d 65 72 67 65 72 2a 29 70 43 74 78 3b 0a  crMerger*)pCtx;.
f4b0: 20 20 76 6f 69 64 20 2a 70 52 65 74 20 3d 20 53    void *pRet = S
f4c0: 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
f4d0: 28 20 76 64 62 65 49 6e 63 72 50 6f 70 75 6c 61  ( vdbeIncrPopula
f4e0: 74 65 28 70 49 6e 63 72 29 20 29 3b 0a 20 20 70  te(pIncr) );.  p
f4f0: 49 6e 63 72 2d 3e 70 54 61 73 6b 2d 3e 62 44 6f  Incr->pTask->bDo
f500: 6e 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  ne = 1;.  return
f510: 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
f520: 4c 61 75 6e 63 68 20 61 20 62 61 63 6b 67 72 6f  Launch a backgro
f530: 75 6e 64 20 74 68 72 65 61 64 20 74 6f 20 70 6f  und thread to po
f540: 70 75 6c 61 74 65 20 61 46 69 6c 65 5b 31 5d 20  pulate aFile[1] 
f550: 6f 66 20 70 49 6e 63 72 2e 0a 2a 2f 0a 73 74 61  of pIncr..*/.sta
f560: 74 69 63 20 69 6e 74 20 76 64 62 65 49 6e 63 72  tic int vdbeIncr
f570: 42 67 50 6f 70 75 6c 61 74 65 28 49 6e 63 72 4d  BgPopulate(IncrM
f580: 65 72 67 65 72 20 2a 70 49 6e 63 72 29 7b 0a 20  erger *pIncr){. 
f590: 20 76 6f 69 64 20 2a 70 20 3d 20 28 76 6f 69 64   void *p = (void
f5a0: 2a 29 70 49 6e 63 72 3b 0a 20 20 61 73 73 65 72  *)pIncr;.  asser
f5b0: 74 28 20 70 49 6e 63 72 2d 3e 62 55 73 65 54 68  t( pIncr->bUseTh
f5c0: 72 65 61 64 20 29 3b 0a 20 20 72 65 74 75 72 6e  read );.  return
f5d0: 20 76 64 62 65 53 6f 72 74 65 72 43 72 65 61 74   vdbeSorterCreat
f5e0: 65 54 68 72 65 61 64 28 70 49 6e 63 72 2d 3e 70  eThread(pIncr->p
f5f0: 54 61 73 6b 2c 20 76 64 62 65 49 6e 63 72 50 6f  Task, vdbeIncrPo
f600: 70 75 6c 61 74 65 54 68 72 65 61 64 2c 20 70 29  pulateThread, p)
f610: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
f620: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
f630: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  is called when t
f640: 68 65 20 50 6d 61 52 65 61 64 65 72 20 63 6f 72  he PmaReader cor
f650: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 49  responding to pI
f660: 6e 63 72 20 68 61 73 0a 2a 2a 20 66 69 6e 69 73  ncr has.** finis
f670: 68 65 64 20 72 65 61 64 69 6e 67 20 74 68 65 20  hed reading the 
f680: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 46 69 6c  contents of aFil
f690: 65 5b 30 5d 2e 20 49 74 73 20 70 75 72 70 6f 73  e[0]. Its purpos
f6a0: 65 20 69 73 20 74 6f 20 22 72 65 66 69 6c 6c 22  e is to "refill"
f6b0: 0a 2a 2a 20 61 46 69 6c 65 5b 30 5d 20 73 75 63  .** aFile[0] suc
f6c0: 68 20 74 68 61 74 20 74 68 65 20 50 6d 61 52 65  h that the PmaRe
f6d0: 61 64 65 72 20 73 68 6f 75 6c 64 20 73 74 61 72  ader should star
f6e0: 74 20 72 65 72 65 61 64 69 6e 67 20 69 74 20 66  t rereading it f
f6f0: 72 6f 6d 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e  rom the.** begin
f700: 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ning..**.** For 
f710: 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 20  single-threaded 
f720: 6f 62 6a 65 63 74 73 2c 20 74 68 69 73 20 69 73  objects, this is
f730: 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 20 62 79   accomplished by
f740: 20 6c 69 74 65 72 61 6c 6c 79 20 72 65 61 64 69   literally readi
f750: 6e 67 20 0a 2a 2a 20 6b 65 79 73 20 66 72 6f 6d  ng .** keys from
f760: 20 70 49 6e 63 72 2d 3e 70 4d 65 72 67 65 72 20   pIncr->pMerger 
f770: 61 6e 64 20 72 65 70 6f 70 75 6c 61 74 69 6e 67  and repopulating
f780: 20 61 46 69 6c 65 5b 30 5d 2e 20 0a 2a 2a 0a 2a   aFile[0]. .**.*
f790: 2a 20 46 6f 72 20 6d 75 6c 74 69 2d 74 68 72 65  * For multi-thre
f7a0: 61 64 65 64 20 6f 62 6a 65 63 74 73 2c 20 61 6c  aded objects, al
f7b0: 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
f7c0: 65 64 20 69 73 20 74 6f 20 77 61 69 74 20 75 6e  ed is to wait un
f7d0: 74 69 6c 20 74 68 65 20 0a 2a 2a 20 62 61 63 6b  til the .** back
f7e0: 67 72 6f 75 6e 64 20 74 68 72 65 61 64 20 69 73  ground thread is
f7f0: 20 66 69 6e 69 73 68 65 64 20 28 69 66 20 69 74   finished (if it
f800: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 29   is not already)
f810: 20 61 6e 64 20 74 68 65 6e 20 73 77 61 70 20 0a   and then swap .
f820: 2a 2a 20 61 46 69 6c 65 5b 30 5d 20 61 6e 64 20  ** aFile[0] and 
f830: 61 46 69 6c 65 5b 31 5d 20 69 6e 20 70 6c 61 63  aFile[1] in plac
f840: 65 2e 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e  e. If the conten
f850: 74 73 20 6f 66 20 70 4d 65 72 67 65 72 20 68 61  ts of pMerger ha
f860: 76 65 20 6e 6f 74 0a 2a 2a 20 62 65 65 6e 20 65  ve not.** been e
f870: 78 68 61 75 73 74 65 64 2c 20 74 68 69 73 20 66  xhausted, this f
f880: 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 6c 61 75  unction also lau
f890: 6e 63 68 65 73 20 61 20 6e 65 77 20 62 61 63 6b  nches a new back
f8a0: 67 72 6f 75 6e 64 20 74 68 72 65 61 64 0a 2a 2a  ground thread.**
f8b0: 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65   to populate the
f8c0: 20 6e 65 77 20 61 46 69 6c 65 5b 31 5d 2e 0a 2a   new aFile[1]..*
f8d0: 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
f8e0: 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
f8f0: 63 63 65 73 73 2c 20 6f 72 20 61 6e 20 53 51 4c  ccess, or an SQL
f900: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  ite error code o
f910: 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
f920: 74 69 63 20 69 6e 74 20 76 64 62 65 49 6e 63 72  tic int vdbeIncr
f930: 53 77 61 70 28 49 6e 63 72 4d 65 72 67 65 72 20  Swap(IncrMerger 
f940: 2a 70 49 6e 63 72 29 7b 0a 20 20 69 6e 74 20 72  *pIncr){.  int r
f950: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
f960: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57  #if SQLITE_MAX_W
f970: 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3e 30 0a  ORKER_THREADS>0.
f980: 20 20 69 66 28 20 70 49 6e 63 72 2d 3e 62 55 73    if( pIncr->bUs
f990: 65 54 68 72 65 61 64 20 29 7b 0a 20 20 20 20 72  eThread ){.    r
f9a0: 63 20 3d 20 76 64 62 65 53 6f 72 74 65 72 4a 6f  c = vdbeSorterJo
f9b0: 69 6e 54 68 72 65 61 64 28 70 49 6e 63 72 2d 3e  inThread(pIncr->
f9c0: 70 54 61 73 6b 29 3b 0a 0a 20 20 20 20 69 66 28  pTask);..    if(
f9d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
f9e0: 7b 0a 20 20 20 20 20 20 53 6f 72 74 65 72 46 69  {.      SorterFi
f9f0: 6c 65 20 66 30 20 3d 20 70 49 6e 63 72 2d 3e 61  le f0 = pIncr->a
fa00: 46 69 6c 65 5b 30 5d 3b 0a 20 20 20 20 20 20 70  File[0];.      p
fa10: 49 6e 63 72 2d 3e 61 46 69 6c 65 5b 30 5d 20 3d  Incr->aFile[0] =
fa20: 20 70 49 6e 63 72 2d 3e 61 46 69 6c 65 5b 31 5d   pIncr->aFile[1]
fa30: 3b 0a 20 20 20 20 20 20 70 49 6e 63 72 2d 3e 61  ;.      pIncr->a
fa40: 46 69 6c 65 5b 31 5d 20 3d 20 66 30 3b 0a 20 20  File[1] = f0;.  
fa50: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
fa60: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
fa70: 20 20 20 20 69 66 28 20 70 49 6e 63 72 2d 3e 61      if( pIncr->a
fa80: 46 69 6c 65 5b 30 5d 2e 69 45 6f 66 3d 3d 70 49  File[0].iEof==pI
fa90: 6e 63 72 2d 3e 69 53 74 61 72 74 4f 66 66 20 29  ncr->iStartOff )
faa0: 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 63 72 2d  {.        pIncr-
fab0: 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 20  >bEof = 1;.     
fac0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
fad0: 72 63 20 3d 20 76 64 62 65 49 6e 63 72 42 67 50  rc = vdbeIncrBgP
fae0: 6f 70 75 6c 61 74 65 28 70 49 6e 63 72 29 3b 0a  opulate(pIncr);.
faf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
fb00: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b  }else.#endif.  {
fb10: 0a 20 20 20 20 72 63 20 3d 20 76 64 62 65 49 6e  .    rc = vdbeIn
fb20: 63 72 50 6f 70 75 6c 61 74 65 28 70 49 6e 63 72  crPopulate(pIncr
fb30: 29 3b 0a 20 20 20 20 70 49 6e 63 72 2d 3e 61 46  );.    pIncr->aF
fb40: 69 6c 65 5b 30 5d 20 3d 20 70 49 6e 63 72 2d 3e  ile[0] = pIncr->
fb50: 61 46 69 6c 65 5b 31 5d 3b 0a 20 20 20 20 69 66  aFile[1];.    if
fb60: 28 20 70 49 6e 63 72 2d 3e 61 46 69 6c 65 5b 30  ( pIncr->aFile[0
fb70: 5d 2e 69 45 6f 66 3d 3d 70 49 6e 63 72 2d 3e 69  ].iEof==pIncr->i
fb80: 53 74 61 72 74 4f 66 66 20 29 7b 0a 20 20 20 20  StartOff ){.    
fb90: 20 20 70 49 6e 63 72 2d 3e 62 45 6f 66 20 3d 20    pIncr->bEof = 
fba0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
fbb0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
fbc0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
fbd0: 20 72 65 74 75 72 6e 20 61 20 6e 65 77 20 49 6e   return a new In
fbe0: 63 72 4d 65 72 67 65 72 20 6f 62 6a 65 63 74 20  crMerger object 
fbf0: 74 6f 20 72 65 61 64 20 64 61 74 61 20 66 72 6f  to read data fro
fc00: 6d 20 70 4d 65 72 67 65 72 2e 0a 2a 2a 0a 2a 2a  m pMerger..**.**
fc10: 20 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69   If an OOM condi
fc20: 74 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65  tion is encounte
fc30: 72 65 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  red, return NULL
fc40: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 66  . In this case f
fc50: 72 65 65 20 74 68 65 0a 2a 2a 20 70 4d 65 72 67  ree the.** pMerg
fc60: 65 72 20 61 72 67 75 6d 65 6e 74 20 62 65 66 6f  er argument befo
fc70: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
fc80: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
fc90: 49 6e 63 72 4d 65 72 67 65 72 4e 65 77 28 0a 20  IncrMergerNew(. 
fca0: 20 53 6f 72 74 53 75 62 74 61 73 6b 20 2a 70 54   SortSubtask *pT
fcb0: 61 73 6b 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  ask,     /* The 
fcc0: 74 68 72 65 61 64 20 74 68 61 74 20 77 69 6c 6c  thread that will
fcd0: 20 62 65 20 75 73 69 6e 67 20 74 68 65 20 6e 65   be using the ne
fce0: 77 20 49 6e 63 72 4d 65 72 67 65 72 20 2a 2f 0a  w IncrMerger */.
fcf0: 20 20 4d 65 72 67 65 45 6e 67 69 6e 65 20 2a 70    MergeEngine *p
fd00: 4d 65 72 67 65 72 2c 20 20 20 2f 2a 20 54 68 65  Merger,   /* The
fd10: 20 4d 65 72 67 65 45 6e 67 69 6e 65 20 74 68 61   MergeEngine tha
fd20: 74 20 74 68 65 20 49 6e 63 72 4d 65 72 67 65 72  t the IncrMerger
fd30: 20 77 69 6c 6c 20 63 6f 6e 74 72 6f 6c 20 2a 2f   will control */
fd40: 0a 20 20 49 6e 63 72 4d 65 72 67 65 72 20 2a 2a  .  IncrMerger **
fd50: 70 70 4f 75 74 20 20 20 20 20 20 2f 2a 20 57 72  ppOut      /* Wr
fd60: 69 74 65 20 74 68 65 20 6e 65 77 20 49 6e 63 72  ite the new Incr
fd70: 4d 65 72 67 65 72 20 68 65 72 65 20 2a 2f 0a 29  Merger here */.)
fd80: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
fd90: 49 54 45 5f 4f 4b 3b 0a 20 20 49 6e 63 72 4d 65  ITE_OK;.  IncrMe
fda0: 72 67 65 72 20 2a 70 49 6e 63 72 20 3d 20 2a 70  rger *pIncr = *p
fdb0: 70 4f 75 74 20 3d 20 28 49 6e 63 72 4d 65 72 67  pOut = (IncrMerg
fdc0: 65 72 2a 29 0a 20 20 20 20 20 20 20 28 73 71 6c  er*).       (sql
fdd0: 69 74 65 33 46 61 75 6c 74 53 69 6d 28 31 30 30  ite3FaultSim(100
fde0: 29 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33 4d  ) ? 0 : sqlite3M
fdf0: 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66  allocZero(sizeof
fe00: 28 2a 70 49 6e 63 72 29 29 29 3b 0a 20 20 69 66  (*pIncr)));.  if
fe10: 28 20 70 49 6e 63 72 20 29 7b 0a 20 20 20 20 70  ( pIncr ){.    p
fe20: 49 6e 63 72 2d 3e 70 4d 65 72 67 65 72 20 3d 20  Incr->pMerger = 
fe30: 70 4d 65 72 67 65 72 3b 0a 20 20 20 20 70 49 6e  pMerger;.    pIn
fe40: 63 72 2d 3e 70 54 61 73 6b 20 3d 20 70 54 61 73  cr->pTask = pTas
fe50: 6b 3b 0a 20 20 20 20 70 49 6e 63 72 2d 3e 6d 78  k;.    pIncr->mx
fe60: 53 7a 20 3d 20 4d 41 58 28 70 54 61 73 6b 2d 3e  Sz = MAX(pTask->
fe70: 70 53 6f 72 74 65 72 2d 3e 6d 78 4b 65 79 73 69  pSorter->mxKeysi
fe80: 7a 65 2b 39 2c 70 54 61 73 6b 2d 3e 70 53 6f 72  ze+9,pTask->pSor
fe90: 74 65 72 2d 3e 6d 78 50 6d 61 53 69 7a 65 2f 32  ter->mxPmaSize/2
fea0: 29 3b 0a 20 20 20 20 70 54 61 73 6b 2d 3e 66 69  );.    pTask->fi
feb0: 6c 65 32 2e 69 45 6f 66 20 2b 3d 20 70 49 6e 63  le2.iEof += pInc
fec0: 72 2d 3e 6d 78 53 7a 3b 0a 20 20 7d 65 6c 73 65  r->mxSz;.  }else
fed0: 7b 0a 20 20 20 20 76 64 62 65 4d 65 72 67 65 45  {.    vdbeMergeE
fee0: 6e 67 69 6e 65 46 72 65 65 28 70 4d 65 72 67 65  ngineFree(pMerge
fef0: 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  r);.    rc = SQL
ff00: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
ff10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
ff20: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f  if SQLITE_MAX_WO
ff30: 52 4b 45 52 5f 54 48 52 45 41 44 53 3e 30 0a 2f  RKER_THREADS>0./
ff40: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 22 75 73  *.** Set the "us
ff50: 65 2d 74 68 72 65 61 64 73 22 20 66 6c 61 67 20  e-threads" flag 
ff60: 6f 6e 20 6f 62 6a 65 63 74 20 70 49 6e 63 72 2e  on object pIncr.
ff70: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ff80: 76 64 62 65 49 6e 63 72 4d 65 72 67 65 72 53 65  vdbeIncrMergerSe
ff90: 74 54 68 72 65 61 64 73 28 49 6e 63 72 4d 65 72  tThreads(IncrMer
ffa0: 67 65 72 20 2a 70 49 6e 63 72 29 7b 0a 20 20 70  ger *pIncr){.  p
ffb0: 49 6e 63 72 2d 3e 62 55 73 65 54 68 72 65 61 64  Incr->bUseThread
ffc0: 20 3d 20 31 3b 0a 20 20 70 49 6e 63 72 2d 3e 70   = 1;.  pIncr->p
ffd0: 54 61 73 6b 2d 3e 66 69 6c 65 32 2e 69 45 6f 66  Task->file2.iEof
ffe0: 20 2d 3d 20 70 49 6e 63 72 2d 3e 6d 78 53 7a 3b   -= pIncr->mxSz;
fff0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
10000 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54  ITE_MAX_WORKER_T
10010 48 52 45 41 44 53 3e 30 20 2a 2f 0a 0a 0a 0a 2f  HREADS>0 */..../
10020 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 70  *.** Recompute p
10030 4d 65 72 67 65 72 2d 3e 61 54 72 65 65 5b 69 4f  Merger->aTree[iO
10040 75 74 5d 20 62 79 20 63 6f 6d 70 61 72 69 6e 67  ut] by comparing
10050 20 74 68 65 20 6e 65 78 74 20 6b 65 79 73 20 6f   the next keys o
10060 6e 20 74 68 65 0a 2a 2a 20 74 77 6f 20 50 6d 61  n the.** two Pma
10070 52 65 61 64 65 72 73 20 74 68 61 74 20 66 65 65  Readers that fee
10080 64 20 74 68 61 74 20 65 6e 74 72 79 2e 20 20 4e  d that entry.  N
10090 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 50 6d  either of the Pm
100a0 61 52 65 61 64 65 72 73 0a 2a 2a 20 61 72 65 20  aReaders.** are 
100b0 61 64 76 61 6e 63 65 64 2e 20 20 54 68 69 73 20  advanced.  This 
100c0 72 6f 75 74 69 6e 65 20 6d 65 72 65 6c 79 20 64  routine merely d
100d0 6f 65 73 20 74 68 65 20 63 6f 6d 70 61 72 69 73  oes the comparis
100e0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
100f0 69 64 20 76 64 62 65 4d 65 72 67 65 45 6e 67 69  id vdbeMergeEngi
10100 6e 65 43 6f 6d 70 61 72 65 28 0a 20 20 4d 65 72  neCompare(.  Mer
10110 67 65 45 6e 67 69 6e 65 20 2a 70 4d 65 72 67 65  geEngine *pMerge
10120 72 2c 20 20 2f 2a 20 4d 65 72 67 65 20 65 6e 67  r,  /* Merge eng
10130 69 6e 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 50  ine containing P
10140 6d 61 52 65 61 64 65 72 73 20 74 6f 20 63 6f 6d  maReaders to com
10150 70 61 72 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  pare */.  int iO
10160 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
10170 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65   /* Store the re
10180 73 75 6c 74 20 69 6e 20 70 4d 65 72 67 65 72 2d  sult in pMerger-
10190 3e 61 54 72 65 65 5b 69 4f 75 74 5d 20 2a 2f 0a  >aTree[iOut] */.
101a0 29 7b 0a 20 20 69 6e 74 20 69 31 3b 0a 20 20 69  ){.  int i1;.  i
101b0 6e 74 20 69 32 3b 0a 20 20 69 6e 74 20 69 52 65  nt i2;.  int iRe
101c0 73 3b 0a 20 20 50 6d 61 52 65 61 64 65 72 20 2a  s;.  PmaReader *
101d0 70 31 3b 0a 20 20 50 6d 61 52 65 61 64 65 72 20  p1;.  PmaReader 
101e0 2a 70 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  *p2;..  assert( 
101f0 69 4f 75 74 3c 70 4d 65 72 67 65 72 2d 3e 6e 54  iOut<pMerger->nT
10200 72 65 65 20 26 26 20 69 4f 75 74 3e 30 20 29 3b  ree && iOut>0 );
10210 0a 0a 20 20 69 66 28 20 69 4f 75 74 3e 3d 28 70  ..  if( iOut>=(p
10220 4d 65 72 67 65 72 2d 3e 6e 54 72 65 65 2f 32 29  Merger->nTree/2)
10230 20 29 7b 0a 20 20 20 20 69 31 20 3d 20 28 69 4f   ){.    i1 = (iO
10240 75 74 20 2d 20 70 4d 65 72 67 65 72 2d 3e 6e 54  ut - pMerger->nT
10250 72 65 65 2f 32 29 20 2a 20 32 3b 0a 20 20 20 20  ree/2) * 2;.    
10260 69 32 20 3d 20 69 31 20 2b 20 31 3b 0a 20 20 7d  i2 = i1 + 1;.  }
10270 65 6c 73 65 7b 0a 20 20 20 20 69 31 20 3d 20 70  else{.    i1 = p
10280 4d 65 72 67 65 72 2d 3e 61 54 72 65 65 5b 69 4f  Merger->aTree[iO
10290 75 74 2a 32 5d 3b 0a 20 20 20 20 69 32 20 3d 20  ut*2];.    i2 = 
102a0 70 4d 65 72 67 65 72 2d 3e 61 54 72 65 65 5b 69  pMerger->aTree[i
102b0 4f 75 74 2a 32 2b 31 5d 3b 0a 20 20 7d 0a 0a 20  Out*2+1];.  }.. 
102c0 20 70 31 20 3d 20 26 70 4d 65 72 67 65 72 2d 3e   p1 = &pMerger->
102d0 61 52 65 61 64 72 5b 69 31 5d 3b 0a 20 20 70 32  aReadr[i1];.  p2
102e0 20 3d 20 26 70 4d 65 72 67 65 72 2d 3e 61 52 65   = &pMerger->aRe
102f0 61 64 72 5b 69 32 5d 3b 0a 0a 20 20 69 66 28 20  adr[i2];..  if( 
10300 70 31 2d 3e 70 46 64 3d 3d 30 20 29 7b 0a 20 20  p1->pFd==0 ){.  
10310 20 20 69 52 65 73 20 3d 20 69 32 3b 0a 20 20 7d    iRes = i2;.  }
10320 65 6c 73 65 20 69 66 28 20 70 32 2d 3e 70 46 64  else if( p2->pFd
10330 3d 3d 30 20 29 7b 0a 20 20 20 20 69 52 65 73 20  ==0 ){.    iRes 
10340 3d 20 69 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = i1;.  }else{. 
10350 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20     int res;.    
10360 61 73 73 65 72 74 28 20 70 4d 65 72 67 65 72 2d  assert( pMerger-
10370 3e 70 54 61 73 6b 2d 3e 70 55 6e 70 61 63 6b 65  >pTask->pUnpacke
10380 64 21 3d 30 20 29 3b 20 20 2f 2a 20 66 72 6f 6d  d!=0 );  /* from
10390 20 76 64 62 65 53 6f 72 74 53 75 62 74 61 73 6b   vdbeSortSubtask
103a0 4d 61 69 6e 28 29 20 2a 2f 0a 20 20 20 20 72 65  Main() */.    re
103b0 73 20 3d 20 76 64 62 65 53 6f 72 74 65 72 43 6f  s = vdbeSorterCo
103c0 6d 70 61 72 65 28 0a 20 20 20 20 20 20 20 20 70  mpare(.        p
103d0 4d 65 72 67 65 72 2d 3e 70 54 61 73 6b 2c 20 70  Merger->pTask, p
103e0 31 2d 3e 61 4b 65 79 2c 20 70 31 2d 3e 6e 4b 65  1->aKey, p1->nKe
103f0 79 2c 20 70 32 2d 3e 61 4b 65 79 2c 20 70 32 2d  y, p2->aKey, p2-
10400 3e 6e 4b 65 79 0a 20 20 20 20 29 3b 0a 20 20 20  >nKey.    );.   
10410 20 69 66 28 20 72 65 73 3c 3d 30 20 29 7b 0a 20   if( res<=0 ){. 
10420 20 20 20 20 20 69 52 65 73 20 3d 20 69 31 3b 0a       iRes = i1;.
10430 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10440 20 69 52 65 73 20 3d 20 69 32 3b 0a 20 20 20 20   iRes = i2;.    
10450 7d 0a 20 20 7d 0a 0a 20 20 70 4d 65 72 67 65 72  }.  }..  pMerger
10460 2d 3e 61 54 72 65 65 5b 69 4f 75 74 5d 20 3d 20  ->aTree[iOut] = 
10470 69 52 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  iRes;.}../*.** A
10480 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f  llowed values fo
10490 72 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61  r the eMode para
104a0 6d 65 74 65 72 20 74 6f 20 76 64 62 65 4d 65 72  meter to vdbeMer
104b0 67 65 45 6e 67 69 6e 65 49 6e 69 74 28 29 0a 2a  geEngineInit().*
104c0 2a 20 61 6e 64 20 76 64 62 65 50 6d 61 52 65 61  * and vdbePmaRea
104d0 64 65 72 49 6e 63 72 4d 65 72 67 65 49 6e 69 74  derIncrMergeInit
104e0 28 29 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 49  ()..**.** Only I
104f0 4e 43 52 49 4e 49 54 5f 4e 4f 52 4d 41 4c 20 69  NCRINIT_NORMAL i
10500 73 20 76 61 6c 69 64 20 69 6e 20 73 69 6e 67 6c  s valid in singl
10510 65 2d 74 68 72 65 61 64 65 64 20 62 75 69 6c 64  e-threaded build
10520 73 20 28 77 68 65 6e 0a 2a 2a 20 53 51 4c 49 54  s (when.** SQLIT
10530 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
10540 45 41 44 53 3d 3d 30 29 2e 20 20 54 68 65 20 6f  EADS==0).  The o
10550 74 68 65 72 20 76 61 6c 75 65 73 20 61 72 65 20  ther values are 
10560 6f 6e 6c 79 20 75 73 65 64 0a 2a 2a 20 77 68 65  only used.** whe
10570 6e 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6f  n there exists o
10580 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  ne or more separ
10590 61 74 65 20 77 6f 72 6b 65 72 20 74 68 72 65 61  ate worker threa
105a0 64 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49  ds..*/.#define I
105b0 4e 43 52 49 4e 49 54 5f 4e 4f 52 4d 41 4c 20 30  NCRINIT_NORMAL 0
105c0 0a 23 64 65 66 69 6e 65 20 49 4e 43 52 49 4e 49  .#define INCRINI
105d0 54 5f 54 41 53 4b 20 20 20 31 0a 23 64 65 66 69  T_TASK   1.#defi
105e0 6e 65 20 49 4e 43 52 49 4e 49 54 5f 52 4f 4f 54  ne INCRINIT_ROOT
105f0 20 20 20 32 0a 0a 2f 2a 20 46 6f 72 77 61 72 64     2../* Forward
10600 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20 54   reference..** T
10610 68 65 20 76 64 62 65 49 6e 63 72 4d 65 72 67 65  he vdbeIncrMerge
10620 49 6e 69 74 28 29 20 61 6e 64 20 76 64 62 65 50  Init() and vdbeP
10630 6d 61 52 65 61 64 65 72 49 6e 63 72 4d 65 72 67  maReaderIncrMerg
10640 65 49 6e 69 74 28 29 20 72 6f 75 74 69 6e 65 73  eInit() routines
10650 20 63 61 6c 6c 20 65 61 63 68 0a 2a 2a 20 6f 74   call each.** ot
10660 68 65 72 20 28 77 68 65 6e 20 62 75 69 6c 64 69  her (when buildi
10670 6e 67 20 61 20 6d 65 72 67 65 20 74 72 65 65 29  ng a merge tree)
10680 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10690 76 64 62 65 50 6d 61 52 65 61 64 65 72 49 6e 63  vdbePmaReaderInc
106a0 72 4d 65 72 67 65 49 6e 69 74 28 50 6d 61 52 65  rMergeInit(PmaRe
106b0 61 64 65 72 20 2a 70 52 65 61 64 72 2c 20 69 6e  ader *pReadr, in
106c0 74 20 65 4d 6f 64 65 29 3b 0a 0a 2f 2a 0a 2a 2a  t eMode);../*.**
106d0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
106e0 4d 65 72 67 65 45 6e 67 69 6e 65 20 6f 62 6a 65  MergeEngine obje
106f0 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
10700 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
10710 2e 20 4f 6e 63 65 20 74 68 69 73 0a 2a 2a 20 66  . Once this.** f
10720 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c  unction returns,
10730 20 74 68 65 20 66 69 72 73 74 20 6b 65 79 20 6f   the first key o
10740 66 20 6d 65 72 67 65 64 20 64 61 74 61 20 6d 61  f merged data ma
10750 79 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  y be read from t
10760 68 65 20 0a 2a 2a 20 4d 65 72 67 65 45 6e 67 69  he .** MergeEngi
10770 6e 65 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  ne object in the
10780 20 75 73 75 61 6c 20 66 61 73 68 69 6f 6e 2e 0a   usual fashion..
10790 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
107a0 74 20 65 4d 6f 64 65 20 69 73 20 49 4e 43 52 49  t eMode is INCRI
107b0 4e 49 54 5f 52 4f 4f 54 2c 20 74 68 65 6e 20 69  NIT_ROOT, then i
107c0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
107d0 74 20 61 6e 79 20 49 6e 63 72 4d 65 72 67 65 0a  t any IncrMerge.
107e0 2a 2a 20 6f 62 6a 65 63 74 73 20 61 74 74 61 63  ** objects attac
107f0 68 65 64 20 74 6f 20 74 68 65 20 50 6d 61 52 65  hed to the PmaRe
10800 61 64 65 72 20 6f 62 6a 65 63 74 73 20 74 68 61  ader objects tha
10810 74 20 74 68 65 20 6d 65 72 67 65 72 20 72 65 61  t the merger rea
10820 64 73 20 66 72 6f 6d 20 68 61 76 65 0a 2a 2a 20  ds from have.** 
10830 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6f 70  already been pop
10840 75 6c 61 74 65 64 2c 20 62 75 74 20 74 68 61 74  ulated, but that
10850 20 74 68 65 79 20 68 61 76 65 20 6e 6f 74 20 79   they have not y
10860 65 74 20 70 6f 70 75 6c 61 74 65 64 20 61 46 69  et populated aFi
10870 6c 65 5b 30 5d 20 61 6e 64 0a 2a 2a 20 73 65 74  le[0] and.** set
10880 20 74 68 65 20 50 6d 61 52 65 61 64 65 72 20 6f   the PmaReader o
10890 62 6a 65 63 74 73 20 75 70 20 74 6f 20 72 65 61  bjects up to rea
108a0 64 20 66 72 6f 6d 20 69 74 2e 20 49 6e 20 74 68  d from it. In th
108b0 69 73 20 63 61 73 65 20 61 6c 6c 20 74 68 61 74  is case all that
108c0 20 69 73 0a 2a 2a 20 72 65 71 75 69 72 65 64 20   is.** required 
108d0 69 73 20 74 6f 20 63 61 6c 6c 20 76 64 62 65 50  is to call vdbeP
108e0 6d 61 52 65 61 64 65 72 4e 65 78 74 28 29 20 6f  maReaderNext() o
108f0 6e 20 65 61 63 68 20 50 6d 61 52 65 61 64 65 72  n each PmaReader
10900 20 74 6f 20 70 6f 69 6e 74 20 69 74 20 61 74 0a   to point it at.
10910 2a 2a 20 69 74 73 20 66 69 72 73 74 20 6b 65 79  ** its first key
10920 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
10930 65 2c 20 69 66 20 65 4d 6f 64 65 20 69 73 20 61  e, if eMode is a
10940 6e 79 20 76 61 6c 75 65 20 6f 74 68 65 72 20 74  ny value other t
10950 68 61 6e 20 49 4e 43 52 49 4e 49 54 5f 52 4f 4f  han INCRINIT_ROO
10960 54 2c 20 74 68 65 6e 20 75 73 65 20 0a 2a 2a 20  T, then use .** 
10970 76 64 62 65 50 6d 61 52 65 61 64 65 72 49 6e 63  vdbePmaReaderInc
10980 72 4d 65 72 67 65 49 6e 69 74 28 29 20 74 6f 20  rMergeInit() to 
10990 69 6e 69 74 69 61 6c 69 7a 65 20 65 61 63 68 20  initialize each 
109a0 50 6d 61 52 65 61 64 65 72 20 74 68 61 74 20 66  PmaReader that f
109b0 65 65 64 73 20 64 61 74 61 20 0a 2a 2a 20 74 6f  eeds data .** to
109c0 20 70 4d 65 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20   pMerger..**.** 
109d0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
109e0 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
109f0 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
10a00 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  e error code oth
10a10 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
10a20 63 20 69 6e 74 20 76 64 62 65 4d 65 72 67 65 45  c int vdbeMergeE
10a30 6e 67 69 6e 65 49 6e 69 74 28 0a 20 20 53 6f 72  ngineInit(.  Sor
10a40 74 53 75 62 74 61 73 6b 20 2a 70 54 61 73 6b 2c  tSubtask *pTask,
10a50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10a60 54 68 72 65 61 64 20 74 68 61 74 20 77 69 6c 6c  Thread that will
10a70 20 72 75 6e 20 70 4d 65 72 67 65 72 20 2a 2f 0a   run pMerger */.
10a80 20 20 4d 65 72 67 65 45 6e 67 69 6e 65 20 2a 70    MergeEngine *p
10a90 4d 65 72 67 65 72 2c 20 20 20 20 20 20 20 20 20  Merger,         
10aa0 20 20 2f 2a 20 4d 65 72 67 65 45 6e 67 69 6e 65    /* MergeEngine
10ab0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 2a   to initialize *
10ac0 2f 0a 20 20 69 6e 74 20 65 4d 6f 64 65 20 20 20  /.  int eMode   
10ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ae0 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
10af0 65 20 49 4e 43 52 49 4e 49 54 5f 58 58 58 20 63  e INCRINIT_XXX c
10b00 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 29 7b 0a 20  onstants */.){. 
10b10 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
10b20 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
10b30 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
10b40 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
10b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b60 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
10b70 69 6e 67 20 6f 76 65 72 20 50 6d 61 52 65 61 64  ing over PmaRead
10b80 65 72 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  er objects */.  
10b90 69 6e 74 20 6e 54 72 65 65 20 3d 20 70 4d 65 72  int nTree = pMer
10ba0 67 65 72 2d 3e 6e 54 72 65 65 3b 0a 0a 20 20 2f  ger->nTree;..  /
10bb0 2a 20 65 4d 6f 64 65 20 69 73 20 61 6c 77 61 79  * eMode is alway
10bc0 73 20 49 4e 43 52 49 4e 49 54 5f 4e 4f 52 4d 41  s INCRINIT_NORMA
10bd0 4c 20 69 6e 20 73 69 6e 67 6c 65 2d 74 68 72 65  L in single-thre
10be0 61 64 65 64 20 6d 6f 64 65 20 2a 2f 0a 20 20 61  aded mode */.  a
10bf0 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4d 41  ssert( SQLITE_MA
10c00 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  X_WORKER_THREADS
10c10 3e 30 20 7c 7c 20 65 4d 6f 64 65 3d 3d 49 4e 43  >0 || eMode==INC
10c20 52 49 4e 49 54 5f 4e 4f 52 4d 41 4c 20 29 3b 0a  RINIT_NORMAL );.
10c30 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .  /* Verify tha
10c40 74 20 74 68 65 20 4d 65 72 67 65 45 6e 67 69 6e  t the MergeEngin
10c50 65 20 69 73 20 61 73 73 69 67 6e 65 64 20 74 6f  e is assigned to
10c60 20 61 20 73 69 6e 67 6c 65 20 74 68 72 65 61 64   a single thread
10c70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4d   */.  assert( pM
10c80 65 72 67 65 72 2d 3e 70 54 61 73 6b 3d 3d 30 20  erger->pTask==0 
10c90 29 3b 0a 20 20 70 4d 65 72 67 65 72 2d 3e 70 54  );.  pMerger->pT
10ca0 61 73 6b 20 3d 20 70 54 61 73 6b 3b 0a 0a 20 20  ask = pTask;..  
10cb0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 72 65 65  for(i=0; i<nTree
10cc0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
10cd0 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45  SQLITE_MAX_WORKE
10ce0 52 5f 54 48 52 45 41 44 53 3e 30 20 26 26 20 65  R_THREADS>0 && e
10cf0 4d 6f 64 65 3d 3d 49 4e 43 52 49 4e 49 54 5f 52  Mode==INCRINIT_R
10d00 4f 4f 54 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  OOT ){.      /* 
10d10 50 6d 61 52 65 61 64 65 72 73 20 73 68 6f 75 6c  PmaReaders shoul
10d20 64 20 62 65 20 6e 6f 72 6d 61 6c 6c 79 20 69 6e  d be normally in
10d30 69 74 69 61 6c 69 7a 65 64 20 69 6e 20 6f 72 64  itialized in ord
10d40 65 72 2c 20 61 73 20 69 66 20 74 68 65 79 20 61  er, as if they a
10d50 72 65 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64  re.      ** read
10d60 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 73 61 6d  ing from the sam
10d70 65 20 74 65 6d 70 20 66 69 6c 65 20 74 68 69 73  e temp file this
10d80 20 6d 61 6b 65 73 20 66 6f 72 20 6d 6f 72 65 20   makes for more 
10d90 6c 69 6e 65 61 72 20 66 69 6c 65 20 49 4f 2e 0a  linear file IO..
10da0 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72        ** However
10db0 2c 20 69 6e 20 74 68 65 20 49 4e 43 52 49 4e 49  , in the INCRINI
10dc0 54 5f 52 4f 4f 54 20 63 61 73 65 2c 20 69 66 20  T_ROOT case, if 
10dd0 50 6d 61 52 65 61 64 65 72 20 61 52 65 61 64 72  PmaReader aReadr
10de0 5b 6e 54 61 73 6b 2d 31 5d 20 69 73 0a 20 20 20  [nTask-1] is.   
10df0 20 20 20 2a 2a 20 69 6e 20 75 73 65 20 69 74 20     ** in use it 
10e00 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 65 20 76  will block the v
10e10 64 62 65 50 6d 61 52 65 61 64 65 72 4e 65 78 74  dbePmaReaderNext
10e20 28 29 20 63 61 6c 6c 20 77 68 69 6c 65 20 69 74  () call while it
10e30 20 75 73 65 73 0a 20 20 20 20 20 20 2a 2a 20 74   uses.      ** t
10e40 68 65 20 6d 61 69 6e 20 74 68 72 65 61 64 20 74  he main thread t
10e50 6f 20 66 69 6c 6c 20 69 74 73 20 62 75 66 66 65  o fill its buffe
10e60 72 2e 20 53 6f 20 63 61 6c 6c 69 6e 67 20 50 6d  r. So calling Pm
10e70 61 52 65 61 64 65 72 4e 65 78 74 28 29 0a 20 20  aReaderNext().  
10e80 20 20 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 50      ** on this P
10e90 6d 61 52 65 61 64 65 72 20 62 65 66 6f 72 65 20  maReader before 
10ea0 61 6e 79 20 6f 66 20 74 68 65 20 6d 75 6c 74 69  any of the multi
10eb0 2d 74 68 72 65 61 64 65 64 20 50 6d 61 52 65 61  -threaded PmaRea
10ec0 64 65 72 73 20 74 61 6b 65 73 0a 20 20 20 20 20  ders takes.     
10ed0 20 2a 2a 20 62 65 74 74 65 72 20 61 64 76 61 6e   ** better advan
10ee0 74 61 67 65 20 6f 66 20 6d 75 6c 74 69 2d 70 72  tage of multi-pr
10ef0 6f 63 65 73 73 6f 72 20 68 61 72 64 77 61 72 65  ocessor hardware
10f00 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  . */.      rc = 
10f10 76 64 62 65 50 6d 61 52 65 61 64 65 72 4e 65 78  vdbePmaReaderNex
10f20 74 28 26 70 4d 65 72 67 65 72 2d 3e 61 52 65 61  t(&pMerger->aRea
10f30 64 72 5b 6e 54 72 65 65 2d 69 2d 31 5d 29 3b 0a  dr[nTree-i-1]);.
10f40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10f50 20 72 63 20 3d 20 76 64 62 65 50 6d 61 52 65 61   rc = vdbePmaRea
10f60 64 65 72 49 6e 63 72 4d 65 72 67 65 49 6e 69 74  derIncrMergeInit
10f70 28 26 70 4d 65 72 67 65 72 2d 3e 61 52 65 61 64  (&pMerger->aRead
10f80 72 5b 69 5d 2c 20 49 4e 43 52 49 4e 49 54 5f 4e  r[i], INCRINIT_N
10f90 4f 52 4d 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  ORMAL);.    }.  
10fa0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10fb0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
10fc0 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 70 4d  .  }..  for(i=pM
10fd0 65 72 67 65 72 2d 3e 6e 54 72 65 65 2d 31 3b 20  erger->nTree-1; 
10fe0 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 76  i>0; i--){.    v
10ff0 64 62 65 4d 65 72 67 65 45 6e 67 69 6e 65 43 6f  dbeMergeEngineCo
11000 6d 70 61 72 65 28 70 4d 65 72 67 65 72 2c 20 69  mpare(pMerger, i
11010 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
11020 70 54 61 73 6b 2d 3e 70 55 6e 70 61 63 6b 65 64  pTask->pUnpacked
11030 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a  ->errCode;.}../*
11040 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
11050 68 65 20 49 6e 63 72 4d 65 72 67 65 20 66 69 65  he IncrMerge fie
11060 6c 64 20 6f 66 20 61 20 50 6d 61 52 65 61 64 65  ld of a PmaReade
11070 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
11080 50 6d 61 52 65 61 64 65 72 20 70 61 73 73 65 64  PmaReader passed
11090 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
110a0 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 61 6e  gument is not an
110b0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 72 65 61   incremental-rea
110c0 64 65 72 0a 2a 2a 20 28 69 66 20 70 52 65 61 64  der.** (if pRead
110d0 72 2d 3e 70 49 6e 63 72 3d 3d 30 29 2c 20 74 68  r->pIncr==0), th
110e0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
110f0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68   is a no-op. Oth
11100 65 72 77 69 73 65 2c 20 69 74 20 73 65 72 76 65  erwise, it serve
11110 73 0a 2a 2a 20 74 6f 20 6f 70 65 6e 20 61 6e 64  s.** to open and
11120 2f 6f 72 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  /or initialize t
11130 68 65 20 74 65 6d 70 20 66 69 6c 65 20 72 65 6c  he temp file rel
11140 61 74 65 64 20 66 69 65 6c 64 73 20 6f 66 20 74  ated fields of t
11150 68 65 20 49 6e 63 72 4d 65 72 67 65 0a 2a 2a 20  he IncrMerge.** 
11160 6f 62 6a 65 63 74 20 61 74 20 28 70 52 65 61 64  object at (pRead
11170 72 2d 3e 70 49 6e 63 72 29 2e 0a 2a 2a 0a 2a 2a  r->pIncr)..**.**
11180 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4d 6f   If argument eMo
11190 64 65 20 69 73 20 73 65 74 20 74 6f 20 49 4e 43  de is set to INC
111a0 52 49 4e 49 54 5f 4e 4f 52 4d 41 4c 2c 20 74 68  RINIT_NORMAL, th
111b0 65 6e 20 61 6c 6c 20 50 6d 61 52 65 61 64 65 72  en all PmaReader
111c0 73 0a 2a 2a 20 69 6e 20 74 68 65 20 73 75 62 2d  s.** in the sub-
111d0 74 72 65 65 20 68 65 61 64 65 64 20 62 79 20 70  tree headed by p
111e0 52 65 61 64 72 20 61 72 65 20 61 6c 73 6f 20 69  Readr are also i
111f0 6e 69 74 69 61 6c 69 7a 65 64 2e 20 44 61 74 61  nitialized. Data
11200 20 69 73 20 74 68 65 6e 20 6c 6f 61 64 65 64 0a   is then loaded.
11210 2a 2a 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66  ** into the buff
11220 65 72 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  ers belonging to
11230 20 70 52 65 61 64 72 20 61 6e 64 20 69 74 20 69   pReadr and it i
11240 73 20 73 65 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e  s set to.** poin
11250 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 6b  t to the first k
11260 65 79 20 69 6e 20 69 74 73 20 72 61 6e 67 65 2e  ey in its range.
11270 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  .**.** If argume
11280 6e 74 20 65 4d 6f 64 65 20 69 73 20 73 65 74 20  nt eMode is set 
11290 74 6f 20 49 4e 43 52 49 4e 49 54 5f 54 41 53 4b  to INCRINIT_TASK
112a0 2c 20 74 68 65 6e 20 70 52 65 61 64 72 20 69 73  , then pReadr is
112b0 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74   guaranteed.** t
112c0 6f 20 62 65 20 61 20 6d 75 6c 74 69 2d 74 68 72  o be a multi-thr
112d0 65 61 64 65 64 20 50 6d 61 52 65 61 64 65 72 20  eaded PmaReader 
112e0 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
112f0 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  n is being calle
11300 64 20 69 6e 20 61 0a 2a 2a 20 62 61 63 6b 67 72  d in a.** backgr
11310 6f 75 6e 64 20 74 68 72 65 61 64 2e 20 49 6e 20  ound thread. In 
11320 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 50 6d  this case all Pm
11330 61 52 65 61 64 65 72 73 20 69 6e 20 74 68 65 20  aReaders in the 
11340 73 75 62 2d 74 72 65 65 20 61 72 65 20 0a 2a 2a  sub-tree are .**
11350 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 73 20   initialized as 
11360 66 6f 72 20 49 4e 43 52 49 4e 49 54 5f 4e 4f 52  for INCRINIT_NOR
11370 4d 41 4c 20 61 6e 64 20 74 68 65 20 61 46 69 6c  MAL and the aFil
11380 65 5b 31 5d 20 62 75 66 66 65 72 20 62 65 6c 6f  e[1] buffer belo
11390 6e 67 69 6e 67 20 74 6f 0a 2a 2a 20 70 52 65 61  nging to.** pRea
113a0 64 72 20 69 73 20 70 6f 70 75 6c 61 74 65 64 2e  dr is populated.
113b0 20 48 6f 77 65 76 65 72 2c 20 70 52 65 61 64 72   However, pReadr
113c0 20 69 74 73 65 6c 66 20 69 73 20 6e 6f 74 20 73   itself is not s
113d0 65 74 20 75 70 20 74 6f 20 70 6f 69 6e 74 0a 2a  et up to point.*
113e0 2a 20 74 6f 20 69 74 73 20 66 69 72 73 74 20 6b  * to its first k
113f0 65 79 2e 20 41 20 63 61 6c 6c 20 74 6f 20 76 64  ey. A call to vd
11400 62 65 50 6d 61 52 65 61 64 65 72 4e 65 78 74 28  bePmaReaderNext(
11410 29 20 69 73 20 73 74 69 6c 6c 20 72 65 71 75 69  ) is still requi
11420 72 65 64 20 74 6f 20 64 6f 0a 2a 2a 20 74 68 61  red to do.** tha
11430 74 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  t. .**.** The re
11440 61 73 6f 6e 20 74 68 69 73 20 66 75 6e 63 74 69  ason this functi
11450 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 61 6c 6c  on does not call
11460 20 76 64 62 65 50 6d 61 52 65 61 64 65 72 4e 65   vdbePmaReaderNe
11470 78 74 28 29 20 69 6d 6d 65 64 69 61 74 65 6c 79  xt() immediately
11480 20 0a 2a 2a 20 69 6e 20 74 68 65 20 49 4e 43 52   .** in the INCR
11490 49 4e 49 54 5f 54 41 53 4b 20 63 61 73 65 20 69  INIT_TASK case i
114a0 73 20 74 68 61 74 20 76 64 62 65 50 6d 61 52 65  s that vdbePmaRe
114b0 61 64 65 72 4e 65 78 74 28 29 20 61 73 73 75 6d  aderNext() assum
114c0 65 73 20 74 68 61 74 20 69 74 20 68 61 73 0a 2a  es that it has.*
114d0 2a 20 74 6f 20 62 6c 6f 63 6b 20 6f 6e 20 74 68  * to block on th
114e0 72 65 61 64 20 28 70 54 61 73 6b 2d 3e 74 68 72  read (pTask->thr
114f0 65 61 64 29 20 62 65 66 6f 72 65 20 61 63 63 65  ead) before acce
11500 73 73 69 6e 67 20 61 46 69 6c 65 5b 31 5d 2e 20  ssing aFile[1]. 
11510 42 75 74 2c 20 73 69 6e 63 65 0a 2a 2a 20 74 68  But, since.** th
11520 69 73 20 65 6e 74 69 72 65 20 66 75 6e 63 74 69  is entire functi
11530 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 75 6e 20  on is being run 
11540 62 79 20 74 68 72 65 61 64 20 28 70 54 61 73 6b  by thread (pTask
11550 2d 3e 74 68 72 65 61 64 29 2c 20 74 68 61 74 20  ->thread), that 
11560 77 69 6c 6c 0a 2a 2a 20 6c 65 61 64 20 74 6f 20  will.** lead to 
11570 74 68 65 20 63 75 72 72 65 6e 74 20 62 61 63 6b  the current back
11580 67 72 6f 75 6e 64 20 74 68 72 65 61 64 20 61 74  ground thread at
11590 74 65 6d 70 74 69 6e 67 20 74 6f 20 6a 6f 69 6e  tempting to join
115a0 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 46   itself..**.** F
115b0 69 6e 61 6c 6c 79 2c 20 69 66 20 61 72 67 75 6d  inally, if argum
115c0 65 6e 74 20 65 4d 6f 64 65 20 69 73 20 73 65 74  ent eMode is set
115d0 20 74 6f 20 49 4e 43 52 49 4e 49 54 5f 52 4f 4f   to INCRINIT_ROO
115e0 54 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73 73  T, it may be ass
115f0 75 6d 65 64 0a 2a 2a 20 74 68 61 74 20 70 52 65  umed.** that pRe
11600 61 64 72 2d 3e 70 49 6e 63 72 20 69 73 20 61 20  adr->pIncr is a 
11610 6d 75 6c 74 69 2d 74 68 72 65 61 64 65 64 20 49  multi-threaded I
11620 6e 63 72 4d 65 72 67 65 20 6f 62 6a 65 63 74 73  ncrMerge objects
11630 2c 20 61 6e 64 20 74 68 61 74 20 61 6c 6c 0a 2a  , and that all.*
11640 2a 20 63 68 69 6c 64 2d 74 72 65 65 73 20 68 61  * child-trees ha
11650 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
11660 69 6e 69 74 69 61 6c 69 7a 65 64 20 75 73 69 6e  initialized usin
11670 67 20 49 6e 63 72 49 6e 69 74 28 49 4e 43 52 49  g IncrInit(INCRI
11680 4e 49 54 5f 54 41 53 4b 29 2e 0a 2a 2a 20 49 6e  NIT_TASK)..** In
11690 20 74 68 69 73 20 63 61 73 65 20 76 64 62 65 50   this case vdbeP
116a0 6d 61 52 65 61 64 65 72 4e 65 78 74 28 29 20 69  maReaderNext() i
116b0 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6c 6c 20  s called on all 
116c0 63 68 69 6c 64 20 50 6d 61 52 65 61 64 65 72 73  child PmaReaders
116d0 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72   and.** the curr
116e0 65 6e 74 20 50 6d 61 52 65 61 64 65 72 20 73 65  ent PmaReader se
116f0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
11700 65 20 66 69 72 73 74 20 6b 65 79 20 69 6e 20 69  e first key in i
11710 74 73 20 72 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20  ts range..**.** 
11720 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
11730 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
11740 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
11750 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  e error code oth
11760 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
11770 63 20 69 6e 74 20 76 64 62 65 50 6d 61 52 65 61  c int vdbePmaRea
11780 64 65 72 49 6e 63 72 4d 65 72 67 65 49 6e 69 74  derIncrMergeInit
11790 28 50 6d 61 52 65 61 64 65 72 20 2a 70 52 65 61  (PmaReader *pRea
117a0 64 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a  dr, int eMode){.
117b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
117c0 45 5f 4f 4b 3b 0a 20 20 49 6e 63 72 4d 65 72 67  E_OK;.  IncrMerg
117d0 65 72 20 2a 70 49 6e 63 72 20 3d 20 70 52 65 61  er *pIncr = pRea
117e0 64 72 2d 3e 70 49 6e 63 72 3b 0a 0a 20 20 2f 2a  dr->pIncr;..  /*
117f0 20 65 4d 6f 64 65 20 69 73 20 61 6c 77 61 79 73   eMode is always
11800 20 49 4e 43 52 49 4e 49 54 5f 4e 4f 52 4d 41 4c   INCRINIT_NORMAL
11810 20 69 6e 20 73 69 6e 67 6c 65 2d 74 68 72 65 61   in single-threa
11820 64 65 64 20 6d 6f 64 65 20 2a 2f 0a 20 20 61 73  ded mode */.  as
11830 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4d 41 58  sert( SQLITE_MAX
11840 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3e  _WORKER_THREADS>
11850 30 20 7c 7c 20 65 4d 6f 64 65 3d 3d 49 4e 43 52  0 || eMode==INCR
11860 49 4e 49 54 5f 4e 4f 52 4d 41 4c 20 29 3b 0a 0a  INIT_NORMAL );..
11870 20 20 69 66 28 20 70 49 6e 63 72 20 29 7b 0a 20    if( pIncr ){. 
11880 20 20 20 53 6f 72 74 53 75 62 74 61 73 6b 20 2a     SortSubtask *
11890 70 54 61 73 6b 20 3d 20 70 49 6e 63 72 2d 3e 70  pTask = pIncr->p
118a0 54 61 73 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65  Task;.    sqlite
118b0 33 20 2a 64 62 20 3d 20 70 54 61 73 6b 2d 3e 70  3 *db = pTask->p
118c0 53 6f 72 74 65 72 2d 3e 64 62 3b 0a 0a 20 20 20  Sorter->db;..   
118d0 20 72 63 20 3d 20 76 64 62 65 4d 65 72 67 65 45   rc = vdbeMergeE
118e0 6e 67 69 6e 65 49 6e 69 74 28 70 54 61 73 6b 2c  ngineInit(pTask,
118f0 20 70 49 6e 63 72 2d 3e 70 4d 65 72 67 65 72 2c   pIncr->pMerger,
11900 20 65 4d 6f 64 65 29 3b 0a 0a 20 20 20 20 2f 2a   eMode);..    /*
11910 20 53 65 74 20 75 70 20 74 68 65 20 72 65 71 75   Set up the requ
11920 69 72 65 64 20 66 69 6c 65 73 20 66 6f 72 20 70  ired files for p
11930 49 6e 63 72 2e 20 41 20 6d 75 6c 74 69 2d 74 68  Incr. A multi-th
11940 65 61 64 65 64 20 49 6e 63 72 4d 65 72 67 65 20  eaded IncrMerge 
11950 6f 62 6a 65 63 74 0a 20 20 20 20 2a 2a 20 72 65  object.    ** re
11960 71 75 69 72 65 73 20 74 77 6f 20 74 65 6d 70 20  quires two temp 
11970 66 69 6c 65 73 20 74 6f 20 69 74 73 65 6c 66 2c  files to itself,
11980 20 77 68 65 72 65 61 73 20 61 20 73 69 6e 67 6c   whereas a singl
11990 65 2d 74 68 72 65 61 64 65 64 20 6f 62 6a 65 63  e-threaded objec
119a0 74 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 72 65  t.    ** only re
119b0 71 75 69 72 65 73 20 61 20 72 65 67 69 6f 6e 20  quires a region 
119c0 6f 66 20 70 54 61 73 6b 2d 3e 66 69 6c 65 32 2e  of pTask->file2.
119d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
119e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
119f0 20 20 20 69 6e 74 20 6d 78 53 7a 20 3d 20 70 49     int mxSz = pI
11a00 6e 63 72 2d 3e 6d 78 53 7a 3b 0a 23 69 66 20 53  ncr->mxSz;.#if S
11a10 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52  QLITE_MAX_WORKER
11a20 5f 54 48 52 45 41 44 53 3e 30 0a 20 20 20 20 20  _THREADS>0.     
11a30 20 69 66 28 20 70 49 6e 63 72 2d 3e 62 55 73 65   if( pIncr->bUse
11a40 54 68 72 65 61 64 20 29 7b 0a 20 20 20 20 20 20  Thread ){.      
11a50 20 20 72 63 20 3d 20 76 64 62 65 53 6f 72 74 65    rc = vdbeSorte
11a60 72 4f 70 65 6e 54 65 6d 70 46 69 6c 65 28 64 62  rOpenTempFile(db
11a70 2c 20 6d 78 53 7a 2c 20 26 70 49 6e 63 72 2d 3e  , mxSz, &pIncr->
11a80 61 46 69 6c 65 5b 30 5d 2e 70 46 64 29 3b 0a 20  aFile[0].pFd);. 
11a90 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
11aa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11ab0 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 53        rc = vdbeS
11ac0 6f 72 74 65 72 4f 70 65 6e 54 65 6d 70 46 69 6c  orterOpenTempFil
11ad0 65 28 64 62 2c 20 6d 78 53 7a 2c 20 26 70 49 6e  e(db, mxSz, &pIn
11ae0 63 72 2d 3e 61 46 69 6c 65 5b 31 5d 2e 70 46 64  cr->aFile[1].pFd
11af0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
11b00 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
11b10 20 20 20 20 20 20 2f 2a 69 66 28 20 21 70 49 6e        /*if( !pIn
11b20 63 72 2d 3e 62 55 73 65 54 68 72 65 61 64 20 29  cr->bUseThread )
11b30 2a 2f 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  */{.        if( 
11b40 70 54 61 73 6b 2d 3e 66 69 6c 65 32 2e 70 46 64  pTask->file2.pFd
11b50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
11b60 20 61 73 73 65 72 74 28 20 70 54 61 73 6b 2d 3e   assert( pTask->
11b70 66 69 6c 65 32 2e 69 45 6f 66 3e 30 20 29 3b 0a  file2.iEof>0 );.
11b80 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 76            rc = v
11b90 64 62 65 53 6f 72 74 65 72 4f 70 65 6e 54 65 6d  dbeSorterOpenTem
11ba0 70 46 69 6c 65 28 64 62 2c 20 70 54 61 73 6b 2d  pFile(db, pTask-
11bb0 3e 66 69 6c 65 32 2e 69 45 6f 66 2c 20 26 70 54  >file2.iEof, &pT
11bc0 61 73 6b 2d 3e 66 69 6c 65 32 2e 70 46 64 29 3b  ask->file2.pFd);
11bd0 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 73 6b  .          pTask
11be0 2d 3e 66 69 6c 65 32 2e 69 45 6f 66 20 3d 20 30  ->file2.iEof = 0
11bf0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11c00 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
11c10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11c20 20 20 20 70 49 6e 63 72 2d 3e 61 46 69 6c 65 5b     pIncr->aFile[
11c30 31 5d 2e 70 46 64 20 3d 20 70 54 61 73 6b 2d 3e  1].pFd = pTask->
11c40 66 69 6c 65 32 2e 70 46 64 3b 0a 20 20 20 20 20  file2.pFd;.     
11c50 20 20 20 20 20 70 49 6e 63 72 2d 3e 69 53 74 61       pIncr->iSta
11c60 72 74 4f 66 66 20 3d 20 70 54 61 73 6b 2d 3e 66  rtOff = pTask->f
11c70 69 6c 65 32 2e 69 45 6f 66 3b 0a 20 20 20 20 20  ile2.iEof;.     
11c80 20 20 20 20 20 70 54 61 73 6b 2d 3e 66 69 6c 65       pTask->file
11c90 32 2e 69 45 6f 66 20 2b 3d 20 6d 78 53 7a 3b 0a  2.iEof += mxSz;.
11ca0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11cb0 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 20 53 51 4c  }.    }..#if SQL
11cc0 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54  ITE_MAX_WORKER_T
11cd0 48 52 45 41 44 53 3e 30 0a 20 20 20 20 69 66 28  HREADS>0.    if(
11ce0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
11cf0 26 20 70 49 6e 63 72 2d 3e 62 55 73 65 54 68 72  & pIncr->bUseThr
11d00 65 61 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ead ){.      /* 
11d10 55 73 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  Use the current 
11d20 74 68 72 65 61 64 20 74 6f 20 70 6f 70 75 6c 61  thread to popula
11d30 74 65 20 61 46 69 6c 65 5b 31 5d 2c 20 65 76 65  te aFile[1], eve
11d40 6e 20 74 68 6f 75 67 68 20 74 68 69 73 0a 20 20  n though this.  
11d50 20 20 20 20 2a 2a 20 50 6d 61 52 65 61 64 65 72      ** PmaReader
11d60 20 69 73 20 6d 75 6c 74 69 2d 74 68 72 65 61 64   is multi-thread
11d70 65 64 2e 20 54 68 65 20 72 65 61 73 6f 6e 20 62  ed. The reason b
11d80 65 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 66  eing that this f
11d90 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  unction.      **
11da0 20 69 73 20 61 6c 72 65 61 64 79 20 72 75 6e 6e   is already runn
11db0 69 6e 67 20 69 6e 20 62 61 63 6b 67 72 6f 75 6e  ing in backgroun
11dc0 64 20 74 68 72 65 61 64 20 70 49 6e 63 72 2d 3e  d thread pIncr->
11dd0 70 54 61 73 6b 2d 3e 74 68 72 65 61 64 2e 20 2a  pTask->thread. *
11de0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
11df0 65 4d 6f 64 65 3d 3d 49 4e 43 52 49 4e 49 54 5f  eMode==INCRINIT_
11e00 52 4f 4f 54 20 7c 7c 20 65 4d 6f 64 65 3d 3d 49  ROOT || eMode==I
11e10 4e 43 52 49 4e 49 54 5f 54 41 53 4b 20 29 3b 0a  NCRINIT_TASK );.
11e20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 49        rc = vdbeI
11e30 6e 63 72 50 6f 70 75 6c 61 74 65 28 70 49 6e 63  ncrPopulate(pInc
11e40 72 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  r);.    }.#endif
11e50 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
11e60 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 26 26 20  LITE_OK.     && 
11e70 28 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b  (SQLITE_MAX_WORK
11e80 45 52 5f 54 48 52 45 41 44 53 3d 3d 30 20 7c 7c  ER_THREADS==0 ||
11e90 20 65 4d 6f 64 65 21 3d 49 4e 43 52 49 4e 49 54   eMode!=INCRINIT
11ea0 5f 54 41 53 4b 29 0a 20 20 20 20 29 7b 0a 20 20  _TASK).    ){.  
11eb0 20 20 20 20 72 63 20 3d 20 76 64 62 65 50 6d 61      rc = vdbePma
11ec0 52 65 61 64 65 72 4e 65 78 74 28 70 52 65 61 64  ReaderNext(pRead
11ed0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
11ee0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
11ef0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52  f SQLITE_MAX_WOR
11f00 4b 45 52 5f 54 48 52 45 41 44 53 3e 30 0a 2f 2a  KER_THREADS>0./*
11f10 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f 75  .** The main rou
11f20 74 69 6e 65 20 66 6f 72 20 76 64 62 65 50 6d 61  tine for vdbePma
11f30 52 65 61 64 65 72 49 6e 63 72 4d 65 72 67 65 49  ReaderIncrMergeI
11f40 6e 69 74 28 29 20 6f 70 65 72 61 74 69 6f 6e 73  nit() operations
11f50 20 72 75 6e 20 69 6e 20 0a 2a 2a 20 62 61 63 6b   run in .** back
11f60 67 72 6f 75 6e 64 20 74 68 72 65 61 64 73 2e 0a  ground threads..
11f70 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
11f80 76 64 62 65 50 6d 61 52 65 61 64 65 72 42 67 49  vdbePmaReaderBgI
11f90 6e 69 74 28 76 6f 69 64 20 2a 70 43 74 78 29 7b  nit(void *pCtx){
11fa0 0a 20 20 50 6d 61 52 65 61 64 65 72 20 2a 70 52  .  PmaReader *pR
11fb0 65 61 64 65 72 20 3d 20 28 50 6d 61 52 65 61 64  eader = (PmaRead
11fc0 65 72 2a 29 70 43 74 78 3b 0a 20 20 76 6f 69 64  er*)pCtx;.  void
11fd0 20 2a 70 52 65 74 20 3d 20 53 51 4c 49 54 45 5f   *pRet = SQLITE_
11fe0 49 4e 54 5f 54 4f 5f 50 54 52 28 0a 20 20 20 20  INT_TO_PTR(.    
11ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76 64                vd
12000 62 65 50 6d 61 52 65 61 64 65 72 49 6e 63 72 4d  bePmaReaderIncrM
12010 65 72 67 65 49 6e 69 74 28 70 52 65 61 64 65 72  ergeInit(pReader
12020 2c 49 4e 43 52 49 4e 49 54 5f 54 41 53 4b 29 0a  ,INCRINIT_TASK).
12030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29                 )
12040 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e 70 49 6e  ;.  pReader->pIn
12050 63 72 2d 3e 70 54 61 73 6b 2d 3e 62 44 6f 6e 65  cr->pTask->bDone
12060 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70   = 1;.  return p
12070 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  Ret;.}../*.** Us
12080 65 20 61 20 62 61 63 6b 67 72 6f 75 6e 64 20 74  e a background t
12090 68 72 65 61 64 20 74 6f 20 69 6e 76 6f 6b 65 20  hread to invoke 
120a0 76 64 62 65 50 6d 61 52 65 61 64 65 72 49 6e 63  vdbePmaReaderInc
120b0 72 4d 65 72 67 65 49 6e 69 74 28 49 4e 43 52 49  rMergeInit(INCRI
120c0 4e 49 54 5f 54 41 53 4b 29 20 0a 2a 2a 20 6f 6e  NIT_TASK) .** on
120d0 20 74 68 65 20 74 68 65 20 50 6d 61 52 65 61 64   the the PmaRead
120e0 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  er object passed
120f0 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
12100 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  gument..**.** Th
12110 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 69 6e 69  is call will ini
12120 74 69 61 6c 69 7a 65 20 74 68 65 20 76 61 72 69  tialize the vari
12130 6f 75 73 20 66 69 65 6c 64 73 20 6f 66 20 74 68  ous fields of th
12140 65 20 70 52 65 61 64 72 2d 3e 70 49 6e 63 72 20  e pReadr->pIncr 
12150 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 61 6e  .** structure an
12160 64 2c 20 69 66 20 69 74 20 69 73 20 61 20 6d 75  d, if it is a mu
12170 6c 74 69 2d 74 68 72 65 61 64 65 64 20 49 6e 63  lti-threaded Inc
12180 72 4d 65 72 67 65 72 2c 20 6c 61 75 6e 63 68 20  rMerger, launch 
12190 61 20 0a 2a 2a 20 62 61 63 6b 67 72 6f 75 6e 64  a .** background
121a0 20 74 68 72 65 61 64 20 74 6f 20 70 6f 70 75 6c   thread to popul
121b0 61 74 65 20 61 46 69 6c 65 5b 31 5d 2e 0a 2a 2f  ate aFile[1]..*/
121c0 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
121d0 50 6d 61 52 65 61 64 65 72 42 67 49 6e 63 72 49  PmaReaderBgIncrI
121e0 6e 69 74 28 50 6d 61 52 65 61 64 65 72 20 2a 70  nit(PmaReader *p
121f0 52 65 61 64 72 29 7b 0a 20 20 76 6f 69 64 20 2a  Readr){.  void *
12200 70 43 74 78 20 3d 20 28 76 6f 69 64 2a 29 70 52  pCtx = (void*)pR
12210 65 61 64 72 3b 0a 20 20 72 65 74 75 72 6e 20 76  eadr;.  return v
12220 64 62 65 53 6f 72 74 65 72 43 72 65 61 74 65 54  dbeSorterCreateT
12230 68 72 65 61 64 28 70 52 65 61 64 72 2d 3e 70 49  hread(pReadr->pI
12240 6e 63 72 2d 3e 70 54 61 73 6b 2c 20 76 64 62 65  ncr->pTask, vdbe
12250 50 6d 61 52 65 61 64 65 72 42 67 49 6e 69 74 2c  PmaReaderBgInit,
12260 20 70 43 74 78 29 3b 0a 7d 0a 23 65 6e 64 69 66   pCtx);.}.#endif
12270 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
12280 20 61 20 6e 65 77 20 4d 65 72 67 65 45 6e 67 69   a new MergeEngi
12290 6e 65 20 6f 62 6a 65 63 74 20 74 6f 20 6d 65 72  ne object to mer
122a0 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ge the contents 
122b0 6f 66 20 6e 50 4d 41 20 6c 65 76 65 6c 2d 30 0a  of nPMA level-0.
122c0 2a 2a 20 50 4d 41 73 20 66 72 6f 6d 20 70 54 61  ** PMAs from pTa
122d0 73 6b 2d 3e 66 69 6c 65 2e 20 49 66 20 6e 6f 20  sk->file. If no 
122e0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
122f0 74 20 2a 70 70 4f 75 74 20 74 6f 20 70 6f 69 6e  t *ppOut to poin
12300 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20  t to.** the new 
12310 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72  object and retur
12320 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 72 2c  n SQLITE_OK. Or,
12330 20 69 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65   if an error doe
12340 73 20 6f 63 63 75 72 2c 20 73 65 74 20 2a 70 70  s occur, set *pp
12350 4f 75 74 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 20 61  Out.** to NULL a
12360 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  nd return an SQL
12370 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
12380 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
12390 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
123a0 65 64 2c 20 2a 70 69 4f 66 66 73 65 74 20 69 73  ed, *piOffset is
123b0 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73   set to the offs
123c0 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72  et of the.** fir
123d0 73 74 20 50 4d 41 20 74 6f 20 72 65 61 64 20 66  st PMA to read f
123e0 72 6f 6d 20 70 54 61 73 6b 2d 3e 66 69 6c 65 2e  rom pTask->file.
123f0 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72   Assuming no err
12400 6f 72 20 6f 63 63 75 72 73 2c 20 69 74 20 69 73  or occurs, it is
12410 20 0a 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20   .** set to the 
12420 6f 66 66 73 65 74 20 69 6d 6d 65 64 69 61 74 65  offset immediate
12430 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
12440 20 6c 61 73 74 20 62 79 74 65 20 6f 66 20 74 68   last byte of th
12450 65 20 6c 61 73 74 0a 2a 2a 20 50 4d 41 20 62 65  e last.** PMA be
12460 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20  fore returning. 
12470 49 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73  If an error does
12480 20 6f 63 63 75 72 2c 20 74 68 65 6e 20 74 68 65   occur, then the
12490 20 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 0a   final value of.
124a0 2a 2a 20 2a 70 69 4f 66 66 73 65 74 20 69 73 20  ** *piOffset is 
124b0 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
124c0 61 74 69 63 20 69 6e 74 20 76 64 62 65 4d 65 72  atic int vdbeMer
124d0 67 65 45 6e 67 69 6e 65 4c 65 76 65 6c 30 28 0a  geEngineLevel0(.
124e0 20 20 53 6f 72 74 53 75 62 74 61 73 6b 20 2a 70    SortSubtask *p
124f0 54 61 73 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Task,           
12500 20 20 2f 2a 20 53 6f 72 74 65 72 20 74 61 73 6b    /* Sorter task
12510 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
12520 0a 20 20 69 6e 74 20 6e 50 4d 41 2c 20 20 20 20  .  int nPMA,    
12530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12540 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
12550 50 4d 41 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a  PMAs to read */.
12560 20 20 69 36 34 20 2a 70 69 4f 66 66 73 65 74 2c    i64 *piOffset,
12570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12580 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 52 65 61    /* IN/OUT: Rea
12590 64 72 20 6f 66 66 73 65 74 20 69 6e 20 70 54 61  dr offset in pTa
125a0 73 6b 2d 3e 66 69 6c 65 20 2a 2f 0a 20 20 4d 65  sk->file */.  Me
125b0 72 67 65 45 6e 67 69 6e 65 20 2a 2a 70 70 4f 75  rgeEngine **ppOu
125c0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t             /*
125d0 20 4f 55 54 3a 20 4e 65 77 20 6d 65 72 67 65 2d   OUT: New merge-
125e0 65 6e 67 69 6e 65 20 2a 2f 0a 29 7b 0a 20 20 4d  engine */.){.  M
125f0 65 72 67 65 45 6e 67 69 6e 65 20 2a 70 4e 65 77  ergeEngine *pNew
12600 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
12610 2a 20 4d 65 72 67 65 20 65 6e 67 69 6e 65 20 74  * Merge engine t
12620 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 36  o return */.  i6
12630 34 20 69 4f 66 66 20 3d 20 2a 70 69 4f 66 66 73  4 iOff = *piOffs
12640 65 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  et;.  int i;.  i
12650 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
12660 4b 3b 0a 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70  K;..  *ppOut = p
12670 4e 65 77 20 3d 20 76 64 62 65 4d 65 72 67 65 45  New = vdbeMergeE
12680 6e 67 69 6e 65 4e 65 77 28 6e 50 4d 41 29 3b 0a  ngineNew(nPMA);.
12690 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
126a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
126b0 4d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  M;..  for(i=0; i
126c0 3c 6e 50 4d 41 20 26 26 20 72 63 3d 3d 53 51 4c  <nPMA && rc==SQL
126d0 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20  ITE_OK; i++){.  
126e0 20 20 69 36 34 20 6e 44 75 6d 6d 79 3b 0a 20 20    i64 nDummy;.  
126f0 20 20 50 6d 61 52 65 61 64 65 72 20 2a 70 52 65    PmaReader *pRe
12700 61 64 72 20 3d 20 26 70 4e 65 77 2d 3e 61 52 65  adr = &pNew->aRe
12710 61 64 72 5b 69 5d 3b 0a 20 20 20 20 72 63 20 3d  adr[i];.    rc =
12720 20 76 64 62 65 50 6d 61 52 65 61 64 65 72 49 6e   vdbePmaReaderIn
12730 69 74 28 70 54 61 73 6b 2c 20 26 70 54 61 73 6b  it(pTask, &pTask
12740 2d 3e 66 69 6c 65 2c 20 69 4f 66 66 2c 20 70 52  ->file, iOff, pR
12750 65 61 64 72 2c 20 26 6e 44 75 6d 6d 79 29 3b 0a  eadr, &nDummy);.
12760 20 20 20 20 69 4f 66 66 20 3d 20 70 52 65 61 64      iOff = pRead
12770 72 2d 3e 69 45 6f 66 3b 0a 20 20 7d 0a 0a 20 20  r->iEof;.  }..  
12780 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12790 4b 20 29 7b 0a 20 20 20 20 76 64 62 65 4d 65 72  K ){.    vdbeMer
127a0 67 65 45 6e 67 69 6e 65 46 72 65 65 28 70 4e 65  geEngineFree(pNe
127b0 77 29 3b 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d  w);.    *ppOut =
127c0 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 69 4f 66 66   0;.  }.  *piOff
127d0 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 72 65  set = iOff;.  re
127e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
127f0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 70  * Return the dep
12800 74 68 20 6f 66 20 61 20 74 72 65 65 20 63 6f 6d  th of a tree com
12810 70 72 69 73 69 6e 67 20 6e 50 4d 41 20 50 4d 41  prising nPMA PMA
12820 73 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 66 61  s, assuming a fa
12830 6e 6f 75 74 20 6f 66 0a 2a 2a 20 53 4f 52 54 45  nout of.** SORTE
12840 52 5f 4d 41 58 5f 4d 45 52 47 45 5f 43 4f 55 4e  R_MAX_MERGE_COUN
12850 54 2e 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  T. The returned 
12860 76 61 6c 75 65 20 64 6f 65 73 20 6e 6f 74 20 69  value does not i
12870 6e 63 6c 75 64 65 20 6c 65 61 66 20 6e 6f 64 65  nclude leaf node
12880 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 2e 0a 2a 2a  s..**.** i.e..**
12890 0a 2a 2a 20 20 20 6e 50 4d 41 3c 3d 31 36 20 20  .**   nPMA<=16  
128a0 20 20 2d 3e 20 54 72 65 65 44 65 70 74 68 28 29    -> TreeDepth()
128b0 20 3d 3d 20 30 0a 2a 2a 20 20 20 6e 50 4d 41 3c   == 0.**   nPMA<
128c0 3d 32 35 36 20 20 20 2d 3e 20 54 72 65 65 44 65  =256   -> TreeDe
128d0 70 74 68 28 29 20 3d 3d 20 31 0a 2a 2a 20 20 20  pth() == 1.**   
128e0 6e 50 4d 41 3c 3d 36 35 35 33 36 20 2d 3e 20 54  nPMA<=65536 -> T
128f0 72 65 65 44 65 70 74 68 28 29 20 3d 3d 20 32 0a  reeDepth() == 2.
12900 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
12910 62 65 53 6f 72 74 65 72 54 72 65 65 44 65 70 74  beSorterTreeDept
12920 68 28 69 6e 74 20 6e 50 4d 41 29 7b 0a 20 20 69  h(int nPMA){.  i
12930 6e 74 20 6e 44 65 70 74 68 20 3d 20 30 3b 0a 20  nt nDepth = 0;. 
12940 20 69 36 34 20 6e 44 69 76 20 3d 20 53 4f 52 54   i64 nDiv = SORT
12950 45 52 5f 4d 41 58 5f 4d 45 52 47 45 5f 43 4f 55  ER_MAX_MERGE_COU
12960 4e 54 3b 0a 20 20 77 68 69 6c 65 28 20 6e 44 69  NT;.  while( nDi
12970 76 20 3c 20 28 69 36 34 29 6e 50 4d 41 20 29 7b  v < (i64)nPMA ){
12980 0a 20 20 20 20 6e 44 69 76 20 3d 20 6e 44 69 76  .    nDiv = nDiv
12990 20 2a 20 53 4f 52 54 45 52 5f 4d 41 58 5f 4d 45   * SORTER_MAX_ME
129a0 52 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 20 20 6e  RGE_COUNT;.    n
129b0 44 65 70 74 68 2b 2b 3b 0a 20 20 7d 0a 20 20 72  Depth++;.  }.  r
129c0 65 74 75 72 6e 20 6e 44 65 70 74 68 3b 0a 7d 0a  eturn nDepth;.}.
129d0 0a 2f 2a 0a 2a 2a 20 70 52 6f 6f 74 20 69 73 20  ./*.** pRoot is 
129e0 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20 69  the root of an i
129f0 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65  ncremental merge
12a00 2d 74 72 65 65 20 77 69 74 68 20 64 65 70 74 68  -tree with depth
12a10 20 6e 44 65 70 74 68 20 28 61 63 63 6f 72 64 69   nDepth (accordi
12a20 6e 67 0a 2a 2a 20 74 6f 20 76 64 62 65 53 6f 72  ng.** to vdbeSor
12a30 74 65 72 54 72 65 65 44 65 70 74 68 28 29 29 2e  terTreeDepth()).
12a40 20 70 4c 65 61 66 20 69 73 20 74 68 65 20 69 53   pLeaf is the iS
12a50 65 71 27 74 68 20 6c 65 61 66 20 74 6f 20 62 65  eq'th leaf to be
12a60 20 61 64 64 65 64 20 74 6f 20 74 68 65 0a 2a 2a   added to the.**
12a70 20 74 72 65 65 2c 20 63 6f 75 6e 74 69 6e 67 20   tree, counting 
12a80 66 72 6f 6d 20 7a 65 72 6f 2e 20 54 68 69 73 20  from zero. This 
12a90 66 75 6e 63 74 69 6f 6e 20 61 64 64 73 20 70 4c  function adds pL
12aa0 65 61 66 20 74 6f 20 74 68 65 20 74 72 65 65 2e  eaf to the tree.
12ab0 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
12ac0 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
12ad0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
12ae0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
12af0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
12b00 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75  .** code is retu
12b10 72 6e 65 64 20 61 6e 64 20 70 4c 65 61 66 20 69  rned and pLeaf i
12b20 73 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74  s freed..*/.stat
12b30 69 63 20 69 6e 74 20 76 64 62 65 53 6f 72 74 65  ic int vdbeSorte
12b40 72 41 64 64 54 6f 54 72 65 65 28 0a 20 20 53 6f  rAddToTree(.  So
12b50 72 74 53 75 62 74 61 73 6b 20 2a 70 54 61 73 6b  rtSubtask *pTask
12b60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
12b70 20 54 61 73 6b 20 63 6f 6e 74 65 78 74 20 2a 2f   Task context */
12b80 0a 20 20 69 6e 74 20 6e 44 65 70 74 68 2c 20 20  .  int nDepth,  
12b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ba0 20 20 20 2f 2a 20 44 65 70 74 68 20 6f 66 20 74     /* Depth of t
12bb0 72 65 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ree according to
12bc0 20 54 72 65 65 44 65 70 74 68 28 29 20 2a 2f 0a   TreeDepth() */.
12bd0 20 20 69 6e 74 20 69 53 65 71 2c 20 20 20 20 20    int iSeq,     
12be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12bf0 20 20 2f 2a 20 53 65 71 75 65 6e 63 65 20 6e 75    /* Sequence nu
12c00 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 77 69 74  mber of leaf wit
12c10 68 69 6e 20 74 72 65 65 20 2a 2f 0a 20 20 4d 65  hin tree */.  Me
12c20 72 67 65 45 6e 67 69 6e 65 20 2a 70 52 6f 6f 74  rgeEngine *pRoot
12c30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
12c40 20 52 6f 6f 74 20 6f 66 20 74 72 65 65 20 2a 2f   Root of tree */
12c50 0a 20 20 4d 65 72 67 65 45 6e 67 69 6e 65 20 2a  .  MergeEngine *
12c60 70 4c 65 61 66 20 20 20 20 20 20 20 20 20 20 20  pLeaf           
12c70 20 20 20 2f 2a 20 4c 65 61 66 20 74 6f 20 61 64     /* Leaf to ad
12c80 64 20 74 6f 20 74 72 65 65 20 2a 2f 0a 29 7b 0a  d to tree */.){.
12c90 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12ca0 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 44 69 76  E_OK;.  int nDiv
12cb0 20 3d 20 31 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 1;.  int i;. 
12cc0 20 4d 65 72 67 65 45 6e 67 69 6e 65 20 2a 70 20   MergeEngine *p 
12cd0 3d 20 70 52 6f 6f 74 3b 0a 20 20 49 6e 63 72 4d  = pRoot;.  IncrM
12ce0 65 72 67 65 72 20 2a 70 49 6e 63 72 3b 0a 0a 20  erger *pIncr;.. 
12cf0 20 72 63 20 3d 20 76 64 62 65 49 6e 63 72 4d 65   rc = vdbeIncrMe
12d00 72 67 65 72 4e 65 77 28 70 54 61 73 6b 2c 20 70  rgerNew(pTask, p
12d10 4c 65 61 66 2c 20 26 70 49 6e 63 72 29 3b 0a 0a  Leaf, &pIncr);..
12d20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 44 65    for(i=1; i<nDe
12d30 70 74 68 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e  pth; i++){.    n
12d40 44 69 76 20 3d 20 6e 44 69 76 20 2a 20 53 4f 52  Div = nDiv * SOR
12d50 54 45 52 5f 4d 41 58 5f 4d 45 52 47 45 5f 43 4f  TER_MAX_MERGE_CO
12d60 55 4e 54 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28  UNT;.  }..  for(
12d70 69 3d 31 3b 20 69 3c 6e 44 65 70 74 68 20 26 26  i=1; i<nDepth &&
12d80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
12d90 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 49  i++){.    int iI
12da0 74 65 72 20 3d 20 28 69 53 65 71 20 2f 20 6e 44  ter = (iSeq / nD
12db0 69 76 29 20 25 20 53 4f 52 54 45 52 5f 4d 41 58  iv) % SORTER_MAX
12dc0 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 3b 0a 20 20  _MERGE_COUNT;.  
12dd0 20 20 50 6d 61 52 65 61 64 65 72 20 2a 70 52 65    PmaReader *pRe
12de0 61 64 72 20 3d 20 26 70 2d 3e 61 52 65 61 64 72  adr = &p->aReadr
12df0 5b 69 49 74 65 72 5d 3b 0a 0a 20 20 20 20 69 66  [iIter];..    if
12e00 28 20 70 52 65 61 64 72 2d 3e 70 49 6e 63 72 3d  ( pReadr->pIncr=
12e10 3d 30 20 29 7b 0a 20 20 20 20 20 20 4d 65 72 67  =0 ){.      Merg
12e20 65 45 6e 67 69 6e 65 20 2a 70 4e 65 77 20 3d 20  eEngine *pNew = 
12e30 76 64 62 65 4d 65 72 67 65 45 6e 67 69 6e 65 4e  vdbeMergeEngineN
12e40 65 77 28 53 4f 52 54 45 52 5f 4d 41 58 5f 4d 45  ew(SORTER_MAX_ME
12e50 52 47 45 5f 43 4f 55 4e 54 29 3b 0a 20 20 20 20  RGE_COUNT);.    
12e60 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
12e70 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
12e80 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
12e90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12ea0 20 72 63 20 3d 20 76 64 62 65 49 6e 63 72 4d 65   rc = vdbeIncrMe
12eb0 72 67 65 72 4e 65 77 28 70 54 61 73 6b 2c 20 70  rgerNew(pTask, p
12ec0 4e 65 77 2c 20 26 70 52 65 61 64 72 2d 3e 70 49  New, &pReadr->pI
12ed0 6e 63 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ncr);.      }.  
12ee0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
12ef0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12f00 20 20 20 70 20 3d 20 70 52 65 61 64 72 2d 3e 70     p = pReadr->p
12f10 49 6e 63 72 2d 3e 70 4d 65 72 67 65 72 3b 0a 20  Incr->pMerger;. 
12f20 20 20 20 20 20 6e 44 69 76 20 3d 20 6e 44 69 76       nDiv = nDiv
12f30 20 2f 20 53 4f 52 54 45 52 5f 4d 41 58 5f 4d 45   / SORTER_MAX_ME
12f40 52 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 20 20 7d  RGE_COUNT;.    }
12f50 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
12f60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12f70 20 70 2d 3e 61 52 65 61 64 72 5b 69 53 65 71 20   p->aReadr[iSeq 
12f80 25 20 53 4f 52 54 45 52 5f 4d 41 58 5f 4d 45 52  % SORTER_MAX_MER
12f90 47 45 5f 43 4f 55 4e 54 5d 2e 70 49 6e 63 72 20  GE_COUNT].pIncr 
12fa0 3d 20 70 49 6e 63 72 3b 0a 20 20 7d 65 6c 73 65  = pIncr;.  }else
12fb0 7b 0a 20 20 20 20 76 64 62 65 49 6e 63 72 46 72  {.    vdbeIncrFr
12fc0 65 65 28 70 49 6e 63 72 29 3b 0a 20 20 7d 0a 20  ee(pIncr);.  }. 
12fd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12fe0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
12ff0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20  on is called as 
13000 70 61 72 74 20 6f 66 20 61 20 53 6f 72 74 65 72  part of a Sorter
13010 52 65 77 69 6e 64 28 29 20 6f 70 65 72 61 74 69  Rewind() operati
13020 6f 6e 20 6f 6e 20 61 20 73 6f 72 74 65 72 0a 2a  on on a sorter.*
13030 2a 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61  * that has alrea
13040 64 79 20 77 72 69 74 74 65 6e 20 74 77 6f 20 6f  dy written two o
13050 72 20 6d 6f 72 65 20 6c 65 76 65 6c 2d 30 20 50  r more level-0 P
13060 4d 41 73 20 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f  MAs to one or mo
13070 72 65 20 74 65 6d 70 0a 2a 2a 20 66 69 6c 65 73  re temp.** files
13080 2e 20 49 74 20 62 75 69 6c 64 73 20 61 20 74 72  . It builds a tr
13090 65 65 20 6f 66 20 4d 65 72 67 65 45 6e 67 69 6e  ee of MergeEngin
130a0 65 2f 49 6e 63 72 4d 65 72 67 65 72 2f 50 6d 61  e/IncrMerger/Pma
130b0 52 65 61 64 65 72 20 6f 62 6a 65 63 74 73 20 74  Reader objects t
130c0 68 61 74 20 0a 2a 2a 20 63 61 6e 20 62 65 20 75  hat .** can be u
130d0 73 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74  sed to increment
130e0 61 6c 6c 79 20 6d 65 72 67 65 20 61 6c 6c 20 50  ally merge all P
130f0 4d 41 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 0a  MAs on disk..**.
13100 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
13110 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
13120 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 4f  eturned and *ppO
13130 75 74 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  ut set to point 
13140 74 6f 20 74 68 65 0a 2a 2a 20 4d 65 72 67 65 45  to the.** MergeE
13150 6e 67 69 6e 65 20 6f 62 6a 65 63 74 20 61 74 20  ngine object at 
13160 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  the root of the 
13170 74 72 65 65 20 62 65 66 6f 72 65 20 72 65 74 75  tree before retu
13180 72 6e 69 6e 67 2e 20 4f 72 2c 20 69 66 20 61 6e  rning. Or, if an
13190 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73  .** error occurs
131a0 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
131b0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
131c0 65 64 20 61 6e 64 20 74 68 65 20 66 69 6e 61 6c  ed and the final
131d0 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 2a 70   value .** of *p
131e0 70 4f 75 74 20 69 73 20 75 6e 64 65 66 69 6e 65  pOut is undefine
131f0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
13200 20 76 64 62 65 53 6f 72 74 65 72 4d 65 72 67 65   vdbeSorterMerge
13210 54 72 65 65 42 75 69 6c 64 28 0a 20 20 56 64 62  TreeBuild(.  Vdb
13220 65 53 6f 72 74 65 72 20 2a 70 53 6f 72 74 65 72  eSorter *pSorter
13230 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56  ,       /* The V
13240 44 42 45 20 63 75 72 73 6f 72 20 74 68 61 74 20  DBE cursor that 
13250 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73  implements the s
13260 6f 72 74 20 2a 2f 0a 20 20 4d 65 72 67 65 45 6e  ort */.  MergeEn
13270 67 69 6e 65 20 2a 2a 70 70 4f 75 74 20 20 20 20  gine **ppOut    
13280 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
13290 20 4d 65 72 67 65 45 6e 67 69 6e 65 20 68 65 72   MergeEngine her
132a0 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 72 67 65 45  e */.){.  MergeE
132b0 6e 67 69 6e 65 20 2a 70 4d 61 69 6e 20 3d 20 30  ngine *pMain = 0
132c0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
132d0 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 54  ITE_OK;.  int iT
132e0 61 73 6b 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  ask;..#if SQLITE
132f0 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45  _MAX_WORKER_THRE
13300 41 44 53 3e 30 0a 20 20 2f 2a 20 49 66 20 74 68  ADS>0.  /* If th
13310 65 20 73 6f 72 74 65 72 20 75 73 65 73 20 6d 6f  e sorter uses mo
13320 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 61 73 6b  re than one task
13330 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 74 68  , then create th
13340 65 20 74 6f 70 2d 6c 65 76 65 6c 20 0a 20 20 2a  e top-level .  *
13350 2a 20 4d 65 72 67 65 45 6e 67 69 6e 65 20 68 65  * MergeEngine he
13360 72 65 2e 20 54 68 69 73 20 4d 65 72 67 65 45 6e  re. This MergeEn
13370 67 69 6e 65 20 77 69 6c 6c 20 72 65 61 64 20 64  gine will read d
13380 61 74 61 20 66 72 6f 6d 20 65 78 61 63 74 6c 79  ata from exactly
13390 20 0a 20 20 2a 2a 20 6f 6e 65 20 50 6d 61 52 65   .  ** one PmaRe
133a0 61 64 65 72 20 70 65 72 20 73 75 62 2d 74 61 73  ader per sub-tas
133b0 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  k.  */.  assert(
133c0 20 70 53 6f 72 74 65 72 2d 3e 62 55 73 65 54 68   pSorter->bUseTh
133d0 72 65 61 64 73 20 7c 7c 20 70 53 6f 72 74 65 72  reads || pSorter
133e0 2d 3e 6e 54 61 73 6b 3d 3d 31 20 29 3b 0a 20 20  ->nTask==1 );.  
133f0 69 66 28 20 70 53 6f 72 74 65 72 2d 3e 6e 54 61  if( pSorter->nTa
13400 73 6b 3e 31 20 29 7b 0a 20 20 20 20 70 4d 61 69  sk>1 ){.    pMai
13410 6e 20 3d 20 76 64 62 65 4d 65 72 67 65 45 6e 67  n = vdbeMergeEng
13420 69 6e 65 4e 65 77 28 70 53 6f 72 74 65 72 2d 3e  ineNew(pSorter->
13430 6e 54 61 73 6b 29 3b 0a 20 20 20 20 69 66 28 20  nTask);.    if( 
13440 70 4d 61 69 6e 3d 3d 30 20 29 20 72 63 20 3d 20  pMain==0 ) rc = 
13450 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
13460 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 66 6f 72 28  }.#endif..  for(
13470 69 54 61 73 6b 3d 30 3b 20 72 63 3d 3d 53 51 4c  iTask=0; rc==SQL
13480 49 54 45 5f 4f 4b 20 26 26 20 69 54 61 73 6b 3c  ITE_OK && iTask<
13490 70 53 6f 72 74 65 72 2d 3e 6e 54 61 73 6b 3b 20  pSorter->nTask; 
134a0 69 54 61 73 6b 2b 2b 29 7b 0a 20 20 20 20 53 6f  iTask++){.    So
134b0 72 74 53 75 62 74 61 73 6b 20 2a 70 54 61 73 6b  rtSubtask *pTask
134c0 20 3d 20 26 70 53 6f 72 74 65 72 2d 3e 61 54 61   = &pSorter->aTa
134d0 73 6b 5b 69 54 61 73 6b 5d 3b 0a 20 20 20 20 61  sk[iTask];.    a
134e0 73 73 65 72 74 28 20 70 54 61 73 6b 2d 3e 6e 50  ssert( pTask->nP
134f0 4d 41 3e 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  MA>0 || SQLITE_M
13500 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  AX_WORKER_THREAD
13510 53 3e 30 20 29 3b 0a 20 20 20 20 69 66 28 20 53  S>0 );.    if( S
13520 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52  QLITE_MAX_WORKER
13530 5f 54 48 52 45 41 44 53 3d 3d 30 20 7c 7c 20 70  _THREADS==0 || p
13540 54 61 73 6b 2d 3e 6e 50 4d 41 20 29 7b 0a 20 20  Task->nPMA ){.  
13550 20 20 20 20 4d 65 72 67 65 45 6e 67 69 6e 65 20      MergeEngine 
13560 2a 70 52 6f 6f 74 20 3d 20 30 3b 20 20 20 20 20  *pRoot = 0;     
13570 2f 2a 20 52 6f 6f 74 20 6e 6f 64 65 20 6f 66 20  /* Root node of 
13580 74 72 65 65 20 66 6f 72 20 74 68 69 73 20 74 61  tree for this ta
13590 73 6b 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  sk */.      int 
135a0 6e 44 65 70 74 68 20 3d 20 76 64 62 65 53 6f 72  nDepth = vdbeSor
135b0 74 65 72 54 72 65 65 44 65 70 74 68 28 70 54 61  terTreeDepth(pTa
135c0 73 6b 2d 3e 6e 50 4d 41 29 3b 0a 20 20 20 20 20  sk->nPMA);.     
135d0 20 69 36 34 20 69 52 65 61 64 4f 66 66 20 3d 20   i64 iReadOff = 
135e0 30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54  0;..      if( pT
135f0 61 73 6b 2d 3e 6e 50 4d 41 3c 3d 53 4f 52 54 45  ask->nPMA<=SORTE
13600 52 5f 4d 41 58 5f 4d 45 52 47 45 5f 43 4f 55 4e  R_MAX_MERGE_COUN
13610 54 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  T ){.        rc 
13620 3d 20 76 64 62 65 4d 65 72 67 65 45 6e 67 69 6e  = vdbeMergeEngin
13630 65 4c 65 76 65 6c 30 28 70 54 61 73 6b 2c 20 70  eLevel0(pTask, p
13640 54 61 73 6b 2d 3e 6e 50 4d 41 2c 20 26 69 52 65  Task->nPMA, &iRe
13650 61 64 4f 66 66 2c 20 26 70 52 6f 6f 74 29 3b 0a  adOff, &pRoot);.
13660 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13670 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
13680 20 20 20 20 69 6e 74 20 69 53 65 71 20 3d 20 30      int iSeq = 0
13690 3b 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74 20  ;.        pRoot 
136a0 3d 20 76 64 62 65 4d 65 72 67 65 45 6e 67 69 6e  = vdbeMergeEngin
136b0 65 4e 65 77 28 53 4f 52 54 45 52 5f 4d 41 58 5f  eNew(SORTER_MAX_
136c0 4d 45 52 47 45 5f 43 4f 55 4e 54 29 3b 0a 20 20  MERGE_COUNT);.  
136d0 20 20 20 20 20 20 69 66 28 20 70 52 6f 6f 74 3d        if( pRoot=
136e0 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  =0 ) rc = SQLITE
136f0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
13700 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 73 6b  for(i=0; i<pTask
13710 2d 3e 6e 50 4d 41 20 26 26 20 72 63 3d 3d 53 51  ->nPMA && rc==SQ
13720 4c 49 54 45 5f 4f 4b 3b 20 69 20 2b 3d 20 53 4f  LITE_OK; i += SO
13730 52 54 45 52 5f 4d 41 58 5f 4d 45 52 47 45 5f 43  RTER_MAX_MERGE_C
13740 4f 55 4e 54 29 7b 0a 20 20 20 20 20 20 20 20 20  OUNT){.         
13750 20 4d 65 72 67 65 45 6e 67 69 6e 65 20 2a 70 4d   MergeEngine *pM
13760 65 72 67 65 72 20 3d 20 30 3b 20 2f 2a 20 4e 65  erger = 0; /* Ne
13770 77 20 6c 65 76 65 6c 2d 30 20 50 4d 41 20 6d 65  w level-0 PMA me
13780 72 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rger */.        
13790 20 20 69 6e 74 20 6e 52 65 61 64 65 72 3b 20 20    int nReader;  
137a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
137b0 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 2d 30  umber of level-0
137c0 20 50 4d 41 73 20 74 6f 20 6d 65 72 67 65 20 2a   PMAs to merge *
137d0 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 6e 52 65  /..          nRe
137e0 61 64 65 72 20 3d 20 4d 49 4e 28 70 54 61 73 6b  ader = MIN(pTask
137f0 2d 3e 6e 50 4d 41 20 2d 20 69 2c 20 53 4f 52 54  ->nPMA - i, SORT
13800 45 52 5f 4d 41 58 5f 4d 45 52 47 45 5f 43 4f 55  ER_MAX_MERGE_COU
13810 4e 54 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  NT);.          r
13820 63 20 3d 20 76 64 62 65 4d 65 72 67 65 45 6e 67  c = vdbeMergeEng
13830 69 6e 65 4c 65 76 65 6c 30 28 70 54 61 73 6b 2c  ineLevel0(pTask,
13840 20 6e 52 65 61 64 65 72 2c 20 26 69 52 65 61 64   nReader, &iRead
13850 4f 66 66 2c 20 26 70 4d 65 72 67 65 72 29 3b 0a  Off, &pMerger);.
13860 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
13870 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13880 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
13890 76 64 62 65 53 6f 72 74 65 72 41 64 64 54 6f 54  vdbeSorterAddToT
138a0 72 65 65 28 70 54 61 73 6b 2c 20 6e 44 65 70 74  ree(pTask, nDept
138b0 68 2c 20 69 53 65 71 2b 2b 2c 20 70 52 6f 6f 74  h, iSeq++, pRoot
138c0 2c 20 70 4d 65 72 67 65 72 29 3b 0a 20 20 20 20  , pMerger);.    
138d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
138e0 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
138f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13900 4f 4b 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  OK ){.#if SQLITE
13910 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45  _MAX_WORKER_THRE
13920 41 44 53 3e 30 0a 20 20 20 20 20 20 20 20 69 66  ADS>0.        if
13930 28 20 70 4d 61 69 6e 21 3d 30 20 29 7b 0a 20 20  ( pMain!=0 ){.  
13940 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62          rc = vdb
13950 65 49 6e 63 72 4d 65 72 67 65 72 4e 65 77 28 70  eIncrMergerNew(p
13960 54 61 73 6b 2c 20 70 52 6f 6f 74 2c 20 26 70 4d  Task, pRoot, &pM
13970 61 69 6e 2d 3e 61 52 65 61 64 72 5b 69 54 61 73  ain->aReadr[iTas
13980 6b 5d 2e 70 49 6e 63 72 29 3b 0a 20 20 20 20 20  k].pIncr);.     
13990 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
139a0 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
139b0 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 61 69      assert( pMai
139c0 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
139d0 20 20 70 4d 61 69 6e 20 3d 20 70 52 6f 6f 74 3b    pMain = pRoot;
139e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
139f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13a00 76 64 62 65 4d 65 72 67 65 45 6e 67 69 6e 65 46  vdbeMergeEngineF
13a10 72 65 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20  ree(pRoot);.    
13a20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
13a30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13a40 4f 4b 20 29 7b 0a 20 20 20 20 76 64 62 65 4d 65  OK ){.    vdbeMe
13a50 72 67 65 45 6e 67 69 6e 65 46 72 65 65 28 70 4d  rgeEngineFree(pM
13a60 61 69 6e 29 3b 0a 20 20 20 20 70 4d 61 69 6e 20  ain);.    pMain 
13a70 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 70 4f 75  = 0;.  }.  *ppOu
13a80 74 20 3d 20 70 4d 61 69 6e 3b 0a 20 20 72 65 74  t = pMain;.  ret
13a90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
13aa0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
13ab0 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74  s called as part
13ac0 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 56 64   of an sqlite3Vd
13ad0 62 65 53 6f 72 74 65 72 52 65 77 69 6e 64 28 29  beSorterRewind()
13ae0 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 6f 6e   operation.** on
13af0 20 61 20 73 6f 72 74 65 72 20 74 68 61 74 20 68   a sorter that h
13b00 61 73 20 77 72 69 74 74 65 6e 20 74 77 6f 20 6f  as written two o
13b10 72 20 6d 6f 72 65 20 50 4d 41 73 20 74 6f 20 74  r more PMAs to t
13b20 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20  emporary files. 
13b30 49 74 20 73 65 74 73 0a 2a 2a 20 75 70 20 65 69  It sets.** up ei
13b40 74 68 65 72 20 56 64 62 65 53 6f 72 74 65 72 2e  ther VdbeSorter.
13b50 70 4d 65 72 67 65 72 20 28 66 6f 72 20 73 69 6e  pMerger (for sin
13b60 67 6c 65 20 74 68 72 65 61 64 65 64 20 73 6f 72  gle threaded sor
13b70 74 65 72 73 29 20 6f 72 20 70 52 65 61 64 65 72  ters) or pReader
13b80 0a 2a 2a 20 28 66 6f 72 20 6d 75 6c 74 69 2d 74  .** (for multi-t
13b90 68 72 65 61 64 65 64 20 73 6f 72 74 65 72 73 29  hreaded sorters)
13ba0 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20   so that it can 
13bb0 62 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61  be used to itera
13bc0 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c  te through.** al
13bd0 6c 20 72 65 63 6f 72 64 73 20 73 74 6f 72 65 64  l records stored
13be0 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 2e 0a   in the sorter..
13bf0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
13c00 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
13c10 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e  uccessful, or an
13c20 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
13c30 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  de otherwise..*/
13c40 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
13c50 53 6f 72 74 65 72 53 65 74 75 70 4d 65 72 67 65  SorterSetupMerge
13c60 28 56 64 62 65 53 6f 72 74 65 72 20 2a 70 53 6f  (VdbeSorter *pSo
13c70 72 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  rter){.  int rc;
13c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c90 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
13ca0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 53 6f 72  rn code */.  Sor
13cb0 74 53 75 62 74 61 73 6b 20 2a 70 54 61 73 6b 30  tSubtask *pTask0
13cc0 20 3d 20 26 70 53 6f 72 74 65 72 2d 3e 61 54 61   = &pSorter->aTa
13cd0 73 6b 5b 30 5d 3b 0a 20 20 4d 65 72 67 65 45 6e  sk[0];.  MergeEn
13ce0 67 69 6e 65 20 2a 70 4d 61 69 6e 20 3d 20 30 3b  gine *pMain = 0;
13cf0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
13d00 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 0a 20  WORKER_THREADS. 
13d10 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
13d20 54 61 73 6b 30 2d 3e 70 53 6f 72 74 65 72 2d 3e  Task0->pSorter->
13d30 64 62 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 63  db;.#endif..  rc
13d40 20 3d 20 76 64 62 65 53 6f 72 74 65 72 4d 65 72   = vdbeSorterMer
13d50 67 65 54 72 65 65 42 75 69 6c 64 28 70 53 6f 72  geTreeBuild(pSor
13d60 74 65 72 2c 20 26 70 4d 61 69 6e 29 3b 0a 20 20  ter, &pMain);.  
13d70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
13d80 4b 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  K ){.#if SQLITE_
13d90 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MAX_WORKER_THREA
13da0 44 53 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  DS.    assert( p
13db0 53 6f 72 74 65 72 2d 3e 62 55 73 65 54 68 72 65  Sorter->bUseThre
13dc0 61 64 73 3d 3d 30 20 7c 7c 20 70 53 6f 72 74 65  ads==0 || pSorte
13dd0 72 2d 3e 6e 54 61 73 6b 3e 31 20 29 3b 0a 20 20  r->nTask>1 );.  
13de0 20 20 69 66 28 20 70 53 6f 72 74 65 72 2d 3e 62    if( pSorter->b
13df0 55 73 65 54 68 72 65 61 64 73 20 29 7b 0a 20 20  UseThreads ){.  
13e00 20 20 20 20 69 6e 74 20 69 54 61 73 6b 3b 0a 20      int iTask;. 
13e10 20 20 20 20 20 50 6d 61 52 65 61 64 65 72 20 2a       PmaReader *
13e20 70 52 65 61 64 72 3b 0a 20 20 20 20 20 20 53 6f  pReadr;.      So
13e30 72 74 53 75 62 74 61 73 6b 20 2a 70 4c 61 73 74  rtSubtask *pLast
13e40 20 3d 20 26 70 53 6f 72 74 65 72 2d 3e 61 54 61   = &pSorter->aTa
13e50 73 6b 5b 70 53 6f 72 74 65 72 2d 3e 6e 54 61 73  sk[pSorter->nTas
13e60 6b 2d 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d  k-1];.      rc =
13e70 20 76 64 62 65 53 6f 72 74 41 6c 6c 6f 63 55 6e   vdbeSortAllocUn
13e80 70 61 63 6b 65 64 28 70 4c 61 73 74 29 3b 0a 20  packed(pLast);. 
13e90 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
13ea0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
13eb0 20 20 70 52 65 61 64 72 20 3d 20 28 50 6d 61 52    pReadr = (PmaR
13ec0 65 61 64 65 72 2a 29 73 71 6c 69 74 65 33 44 62  eader*)sqlite3Db
13ed0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
13ee0 69 7a 65 6f 66 28 50 6d 61 52 65 61 64 65 72 29  izeof(PmaReader)
13ef0 29 3b 0a 20 20 20 20 20 20 20 20 70 53 6f 72 74  );.        pSort
13f00 65 72 2d 3e 70 52 65 61 64 65 72 20 3d 20 70 52  er->pReader = pR
13f10 65 61 64 72 3b 0a 20 20 20 20 20 20 20 20 69 66  eadr;.        if
13f20 28 20 70 52 65 61 64 72 3d 3d 30 20 29 20 72 63  ( pReadr==0 ) rc
13f30 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
13f40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
13f50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13f60 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
13f70 20 76 64 62 65 49 6e 63 72 4d 65 72 67 65 72 4e   vdbeIncrMergerN
13f80 65 77 28 70 4c 61 73 74 2c 20 70 4d 61 69 6e 2c  ew(pLast, pMain,
13f90 20 26 70 52 65 61 64 72 2d 3e 70 49 6e 63 72 29   &pReadr->pIncr)
13fa0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
13fb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13fc0 20 20 20 20 20 20 20 20 20 76 64 62 65 49 6e 63           vdbeInc
13fd0 72 4d 65 72 67 65 72 53 65 74 54 68 72 65 61 64  rMergerSetThread
13fe0 73 28 70 52 65 61 64 72 2d 3e 70 49 6e 63 72 29  s(pReadr->pIncr)
13ff0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
14000 69 54 61 73 6b 3d 30 3b 20 69 54 61 73 6b 3c 28  iTask=0; iTask<(
14010 70 53 6f 72 74 65 72 2d 3e 6e 54 61 73 6b 2d 31  pSorter->nTask-1
14020 29 3b 20 69 54 61 73 6b 2b 2b 29 7b 0a 20 20 20  ); iTask++){.   
14030 20 20 20 20 20 20 20 20 20 49 6e 63 72 4d 65 72           IncrMer
14040 67 65 72 20 2a 70 49 6e 63 72 3b 0a 20 20 20 20  ger *pIncr;.    
14050 20 20 20 20 20 20 20 20 69 66 28 20 28 70 49 6e          if( (pIn
14060 63 72 20 3d 20 70 4d 61 69 6e 2d 3e 61 52 65 61  cr = pMain->aRea
14070 64 72 5b 69 54 61 73 6b 5d 2e 70 49 6e 63 72 29  dr[iTask].pIncr)
14080 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14090 20 20 76 64 62 65 49 6e 63 72 4d 65 72 67 65 72    vdbeIncrMerger
140a0 53 65 74 54 68 72 65 61 64 73 28 70 49 6e 63 72  SetThreads(pIncr
140b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
140c0 20 61 73 73 65 72 74 28 20 70 49 6e 63 72 2d 3e   assert( pIncr->
140d0 70 54 61 73 6b 21 3d 70 4c 61 73 74 20 29 3b 0a  pTask!=pLast );.
140e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
140f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14100 20 20 20 20 66 6f 72 28 69 54 61 73 6b 3d 30 3b      for(iTask=0;
14110 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
14120 26 20 69 54 61 73 6b 3c 70 53 6f 72 74 65 72 2d  & iTask<pSorter-
14130 3e 6e 54 61 73 6b 3b 20 69 54 61 73 6b 2b 2b 29  >nTask; iTask++)
14140 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 50 6d  {.            Pm
14150 61 52 65 61 64 65 72 20 2a 70 20 3d 20 26 70 4d  aReader *p = &pM
14160 61 69 6e 2d 3e 61 52 65 61 64 72 5b 69 54 61 73  ain->aReadr[iTas
14170 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k];.            
14180 61 73 73 65 72 74 28 20 70 2d 3e 70 49 6e 63 72  assert( p->pIncr
14190 3d 3d 30 20 7c 7c 20 70 2d 3e 70 49 6e 63 72 2d  ==0 || p->pIncr-
141a0 3e 70 54 61 73 6b 3d 3d 26 70 53 6f 72 74 65 72  >pTask==&pSorter
141b0 2d 3e 61 54 61 73 6b 5b 69 54 61 73 6b 5d 20 29  ->aTask[iTask] )
141c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
141d0 28 20 70 2d 3e 70 49 6e 63 72 20 29 7b 20 0a 20  ( p->pIncr ){ . 
141e0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
141f0 20 69 54 61 73 6b 3d 3d 70 53 6f 72 74 65 72 2d   iTask==pSorter-
14200 3e 6e 54 61 73 6b 2d 31 20 29 7b 0a 20 20 20 20  >nTask-1 ){.    
14210 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
14220 20 76 64 62 65 50 6d 61 52 65 61 64 65 72 49 6e   vdbePmaReaderIn
14230 63 72 4d 65 72 67 65 49 6e 69 74 28 70 2c 20 49  crMergeInit(p, I
14240 4e 43 52 49 4e 49 54 5f 54 41 53 4b 29 3b 0a 20  NCRINIT_TASK);. 
14250 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c               }el
14260 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
14270 20 20 20 20 72 63 20 3d 20 76 64 62 65 50 6d 61      rc = vdbePma
14280 52 65 61 64 65 72 42 67 49 6e 63 72 49 6e 69 74  ReaderBgIncrInit
14290 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (p);.           
142a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
142b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
142c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
142d0 20 70 4d 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20   pMain = 0;.    
142e0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
142f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14300 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65         rc = vdbe
14310 50 6d 61 52 65 61 64 65 72 49 6e 63 72 4d 65 72  PmaReaderIncrMer
14320 67 65 49 6e 69 74 28 70 52 65 61 64 72 2c 20 49  geInit(pReadr, I
14330 4e 43 52 49 4e 49 54 5f 52 4f 4f 54 29 3b 0a 20  NCRINIT_ROOT);. 
14340 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
14350 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20  .#endif.    {.  
14360 20 20 20 20 72 63 20 3d 20 76 64 62 65 4d 65 72      rc = vdbeMer
14370 67 65 45 6e 67 69 6e 65 49 6e 69 74 28 70 54 61  geEngineInit(pTa
14380 73 6b 30 2c 20 70 4d 61 69 6e 2c 20 49 4e 43 52  sk0, pMain, INCR
14390 49 4e 49 54 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20  INIT_NORMAL);.  
143a0 20 20 20 20 70 53 6f 72 74 65 72 2d 3e 70 4d 65      pSorter->pMe
143b0 72 67 65 72 20 3d 20 70 4d 61 69 6e 3b 0a 20 20  rger = pMain;.  
143c0 20 20 20 20 70 4d 61 69 6e 20 3d 20 30 3b 0a 20      pMain = 0;. 
143d0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
143e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
143f0 0a 20 20 20 20 76 64 62 65 4d 65 72 67 65 45 6e  .    vdbeMergeEn
14400 67 69 6e 65 46 72 65 65 28 70 4d 61 69 6e 29 3b  gineFree(pMain);
14410 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
14420 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 63 65  ;.}.../*.** Once
14430 20 74 68 65 20 73 6f 72 74 65 72 20 68 61 73 20   the sorter has 
14440 62 65 65 6e 20 70 6f 70 75 6c 61 74 65 64 20 62  been populated b
14450 79 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  y calls to sqlit
14460 65 33 56 64 62 65 53 6f 72 74 65 72 57 72 69 74  e3VdbeSorterWrit
14470 65 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  e,.** this funct
14480 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
14490 20 70 72 65 70 61 72 65 20 66 6f 72 20 69 74 65   prepare for ite
144a0 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 74  rating through t
144b0 68 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 69 6e  he records.** in
144c0 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 0a 2a   sorted order..*
144d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
144e0 65 53 6f 72 74 65 72 52 65 77 69 6e 64 28 63 6f  eSorterRewind(co
144f0 6e 73 74 20 56 64 62 65 43 75 72 73 6f 72 20 2a  nst VdbeCursor *
14500 70 43 73 72 2c 20 69 6e 74 20 2a 70 62 45 6f 66  pCsr, int *pbEof
14510 29 7b 0a 20 20 56 64 62 65 53 6f 72 74 65 72 20  ){.  VdbeSorter 
14520 2a 70 53 6f 72 74 65 72 20 3d 20 70 43 73 72 2d  *pSorter = pCsr-
14530 3e 70 53 6f 72 74 65 72 3b 0a 20 20 69 6e 74 20  >pSorter;.  int 
14540 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
14550 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
14560 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
14570 20 61 73 73 65 72 74 28 20 70 53 6f 72 74 65 72   assert( pSorter
14580 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20   );..  /* If no 
14590 64 61 74 61 20 68 61 73 20 62 65 65 6e 20 77 72  data has been wr
145a0 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2c 20 74  itten to disk, t
145b0 68 65 6e 20 64 6f 20 6e 6f 74 20 64 6f 20 73 6f  hen do not do so
145c0 20 6e 6f 77 2e 20 49 6e 73 74 65 61 64 2c 0a 20   now. Instead,. 
145d0 20 2a 2a 20 73 6f 72 74 20 74 68 65 20 56 64 62   ** sort the Vdb
145e0 65 53 6f 72 74 65 72 2e 70 52 65 63 6f 72 64 20  eSorter.pRecord 
145f0 6c 69 73 74 2e 20 54 68 65 20 76 64 62 65 20 6c  list. The vdbe l
14600 61 79 65 72 20 77 69 6c 6c 20 72 65 61 64 20 64  ayer will read d
14610 61 74 61 20 64 69 72 65 63 74 6c 79 0a 20 20 2a  ata directly.  *
14620 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65  * from the in-me
14630 6d 6f 72 79 20 6c 69 73 74 2e 20 20 2a 2f 0a 20  mory list.  */. 
14640 20 69 66 28 20 70 53 6f 72 74 65 72 2d 3e 62 55   if( pSorter->bU
14650 73 65 50 4d 41 3d 3d 30 20 29 7b 0a 20 20 20 20  sePMA==0 ){.    
14660 69 66 28 20 70 53 6f 72 74 65 72 2d 3e 6c 69 73  if( pSorter->lis
14670 74 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  t.pList ){.     
14680 20 2a 70 62 45 6f 66 20 3d 20 30 3b 0a 20 20 20   *pbEof = 0;.   
14690 20 20 20 72 63 20 3d 20 76 64 62 65 53 6f 72 74     rc = vdbeSort
146a0 65 72 53 6f 72 74 28 26 70 53 6f 72 74 65 72 2d  erSort(&pSorter-
146b0 3e 61 54 61 73 6b 5b 30 5d 2c 20 26 70 53 6f 72  >aTask[0], &pSor
146c0 74 65 72 2d 3e 6c 69 73 74 29 3b 0a 20 20 20 20  ter->list);.    
146d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 62  }else{.      *pb
146e0 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Eof = 1;.    }. 
146f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
14700 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  }..  /* Write th
14710 65 20 63 75 72 72 65 6e 74 20 69 6e 2d 6d 65 6d  e current in-mem
14720 6f 72 79 20 6c 69 73 74 20 74 6f 20 61 20 50 4d  ory list to a PM
14730 41 2e 20 57 68 65 6e 20 74 68 65 20 56 64 62 65  A. When the Vdbe
14740 53 6f 72 74 65 72 57 72 69 74 65 28 29 20 0a 20  SorterWrite() . 
14750 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 6c 75   ** function flu
14760 73 68 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74  shes the content
14770 73 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 64  s of memory to d
14780 69 73 6b 2c 20 69 74 20 69 6d 6d 65 64 69 61 74  isk, it immediat
14790 65 6c 79 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20  ely always.  ** 
147a0 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 6c 69  creates a new li
147b0 73 74 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  st consisting of
147c0 20 61 20 73 69 6e 67 6c 65 20 6b 65 79 20 69 6d   a single key im
147d0 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 77  mediately afterw
147e0 61 72 64 73 2e 0a 20 20 2a 2a 20 53 6f 20 74 68  ards..  ** So th
147f0 65 20 6c 69 73 74 20 69 73 20 6e 65 76 65 72 20  e list is never 
14800 65 6d 70 74 79 20 61 74 20 74 68 69 73 20 70 6f  empty at this po
14810 69 6e 74 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  int.  */.  asser
14820 74 28 20 70 53 6f 72 74 65 72 2d 3e 6c 69 73 74  t( pSorter->list
14830 2e 70 4c 69 73 74 20 29 3b 0a 20 20 72 63 20 3d  .pList );.  rc =
14840 20 76 64 62 65 53 6f 72 74 65 72 46 6c 75 73 68   vdbeSorterFlush
14850 50 4d 41 28 70 53 6f 72 74 65 72 29 3b 0a 0a 20  PMA(pSorter);.. 
14860 20 2f 2a 20 4a 6f 69 6e 20 61 6c 6c 20 74 68 72   /* Join all thr
14870 65 61 64 73 20 2a 2f 0a 20 20 72 63 20 3d 20 76  eads */.  rc = v
14880 64 62 65 53 6f 72 74 65 72 4a 6f 69 6e 41 6c 6c  dbeSorterJoinAll
14890 28 70 53 6f 72 74 65 72 2c 20 72 63 29 3b 0a 0a  (pSorter, rc);..
148a0 20 20 76 64 62 65 53 6f 72 74 65 72 52 65 77 69    vdbeSorterRewi
148b0 6e 64 44 65 62 75 67 28 22 72 65 77 69 6e 64 22  ndDebug("rewind"
148c0 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 75 6d 69 6e  );..  /* Assumin
148d0 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65  g no errors have
148e0 20 6f 63 63 75 72 72 65 64 2c 20 73 65 74 20 75   occurred, set u
148f0 70 20 61 20 6d 65 72 67 65 72 20 73 74 72 75 63  p a merger struc
14900 74 75 72 65 20 74 6f 20 0a 20 20 2a 2a 20 69 6e  ture to .  ** in
14910 63 72 65 6d 65 6e 74 61 6c 6c 79 20 72 65 61 64  crementally read
14920 20 61 6e 64 20 6d 65 72 67 65 20 61 6c 6c 20 72   and merge all r
14930 65 6d 61 69 6e 69 6e 67 20 50 4d 41 73 2e 20 20  emaining PMAs.  
14940 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 53 6f  */.  assert( pSo
14950 72 74 65 72 2d 3e 70 52 65 61 64 65 72 3d 3d 30  rter->pReader==0
14960 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
14970 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
14980 63 20 3d 20 76 64 62 65 53 6f 72 74 65 72 53 65  c = vdbeSorterSe
14990 74 75 70 4d 65 72 67 65 28 70 53 6f 72 74 65 72  tupMerge(pSorter
149a0 29 3b 0a 20 20 20 20 2a 70 62 45 6f 66 20 3d 20  );.    *pbEof = 
149b0 30 3b 0a 20 20 7d 0a 0a 20 20 76 64 62 65 53 6f  0;.  }..  vdbeSo
149c0 72 74 65 72 52 65 77 69 6e 64 44 65 62 75 67 28  rterRewindDebug(
149d0 22 72 65 77 69 6e 64 64 6f 6e 65 22 29 3b 0a 20  "rewinddone");. 
149e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
149f0 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 6f 20  *.** Advance to 
14a00 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74  the next element
14a10 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 2e 0a   in the sorter..
14a20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
14a30 62 65 53 6f 72 74 65 72 4e 65 78 74 28 73 71 6c  beSorterNext(sql
14a40 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
14a50 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 73 72  VdbeCursor *pCsr
14a60 2c 20 69 6e 74 20 2a 70 62 45 6f 66 29 7b 0a 20  , int *pbEof){. 
14a70 20 56 64 62 65 53 6f 72 74 65 72 20 2a 70 53 6f   VdbeSorter *pSo
14a80 72 74 65 72 20 3d 20 70 43 73 72 2d 3e 70 53 6f  rter = pCsr->pSo
14a90 72 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 20  rter;.  int rc; 
14aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ab0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
14ac0 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73  n code */..  ass
14ad0 65 72 74 28 20 70 53 6f 72 74 65 72 2d 3e 62 55  ert( pSorter->bU
14ae0 73 65 50 4d 41 20 7c 7c 20 28 70 53 6f 72 74 65  sePMA || (pSorte
14af0 72 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20 26 26  r->pReader==0 &&
14b00 20 70 53 6f 72 74 65 72 2d 3e 70 4d 65 72 67 65   pSorter->pMerge
14b10 72 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70  r==0) );.  if( p
14b20 53 6f 72 74 65 72 2d 3e 62 55 73 65 50 4d 41 20  Sorter->bUsePMA 
14b30 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
14b40 53 6f 72 74 65 72 2d 3e 70 52 65 61 64 65 72 3d  Sorter->pReader=
14b50 3d 30 20 7c 7c 20 70 53 6f 72 74 65 72 2d 3e 70  =0 || pSorter->p
14b60 4d 65 72 67 65 72 3d 3d 30 20 29 3b 0a 20 20 20  Merger==0 );.   
14b70 20 61 73 73 65 72 74 28 20 70 53 6f 72 74 65 72   assert( pSorter
14b80 2d 3e 62 55 73 65 54 68 72 65 61 64 73 3d 3d 30  ->bUseThreads==0
14b90 20 7c 7c 20 70 53 6f 72 74 65 72 2d 3e 70 52 65   || pSorter->pRe
14ba0 61 64 65 72 20 29 3b 0a 20 20 20 20 61 73 73 65  ader );.    asse
14bb0 72 74 28 20 70 53 6f 72 74 65 72 2d 3e 62 55 73  rt( pSorter->bUs
14bc0 65 54 68 72 65 61 64 73 3d 3d 31 20 7c 7c 20 70  eThreads==1 || p
14bd0 53 6f 72 74 65 72 2d 3e 70 4d 65 72 67 65 72 20  Sorter->pMerger 
14be0 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  );.#if SQLITE_MA
14bf0 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  X_WORKER_THREADS
14c00 3e 30 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74  >0.    if( pSort
14c10 65 72 2d 3e 62 55 73 65 54 68 72 65 61 64 73 20  er->bUseThreads 
14c20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 76 64  ){.      rc = vd
14c30 62 65 50 6d 61 52 65 61 64 65 72 4e 65 78 74 28  bePmaReaderNext(
14c40 70 53 6f 72 74 65 72 2d 3e 70 52 65 61 64 65 72  pSorter->pReader
14c50 29 3b 0a 20 20 20 20 20 20 2a 70 62 45 6f 66 20  );.      *pbEof 
14c60 3d 20 28 70 53 6f 72 74 65 72 2d 3e 70 52 65 61  = (pSorter->pRea
14c70 64 65 72 2d 3e 70 46 64 3d 3d 30 29 3b 0a 20 20  der->pFd==0);.  
14c80 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
14c90 20 20 20 2f 2a 69 66 28 20 21 70 53 6f 72 74 65     /*if( !pSorte
14ca0 72 2d 3e 62 55 73 65 54 68 72 65 61 64 73 20 29  r->bUseThreads )
14cb0 2a 2f 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  */ {.      asser
14cc0 74 28 20 70 53 6f 72 74 65 72 2d 3e 70 4d 65 72  t( pSorter->pMer
14cd0 67 65 72 2d 3e 70 54 61 73 6b 3d 3d 28 26 70 53  ger->pTask==(&pS
14ce0 6f 72 74 65 72 2d 3e 61 54 61 73 6b 5b 30 5d 29  orter->aTask[0])
14cf0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 76   );.      rc = v
14d00 64 62 65 4d 65 72 67 65 45 6e 67 69 6e 65 53 74  dbeMergeEngineSt
14d10 65 70 28 70 53 6f 72 74 65 72 2d 3e 70 4d 65 72  ep(pSorter->pMer
14d20 67 65 72 2c 20 70 62 45 6f 66 29 3b 0a 20 20 20  ger, pbEof);.   
14d30 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
14d40 53 6f 72 74 65 72 52 65 63 6f 72 64 20 2a 70 46  SorterRecord *pF
14d50 72 65 65 20 3d 20 70 53 6f 72 74 65 72 2d 3e 6c  ree = pSorter->l
14d60 69 73 74 2e 70 4c 69 73 74 3b 0a 20 20 20 20 70  ist.pList;.    p
14d70 53 6f 72 74 65 72 2d 3e 6c 69 73 74 2e 70 4c 69  Sorter->list.pLi
14d80 73 74 20 3d 20 70 46 72 65 65 2d 3e 75 2e 70 4e  st = pFree->u.pN
14d90 65 78 74 3b 0a 20 20 20 20 70 46 72 65 65 2d 3e  ext;.    pFree->
14da0 75 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  u.pNext = 0;.   
14db0 20 69 66 28 20 70 53 6f 72 74 65 72 2d 3e 6c 69   if( pSorter->li
14dc0 73 74 2e 61 4d 65 6d 6f 72 79 3d 3d 30 20 29 20  st.aMemory==0 ) 
14dd0 76 64 62 65 53 6f 72 74 65 72 52 65 63 6f 72 64  vdbeSorterRecord
14de0 46 72 65 65 28 64 62 2c 20 70 46 72 65 65 29 3b  Free(db, pFree);
14df0 0a 20 20 20 20 2a 70 62 45 6f 66 20 3d 20 21 70  .    *pbEof = !p
14e00 53 6f 72 74 65 72 2d 3e 6c 69 73 74 2e 70 4c 69  Sorter->list.pLi
14e10 73 74 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  st;.    rc = SQL
14e20 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  ITE_OK;.  }.  re
14e30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14e40 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
14e50 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f  er to a buffer o
14e60 77 6e 65 64 20 62 79 20 74 68 65 20 73 6f 72 74  wned by the sort
14e70 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  er that contains
14e80 20 74 68 65 20 0a 2a 2a 20 63 75 72 72 65 6e 74   the .** current
14e90 20 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   key..*/.static 
14ea0 76 6f 69 64 20 2a 76 64 62 65 53 6f 72 74 65 72  void *vdbeSorter
14eb0 52 6f 77 6b 65 79 28 0a 20 20 63 6f 6e 73 74 20  Rowkey(.  const 
14ec0 56 64 62 65 53 6f 72 74 65 72 20 2a 70 53 6f 72  VdbeSorter *pSor
14ed0 74 65 72 2c 20 20 20 20 20 20 2f 2a 20 53 6f 72  ter,      /* Sor
14ee0 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ter object */.  
14ef0 69 6e 74 20 2a 70 6e 4b 65 79 20 20 20 20 20 20  int *pnKey      
14f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f10 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20  /* OUT: Size of 
14f20 63 75 72 72 65 6e 74 20 6b 65 79 20 69 6e 20 62  current key in b
14f30 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69  ytes */.){.  voi
14f40 64 20 2a 70 4b 65 79 3b 0a 20 20 69 66 28 20 70  d *pKey;.  if( p
14f50 53 6f 72 74 65 72 2d 3e 62 55 73 65 50 4d 41 20  Sorter->bUsePMA 
14f60 29 7b 0a 20 20 20 20 50 6d 61 52 65 61 64 65 72  ){.    PmaReader
14f70 20 2a 70 52 65 61 64 65 72 3b 0a 23 69 66 20 53   *pReader;.#if S
14f80 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52  QLITE_MAX_WORKER
14f90 5f 54 48 52 45 41 44 53 3e 30 0a 20 20 20 20 69  _THREADS>0.    i
14fa0 66 28 20 70 53 6f 72 74 65 72 2d 3e 62 55 73 65  f( pSorter->bUse
14fb0 54 68 72 65 61 64 73 20 29 7b 0a 20 20 20 20 20  Threads ){.     
14fc0 20 70 52 65 61 64 65 72 20 3d 20 70 53 6f 72 74   pReader = pSort
14fd0 65 72 2d 3e 70 52 65 61 64 65 72 3b 0a 20 20 20  er->pReader;.   
14fe0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
14ff0 20 20 2f 2a 69 66 28 20 21 70 53 6f 72 74 65 72    /*if( !pSorter
15000 2d 3e 62 55 73 65 54 68 72 65 61 64 73 20 29 2a  ->bUseThreads )*
15010 2f 7b 0a 20 20 20 20 20 20 70 52 65 61 64 65 72  /{.      pReader
15020 20 3d 20 26 70 53 6f 72 74 65 72 2d 3e 70 4d 65   = &pSorter->pMe
15030 72 67 65 72 2d 3e 61 52 65 61 64 72 5b 70 53 6f  rger->aReadr[pSo
15040 72 74 65 72 2d 3e 70 4d 65 72 67 65 72 2d 3e 61  rter->pMerger->a
15050 54 72 65 65 5b 31 5d 5d 3b 0a 20 20 20 20 7d 0a  Tree[1]];.    }.
15060 20 20 20 20 2a 70 6e 4b 65 79 20 3d 20 70 52 65      *pnKey = pRe
15070 61 64 65 72 2d 3e 6e 4b 65 79 3b 0a 20 20 20 20  ader->nKey;.    
15080 70 4b 65 79 20 3d 20 70 52 65 61 64 65 72 2d 3e  pKey = pReader->
15090 61 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  aKey;.  }else{. 
150a0 20 20 20 2a 70 6e 4b 65 79 20 3d 20 70 53 6f 72     *pnKey = pSor
150b0 74 65 72 2d 3e 6c 69 73 74 2e 70 4c 69 73 74 2d  ter->list.pList-
150c0 3e 6e 56 61 6c 3b 0a 20 20 20 20 70 4b 65 79 20  >nVal;.    pKey 
150d0 3d 20 53 52 56 41 4c 28 70 53 6f 72 74 65 72 2d  = SRVAL(pSorter-
150e0 3e 6c 69 73 74 2e 70 4c 69 73 74 29 3b 0a 20 20  >list.pList);.  
150f0 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b 65 79 3b  }.  return pKey;
15100 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74  .}../*.** Copy t
15110 68 65 20 63 75 72 72 65 6e 74 20 73 6f 72 74 65  he current sorte
15120 72 20 6b 65 79 20 69 6e 74 6f 20 74 68 65 20 6d  r key into the m
15130 65 6d 6f 72 79 20 63 65 6c 6c 20 70 4f 75 74 2e  emory cell pOut.
15140 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
15150 64 62 65 53 6f 72 74 65 72 52 6f 77 6b 65 79 28  dbeSorterRowkey(
15160 63 6f 6e 73 74 20 56 64 62 65 43 75 72 73 6f 72  const VdbeCursor
15170 20 2a 70 43 73 72 2c 20 4d 65 6d 20 2a 70 4f 75   *pCsr, Mem *pOu
15180 74 29 7b 0a 20 20 56 64 62 65 53 6f 72 74 65 72  t){.  VdbeSorter
15190 20 2a 70 53 6f 72 74 65 72 20 3d 20 70 43 73 72   *pSorter = pCsr
151a0 2d 3e 70 53 6f 72 74 65 72 3b 0a 20 20 76 6f 69  ->pSorter;.  voi
151b0 64 20 2a 70 4b 65 79 3b 20 69 6e 74 20 6e 4b 65  d *pKey; int nKe
151c0 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y;           /* 
151d0 53 6f 72 74 65 72 20 6b 65 79 20 74 6f 20 63 6f  Sorter key to co
151e0 70 79 20 69 6e 74 6f 20 70 4f 75 74 20 2a 2f 0a  py into pOut */.
151f0 0a 20 20 70 4b 65 79 20 3d 20 76 64 62 65 53 6f  .  pKey = vdbeSo
15200 72 74 65 72 52 6f 77 6b 65 79 28 70 53 6f 72 74  rterRowkey(pSort
15210 65 72 2c 20 26 6e 4b 65 79 29 3b 0a 20 20 69 66  er, &nKey);.  if
15220 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
15230 47 72 6f 77 28 70 4f 75 74 2c 20 6e 4b 65 79 2c  Grow(pOut, nKey,
15240 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   0) ){.    retur
15250 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
15260 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20    }.  pOut->n = 
15270 6e 4b 65 79 3b 0a 20 20 4d 65 6d 53 65 74 54 79  nKey;.  MemSetTy
15280 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d  peFlag(pOut, MEM
15290 5f 42 6c 6f 62 29 3b 0a 20 20 6d 65 6d 63 70 79  _Blob);.  memcpy
152a0 28 70 4f 75 74 2d 3e 7a 2c 20 70 4b 65 79 2c 20  (pOut->z, pKey, 
152b0 6e 4b 65 79 29 3b 0a 0a 20 20 72 65 74 75 72 6e  nKey);..  return
152c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
152d0 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
152e0 20 6b 65 79 20 69 6e 20 6d 65 6d 6f 72 79 20 63   key in memory c
152f0 65 6c 6c 20 70 56 61 6c 20 77 69 74 68 20 74 68  ell pVal with th
15300 65 20 6b 65 79 20 74 68 61 74 20 74 68 65 20 73  e key that the s
15310 6f 72 74 65 72 20 63 75 72 73 6f 72 0a 2a 2a 20  orter cursor.** 
15320 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
15330 72 73 74 20 61 72 67 75 6d 65 6e 74 20 63 75 72  rst argument cur
15340 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
15350 2e 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  . For the purpos
15360 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6d  es of.** the com
15370 70 61 72 69 73 6f 6e 2c 20 69 67 6e 6f 72 65 20  parison, ignore 
15380 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64 20  the rowid field 
15390 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61  at the end of ea
153a0 63 68 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a  ch record..**.**
153b0 20 49 66 20 74 68 65 20 73 6f 72 74 65 72 20 63   If the sorter c
153c0 75 72 73 6f 72 20 6b 65 79 20 63 6f 6e 74 61 69  ursor key contai
153d0 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 76 61 6c 75  ns any NULL valu
153e0 65 73 2c 20 63 6f 6e 73 69 64 65 72 20 69 74 20  es, consider it 
153f0 74 6f 20 62 65 0a 2a 2a 20 6c 65 73 73 20 74 68  to be.** less th
15400 61 6e 20 70 56 61 6c 2e 20 45 76 65 6e 20 69 66  an pVal. Even if
15410 20 70 56 61 6c 20 61 6c 73 6f 20 63 6f 6e 74 61   pVal also conta
15420 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e  ins NULL values.
15430 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
15440 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
15450 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
15460 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 53 51 4c  r code (i.e. SQL
15470 49 54 45 5f 4e 4f 4d 45 4d 29 2e 0a 2a 2a 20 4f  ITE_NOMEM)..** O
15480 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 2a 70  therwise, set *p
15490 52 65 73 20 74 6f 20 61 20 6e 65 67 61 74 69 76  Res to a negativ
154a0 65 2c 20 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74  e, zero or posit
154b0 69 76 65 20 76 61 6c 75 65 20 69 66 20 74 68 65  ive value if the
154c0 0a 2a 2a 20 6b 65 79 20 69 6e 20 70 56 61 6c 20  .** key in pVal 
154d0 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 2c  is smaller than,
154e0 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 6c 61 72   equal to or lar
154f0 67 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ger than the cur
15500 72 65 6e 74 20 73 6f 72 74 65 72 0a 2a 2a 20 6b  rent sorter.** k
15510 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ey..**.** This r
15520 6f 75 74 69 6e 65 20 66 6f 72 6d 73 20 74 68 65  outine forms the
15530 20 63 6f 72 65 20 6f 66 20 74 68 65 20 4f 50 5f   core of the OP_
15540 53 6f 72 74 65 72 43 6f 6d 70 61 72 65 20 6f 70  SorterCompare op
15550 63 6f 64 65 2c 20 77 68 69 63 68 20 69 6e 0a 2a  code, which in.*
15560 2a 20 74 75 72 6e 20 69 73 20 75 73 65 64 20 74  * turn is used t
15570 6f 20 76 65 72 69 66 79 20 75 6e 69 71 75 65 6e  o verify uniquen
15580 65 73 73 20 77 68 65 6e 20 63 6f 6e 73 74 72 75  ess when constru
15590 63 74 69 6e 67 20 61 20 55 4e 49 51 55 45 20 49  cting a UNIQUE I
155a0 4e 44 45 58 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  NDEX..*/.int sql
155b0 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 43 6f  ite3VdbeSorterCo
155c0 6d 70 61 72 65 28 0a 20 20 63 6f 6e 73 74 20 56  mpare(.  const V
155d0 64 62 65 43 75 72 73 6f 72 20 2a 70 43 73 72 2c  dbeCursor *pCsr,
155e0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74           /* Sort
155f0 65 72 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 4d  er cursor */.  M
15600 65 6d 20 2a 70 56 61 6c 2c 20 20 20 20 20 20 20  em *pVal,       
15610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15620 2a 20 56 61 6c 75 65 20 74 6f 20 63 6f 6d 70 61  * Value to compa
15630 72 65 20 74 6f 20 63 75 72 72 65 6e 74 20 73 6f  re to current so
15640 72 74 65 72 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  rter key */.  in
15650 74 20 6e 4b 65 79 43 6f 6c 2c 20 20 20 20 20 20  t nKeyCol,      
15660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15670 20 43 6f 6d 70 61 72 65 20 74 68 69 73 20 6d 61   Compare this ma
15680 6e 79 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  ny columns */.  
15690 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20  int *pRes       
156a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156b0 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 20 6f  /* OUT: Result o
156c0 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a  f comparison */.
156d0 29 7b 0a 20 20 56 64 62 65 53 6f 72 74 65 72 20  ){.  VdbeSorter 
156e0 2a 70 53 6f 72 74 65 72 20 3d 20 70 43 73 72 2d  *pSorter = pCsr-
156f0 3e 70 53 6f 72 74 65 72 3b 0a 20 20 55 6e 70 61  >pSorter;.  Unpa
15700 63 6b 65 64 52 65 63 6f 72 64 20 2a 72 32 20 3d  ckedRecord *r2 =
15710 20 70 53 6f 72 74 65 72 2d 3e 70 55 6e 70 61 63   pSorter->pUnpac
15720 6b 65 64 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ked;.  KeyInfo *
15730 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43 73 72 2d  pKeyInfo = pCsr-
15740 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 6e 74  >pKeyInfo;.  int
15750 20 69 3b 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79   i;.  void *pKey
15760 3b 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20  ; int nKey;     
15770 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65 72 20        /* Sorter 
15780 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20 70  key to compare p
15790 56 61 6c 20 77 69 74 68 20 2a 2f 0a 0a 20 20 69  Val with */..  i
157a0 66 28 20 72 32 3d 3d 30 20 29 7b 0a 20 20 20 20  f( r2==0 ){.    
157b0 63 68 61 72 20 2a 70 3b 0a 20 20 20 20 72 32 20  char *p;.    r2 
157c0 3d 20 70 53 6f 72 74 65 72 2d 3e 70 55 6e 70 61  = pSorter->pUnpa
157d0 63 6b 65 64 20 3d 20 73 71 6c 69 74 65 33 56 64  cked = sqlite3Vd
157e0 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52  beAllocUnpackedR
157f0 65 63 6f 72 64 28 70 4b 65 79 49 6e 66 6f 2c 30  ecord(pKeyInfo,0
15800 2c 30 2c 26 70 29 3b 0a 20 20 20 20 61 73 73 65  ,0,&p);.    asse
15810 72 74 28 20 70 53 6f 72 74 65 72 2d 3e 70 55 6e  rt( pSorter->pUn
15820 70 61 63 6b 65 64 3d 3d 28 55 6e 70 61 63 6b 65  packed==(Unpacke
15830 64 52 65 63 6f 72 64 2a 29 70 20 29 3b 0a 20 20  dRecord*)p );.  
15840 20 20 69 66 28 20 72 32 3d 3d 30 20 29 20 72 65    if( r2==0 ) re
15850 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
15860 4d 3b 0a 20 20 20 20 72 32 2d 3e 6e 46 69 65 6c  M;.    r2->nFiel
15870 64 20 3d 20 6e 4b 65 79 43 6f 6c 3b 0a 20 20 7d  d = nKeyCol;.  }
15880 0a 20 20 61 73 73 65 72 74 28 20 72 32 2d 3e 6e  .  assert( r2->n
15890 46 69 65 6c 64 3d 3d 6e 4b 65 79 43 6f 6c 20 29  Field==nKeyCol )
158a0 3b 0a 0a 20 20 70 4b 65 79 20 3d 20 76 64 62 65  ;..  pKey = vdbe
158b0 53 6f 72 74 65 72 52 6f 77 6b 65 79 28 70 53 6f  SorterRowkey(pSo
158c0 72 74 65 72 2c 20 26 6e 4b 65 79 29 3b 0a 20 20  rter, &nKey);.  
158d0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
158e0 64 55 6e 70 61 63 6b 28 70 4b 65 79 49 6e 66 6f  dUnpack(pKeyInfo
158f0 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 72 32  , nKey, pKey, r2
15900 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
15910 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nKeyCol; i++){. 
15920 20 20 20 69 66 28 20 72 32 2d 3e 61 4d 65 6d 5b     if( r2->aMem[
15930 69 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  i].flags & MEM_N
15940 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  ull ){.      *pR
15950 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72  es = -1;.      r
15960 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15970 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
15980 52 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Res = sqlite3Vdb
15990 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 70  eRecordCompare(p
159a0 56 61 6c 2d 3e 6e 2c 20 70 56 61 6c 2d 3e 7a 2c  Val->n, pVal->z,
159b0 20 72 32 2c 20 30 29 3b 0a 20 20 72 65 74 75 72   r2, 0);.  retur
159c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a     n SQLITE_OK;.}.