/ Hex Artifact Content
Login

Artifact 391ce142f6b1faa093867ecee134f61a5028a9af:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 41 70 72 69 6c  /*.** 2003 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** 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 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
0180: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75 73 65  ontains code use
0190: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
01a0: 68 65 20 43 4f 50 59 20 63 6f 6d 6d 61 6e 64 2e  he COPY command.
01b0: 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 63 6f 70 79  .**.** $Id: copy
01c0: 2e 63 2c 76 20 31 2e 37 20 32 30 30 34 2f 30 32  .c,v 1.7 2004/02
01d0: 2f 31 36 20 30 33 3a 34 34 3a 30 32 20 64 72 68  /16 03:44:02 drh
01e0: 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75   Exp $.*/.#inclu
01f0: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0200: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 4f 50 59  ../*.** The COPY
0210: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 66 6f 72 20   command is for 
0220: 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69  compatibility wi
0230: 74 68 20 50 6f 73 74 67 72 65 53 51 4c 20 61 6e  th PostgreSQL an
0240: 64 20 73 70 65 63 69 66 69 63 69 61 6c 6c 79 0a  d specificially.
0250: 2a 2a 20 66 6f 72 20 74 68 65 20 61 62 69 6c 69  ** for the abili
0260: 74 79 20 74 6f 20 72 65 61 64 20 74 68 65 20 6f  ty to read the o
0270: 75 74 70 75 74 20 6f 66 20 70 67 5f 64 75 6d 70  utput of pg_dump
0280: 2e 20 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73  .  The format is
0290: 20 61 73 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a   as.** follows:.
02a0: 2a 2a 0a 2a 2a 20 20 20 20 43 4f 50 59 20 74 61  **.**    COPY ta
02b0: 62 6c 65 20 46 52 4f 4d 20 66 69 6c 65 20 5b 55  ble FROM file [U
02c0: 53 49 4e 47 20 44 45 4c 49 4d 49 54 45 52 53 20  SING DELIMITERS 
02d0: 73 74 72 69 6e 67 5d 0a 2a 2a 0a 2a 2a 20 22 74  string].**.** "t
02e0: 61 62 6c 65 22 20 69 73 20 61 6e 20 65 78 69 73  able" is an exis
02f0: 74 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 2e  ting table name.
0300: 20 20 57 65 20 77 69 6c 6c 20 72 65 61 64 20 6c    We will read l
0310: 69 6e 65 73 20 6f 66 20 63 6f 64 65 20 66 72 6f  ines of code fro
0320: 6d 0a 2a 2a 20 66 69 6c 65 20 74 6f 20 66 69 6c  m.** file to fil
0330: 6c 20 74 68 69 73 20 74 61 62 6c 65 20 77 69 74  l this table wit
0340: 68 20 64 61 74 61 2e 20 20 46 69 6c 65 20 6d 69  h data.  File mi
0350: 67 68 74 20 62 65 20 22 73 74 64 69 6e 22 2e 20  ght be "stdin". 
0360: 20 54 68 65 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a   The optional.**
0370: 20 64 65 6c 69 6d 69 74 65 72 20 73 74 72 69 6e   delimiter strin
0380: 67 20 69 64 65 6e 74 69 66 69 65 73 20 74 68 65  g identifies the
0390: 20 66 69 65 6c 64 20 73 65 70 61 72 61 74 6f 72   field separator
03a0: 73 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  s.  The default 
03b0: 69 73 20 61 20 74 61 62 2e 0a 2a 2f 0a 76 6f 69  is a tab..*/.voi
03c0: 64 20 73 71 6c 69 74 65 43 6f 70 79 28 0a 20 20  d sqliteCopy(.  
03d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
03e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
03f0: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
0400: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 6c 65 4e  SrcList *pTableN
0410: 61 6d 65 2c 20 2f 2a 20 54 68 65 20 6e 61 6d 65  ame, /* The name
0420: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 6e   of the table in
0430: 74 6f 20 77 68 69 63 68 20 77 65 20 77 69 6c 6c  to which we will
0440: 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 54 6f 6b   insert */.  Tok
0450: 65 6e 20 2a 70 46 69 6c 65 6e 61 6d 65 2c 20 20  en *pFilename,  
0460: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66 72    /* The file fr
0470: 6f 6d 20 77 68 69 63 68 20 74 6f 20 6f 62 74 61  om which to obta
0480: 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  in information *
0490: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 65 6c 69  /.  Token *pDeli
04a0: 6d 69 74 65 72 2c 20 20 20 2f 2a 20 55 73 65 20  miter,   /* Use 
04b0: 74 68 69 73 20 61 73 20 74 68 65 20 66 69 65 6c  this as the fiel
04c0: 64 20 64 65 6c 69 6d 69 74 65 72 20 2a 2f 0a 20  d delimiter */. 
04d0: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 20 20 20 20   int onError    
04e0: 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
04f0: 20 64 6f 20 69 66 20 61 20 63 6f 6e 73 74 72 61   do if a constra
0500: 69 6e 74 20 66 61 69 6c 73 20 2a 2f 0a 29 7b 0a  int fails */.){.
0510: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
0520: 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a   int i;.  Vdbe *
0530: 76 3b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 65  v;.  int addr, e
0540: 6e 64 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  nd;.  Index *pId
0550: 78 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  x;.  char *zFile
0560: 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68   = 0;.  const ch
0570: 61 72 20 2a 7a 44 62 3b 0a 20 20 73 71 6c 69 74  ar *zDb;.  sqlit
0580: 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  e *db = pParse->
0590: 64 62 3b 0a 0a 0a 20 20 69 66 28 20 73 71 6c 69  db;...  if( sqli
05a0: 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  te_malloc_failed
05b0: 20 20 29 20 67 6f 74 6f 20 63 6f 70 79 5f 63 6c    ) goto copy_cl
05c0: 65 61 6e 75 70 3b 0a 20 20 61 73 73 65 72 74 28  eanup;.  assert(
05d0: 20 70 54 61 62 6c 65 4e 61 6d 65 2d 3e 6e 53 72   pTableName->nSr
05e0: 63 3d 3d 31 20 29 3b 0a 20 20 70 54 61 62 20 3d  c==1 );.  pTab =
05f0: 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 4c 6f   sqliteSrcListLo
0600: 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 61  okup(pParse, pTa
0610: 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  bleName);.  if( 
0620: 70 54 61 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  pTab==0 || sqlit
0630: 65 49 73 52 65 61 64 4f 6e 6c 79 28 70 50 61 72  eIsReadOnly(pPar
0640: 73 65 2c 20 70 54 61 62 2c 20 30 29 20 29 20 67  se, pTab, 0) ) g
0650: 6f 74 6f 20 63 6f 70 79 5f 63 6c 65 61 6e 75 70  oto copy_cleanup
0660: 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69  ;.  zFile = sqli
0670: 74 65 53 74 72 4e 44 75 70 28 70 46 69 6c 65 6e  teStrNDup(pFilen
0680: 61 6d 65 2d 3e 7a 2c 20 70 46 69 6c 65 6e 61 6d  ame->z, pFilenam
0690: 65 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69 74 65 44  e->n);.  sqliteD
06a0: 65 71 75 6f 74 65 28 7a 46 69 6c 65 29 3b 0a 20  equote(zFile);. 
06b0: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69   assert( pTab->i
06c0: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
06d0: 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54  zDb = db->aDb[pT
06e0: 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  ab->iDb].zName;.
06f0: 20 20 69 66 28 20 73 71 6c 69 74 65 41 75 74 68    if( sqliteAuth
0700: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
0710: 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 70 54 61  LITE_INSERT, pTa
0720: 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62  b->zName, 0, zDb
0730: 29 0a 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74  ).      || sqlit
0740: 65 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  eAuthCheck(pPars
0750: 65 2c 20 53 51 4c 49 54 45 5f 43 4f 50 59 2c 20  e, SQLITE_COPY, 
0760: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 46 69  pTab->zName, zFi
0770: 6c 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  le, zDb) ){.    
0780: 67 6f 74 6f 20 63 6f 70 79 5f 63 6c 65 61 6e 75  goto copy_cleanu
0790: 70 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c  p;.  }.  v = sql
07a0: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
07b0: 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
07c0: 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72     sqliteBeginWr
07d0: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
07e0: 72 73 65 2c 20 31 2c 20 70 54 61 62 2d 3e 69 44  rse, 1, pTab->iD
07f0: 62 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73  b);.    addr = s
0800: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
0810: 2c 20 4f 50 5f 46 69 6c 65 4f 70 65 6e 2c 20 30  , OP_FileOpen, 0
0820: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
0830: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
0840: 61 64 64 72 2c 20 70 46 69 6c 65 6e 61 6d 65 2d  addr, pFilename-
0850: 3e 7a 2c 20 70 46 69 6c 65 6e 61 6d 65 2d 3e 6e  >z, pFilename->n
0860: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
0870: 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 61 64  eDequoteP3(v, ad
0880: 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  dr);.    sqliteV
0890: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
08a0: 6e 74 65 67 65 72 2c 20 70 54 61 62 2d 3e 69 44  nteger, pTab->iD
08b0: 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
08c0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
08d0: 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 70  _OpenWrite, 0, p
08e0: 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20  Tab->tnum);.    
08f0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
0900: 50 33 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e  P3(v, -1, pTab->
0910: 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43  zName, P3_STATIC
0920: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c 20  );.    for(i=1, 
0930: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
0940: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
0950: 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b  dx->pNext, i++){
0960: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
0970: 49 64 78 2d 3e 69 44 62 3d 3d 31 20 7c 7c 20 70  Idx->iDb==1 || p
0980: 49 64 78 2d 3e 69 44 62 3d 3d 70 54 61 62 2d 3e  Idx->iDb==pTab->
0990: 69 44 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  iDb );.      sql
09a0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
09b0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 49 64 78  OP_Integer, pIdx
09c0: 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20  ->iDb, 0);.     
09d0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
09e0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
09f0: 2c 20 69 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 29  , i, pIdx->tnum)
0a00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
0a10: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
0a20: 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50  , pIdx->zName, P
0a30: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  3_STATIC);.    }
0a40: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61  .    if( db->fla
0a50: 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e  gs & SQLITE_Coun
0a60: 74 52 6f 77 73 20 29 7b 0a 20 20 20 20 20 20 73  tRows ){.      s
0a70: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
0a80: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
0a90: 20 30 29 3b 20 20 2f 2a 20 49 6e 69 74 69 61 6c   0);  /* Initial
0aa0: 69 7a 65 20 74 68 65 20 72 6f 77 20 63 6f 75 6e  ize the row coun
0ab0: 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 65  t */.    }.    e
0ac0: 6e 64 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  nd = sqliteVdbeM
0ad0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
0ae0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64   addr = sqliteVd
0af0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69  beAddOp(v, OP_Fi
0b00: 6c 65 52 65 61 64 2c 20 70 54 61 62 2d 3e 6e 43  leRead, pTab->nC
0b10: 6f 6c 2c 20 65 6e 64 29 3b 0a 20 20 20 20 69 66  ol, end);.    if
0b20: 28 20 70 44 65 6c 69 6d 69 74 65 72 20 29 7b 0a  ( pDelimiter ){.
0b30: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
0b40: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
0b50: 2c 20 70 44 65 6c 69 6d 69 74 65 72 2d 3e 7a 2c  , pDelimiter->z,
0b60: 20 70 44 65 6c 69 6d 69 74 65 72 2d 3e 6e 29 3b   pDelimiter->n);
0b70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
0b80: 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 61 64  eDequoteP3(v, ad
0b90: 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dr);.    }else{.
0ba0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
0bb0: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
0bc0: 2c 20 22 5c 74 22 2c 20 31 29 3b 0a 20 20 20 20  , "\t", 1);.    
0bd0: 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  }.    if( pTab->
0be0: 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20  iPKey>=0 ){.    
0bf0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
0c00: 70 28 76 2c 20 4f 50 5f 46 69 6c 65 43 6f 6c 75  p(v, OP_FileColu
0c10: 6d 6e 2c 20 70 54 61 62 2d 3e 69 50 4b 65 79 2c  mn, pTab->iPKey,
0c20: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
0c30: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
0c40: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30  _MustBeInt, 0, 0
0c50: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
0c60: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
0c70: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63  dOp(v, OP_NewRec
0c80: 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  no, 0, 0);.    }
0c90: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
0ca0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
0cb0: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 70  {.      if( i==p
0cc0: 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20  Tab->iPKey ){.  
0cd0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74        /* The int
0ce0: 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79  eger primary key
0cf0: 20 63 6f 6c 75 6d 6e 20 69 73 20 66 69 6c 6c 65   column is fille
0d00: 64 20 77 69 74 68 20 4e 55 4c 4c 20 73 69 6e 63  d with NULL sinc
0d10: 65 20 69 74 73 0a 20 20 20 20 20 20 20 20 2a 2a  e its.        **
0d20: 20 76 61 6c 75 65 20 69 73 20 61 6c 77 61 79 73   value is always
0d30: 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 74 68 65   pulled from the
0d40: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 2a   record number *
0d50: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
0d60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
0d70: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
0d80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
0d90: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
0da0: 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65 43 6f  dOp(v, OP_FileCo
0db0: 6c 75 6d 6e 2c 20 69 2c 20 30 29 3b 0a 20 20 20  lumn, i, 0);.   
0dc0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
0dd0: 71 6c 69 74 65 47 65 6e 65 72 61 74 65 43 6f 6e  qliteGenerateCon
0de0: 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28 70 50  straintChecks(pP
0df0: 61 72 73 65 2c 20 70 54 61 62 2c 20 30 2c 20 30  arse, pTab, 0, 0
0e00: 2c 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30  , pTab->iPKey>=0
0e10: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
0e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e30: 20 20 20 20 20 20 30 2c 20 6f 6e 45 72 72 6f 72        0, onError
0e40: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 73 71 6c  , addr);.    sql
0e50: 69 74 65 43 6f 6d 70 6c 65 74 65 49 6e 73 65 72  iteCompleteInser
0e60: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61  tion(pParse, pTa
0e70: 62 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 2d  b, 0, 0, 0, 0, -
0e80: 31 29 3b 0a 20 20 20 20 69 66 28 20 28 64 62 2d  1);.    if( (db-
0e90: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
0ea0: 43 6f 75 6e 74 52 6f 77 73 29 21 3d 30 20 29 7b  CountRows)!=0 ){
0eb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
0ec0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64  eAddOp(v, OP_Add
0ed0: 49 6d 6d 2c 20 31 2c 20 30 29 3b 20 20 2f 2a 20  Imm, 1, 0);  /* 
0ee0: 49 6e 63 72 65 6d 65 6e 74 20 72 6f 77 20 63 6f  Increment row co
0ef0: 75 6e 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  unt */.    }.   
0f00: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
0f10: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
0f20: 61 64 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  addr);.    sqlit
0f30: 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  eVdbeResolveLabe
0f40: 6c 28 76 2c 20 65 6e 64 29 3b 0a 20 20 20 20 73  l(v, end);.    s
0f50: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
0f60: 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 29  , OP_Noop, 0, 0)
0f70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57  ;.    sqliteEndW
0f80: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
0f90: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 64  arse);.    if( d
0fa0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
0fb0: 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29 7b 0a 20  E_CountRows ){. 
0fc0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
0fd0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  ddOp(v, OP_Colum
0fe0: 6e 4e 61 6d 65 2c 20 30 2c 20 31 29 3b 0a 20 20  nName, 0, 1);.  
0ff0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
1000: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 72  angeP3(v, -1, "r
1010: 6f 77 73 20 69 6e 73 65 72 74 65 64 22 2c 20 50  ows inserted", P
1020: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
1030: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
1040: 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c  (v, OP_Callback,
1050: 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 0);.    }.  
1060: 7d 0a 20 20 0a 63 6f 70 79 5f 63 6c 65 61 6e 75  }.  .copy_cleanu
1070: 70 3a 0a 20 20 73 71 6c 69 74 65 53 72 63 4c 69  p:.  sqliteSrcLi
1080: 73 74 44 65 6c 65 74 65 28 70 54 61 62 6c 65 4e  stDelete(pTableN
1090: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ame);.  sqliteFr
10a0: 65 65 28 7a 46 69 6c 65 29 3b 0a 20 20 72 65 74  ee(zFile);.  ret
10b0: 75 72 6e 3b 0a 7d 0a                             urn;.}.