/ Hex Artifact Content
Login

Artifact 270ebaa9f5a7d283f9aeeb50605dbd243bde111b5ee9f5f5765b3f1a7998a71c:


0000: 2f 2a 0a 2a 2a 20 32 30 31 37 20 4a 75 6c 79 20  /*.** 2017 July 
0010: 31 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74  15.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c  *.**.** This fil
0180: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69  e contains the i
0190: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
01a0: 20 74 68 65 20 22 75 6e 69 6f 6e 76 74 61 62 22   the "unionvtab"
01b0: 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62 6c   virtual.** tabl
01c0: 65 2e 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 70  e. This module p
01d0: 72 6f 76 69 64 65 73 20 72 65 61 64 2d 6f 6e 6c  rovides read-onl
01e0: 79 20 61 63 63 65 73 73 20 74 6f 20 6d 75 6c 74  y access to mult
01f0: 69 70 6c 65 20 74 61 62 6c 65 73 2c 20 0a 2a 2a  iple tables, .**
0200: 20 70 6f 73 73 69 62 6c 79 20 69 6e 20 6d 75 6c   possibly in mul
0210: 74 69 70 6c 65 20 64 61 74 61 62 61 73 65 20 66  tiple database f
0220: 69 6c 65 73 2c 20 76 69 61 20 61 20 73 69 6e 67  iles, via a sing
0230: 6c 65 20 64 61 74 61 62 61 73 65 20 6f 62 6a 65  le database obje
0240: 63 74 2e 0a 2a 2a 20 54 68 65 20 73 6f 75 72 63  ct..** The sourc
0250: 65 20 74 61 62 6c 65 73 20 6d 75 73 74 20 68 61  e tables must ha
0260: 76 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ve the following
0270: 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
0280: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 79  :.**.**   * They
0290: 20 6d 75 73 74 20 61 6c 6c 20 62 65 20 72 6f 77   must all be row
02a0: 69 64 20 74 61 62 6c 65 73 20 28 6e 6f 74 20 56  id tables (not V
02b0: 49 52 54 55 41 4c 20 6f 72 20 57 49 54 48 4f 55  IRTUAL or WITHOU
02c0: 54 20 52 4f 57 49 44 0a 2a 2a 20 20 20 20 20 74  T ROWID.**     t
02d0: 61 62 6c 65 73 20 6f 72 20 76 69 65 77 73 29 2e  ables or views).
02e0: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 45 61 63 68 20  .**.**   * Each 
02f0: 74 61 62 6c 65 20 6d 75 73 74 20 68 61 76 65 20  table must have 
0300: 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20  the same set of 
0310: 63 6f 6c 75 6d 6e 73 2c 20 64 65 63 6c 61 72 65  columns, declare
0320: 64 20 69 6e 0a 2a 2a 20 20 20 20 20 74 68 65 20  d in.**     the 
0330: 73 61 6d 65 20 6f 72 64 65 72 20 61 6e 64 20 77  same order and w
0340: 69 74 68 20 74 68 65 20 73 61 6d 65 20 64 65 63  ith the same dec
0350: 6c 61 72 65 64 20 74 79 70 65 73 2e 0a 2a 2a 0a  lared types..**.
0360: 2a 2a 20 20 20 2a 20 54 68 65 20 74 61 62 6c 65  **   * The table
0370: 73 20 6d 75 73 74 20 6e 6f 74 20 66 65 61 74 75  s must not featu
0380: 72 65 20 61 20 75 73 65 72 2d 64 65 66 69 6e 65  re a user-define
0390: 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 22  d column named "
03a0: 5f 72 6f 77 69 64 5f 22 2e 0a 2a 2a 0a 2a 2a 20  _rowid_"..**.** 
03b0: 20 20 2a 20 45 61 63 68 20 74 61 62 6c 65 20 6d    * Each table m
03c0: 75 73 74 20 63 6f 6e 74 61 69 6e 20 61 20 64 69  ust contain a di
03d0: 73 74 69 6e 63 74 20 72 61 6e 67 65 20 6f 66 20  stinct range of 
03e0: 72 6f 77 69 64 20 76 61 6c 75 65 73 2e 0a 2a 2a  rowid values..**
03f0: 0a 2a 2a 20 41 20 22 75 6e 69 6f 6e 76 74 61 62  .** A "unionvtab
0400: 22 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  " virtual table 
0410: 69 73 20 63 72 65 61 74 65 64 20 61 73 20 66 6f  is created as fo
0420: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43  llows:.**.**   C
0430: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
0440: 42 4c 45 20 3c 6e 61 6d 65 3e 20 55 53 49 4e 47  BLE <name> USING
0450: 20 75 6e 69 6f 6e 76 74 61 62 28 3c 73 71 6c 20   unionvtab(<sql 
0460: 73 74 61 74 65 6d 65 6e 74 3e 29 3b 0a 2a 2a 0a  statement>);.**.
0470: 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
0480: 61 74 69 6f 6e 20 65 76 61 6c 75 74 65 73 20 3c  ation evalutes <
0490: 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 3e 20 77  sql statement> w
04a0: 68 65 6e 65 76 65 72 20 61 20 75 6e 69 6f 6e 76  henever a unionv
04b0: 74 61 62 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74  tab virtual.** t
04c0: 61 62 6c 65 20 69 73 20 63 72 65 61 74 65 64 20  able is created 
04d0: 6f 72 20 6f 70 65 6e 65 64 2e 20 49 74 20 73 68  or opened. It sh
04e0: 6f 75 6c 64 20 72 65 74 75 72 6e 20 6f 6e 65 20  ould return one 
04f0: 72 6f 77 20 66 6f 72 20 65 61 63 68 20 73 6f 75  row for each sou
0500: 72 63 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  rce.** database 
0510: 74 61 62 6c 65 2e 20 54 68 65 20 66 6f 75 72 20  table. The four 
0520: 63 6f 6c 75 6d 6e 73 20 72 65 71 75 69 72 65 64  columns required
0530: 20 6f 66 20 65 61 63 68 20 72 6f 77 20 61 72 65   of each row are
0540: 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 54 68 65  :.**.**   1. The
0550: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
0560: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
0570: 20 74 68 65 20 74 61 62 6c 65 20 28 22 6d 61 69   the table ("mai
0580: 6e 22 20 6f 72 20 22 74 65 6d 70 22 20 6f 72 0a  n" or "temp" or.
0590: 2a 2a 20 20 20 20 20 20 74 68 65 20 6e 61 6d 65  **      the name
05a0: 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20   of an attached 
05b0: 64 61 74 61 62 61 73 65 29 2e 20 4f 72 20 4e 55  database). Or NU
05c0: 4c 4c 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  LL to indicate t
05d0: 68 61 74 20 61 6c 6c 0a 2a 2a 20 20 20 20 20 20  hat all.**      
05e0: 64 61 74 61 62 61 73 65 73 20 73 68 6f 75 6c 64  databases should
05f0: 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
0600: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 74 68   the table in th
0610: 65 20 75 73 75 61 6c 20 66 61 73 68 69 6f 6e 2e  e usual fashion.
0620: 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 54 68 65 20  .**.**   2. The 
0630: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
0640: 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  base table..**.*
0650: 2a 20 20 20 33 2e 20 54 68 65 20 73 6d 61 6c 6c  *   3. The small
0660: 65 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68 65  est rowid in the
0670: 20 72 61 6e 67 65 20 6f 66 20 72 6f 77 69 64 73   range of rowids
0680: 20 74 68 61 74 20 6d 61 79 20 62 65 20 73 74 6f   that may be sto
0690: 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20  red in the.**   
06a0: 20 20 20 64 61 74 61 62 61 73 65 20 74 61 62 6c     database tabl
06b0: 65 20 28 61 6e 20 69 6e 74 65 67 65 72 29 2e 0a  e (an integer)..
06c0: 2a 2a 0a 2a 2a 20 20 20 34 2e 20 54 68 65 20 6c  **.**   4. The l
06d0: 61 72 67 65 73 74 20 72 6f 77 69 64 20 69 6e 20  argest rowid in 
06e0: 74 68 65 20 72 61 6e 67 65 20 6f 66 20 72 6f 77  the range of row
06f0: 69 64 73 20 74 68 61 74 20 6d 61 79 20 62 65 20  ids that may be 
0700: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a  stored in the.**
0710: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74        database t
0720: 61 62 6c 65 20 28 61 6e 20 69 6e 74 65 67 65 72  able (an integer
0730: 29 2e 0a 2a 2a 0a 2a 2f 0a 0a 23 69 6e 63 6c 75  )..**.*/..#inclu
0740: 64 65 20 22 73 71 6c 69 74 65 33 65 78 74 2e 68  de "sqlite3ext.h
0750: 22 0a 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49  ".SQLITE_EXTENSI
0760: 4f 4e 5f 49 4e 49 54 31 0a 23 69 6e 63 6c 75 64  ON_INIT1.#includ
0770: 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e  e <assert.h>.#in
0780: 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e  clude <string.h>
0790: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
07a0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
07b0: 4c 45 0a 0a 2f 2a 0a 2a 2a 20 4c 61 72 67 65 73  LE../*.** Larges
07c0: 74 20 61 6e 64 20 73 6d 61 6c 6c 65 73 74 20 70  t and smallest p
07d0: 6f 73 73 69 62 6c 65 20 36 34 2d 62 69 74 20 73  ossible 64-bit s
07e0: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 73 2e 20  igned integers. 
07f0: 54 68 65 73 65 20 6d 61 63 72 6f 73 0a 2a 2a 20  These macros.** 
0800: 63 6f 70 69 65 64 20 66 72 6f 6d 20 73 71 6c 69  copied from sqli
0810: 74 65 49 6e 74 2e 68 2e 0a 2a 2f 0a 23 69 66 6e  teInt.h..*/.#ifn
0820: 64 65 66 20 4c 41 52 47 45 53 54 5f 49 4e 54 36  def LARGEST_INT6
0830: 34 0a 23 20 64 65 66 69 6e 65 20 4c 41 52 47 45  4.# define LARGE
0840: 53 54 5f 49 4e 54 36 34 20 20 28 30 78 66 66 66  ST_INT64  (0xfff
0850: 66 66 66 66 66 7c 28 28 28 73 71 6c 69 74 65 33  fffff|(((sqlite3
0860: 5f 69 6e 74 36 34 29 30 78 37 66 66 66 66 66 66  _int64)0x7ffffff
0870: 66 29 3c 3c 33 32 29 29 0a 23 65 6e 64 69 66 0a  f)<<32)).#endif.
0880: 23 69 66 6e 64 65 66 20 53 4d 41 4c 4c 45 53 54  #ifndef SMALLEST
0890: 5f 49 4e 54 36 34 0a 23 20 64 65 66 69 6e 65 20  _INT64.# define 
08a0: 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 28  SMALLEST_INT64 (
08b0: 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  ((sqlite3_int64)
08c0: 2d 31 29 20 2d 20 4c 41 52 47 45 53 54 5f 49 4e  -1) - LARGEST_IN
08d0: 54 36 34 29 0a 23 65 6e 64 69 66 0a 0a 74 79 70  T64).#endif..typ
08e0: 65 64 65 66 20 73 74 72 75 63 74 20 55 6e 69 6f  edef struct Unio
08f0: 6e 43 73 72 20 55 6e 69 6f 6e 43 73 72 3b 0a 74  nCsr UnionCsr;.t
0900: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 55 6e  ypedef struct Un
0910: 69 6f 6e 54 61 62 20 55 6e 69 6f 6e 54 61 62 3b  ionTab UnionTab;
0920: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0930: 55 6e 69 6f 6e 53 72 63 20 55 6e 69 6f 6e 53 72  UnionSrc UnionSr
0940: 63 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 73  c;../*.** Each s
0950: 6f 75 72 63 65 20 74 61 62 6c 65 20 28 72 6f 77  ource table (row
0960: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
0970: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
0980: 71 75 65 72 79 29 20 69 73 20 0a 2a 2a 20 72 65  query) is .** re
0990: 70 72 65 73 65 6e 74 65 64 20 62 79 20 61 6e 20  presented by an 
09a0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
09b0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
09c0: 75 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ure stored in th
09d0: 65 0a 2a 2a 20 55 6e 69 6f 6e 54 61 62 2e 61 53  e.** UnionTab.aS
09e0: 72 63 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73  rc[] array..*/.s
09f0: 74 72 75 63 74 20 55 6e 69 6f 6e 53 72 63 20 7b  truct UnionSrc {
0a00: 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20  .  char *zDb;   
0a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a20: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
0a30: 6f 6e 74 61 69 6e 69 6e 67 20 73 6f 75 72 63 65  ontaining source
0a40: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 68 61 72   table */.  char
0a50: 20 2a 7a 54 61 62 3b 20 20 20 20 20 20 20 20 20   *zTab;         
0a60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
0a70: 6f 75 72 63 65 20 74 61 62 6c 65 20 6e 61 6d 65  ource table name
0a80: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
0a90: 74 36 34 20 69 4d 69 6e 3b 20 20 20 20 20 20 20  t64 iMin;       
0aa0: 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d        /* Minimum
0ab0: 20 72 6f 77 69 64 20 2a 2f 0a 20 20 73 71 6c 69   rowid */.  sqli
0ac0: 74 65 33 5f 69 6e 74 36 34 20 69 4d 61 78 3b 20  te3_int64 iMax; 
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
0ae0: 61 78 69 6d 75 6d 20 72 6f 77 69 64 20 2a 2f 0a  aximum rowid */.
0af0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 56 69 72 74 75 61  };../*.** Virtua
0b00: 6c 20 74 61 62 6c 65 20 20 74 79 70 65 20 66 6f  l table  type fo
0b10: 72 20 75 6e 69 6f 6e 20 76 74 61 62 2e 0a 2a 2f  r union vtab..*/
0b20: 0a 73 74 72 75 63 74 20 55 6e 69 6f 6e 54 61 62  .struct UnionTab
0b30: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61   {.  sqlite3_vta
0b40: 62 20 62 61 73 65 3b 20 20 20 20 20 20 20 20 20  b base;         
0b50: 20 20 20 20 20 2f 2a 20 42 61 73 65 20 63 6c 61       /* Base cla
0b60: 73 73 20 2d 20 6d 75 73 74 20 62 65 20 66 69 72  ss - must be fir
0b70: 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  st */.  sqlite3 
0b80: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
0b90: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
0ba0: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
0bb0: 69 6e 74 20 69 50 4b 3b 20 20 20 20 20 20 20 20  int iPK;        
0bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bd0: 2f 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  /* INTEGER PRIMA
0be0: 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2c 20 6f  RY KEY column, o
0bf0: 72 20 2d 31 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  r -1 */.  int nS
0c00: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
0c10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
0c20: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
0c30: 69 6e 20 74 68 65 20 61 53 72 63 5b 5d 20 61 72  in the aSrc[] ar
0c40: 72 61 79 20 2a 2f 0a 20 20 55 6e 69 6f 6e 53 72  ray */.  UnionSr
0c50: 63 20 2a 61 53 72 63 3b 20 20 20 20 20 20 20 20  c *aSrc;        
0c60: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
0c70: 79 20 6f 66 20 73 6f 75 72 63 65 20 74 61 62 6c  y of source tabl
0c80: 65 73 2c 20 73 6f 72 74 65 64 20 62 79 20 72 6f  es, sorted by ro
0c90: 77 69 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  wid */.};../*.**
0ca0: 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63   Virtual table c
0cb0: 75 72 73 6f 72 20 74 79 70 65 20 66 6f 72 20 75  ursor type for u
0cc0: 6e 69 6f 6e 20 76 74 61 62 2e 0a 2a 2f 0a 73 74  nion vtab..*/.st
0cd0: 72 75 63 74 20 55 6e 69 6f 6e 43 73 72 20 7b 0a  ruct UnionCsr {.
0ce0: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
0cf0: 75 72 73 6f 72 20 62 61 73 65 3b 20 20 20 20 20  ursor base;     
0d00: 20 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 20    /* Base class 
0d10: 2d 20 6d 75 73 74 20 62 65 20 66 69 72 73 74 20  - must be first 
0d20: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
0d30: 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20  t *pStmt;       
0d40: 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74 61 74       /* SQL stat
0d50: 65 6d 65 6e 74 20 74 6f 20 72 75 6e 20 2a 2f 0a  ement to run */.
0d60: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 52  };../*.** If *pR
0d70: 63 20 69 73 20 6f 74 68 65 72 20 74 68 61 6e 20  c is other than 
0d80: 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74  SQLITE_OK when t
0d90: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
0da0: 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 61 6c  called, it.** al
0db0: 77 61 79 73 20 72 65 74 75 72 6e 73 20 4e 55 4c  ways returns NUL
0dc0: 4c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  L. Otherwise, it
0dd0: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 61 6c 6c   attempts to all
0de0: 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  ocate and return
0df0: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
0e00: 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
0e10: 7a 65 72 6f 65 64 20 6d 65 6d 6f 72 79 2e 20 49  zeroed memory. I
0e20: 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  f the memory all
0e30: 6f 63 61 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 74  ocation.** is at
0e40: 74 65 6d 70 74 65 64 20 62 75 74 20 66 61 69 6c  tempted but fail
0e50: 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
0e60: 6e 65 64 20 61 6e 64 20 2a 70 52 63 20 69 73 20  ned and *pRc is 
0e70: 73 65 74 20 74 6f 20 0a 2a 2a 20 53 51 4c 49 54  set to .** SQLIT
0e80: 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74  E_NOMEM..*/.stat
0e90: 69 63 20 76 6f 69 64 20 2a 75 6e 69 6f 6e 4d 61  ic void *unionMa
0ea0: 6c 6c 6f 63 28 69 6e 74 20 2a 70 52 63 2c 20 69  lloc(int *pRc, i
0eb0: 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 76 6f 69  nt nByte){.  voi
0ec0: 64 20 2a 70 52 65 74 3b 0a 20 20 61 73 73 65 72  d *pRet;.  asser
0ed0: 74 28 20 6e 42 79 74 65 3e 30 20 29 3b 0a 20 20  t( nByte>0 );.  
0ee0: 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  if( *pRc==SQLITE
0ef0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 52 65 74 20  _OK ){.    pRet 
0f00: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
0f10: 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28  (nByte);.    if(
0f20: 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 6d   pRet ){.      m
0f30: 65 6d 73 65 74 28 70 52 65 74 2c 20 30 2c 20 6e  emset(pRet, 0, n
0f40: 42 79 74 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Byte);.    }else
0f50: 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53  {.      *pRc = S
0f60: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
0f70: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
0f80: 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pRet = 0;.  }.  
0f90: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
0fa0: 2f 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69 73  /*.** If *pRc is
0fb0: 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
0fc0: 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73 20  TE_OK when this 
0fd0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
0fe0: 65 64 2c 20 69 74 0a 2a 2a 20 61 6c 77 61 79 73  ed, it.** always
0ff0: 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 20 4f   returns NULL. O
1000: 74 68 65 72 77 69 73 65 2c 20 69 74 20 61 74 74  therwise, it att
1010: 65 6d 70 74 73 20 74 6f 20 61 6c 6c 6f 63 61 74  empts to allocat
1020: 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  e and return.** 
1030: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6e 75  a copy of the nu
1040: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  l-terminated str
1050: 69 6e 67 20 70 61 73 73 65 64 20 61 73 20 74 68  ing passed as th
1060: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1070: 74 2e 0a 2a 2a 20 49 66 20 74 68 65 20 61 6c 6c  t..** If the all
1080: 6f 63 61 74 69 6f 6e 20 69 73 20 61 74 74 65 6d  ocation is attem
1090: 70 74 65 64 20 62 75 74 20 66 61 69 6c 73 2c 20  pted but fails, 
10a0: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
10b0: 20 61 6e 64 20 2a 70 52 63 20 69 73 20 0a 2a 2a   and *pRc is .**
10c0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e   set to SQLITE_N
10d0: 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  OMEM..*/.static 
10e0: 63 68 61 72 20 2a 75 6e 69 6f 6e 53 74 72 64 75  char *unionStrdu
10f0: 70 28 69 6e 74 20 2a 70 52 63 2c 20 63 6f 6e 73  p(int *pRc, cons
1100: 74 20 63 68 61 72 20 2a 7a 49 6e 29 7b 0a 20 20  t char *zIn){.  
1110: 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 30 3b 0a  char *zRet = 0;.
1120: 20 20 69 66 28 20 7a 49 6e 20 29 7b 0a 20 20 20    if( zIn ){.   
1130: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 74 72   int nByte = str
1140: 6c 65 6e 28 7a 49 6e 29 20 2b 20 31 3b 0a 20 20  len(zIn) + 1;.  
1150: 20 20 7a 52 65 74 20 3d 20 75 6e 69 6f 6e 4d 61    zRet = unionMa
1160: 6c 6c 6f 63 28 70 52 63 2c 20 6e 42 79 74 65 29  lloc(pRc, nByte)
1170: 3b 0a 20 20 20 20 69 66 28 20 7a 52 65 74 20 29  ;.    if( zRet )
1180: 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  {.      memcpy(z
1190: 52 65 74 2c 20 7a 49 6e 2c 20 6e 42 79 74 65 29  Ret, zIn, nByte)
11a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
11b0: 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn zRet;.}../*
11c0: 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 72 73 74  .** If the first
11d0: 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68   character of th
11e0: 65 20 73 74 72 69 6e 67 20 70 61 73 73 65 64 20  e string passed 
11f0: 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
1200: 6d 65 6e 74 20 74 6f 20 74 68 69 73 0a 2a 2a 20  ment to this.** 
1210: 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 65 20  function is one 
1220: 6f 66 20 74 68 65 20 34 20 74 68 61 74 20 6d 61  of the 4 that ma
1230: 79 20 62 65 20 75 73 65 64 20 61 73 20 61 6e 20  y be used as an 
1240: 6f 70 65 6e 20 71 75 6f 74 65 20 63 68 61 72 61  open quote chara
1250: 63 74 65 72 0a 2a 2a 20 69 6e 20 53 51 4c 2c 20  cter.** in SQL, 
1260: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  this function as
1270: 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 69  sumes that the i
1280: 6e 70 75 74 20 69 73 20 61 20 77 65 6c 6c 2d 66  nput is a well-f
1290: 6f 72 6d 65 64 20 71 75 6f 74 65 64 20 53 51 4c  ormed quoted SQL
12a0: 20 0a 2a 2a 20 73 74 72 69 6e 67 2e 20 49 6e 20   .** string. In 
12b0: 74 68 69 73 20 63 61 73 65 20 74 68 65 20 73 74  this case the st
12c0: 72 69 6e 67 20 69 73 20 64 65 71 75 6f 74 65 64  ring is dequoted
12d0: 20 69 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a   in place..**.**
12e0: 20 49 66 20 74 68 65 20 66 69 72 73 74 20 63 68   If the first ch
12f0: 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 69  aracter of the i
1300: 6e 70 75 74 20 69 73 20 6e 6f 74 20 61 6e 20 6f  nput is not an o
1310: 70 65 6e 20 71 75 6f 74 65 2c 20 74 68 65 6e 20  pen quote, then 
1320: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1330: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
1340: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 6f  static void unio
1350: 6e 44 65 71 75 6f 74 65 28 63 68 61 72 20 2a 7a  nDequote(char *z
1360: 29 7b 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20  ){.  if( z ){.  
1370: 20 20 63 68 61 72 20 71 20 3d 20 7a 5b 30 5d 3b    char q = z[0];
1380: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 73 74 61  ..    /* Set sta
1390: 63 6b 20 76 61 72 69 61 62 6c 65 20 71 20 74 6f  ck variable q to
13a0: 20 74 68 65 20 63 6c 6f 73 65 2d 71 75 6f 74 65   the close-quote
13b0: 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20   character */.  
13c0: 20 20 69 66 28 20 71 3d 3d 27 5b 27 20 7c 7c 20    if( q=='[' || 
13d0: 71 3d 3d 27 5c 27 27 20 7c 7c 20 71 3d 3d 27 22  q=='\'' || q=='"
13e0: 27 20 7c 7c 20 71 3d 3d 27 60 27 20 29 7b 0a 20  ' || q=='`' ){. 
13f0: 20 20 20 20 20 69 6e 74 20 69 49 6e 20 3d 20 31       int iIn = 1
1400: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 75 74  ;.      int iOut
1410: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
1420: 71 3d 3d 27 5b 27 20 29 20 71 20 3d 20 27 5d 27  q=='[' ) q = ']'
1430: 3b 20 20 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ;  .      while(
1440: 20 7a 5b 69 49 6e 5d 20 29 7b 0a 20 20 20 20 20   z[iIn] ){.     
1450: 20 20 20 69 66 28 20 7a 5b 69 49 6e 5d 3d 3d 71     if( z[iIn]==q
1460: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
1470: 28 20 7a 5b 69 49 6e 2b 31 5d 21 3d 71 20 29 7b  ( z[iIn+1]!=q ){
1480: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
1490: 43 68 61 72 61 63 74 65 72 20 69 49 6e 20 77 61  Character iIn wa
14a0: 73 20 74 68 65 20 63 6c 6f 73 65 20 71 75 6f 74  s the close quot
14b0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
14c0: 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20    iIn++;.       
14d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 72           /* Char
1500: 61 63 74 65 72 20 69 49 6e 20 61 6e 64 20 69 49  acter iIn and iI
1510: 6e 2b 31 20 66 6f 72 6d 20 61 6e 20 65 73 63 61  n+1 form an esca
1520: 70 65 64 20 71 75 6f 74 65 20 63 68 61 72 61 63  ped quote charac
1530: 74 65 72 2e 20 53 6b 69 70 0a 20 20 20 20 20 20  ter. Skip.      
1540: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 70        ** the inp
1550: 75 74 20 63 75 72 73 6f 72 20 70 61 73 74 20 62  ut cursor past b
1560: 6f 74 68 20 61 6e 64 20 63 6f 70 79 20 61 20 73  oth and copy a s
1570: 69 6e 67 6c 65 20 71 75 6f 74 65 20 63 68 61 72  ingle quote char
1580: 61 63 74 65 72 20 0a 20 20 20 20 20 20 20 20 20  acter .         
1590: 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6f 75 74     ** to the out
15a0: 70 75 74 20 62 75 66 66 65 72 2e 20 2a 2f 0a 20  put buffer. */. 
15b0: 20 20 20 20 20 20 20 20 20 20 20 69 49 6e 20 2b             iIn +
15c0: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 2;.           
15d0: 20 7a 5b 69 4f 75 74 2b 2b 5d 20 3d 20 71 3b 0a   z[iOut++] = q;.
15e0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
15f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1600: 20 20 20 20 20 7a 5b 69 4f 75 74 2b 2b 5d 20 3d       z[iOut++] =
1610: 20 7a 5b 69 49 6e 2b 2b 5d 3b 0a 20 20 20 20 20   z[iIn++];.     
1620: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1630: 20 20 20 7a 5b 69 4f 75 74 5d 20 3d 20 27 5c 30     z[iOut] = '\0
1640: 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  ';.    }.  }.}..
1650: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1660: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  ion is a no-op i
1670: 66 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f  f *pRc is set to
1680: 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
1690: 54 45 5f 4f 4b 20 77 68 65 6e 20 69 74 0a 2a 2a  TE_OK when it.**
16a0: 20 69 73 20 63 61 6c 6c 65 64 2e 20 4e 55 4c 4c   is called. NULL
16b0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 20   is returned in 
16c0: 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
16d0: 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
16e0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 70 61  SQL statement pa
16f0: 73 73 65 64 20 61 73 20 74 68 65 20 74 68 69 72  ssed as the thir
1700: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 70 72  d argument is pr
1710: 65 70 61 72 65 64 0a 2a 2a 20 61 67 61 69 6e 73  epared.** agains
1720: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  t the database h
1730: 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20  andle passed as 
1740: 74 68 65 20 73 65 63 6f 6e 64 2e 20 49 66 20 74  the second. If t
1750: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a  he statement is.
1760: 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ** successfully 
1770: 70 72 65 70 61 72 65 64 2c 20 61 20 70 6f 69 6e  prepared, a poin
1780: 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 73  ter to the new s
1790: 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20  tatement handle 
17a0: 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e  is .** returned.
17b0: 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
17c0: 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
17d0: 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
17e0: 75 61 6c 6c 79 20 66 72 65 65 20 74 68 65 0a 2a  ually free the.*
17f0: 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 79 20 63  * statement by c
1800: 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 66  alling sqlite3_f
1810: 69 6e 61 6c 69 7a 65 28 29 2e 20 41 6c 74 65 72  inalize(). Alter
1820: 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 73 74 61  natively, if sta
1830: 74 65 6d 65 6e 74 0a 2a 2a 20 63 6f 6d 70 69 6c  tement.** compil
1840: 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 4e 55 4c  ation fails, NUL
1850: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 2a  L is returned, *
1860: 70 52 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e  pRc is set to an
1870: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a   SQLite error.**
1880: 20 63 6f 64 65 20 61 6e 64 20 2a 70 7a 45 72 72   code and *pzErr
1890: 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 61   may be set to a
18a0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
18b0: 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
18c0: 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d   by.** sqlite3_m
18d0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74  alloc()..*/.stat
18e0: 69 63 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  ic sqlite3_stmt 
18f0: 2a 75 6e 69 6f 6e 50 72 65 70 61 72 65 28 0a 20  *unionPrepare(. 
1900: 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20   int *pRc,      
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f   /* IN/OUT: Erro
1930: 72 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  r code */.  sqli
1940: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
1950: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1960: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
1970: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1980: 7a 53 71 6c 2c 20 20 20 20 20 20 20 20 20 20 20  zSql,           
1990: 20 20 20 20 2f 2a 20 53 51 4c 20 73 74 61 74 65      /* SQL state
19a0: 6d 65 6e 74 20 74 6f 20 70 72 65 70 61 72 65 20  ment to prepare 
19b0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  */.  char **pzEr
19c0: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
19d0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72       /* OUT: Err
19e0: 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 29 7b  or message */.){
19f0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1a00: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28  *pRet = 0;.  if(
1a10: 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
1a20: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
1a30: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
1a40: 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  _v2(db, zSql, -1
1a50: 2c 20 26 70 52 65 74 2c 20 30 29 3b 0a 20 20 20  , &pRet, 0);.   
1a60: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a70: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 7a 45  OK ){.      *pzE
1a80: 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  rr = sqlite3_mpr
1a90: 69 6e 74 66 28 22 73 71 6c 20 65 72 72 6f 72 3a  intf("sql error:
1aa0: 20 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72   %s", sqlite3_er
1ab0: 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 20  rmsg(db));.     
1ac0: 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20   *pRc = rc;.    
1ad0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
1ae0: 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69  Ret;.}../*.** Li
1af0: 6b 65 20 75 6e 69 6f 6e 50 72 65 70 61 72 65 28  ke unionPrepare(
1b00: 29 2c 20 65 78 63 65 70 74 20 70 72 65 70 61 72  ), except prepar
1b10: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  e the results of
1b20: 20 76 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 2e   vprintf(zFmt, .
1b30: 2e 2e 29 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f  ..).** instead o
1b40: 66 20 61 20 63 6f 6e 73 74 61 6e 74 20 53 51 4c  f a constant SQL
1b50: 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74   string..*/.stat
1b60: 69 63 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  ic sqlite3_stmt 
1b70: 2a 75 6e 69 6f 6e 50 72 65 70 61 72 65 50 72 69  *unionPreparePri
1b80: 6e 74 66 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c  ntf(.  int *pRc,
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
1bb0: 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  : Error code */.
1bc0: 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 2c 20    char **pzErr, 
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20    /* OUT: Error 
1bf0: 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 73 71 6c  message */.  sql
1c00: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
1c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c20: 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
1c30: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1c40: 2a 7a 46 6d 74 2c 20 20 20 20 20 20 20 20 20 20  *zFmt,          
1c50: 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 66 28 29       /* printf()
1c60: 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 2a   format string *
1c70: 2f 0a 20 20 2e 2e 2e 20 20 20 20 20 20 20 20 20  /.  ...         
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c90: 20 20 20 20 2f 2a 20 54 72 61 69 6c 69 6e 67 20      /* Trailing 
1ca0: 70 72 69 6e 74 66 20 61 72 67 73 20 2a 2f 0a 29  printf args */.)
1cb0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
1cc0: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 63 68   *pRet = 0;.  ch
1cd0: 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 76 61 5f 6c  ar *zSql;.  va_l
1ce0: 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61  ist ap;.  va_sta
1cf0: 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 0a 20  rt(ap, zFmt);.. 
1d00: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
1d10: 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61  vmprintf(zFmt, a
1d20: 70 29 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d  p);.  if( *pRc==
1d30: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d40: 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a   if( zSql==0 ){.
1d50: 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c        *pRc = SQL
1d60: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
1d70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 65 74  else{.      pRet
1d80: 20 3d 20 75 6e 69 6f 6e 50 72 65 70 61 72 65 28   = unionPrepare(
1d90: 70 52 63 2c 20 64 62 2c 20 7a 53 71 6c 2c 20 70  pRc, db, zSql, p
1da0: 7a 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  zErr);.    }.  }
1db0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1dc0: 7a 53 71 6c 29 3b 0a 0a 20 20 76 61 5f 65 6e 64  zSql);..  va_end
1dd0: 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  (ap);.  return p
1de0: 52 65 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  Ret;.}.../*.** C
1df0: 61 6c 6c 20 73 71 6c 69 74 65 33 5f 72 65 73 65  all sqlite3_rese
1e00: 74 28 29 20 6f 6e 20 53 51 4c 20 73 74 61 74 65  t() on SQL state
1e10: 6d 65 6e 74 20 70 53 74 6d 74 2e 20 49 66 20 2a  ment pStmt. If *
1e20: 70 52 63 20 69 73 20 73 65 74 20 74 6f 20 0a 2a  pRc is set to .*
1e30: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e  * SQLITE_OK when
1e40: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1e50: 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 69  s called, then i
1e60: 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a  t is set to the.
1e70: 2a 2a 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  ** value returne
1e80: 64 20 62 79 20 73 71 6c 69 74 65 33 5f 72 65 73  d by sqlite3_res
1e90: 65 74 28 29 20 62 65 66 6f 72 65 20 74 68 69 73  et() before this
1ea0: 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 74 73 2e   function exits.
1eb0: 0a 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65  .** In this case
1ec0: 2c 20 2a 70 7a 45 72 72 20 6d 61 79 20 62 65 20  , *pzErr may be 
1ed0: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
1ee0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
1ef0: 0a 2a 2a 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  .** buffer alloc
1f00: 61 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  ated by sqlite3_
1f10: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61  malloc()..*/.sta
1f20: 74 69 63 20 76 6f 69 64 20 75 6e 69 6f 6e 52 65  tic void unionRe
1f30: 73 65 74 28 69 6e 74 20 2a 70 52 63 2c 20 73 71  set(int *pRc, sq
1f40: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1f50: 74 2c 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 29  t, char **pzErr)
1f60: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  {.  int rc = sql
1f70: 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
1f80: 29 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53  );.  if( *pRc==S
1f90: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1fa0: 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20 69  *pRc = rc;.    i
1fb0: 66 28 20 72 63 20 26 26 20 70 7a 45 72 72 20 29  f( rc && pzErr )
1fc0: 7b 0a 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d  {.      *pzErr =
1fd0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1fe0: 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65  ("%s", sqlite3_e
1ff0: 72 72 6d 73 67 28 73 71 6c 69 74 65 33 5f 64 62  rrmsg(sqlite3_db
2000: 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 29 29  _handle(pStmt)))
2010: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
2020: 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65  *.** Call sqlite
2030: 33 5f 66 69 6e 61 6c 69 7a 65 28 29 20 6f 6e 20  3_finalize() on 
2040: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 70 53  SQL statement pS
2050: 74 6d 74 2e 20 49 66 20 2a 70 52 63 20 69 73 20  tmt. If *pRc is 
2060: 73 65 74 20 74 6f 20 0a 2a 2a 20 53 51 4c 49 54  set to .** SQLIT
2070: 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73 20 66  E_OK when this f
2080: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2090: 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 73 65  d, then it is se
20a0: 74 20 74 6f 20 74 68 65 0a 2a 2a 20 76 61 6c 75  t to the.** valu
20b0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  e returned by sq
20c0: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 29  lite3_finalize()
20d0: 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e   before this fun
20e0: 63 74 69 6f 6e 20 65 78 69 74 73 2e 0a 2a 2f 0a  ction exits..*/.
20f0: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 6f  static void unio
2100: 6e 46 69 6e 61 6c 69 7a 65 28 69 6e 74 20 2a 70  nFinalize(int *p
2110: 52 63 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  Rc, sqlite3_stmt
2120: 20 2a 70 53 74 6d 74 29 7b 0a 20 20 69 6e 74 20   *pStmt){.  int 
2130: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  rc = sqlite3_fin
2140: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
2150: 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  if( *pRc==SQLITE
2160: 5f 4f 4b 20 29 20 2a 70 52 63 20 3d 20 72 63 3b  _OK ) *pRc = rc;
2170: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 44 69 73 63 6f  .}../*.** xDisco
2180: 6e 6e 65 63 74 20 6d 65 74 68 6f 64 2e 0a 2a 2f  nnect method..*/
2190: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 6f  .static int unio
21a0: 6e 44 69 73 63 6f 6e 6e 65 63 74 28 73 71 6c 69  nDisconnect(sqli
21b0: 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29  te3_vtab *pVtab)
21c0: 7b 0a 20 20 69 66 28 20 70 56 74 61 62 20 29 7b  {.  if( pVtab ){
21d0: 0a 20 20 20 20 55 6e 69 6f 6e 54 61 62 20 2a 70  .    UnionTab *p
21e0: 54 61 62 20 3d 20 28 55 6e 69 6f 6e 54 61 62 2a  Tab = (UnionTab*
21f0: 29 70 56 74 61 62 3b 0a 20 20 20 20 69 6e 74 20  )pVtab;.    int 
2200: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
2210: 69 3c 70 54 61 62 2d 3e 6e 53 72 63 3b 20 69 2b  i<pTab->nSrc; i+
2220: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
2230: 33 5f 66 72 65 65 28 70 54 61 62 2d 3e 61 53 72  3_free(pTab->aSr
2240: 63 5b 69 5d 2e 7a 44 62 29 3b 0a 20 20 20 20 20  c[i].zDb);.     
2250: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54   sqlite3_free(pT
2260: 61 62 2d 3e 61 53 72 63 5b 69 5d 2e 7a 54 61 62  ab->aSrc[i].zTab
2270: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2280: 69 74 65 33 5f 66 72 65 65 28 70 54 61 62 2d 3e  ite3_free(pTab->
2290: 61 53 72 63 29 3b 0a 20 20 20 20 73 71 6c 69 74  aSrc);.    sqlit
22a0: 65 33 5f 66 72 65 65 28 70 54 61 62 29 3b 0a 20  e3_free(pTab);. 
22b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
22c0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
22d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
22e0: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 2a 70 52 63   a no-op if *pRc
22f0: 20 69 73 20 6f 74 68 65 72 20 74 68 61 6e 20 53   is other than S
2300: 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 69 74  QLITE_OK when it
2310: 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2e 20 49   is.** called. I
2320: 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 72  n this case it r
2330: 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  eturns NULL..**.
2340: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  ** Otherwise, th
2350: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63  is function chec
2360: 6b 73 20 74 68 61 74 20 74 68 65 20 73 6f 75 72  ks that the sour
2370: 63 65 20 74 61 62 6c 65 20 70 61 73 73 65 64 20  ce table passed 
2380: 61 73 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64  as the.** second
2390: 20 61 72 67 75 6d 65 6e 74 20 28 61 29 20 65 78   argument (a) ex
23a0: 69 73 74 73 2c 20 28 62 29 20 69 73 20 6e 6f 74  ists, (b) is not
23b0: 20 61 20 76 69 65 77 20 61 6e 64 20 28 63 29 20   a view and (c) 
23c0: 68 61 73 20 61 20 63 6f 6c 75 6d 6e 20 0a 2a 2a  has a column .**
23d0: 20 6e 61 6d 65 64 20 22 5f 72 6f 77 69 64 5f 22   named "_rowid_"
23e0: 20 6f 66 20 74 79 70 65 20 22 69 6e 74 65 67 65   of type "intege
23f0: 72 22 20 74 68 61 74 20 69 73 20 74 68 65 20 70  r" that is the p
2400: 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 20 49  rimary key..** I
2410: 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68  f this is not th
2420: 65 20 63 61 73 65 2c 20 2a 70 52 63 20 69 73 20  e case, *pRc is 
2430: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 45 52  set to SQLITE_ER
2440: 52 4f 52 20 61 6e 64 20 4e 55 4c 4c 20 69 73 0a  ROR and NULL is.
2450: 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  ** returned..**.
2460: 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 74  ** Finally, if t
2470: 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 20  he source table 
2480: 70 61 73 73 65 73 20 74 68 65 20 63 68 65 63 6b  passes the check
2490: 73 20 61 62 6f 76 65 2c 20 61 20 6e 75 6c 2d 74  s above, a nul-t
24a0: 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 73 74 72  erminated.** str
24b0: 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74  ing describing t
24c0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
24d0: 61 6e 64 20 74 79 70 65 73 20 62 65 6c 6f 6e 67  and types belong
24e0: 69 6e 67 20 74 6f 20 74 68 65 20 73 6f 75 72 63  ing to the sourc
24f0: 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 72 65  e.** table is re
2500: 74 75 72 6e 65 64 2e 20 54 61 62 6c 65 73 20 77  turned. Tables w
2510: 69 74 68 20 74 68 65 20 73 61 6d 65 20 73 65 74  ith the same set
2520: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   of column names
2530: 20 61 6e 64 20 74 79 70 65 73 20 0a 2a 2a 20 63   and types .** c
2540: 61 75 73 65 20 74 68 69 73 20 66 75 6e 63 74 69  ause this functi
2550: 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 69 64 65  on to return ide
2560: 6e 74 69 63 61 6c 20 73 74 72 69 6e 67 73 2e 20  ntical strings. 
2570: 49 73 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  Is is the respon
2580: 73 69 62 69 6c 69 74 79 0a 2a 2a 20 6f 66 20 74  sibility.** of t
2590: 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 66 72 65  he caller to fre
25a0: 65 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  e the returned s
25b0: 74 72 69 6e 67 20 75 73 69 6e 67 20 73 71 6c 69  tring using sqli
25c0: 74 65 33 5f 66 72 65 65 28 29 20 77 68 65 6e 0a  te3_free() when.
25d0: 2a 2a 20 69 74 20 69 73 20 6e 6f 20 6c 6f 6e 67  ** it is no long
25e0: 65 72 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a  er required..*/.
25f0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 75 6e 69  static char *uni
2600: 6f 6e 53 6f 75 72 63 65 54 6f 53 74 72 28 0a 20  onSourceToStr(. 
2610: 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20   int *pRc,      
2620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2630: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f   /* IN/OUT: Erro
2640: 72 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  r code */.  sqli
2650: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
2660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2670: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
2680: 2f 0a 20 20 55 6e 69 6f 6e 53 72 63 20 2a 70 53  /.  UnionSrc *pS
2690: 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rc,             
26a0: 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 74 61      /* Source ta
26b0: 62 6c 65 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20  ble to test */. 
26c0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
26d0: 53 74 6d 74 2c 0a 20 20 63 68 61 72 20 2a 2a 70  Stmt,.  char **p
26e0: 7a 45 72 72 20 20 20 20 20 20 20 20 20 20 20 20  zErr            
26f0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2700: 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f  Error message */
2710: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74  .){.  char *zRet
2720: 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63   = 0;.  if( *pRc
2730: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2740: 20 20 20 69 6e 74 20 62 50 6b 20 3d 20 30 3b 0a     int bPk = 0;.
2750: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2760: 7a 54 79 70 65 20 3d 20 30 3b 0a 0a 20 20 20 20  zType = 0;..    
2770: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
2780: 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65  _table_column_me
2790: 74 61 64 61 74 61 28 0a 20 20 20 20 20 20 20 20  tadata(.        
27a0: 64 62 2c 20 70 53 72 63 2d 3e 7a 44 62 2c 20 70  db, pSrc->zDb, p
27b0: 53 72 63 2d 3e 7a 54 61 62 2c 20 22 5f 72 6f 77  Src->zTab, "_row
27c0: 69 64 5f 22 2c 20 26 7a 54 79 70 65 2c 20 30 2c  id_", &zType, 0,
27d0: 20 30 2c 20 26 62 50 6b 2c 20 30 0a 20 20 20 20   0, &bPk, 0.    
27e0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
27f0: 51 4c 49 54 45 5f 45 52 52 4f 52 20 0a 20 20 20  QLITE_ERROR .   
2800: 20 20 7c 7c 20 28 72 63 3d 3d 53 51 4c 49 54 45    || (rc==SQLITE
2810: 5f 4f 4b 20 26 26 20 28 21 62 50 6b 20 7c 7c 20  _OK && (!bPk || 
2820: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
2830: 22 69 6e 74 65 67 65 72 22 2c 20 7a 54 79 70 65  "integer", zType
2840: 29 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ))).    ){.     
2850: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
2860: 4f 52 3b 0a 20 20 20 20 20 20 2a 70 7a 45 72 72  OR;.      *pzErr
2870: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2880: 74 66 28 22 6e 6f 20 73 75 63 68 20 72 6f 77 69  tf("no such rowi
2890: 64 20 74 61 62 6c 65 3a 20 25 73 25 73 25 73 22  d table: %s%s%s"
28a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 28 70 53 72  ,.          (pSr
28b0: 63 2d 3e 7a 44 62 20 3f 20 70 53 72 63 2d 3e 7a  c->zDb ? pSrc->z
28c0: 44 62 20 3a 20 22 22 29 2c 0a 20 20 20 20 20 20  Db : ""),.      
28d0: 20 20 20 20 28 70 53 72 63 2d 3e 7a 44 62 20 3f      (pSrc->zDb ?
28e0: 20 22 2e 22 20 3a 20 22 22 29 2c 0a 20 20 20 20   "." : ""),.    
28f0: 20 20 20 20 20 20 70 53 72 63 2d 3e 7a 54 61 62        pSrc->zTab
2900: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
2910: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2920: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2930: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
2940: 74 28 70 53 74 6d 74 2c 20 31 2c 20 70 53 72 63  t(pStmt, 1, pSrc
2950: 2d 3e 7a 54 61 62 2c 20 2d 31 2c 20 53 51 4c 49  ->zTab, -1, SQLI
2960: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
2970: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
2980: 65 78 74 28 70 53 74 6d 74 2c 20 32 2c 20 70 53  ext(pStmt, 2, pS
2990: 72 63 2d 3e 7a 44 62 2c 20 2d 31 2c 20 53 51 4c  rc->zDb, -1, SQL
29a0: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
29b0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f     if( SQLITE_RO
29c0: 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
29d0: 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20  pStmt) ){.      
29e0: 20 20 7a 52 65 74 20 3d 20 75 6e 69 6f 6e 53 74    zRet = unionSt
29f0: 72 64 75 70 28 26 72 63 2c 20 28 63 6f 6e 73 74  rdup(&rc, (const
2a00: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
2a10: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
2a20: 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , 0));.      }. 
2a30: 20 20 20 20 20 75 6e 69 6f 6e 52 65 73 65 74 28       unionReset(
2a40: 26 72 63 2c 20 70 53 74 6d 74 2c 20 70 7a 45 72  &rc, pStmt, pzEr
2a50: 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2a  r);.    }..    *
2a60: 70 52 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 0a 20  pRc = rc;.  }.. 
2a70: 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a   return zRet;.}.
2a80: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61  ./*.** Check tha
2a90: 74 20 61 6c 6c 20 63 6f 6e 66 69 67 75 72 65 64  t all configured
2aa0: 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 65   source tables e
2ab0: 78 69 73 74 20 61 6e 64 20 68 61 76 65 20 74 68  xist and have th
2ac0: 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 0a 2a 2a  e same column.**
2ad0: 20 6e 61 6d 65 73 20 61 6e 64 20 64 61 74 61 74   names and datat
2ae0: 79 70 65 73 2e 20 49 66 20 74 68 69 73 20 69 73  ypes. If this is
2af0: 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 20 6f   not the case, o
2b00: 72 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  r if some other 
2b10: 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2c  error.** occurs,
2b20: 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
2b30: 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 6e  e error code. In
2b40: 20 74 68 69 73 20 63 61 73 65 20 2a 70 7a 45 72   this case *pzEr
2b50: 72 20 6d 61 79 20 62 65 20 73 65 74 0a 2a 2a 20  r may be set.** 
2b60: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65  to point to an e
2b70: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 62 75 66  rror message buf
2b80: 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  fer allocated by
2b90: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2ba0: 28 29 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6e 6f  ()..** Or, if no
2bb0: 20 70 72 6f 62 6c 65 6d 73 20 72 65 67 61 72 64   problems regard
2bc0: 69 6e 67 20 74 68 65 20 73 6f 75 72 63 65 20 74  ing the source t
2bd0: 61 62 6c 65 73 20 61 72 65 20 64 65 74 65 63 74  ables are detect
2be0: 65 64 20 61 6e 64 20 6e 6f 0a 2a 2a 20 6f 74 68  ed and no.** oth
2bf0: 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  er error occurs,
2c00: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
2c10: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
2c20: 63 20 69 6e 74 20 75 6e 69 6f 6e 53 6f 75 72 63  c int unionSourc
2c30: 65 43 68 65 63 6b 28 55 6e 69 6f 6e 54 61 62 20  eCheck(UnionTab 
2c40: 2a 70 54 61 62 2c 20 63 68 61 72 20 2a 2a 70 7a  *pTab, char **pz
2c50: 45 72 72 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  Err){.  const ch
2c60: 61 72 20 2a 7a 53 71 6c 20 3d 20 0a 20 20 20 20  ar *zSql = .    
2c70: 20 20 22 53 45 4c 45 43 54 20 67 72 6f 75 70 5f    "SELECT group_
2c80: 63 6f 6e 63 61 74 28 71 75 6f 74 65 28 6e 61 6d  concat(quote(nam
2c90: 65 29 20 7c 7c 20 27 2e 27 20 7c 7c 20 71 75 6f  e) || '.' || quo
2ca0: 74 65 28 74 79 70 65 29 29 20 22 0a 20 20 20 20  te(type)) ".    
2cb0: 20 20 22 46 52 4f 4d 20 70 72 61 67 6d 61 5f 74    "FROM pragma_t
2cc0: 61 62 6c 65 5f 69 6e 66 6f 28 3f 2c 20 3f 29 22  able_info(?, ?)"
2cd0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2ce0: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70  ITE_OK;..  if( p
2cf0: 54 61 62 2d 3e 6e 53 72 63 3d 3d 30 20 29 7b 0a  Tab->nSrc==0 ){.
2d00: 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c      *pzErr = sql
2d10: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f  ite3_mprintf("no
2d20: 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 63   source tables c
2d30: 6f 6e 66 69 67 75 72 65 64 22 29 3b 0a 20 20 20  onfigured");.   
2d40: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
2d50: 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OR;.  }else{.   
2d60: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2d70: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 63 68  Stmt = 0;.    ch
2d80: 61 72 20 2a 7a 30 20 3d 20 30 3b 0a 20 20 20 20  ar *z0 = 0;.    
2d90: 69 6e 74 20 69 3b 0a 0a 20 20 20 20 70 53 74 6d  int i;..    pStm
2da0: 74 20 3d 20 75 6e 69 6f 6e 50 72 65 70 61 72 65  t = unionPrepare
2db0: 28 26 72 63 2c 20 70 54 61 62 2d 3e 64 62 2c 20  (&rc, pTab->db, 
2dc0: 7a 53 71 6c 2c 20 70 7a 45 72 72 29 3b 0a 20 20  zSql, pzErr);.  
2dd0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2de0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 7a 30 20  _OK ){.      z0 
2df0: 3d 20 75 6e 69 6f 6e 53 6f 75 72 63 65 54 6f 53  = unionSourceToS
2e00: 74 72 28 26 72 63 2c 20 70 54 61 62 2d 3e 64 62  tr(&rc, pTab->db
2e10: 2c 20 26 70 54 61 62 2d 3e 61 53 72 63 5b 30 5d  , &pTab->aSrc[0]
2e20: 2c 20 70 53 74 6d 74 2c 20 70 7a 45 72 72 29 3b  , pStmt, pzErr);
2e30: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
2e40: 3d 31 3b 20 69 3c 70 54 61 62 2d 3e 6e 53 72 63  =1; i<pTab->nSrc
2e50: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68  ; i++){.      ch
2e60: 61 72 20 2a 7a 20 3d 20 75 6e 69 6f 6e 53 6f 75  ar *z = unionSou
2e70: 72 63 65 54 6f 53 74 72 28 26 72 63 2c 20 70 54  rceToStr(&rc, pT
2e80: 61 62 2d 3e 64 62 2c 20 26 70 54 61 62 2d 3e 61  ab->db, &pTab->a
2e90: 53 72 63 5b 69 5d 2c 20 70 53 74 6d 74 2c 20 70  Src[i], pStmt, p
2ea0: 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 69 66 28  zErr);.      if(
2eb0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2ec0: 26 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  & sqlite3_stricm
2ed0: 70 28 7a 2c 20 7a 30 29 20 29 7b 0a 20 20 20 20  p(z, z0) ){.    
2ee0: 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c      *pzErr = sql
2ef0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 73 6f  ite3_mprintf("so
2f00: 75 72 63 65 20 74 61 62 6c 65 20 73 63 68 65 6d  urce table schem
2f10: 61 20 6d 69 73 6d 61 74 63 68 22 29 3b 0a 20 20  a mismatch");.  
2f20: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2f30: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
2f40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
2f50: 72 65 65 28 7a 29 3b 0a 20 20 20 20 7d 0a 0a 20  ree(z);.    }.. 
2f60: 20 20 20 75 6e 69 6f 6e 46 69 6e 61 6c 69 7a 65     unionFinalize
2f70: 28 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a 20 20  (&rc, pStmt);.  
2f80: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2f90: 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
2fa0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 78   rc;.}../* .** x
2fb0: 43 6f 6e 6e 65 63 74 2f 78 43 72 65 61 74 65 20  Connect/xCreate 
2fc0: 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  method..**.** Th
2fd0: 65 20 61 72 67 76 5b 5d 20 61 72 72 61 79 20 63  e argv[] array c
2fe0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 6f 6c 6c  ontains the foll
2ff0: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  owing:.**.**   a
3000: 72 67 76 5b 30 5d 20 20 20 2d 3e 20 6d 6f 64 75  rgv[0]   -> modu
3010: 6c 65 20 6e 61 6d 65 20 20 28 22 75 6e 69 6f 6e  le name  ("union
3020: 76 74 61 62 22 29 0a 2a 2a 20 20 20 61 72 67 76  vtab").**   argv
3030: 5b 31 5d 20 20 20 2d 3e 20 64 61 74 61 62 61 73  [1]   -> databas
3040: 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 61 72 67 76  e name.**   argv
3050: 5b 32 5d 20 20 20 2d 3e 20 74 61 62 6c 65 20 6e  [2]   -> table n
3060: 61 6d 65 0a 2a 2a 20 20 20 61 72 67 76 5b 33 5d  ame.**   argv[3]
3070: 20 20 20 2d 3e 20 53 51 4c 20 73 74 61 74 65 6d     -> SQL statem
3080: 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ent.*/.static in
3090: 74 20 75 6e 69 6f 6e 43 6f 6e 6e 65 63 74 28 0a  t unionConnect(.
30a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
30b0: 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20 69   void *pAux,.  i
30c0: 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63  nt argc, const c
30d0: 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c  har *const*argv,
30e0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
30f0: 2a 2a 70 70 56 74 61 62 2c 0a 20 20 63 68 61 72  **ppVtab,.  char
3100: 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 55 6e   **pzErr.){.  Un
3110: 69 6f 6e 54 61 62 20 2a 70 54 61 62 20 3d 20 30  ionTab *pTab = 0
3120: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
3130: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 73  ITE_OK;..  if( s
3140: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 22  qlite3_stricmp("
3150: 74 65 6d 70 22 2c 20 61 72 67 76 5b 31 5d 29 20  temp", argv[1]) 
3160: 29 7b 0a 20 20 20 20 2f 2a 20 75 6e 69 6f 6e 76  ){.    /* unionv
3170: 74 61 62 20 74 61 62 6c 65 73 20 6d 61 79 20 6f  tab tables may o
3180: 6e 6c 79 20 62 65 20 63 72 65 61 74 65 64 20 69  nly be created i
3190: 6e 20 74 68 65 20 74 65 6d 70 20 73 63 68 65 6d  n the temp schem
31a0: 61 20 2a 2f 0a 20 20 20 20 2a 70 7a 45 72 72 20  a */.    *pzErr 
31b0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
31c0: 66 28 22 75 6e 69 6f 6e 76 74 61 62 20 74 61 62  f("unionvtab tab
31d0: 6c 65 73 20 6d 75 73 74 20 62 65 20 63 72 65 61  les must be crea
31e0: 74 65 64 20 69 6e 20 54 45 4d 50 20 73 63 68 65  ted in TEMP sche
31f0: 6d 61 22 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  ma");.    rc = S
3200: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
3210: 65 6c 73 65 20 69 66 28 20 61 72 67 63 21 3d 34  else if( argc!=4
3220: 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 20 3d   ){.    *pzErr =
3230: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
3240: 28 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f  ("wrong number o
3250: 66 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20  f arguments for 
3260: 75 6e 69 6f 6e 76 74 61 62 22 29 3b 0a 20 20 20  unionvtab");.   
3270: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
3280: 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OR;.  }else{.   
3290: 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b   int nAlloc = 0;
32a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32b0: 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65  * Allocated size
32c0: 20 6f 66 20 70 54 61 62 2d 3e 61 53 72 63 5b 5d   of pTab->aSrc[]
32d0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
32e0: 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
32f0: 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
3300: 74 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  t statement */. 
3310: 20 20 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20     char *zArg = 
3320: 75 6e 69 6f 6e 53 74 72 64 75 70 28 26 72 63 2c  unionStrdup(&rc,
3330: 20 61 72 67 76 5b 33 5d 29 3b 20 20 20 20 20 20   argv[3]);      
3340: 2f 2a 20 43 6f 70 79 20 6f 66 20 61 72 67 75 6d  /* Copy of argum
3350: 65 6e 74 20 74 6f 20 43 56 54 20 2a 2f 0a 0a 20  ent to CVT */.. 
3360: 20 20 20 2f 2a 20 50 72 65 70 61 72 65 20 74 68     /* Prepare th
3370: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  e SQL statement.
3380: 20 49 6e 73 74 65 61 64 20 6f 66 20 65 78 65 63   Instead of exec
3390: 75 74 69 6e 67 20 69 74 20 64 69 72 65 63 74 6c  uting it directl
33a0: 79 2c 20 73 6f 72 74 0a 20 20 20 20 2a 2a 20 74  y, sort.    ** t
33b0: 68 65 20 72 65 73 75 6c 74 73 20 62 79 20 74 68  he results by th
33c0: 65 20 22 6d 69 6e 69 6d 75 6d 20 72 6f 77 69 64  e "minimum rowid
33d0: 22 20 66 69 65 6c 64 2e 20 54 68 69 73 20 6d 61  " field. This ma
33e0: 6b 65 73 20 69 74 20 65 61 73 69 65 72 20 74 6f  kes it easier to
33f0: 0a 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 74 68  .    ** check th
3400: 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  at there are no 
3410: 72 6f 77 69 64 20 72 61 6e 67 65 20 6f 76 65 72  rowid range over
3420: 6c 61 70 73 20 62 65 74 77 65 65 6e 20 73 6f 75  laps between sou
3430: 72 63 65 20 74 61 62 6c 65 73 20 0a 20 20 20 20  rce tables .    
3440: 2a 2a 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  ** and that the 
3450: 55 6e 69 6f 6e 54 61 62 2e 61 53 72 63 5b 5d 20  UnionTab.aSrc[] 
3460: 61 72 72 61 79 20 69 73 20 61 6c 77 61 79 73 20  array is always 
3470: 73 6f 72 74 65 64 20 62 79 20 72 6f 77 69 64 2e  sorted by rowid.
3480: 20 20 2a 2f 0a 20 20 20 20 75 6e 69 6f 6e 44 65    */.    unionDe
3490: 71 75 6f 74 65 28 7a 41 72 67 29 3b 0a 20 20 20  quote(zArg);.   
34a0: 20 70 53 74 6d 74 20 3d 20 75 6e 69 6f 6e 50 72   pStmt = unionPr
34b0: 65 70 61 72 65 50 72 69 6e 74 66 28 26 72 63 2c  eparePrintf(&rc,
34c0: 20 70 7a 45 72 72 2c 20 64 62 2c 20 0a 20 20 20   pzErr, db, .   
34d0: 20 20 20 20 20 22 53 45 4c 45 43 54 20 2a 20 46       "SELECT * F
34e0: 52 4f 4d 20 28 25 7a 29 20 4f 52 44 45 52 20 42  ROM (%z) ORDER B
34f0: 59 20 33 22 2c 20 7a 41 72 67 0a 20 20 20 20 29  Y 3", zArg.    )
3500: 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61  ;..    /* Alloca
3510: 74 65 20 74 68 65 20 55 6e 69 6f 6e 54 61 62 20  te the UnionTab 
3520: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
3530: 20 70 54 61 62 20 3d 20 75 6e 69 6f 6e 4d 61 6c   pTab = unionMal
3540: 6c 6f 63 28 26 72 63 2c 20 73 69 7a 65 6f 66 28  loc(&rc, sizeof(
3550: 55 6e 69 6f 6e 54 61 62 29 29 3b 0a 0a 20 20 20  UnionTab));..   
3560: 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f   /* Iterate thro
3570: 75 67 68 20 74 68 65 20 72 6f 77 73 20 72 65 74  ugh the rows ret
3580: 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  urned by the SQL
3590: 20 73 74 61 74 65 6d 65 6e 74 20 73 70 65 63 69   statement speci
35a0: 66 69 65 64 0a 20 20 20 20 2a 2a 20 61 73 20 61  fied.    ** as a
35b0: 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  n argument to th
35c0: 65 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c  e CREATE VIRTUAL
35d0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
35e0: 2e 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20  . */.    while( 
35f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
3600: 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
3610: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
3620: 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
3630: 63 68 61 72 20 2a 7a 44 62 20 3d 20 28 63 6f 6e  char *zDb = (con
3640: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
3650: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
3660: 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 63 6f  mt, 0);.      co
3670: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d  nst char *zTab =
3680: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
3690: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
36a0: 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20  t(pStmt, 1);.   
36b0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
36c0: 20 69 4d 69 6e 20 3d 20 73 71 6c 69 74 65 33 5f   iMin = sqlite3_
36d0: 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74  column_int64(pSt
36e0: 6d 74 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71  mt, 2);.      sq
36f0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4d 61 78  lite3_int64 iMax
3700: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
3710: 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 33  n_int64(pStmt, 3
3720: 29 3b 0a 20 20 20 20 20 20 55 6e 69 6f 6e 53 72  );.      UnionSr
3730: 63 20 2a 70 53 72 63 3b 0a 0a 20 20 20 20 20 20  c *pSrc;..      
3740: 2f 2a 20 47 72 6f 77 20 74 68 65 20 70 54 61 62  /* Grow the pTab
3750: 2d 3e 61 53 72 63 5b 5d 20 61 72 72 61 79 20 69  ->aSrc[] array i
3760: 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
3770: 20 20 20 20 20 69 66 28 20 6e 41 6c 6c 6f 63 3c       if( nAlloc<
3780: 3d 70 54 61 62 2d 3e 6e 53 72 63 20 29 7b 0a 20  =pTab->nSrc ){. 
3790: 20 20 20 20 20 20 20 69 6e 74 20 6e 4e 65 77 20         int nNew 
37a0: 3d 20 6e 41 6c 6c 6f 63 20 3f 20 6e 41 6c 6c 6f  = nAlloc ? nAllo
37b0: 63 2a 32 20 3a 20 38 3b 0a 20 20 20 20 20 20 20  c*2 : 8;.       
37c0: 20 55 6e 69 6f 6e 53 72 63 20 2a 61 4e 65 77 20   UnionSrc *aNew 
37d0: 3d 20 28 55 6e 69 6f 6e 53 72 63 2a 29 73 71 6c  = (UnionSrc*)sql
37e0: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20  ite3_realloc(.  
37f0: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
3800: 61 53 72 63 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f  aSrc, nNew*sizeo
3810: 66 28 55 6e 69 6f 6e 53 72 63 29 0a 20 20 20 20  f(UnionSrc).    
3820: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
3830: 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( aNew==0 ){.  
3840: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
3850: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
3860: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3870: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3880: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e 65       memset(&aNe
3890: 77 5b 70 54 61 62 2d 3e 6e 53 72 63 5d 2c 20 30  w[pTab->nSrc], 0
38a0: 2c 20 28 6e 4e 65 77 2d 70 54 61 62 2d 3e 6e 53  , (nNew-pTab->nS
38b0: 72 63 29 2a 73 69 7a 65 6f 66 28 55 6e 69 6f 6e  rc)*sizeof(Union
38c0: 53 72 63 29 29 3b 0a 20 20 20 20 20 20 20 20 20  Src));.         
38d0: 20 70 54 61 62 2d 3e 61 53 72 63 20 3d 20 61 4e   pTab->aSrc = aN
38e0: 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 41  ew;.          nA
38f0: 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 20  lloc = nNew;.   
3900: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
3910: 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66        /* Check f
3920: 6f 72 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  or problems with
3930: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 72   the specified r
3940: 61 6e 67 65 20 6f 66 20 72 6f 77 69 64 73 20 2a  ange of rowids *
3950: 2f 0a 20 20 20 20 20 20 69 66 28 20 69 4d 61 78  /.      if( iMax
3960: 3c 69 4d 69 6e 20 7c 7c 20 28 70 54 61 62 2d 3e  <iMin || (pTab->
3970: 6e 53 72 63 3e 30 20 26 26 20 69 4d 69 6e 3c 3d  nSrc>0 && iMin<=
3980: 70 54 61 62 2d 3e 61 53 72 63 5b 70 54 61 62 2d  pTab->aSrc[pTab-
3990: 3e 6e 53 72 63 2d 31 5d 2e 69 4d 61 78 29 20 29  >nSrc-1].iMax) )
39a0: 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72  {.        *pzErr
39b0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
39c0: 74 66 28 22 72 6f 77 69 64 20 72 61 6e 67 65 20  tf("rowid range 
39d0: 6d 69 73 6d 61 74 63 68 20 65 72 72 6f 72 22 29  mismatch error")
39e0: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
39f0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
3a00: 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 53 72 63     }..      pSrc
3a10: 20 3d 20 26 70 54 61 62 2d 3e 61 53 72 63 5b 70   = &pTab->aSrc[p
3a20: 54 61 62 2d 3e 6e 53 72 63 2b 2b 5d 3b 0a 20 20  Tab->nSrc++];.  
3a30: 20 20 20 20 70 53 72 63 2d 3e 7a 44 62 20 3d 20      pSrc->zDb = 
3a40: 75 6e 69 6f 6e 53 74 72 64 75 70 28 26 72 63 2c  unionStrdup(&rc,
3a50: 20 7a 44 62 29 3b 0a 20 20 20 20 20 20 70 53 72   zDb);.      pSr
3a60: 63 2d 3e 7a 54 61 62 20 3d 20 75 6e 69 6f 6e 53  c->zTab = unionS
3a70: 74 72 64 75 70 28 26 72 63 2c 20 7a 54 61 62 29  trdup(&rc, zTab)
3a80: 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 69 4d  ;.      pSrc->iM
3a90: 69 6e 20 3d 20 69 4d 69 6e 3b 0a 20 20 20 20 20  in = iMin;.     
3aa0: 20 70 53 72 63 2d 3e 69 4d 61 78 20 3d 20 69 4d   pSrc->iMax = iM
3ab0: 61 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e  ax;.    }.    un
3ac0: 69 6f 6e 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c  ionFinalize(&rc,
3ad0: 20 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 53 74   pStmt);.    pSt
3ae0: 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  mt = 0;..    /* 
3af0: 56 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20  Verify that all 
3b00: 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 65 78  source tables ex
3b10: 69 73 74 20 61 6e 64 20 68 61 76 65 20 63 6f 6d  ist and have com
3b20: 70 61 74 69 62 6c 65 20 73 63 68 65 6d 61 73 2e  patible schemas.
3b30: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
3b40: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
3b50: 20 20 20 70 54 61 62 2d 3e 64 62 20 3d 20 64 62     pTab->db = db
3b60: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69  ;.      rc = uni
3b70: 6f 6e 53 6f 75 72 63 65 43 68 65 63 6b 28 70 54  onSourceCheck(pT
3b80: 61 62 2c 20 70 7a 45 72 72 29 3b 0a 20 20 20 20  ab, pzErr);.    
3b90: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 6f 73  }..    /* Compos
3ba0: 65 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  e a CREATE TABLE
3bb0: 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 70   statement and p
3bc0: 61 73 73 20 69 74 20 74 6f 20 64 65 63 6c 61 72  ass it to declar
3bd0: 65 5f 76 74 61 62 28 29 20 2a 2f 0a 20 20 20 20  e_vtab() */.    
3be0: 70 53 74 6d 74 20 3d 20 75 6e 69 6f 6e 50 72 65  pStmt = unionPre
3bf0: 70 61 72 65 50 72 69 6e 74 66 28 26 72 63 2c 20  parePrintf(&rc, 
3c00: 70 7a 45 72 72 2c 20 64 62 2c 20 22 53 45 4c 45  pzErr, db, "SELE
3c10: 43 54 20 22 0a 20 20 20 20 20 20 20 20 22 27 43  CT ".        "'C
3c20: 52 45 41 54 45 20 54 41 42 4c 45 20 78 79 7a 28  REATE TABLE xyz(
3c30: 27 22 0a 20 20 20 20 20 20 20 20 22 20 20 20 20  '".        "    
3c40: 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  || group_concat(
3c50: 71 75 6f 74 65 28 6e 61 6d 65 29 20 7c 7c 20 27  quote(name) || '
3c60: 20 27 20 7c 7c 20 74 79 70 65 2c 20 27 2c 20 27   ' || type, ', '
3c70: 29 22 0a 20 20 20 20 20 20 20 20 22 20 20 20 20  )".        "    
3c80: 7c 7c 20 27 29 27 2c 22 0a 20 20 20 20 20 20 20  || ')',".       
3c90: 20 22 6d 61 78 28 28 63 69 64 2b 31 29 20 2a 20   "max((cid+1) * 
3ca0: 28 74 79 70 65 3d 27 49 4e 54 45 47 45 52 27 20  (type='INTEGER' 
3cb0: 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 41  COLLATE nocase A
3cc0: 4e 44 20 70 6b 3d 31 29 29 2d 31 20 22 0a 20 20  ND pk=1))-1 ".  
3cd0: 20 20 20 20 20 20 22 46 52 4f 4d 20 70 72 61 67        "FROM prag
3ce0: 6d 61 5f 74 61 62 6c 65 5f 69 6e 66 6f 28 25 51  ma_table_info(%Q
3cf0: 2c 20 3f 29 22 2c 20 0a 20 20 20 20 20 20 20 20  , ?)", .        
3d00: 70 54 61 62 2d 3e 61 53 72 63 5b 30 5d 2e 7a 54  pTab->aSrc[0].zT
3d10: 61 62 2c 20 70 54 61 62 2d 3e 61 53 72 63 5b 30  ab, pTab->aSrc[0
3d20: 5d 2e 7a 44 62 0a 20 20 20 20 29 3b 0a 20 20 20  ].zDb.    );.   
3d30: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
3d40: 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
3d50: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
3d60: 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 63  Stmt) ){.      c
3d70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 63 6c  onst char *zDecl
3d80: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
3d90: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
3da0: 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  ext(pStmt, 0);. 
3db0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
3dc0: 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 64  3_declare_vtab(d
3dd0: 62 2c 20 7a 44 65 63 6c 29 3b 0a 20 20 20 20 20  b, zDecl);.     
3de0: 20 70 54 61 62 2d 3e 69 50 4b 20 3d 20 73 71 6c   pTab->iPK = sql
3df0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
3e00: 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 7d  pStmt, 1);.    }
3e10: 0a 0a 20 20 20 20 75 6e 69 6f 6e 46 69 6e 61 6c  ..    unionFinal
3e20: 69 7a 65 28 26 72 63 2c 20 70 53 74 6d 74 29 3b  ize(&rc, pStmt);
3e30: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
3e40: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
3e50: 20 75 6e 69 6f 6e 44 69 73 63 6f 6e 6e 65 63 74   unionDisconnect
3e60: 28 28 73 71 6c 69 74 65 33 5f 76 74 61 62 2a 29  ((sqlite3_vtab*)
3e70: 70 54 61 62 29 3b 0a 20 20 20 20 70 54 61 62 20  pTab);.    pTab 
3e80: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 56  = 0;.  }..  *ppV
3e90: 74 61 62 20 3d 20 28 73 71 6c 69 74 65 33 5f 76  tab = (sqlite3_v
3ea0: 74 61 62 2a 29 70 54 61 62 3b 0a 20 20 72 65 74  tab*)pTab;.  ret
3eb0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
3ec0: 2a 20 78 4f 70 65 6e 0a 2a 2f 0a 73 74 61 74 69  * xOpen.*/.stati
3ed0: 63 20 69 6e 74 20 75 6e 69 6f 6e 4f 70 65 6e 28  c int unionOpen(
3ee0: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 2c  sqlite3_vtab *p,
3ef0: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
3f00: 72 73 6f 72 20 2a 2a 70 70 43 75 72 73 6f 72 29  rsor **ppCursor)
3f10: 7b 0a 20 20 55 6e 69 6f 6e 43 73 72 20 2a 70 43  {.  UnionCsr *pC
3f20: 73 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  sr;.  int rc = S
3f30: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 43 73 72  QLITE_OK;.  pCsr
3f40: 20 3d 20 28 55 6e 69 6f 6e 43 73 72 2a 29 75 6e   = (UnionCsr*)un
3f50: 69 6f 6e 4d 61 6c 6c 6f 63 28 26 72 63 2c 20 73  ionMalloc(&rc, s
3f60: 69 7a 65 6f 66 28 55 6e 69 6f 6e 43 73 72 29 29  izeof(UnionCsr))
3f70: 3b 0a 20 20 2a 70 70 43 75 72 73 6f 72 20 3d 20  ;.  *ppCursor = 
3f80: 26 70 43 73 72 2d 3e 62 61 73 65 3b 0a 20 20 72  &pCsr->base;.  r
3f90: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
3fa0: 2a 2a 20 78 43 6c 6f 73 65 0a 2a 2f 0a 73 74 61  ** xClose.*/.sta
3fb0: 74 69 63 20 69 6e 74 20 75 6e 69 6f 6e 43 6c 6f  tic int unionClo
3fc0: 73 65 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  se(sqlite3_vtab_
3fd0: 63 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20  cursor *cur){.  
3fe0: 55 6e 69 6f 6e 43 73 72 20 2a 70 43 73 72 20 3d  UnionCsr *pCsr =
3ff0: 20 28 55 6e 69 6f 6e 43 73 72 2a 29 63 75 72 3b   (UnionCsr*)cur;
4000: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
4010: 69 7a 65 28 70 43 73 72 2d 3e 70 53 74 6d 74 29  ize(pCsr->pStmt)
4020: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
4030: 28 70 43 73 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCsr);.  return
4040: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
4050: 2f 2a 0a 2a 2a 20 78 4e 65 78 74 0a 2a 2f 0a 73  /*.** xNext.*/.s
4060: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 6f 6e 4e  tatic int unionN
4070: 65 78 74 28 73 71 6c 69 74 65 33 5f 76 74 61 62  ext(sqlite3_vtab
4080: 5f 63 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20  _cursor *cur){. 
4090: 20 55 6e 69 6f 6e 43 73 72 20 2a 70 43 73 72 20   UnionCsr *pCsr 
40a0: 3d 20 28 55 6e 69 6f 6e 43 73 72 2a 29 63 75 72  = (UnionCsr*)cur
40b0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  ;.  int rc;.  as
40c0: 73 65 72 74 28 20 70 43 73 72 2d 3e 70 53 74 6d  sert( pCsr->pStm
40d0: 74 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  t );.  if( sqlit
40e0: 65 33 5f 73 74 65 70 28 70 43 73 72 2d 3e 70 53  e3_step(pCsr->pS
40f0: 74 6d 74 29 21 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)!=SQLITE_ROW
4100: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
4110: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 43  ite3_finalize(pC
4120: 73 72 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20  sr->pStmt);.    
4130: 70 43 73 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  pCsr->pStmt = 0;
4140: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
4150: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
4160: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4170: 0a 0a 2f 2a 0a 2a 2a 20 78 43 6f 6c 75 6d 6e 0a  ../*.** xColumn.
4180: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
4190: 69 6f 6e 43 6f 6c 75 6d 6e 28 0a 20 20 73 71 6c  ionColumn(.  sql
41a0: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
41b0: 20 2a 63 75 72 2c 0a 20 20 73 71 6c 69 74 65 33   *cur,.  sqlite3
41c0: 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20  _context *ctx,. 
41d0: 20 69 6e 74 20 69 0a 29 7b 0a 20 20 55 6e 69 6f   int i.){.  Unio
41e0: 6e 43 73 72 20 2a 70 43 73 72 20 3d 20 28 55 6e  nCsr *pCsr = (Un
41f0: 69 6f 6e 43 73 72 2a 29 63 75 72 3b 0a 20 20 73  ionCsr*)cur;.  s
4200: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61  qlite3_result_va
4210: 6c 75 65 28 63 74 78 2c 20 73 71 6c 69 74 65 33  lue(ctx, sqlite3
4220: 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 43  _column_value(pC
4230: 73 72 2d 3e 70 53 74 6d 74 2c 20 69 2b 31 29 29  sr->pStmt, i+1))
4240: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
4250: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78  E_OK;.}../*.** x
4260: 52 6f 77 69 64 0a 2a 2f 0a 73 74 61 74 69 63 20  Rowid.*/.static 
4270: 69 6e 74 20 75 6e 69 6f 6e 52 6f 77 69 64 28 73  int unionRowid(s
4280: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
4290: 6f 72 20 2a 63 75 72 2c 20 73 71 6c 69 74 65 5f  or *cur, sqlite_
42a0: 69 6e 74 36 34 20 2a 70 52 6f 77 69 64 29 7b 0a  int64 *pRowid){.
42b0: 20 20 55 6e 69 6f 6e 43 73 72 20 2a 70 43 73 72    UnionCsr *pCsr
42c0: 20 3d 20 28 55 6e 69 6f 6e 43 73 72 2a 29 63 75   = (UnionCsr*)cu
42d0: 72 3b 0a 20 20 2a 70 52 6f 77 69 64 20 3d 20 73  r;.  *pRowid = s
42e0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
42f0: 74 36 34 28 70 43 73 72 2d 3e 70 53 74 6d 74 2c  t64(pCsr->pStmt,
4300: 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51   0);.  return SQ
4310: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
4320: 2a 20 78 45 6f 66 0a 2a 2f 0a 73 74 61 74 69 63  * xEof.*/.static
4330: 20 69 6e 74 20 75 6e 69 6f 6e 45 6f 66 28 73 71   int unionEof(sq
4340: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
4350: 72 20 2a 63 75 72 29 7b 0a 20 20 55 6e 69 6f 6e  r *cur){.  Union
4360: 43 73 72 20 2a 70 43 73 72 20 3d 20 28 55 6e 69  Csr *pCsr = (Uni
4370: 6f 6e 43 73 72 2a 29 63 75 72 3b 0a 20 20 72 65  onCsr*)cur;.  re
4380: 74 75 72 6e 20 70 43 73 72 2d 3e 70 53 74 6d 74  turn pCsr->pStmt
4390: 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 46  ==0;.}../*.** xF
43a0: 69 6c 74 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20  ilter.*/.static 
43b0: 69 6e 74 20 75 6e 69 6f 6e 46 69 6c 74 65 72 28  int unionFilter(
43c0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  .  sqlite3_vtab_
43d0: 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72  cursor *pVtabCur
43e0: 73 6f 72 2c 20 0a 20 20 69 6e 74 20 69 64 78 4e  sor, .  int idxN
43f0: 75 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  um, const char *
4400: 69 64 78 53 74 72 2c 0a 20 20 69 6e 74 20 61 72  idxStr,.  int ar
4410: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
4420: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 55 6e  e **argv.){.  Un
4430: 69 6f 6e 54 61 62 20 2a 70 54 61 62 20 3d 20 28  ionTab *pTab = (
4440: 55 6e 69 6f 6e 54 61 62 2a 29 28 70 56 74 61 62  UnionTab*)(pVtab
4450: 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 29 3b 0a  Cursor->pVtab);.
4460: 20 20 55 6e 69 6f 6e 43 73 72 20 2a 70 43 73 72    UnionCsr *pCsr
4470: 20 3d 20 28 55 6e 69 6f 6e 43 73 72 2a 29 70 56   = (UnionCsr*)pV
4480: 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74  tabCursor;.  int
4490: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
44a0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
44b0: 20 2a 7a 53 71 6c 20 3d 20 30 3b 0a 20 20 69 6e   *zSql = 0;.  in
44c0: 74 20 62 5a 65 72 6f 20 3d 20 30 3b 0a 0a 20 20  t bZero = 0;..  
44d0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4d  sqlite3_int64 iM
44e0: 69 6e 20 3d 20 53 4d 41 4c 4c 45 53 54 5f 49 4e  in = SMALLEST_IN
44f0: 54 36 34 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  T64;.  sqlite3_i
4500: 6e 74 36 34 20 69 4d 61 78 20 3d 20 4c 41 52 47  nt64 iMax = LARG
4510: 45 53 54 5f 49 4e 54 36 34 3b 0a 0a 20 20 61 73  EST_INT64;..  as
4520: 73 65 72 74 28 20 69 64 78 4e 75 6d 3d 3d 30 20  sert( idxNum==0 
4530: 0a 20 20 20 20 20 20 20 7c 7c 20 69 64 78 4e 75  .       || idxNu
4540: 6d 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  m==SQLITE_INDEX_
4550: 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 0a 20 20  CONSTRAINT_EQ.  
4560: 20 20 20 20 20 7c 7c 20 69 64 78 4e 75 6d 3d 3d       || idxNum==
4570: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
4580: 53 54 52 41 49 4e 54 5f 4c 45 0a 20 20 20 20 20  STRAINT_LE.     
4590: 20 20 7c 7c 20 69 64 78 4e 75 6d 3d 3d 53 51 4c    || idxNum==SQL
45a0: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
45b0: 41 49 4e 54 5f 47 45 0a 20 20 20 20 20 20 20 7c  AINT_GE.       |
45c0: 7c 20 69 64 78 4e 75 6d 3d 3d 53 51 4c 49 54 45  | idxNum==SQLITE
45d0: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
45e0: 54 5f 4c 54 0a 20 20 20 20 20 20 20 7c 7c 20 69  T_LT.       || i
45f0: 64 78 4e 75 6d 3d 3d 53 51 4c 49 54 45 5f 49 4e  dxNum==SQLITE_IN
4600: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47  DEX_CONSTRAINT_G
4610: 54 0a 20 20 20 20 20 20 20 7c 7c 20 69 64 78 4e  T.       || idxN
4620: 75 6d 3d 3d 28 53 51 4c 49 54 45 5f 49 4e 44 45  um==(SQLITE_INDE
4630: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 7c  X_CONSTRAINT_GE|
4640: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
4650: 53 54 52 41 49 4e 54 5f 4c 45 29 0a 20 20 29 3b  STRAINT_LE).  );
4660: 0a 0a 20 20 69 66 28 20 69 64 78 4e 75 6d 3d 3d  ..  if( idxNum==
4670: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
4680: 53 54 52 41 49 4e 54 5f 45 51 20 29 7b 0a 20 20  STRAINT_EQ ){.  
4690: 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d    assert( argc==
46a0: 31 20 29 3b 0a 20 20 20 20 69 4d 69 6e 20 3d 20  1 );.    iMin = 
46b0: 69 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 5f 76  iMax = sqlite3_v
46c0: 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b  alue_int64(argv[
46d0: 30 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20  0]);.  }else{.. 
46e0: 20 20 20 69 66 28 20 69 64 78 4e 75 6d 20 26 20     if( idxNum & 
46f0: 28 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  (SQLITE_INDEX_CO
4700: 4e 53 54 52 41 49 4e 54 5f 4c 45 7c 53 51 4c 49  NSTRAINT_LE|SQLI
4710: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
4720: 49 4e 54 5f 4c 54 29 20 29 7b 0a 20 20 20 20 20  INT_LT) ){.     
4730: 20 61 73 73 65 72 74 28 20 61 72 67 63 3e 3d 31   assert( argc>=1
4740: 20 29 3b 0a 20 20 20 20 20 20 69 4d 61 78 20 3d   );.      iMax =
4750: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
4760: 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20  nt64(argv[0]);. 
4770: 20 20 20 20 20 69 66 28 20 69 64 78 4e 75 6d 20       if( idxNum 
4780: 26 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  & SQLITE_INDEX_C
4790: 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29 7b 0a  ONSTRAINT_LT ){.
47a0: 20 20 20 20 20 20 20 20 69 66 28 20 69 4d 61 78          if( iMax
47b0: 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  ==SMALLEST_INT64
47c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 5a   ){.          bZ
47d0: 65 72 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ero = 1;.       
47e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
47f0: 20 20 69 4d 61 78 2d 2d 3b 0a 20 20 20 20 20 20    iMax--;.      
4800: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
4810: 7d 0a 0a 20 20 20 20 69 66 28 20 69 64 78 4e 75  }..    if( idxNu
4820: 6d 20 26 20 28 53 51 4c 49 54 45 5f 49 4e 44 45  m & (SQLITE_INDE
4830: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 7c  X_CONSTRAINT_GE|
4840: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
4850: 53 54 52 41 49 4e 54 5f 47 54 29 20 29 7b 0a 20  STRAINT_GT) ){. 
4860: 20 20 20 20 20 61 73 73 65 72 74 28 20 61 72 67       assert( arg
4870: 63 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 4d  c>=1 );.      iM
4880: 69 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  in = sqlite3_val
4890: 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 61 72  ue_int64(argv[ar
48a0: 67 63 2d 31 5d 29 3b 0a 20 20 20 20 20 20 69 66  gc-1]);.      if
48b0: 28 20 69 64 78 4e 75 6d 20 26 20 53 51 4c 49 54  ( idxNum & SQLIT
48c0: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
48d0: 4e 54 5f 47 54 20 29 7b 0a 20 20 20 20 20 20 20  NT_GT ){.       
48e0: 20 69 66 28 20 69 4d 69 6e 3d 3d 4c 41 52 47 45   if( iMin==LARGE
48f0: 53 54 5f 49 4e 54 36 34 20 29 7b 0a 20 20 20 20  ST_INT64 ){.    
4900: 20 20 20 20 20 20 62 5a 65 72 6f 20 3d 20 31 3b        bZero = 1;
4910: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
4920: 20 20 20 20 20 20 20 20 20 20 69 4d 69 6e 2b 2b            iMin++
4930: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4940: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
4950: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
4960: 65 28 70 43 73 72 2d 3e 70 53 74 6d 74 29 3b 0a  e(pCsr->pStmt);.
4970: 20 20 70 43 73 72 2d 3e 70 53 74 6d 74 20 3d 20    pCsr->pStmt = 
4980: 30 3b 0a 20 20 69 66 28 20 62 5a 65 72 6f 20 29  0;.  if( bZero )
4990: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
49a0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 66  ITE_OK;.  }..  f
49b0: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e  or(i=0; i<pTab->
49c0: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
49d0: 55 6e 69 6f 6e 53 72 63 20 2a 70 53 72 63 20 3d  UnionSrc *pSrc =
49e0: 20 26 70 54 61 62 2d 3e 61 53 72 63 5b 69 5d 3b   &pTab->aSrc[i];
49f0: 0a 20 20 20 20 69 66 28 20 69 4d 69 6e 3e 70 53  .    if( iMin>pS
4a00: 72 63 2d 3e 69 4d 61 78 20 7c 7c 20 69 4d 61 78  rc->iMax || iMax
4a10: 3c 70 53 72 63 2d 3e 69 4d 69 6e 20 29 7b 0a 20  <pSrc->iMin ){. 
4a20: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
4a30: 20 20 20 7d 0a 0a 20 20 20 20 7a 53 71 6c 20 3d     }..    zSql =
4a40: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
4a50: 28 22 25 7a 25 73 53 45 4c 45 43 54 20 72 6f 77  ("%z%sSELECT row
4a60: 69 64 2c 20 2a 20 46 52 4f 4d 20 25 73 25 71 25  id, * FROM %s%q%
4a70: 73 25 51 22 0a 20 20 20 20 20 20 20 20 2c 20 7a  s%Q".        , z
4a80: 53 71 6c 0a 20 20 20 20 20 20 20 20 2c 20 28 7a  Sql.        , (z
4a90: 53 71 6c 20 3f 20 22 20 55 4e 49 4f 4e 20 41 4c  Sql ? " UNION AL
4aa0: 4c 20 22 20 3a 20 22 22 29 0a 20 20 20 20 20 20  L " : "").      
4ab0: 20 20 2c 20 28 70 53 72 63 2d 3e 7a 44 62 20 3f    , (pSrc->zDb ?
4ac0: 20 22 27 22 20 3a 20 22 22 29 0a 20 20 20 20 20   "'" : "").     
4ad0: 20 20 20 2c 20 28 70 53 72 63 2d 3e 7a 44 62 20     , (pSrc->zDb 
4ae0: 3f 20 70 53 72 63 2d 3e 7a 44 62 20 3a 20 22 22  ? pSrc->zDb : ""
4af0: 29 0a 20 20 20 20 20 20 20 20 2c 20 28 70 53 72  ).        , (pSr
4b00: 63 2d 3e 7a 44 62 20 3f 20 22 27 2e 22 20 3a 20  c->zDb ? "'." : 
4b10: 22 22 29 0a 20 20 20 20 20 20 20 20 2c 20 70 53  "").        , pS
4b20: 72 63 2d 3e 7a 54 61 62 0a 20 20 20 20 29 3b 0a  rc->zTab.    );.
4b30: 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20      if( zSql==0 
4b40: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
4b50: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
4b60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
4b70: 20 20 20 20 69 66 28 20 7a 53 71 6c 20 29 7b 0a      if( zSql ){.
4b80: 20 20 20 20 20 20 69 66 28 20 69 4d 69 6e 3d 3d        if( iMin==
4b90: 69 4d 61 78 20 29 7b 0a 20 20 20 20 20 20 20 20  iMax ){.        
4ba0: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
4bb0: 70 72 69 6e 74 66 28 22 25 7a 20 57 48 45 52 45  printf("%z WHERE
4bc0: 20 72 6f 77 69 64 3d 25 6c 6c 64 22 2c 20 7a 53   rowid=%lld", zS
4bd0: 71 6c 2c 20 69 4d 69 6e 29 3b 0a 20 20 20 20 20  ql, iMin);.     
4be0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4bf0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 68 65  const char *zWhe
4c00: 72 65 20 3d 20 22 57 48 45 52 45 22 3b 0a 20 20  re = "WHERE";.  
4c10: 20 20 20 20 20 20 69 66 28 20 69 4d 69 6e 21 3d        if( iMin!=
4c20: 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 26  SMALLEST_INT64 &
4c30: 26 20 69 4d 69 6e 3e 70 53 72 63 2d 3e 69 4d 69  & iMin>pSrc->iMi
4c40: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  n ){.          z
4c50: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
4c60: 72 69 6e 74 66 28 22 25 7a 20 57 48 45 52 45 20  rintf("%z WHERE 
4c70: 72 6f 77 69 64 3e 3d 25 6c 6c 64 22 2c 20 7a 53  rowid>=%lld", zS
4c80: 71 6c 2c 20 69 4d 69 6e 29 3b 0a 20 20 20 20 20  ql, iMin);.     
4c90: 20 20 20 20 20 7a 57 68 65 72 65 20 3d 20 22 41       zWhere = "A
4ca0: 4e 44 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ND";.        }. 
4cb0: 20 20 20 20 20 20 20 69 66 28 20 69 4d 61 78 21         if( iMax!
4cc0: 3d 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20 26  =LARGEST_INT64 &
4cd0: 26 20 69 4d 61 78 3c 70 53 72 63 2d 3e 69 4d 61  & iMax<pSrc->iMa
4ce0: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  x ){.          z
4cf0: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
4d00: 72 69 6e 74 66 28 22 25 7a 20 25 73 20 72 6f 77  rintf("%z %s row
4d10: 69 64 3c 3d 25 6c 6c 64 22 2c 20 7a 53 71 6c 2c  id<=%lld", zSql,
4d20: 20 7a 57 68 65 72 65 2c 20 69 4d 61 78 29 3b 0a   zWhere, iMax);.
4d30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4d40: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  }.    }.  }...  
4d50: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4d60: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 71  K ){.    if( zSq
4d70: 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
4d80: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 70 43 73  LITE_OK;.    pCs
4d90: 72 2d 3e 70 53 74 6d 74 20 3d 20 75 6e 69 6f 6e  r->pStmt = union
4da0: 50 72 65 70 61 72 65 28 26 72 63 2c 20 70 54 61  Prepare(&rc, pTa
4db0: 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 26 70 54  b->db, zSql, &pT
4dc0: 61 62 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67  ab->base.zErrMsg
4dd0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
4de0: 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 0a 20 20  _free(zSql);..  
4df0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
4e00: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
4e10: 20 72 65 74 75 72 6e 20 75 6e 69 6f 6e 4e 65 78   return unionNex
4e20: 74 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a  t(pVtabCursor);.
4e30: 7d 0a 0a 2f 2a 0a 2a 2a 20 78 42 65 73 74 49 6e  }../*.** xBestIn
4e40: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  dex..**.** This 
4e50: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 73  implementation s
4e60: 65 61 72 63 68 65 73 20 66 6f 72 20 63 6f 6e 73  earches for cons
4e70: 74 72 61 69 6e 74 73 20 6f 6e 20 74 68 65 20 72  traints on the r
4e80: 6f 77 69 64 20 66 69 65 6c 64 2e 20 45 51 2c 20  owid field. EQ, 
4e90: 0a 2a 2a 20 4c 45 2c 20 4c 54 2c 20 47 45 20 61  .** LE, LT, GE a
4ea0: 6e 64 20 47 54 20 61 72 65 20 68 61 6e 64 6c 65  nd GT are handle
4eb0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  d..**.** If ther
4ec0: 65 20 69 73 20 61 6e 20 45 51 20 63 6f 6d 70 61  e is an EQ compa
4ed0: 72 69 73 6f 6e 2c 20 74 68 65 6e 20 69 64 78 4e  rison, then idxN
4ee0: 75 6d 20 69 73 20 73 65 74 20 74 6f 20 49 4e 44  um is set to IND
4ef0: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51  EX_CONSTRAINT_EQ
4f00: 2e 0a 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73  ..** In this cas
4f10: 65 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  e the only argum
4f20: 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 78 46  ent passed to xF
4f30: 69 6c 74 65 72 20 69 73 20 74 68 65 20 72 68 73  ilter is the rhs
4f40: 20 6f 66 20 74 68 65 20 3d 3d 0a 2a 2a 20 6f 70   of the ==.** op
4f50: 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4f 74  erator..**.** Ot
4f60: 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20 4c  herwise, if an L
4f70: 45 20 6f 72 20 4c 54 20 63 6f 6e 73 74 72 61 69  E or LT constrai
4f80: 6e 74 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65  nt is found, the
4f90: 6e 20 74 68 65 20 49 4e 44 45 58 5f 43 4f 4e 53  n the INDEX_CONS
4fa0: 54 52 41 49 4e 54 5f 4c 45 0a 2a 2a 20 6f 72 20  TRAINT_LE.** or 
4fb0: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
4fc0: 5f 4c 54 20 28 62 75 74 20 6e 6f 74 20 62 6f 74  _LT (but not bot
4fd0: 68 29 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  h) bit is set in
4fe0: 20 69 64 78 4e 75 6d 2e 20 54 68 65 20 66 69 72   idxNum. The fir
4ff0: 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74  st.** argument t
5000: 6f 20 78 46 69 6c 74 65 72 20 69 73 20 74 68 65  o xFilter is the
5010: 20 72 68 73 20 6f 66 20 74 68 65 20 3c 3d 20 6f   rhs of the <= o
5020: 72 20 3c 20 6f 70 65 72 61 74 6f 72 2e 20 20 53  r < operator.  S
5030: 69 6d 69 6c 61 72 6c 79 2c 20 69 66 20 0a 2a 2a  imilarly, if .**
5040: 20 61 6e 20 47 45 20 6f 72 20 47 54 20 63 6f 6e   an GE or GT con
5050: 73 74 72 61 69 6e 74 20 69 73 20 66 6f 75 6e 64  straint is found
5060: 2c 20 74 68 65 6e 20 74 68 65 20 49 4e 44 45 58  , then the INDEX
5070: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20 6f  _CONSTRAINT_GE o
5080: 72 0a 2a 2a 20 49 4e 44 45 58 5f 43 4f 4e 53 54  r.** INDEX_CONST
5090: 52 41 49 4e 54 5f 47 54 20 62 69 74 20 69 73 20  RAINT_GT bit is 
50a0: 73 65 74 20 69 6e 20 69 64 78 4e 75 6d 2e 20 54  set in idxNum. T
50b0: 68 65 20 72 68 73 20 6f 66 20 74 68 65 20 3e 3d  he rhs of the >=
50c0: 20 6f 72 20 3e 20 6f 70 65 72 61 74 6f 72 0a 2a   or > operator.*
50d0: 2a 20 69 73 20 70 61 73 73 65 64 20 61 73 20 65  * is passed as e
50e0: 69 74 68 65 72 20 74 68 65 20 66 69 72 73 74 20  ither the first 
50f0: 6f 72 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  or second argume
5100: 6e 74 20 74 6f 20 78 46 69 6c 74 65 72 2c 20 64  nt to xFilter, d
5110: 65 70 65 6e 64 69 6e 67 0a 2a 2a 20 6f 6e 20 77  epending.** on w
5120: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
5130: 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20 4c 54  ere is also a LT
5140: 7c 4c 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a  |LE constraint..
5150: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
5160: 69 6f 6e 42 65 73 74 49 6e 64 65 78 28 0a 20 20  ionBestIndex(.  
5170: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 74 61  sqlite3_vtab *ta
5180: 62 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  b,.  sqlite3_ind
5190: 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
51a0: 6f 0a 29 7b 0a 20 20 55 6e 69 6f 6e 54 61 62 20  o.){.  UnionTab 
51b0: 2a 70 54 61 62 20 3d 20 28 55 6e 69 6f 6e 54 61  *pTab = (UnionTa
51c0: 62 2a 29 74 61 62 3b 0a 20 20 69 6e 74 20 69 45  b*)tab;.  int iE
51d0: 71 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69 4c  q = -1;.  int iL
51e0: 74 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69 47  t = -1;.  int iG
51f0: 74 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69 3b  t = -1;.  int i;
5200: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
5210: 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
5220: 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aint; i++){.    
5230: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
5240: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20  ndex_constraint 
5250: 2a 70 20 3d 20 26 70 49 64 78 49 6e 66 6f 2d 3e  *p = &pIdxInfo->
5260: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 3b 0a  aConstraint[i];.
5270: 20 20 20 20 69 66 28 20 70 2d 3e 75 73 61 62 6c      if( p->usabl
5280: 65 20 26 26 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e  e && (p->iColumn
5290: 3c 30 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e  <0 || p->iColumn
52a0: 3d 3d 70 54 61 62 2d 3e 69 50 4b 29 20 29 7b 0a  ==pTab->iPK) ){.
52b0: 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70 2d        switch( p-
52c0: 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >op ){.        c
52d0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  ase SQLITE_INDEX
52e0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 3a 0a  _CONSTRAINT_EQ:.
52f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 45            if( iE
5300: 71 3c 30 20 29 20 69 45 71 20 3d 20 69 3b 0a 20  q<0 ) iEq = i;. 
5310: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
5320: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
5330: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
5340: 41 49 4e 54 5f 4c 45 3a 0a 20 20 20 20 20 20 20  AINT_LE:.       
5350: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 44   case SQLITE_IND
5360: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54  EX_CONSTRAINT_LT
5370: 3a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  :.          if( 
5380: 69 4c 74 3c 30 20 29 20 69 4c 74 20 3d 20 69 3b  iLt<0 ) iLt = i;
5390: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
53a0: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  ;.        case S
53b0: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
53c0: 54 52 41 49 4e 54 5f 47 45 3a 0a 20 20 20 20 20  TRAINT_GE:.     
53d0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
53e0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
53f0: 47 54 3a 0a 20 20 20 20 20 20 20 20 20 20 69 66  GT:.          if
5400: 28 20 69 47 74 3c 30 20 29 20 69 47 74 20 3d 20  ( iGt<0 ) iGt = 
5410: 69 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  i;.          bre
5420: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
5430: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 45 71  }.  }..  if( iEq
5440: 3e 3d 30 20 29 7b 0a 20 20 20 20 70 49 64 78 49  >=0 ){.    pIdxI
5450: 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f  nfo->estimatedRo
5460: 77 73 20 3d 20 31 3b 0a 20 20 20 20 70 49 64 78  ws = 1;.    pIdx
5470: 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20 3d  Info->idxFlags =
5480: 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 43   SQLITE_INDEX_SC
5490: 41 4e 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 70  AN_UNIQUE;.    p
54a0: 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
54b0: 65 64 43 6f 73 74 20 3d 20 33 2e 30 3b 0a 20 20  edCost = 3.0;.  
54c0: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e    pIdxInfo->idxN
54d0: 75 6d 20 3d 20 53 51 4c 49 54 45 5f 49 4e 44 45  um = SQLITE_INDE
54e0: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 3b  X_CONSTRAINT_EQ;
54f0: 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61  .    pIdxInfo->a
5500: 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
5510: 69 45 71 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d  iEq].argvIndex =
5520: 20 31 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   1;.    pIdxInfo
5530: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
5540: 67 65 5b 69 45 71 5d 2e 6f 6d 69 74 20 3d 20 31  ge[iEq].omit = 1
5550: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
5560: 6e 74 20 69 43 6f 6e 73 20 3d 20 31 3b 0a 20 20  nt iCons = 1;.  
5570: 20 20 69 6e 74 20 69 64 78 4e 75 6d 20 3d 20 30    int idxNum = 0
5580: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  ;.    sqlite3_in
5590: 74 36 34 20 6e 52 6f 77 20 3d 20 31 30 30 30 30  t64 nRow = 10000
55a0: 30 30 3b 0a 20 20 20 20 69 66 28 20 69 4c 74 3e  00;.    if( iLt>
55b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77  =0 ){.      nRow
55c0: 20 3d 20 6e 52 6f 77 20 2f 20 32 3b 0a 20 20 20   = nRow / 2;.   
55d0: 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f     pIdxInfo->aCo
55e0: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 4c  nstraintUsage[iL
55f0: 74 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 69  t].argvIndex = i
5600: 43 6f 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 70 49  Cons++;.      pI
5610: 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
5620: 69 6e 74 55 73 61 67 65 5b 69 4c 74 5d 2e 6f 6d  intUsage[iLt].om
5630: 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 64  it = 1;.      id
5640: 78 4e 75 6d 20 7c 3d 20 70 49 64 78 49 6e 66 6f  xNum |= pIdxInfo
5650: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 4c  ->aConstraint[iL
5660: 74 5d 2e 6f 70 3b 0a 20 20 20 20 7d 0a 20 20 20  t].op;.    }.   
5670: 20 69 66 28 20 69 47 74 3e 3d 30 20 29 7b 0a 20   if( iGt>=0 ){. 
5680: 20 20 20 20 20 6e 52 6f 77 20 3d 20 6e 52 6f 77       nRow = nRow
5690: 20 2f 20 32 3b 0a 20 20 20 20 20 20 70 49 64 78   / 2;.      pIdx
56a0: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
56b0: 74 55 73 61 67 65 5b 69 47 74 5d 2e 61 72 67 76  tUsage[iGt].argv
56c0: 49 6e 64 65 78 20 3d 20 69 43 6f 6e 73 2b 2b 3b  Index = iCons++;
56d0: 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  .      pIdxInfo-
56e0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
56f0: 65 5b 69 47 74 5d 2e 6f 6d 69 74 20 3d 20 31 3b  e[iGt].omit = 1;
5700: 0a 20 20 20 20 20 20 69 64 78 4e 75 6d 20 7c 3d  .      idxNum |=
5710: 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
5720: 74 72 61 69 6e 74 5b 69 47 74 5d 2e 6f 70 3b 0a  traint[iGt].op;.
5730: 20 20 20 20 7d 0a 20 20 20 20 70 49 64 78 49 6e      }.    pIdxIn
5740: 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77  fo->estimatedRow
5750: 73 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 70 49  s = nRow;.    pI
5760: 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
5770: 64 43 6f 73 74 20 3d 20 33 2e 30 20 2a 20 28 64  dCost = 3.0 * (d
5780: 6f 75 62 6c 65 29 6e 52 6f 77 3b 0a 20 20 20 20  ouble)nRow;.    
5790: 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d  pIdxInfo->idxNum
57a0: 20 3d 20 69 64 78 4e 75 6d 3b 0a 20 20 7d 0a 0a   = idxNum;.  }..
57b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
57c0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  OK;.}../*.** Reg
57d0: 69 73 74 65 72 20 74 68 65 20 75 6e 69 6f 6e 76  ister the unionv
57e0: 74 61 62 20 76 69 72 74 75 61 6c 20 74 61 62 6c  tab virtual tabl
57f0: 65 20 6d 6f 64 75 6c 65 20 77 69 74 68 20 64 61  e module with da
5800: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62  tabase handle db
5810: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5820: 63 72 65 61 74 65 55 6e 69 6f 6e 56 74 61 62 28  createUnionVtab(
5830: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
5840: 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 6d  static sqlite3_m
5850: 6f 64 75 6c 65 20 75 6e 69 6f 6e 4d 6f 64 75 6c  odule unionModul
5860: 65 20 3d 20 7b 0a 20 20 20 20 30 2c 20 20 20 20  e = {.    0,    
5870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5880: 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
5890: 69 6f 6e 20 2a 2f 0a 20 20 20 20 75 6e 69 6f 6e  ion */.    union
58a0: 43 6f 6e 6e 65 63 74 2c 0a 20 20 20 20 75 6e 69  Connect,.    uni
58b0: 6f 6e 43 6f 6e 6e 65 63 74 2c 0a 20 20 20 20 75  onConnect,.    u
58c0: 6e 69 6f 6e 42 65 73 74 49 6e 64 65 78 2c 20 20  nionBestIndex,  
58d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
58e0: 78 42 65 73 74 49 6e 64 65 78 20 2d 20 71 75 65  xBestIndex - que
58f0: 72 79 20 70 6c 61 6e 6e 65 72 20 2a 2f 0a 20 20  ry planner */.  
5900: 20 20 75 6e 69 6f 6e 44 69 73 63 6f 6e 6e 65 63    unionDisconnec
5910: 74 2c 20 0a 20 20 20 20 75 6e 69 6f 6e 44 69 73  t, .    unionDis
5920: 63 6f 6e 6e 65 63 74 2c 0a 20 20 20 20 75 6e 69  connect,.    uni
5930: 6f 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  onOpen,         
5940: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f             /* xO
5950: 70 65 6e 20 2d 20 6f 70 65 6e 20 61 20 63 75 72  pen - open a cur
5960: 73 6f 72 20 2a 2f 0a 20 20 20 20 75 6e 69 6f 6e  sor */.    union
5970: 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
5980: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
5990: 73 65 20 2d 20 63 6c 6f 73 65 20 61 20 63 75 72  se - close a cur
59a0: 73 6f 72 20 2a 2f 0a 20 20 20 20 75 6e 69 6f 6e  sor */.    union
59b0: 46 69 6c 74 65 72 2c 20 20 20 20 20 20 20 20 20  Filter,         
59c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
59d0: 74 65 72 20 2d 20 63 6f 6e 66 69 67 75 72 65 20  ter - configure 
59e0: 73 63 61 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73  scan constraints
59f0: 20 2a 2f 0a 20 20 20 20 75 6e 69 6f 6e 4e 65 78   */.    unionNex
5a00: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
5a10: 20 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 20 2d        /* xNext -
5a20: 20 61 64 76 61 6e 63 65 20 61 20 63 75 72 73 6f   advance a curso
5a30: 72 20 2a 2f 0a 20 20 20 20 75 6e 69 6f 6e 45 6f  r */.    unionEo
5a40: 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
5a50: 20 20 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2d         /* xEof -
5a60: 20 63 68 65 63 6b 20 66 6f 72 20 65 6e 64 20 6f   check for end o
5a70: 66 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 75 6e  f scan */.    un
5a80: 69 6f 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  ionColumn,      
5a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
5aa0: 43 6f 6c 75 6d 6e 20 2d 20 72 65 61 64 20 64 61  Column - read da
5ab0: 74 61 20 2a 2f 0a 20 20 20 20 75 6e 69 6f 6e 52  ta */.    unionR
5ac0: 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  owid,           
5ad0: 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 77 69          /* xRowi
5ae0: 64 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f  d - read data */
5af0: 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
5b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b10: 20 20 20 2f 2a 20 78 55 70 64 61 74 65 20 2a 2f     /* xUpdate */
5b20: 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
5b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b40: 20 20 20 2f 2a 20 78 42 65 67 69 6e 20 2a 2f 0a     /* xBegin */.
5b50: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
5b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b70: 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20    /* xSync */.  
5b80: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
5b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ba0: 2f 2a 20 78 43 6f 6d 6d 69 74 20 2a 2f 0a 20 20  /* xCommit */.  
5bb0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
5bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bd0: 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  /* xRollback */.
5be0: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
5bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c00: 20 20 2f 2a 20 78 46 69 6e 64 4d 65 74 68 6f 64    /* xFindMethod
5c10: 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20   */.    0,      
5c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c30: 20 20 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65        /* xRename
5c40: 20 2a 2f 0a 20 20 7d 3b 0a 0a 20 20 72 65 74 75   */.  };..  retu
5c50: 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  rn sqlite3_creat
5c60: 65 5f 6d 6f 64 75 6c 65 28 64 62 2c 20 22 75 6e  e_module(db, "un
5c70: 69 6f 6e 76 74 61 62 22 2c 20 26 75 6e 69 6f 6e  ionvtab", &union
5c80: 4d 6f 64 75 6c 65 2c 20 30 29 3b 0a 7d 0a 0a 23  Module, 0);.}..#
5c90: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
5ca0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
5cb0: 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 5f 57 49  E */..#ifdef _WI
5cc0: 4e 33 32 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64  N32.__declspec(d
5cd0: 6c 6c 65 78 70 6f 72 74 29 0a 23 65 6e 64 69 66  llexport).#endif
5ce0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 75 6e 69  .int sqlite3_uni
5cf0: 6f 6e 76 74 61 62 5f 69 6e 69 74 28 0a 20 20 73  onvtab_init(.  s
5d00: 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 63  qlite3 *db, .  c
5d10: 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 2c 20  har **pzErrMsg, 
5d20: 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  .  const sqlite3
5d30: 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 20 2a 70  _api_routines *p
5d40: 41 70 69 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  Api.){.  int rc 
5d50: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 53  = SQLITE_OK;.  S
5d60: 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f  QLITE_EXTENSION_
5d70: 49 4e 49 54 32 28 70 41 70 69 29 3b 0a 23 69 66  INIT2(pApi);.#if
5d80: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5d90: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
5da0: 72 63 20 3d 20 63 72 65 61 74 65 55 6e 69 6f 6e  rc = createUnion
5db0: 56 74 61 62 28 64 62 29 3b 0a 23 65 6e 64 69 66  Vtab(db);.#endif
5dc0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5dd0: 0a                                               .