Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/sqlite/src/src/insert.c |
Source code | Switch to Preprocessed file |
Line | Source | Count | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | /* | - | ||||||||||||||||||||||||
2 | ** 2001 September 15 | - | ||||||||||||||||||||||||
3 | ** | - | ||||||||||||||||||||||||
4 | ** The author disclaims copyright to this source code. In place of | - | ||||||||||||||||||||||||
5 | ** a legal notice, here is a blessing: | - | ||||||||||||||||||||||||
6 | ** | - | ||||||||||||||||||||||||
7 | ** May you do good and not evil. | - | ||||||||||||||||||||||||
8 | ** May you find forgiveness for yourself and forgive others. | - | ||||||||||||||||||||||||
9 | ** May you share freely, never taking more than you give. | - | ||||||||||||||||||||||||
10 | ** | - | ||||||||||||||||||||||||
11 | ************************************************************************* | - | ||||||||||||||||||||||||
12 | ** This file contains C code routines that are called by the parser | - | ||||||||||||||||||||||||
13 | ** to handle INSERT statements in SQLite. | - | ||||||||||||||||||||||||
14 | */ | - | ||||||||||||||||||||||||
15 | #include "sqliteInt.h" | - | ||||||||||||||||||||||||
16 | - | |||||||||||||||||||||||||
17 | /* | - | ||||||||||||||||||||||||
18 | ** Generate code that will | - | ||||||||||||||||||||||||
19 | ** | - | ||||||||||||||||||||||||
20 | ** (1) acquire a lock for table pTab then | - | ||||||||||||||||||||||||
21 | ** (2) open pTab as cursor iCur. | - | ||||||||||||||||||||||||
22 | ** | - | ||||||||||||||||||||||||
23 | ** If pTab is a WITHOUT ROWID table, then it is the PRIMARY KEY index | - | ||||||||||||||||||||||||
24 | ** for that table that is actually opened. | - | ||||||||||||||||||||||||
25 | */ | - | ||||||||||||||||||||||||
26 | void sqlite3OpenTable( | - | ||||||||||||||||||||||||
27 | Parse *pParse, /* Generate code into this VDBE */ | - | ||||||||||||||||||||||||
28 | int iCur, /* The cursor number of the table */ | - | ||||||||||||||||||||||||
29 | int iDb, /* The database index in sqlite3.aDb[] */ | - | ||||||||||||||||||||||||
30 | Table *pTab, /* The table to be opened */ | - | ||||||||||||||||||||||||
31 | int opcode /* OP_OpenRead or OP_OpenWrite */ | - | ||||||||||||||||||||||||
32 | ){ | - | ||||||||||||||||||||||||
33 | Vdbe *v; | - | ||||||||||||||||||||||||
34 | assert( !IsVirtual(pTab) ); | - | ||||||||||||||||||||||||
35 | v = sqlite3GetVdbe(pParse); | - | ||||||||||||||||||||||||
36 | assert( opcode==OP_OpenWrite || opcode==OP_OpenRead ); | - | ||||||||||||||||||||||||
37 | sqlite3TableLock(pParse, iDb, pTab->tnum, | - | ||||||||||||||||||||||||
38 | (opcode==OP_OpenWrite)?1:0, pTab->zName); | - | ||||||||||||||||||||||||
39 | if( HasRowid(pTab) ){
| 171-313296 | ||||||||||||||||||||||||
40 | sqlite3VdbeAddOp4Int(v, opcode, iCur, pTab->tnum, iDb, pTab->nCol); | - | ||||||||||||||||||||||||
41 | VdbeComment((v, "%s", pTab->zName)); | - | ||||||||||||||||||||||||
42 | }else{ executed 313296 times by 435 tests: end of block Executed by:
| 313296 | ||||||||||||||||||||||||
43 | Index *pPk = sqlite3PrimaryKeyIndex(pTab); | - | ||||||||||||||||||||||||
44 | assert( pPk!=0 ); | - | ||||||||||||||||||||||||
45 | assert( pPk->tnum==pTab->tnum ); | - | ||||||||||||||||||||||||
46 | sqlite3VdbeAddOp3(v, opcode, iCur, pPk->tnum, iDb); | - | ||||||||||||||||||||||||
47 | sqlite3VdbeSetP4KeyInfo(pParse, pPk); | - | ||||||||||||||||||||||||
48 | VdbeComment((v, "%s", pTab->zName)); | - | ||||||||||||||||||||||||
49 | } executed 171 times by 1 test: end of block Executed by:
| 171 | ||||||||||||||||||||||||
50 | } | - | ||||||||||||||||||||||||
51 | - | |||||||||||||||||||||||||
52 | /* | - | ||||||||||||||||||||||||
53 | ** Return a pointer to the column affinity string associated with index | - | ||||||||||||||||||||||||
54 | ** pIdx. A column affinity string has one character for each column in | - | ||||||||||||||||||||||||
55 | ** the table, according to the affinity of the column: | - | ||||||||||||||||||||||||
56 | ** | - | ||||||||||||||||||||||||
57 | ** Character Column affinity | - | ||||||||||||||||||||||||
58 | ** ------------------------------ | - | ||||||||||||||||||||||||
59 | ** 'A' BLOB | - | ||||||||||||||||||||||||
60 | ** 'B' TEXT | - | ||||||||||||||||||||||||
61 | ** 'C' NUMERIC | - | ||||||||||||||||||||||||
62 | ** 'D' INTEGER | - | ||||||||||||||||||||||||
63 | ** 'F' REAL | - | ||||||||||||||||||||||||
64 | ** | - | ||||||||||||||||||||||||
65 | ** An extra 'D' is appended to the end of the string to cover the | - | ||||||||||||||||||||||||
66 | ** rowid that appears as the last column in every index. | - | ||||||||||||||||||||||||
67 | ** | - | ||||||||||||||||||||||||
68 | ** Memory for the buffer containing the column index affinity string | - | ||||||||||||||||||||||||
69 | ** is managed along with the rest of the Index structure. It will be | - | ||||||||||||||||||||||||
70 | ** released when sqlite3DeleteIndex() is called. | - | ||||||||||||||||||||||||
71 | */ | - | ||||||||||||||||||||||||
72 | const char *sqlite3IndexAffinityStr(sqlite3 *db, Index *pIdx){ | - | ||||||||||||||||||||||||
73 | if( !pIdx->zColAff ){
| 5024-28090 | ||||||||||||||||||||||||
74 | /* The first time a column affinity string for a particular index is | - | ||||||||||||||||||||||||
75 | ** required, it is allocated and populated here. It is then stored as | - | ||||||||||||||||||||||||
76 | ** a member of the Index structure for subsequent use. | - | ||||||||||||||||||||||||
77 | ** | - | ||||||||||||||||||||||||
78 | ** The column affinity string will eventually be deleted by | - | ||||||||||||||||||||||||
79 | ** sqliteDeleteIndex() when the Index structure itself is cleaned | - | ||||||||||||||||||||||||
80 | ** up. | - | ||||||||||||||||||||||||
81 | */ | - | ||||||||||||||||||||||||
82 | int n; | - | ||||||||||||||||||||||||
83 | Table *pTab = pIdx->pTable; | - | ||||||||||||||||||||||||
84 | pIdx->zColAff = (char *)sqlite3DbMallocRaw(0, pIdx->nColumn+1); | - | ||||||||||||||||||||||||
85 | if( !pIdx->zColAff ){
| 2-5022 | ||||||||||||||||||||||||
86 | sqlite3OomFault(db); | - | ||||||||||||||||||||||||
87 | return 0; executed 2 times by 1 test: return 0; Executed by:
| 2 | ||||||||||||||||||||||||
88 | } | - | ||||||||||||||||||||||||
89 | for(n=0; n<pIdx->nColumn; n++){
| 5022-12902 | ||||||||||||||||||||||||
90 | i16 x = pIdx->aiColumn[n]; | - | ||||||||||||||||||||||||
91 | if( x>=0 ){
| 4802-8100 | ||||||||||||||||||||||||
92 | pIdx->zColAff[n] = pTab->aCol[x].affinity; | - | ||||||||||||||||||||||||
93 | }else if( x==XN_ROWID ){ executed 8100 times by 2 tests: end of block Executed by:
| 32-8100 | ||||||||||||||||||||||||
94 | pIdx->zColAff[n] = SQLITE_AFF_INTEGER; | - | ||||||||||||||||||||||||
95 | }else{ executed 4770 times by 2 tests: end of block Executed by:
| 4770 | ||||||||||||||||||||||||
96 | char aff; | - | ||||||||||||||||||||||||
97 | assert( x==XN_EXPR ); | - | ||||||||||||||||||||||||
98 | assert( pIdx->aColExpr!=0 ); | - | ||||||||||||||||||||||||
99 | aff = sqlite3ExprAffinity(pIdx->aColExpr->a[n].pExpr); | - | ||||||||||||||||||||||||
100 | if( aff==0 ) aff = SQLITE_AFF_BLOB; executed 32 times by 1 test: aff = 'A'; Executed by:
| 0-32 | ||||||||||||||||||||||||
101 | pIdx->zColAff[n] = aff; | - | ||||||||||||||||||||||||
102 | } executed 32 times by 1 test: end of block Executed by:
| 32 | ||||||||||||||||||||||||
103 | } | - | ||||||||||||||||||||||||
104 | pIdx->zColAff[n] = 0; | - | ||||||||||||||||||||||||
105 | } executed 5022 times by 2 tests: end of block Executed by:
| 5022 | ||||||||||||||||||||||||
106 | - | |||||||||||||||||||||||||
107 | return pIdx->zColAff; executed 33112 times by 2 tests: return pIdx->zColAff; Executed by:
| 33112 | ||||||||||||||||||||||||
108 | } | - | ||||||||||||||||||||||||
109 | - | |||||||||||||||||||||||||
110 | /* | - | ||||||||||||||||||||||||
111 | ** Compute the affinity string for table pTab, if it has not already been | - | ||||||||||||||||||||||||
112 | ** computed. As an optimization, omit trailing SQLITE_AFF_BLOB affinities. | - | ||||||||||||||||||||||||
113 | ** | - | ||||||||||||||||||||||||
114 | ** If the affinity exists (if it is no entirely SQLITE_AFF_BLOB values) and | - | ||||||||||||||||||||||||
115 | ** if iReg>0 then code an OP_Affinity opcode that will set the affinities | - | ||||||||||||||||||||||||
116 | ** for register iReg and following. Or if affinities exists and iReg==0, | - | ||||||||||||||||||||||||
117 | ** then just set the P4 operand of the previous opcode (which should be | - | ||||||||||||||||||||||||
118 | ** an OP_MakeRecord) to the affinity string. | - | ||||||||||||||||||||||||
119 | ** | - | ||||||||||||||||||||||||
120 | ** A column affinity string has one character per column: | - | ||||||||||||||||||||||||
121 | ** | - | ||||||||||||||||||||||||
122 | ** Character Column affinity | - | ||||||||||||||||||||||||
123 | ** ------------------------------ | - | ||||||||||||||||||||||||
124 | ** 'A' BLOB | - | ||||||||||||||||||||||||
125 | ** 'B' TEXT | - | ||||||||||||||||||||||||
126 | ** 'C' NUMERIC | - | ||||||||||||||||||||||||
127 | ** 'D' INTEGER | - | ||||||||||||||||||||||||
128 | ** 'E' REAL | - | ||||||||||||||||||||||||
129 | */ | - | ||||||||||||||||||||||||
130 | void sqlite3TableAffinity(Vdbe *v, Table *pTab, int iReg){ | - | ||||||||||||||||||||||||
131 | int i; | - | ||||||||||||||||||||||||
132 | char *zColAff = pTab->zColAff; | - | ||||||||||||||||||||||||
133 | if( zColAff==0 ){
| 22084-85251 | ||||||||||||||||||||||||
134 | sqlite3 *db = sqlite3VdbeDb(v); | - | ||||||||||||||||||||||||
135 | zColAff = (char *)sqlite3DbMallocRaw(0, pTab->nCol+1); | - | ||||||||||||||||||||||||
136 | if( !zColAff ){
| 50-22034 | ||||||||||||||||||||||||
137 | sqlite3OomFault(db); | - | ||||||||||||||||||||||||
138 | return; executed 50 times by 1 test: return; Executed by:
| 50 | ||||||||||||||||||||||||
139 | } | - | ||||||||||||||||||||||||
140 | - | |||||||||||||||||||||||||
141 | for(i=0; i<pTab->nCol; i++){
| 22034-91046 | ||||||||||||||||||||||||
142 | zColAff[i] = pTab->aCol[i].affinity; | - | ||||||||||||||||||||||||
143 | } executed 91046 times by 406 tests: end of block Executed by:
| 91046 | ||||||||||||||||||||||||
144 | do{ | - | ||||||||||||||||||||||||
145 | zColAff[i--] = 0; | - | ||||||||||||||||||||||||
146 | }while( i>=0 && zColAff[i]==SQLITE_AFF_BLOB ); executed 39109 times by 406 tests: end of block Executed by:
| 5836-39109 | ||||||||||||||||||||||||
147 | pTab->zColAff = zColAff; | - | ||||||||||||||||||||||||
148 | } executed 22034 times by 406 tests: end of block Executed by:
| 22034 | ||||||||||||||||||||||||
149 | i = sqlite3Strlen30(zColAff); | - | ||||||||||||||||||||||||
150 | if( i ){
| 19094-88191 | ||||||||||||||||||||||||
151 | if( iReg ){
| 14525-73666 | ||||||||||||||||||||||||
152 | sqlite3VdbeAddOp4(v, OP_Affinity, iReg, i, 0, zColAff, i); | - | ||||||||||||||||||||||||
153 | }else{ executed 14525 times by 333 tests: end of block Executed by:
| 14525 | ||||||||||||||||||||||||
154 | sqlite3VdbeChangeP4(v, -1, zColAff, i); | - | ||||||||||||||||||||||||
155 | } executed 73666 times by 33 tests: end of block Executed by:
| 73666 | ||||||||||||||||||||||||
156 | } | - | ||||||||||||||||||||||||
157 | } executed 107285 times by 406 tests: end of block Executed by:
| 107285 | ||||||||||||||||||||||||
158 | - | |||||||||||||||||||||||||
159 | /* | - | ||||||||||||||||||||||||
160 | ** Return non-zero if the table pTab in database iDb or any of its indices | - | ||||||||||||||||||||||||
161 | ** have been opened at any point in the VDBE program. This is used to see if | - | ||||||||||||||||||||||||
162 | ** a statement of the form "INSERT INTO <iDb, pTab> SELECT ..." can | - | ||||||||||||||||||||||||
163 | ** run without using a temporary table for the results of the SELECT. | - | ||||||||||||||||||||||||
164 | */ | - | ||||||||||||||||||||||||
165 | static int readsTable(Parse *p, int iDb, Table *pTab){ | - | ||||||||||||||||||||||||
166 | Vdbe *v = sqlite3GetVdbe(p); | - | ||||||||||||||||||||||||
167 | int i; | - | ||||||||||||||||||||||||
168 | int iEnd = sqlite3VdbeCurrentAddr(v); | - | ||||||||||||||||||||||||
169 | #ifndef SQLITE_OMIT_VIRTUALTABLE | - | ||||||||||||||||||||||||
170 | VTable *pVTab = IsVirtual(pTab) ? sqlite3GetVTable(p->db, pTab) : 0;
| 26-3406 | ||||||||||||||||||||||||
171 | #endif | - | ||||||||||||||||||||||||
172 | - | |||||||||||||||||||||||||
173 | for(i=1; i<iEnd; i++){
| 2002-234017 | ||||||||||||||||||||||||
174 | VdbeOp *pOp = sqlite3VdbeGetOp(v, i); | - | ||||||||||||||||||||||||
175 | assert( pOp!=0 ); | - | ||||||||||||||||||||||||
176 | if( pOp->opcode==OP_OpenRead && pOp->p3==iDb ){
| 699-231075 | ||||||||||||||||||||||||
177 | Index *pIndex; | - | ||||||||||||||||||||||||
178 | int tnum = pOp->p2; | - | ||||||||||||||||||||||||
179 | if( tnum==pTab->tnum ){
| 947-1296 | ||||||||||||||||||||||||
180 | return 1; executed 1296 times by 5 tests: return 1; Executed by:
| 1296 | ||||||||||||||||||||||||
181 | } | - | ||||||||||||||||||||||||
182 | for(pIndex=pTab->pIndex; pIndex; pIndex=pIndex->pNext){
| 525-819 | ||||||||||||||||||||||||
183 | if( tnum==pIndex->tnum ){
| 128-397 | ||||||||||||||||||||||||
184 | return 1; executed 128 times by 1 test: return 1; Executed by:
| 128 | ||||||||||||||||||||||||
185 | } | - | ||||||||||||||||||||||||
186 | } executed 397 times by 1 test: end of block Executed by:
| 397 | ||||||||||||||||||||||||
187 | } executed 819 times by 1 test: end of block Executed by:
| 819 | ||||||||||||||||||||||||
188 | #ifndef SQLITE_OMIT_VIRTUALTABLE | - | ||||||||||||||||||||||||
189 | if( pOp->opcode==OP_VOpen && pOp->p4.pVtab==pVTab ){
| 6-232568 | ||||||||||||||||||||||||
190 | assert( pOp->p4.pVtab!=0 ); | - | ||||||||||||||||||||||||
191 | assert( pOp->p4type==P4_VTAB ); | - | ||||||||||||||||||||||||
192 | return 1; executed 6 times by 1 test: return 1; Executed by:
| 6 | ||||||||||||||||||||||||
193 | } | - | ||||||||||||||||||||||||
194 | #endif | - | ||||||||||||||||||||||||
195 | } executed 232587 times by 6 tests: end of block Executed by:
| 232587 | ||||||||||||||||||||||||
196 | return 0; executed 2002 times by 2 tests: return 0; Executed by:
| 2002 | ||||||||||||||||||||||||
197 | } | - | ||||||||||||||||||||||||
198 | - | |||||||||||||||||||||||||
199 | #ifndef SQLITE_OMIT_AUTOINCREMENT | - | ||||||||||||||||||||||||
200 | /* | - | ||||||||||||||||||||||||
201 | ** Locate or create an AutoincInfo structure associated with table pTab | - | ||||||||||||||||||||||||
202 | ** which is in database iDb. Return the register number for the register | - | ||||||||||||||||||||||||
203 | ** that holds the maximum rowid. Return zero if pTab is not an AUTOINCREMENT | - | ||||||||||||||||||||||||
204 | ** table. (Also return zero when doing a VACUUM since we do not want to | - | ||||||||||||||||||||||||
205 | ** update the AUTOINCREMENT counters during a VACUUM.) | - | ||||||||||||||||||||||||
206 | ** | - | ||||||||||||||||||||||||
207 | ** There is at most one AutoincInfo structure per table even if the | - | ||||||||||||||||||||||||
208 | ** same table is autoincremented multiple times due to inserts within | - | ||||||||||||||||||||||||
209 | ** triggers. A new AutoincInfo structure is created if this is the | - | ||||||||||||||||||||||||
210 | ** first use of table pTab. On 2nd and subsequent uses, the original | - | ||||||||||||||||||||||||
211 | ** AutoincInfo structure is used. | - | ||||||||||||||||||||||||
212 | ** | - | ||||||||||||||||||||||||
213 | ** Four consecutive registers are allocated: | - | ||||||||||||||||||||||||
214 | ** | - | ||||||||||||||||||||||||
215 | ** (1) The name of the pTab table. | - | ||||||||||||||||||||||||
216 | ** (2) The maximum ROWID of pTab. | - | ||||||||||||||||||||||||
217 | ** (3) The rowid in sqlite_sequence of pTab | - | ||||||||||||||||||||||||
218 | ** (4) The original value of the max ROWID in pTab, or NULL if none | - | ||||||||||||||||||||||||
219 | ** | - | ||||||||||||||||||||||||
220 | ** The 2nd register is the one that is returned. That is all the | - | ||||||||||||||||||||||||
221 | ** insert routine needs to know about. | - | ||||||||||||||||||||||||
222 | */ | - | ||||||||||||||||||||||||
223 | static int autoIncBegin( | - | ||||||||||||||||||||||||
224 | Parse *pParse, /* Parsing context */ | - | ||||||||||||||||||||||||
225 | int iDb, /* Index of the database holding pTab */ | - | ||||||||||||||||||||||||
226 | Table *pTab /* The table we are writing to */ | - | ||||||||||||||||||||||||
227 | ){ | - | ||||||||||||||||||||||||
228 | int memId = 0; /* Register holding maximum rowid */ | - | ||||||||||||||||||||||||
229 | assert( pParse->db->aDb[iDb].pSchema!=0 ); | - | ||||||||||||||||||||||||
230 | if( (pTab->tabFlags & TF_Autoincrement)!=0
| 104-76308 | ||||||||||||||||||||||||
231 | && (pParse->db->mDbFlags & DBFLAG_Vacuum)==0
| 4-100 | ||||||||||||||||||||||||
232 | ){ | - | ||||||||||||||||||||||||
233 | Parse *pToplevel = sqlite3ParseToplevel(pParse);
| 14-86 | ||||||||||||||||||||||||
234 | AutoincInfo *pInfo; | - | ||||||||||||||||||||||||
235 | Table *pSeqTab = pParse->db->aDb[iDb].pSchema->pSeqTab; | - | ||||||||||||||||||||||||
236 | - | |||||||||||||||||||||||||
237 | /* Verify that the sqlite_sequence table exists and is an ordinary | - | ||||||||||||||||||||||||
238 | ** rowid table with exactly two columns. | - | ||||||||||||||||||||||||
239 | ** Ticket d8dc2b3a58cd5dc2918a1d4acb 2018-05-23 */ | - | ||||||||||||||||||||||||
240 | if( pSeqTab==0
| 1-99 | ||||||||||||||||||||||||
241 | || !HasRowid(pSeqTab)
| 1-98 | ||||||||||||||||||||||||
242 | || IsVirtual(pSeqTab)
| 1-97 | ||||||||||||||||||||||||
243 | || pSeqTab->nCol!=2
| 1-96 | ||||||||||||||||||||||||
244 | ){ | - | ||||||||||||||||||||||||
245 | pParse->nErr++; | - | ||||||||||||||||||||||||
246 | pParse->rc = SQLITE_CORRUPT_SEQUENCE; | - | ||||||||||||||||||||||||
247 | return 0; executed 4 times by 1 test: return 0; Executed by:
| 4 | ||||||||||||||||||||||||
248 | } | - | ||||||||||||||||||||||||
249 | - | |||||||||||||||||||||||||
250 | pInfo = pToplevel->pAinc; | - | ||||||||||||||||||||||||
251 | while( pInfo && pInfo->pTab!=pTab ){ pInfo = pInfo->pNext; } executed 2 times by 1 test: end of block Executed by:
| 2-86 | ||||||||||||||||||||||||
252 | if( pInfo==0 ){
| 10-86 | ||||||||||||||||||||||||
253 | pInfo = sqlite3DbMallocRawNN(pParse->db, sizeof(*pInfo)); | - | ||||||||||||||||||||||||
254 | if( pInfo==0 ) return 0; never executed: return 0;
| 0-86 | ||||||||||||||||||||||||
255 | pInfo->pNext = pToplevel->pAinc; | - | ||||||||||||||||||||||||
256 | pToplevel->pAinc = pInfo; | - | ||||||||||||||||||||||||
257 | pInfo->pTab = pTab; | - | ||||||||||||||||||||||||
258 | pInfo->iDb = iDb; | - | ||||||||||||||||||||||||
259 | pToplevel->nMem++; /* Register to hold name of table */ | - | ||||||||||||||||||||||||
260 | pInfo->regCtr = ++pToplevel->nMem; /* Max rowid register */ | - | ||||||||||||||||||||||||
261 | pToplevel->nMem +=2; /* Rowid in sqlite_sequence + orig max val */ | - | ||||||||||||||||||||||||
262 | } executed 86 times by 1 test: end of block Executed by:
| 86 | ||||||||||||||||||||||||
263 | memId = pInfo->regCtr; | - | ||||||||||||||||||||||||
264 | } executed 96 times by 1 test: end of block Executed by:
| 96 | ||||||||||||||||||||||||
265 | return memId; executed 76408 times by 61 tests: return memId; Executed by:
| 76408 | ||||||||||||||||||||||||
266 | } | - | ||||||||||||||||||||||||
267 | - | |||||||||||||||||||||||||
268 | /* | - | ||||||||||||||||||||||||
269 | ** This routine generates code that will initialize all of the | - | ||||||||||||||||||||||||
270 | ** register used by the autoincrement tracker. | - | ||||||||||||||||||||||||
271 | */ | - | ||||||||||||||||||||||||
272 | void sqlite3AutoincrementBegin(Parse *pParse){ | - | ||||||||||||||||||||||||
273 | AutoincInfo *p; /* Information about an AUTOINCREMENT */ | - | ||||||||||||||||||||||||
274 | sqlite3 *db = pParse->db; /* The database connection */ | - | ||||||||||||||||||||||||
275 | Db *pDb; /* Database only autoinc table */ | - | ||||||||||||||||||||||||
276 | int memId; /* Register holding max rowid */ | - | ||||||||||||||||||||||||
277 | Vdbe *v = pParse->pVdbe; /* VDBE under construction */ | - | ||||||||||||||||||||||||
278 | - | |||||||||||||||||||||||||
279 | /* This routine is never called during trigger-generation. It is | - | ||||||||||||||||||||||||
280 | ** only called from the top-level */ | - | ||||||||||||||||||||||||
281 | assert( pParse->pTriggerTab==0 ); | - | ||||||||||||||||||||||||
282 | assert( sqlite3IsToplevel(pParse) ); | - | ||||||||||||||||||||||||
283 | - | |||||||||||||||||||||||||
284 | assert( v ); /* We failed long ago if this is not so */ | - | ||||||||||||||||||||||||
285 | for(p = pParse->pAinc; p; p = p->pNext){
| 86-299991 | ||||||||||||||||||||||||
286 | static const int iLn = VDBE_OFFSET_LINENO(2); | - | ||||||||||||||||||||||||
287 | static const VdbeOpList autoInc[] = { | - | ||||||||||||||||||||||||
288 | /* 0 */ {OP_Null, 0, 0, 0}, | - | ||||||||||||||||||||||||
289 | /* 1 */ {OP_Rewind, 0, 10, 0}, | - | ||||||||||||||||||||||||
290 | /* 2 */ {OP_Column, 0, 0, 0}, | - | ||||||||||||||||||||||||
291 | /* 3 */ {OP_Ne, 0, 9, 0}, | - | ||||||||||||||||||||||||
292 | /* 4 */ {OP_Rowid, 0, 0, 0}, | - | ||||||||||||||||||||||||
293 | /* 5 */ {OP_Column, 0, 1, 0}, | - | ||||||||||||||||||||||||
294 | /* 6 */ {OP_AddImm, 0, 0, 0}, | - | ||||||||||||||||||||||||
295 | /* 7 */ {OP_Copy, 0, 0, 0}, | - | ||||||||||||||||||||||||
296 | /* 8 */ {OP_Goto, 0, 11, 0}, | - | ||||||||||||||||||||||||
297 | /* 9 */ {OP_Next, 0, 2, 0}, | - | ||||||||||||||||||||||||
298 | /* 10 */ {OP_Integer, 0, 0, 0}, | - | ||||||||||||||||||||||||
299 | /* 11 */ {OP_Close, 0, 0, 0} | - | ||||||||||||||||||||||||
300 | }; | - | ||||||||||||||||||||||||
301 | VdbeOp *aOp; | - | ||||||||||||||||||||||||
302 | pDb = &db->aDb[p->iDb]; | - | ||||||||||||||||||||||||
303 | memId = p->regCtr; | - | ||||||||||||||||||||||||
304 | assert( sqlite3SchemaMutexHeld(db, 0, pDb->pSchema) ); | - | ||||||||||||||||||||||||
305 | sqlite3OpenTable(pParse, 0, p->iDb, pDb->pSchema->pSeqTab, OP_OpenRead); | - | ||||||||||||||||||||||||
306 | sqlite3VdbeLoadString(v, memId-1, p->pTab->zName); | - | ||||||||||||||||||||||||
307 | aOp = sqlite3VdbeAddOpList(v, ArraySize(autoInc), autoInc, iLn); | - | ||||||||||||||||||||||||
308 | if( aOp==0 ) break; never executed: break;
| 0-86 | ||||||||||||||||||||||||
309 | aOp[0].p2 = memId; | - | ||||||||||||||||||||||||
310 | aOp[0].p3 = memId+2; | - | ||||||||||||||||||||||||
311 | aOp[2].p3 = memId; | - | ||||||||||||||||||||||||
312 | aOp[3].p1 = memId-1; | - | ||||||||||||||||||||||||
313 | aOp[3].p3 = memId; | - | ||||||||||||||||||||||||
314 | aOp[3].p5 = SQLITE_JUMPIFNULL; | - | ||||||||||||||||||||||||
315 | aOp[4].p2 = memId+1; | - | ||||||||||||||||||||||||
316 | aOp[5].p3 = memId; | - | ||||||||||||||||||||||||
317 | aOp[6].p1 = memId; | - | ||||||||||||||||||||||||
318 | aOp[7].p2 = memId+2; | - | ||||||||||||||||||||||||
319 | aOp[7].p1 = memId; | - | ||||||||||||||||||||||||
320 | aOp[10].p2 = memId; | - | ||||||||||||||||||||||||
321 | } executed 86 times by 1 test: end of block Executed by:
| 86 | ||||||||||||||||||||||||
322 | } executed 299991 times by 435 tests: end of block Executed by:
| 299991 | ||||||||||||||||||||||||
323 | - | |||||||||||||||||||||||||
324 | /* | - | ||||||||||||||||||||||||
325 | ** Update the maximum rowid for an autoincrement calculation. | - | ||||||||||||||||||||||||
326 | ** | - | ||||||||||||||||||||||||
327 | ** This routine should be called when the regRowid register holds a | - | ||||||||||||||||||||||||
328 | ** new rowid that is about to be inserted. If that new rowid is | - | ||||||||||||||||||||||||
329 | ** larger than the maximum rowid in the memId memory cell, then the | - | ||||||||||||||||||||||||
330 | ** memory cell is updated. | - | ||||||||||||||||||||||||
331 | */ | - | ||||||||||||||||||||||||
332 | static void autoIncStep(Parse *pParse, int memId, int regRowid){ | - | ||||||||||||||||||||||||
333 | if( memId>0 ){
| 96-74811 | ||||||||||||||||||||||||
334 | sqlite3VdbeAddOp2(pParse->pVdbe, OP_MemMax, memId, regRowid); | - | ||||||||||||||||||||||||
335 | } executed 96 times by 1 test: end of block Executed by:
| 96 | ||||||||||||||||||||||||
336 | } executed 74907 times by 61 tests: end of block Executed by:
| 74907 | ||||||||||||||||||||||||
337 | - | |||||||||||||||||||||||||
338 | /* | - | ||||||||||||||||||||||||
339 | ** This routine generates the code needed to write autoincrement | - | ||||||||||||||||||||||||
340 | ** maximum rowid values back into the sqlite_sequence register. | - | ||||||||||||||||||||||||
341 | ** Every statement that might do an INSERT into an autoincrement | - | ||||||||||||||||||||||||
342 | ** table (either directly or through triggers) needs to call this | - | ||||||||||||||||||||||||
343 | ** routine just before the "exit" code. | - | ||||||||||||||||||||||||
344 | */ | - | ||||||||||||||||||||||||
345 | static SQLITE_NOINLINE void autoIncrementEnd(Parse *pParse){ | - | ||||||||||||||||||||||||
346 | AutoincInfo *p; | - | ||||||||||||||||||||||||
347 | Vdbe *v = pParse->pVdbe; | - | ||||||||||||||||||||||||
348 | sqlite3 *db = pParse->db; | - | ||||||||||||||||||||||||
349 | - | |||||||||||||||||||||||||
350 | assert( v ); | - | ||||||||||||||||||||||||
351 | for(p = pParse->pAinc; p; p = p->pNext){
| 86-87 | ||||||||||||||||||||||||
352 | static const int iLn = VDBE_OFFSET_LINENO(2); | - | ||||||||||||||||||||||||
353 | static const VdbeOpList autoIncEnd[] = { | - | ||||||||||||||||||||||||
354 | /* 0 */ {OP_NotNull, 0, 2, 0}, | - | ||||||||||||||||||||||||
355 | /* 1 */ {OP_NewRowid, 0, 0, 0}, | - | ||||||||||||||||||||||||
356 | /* 2 */ {OP_MakeRecord, 0, 2, 0}, | - | ||||||||||||||||||||||||
357 | /* 3 */ {OP_Insert, 0, 0, 0}, | - | ||||||||||||||||||||||||
358 | /* 4 */ {OP_Close, 0, 0, 0} | - | ||||||||||||||||||||||||
359 | }; | - | ||||||||||||||||||||||||
360 | VdbeOp *aOp; | - | ||||||||||||||||||||||||
361 | Db *pDb = &db->aDb[p->iDb]; | - | ||||||||||||||||||||||||
362 | int iRec; | - | ||||||||||||||||||||||||
363 | int memId = p->regCtr; | - | ||||||||||||||||||||||||
364 | - | |||||||||||||||||||||||||
365 | iRec = sqlite3GetTempReg(pParse); | - | ||||||||||||||||||||||||
366 | assert( sqlite3SchemaMutexHeld(db, 0, pDb->pSchema) ); | - | ||||||||||||||||||||||||
367 | sqlite3VdbeAddOp3(v, OP_Le, memId+2, sqlite3VdbeCurrentAddr(v)+7, memId); | - | ||||||||||||||||||||||||
368 | VdbeCoverage(v); | - | ||||||||||||||||||||||||
369 | sqlite3OpenTable(pParse, 0, p->iDb, pDb->pSchema->pSeqTab, OP_OpenWrite); | - | ||||||||||||||||||||||||
370 | aOp = sqlite3VdbeAddOpList(v, ArraySize(autoIncEnd), autoIncEnd, iLn); | - | ||||||||||||||||||||||||
371 | if( aOp==0 ) break; never executed: break;
| 0-87 | ||||||||||||||||||||||||
372 | aOp[0].p1 = memId+1; | - | ||||||||||||||||||||||||
373 | aOp[1].p2 = memId+1; | - | ||||||||||||||||||||||||
374 | aOp[2].p1 = memId-1; | - | ||||||||||||||||||||||||
375 | aOp[2].p3 = iRec; | - | ||||||||||||||||||||||||
376 | aOp[3].p2 = iRec; | - | ||||||||||||||||||||||||
377 | aOp[3].p3 = memId+1; | - | ||||||||||||||||||||||||
378 | aOp[3].p5 = OPFLAG_APPEND; | - | ||||||||||||||||||||||||
379 | sqlite3ReleaseTempReg(pParse, iRec); | - | ||||||||||||||||||||||||
380 | } executed 87 times by 1 test: end of block Executed by:
| 87 | ||||||||||||||||||||||||
381 | } executed 86 times by 1 test: end of block Executed by:
| 86 | ||||||||||||||||||||||||
382 | void sqlite3AutoincrementEnd(Parse *pParse){ | - | ||||||||||||||||||||||||
383 | if( pParse->pAinc ) autoIncrementEnd(pParse); executed 86 times by 1 test: autoIncrementEnd(pParse); Executed by:
| 86-70196 | ||||||||||||||||||||||||
384 | } executed 70282 times by 397 tests: end of block Executed by:
| 70282 | ||||||||||||||||||||||||
385 | #else | - | ||||||||||||||||||||||||
386 | /* | - | ||||||||||||||||||||||||
387 | ** If SQLITE_OMIT_AUTOINCREMENT is defined, then the three routines | - | ||||||||||||||||||||||||
388 | ** above are all no-ops | - | ||||||||||||||||||||||||
389 | */ | - | ||||||||||||||||||||||||
390 | # define autoIncBegin(A,B,C) (0) | - | ||||||||||||||||||||||||
391 | # define autoIncStep(A,B,C) | - | ||||||||||||||||||||||||
392 | #endif /* SQLITE_OMIT_AUTOINCREMENT */ | - | ||||||||||||||||||||||||
393 | - | |||||||||||||||||||||||||
394 | - | |||||||||||||||||||||||||
395 | /* Forward declaration */ | - | ||||||||||||||||||||||||
396 | static int xferOptimization( | - | ||||||||||||||||||||||||
397 | Parse *pParse, /* Parser context */ | - | ||||||||||||||||||||||||
398 | Table *pDest, /* The table we are inserting into */ | - | ||||||||||||||||||||||||
399 | Select *pSelect, /* A SELECT statement to use as the data source */ | - | ||||||||||||||||||||||||
400 | int onError, /* How to handle constraint errors */ | - | ||||||||||||||||||||||||
401 | int iDbDest /* The database of pDest */ | - | ||||||||||||||||||||||||
402 | ); | - | ||||||||||||||||||||||||
403 | - | |||||||||||||||||||||||||
404 | /* | - | ||||||||||||||||||||||||
405 | ** This routine is called to handle SQL of the following forms: | - | ||||||||||||||||||||||||
406 | ** | - | ||||||||||||||||||||||||
407 | ** insert into TABLE (IDLIST) values(EXPRLIST),(EXPRLIST),... | - | ||||||||||||||||||||||||
408 | ** insert into TABLE (IDLIST) select | - | ||||||||||||||||||||||||
409 | ** insert into TABLE (IDLIST) default values | - | ||||||||||||||||||||||||
410 | ** | - | ||||||||||||||||||||||||
411 | ** The IDLIST following the table name is always optional. If omitted, | - | ||||||||||||||||||||||||
412 | ** then a list of all (non-hidden) columns for the table is substituted. | - | ||||||||||||||||||||||||
413 | ** The IDLIST appears in the pColumn parameter. pColumn is NULL if IDLIST | - | ||||||||||||||||||||||||
414 | ** is omitted. | - | ||||||||||||||||||||||||
415 | ** | - | ||||||||||||||||||||||||
416 | ** For the pSelect parameter holds the values to be inserted for the | - | ||||||||||||||||||||||||
417 | ** first two forms shown above. A VALUES clause is really just short-hand | - | ||||||||||||||||||||||||
418 | ** for a SELECT statement that omits the FROM clause and everything else | - | ||||||||||||||||||||||||
419 | ** that follows. If the pSelect parameter is NULL, that means that the | - | ||||||||||||||||||||||||
420 | ** DEFAULT VALUES form of the INSERT statement is intended. | - | ||||||||||||||||||||||||
421 | ** | - | ||||||||||||||||||||||||
422 | ** The code generated follows one of four templates. For a simple | - | ||||||||||||||||||||||||
423 | ** insert with data coming from a single-row VALUES clause, the code executes | - | ||||||||||||||||||||||||
424 | ** once straight down through. Pseudo-code follows (we call this | - | ||||||||||||||||||||||||
425 | ** the "1st template"): | - | ||||||||||||||||||||||||
426 | ** | - | ||||||||||||||||||||||||
427 | ** open write cursor to <table> and its indices | - | ||||||||||||||||||||||||
428 | ** put VALUES clause expressions into registers | - | ||||||||||||||||||||||||
429 | ** write the resulting record into <table> | - | ||||||||||||||||||||||||
430 | ** cleanup | - | ||||||||||||||||||||||||
431 | ** | - | ||||||||||||||||||||||||
432 | ** The three remaining templates assume the statement is of the form | - | ||||||||||||||||||||||||
433 | ** | - | ||||||||||||||||||||||||
434 | ** INSERT INTO <table> SELECT ... | - | ||||||||||||||||||||||||
435 | ** | - | ||||||||||||||||||||||||
436 | ** If the SELECT clause is of the restricted form "SELECT * FROM <table2>" - | - | ||||||||||||||||||||||||
437 | ** in other words if the SELECT pulls all columns from a single table | - | ||||||||||||||||||||||||
438 | ** and there is no WHERE or LIMIT or GROUP BY or ORDER BY clauses, and | - | ||||||||||||||||||||||||
439 | ** if <table2> and <table1> are distinct tables but have identical | - | ||||||||||||||||||||||||
440 | ** schemas, including all the same indices, then a special optimization | - | ||||||||||||||||||||||||
441 | ** is invoked that copies raw records from <table2> over to <table1>. | - | ||||||||||||||||||||||||
442 | ** See the xferOptimization() function for the implementation of this | - | ||||||||||||||||||||||||
443 | ** template. This is the 2nd template. | - | ||||||||||||||||||||||||
444 | ** | - | ||||||||||||||||||||||||
445 | ** open a write cursor to <table> | - | ||||||||||||||||||||||||
446 | ** open read cursor on <table2> | - | ||||||||||||||||||||||||
447 | ** transfer all records in <table2> over to <table> | - | ||||||||||||||||||||||||
448 | ** close cursors | - | ||||||||||||||||||||||||
449 | ** foreach index on <table> | - | ||||||||||||||||||||||||
450 | ** open a write cursor on the <table> index | - | ||||||||||||||||||||||||
451 | ** open a read cursor on the corresponding <table2> index | - | ||||||||||||||||||||||||
452 | ** transfer all records from the read to the write cursors | - | ||||||||||||||||||||||||
453 | ** close cursors | - | ||||||||||||||||||||||||
454 | ** end foreach | - | ||||||||||||||||||||||||
455 | ** | - | ||||||||||||||||||||||||
456 | ** The 3rd template is for when the second template does not apply | - | ||||||||||||||||||||||||
457 | ** and the SELECT clause does not read from <table> at any time. | - | ||||||||||||||||||||||||
458 | ** The generated code follows this template: | - | ||||||||||||||||||||||||
459 | ** | - | ||||||||||||||||||||||||
460 | ** X <- A | - | ||||||||||||||||||||||||
461 | ** goto B | - | ||||||||||||||||||||||||
462 | ** A: setup for the SELECT | - | ||||||||||||||||||||||||
463 | ** loop over the rows in the SELECT | - | ||||||||||||||||||||||||
464 | ** load values into registers R..R+n | - | ||||||||||||||||||||||||
465 | ** yield X | - | ||||||||||||||||||||||||
466 | ** end loop | - | ||||||||||||||||||||||||
467 | ** cleanup after the SELECT | - | ||||||||||||||||||||||||
468 | ** end-coroutine X | - | ||||||||||||||||||||||||
469 | ** B: open write cursor to <table> and its indices | - | ||||||||||||||||||||||||
470 | ** C: yield X, at EOF goto D | - | ||||||||||||||||||||||||
471 | ** insert the select result into <table> from R..R+n | - | ||||||||||||||||||||||||
472 | ** goto C | - | ||||||||||||||||||||||||
473 | ** D: cleanup | - | ||||||||||||||||||||||||
474 | ** | - | ||||||||||||||||||||||||
475 | ** The 4th template is used if the insert statement takes its | - | ||||||||||||||||||||||||
476 | ** values from a SELECT but the data is being inserted into a table | - | ||||||||||||||||||||||||
477 | ** that is also read as part of the SELECT. In the third form, | - | ||||||||||||||||||||||||
478 | ** we have to use an intermediate table to store the results of | - | ||||||||||||||||||||||||
479 | ** the select. The template is like this: | - | ||||||||||||||||||||||||
480 | ** | - | ||||||||||||||||||||||||
481 | ** X <- A | - | ||||||||||||||||||||||||
482 | ** goto B | - | ||||||||||||||||||||||||
483 | ** A: setup for the SELECT | - | ||||||||||||||||||||||||
484 | ** loop over the tables in the SELECT | - | ||||||||||||||||||||||||
485 | ** load value into register R..R+n | - | ||||||||||||||||||||||||
486 | ** yield X | - | ||||||||||||||||||||||||
487 | ** end loop | - | ||||||||||||||||||||||||
488 | ** cleanup after the SELECT | - | ||||||||||||||||||||||||
489 | ** end co-routine R | - | ||||||||||||||||||||||||
490 | ** B: open temp table | - | ||||||||||||||||||||||||
491 | ** L: yield X, at EOF goto M | - | ||||||||||||||||||||||||
492 | ** insert row from R..R+n into temp table | - | ||||||||||||||||||||||||
493 | ** goto L | - | ||||||||||||||||||||||||
494 | ** M: open write cursor to <table> and its indices | - | ||||||||||||||||||||||||
495 | ** rewind temp table | - | ||||||||||||||||||||||||
496 | ** C: loop over rows of intermediate table | - | ||||||||||||||||||||||||
497 | ** transfer values form intermediate table into <table> | - | ||||||||||||||||||||||||
498 | ** end loop | - | ||||||||||||||||||||||||
499 | ** D: cleanup | - | ||||||||||||||||||||||||
500 | */ | - | ||||||||||||||||||||||||
501 | void sqlite3Insert( | - | ||||||||||||||||||||||||
502 | Parse *pParse, /* Parser context */ | - | ||||||||||||||||||||||||
503 | SrcList *pTabList, /* Name of table into which we are inserting */ | - | ||||||||||||||||||||||||
504 | Select *pSelect, /* A SELECT statement to use as the data source */ | - | ||||||||||||||||||||||||
505 | IdList *pColumn, /* Column names corresponding to IDLIST. */ | - | ||||||||||||||||||||||||
506 | int onError, /* How to handle constraint errors */ | - | ||||||||||||||||||||||||
507 | Upsert *pUpsert /* ON CONFLICT clauses for upsert, or NULL */ | - | ||||||||||||||||||||||||
508 | ){ | - | ||||||||||||||||||||||||
509 | sqlite3 *db; /* The main database structure */ | - | ||||||||||||||||||||||||
510 | Table *pTab; /* The table to insert into. aka TABLE */ | - | ||||||||||||||||||||||||
511 | int i, j; /* Loop counters */ | - | ||||||||||||||||||||||||
512 | Vdbe *v; /* Generate code into this virtual machine */ | - | ||||||||||||||||||||||||
513 | Index *pIdx; /* For looping over indices of the table */ | - | ||||||||||||||||||||||||
514 | int nColumn; /* Number of columns in the data */ | - | ||||||||||||||||||||||||
515 | int nHidden = 0; /* Number of hidden columns if TABLE is virtual */ | - | ||||||||||||||||||||||||
516 | int iDataCur = 0; /* VDBE cursor that is the main data repository */ | - | ||||||||||||||||||||||||
517 | int iIdxCur = 0; /* First index cursor */ | - | ||||||||||||||||||||||||
518 | int ipkColumn = -1; /* Column that is the INTEGER PRIMARY KEY */ | - | ||||||||||||||||||||||||
519 | int endOfLoop; /* Label for the end of the insertion loop */ | - | ||||||||||||||||||||||||
520 | int srcTab = 0; /* Data comes from this temporary cursor if >=0 */ | - | ||||||||||||||||||||||||
521 | int addrInsTop = 0; /* Jump to label "D" */ | - | ||||||||||||||||||||||||
522 | int addrCont = 0; /* Top of insert loop. Label "C" in templates 3 and 4 */ | - | ||||||||||||||||||||||||
523 | SelectDest dest; /* Destination for SELECT on rhs of INSERT */ | - | ||||||||||||||||||||||||
524 | int iDb; /* Index of database holding TABLE */ | - | ||||||||||||||||||||||||
525 | u8 useTempTable = 0; /* Store SELECT results in intermediate table */ | - | ||||||||||||||||||||||||
526 | u8 appendFlag = 0; /* True if the insert is likely to be an append */ | - | ||||||||||||||||||||||||
527 | u8 withoutRowid; /* 0 for normal table. 1 for WITHOUT ROWID table */ | - | ||||||||||||||||||||||||
528 | u8 bIdListInOrder; /* True if IDLIST is in table order */ | - | ||||||||||||||||||||||||
529 | ExprList *pList = 0; /* List of VALUES() to be inserted */ | - | ||||||||||||||||||||||||
530 | - | |||||||||||||||||||||||||
531 | /* Register allocations */ | - | ||||||||||||||||||||||||
532 | int regFromSelect = 0;/* Base register for data coming from SELECT */ | - | ||||||||||||||||||||||||
533 | int regAutoinc = 0; /* Register holding the AUTOINCREMENT counter */ | - | ||||||||||||||||||||||||
534 | int regRowCount = 0; /* Memory cell used for the row counter */ | - | ||||||||||||||||||||||||
535 | int regIns; /* Block of regs holding rowid+data being inserted */ | - | ||||||||||||||||||||||||
536 | int regRowid; /* registers holding insert rowid */ | - | ||||||||||||||||||||||||
537 | int regData; /* register holding first column to insert */ | - | ||||||||||||||||||||||||
538 | int *aRegIdx = 0; /* One register allocated to each index */ | - | ||||||||||||||||||||||||
539 | - | |||||||||||||||||||||||||
540 | #ifndef SQLITE_OMIT_TRIGGER | - | ||||||||||||||||||||||||
541 | int isView; /* True if attempting to insert into a view */ | - | ||||||||||||||||||||||||
542 | Trigger *pTrigger; /* List of triggers on pTab, if required */ | - | ||||||||||||||||||||||||
543 | int tmask; /* Mask of trigger times */ | - | ||||||||||||||||||||||||
544 | #endif | - | ||||||||||||||||||||||||
545 | - | |||||||||||||||||||||||||
546 | db = pParse->db; | - | ||||||||||||||||||||||||
547 | if( pParse->nErr || db->mallocFailed ){
| 2-76515 | ||||||||||||||||||||||||
548 | goto insert_cleanup; executed 94 times by 1 test: goto insert_cleanup; Executed by:
| 94 | ||||||||||||||||||||||||
549 | } | - | ||||||||||||||||||||||||
550 | dest.iSDParm = 0; /* Suppress a harmless compiler warning */ | - | ||||||||||||||||||||||||
551 | - | |||||||||||||||||||||||||
552 | /* If the Select object is really just a simple VALUES() list with a | - | ||||||||||||||||||||||||
553 | ** single row (the common case) then keep that one row of values | - | ||||||||||||||||||||||||
554 | ** and discard the other (unused) parts of the pSelect object | - | ||||||||||||||||||||||||
555 | */ | - | ||||||||||||||||||||||||
556 | if( pSelect && (pSelect->selFlags & SF_Values)!=0 && pSelect->pPrior==0 ){
| 71-76352 | ||||||||||||||||||||||||
557 | pList = pSelect->pEList; | - | ||||||||||||||||||||||||
558 | pSelect->pEList = 0; | - | ||||||||||||||||||||||||
559 | sqlite3SelectDelete(db, pSelect); | - | ||||||||||||||||||||||||
560 | pSelect = 0; | - | ||||||||||||||||||||||||
561 | } executed 71464 times by 59 tests: end of block Executed by:
| 71464 | ||||||||||||||||||||||||
562 | - | |||||||||||||||||||||||||
563 | /* Locate the table into which we will be inserting new information. | - | ||||||||||||||||||||||||
564 | */ | - | ||||||||||||||||||||||||
565 | assert( pTabList->nSrc==1 ); | - | ||||||||||||||||||||||||
566 | pTab = sqlite3SrcListLookup(pParse, pTabList); | - | ||||||||||||||||||||||||
567 | if( pTab==0 ){
| 46-76377 | ||||||||||||||||||||||||
568 | goto insert_cleanup; executed 46 times by 6 tests: goto insert_cleanup; Executed by:
| 46 | ||||||||||||||||||||||||
569 | } | - | ||||||||||||||||||||||||
570 | iDb = sqlite3SchemaToIndex(db, pTab->pSchema); | - | ||||||||||||||||||||||||
571 | assert( iDb<db->nDb ); | - | ||||||||||||||||||||||||
572 | if( sqlite3AuthCheck(pParse, SQLITE_INSERT, pTab->zName, 0,
| 2-76375 | ||||||||||||||||||||||||
573 | db->aDb[iDb].zDbSName) ){
| 2-76375 | ||||||||||||||||||||||||
574 | goto insert_cleanup; executed 2 times by 1 test: goto insert_cleanup; Executed by:
| 2 | ||||||||||||||||||||||||
575 | } | - | ||||||||||||||||||||||||
576 | withoutRowid = !HasRowid(pTab); | - | ||||||||||||||||||||||||
577 | - | |||||||||||||||||||||||||
578 | /* Figure out if we have any triggers and if the table being | - | ||||||||||||||||||||||||
579 | ** inserted into is a view | - | ||||||||||||||||||||||||
580 | */ | - | ||||||||||||||||||||||||
581 | #ifndef SQLITE_OMIT_TRIGGER | - | ||||||||||||||||||||||||
582 | pTrigger = sqlite3TriggersExist(pParse, pTab, TK_INSERT, 0, &tmask); | - | ||||||||||||||||||||||||
583 | isView = pTab->pSelect!=0; | - | ||||||||||||||||||||||||
584 | #else | - | ||||||||||||||||||||||||
585 | # define pTrigger 0 | - | ||||||||||||||||||||||||
586 | # define tmask 0 | - | ||||||||||||||||||||||||
587 | # define isView 0 | - | ||||||||||||||||||||||||
588 | #endif | - | ||||||||||||||||||||||||
589 | #ifdef SQLITE_OMIT_VIEW | - | ||||||||||||||||||||||||
590 | # undef isView | - | ||||||||||||||||||||||||
591 | # define isView 0 | - | ||||||||||||||||||||||||
592 | #endif | - | ||||||||||||||||||||||||
593 | assert( (pTrigger && tmask) || (pTrigger==0 && tmask==0) ); | - | ||||||||||||||||||||||||
594 | - | |||||||||||||||||||||||||
595 | /* If pTab is really a view, make sure it has been initialized. | - | ||||||||||||||||||||||||
596 | ** ViewGetColumnNames() is a no-op if pTab is not a view. | - | ||||||||||||||||||||||||
597 | */ | - | ||||||||||||||||||||||||
598 | if( sqlite3ViewGetColumnNames(pParse, pTab) ){
| 3-76372 | ||||||||||||||||||||||||
599 | goto insert_cleanup; executed 3 times by 1 test: goto insert_cleanup; Executed by:
| 3 | ||||||||||||||||||||||||
600 | } | - | ||||||||||||||||||||||||
601 | - | |||||||||||||||||||||||||
602 | /* Cannot insert into a read-only table. | - | ||||||||||||||||||||||||
603 | */ | - | ||||||||||||||||||||||||
604 | if( sqlite3IsReadOnly(pParse, pTab, tmask) ){
| 4-76368 | ||||||||||||||||||||||||
605 | goto insert_cleanup; executed 4 times by 1 test: goto insert_cleanup; Executed by:
| 4 | ||||||||||||||||||||||||
606 | } | - | ||||||||||||||||||||||||
607 | - | |||||||||||||||||||||||||
608 | /* Allocate a VDBE | - | ||||||||||||||||||||||||
609 | */ | - | ||||||||||||||||||||||||
610 | v = sqlite3GetVdbe(pParse); | - | ||||||||||||||||||||||||
611 | if( v==0 ) goto insert_cleanup; never executed: goto insert_cleanup;
| 0-76368 | ||||||||||||||||||||||||
612 | if( pParse->nested==0 ) sqlite3VdbeCountChanges(v); executed 71110 times by 53 tests: sqlite3VdbeCountChanges(v); Executed by:
| 5258-71110 | ||||||||||||||||||||||||
613 | sqlite3BeginWriteOperation(pParse, pSelect || pTrigger, iDb); | - | ||||||||||||||||||||||||
614 | - | |||||||||||||||||||||||||
615 | #ifndef SQLITE_OMIT_XFER_OPT | - | ||||||||||||||||||||||||
616 | /* If the statement is of the form | - | ||||||||||||||||||||||||
617 | ** | - | ||||||||||||||||||||||||
618 | ** INSERT INTO <table1> SELECT * FROM <table2>; | - | ||||||||||||||||||||||||
619 | ** | - | ||||||||||||||||||||||||
620 | ** Then special optimizations can be applied that make the transfer | - | ||||||||||||||||||||||||
621 | ** very fast and which reduce fragmentation of indices. | - | ||||||||||||||||||||||||
622 | ** | - | ||||||||||||||||||||||||
623 | ** This is the 2nd template. | - | ||||||||||||||||||||||||
624 | */ | - | ||||||||||||||||||||||||
625 | if( pColumn==0 && xferOptimization(pParse, pTab, pSelect, onError, iDb) ){
| 1418-72382 | ||||||||||||||||||||||||
626 | assert( !pTrigger ); | - | ||||||||||||||||||||||||
627 | assert( pList==0 ); | - | ||||||||||||||||||||||||
628 | goto insert_end; executed 1418 times by 2 tests: goto insert_end; Executed by:
| 1418 | ||||||||||||||||||||||||
629 | } | - | ||||||||||||||||||||||||
630 | #endif /* SQLITE_OMIT_XFER_OPT */ | - | ||||||||||||||||||||||||
631 | - | |||||||||||||||||||||||||
632 | /* If this is an AUTOINCREMENT table, look up the sequence number in the | - | ||||||||||||||||||||||||
633 | ** sqlite_sequence table and store it in memory cell regAutoinc. | - | ||||||||||||||||||||||||
634 | */ | - | ||||||||||||||||||||||||
635 | regAutoinc = autoIncBegin(pParse, iDb, pTab); | - | ||||||||||||||||||||||||
636 | - | |||||||||||||||||||||||||
637 | /* Allocate registers for holding the rowid of the new row, | - | ||||||||||||||||||||||||
638 | ** the content of the new row, and the assembled row record. | - | ||||||||||||||||||||||||
639 | */ | - | ||||||||||||||||||||||||
640 | regRowid = regIns = pParse->nMem+1; | - | ||||||||||||||||||||||||
641 | pParse->nMem += pTab->nCol + 1; | - | ||||||||||||||||||||||||
642 | if( IsVirtual(pTab) ){
| 1001-73949 | ||||||||||||||||||||||||
643 | regRowid++; | - | ||||||||||||||||||||||||
644 | pParse->nMem++; | - | ||||||||||||||||||||||||
645 | } executed 1001 times by 1 test: end of block Executed by:
| 1001 | ||||||||||||||||||||||||
646 | regData = regRowid+1; | - | ||||||||||||||||||||||||
647 | - | |||||||||||||||||||||||||
648 | /* If the INSERT statement included an IDLIST term, then make sure | - | ||||||||||||||||||||||||
649 | ** all elements of the IDLIST really are columns of the table and | - | ||||||||||||||||||||||||
650 | ** remember the column indices. | - | ||||||||||||||||||||||||
651 | ** | - | ||||||||||||||||||||||||
652 | ** If the table has an INTEGER PRIMARY KEY column and that column | - | ||||||||||||||||||||||||
653 | ** is named in the IDLIST, then record in the ipkColumn variable | - | ||||||||||||||||||||||||
654 | ** the index into IDLIST of the primary key column. ipkColumn is | - | ||||||||||||||||||||||||
655 | ** the index of the primary key as it appears in IDLIST, not as | - | ||||||||||||||||||||||||
656 | ** is appears in the original table. (The index of the INTEGER | - | ||||||||||||||||||||||||
657 | ** PRIMARY KEY in the original table is pTab->iPKey.) | - | ||||||||||||||||||||||||
658 | */ | - | ||||||||||||||||||||||||
659 | bIdListInOrder = (pTab->tabFlags & TF_OOOHidden)==0; | - | ||||||||||||||||||||||||
660 | if( pColumn ){
| 3986-70964 | ||||||||||||||||||||||||
661 | for(i=0; i<pColumn->nId; i++){
| 3986-9720 | ||||||||||||||||||||||||
662 | pColumn->a[i].idx = -1; | - | ||||||||||||||||||||||||
663 | } executed 9720 times by 2 tests: end of block Executed by:
| 9720 | ||||||||||||||||||||||||
664 | for(i=0; i<pColumn->nId; i++){
| 3983-9720 | ||||||||||||||||||||||||
665 | for(j=0; j<pTab->nCol; j++){
| 399-25157 | ||||||||||||||||||||||||
666 | if( sqlite3StrICmp(pColumn->a[i].zName, pTab->aCol[j].zName)==0 ){
| 9321-15836 | ||||||||||||||||||||||||
667 | pColumn->a[i].idx = j; | - | ||||||||||||||||||||||||
668 | if( i!=j ) bIdListInOrder = 0; executed 4310 times by 1 test: bIdListInOrder = 0; Executed by:
| 4310-5011 | ||||||||||||||||||||||||
669 | if( j==pTab->iPKey ){
| 254-9067 | ||||||||||||||||||||||||
670 | ipkColumn = i; assert( !withoutRowid ); | - | ||||||||||||||||||||||||
671 | } executed 254 times by 1 test: end of block Executed by:
| 254 | ||||||||||||||||||||||||
672 | break; executed 9321 times by 2 tests: break; Executed by:
| 9321 | ||||||||||||||||||||||||
673 | } | - | ||||||||||||||||||||||||
674 | } executed 15836 times by 2 tests: end of block Executed by:
| 15836 | ||||||||||||||||||||||||
675 | if( j>=pTab->nCol ){
| 399-9321 | ||||||||||||||||||||||||
676 | if( sqlite3IsRowid(pColumn->a[i].zName) && !withoutRowid ){
| 0-396 | ||||||||||||||||||||||||
677 | ipkColumn = i; | - | ||||||||||||||||||||||||
678 | bIdListInOrder = 0; | - | ||||||||||||||||||||||||
679 | }else{ executed 396 times by 1 test: end of block Executed by:
| 396 | ||||||||||||||||||||||||
680 | sqlite3ErrorMsg(pParse, "table %S has no column named %s", | - | ||||||||||||||||||||||||
681 | pTabList, 0, pColumn->a[i].zName); | - | ||||||||||||||||||||||||
682 | pParse->checkSchema = 1; | - | ||||||||||||||||||||||||
683 | goto insert_cleanup; executed 3 times by 2 tests: goto insert_cleanup; Executed by:
| 3 | ||||||||||||||||||||||||
684 | } | - | ||||||||||||||||||||||||
685 | } | - | ||||||||||||||||||||||||
686 | } executed 9717 times by 2 tests: end of block Executed by:
| 9717 | ||||||||||||||||||||||||
687 | } executed 3983 times by 2 tests: end of block Executed by:
| 3983 | ||||||||||||||||||||||||
688 | - | |||||||||||||||||||||||||
689 | /* Figure out how many columns of data are supplied. If the data | - | ||||||||||||||||||||||||
690 | ** is coming from a SELECT statement, then generate a co-routine that | - | ||||||||||||||||||||||||
691 | ** produces a single row of the SELECT on each invocation. The | - | ||||||||||||||||||||||||
692 | ** co-routine is the common header to the 3rd and 4th templates. | - | ||||||||||||||||||||||||
693 | */ | - | ||||||||||||||||||||||||
694 | if( pSelect ){
| 3470-71477 | ||||||||||||||||||||||||
695 | /* Data is coming from a SELECT or from a multi-row VALUES clause. | - | ||||||||||||||||||||||||
696 | ** Generate a co-routine to run the SELECT. */ | - | ||||||||||||||||||||||||
697 | int regYield; /* Register holding co-routine entry-point */ | - | ||||||||||||||||||||||||
698 | int addrTop; /* Top of the co-routine */ | - | ||||||||||||||||||||||||
699 | int rc; /* Result code */ | - | ||||||||||||||||||||||||
700 | - | |||||||||||||||||||||||||
701 | regYield = ++pParse->nMem; | - | ||||||||||||||||||||||||
702 | addrTop = sqlite3VdbeCurrentAddr(v) + 1; | - | ||||||||||||||||||||||||
703 | sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, addrTop); | - | ||||||||||||||||||||||||
704 | sqlite3SelectDestInit(&dest, SRT_Coroutine, regYield); | - | ||||||||||||||||||||||||
705 | dest.iSdst = bIdListInOrder ? regData : 0;
| 83-3387 | ||||||||||||||||||||||||
706 | dest.nSdst = pTab->nCol; | - | ||||||||||||||||||||||||
707 | rc = sqlite3Select(pParse, pSelect, &dest); | - | ||||||||||||||||||||||||
708 | regFromSelect = dest.iSdst; | - | ||||||||||||||||||||||||
709 | if( rc || db->mallocFailed || pParse->nErr ) goto insert_cleanup; executed 8 times by 1 test: goto insert_cleanup; Executed by:
| 0-3463 | ||||||||||||||||||||||||
710 | sqlite3VdbeEndCoroutine(v, regYield); | - | ||||||||||||||||||||||||
711 | sqlite3VdbeJumpHere(v, addrTop - 1); /* label B: */ | - | ||||||||||||||||||||||||
712 | assert( pSelect->pEList ); | - | ||||||||||||||||||||||||
713 | nColumn = pSelect->pEList->nExpr; | - | ||||||||||||||||||||||||
714 | - | |||||||||||||||||||||||||
715 | /* Set useTempTable to TRUE if the result of the SELECT statement | - | ||||||||||||||||||||||||
716 | ** should be written into a temporary table (template 4). Set to | - | ||||||||||||||||||||||||
717 | ** FALSE if each output row of the SELECT can be written directly into | - | ||||||||||||||||||||||||
718 | ** the destination table (template 3). | - | ||||||||||||||||||||||||
719 | ** | - | ||||||||||||||||||||||||
720 | ** A temp table must be used if the table being updated is also one | - | ||||||||||||||||||||||||
721 | ** of the tables being read by the SELECT statement. Also use a | - | ||||||||||||||||||||||||
722 | ** temp table in the case of row triggers. | - | ||||||||||||||||||||||||
723 | */ | - | ||||||||||||||||||||||||
724 | if( pTrigger || readsTable(pParse, iDb, pTab) ){
| 30-3432 | ||||||||||||||||||||||||
725 | useTempTable = 1; | - | ||||||||||||||||||||||||
726 | } executed 1460 times by 5 tests: end of block Executed by:
| 1460 | ||||||||||||||||||||||||
727 | - | |||||||||||||||||||||||||
728 | if( useTempTable ){
| 1460-2002 | ||||||||||||||||||||||||
729 | /* Invoke the coroutine to extract information from the SELECT | - | ||||||||||||||||||||||||
730 | ** and add it to a transient table srcTab. The code generated | - | ||||||||||||||||||||||||
731 | ** here is from the 4th template: | - | ||||||||||||||||||||||||
732 | ** | - | ||||||||||||||||||||||||
733 | ** B: open temp table | - | ||||||||||||||||||||||||
734 | ** L: yield X, goto M at EOF | - | ||||||||||||||||||||||||
735 | ** insert row from R..R+n into temp table | - | ||||||||||||||||||||||||
736 | ** goto L | - | ||||||||||||||||||||||||
737 | ** M: ... | - | ||||||||||||||||||||||||
738 | */ | - | ||||||||||||||||||||||||
739 | int regRec; /* Register to hold packed record */ | - | ||||||||||||||||||||||||
740 | int regTempRowid; /* Register to hold temp table ROWID */ | - | ||||||||||||||||||||||||
741 | int addrL; /* Label "L" */ | - | ||||||||||||||||||||||||
742 | - | |||||||||||||||||||||||||
743 | srcTab = pParse->nTab++; | - | ||||||||||||||||||||||||
744 | regRec = sqlite3GetTempReg(pParse); | - | ||||||||||||||||||||||||
745 | regTempRowid = sqlite3GetTempReg(pParse); | - | ||||||||||||||||||||||||
746 | sqlite3VdbeAddOp2(v, OP_OpenEphemeral, srcTab, nColumn); | - | ||||||||||||||||||||||||
747 | addrL = sqlite3VdbeAddOp1(v, OP_Yield, dest.iSDParm); VdbeCoverage(v); | - | ||||||||||||||||||||||||
748 | sqlite3VdbeAddOp3(v, OP_MakeRecord, regFromSelect, nColumn, regRec); | - | ||||||||||||||||||||||||
749 | sqlite3VdbeAddOp2(v, OP_NewRowid, srcTab, regTempRowid); | - | ||||||||||||||||||||||||
750 | sqlite3VdbeAddOp3(v, OP_Insert, srcTab, regRec, regTempRowid); | - | ||||||||||||||||||||||||
751 | sqlite3VdbeGoto(v, addrL); | - | ||||||||||||||||||||||||
752 | sqlite3VdbeJumpHere(v, addrL); | - | ||||||||||||||||||||||||
753 | sqlite3ReleaseTempReg(pParse, regRec); | - | ||||||||||||||||||||||||
754 | sqlite3ReleaseTempReg(pParse, regTempRowid); | - | ||||||||||||||||||||||||
755 | } executed 1460 times by 5 tests: end of block Executed by:
| 1460 | ||||||||||||||||||||||||
756 | }else{ executed 3462 times by 6 tests: end of block Executed by:
| 3462 | ||||||||||||||||||||||||
757 | /* This is the case if the data for the INSERT is coming from a | - | ||||||||||||||||||||||||
758 | ** single-row VALUES clause | - | ||||||||||||||||||||||||
759 | */ | - | ||||||||||||||||||||||||
760 | NameContext sNC; | - | ||||||||||||||||||||||||
761 | memset(&sNC, 0, sizeof(sNC)); | - | ||||||||||||||||||||||||
762 | sNC.pParse = pParse; | - | ||||||||||||||||||||||||
763 | srcTab = -1; | - | ||||||||||||||||||||||||
764 | assert( useTempTable==0 ); | - | ||||||||||||||||||||||||
765 | if( pList ){
| 69-71408 | ||||||||||||||||||||||||
766 | nColumn = pList->nExpr; | - | ||||||||||||||||||||||||
767 | if( sqlite3ResolveExprListNames(&sNC, pList) ){
| 7-71401 | ||||||||||||||||||||||||
768 | goto insert_cleanup; executed 7 times by 1 test: goto insert_cleanup; Executed by:
| 7 | ||||||||||||||||||||||||
769 | } | - | ||||||||||||||||||||||||
770 | }else{ executed 71401 times by 59 tests: end of block Executed by:
| 71401 | ||||||||||||||||||||||||
771 | nColumn = 0; | - | ||||||||||||||||||||||||
772 | } executed 69 times by 1 test: end of block Executed by:
| 69 | ||||||||||||||||||||||||
773 | } | - | ||||||||||||||||||||||||
774 | - | |||||||||||||||||||||||||
775 | /* If there is no IDLIST term but the table has an integer primary | - | ||||||||||||||||||||||||
776 | ** key, the set the ipkColumn variable to the integer primary key | - | ||||||||||||||||||||||||
777 | ** column index in the original table definition. | - | ||||||||||||||||||||||||
778 | */ | - | ||||||||||||||||||||||||
779 | if( pColumn==0 && nColumn>0 ){
| 69-70957 | ||||||||||||||||||||||||
780 | ipkColumn = pTab->iPKey; | - | ||||||||||||||||||||||||
781 | } executed 70888 times by 61 tests: end of block Executed by:
| 70888 | ||||||||||||||||||||||||
782 | - | |||||||||||||||||||||||||
783 | /* Make sure the number of columns in the source data matches the number | - | ||||||||||||||||||||||||
784 | ** of columns to be inserted into the table. | - | ||||||||||||||||||||||||
785 | */ | - | ||||||||||||||||||||||||
786 | for(i=0; i<pTab->nCol; i++){
| 74932-307296 | ||||||||||||||||||||||||
787 | nHidden += (IsHiddenColumn(&pTab->aCol[i]) ? 1 : 0);
| 229-307067 | ||||||||||||||||||||||||
788 | } executed 307296 times by 61 tests: end of block Executed by:
| 307296 | ||||||||||||||||||||||||
789 | if( pColumn==0 && nColumn && nColumn!=(pTab->nCol-nHidden) ){
| 12-70957 | ||||||||||||||||||||||||
790 | sqlite3ErrorMsg(pParse, | - | ||||||||||||||||||||||||
791 | "table %S has %d columns but %d values were supplied", | - | ||||||||||||||||||||||||
792 | pTabList, 0, pTab->nCol-nHidden, nColumn); | - | ||||||||||||||||||||||||
793 | goto insert_cleanup; executed 12 times by 1 test: goto insert_cleanup; Executed by:
| 12 | ||||||||||||||||||||||||
794 | } | - | ||||||||||||||||||||||||
795 | if( pColumn!=0 && nColumn!=pColumn->nId ){
| 20-70945 | ||||||||||||||||||||||||
796 | sqlite3ErrorMsg(pParse, "%d values for %d columns", nColumn, pColumn->nId); | - | ||||||||||||||||||||||||
797 | goto insert_cleanup; executed 20 times by 1 test: goto insert_cleanup; Executed by:
| 20 | ||||||||||||||||||||||||
798 | } | - | ||||||||||||||||||||||||
799 | - | |||||||||||||||||||||||||
800 | /* Initialize the count of rows to be inserted | - | ||||||||||||||||||||||||
801 | */ | - | ||||||||||||||||||||||||
802 | if( (db->flags & SQLITE_CountRows)!=0
| 532-74368 | ||||||||||||||||||||||||
803 | && !pParse->nested
| 11-521 | ||||||||||||||||||||||||
804 | && !pParse->pTriggerTab
| 2-519 | ||||||||||||||||||||||||
805 | ){ | - | ||||||||||||||||||||||||
806 | regRowCount = ++pParse->nMem; | - | ||||||||||||||||||||||||
807 | sqlite3VdbeAddOp2(v, OP_Integer, 0, regRowCount); | - | ||||||||||||||||||||||||
808 | } executed 519 times by 1 test: end of block Executed by:
| 519 | ||||||||||||||||||||||||
809 | - | |||||||||||||||||||||||||
810 | /* If this is not a view, open the table and and all indices */ | - | ||||||||||||||||||||||||
811 | if( !isView ){
| 29-74871 | ||||||||||||||||||||||||
812 | int nIdx; | - | ||||||||||||||||||||||||
813 | nIdx = sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenWrite, 0, -1, 0, | - | ||||||||||||||||||||||||
814 | &iDataCur, &iIdxCur); | - | ||||||||||||||||||||||||
815 | aRegIdx = sqlite3DbMallocRawNN(db, sizeof(int)*(nIdx+1)); | - | ||||||||||||||||||||||||
816 | if( aRegIdx==0 ){
| 4-74867 | ||||||||||||||||||||||||
817 | goto insert_cleanup; executed 4 times by 1 test: goto insert_cleanup; Executed by:
| 4 | ||||||||||||||||||||||||
818 | } | - | ||||||||||||||||||||||||
819 | for(i=0, pIdx=pTab->pIndex; i<nIdx; pIdx=pIdx->pNext, i++){
| 19843-74867 | ||||||||||||||||||||||||
820 | assert( pIdx ); | - | ||||||||||||||||||||||||
821 | aRegIdx[i] = ++pParse->nMem; | - | ||||||||||||||||||||||||
822 | pParse->nMem += pIdx->nColumn; | - | ||||||||||||||||||||||||
823 | } executed 19843 times by 29 tests: end of block Executed by:
| 19843 | ||||||||||||||||||||||||
824 | } executed 74867 times by 61 tests: end of block Executed by:
| 74867 | ||||||||||||||||||||||||
825 | #ifndef SQLITE_OMIT_UPSERT | - | ||||||||||||||||||||||||
826 | if( pUpsert ){
| 154-74742 | ||||||||||||||||||||||||
827 | pTabList->a[0].iCursor = iDataCur; | - | ||||||||||||||||||||||||
828 | pUpsert->pUpsertSrc = pTabList; | - | ||||||||||||||||||||||||
829 | pUpsert->regData = regData; | - | ||||||||||||||||||||||||
830 | pUpsert->iDataCur = iDataCur; | - | ||||||||||||||||||||||||
831 | pUpsert->iIdxCur = iIdxCur; | - | ||||||||||||||||||||||||
832 | if( pUpsert->pUpsertTarget ){
| 18-136 | ||||||||||||||||||||||||
833 | sqlite3UpsertAnalyzeTarget(pParse, pTabList, pUpsert); | - | ||||||||||||||||||||||||
834 | } executed 136 times by 1 test: end of block Executed by:
| 136 | ||||||||||||||||||||||||
835 | } executed 154 times by 1 test: end of block Executed by:
| 154 | ||||||||||||||||||||||||
836 | #endif | - | ||||||||||||||||||||||||
837 | - | |||||||||||||||||||||||||
838 | - | |||||||||||||||||||||||||
839 | /* This is the top of the main insertion loop */ | - | ||||||||||||||||||||||||
840 | if( useTempTable ){
| 1457-73439 | ||||||||||||||||||||||||
841 | /* This block codes the top of loop only. The complete loop is the | - | ||||||||||||||||||||||||
842 | ** following pseudocode (template 4): | - | ||||||||||||||||||||||||
843 | ** | - | ||||||||||||||||||||||||
844 | ** rewind temp table, if empty goto D | - | ||||||||||||||||||||||||
845 | ** C: loop over rows of intermediate table | - | ||||||||||||||||||||||||
846 | ** transfer values form intermediate table into <table> | - | ||||||||||||||||||||||||
847 | ** end loop | - | ||||||||||||||||||||||||
848 | ** D: ... | - | ||||||||||||||||||||||||
849 | */ | - | ||||||||||||||||||||||||
850 | addrInsTop = sqlite3VdbeAddOp1(v, OP_Rewind, srcTab); VdbeCoverage(v); | - | ||||||||||||||||||||||||
851 | addrCont = sqlite3VdbeCurrentAddr(v); | - | ||||||||||||||||||||||||
852 | }else if( pSelect ){ executed 1457 times by 5 tests: end of block Executed by:
| 1457-71450 | ||||||||||||||||||||||||
853 | /* This block codes the top of loop only. The complete loop is the | - | ||||||||||||||||||||||||
854 | ** following pseudocode (template 3): | - | ||||||||||||||||||||||||
855 | ** | - | ||||||||||||||||||||||||
856 | ** C: yield X, at EOF goto D | - | ||||||||||||||||||||||||
857 | ** insert the select result into <table> from R..R+n | - | ||||||||||||||||||||||||
858 | ** goto C | - | ||||||||||||||||||||||||
859 | ** D: ... | - | ||||||||||||||||||||||||
860 | */ | - | ||||||||||||||||||||||||
861 | addrInsTop = addrCont = sqlite3VdbeAddOp1(v, OP_Yield, dest.iSDParm); | - | ||||||||||||||||||||||||
862 | VdbeCoverage(v); | - | ||||||||||||||||||||||||
863 | } executed 1989 times by 2 tests: end of block Executed by:
| 1989 | ||||||||||||||||||||||||
864 | - | |||||||||||||||||||||||||
865 | /* Run the BEFORE and INSTEAD OF triggers, if there are any | - | ||||||||||||||||||||||||
866 | */ | - | ||||||||||||||||||||||||
867 | endOfLoop = sqlite3VdbeMakeLabel(v); | - | ||||||||||||||||||||||||
868 | if( tmask & TRIGGER_BEFORE ){
| 185-74711 | ||||||||||||||||||||||||
869 | int regCols = sqlite3GetTempRange(pParse, pTab->nCol+1); | - | ||||||||||||||||||||||||
870 | - | |||||||||||||||||||||||||
871 | /* build the NEW.* reference row. Note that if there is an INTEGER | - | ||||||||||||||||||||||||
872 | ** PRIMARY KEY into which a NULL is being inserted, that NULL will be | - | ||||||||||||||||||||||||
873 | ** translated into a unique ID for the row. But on a BEFORE trigger, | - | ||||||||||||||||||||||||
874 | ** we do not know what the unique ID will be (because the insert has | - | ||||||||||||||||||||||||
875 | ** not happened yet) so we substitute a rowid of -1 | - | ||||||||||||||||||||||||
876 | */ | - | ||||||||||||||||||||||||
877 | if( ipkColumn<0 ){
| 13-172 | ||||||||||||||||||||||||
878 | sqlite3VdbeAddOp2(v, OP_Integer, -1, regCols); | - | ||||||||||||||||||||||||
879 | }else{ executed 172 times by 1 test: end of block Executed by:
| 172 | ||||||||||||||||||||||||
880 | int addr1; | - | ||||||||||||||||||||||||
881 | assert( !withoutRowid ); | - | ||||||||||||||||||||||||
882 | if( useTempTable ){
| 2-11 | ||||||||||||||||||||||||
883 | sqlite3VdbeAddOp3(v, OP_Column, srcTab, ipkColumn, regCols); | - | ||||||||||||||||||||||||
884 | }else{ executed 2 times by 1 test: end of block Executed by:
| 2 | ||||||||||||||||||||||||
885 | assert( pSelect==0 ); /* Otherwise useTempTable is true */ | - | ||||||||||||||||||||||||
886 | sqlite3ExprCode(pParse, pList->a[ipkColumn].pExpr, regCols); | - | ||||||||||||||||||||||||
887 | } executed 11 times by 1 test: end of block Executed by:
| 11 | ||||||||||||||||||||||||
888 | addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, regCols); VdbeCoverage(v); | - | ||||||||||||||||||||||||
889 | sqlite3VdbeAddOp2(v, OP_Integer, -1, regCols); | - | ||||||||||||||||||||||||
890 | sqlite3VdbeJumpHere(v, addr1); | - | ||||||||||||||||||||||||
891 | sqlite3VdbeAddOp1(v, OP_MustBeInt, regCols); VdbeCoverage(v); | - | ||||||||||||||||||||||||
892 | } executed 13 times by 1 test: end of block Executed by:
| 13 | ||||||||||||||||||||||||
893 | - | |||||||||||||||||||||||||
894 | /* Cannot have triggers on a virtual table. If it were possible, | - | ||||||||||||||||||||||||
895 | ** this block would have to account for hidden column. | - | ||||||||||||||||||||||||
896 | */ | - | ||||||||||||||||||||||||
897 | assert( !IsVirtual(pTab) ); | - | ||||||||||||||||||||||||
898 | - | |||||||||||||||||||||||||
899 | /* Create the new column data | - | ||||||||||||||||||||||||
900 | */ | - | ||||||||||||||||||||||||
901 | for(i=j=0; i<pTab->nCol; i++){
| 185-396 | ||||||||||||||||||||||||
902 | if( pColumn ){
| 65-331 | ||||||||||||||||||||||||
903 | for(j=0; j<pColumn->nId; j++){
| 26-99 | ||||||||||||||||||||||||
904 | if( pColumn->a[j].idx==i ) break; executed 39 times by 1 test: break; Executed by:
| 39-60 | ||||||||||||||||||||||||
905 | } executed 60 times by 1 test: end of block Executed by:
| 60 | ||||||||||||||||||||||||
906 | } executed 65 times by 1 test: end of block Executed by:
| 65 | ||||||||||||||||||||||||
907 | if( (!useTempTable && !pList) || (pColumn && j>=pColumn->nId)
| 14-368 | ||||||||||||||||||||||||
908 | || (pColumn==0 && IsOrdinaryHiddenColumn(&pTab->aCol[i])) ){ | - | ||||||||||||||||||||||||
909 | sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, regCols+i+1); | - | ||||||||||||||||||||||||
910 | }else if( useTempTable ){ executed 40 times by 1 test: end of block Executed by:
| 22-334 | ||||||||||||||||||||||||
911 | sqlite3VdbeAddOp3(v, OP_Column, srcTab, j, regCols+i+1); | - | ||||||||||||||||||||||||
912 | }else{ executed 22 times by 1 test: end of block Executed by:
| 22 | ||||||||||||||||||||||||
913 | assert( pSelect==0 ); /* Otherwise useTempTable is true */ | - | ||||||||||||||||||||||||
914 | sqlite3ExprCodeAndCache(pParse, pList->a[j].pExpr, regCols+i+1); | - | ||||||||||||||||||||||||
915 | } executed 334 times by 1 test: end of block Executed by:
| 334 | ||||||||||||||||||||||||
916 | if( pColumn==0 && !IsOrdinaryHiddenColumn(&pTab->aCol[i]) ) j++; executed 331 times by 1 test: j++; Executed by:
| 65-331 | ||||||||||||||||||||||||
917 | } executed 396 times by 1 test: end of block Executed by:
| 396 | ||||||||||||||||||||||||
918 | - | |||||||||||||||||||||||||
919 | /* If this is an INSERT on a view with an INSTEAD OF INSERT trigger, | - | ||||||||||||||||||||||||
920 | ** do not attempt any conversions before assembling the record. | - | ||||||||||||||||||||||||
921 | ** If this is a real table, attempt conversions as required by the | - | ||||||||||||||||||||||||
922 | ** table column affinities. | - | ||||||||||||||||||||||||
923 | */ | - | ||||||||||||||||||||||||
924 | if( !isView ){
| 29-156 | ||||||||||||||||||||||||
925 | sqlite3TableAffinity(v, pTab, regCols+1); | - | ||||||||||||||||||||||||
926 | } executed 156 times by 1 test: end of block Executed by:
| 156 | ||||||||||||||||||||||||
927 | - | |||||||||||||||||||||||||
928 | /* Fire BEFORE or INSTEAD OF triggers */ | - | ||||||||||||||||||||||||
929 | sqlite3CodeRowTrigger(pParse, pTrigger, TK_INSERT, 0, TRIGGER_BEFORE, | - | ||||||||||||||||||||||||
930 | pTab, regCols-pTab->nCol-1, onError, endOfLoop); | - | ||||||||||||||||||||||||
931 | - | |||||||||||||||||||||||||
932 | sqlite3ReleaseTempRange(pParse, regCols, pTab->nCol+1); | - | ||||||||||||||||||||||||
933 | } executed 185 times by 1 test: end of block Executed by:
| 185 | ||||||||||||||||||||||||
934 | - | |||||||||||||||||||||||||
935 | /* Compute the content of the next row to insert into a range of | - | ||||||||||||||||||||||||
936 | ** registers beginning at regIns. | - | ||||||||||||||||||||||||
937 | */ | - | ||||||||||||||||||||||||
938 | if( !isView ){
| 29-74867 | ||||||||||||||||||||||||
939 | if( IsVirtual(pTab) ){
| 1001-73866 | ||||||||||||||||||||||||
940 | /* The row that the VUpdate opcode will delete: none */ | - | ||||||||||||||||||||||||
941 | sqlite3VdbeAddOp2(v, OP_Null, 0, regIns); | - | ||||||||||||||||||||||||
942 | } executed 1001 times by 1 test: end of block Executed by:
| 1001 | ||||||||||||||||||||||||
943 | if( ipkColumn>=0 ){
| 2412-72455 | ||||||||||||||||||||||||
944 | if( useTempTable ){
| 144-2268 | ||||||||||||||||||||||||
945 | sqlite3VdbeAddOp3(v, OP_Column, srcTab, ipkColumn, regRowid); | - | ||||||||||||||||||||||||
946 | }else if( pSelect ){ executed 144 times by 1 test: end of block Executed by:
| 144-2015 | ||||||||||||||||||||||||
947 | sqlite3VdbeAddOp2(v, OP_Copy, regFromSelect+ipkColumn, regRowid); | - | ||||||||||||||||||||||||
948 | }else{ executed 253 times by 1 test: end of block Executed by:
| 253 | ||||||||||||||||||||||||
949 | VdbeOp *pOp; | - | ||||||||||||||||||||||||
950 | sqlite3ExprCode(pParse, pList->a[ipkColumn].pExpr, regRowid); | - | ||||||||||||||||||||||||
951 | pOp = sqlite3VdbeGetOp(v, -1); | - | ||||||||||||||||||||||||
952 | assert( pOp!=0 ); | - | ||||||||||||||||||||||||
953 | if( pOp->opcode==OP_Null && !IsVirtual(pTab) ){
| 1-1912 | ||||||||||||||||||||||||
954 | appendFlag = 1; | - | ||||||||||||||||||||||||
955 | pOp->opcode = OP_NewRowid; | - | ||||||||||||||||||||||||
956 | pOp->p1 = iDataCur; | - | ||||||||||||||||||||||||
957 | pOp->p2 = regRowid; | - | ||||||||||||||||||||||||
958 | pOp->p3 = regAutoinc; | - | ||||||||||||||||||||||||
959 | } executed 102 times by 1 test: end of block Executed by:
| 102 | ||||||||||||||||||||||||
960 | } executed 2015 times by 1 test: end of block Executed by:
| 2015 | ||||||||||||||||||||||||
961 | /* If the PRIMARY KEY expression is NULL, then use OP_NewRowid | - | ||||||||||||||||||||||||
962 | ** to generate a unique primary key value. | - | ||||||||||||||||||||||||
963 | */ | - | ||||||||||||||||||||||||
964 | if( !appendFlag ){
| 102-2310 | ||||||||||||||||||||||||
965 | int addr1; | - | ||||||||||||||||||||||||
966 | if( !IsVirtual(pTab) ){
| 22-2288 | ||||||||||||||||||||||||
967 | addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, regRowid); VdbeCoverage(v); | - | ||||||||||||||||||||||||
968 | sqlite3VdbeAddOp3(v, OP_NewRowid, iDataCur, regRowid, regAutoinc); | - | ||||||||||||||||||||||||
969 | sqlite3VdbeJumpHere(v, addr1); | - | ||||||||||||||||||||||||
970 | }else{ executed 2288 times by 1 test: end of block Executed by:
| 2288 | ||||||||||||||||||||||||
971 | addr1 = sqlite3VdbeCurrentAddr(v); | - | ||||||||||||||||||||||||
972 | sqlite3VdbeAddOp2(v, OP_IsNull, regRowid, addr1+2); VdbeCoverage(v); | - | ||||||||||||||||||||||||
973 | } executed 22 times by 1 test: end of block Executed by:
| 22 | ||||||||||||||||||||||||
974 | sqlite3VdbeAddOp1(v, OP_MustBeInt, regRowid); VdbeCoverage(v); | - | ||||||||||||||||||||||||
975 | } executed 2310 times by 1 test: end of block Executed by:
| 2310 | ||||||||||||||||||||||||
976 | }else if( IsVirtual(pTab) || withoutRowid ){ executed 2412 times by 1 test: end of block Executed by:
| 777-71476 | ||||||||||||||||||||||||
977 | sqlite3VdbeAddOp2(v, OP_Null, 0, regRowid); | - | ||||||||||||||||||||||||
978 | }else{ executed 1756 times by 1 test: end of block Executed by:
| 1756 | ||||||||||||||||||||||||
979 | sqlite3VdbeAddOp3(v, OP_NewRowid, iDataCur, regRowid, regAutoinc); | - | ||||||||||||||||||||||||
980 | appendFlag = 1; | - | ||||||||||||||||||||||||
981 | } executed 70699 times by 61 tests: end of block Executed by:
| 70699 | ||||||||||||||||||||||||
982 | autoIncStep(pParse, regAutoinc, regRowid); | - | ||||||||||||||||||||||||
983 | - | |||||||||||||||||||||||||
984 | /* Compute data for all columns of the new entry, beginning | - | ||||||||||||||||||||||||
985 | ** with the first column. | - | ||||||||||||||||||||||||
986 | */ | - | ||||||||||||||||||||||||
987 | nHidden = 0; | - | ||||||||||||||||||||||||
988 | for(i=0; i<pTab->nCol; i++){
| 74867-307134 | ||||||||||||||||||||||||
989 | int iRegStore = regRowid+1+i; | - | ||||||||||||||||||||||||
990 | if( i==pTab->iPKey ){
| 2730-304404 | ||||||||||||||||||||||||
991 | /* The value of the INTEGER PRIMARY KEY column is always a NULL. | - | ||||||||||||||||||||||||
992 | ** Whenever this column is read, the rowid will be substituted | - | ||||||||||||||||||||||||
993 | ** in its place. Hence, fill this column with a NULL to avoid | - | ||||||||||||||||||||||||
994 | ** taking up data space with information that will never be used. | - | ||||||||||||||||||||||||
995 | ** As there may be shallow copies of this value, make it a soft-NULL */ | - | ||||||||||||||||||||||||
996 | sqlite3VdbeAddOp1(v, OP_SoftNull, iRegStore); | - | ||||||||||||||||||||||||
997 | continue; executed 2730 times by 1 test: continue; Executed by:
| 2730 | ||||||||||||||||||||||||
998 | } | - | ||||||||||||||||||||||||
999 | if( pColumn==0 ){
| 10591-293813 | ||||||||||||||||||||||||
1000 | if( IsHiddenColumn(&pTab->aCol[i]) ){
| 4-293809 | ||||||||||||||||||||||||
1001 | j = -1; | - | ||||||||||||||||||||||||
1002 | nHidden++; | - | ||||||||||||||||||||||||
1003 | }else{ executed 4 times by 1 test: end of block Executed by:
| 4 | ||||||||||||||||||||||||
1004 | j = i - nHidden; | - | ||||||||||||||||||||||||
1005 | } executed 293809 times by 61 tests: end of block Executed by:
| 293809 | ||||||||||||||||||||||||
1006 | }else{ | - | ||||||||||||||||||||||||
1007 | for(j=0; j<pColumn->nId; j++){
| 1595-23168 | ||||||||||||||||||||||||
1008 | if( pColumn->a[j].idx==i ) break; executed 8996 times by 2 tests: break; Executed by:
| 8996-14172 | ||||||||||||||||||||||||
1009 | } executed 14172 times by 2 tests: end of block Executed by:
| 14172 | ||||||||||||||||||||||||
1010 | } executed 10591 times by 2 tests: end of block Executed by:
| 10591 | ||||||||||||||||||||||||
1011 | if( j<0 || nColumn==0 || (pColumn && j>=pColumn->nId) ){
| 4-304400 | ||||||||||||||||||||||||
1012 | sqlite3ExprCodeFactorable(pParse, pTab->aCol[i].pDflt, iRegStore); | - | ||||||||||||||||||||||||
1013 | }else if( useTempTable ){ executed 1759 times by 1 test: end of block Executed by:
| 1759-300264 | ||||||||||||||||||||||||
1014 | sqlite3VdbeAddOp3(v, OP_Column, srcTab, j, iRegStore); | - | ||||||||||||||||||||||||
1015 | }else if( pSelect ){ executed 2381 times by 5 tests: end of block Executed by:
| 2381-295248 | ||||||||||||||||||||||||
1016 | if( regFromSelect!=regData ){
| 109-4907 | ||||||||||||||||||||||||
1017 | sqlite3VdbeAddOp2(v, OP_SCopy, regFromSelect+j, iRegStore); | - | ||||||||||||||||||||||||
1018 | } executed 109 times by 1 test: end of block Executed by:
| 109 | ||||||||||||||||||||||||
1019 | }else{ executed 5016 times by 2 tests: end of block Executed by:
| 5016 | ||||||||||||||||||||||||
1020 | sqlite3ExprCode(pParse, pList->a[j].pExpr, iRegStore); | - | ||||||||||||||||||||||||
1021 | } executed 295248 times by 59 tests: end of block Executed by:
| 295248 | ||||||||||||||||||||||||
1022 | } | - | ||||||||||||||||||||||||
1023 | - | |||||||||||||||||||||||||
1024 | /* Generate code to check constraints and generate index keys and | - | ||||||||||||||||||||||||
1025 | ** do the insertion. | - | ||||||||||||||||||||||||
1026 | */ | - | ||||||||||||||||||||||||
1027 | #ifndef SQLITE_OMIT_VIRTUALTABLE | - | ||||||||||||||||||||||||
1028 | if( IsVirtual(pTab) ){
| 1001-73866 | ||||||||||||||||||||||||
1029 | const char *pVTab = (const char *)sqlite3GetVTable(db, pTab); | - | ||||||||||||||||||||||||
1030 | sqlite3VtabMakeWritable(pParse, pTab); | - | ||||||||||||||||||||||||
1031 | sqlite3VdbeAddOp4(v, OP_VUpdate, 1, pTab->nCol+2, regIns, pVTab, P4_VTAB); | - | ||||||||||||||||||||||||
1032 | sqlite3VdbeChangeP5(v, onError==OE_Default ? OE_Abort : onError); | - | ||||||||||||||||||||||||
1033 | sqlite3MayAbort(pParse); | - | ||||||||||||||||||||||||
1034 | }else executed 1001 times by 1 test: end of block Executed by:
| 1001 | ||||||||||||||||||||||||
1035 | #endif | - | ||||||||||||||||||||||||
1036 | { | - | ||||||||||||||||||||||||
1037 | int isReplace; /* Set to true if constraints may cause a replace */ | - | ||||||||||||||||||||||||
1038 | int bUseSeek; /* True to use OPFLAG_SEEKRESULT */ | - | ||||||||||||||||||||||||
1039 | sqlite3GenerateConstraintChecks(pParse, pTab, aRegIdx, iDataCur, iIdxCur, | - | ||||||||||||||||||||||||
1040 | regIns, 0, ipkColumn>=0, onError, endOfLoop, &isReplace, 0, pUpsert | - | ||||||||||||||||||||||||
1041 | ); | - | ||||||||||||||||||||||||
1042 | sqlite3FkCheck(pParse, pTab, 0, regIns, 0, 0); | - | ||||||||||||||||||||||||
1043 | - | |||||||||||||||||||||||||
1044 | /* Set the OPFLAG_USESEEKRESULT flag if either (a) there are no REPLACE | - | ||||||||||||||||||||||||
1045 | ** constraints or (b) there are no triggers and this table is not a | - | ||||||||||||||||||||||||
1046 | ** parent table in a foreign key constraint. It is safe to set the | - | ||||||||||||||||||||||||
1047 | ** flag in the second case as if any REPLACE constraint is hit, an | - | ||||||||||||||||||||||||
1048 | ** OP_Delete or OP_IdxDelete instruction will be executed on each | - | ||||||||||||||||||||||||
1049 | ** cursor that is disturbed. And these instructions both clear the | - | ||||||||||||||||||||||||
1050 | ** VdbeCursor.seekResult variable, disabling the OPFLAG_USESEEKRESULT | - | ||||||||||||||||||||||||
1051 | ** functionality. */ | - | ||||||||||||||||||||||||
1052 | bUseSeek = (isReplace==0 || (pTrigger==0 &&
| 4-73688 | ||||||||||||||||||||||||
1053 | ((db->flags & SQLITE_ForeignKeys)==0 || sqlite3FkReferences(pTab)==0)
| 11-145 | ||||||||||||||||||||||||
1054 | )); | - | ||||||||||||||||||||||||
1055 | sqlite3CompleteInsertion(pParse, pTab, iDataCur, iIdxCur, | - | ||||||||||||||||||||||||
1056 | regIns, aRegIdx, 0, appendFlag, bUseSeek | - | ||||||||||||||||||||||||
1057 | ); | - | ||||||||||||||||||||||||
1058 | } executed 73866 times by 61 tests: end of block Executed by:
| 73866 | ||||||||||||||||||||||||
1059 | } | - | ||||||||||||||||||||||||
1060 | - | |||||||||||||||||||||||||
1061 | /* Update the count of rows that are inserted | - | ||||||||||||||||||||||||
1062 | */ | - | ||||||||||||||||||||||||
1063 | if( regRowCount ){
| 519-74377 | ||||||||||||||||||||||||
1064 | sqlite3VdbeAddOp2(v, OP_AddImm, regRowCount, 1); | - | ||||||||||||||||||||||||
1065 | } executed 519 times by 1 test: end of block Executed by:
| 519 | ||||||||||||||||||||||||
1066 | - | |||||||||||||||||||||||||
1067 | if( pTrigger ){
| 466-74430 | ||||||||||||||||||||||||
1068 | /* Code AFTER triggers */ | - | ||||||||||||||||||||||||
1069 | sqlite3CodeRowTrigger(pParse, pTrigger, TK_INSERT, 0, TRIGGER_AFTER, | - | ||||||||||||||||||||||||
1070 | pTab, regData-2-pTab->nCol, onError, endOfLoop); | - | ||||||||||||||||||||||||
1071 | } executed 466 times by 1 test: end of block Executed by:
| 466 | ||||||||||||||||||||||||
1072 | - | |||||||||||||||||||||||||
1073 | /* The bottom of the main insertion loop, if the data source | - | ||||||||||||||||||||||||
1074 | ** is a SELECT statement. | - | ||||||||||||||||||||||||
1075 | */ | - | ||||||||||||||||||||||||
1076 | sqlite3VdbeResolveLabel(v, endOfLoop); | - | ||||||||||||||||||||||||
1077 | if( useTempTable ){
| 1457-73439 | ||||||||||||||||||||||||
1078 | sqlite3VdbeAddOp2(v, OP_Next, srcTab, addrCont); VdbeCoverage(v); | - | ||||||||||||||||||||||||
1079 | sqlite3VdbeJumpHere(v, addrInsTop); | - | ||||||||||||||||||||||||
1080 | sqlite3VdbeAddOp1(v, OP_Close, srcTab); | - | ||||||||||||||||||||||||
1081 | }else if( pSelect ){ executed 1457 times by 5 tests: end of block Executed by:
| 1457-71450 | ||||||||||||||||||||||||
1082 | sqlite3VdbeGoto(v, addrCont); | - | ||||||||||||||||||||||||
1083 | sqlite3VdbeJumpHere(v, addrInsTop); | - | ||||||||||||||||||||||||
1084 | } executed 1989 times by 2 tests: end of block Executed by:
| 1989 | ||||||||||||||||||||||||
1085 | - | |||||||||||||||||||||||||
1086 | insert_end: code before this statement executed 74896 times by 61 tests: insert_end: Executed by:
| 74896 | ||||||||||||||||||||||||
1087 | /* Update the sqlite_sequence table by storing the content of the | - | ||||||||||||||||||||||||
1088 | ** maximum rowid counter values recorded while inserting into | - | ||||||||||||||||||||||||
1089 | ** autoincrement tables. | - | ||||||||||||||||||||||||
1090 | */ | - | ||||||||||||||||||||||||
1091 | if( pParse->nested==0 && pParse->pTriggerTab==0 ){
| 5258-71056 | ||||||||||||||||||||||||
1092 | sqlite3AutoincrementEnd(pParse); | - | ||||||||||||||||||||||||
1093 | } executed 64750 times by 53 tests: end of block Executed by:
| 64750 | ||||||||||||||||||||||||
1094 | - | |||||||||||||||||||||||||
1095 | /* | - | ||||||||||||||||||||||||
1096 | ** Return the number of rows inserted. If this routine is | - | ||||||||||||||||||||||||
1097 | ** generating code because of a call to sqlite3NestedParse(), do not | - | ||||||||||||||||||||||||
1098 | ** invoke the callback function. | - | ||||||||||||||||||||||||
1099 | */ | - | ||||||||||||||||||||||||
1100 | if( regRowCount ){
| 519-75795 | ||||||||||||||||||||||||
1101 | sqlite3VdbeAddOp2(v, OP_ResultRow, regRowCount, 1); | - | ||||||||||||||||||||||||
1102 | sqlite3VdbeSetNumCols(v, 1); | - | ||||||||||||||||||||||||
1103 | sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows inserted", SQLITE_STATIC); | - | ||||||||||||||||||||||||
1104 | } executed 519 times by 1 test: end of block Executed by:
| 519 | ||||||||||||||||||||||||
1105 | - | |||||||||||||||||||||||||
1106 | insert_cleanup: code before this statement executed 76314 times by 61 tests: insert_cleanup: Executed by:
| 76314 | ||||||||||||||||||||||||
1107 | sqlite3SrcListDelete(db, pTabList); | - | ||||||||||||||||||||||||
1108 | sqlite3ExprListDelete(db, pList); | - | ||||||||||||||||||||||||
1109 | sqlite3UpsertDelete(db, pUpsert); | - | ||||||||||||||||||||||||
1110 | sqlite3SelectDelete(db, pSelect); | - | ||||||||||||||||||||||||
1111 | sqlite3IdListDelete(db, pColumn); | - | ||||||||||||||||||||||||
1112 | sqlite3DbFree(db, aRegIdx); | - | ||||||||||||||||||||||||
1113 | } executed 76517 times by 61 tests: end of block Executed by:
| 76517 | ||||||||||||||||||||||||
1114 | - | |||||||||||||||||||||||||
1115 | /* Make sure "isView" and other macros defined above are undefined. Otherwise | - | ||||||||||||||||||||||||
1116 | ** they may interfere with compilation of other functions in this file | - | ||||||||||||||||||||||||
1117 | ** (or in another file, if this file becomes part of the amalgamation). */ | - | ||||||||||||||||||||||||
1118 | #ifdef isView | - | ||||||||||||||||||||||||
1119 | #undef isView | - | ||||||||||||||||||||||||
1120 | #endif | - | ||||||||||||||||||||||||
1121 | #ifdef pTrigger | - | ||||||||||||||||||||||||
1122 | #undef pTrigger | - | ||||||||||||||||||||||||
1123 | #endif | - | ||||||||||||||||||||||||
1124 | #ifdef tmask | - | ||||||||||||||||||||||||
1125 | #undef tmask | - | ||||||||||||||||||||||||
1126 | #endif | - | ||||||||||||||||||||||||
1127 | - | |||||||||||||||||||||||||
1128 | /* | - | ||||||||||||||||||||||||
1129 | ** Meanings of bits in of pWalker->eCode for | - | ||||||||||||||||||||||||
1130 | ** sqlite3ExprReferencesUpdatedColumn() | - | ||||||||||||||||||||||||
1131 | */ | - | ||||||||||||||||||||||||
1132 | #define CKCNSTRNT_COLUMN 0x01 /* CHECK constraint uses a changing column */ | - | ||||||||||||||||||||||||
1133 | #define CKCNSTRNT_ROWID 0x02 /* CHECK constraint references the ROWID */ | - | ||||||||||||||||||||||||
1134 | - | |||||||||||||||||||||||||
1135 | /* This is the Walker callback from sqlite3ExprReferencesUpdatedColumn(). | - | ||||||||||||||||||||||||
1136 | * Set bit 0x01 of pWalker->eCode if pWalker->eCode to 0 and if this | - | ||||||||||||||||||||||||
1137 | ** expression node references any of the | - | ||||||||||||||||||||||||
1138 | ** columns that are being modifed by an UPDATE statement. | - | ||||||||||||||||||||||||
1139 | */ | - | ||||||||||||||||||||||||
1140 | static int checkConstraintExprNode(Walker *pWalker, Expr *pExpr){ | - | ||||||||||||||||||||||||
1141 | if( pExpr->op==TK_COLUMN ){
| 154-239 | ||||||||||||||||||||||||
1142 | assert( pExpr->iColumn>=0 || pExpr->iColumn==-1 ); | - | ||||||||||||||||||||||||
1143 | if( pExpr->iColumn>=0 ){
| 5-149 | ||||||||||||||||||||||||
1144 | if( pWalker->u.aiCol[pExpr->iColumn]>=0 ){
| 59-90 | ||||||||||||||||||||||||
1145 | pWalker->eCode |= CKCNSTRNT_COLUMN; | - | ||||||||||||||||||||||||
1146 | } executed 90 times by 1 test: end of block Executed by:
| 90 | ||||||||||||||||||||||||
1147 | }else{ executed 149 times by 1 test: end of block Executed by:
| 149 | ||||||||||||||||||||||||
1148 | pWalker->eCode |= CKCNSTRNT_ROWID; | - | ||||||||||||||||||||||||
1149 | } executed 5 times by 1 test: end of block Executed by:
| 5 | ||||||||||||||||||||||||
1150 | } | - | ||||||||||||||||||||||||
1151 | return WRC_Continue; executed 393 times by 1 test: return 0; Executed by:
| 393 | ||||||||||||||||||||||||
1152 | } | - | ||||||||||||||||||||||||
1153 | - | |||||||||||||||||||||||||
1154 | /* | - | ||||||||||||||||||||||||
1155 | ** pExpr is a CHECK constraint on a row that is being UPDATE-ed. The | - | ||||||||||||||||||||||||
1156 | ** only columns that are modified by the UPDATE are those for which | - | ||||||||||||||||||||||||
1157 | ** aiChng[i]>=0, and also the ROWID is modified if chngRowid is true. | - | ||||||||||||||||||||||||
1158 | ** | - | ||||||||||||||||||||||||
1159 | ** Return true if CHECK constraint pExpr uses any of the | - | ||||||||||||||||||||||||
1160 | ** changing columns (or the rowid if it is changing). In other words, | - | ||||||||||||||||||||||||
1161 | ** return true if this CHECK constraint must be validated for | - | ||||||||||||||||||||||||
1162 | ** the new row in the UPDATE statement. | - | ||||||||||||||||||||||||
1163 | ** | - | ||||||||||||||||||||||||
1164 | ** 2018-09-15: pExpr might also be an expression for an index-on-expressions. | - | ||||||||||||||||||||||||
1165 | ** The operation of this routine is the same - return true if an only if | - | ||||||||||||||||||||||||
1166 | ** the expression uses one or more of columns identified by the second and | - | ||||||||||||||||||||||||
1167 | ** third arguments. | - | ||||||||||||||||||||||||
1168 | */ | - | ||||||||||||||||||||||||
1169 | int sqlite3ExprReferencesUpdatedColumn( | - | ||||||||||||||||||||||||
1170 | Expr *pExpr, /* The expression to be checked */ | - | ||||||||||||||||||||||||
1171 | int *aiChng, /* aiChng[x]>=0 if column x changed by the UPDATE */ | - | ||||||||||||||||||||||||
1172 | int chngRowid /* True if UPDATE changes the rowid */ | - | ||||||||||||||||||||||||
1173 | ){ | - | ||||||||||||||||||||||||
1174 | Walker w; | - | ||||||||||||||||||||||||
1175 | memset(&w, 0, sizeof(w)); | - | ||||||||||||||||||||||||
1176 | w.eCode = 0; | - | ||||||||||||||||||||||||
1177 | w.xExprCallback = checkConstraintExprNode; | - | ||||||||||||||||||||||||
1178 | w.u.aiCol = aiChng; | - | ||||||||||||||||||||||||
1179 | sqlite3WalkExpr(&w, pExpr); | - | ||||||||||||||||||||||||
1180 | if( !chngRowid ){
| 0-85 | ||||||||||||||||||||||||
1181 | testcase( (w.eCode & CKCNSTRNT_ROWID)!=0 ); | - | ||||||||||||||||||||||||
1182 | w.eCode &= ~CKCNSTRNT_ROWID; | - | ||||||||||||||||||||||||
1183 | } executed 85 times by 1 test: end of block Executed by:
| 85 | ||||||||||||||||||||||||
1184 | testcase( w.eCode==0 ); | - | ||||||||||||||||||||||||
1185 | testcase( w.eCode==CKCNSTRNT_COLUMN ); | - | ||||||||||||||||||||||||
1186 | testcase( w.eCode==CKCNSTRNT_ROWID ); | - | ||||||||||||||||||||||||
1187 | testcase( w.eCode==(CKCNSTRNT_ROWID|CKCNSTRNT_COLUMN) ); | - | ||||||||||||||||||||||||
1188 | return w.eCode!=0; executed 85 times by 1 test: return w.eCode!=0; Executed by:
| 85 | ||||||||||||||||||||||||
1189 | } | - | ||||||||||||||||||||||||
1190 | - | |||||||||||||||||||||||||
1191 | /* | - | ||||||||||||||||||||||||
1192 | ** Generate code to do constraint checks prior to an INSERT or an UPDATE | - | ||||||||||||||||||||||||
1193 | ** on table pTab. | - | ||||||||||||||||||||||||
1194 | ** | - | ||||||||||||||||||||||||
1195 | ** The regNewData parameter is the first register in a range that contains | - | ||||||||||||||||||||||||
1196 | ** the data to be inserted or the data after the update. There will be | - | ||||||||||||||||||||||||
1197 | ** pTab->nCol+1 registers in this range. The first register (the one | - | ||||||||||||||||||||||||
1198 | ** that regNewData points to) will contain the new rowid, or NULL in the | - | ||||||||||||||||||||||||
1199 | ** case of a WITHOUT ROWID table. The second register in the range will | - | ||||||||||||||||||||||||
1200 | ** contain the content of the first table column. The third register will | - | ||||||||||||||||||||||||
1201 | ** contain the content of the second table column. And so forth. | - | ||||||||||||||||||||||||
1202 | ** | - | ||||||||||||||||||||||||
1203 | ** The regOldData parameter is similar to regNewData except that it contains | - | ||||||||||||||||||||||||
1204 | ** the data prior to an UPDATE rather than afterwards. regOldData is zero | - | ||||||||||||||||||||||||
1205 | ** for an INSERT. This routine can distinguish between UPDATE and INSERT by | - | ||||||||||||||||||||||||
1206 | ** checking regOldData for zero. | - | ||||||||||||||||||||||||
1207 | ** | - | ||||||||||||||||||||||||
1208 | ** For an UPDATE, the pkChng boolean is true if the true primary key (the | - | ||||||||||||||||||||||||
1209 | ** rowid for a normal table or the PRIMARY KEY for a WITHOUT ROWID table) | - | ||||||||||||||||||||||||
1210 | ** might be modified by the UPDATE. If pkChng is false, then the key of | - | ||||||||||||||||||||||||
1211 | ** the iDataCur content table is guaranteed to be unchanged by the UPDATE. | - | ||||||||||||||||||||||||
1212 | ** | - | ||||||||||||||||||||||||
1213 | ** For an INSERT, the pkChng boolean indicates whether or not the rowid | - | ||||||||||||||||||||||||
1214 | ** was explicitly specified as part of the INSERT statement. If pkChng | - | ||||||||||||||||||||||||
1215 | ** is zero, it means that the either rowid is computed automatically or | - | ||||||||||||||||||||||||
1216 | ** that the table is a WITHOUT ROWID table and has no rowid. On an INSERT, | - | ||||||||||||||||||||||||
1217 | ** pkChng will only be true if the INSERT statement provides an integer | - | ||||||||||||||||||||||||
1218 | ** value for either the rowid column or its INTEGER PRIMARY KEY alias. | - | ||||||||||||||||||||||||
1219 | ** | - | ||||||||||||||||||||||||
1220 | ** The code generated by this routine will store new index entries into | - | ||||||||||||||||||||||||
1221 | ** registers identified by aRegIdx[]. No index entry is created for | - | ||||||||||||||||||||||||
1222 | ** indices where aRegIdx[i]==0. The order of indices in aRegIdx[] is | - | ||||||||||||||||||||||||
1223 | ** the same as the order of indices on the linked list of indices | - | ||||||||||||||||||||||||
1224 | ** at pTab->pIndex. | - | ||||||||||||||||||||||||
1225 | ** | - | ||||||||||||||||||||||||
1226 | ** The caller must have already opened writeable cursors on the main | - | ||||||||||||||||||||||||
1227 | ** table and all applicable indices (that is to say, all indices for which | - | ||||||||||||||||||||||||
1228 | ** aRegIdx[] is not zero). iDataCur is the cursor for the main table when | - | ||||||||||||||||||||||||
1229 | ** inserting or updating a rowid table, or the cursor for the PRIMARY KEY | - | ||||||||||||||||||||||||
1230 | ** index when operating on a WITHOUT ROWID table. iIdxCur is the cursor | - | ||||||||||||||||||||||||
1231 | ** for the first index in the pTab->pIndex list. Cursors for other indices | - | ||||||||||||||||||||||||
1232 | ** are at iIdxCur+N for the N-th element of the pTab->pIndex list. | - | ||||||||||||||||||||||||
1233 | ** | - | ||||||||||||||||||||||||
1234 | ** This routine also generates code to check constraints. NOT NULL, | - | ||||||||||||||||||||||||
1235 | ** CHECK, and UNIQUE constraints are all checked. If a constraint fails, | - | ||||||||||||||||||||||||
1236 | ** then the appropriate action is performed. There are five possible | - | ||||||||||||||||||||||||
1237 | ** actions: ROLLBACK, ABORT, FAIL, REPLACE, and IGNORE. | - | ||||||||||||||||||||||||
1238 | ** | - | ||||||||||||||||||||||||
1239 | ** Constraint type Action What Happens | - | ||||||||||||||||||||||||
1240 | ** --------------- ---------- ---------------------------------------- | - | ||||||||||||||||||||||||
1241 | ** any ROLLBACK The current transaction is rolled back and | - | ||||||||||||||||||||||||
1242 | ** sqlite3_step() returns immediately with a | - | ||||||||||||||||||||||||
1243 | ** return code of SQLITE_CONSTRAINT. | - | ||||||||||||||||||||||||
1244 | ** | - | ||||||||||||||||||||||||
1245 | ** any ABORT Back out changes from the current command | - | ||||||||||||||||||||||||
1246 | ** only (do not do a complete rollback) then | - | ||||||||||||||||||||||||
1247 | ** cause sqlite3_step() to return immediately | - | ||||||||||||||||||||||||
1248 | ** with SQLITE_CONSTRAINT. | - | ||||||||||||||||||||||||
1249 | ** | - | ||||||||||||||||||||||||
1250 | ** any FAIL Sqlite3_step() returns immediately with a | - | ||||||||||||||||||||||||
1251 | ** return code of SQLITE_CONSTRAINT. The | - | ||||||||||||||||||||||||
1252 | ** transaction is not rolled back and any | - | ||||||||||||||||||||||||
1253 | ** changes to prior rows are retained. | - | ||||||||||||||||||||||||
1254 | ** | - | ||||||||||||||||||||||||
1255 | ** any IGNORE The attempt in insert or update the current | - | ||||||||||||||||||||||||
1256 | ** row is skipped, without throwing an error. | - | ||||||||||||||||||||||||
1257 | ** Processing continues with the next row. | - | ||||||||||||||||||||||||
1258 | ** (There is an immediate jump to ignoreDest.) | - | ||||||||||||||||||||||||
1259 | ** | - | ||||||||||||||||||||||||
1260 | ** NOT NULL REPLACE The NULL value is replace by the default | - | ||||||||||||||||||||||||
1261 | ** value for that column. If the default value | - | ||||||||||||||||||||||||
1262 | ** is NULL, the action is the same as ABORT. | - | ||||||||||||||||||||||||
1263 | ** | - | ||||||||||||||||||||||||
1264 | ** UNIQUE REPLACE The other row that conflicts with the row | - | ||||||||||||||||||||||||
1265 | ** being inserted is removed. | - | ||||||||||||||||||||||||
1266 | ** | - | ||||||||||||||||||||||||
1267 | ** CHECK REPLACE Illegal. The results in an exception. | - | ||||||||||||||||||||||||
1268 | ** | - | ||||||||||||||||||||||||
1269 | ** Which action to take is determined by the overrideError parameter. | - | ||||||||||||||||||||||||
1270 | ** Or if overrideError==OE_Default, then the pParse->onError parameter | - | ||||||||||||||||||||||||
1271 | ** is used. Or if pParse->onError==OE_Default then the onError value | - | ||||||||||||||||||||||||
1272 | ** for the constraint is used. | - | ||||||||||||||||||||||||
1273 | */ | - | ||||||||||||||||||||||||
1274 | void sqlite3GenerateConstraintChecks( | - | ||||||||||||||||||||||||
1275 | Parse *pParse, /* The parser context */ | - | ||||||||||||||||||||||||
1276 | Table *pTab, /* The table being inserted or updated */ | - | ||||||||||||||||||||||||
1277 | int *aRegIdx, /* Use register aRegIdx[i] for index i. 0 for unused */ | - | ||||||||||||||||||||||||
1278 | int iDataCur, /* Canonical data cursor (main table or PK index) */ | - | ||||||||||||||||||||||||
1279 | int iIdxCur, /* First index cursor */ | - | ||||||||||||||||||||||||
1280 | int regNewData, /* First register in a range holding values to insert */ | - | ||||||||||||||||||||||||
1281 | int regOldData, /* Previous content. 0 for INSERTs */ | - | ||||||||||||||||||||||||
1282 | u8 pkChng, /* Non-zero if the rowid or PRIMARY KEY changed */ | - | ||||||||||||||||||||||||
1283 | u8 overrideError, /* Override onError to this if not OE_Default */ | - | ||||||||||||||||||||||||
1284 | int ignoreDest, /* Jump to this label on an OE_Ignore resolution */ | - | ||||||||||||||||||||||||
1285 | int *pbMayReplace, /* OUT: Set to true if constraint may cause a replace */ | - | ||||||||||||||||||||||||
1286 | int *aiChng, /* column i is unchanged if aiChng[i]<0 */ | - | ||||||||||||||||||||||||
1287 | Upsert *pUpsert /* ON CONFLICT clauses, if any. NULL otherwise */ | - | ||||||||||||||||||||||||
1288 | ){ | - | ||||||||||||||||||||||||
1289 | Vdbe *v; /* VDBE under constrution */ | - | ||||||||||||||||||||||||
1290 | Index *pIdx; /* Pointer to one of the indices */ | - | ||||||||||||||||||||||||
1291 | Index *pPk = 0; /* The PRIMARY KEY index */ | - | ||||||||||||||||||||||||
1292 | sqlite3 *db; /* Database connection */ | - | ||||||||||||||||||||||||
1293 | int i; /* loop counter */ | - | ||||||||||||||||||||||||
1294 | int ix; /* Index loop counter */ | - | ||||||||||||||||||||||||
1295 | int nCol; /* Number of columns */ | - | ||||||||||||||||||||||||
1296 | int onError; /* Conflict resolution strategy */ | - | ||||||||||||||||||||||||
1297 | int addr1; /* Address of jump instruction */ | - | ||||||||||||||||||||||||
1298 | int seenReplace = 0; /* True if REPLACE is used to resolve INT PK conflict */ | - | ||||||||||||||||||||||||
1299 | int nPkField; /* Number of fields in PRIMARY KEY. 1 for ROWID tables */ | - | ||||||||||||||||||||||||
1300 | Index *pUpIdx = 0; /* Index to which to apply the upsert */ | - | ||||||||||||||||||||||||
1301 | u8 isUpdate; /* True if this is an UPDATE operation */ | - | ||||||||||||||||||||||||
1302 | u8 bAffinityDone = 0; /* True if the OP_Affinity operation has been run */ | - | ||||||||||||||||||||||||
1303 | int upsertBypass = 0; /* Address of Goto to bypass upsert subroutine */ | - | ||||||||||||||||||||||||
1304 | int upsertJump = 0; /* Address of Goto that jumps into upsert subroutine */ | - | ||||||||||||||||||||||||
1305 | int ipkTop = 0; /* Top of the IPK uniqueness check */ | - | ||||||||||||||||||||||||
1306 | int ipkBottom = 0; /* OP_Goto at the end of the IPK uniqueness check */ | - | ||||||||||||||||||||||||
1307 | - | |||||||||||||||||||||||||
1308 | isUpdate = regOldData!=0; | - | ||||||||||||||||||||||||
1309 | db = pParse->db; | - | ||||||||||||||||||||||||
1310 | v = sqlite3GetVdbe(pParse); | - | ||||||||||||||||||||||||
1311 | assert( v!=0 ); | - | ||||||||||||||||||||||||
1312 | assert( pTab->pSelect==0 ); /* This table is not a VIEW */ | - | ||||||||||||||||||||||||
1313 | nCol = pTab->nCol; | - | ||||||||||||||||||||||||
1314 | - | |||||||||||||||||||||||||
1315 | /* pPk is the PRIMARY KEY index for WITHOUT ROWID tables and NULL for | - | ||||||||||||||||||||||||
1316 | ** normal rowid tables. nPkField is the number of key fields in the | - | ||||||||||||||||||||||||
1317 | ** pPk index or 1 for a rowid table. In other words, nPkField is the | - | ||||||||||||||||||||||||
1318 | ** number of fields in the true primary key of the table. */ | - | ||||||||||||||||||||||||
1319 | if( HasRowid(pTab) ){
| 1058-105707 | ||||||||||||||||||||||||
1320 | pPk = 0; | - | ||||||||||||||||||||||||
1321 | nPkField = 1; | - | ||||||||||||||||||||||||
1322 | }else{ executed 105707 times by 406 tests: end of block Executed by:
| 105707 | ||||||||||||||||||||||||
1323 | pPk = sqlite3PrimaryKeyIndex(pTab); | - | ||||||||||||||||||||||||
1324 | nPkField = pPk->nKeyCol; | - | ||||||||||||||||||||||||
1325 | } executed 1058 times by 1 test: end of block Executed by:
| 1058 | ||||||||||||||||||||||||
1326 | - | |||||||||||||||||||||||||
1327 | /* Record that this module has started */ | - | ||||||||||||||||||||||||
1328 | VdbeModuleComment((v, "BEGIN: GenCnstCks(%d,%d,%d,%d,%d)", | - | ||||||||||||||||||||||||
1329 | iDataCur, iIdxCur, regNewData, regOldData, pkChng)); | - | ||||||||||||||||||||||||
1330 | - | |||||||||||||||||||||||||
1331 | /* Test all NOT NULL constraints. | - | ||||||||||||||||||||||||
1332 | */ | - | ||||||||||||||||||||||||
1333 | for(i=0; i<nCol; i++){
| 106765-467904 | ||||||||||||||||||||||||
1334 | if( i==pTab->iPKey ){
| 3315-464589 | ||||||||||||||||||||||||
1335 | continue; /* ROWID is never NULL */ executed 3315 times by 333 tests: continue; Executed by:
| 3315 | ||||||||||||||||||||||||
1336 | } | - | ||||||||||||||||||||||||
1337 | if( aiChng && aiChng[i]<0 ){
| 33889-302640 | ||||||||||||||||||||||||
1338 | /* Don't bother checking for NOT NULL on columns that do not change */ | - | ||||||||||||||||||||||||
1339 | continue; executed 33889 times by 10 tests: continue; Executed by:
| 33889 | ||||||||||||||||||||||||
1340 | } | - | ||||||||||||||||||||||||
1341 | onError = pTab->aCol[i].notNull; | - | ||||||||||||||||||||||||
1342 | if( onError==OE_None ) continue; /* This column is allowed to be NULL */ executed 423878 times by 406 tests: continue; Executed by:
| 6822-423878 | ||||||||||||||||||||||||
1343 | if( overrideError!=OE_Default ){
| 338-6484 | ||||||||||||||||||||||||
1344 | onError = overrideError; | - | ||||||||||||||||||||||||
1345 | }else if( onError==OE_Default ){ executed 338 times by 1 test: end of block Executed by:
| 338-5462 | ||||||||||||||||||||||||
1346 | onError = OE_Abort; | - | ||||||||||||||||||||||||
1347 | } executed 5462 times by 1 test: end of block Executed by:
| 5462 | ||||||||||||||||||||||||
1348 | if( onError==OE_Replace && pTab->aCol[i].pDflt==0 ){
| 77-6658 | ||||||||||||||||||||||||
1349 | onError = OE_Abort; | - | ||||||||||||||||||||||||
1350 | } executed 87 times by 1 test: end of block Executed by:
| 87 | ||||||||||||||||||||||||
1351 | assert( onError==OE_Rollback || onError==OE_Abort || onError==OE_Fail | - | ||||||||||||||||||||||||
1352 | || onError==OE_Ignore || onError==OE_Replace ); | - | ||||||||||||||||||||||||
1353 | switch( onError ){ | - | ||||||||||||||||||||||||
1354 | case OE_Abort: executed 6586 times by 1 test: case 2: Executed by:
| 6586 | ||||||||||||||||||||||||
1355 | sqlite3MayAbort(pParse); | - | ||||||||||||||||||||||||
1356 | /* Fall through */ | - | ||||||||||||||||||||||||
1357 | case OE_Rollback: code before this statement executed 6586 times by 1 test: case 1: Executed by:
executed 21 times by 1 test: case 1: Executed by:
| 21-6586 | ||||||||||||||||||||||||
1358 | case OE_Fail: { executed 19 times by 1 test: case 3: Executed by:
| 19 | ||||||||||||||||||||||||
1359 | char *zMsg = sqlite3MPrintf(db, "%s.%s", pTab->zName, | - | ||||||||||||||||||||||||
1360 | pTab->aCol[i].zName); | - | ||||||||||||||||||||||||
1361 | sqlite3VdbeAddOp3(v, OP_HaltIfNull, SQLITE_CONSTRAINT_NOTNULL, onError, | - | ||||||||||||||||||||||||
1362 | regNewData+1+i); | - | ||||||||||||||||||||||||
1363 | sqlite3VdbeAppendP4(v, zMsg, P4_DYNAMIC); | - | ||||||||||||||||||||||||
1364 | sqlite3VdbeChangeP5(v, P5_ConstraintNotNull); | - | ||||||||||||||||||||||||
1365 | VdbeCoverage(v); | - | ||||||||||||||||||||||||
1366 | break; executed 6626 times by 1 test: break; Executed by:
| 6626 | ||||||||||||||||||||||||
1367 | } | - | ||||||||||||||||||||||||
1368 | case OE_Ignore: { executed 119 times by 1 test: case 4: Executed by:
| 119 | ||||||||||||||||||||||||
1369 | sqlite3VdbeAddOp2(v, OP_IsNull, regNewData+1+i, ignoreDest); | - | ||||||||||||||||||||||||
1370 | VdbeCoverage(v); | - | ||||||||||||||||||||||||
1371 | break; executed 119 times by 1 test: break; Executed by:
| 119 | ||||||||||||||||||||||||
1372 | } | - | ||||||||||||||||||||||||
1373 | default: { executed 77 times by 1 test: default: Executed by:
| 77 | ||||||||||||||||||||||||
1374 | assert( onError==OE_Replace ); | - | ||||||||||||||||||||||||
1375 | addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, regNewData+1+i); | - | ||||||||||||||||||||||||
1376 | VdbeCoverage(v); | - | ||||||||||||||||||||||||
1377 | sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, regNewData+1+i); | - | ||||||||||||||||||||||||
1378 | sqlite3VdbeJumpHere(v, addr1); | - | ||||||||||||||||||||||||
1379 | break; executed 77 times by 1 test: break; Executed by:
| 77 | ||||||||||||||||||||||||
1380 | } | - | ||||||||||||||||||||||||
1381 | } | - | ||||||||||||||||||||||||
1382 | } | - | ||||||||||||||||||||||||
1383 | - | |||||||||||||||||||||||||
1384 | /* Test all CHECK constraints | - | ||||||||||||||||||||||||
1385 | */ | - | ||||||||||||||||||||||||
1386 | #ifndef SQLITE_OMIT_CHECK | - | ||||||||||||||||||||||||
1387 | if( pTab->pCheck && (db->flags & SQLITE_IgnoreChecks)==0 ){
| 1-106576 | ||||||||||||||||||||||||
1388 | ExprList *pCheck = pTab->pCheck; | - | ||||||||||||||||||||||||
1389 | pParse->iSelfTab = -(regNewData+1); | - | ||||||||||||||||||||||||
1390 | onError = overrideError!=OE_Default ? overrideError : OE_Abort;
| 17-171 | ||||||||||||||||||||||||
1391 | for(i=0; i<pCheck->nExpr; i++){
| 188-243 | ||||||||||||||||||||||||
1392 | int allOk; | - | ||||||||||||||||||||||||
1393 | Expr *pExpr = pCheck->a[i].pExpr; | - | ||||||||||||||||||||||||
1394 | if( aiChng
| 42-201 | ||||||||||||||||||||||||
1395 | && !sqlite3ExprReferencesUpdatedColumn(pExpr, aiChng, pkChng)
| 7-35 | ||||||||||||||||||||||||
1396 | ){ | - | ||||||||||||||||||||||||
1397 | /* The check constraints do not reference any of the columns being | - | ||||||||||||||||||||||||
1398 | ** updated so there is no point it verifying the check constraint */ | - | ||||||||||||||||||||||||
1399 | continue; executed 7 times by 1 test: continue; Executed by:
| 7 | ||||||||||||||||||||||||
1400 | } | - | ||||||||||||||||||||||||
1401 | allOk = sqlite3VdbeMakeLabel(v); | - | ||||||||||||||||||||||||
1402 | sqlite3VdbeVerifyAbortable(v, onError); | - | ||||||||||||||||||||||||
1403 | sqlite3ExprIfTrue(pParse, pExpr, allOk, SQLITE_JUMPIFNULL); | - | ||||||||||||||||||||||||
1404 | if( onError==OE_Ignore ){
| 8-228 | ||||||||||||||||||||||||
1405 | sqlite3VdbeGoto(v, ignoreDest); | - | ||||||||||||||||||||||||
1406 | }else{ executed 8 times by 1 test: end of block Executed by:
| 8 | ||||||||||||||||||||||||
1407 | char *zName = pCheck->a[i].zName; | - | ||||||||||||||||||||||||
1408 | if( zName==0 ) zName = pTab->zName; executed 203 times by 1 test: zName = pTab->zName; Executed by:
| 25-203 | ||||||||||||||||||||||||
1409 | if( onError==OE_Replace ) onError = OE_Abort; /* IMP: R-15569-63625 */ executed 7 times by 1 test: onError = 2; Executed by:
| 7-221 | ||||||||||||||||||||||||
1410 | sqlite3HaltConstraint(pParse, SQLITE_CONSTRAINT_CHECK, | - | ||||||||||||||||||||||||
1411 | onError, zName, P4_TRANSIENT, | - | ||||||||||||||||||||||||
1412 | P5_ConstraintCheck); | - | ||||||||||||||||||||||||
1413 | } executed 228 times by 1 test: end of block Executed by:
| 228 | ||||||||||||||||||||||||
1414 | sqlite3VdbeResolveLabel(v, allOk); | - | ||||||||||||||||||||||||
1415 | } executed 236 times by 1 test: end of block Executed by:
| 236 | ||||||||||||||||||||||||
1416 | pParse->iSelfTab = 0; | - | ||||||||||||||||||||||||
1417 | } executed 188 times by 1 test: end of block Executed by:
| 188 | ||||||||||||||||||||||||
1418 | #endif /* !defined(SQLITE_OMIT_CHECK) */ | - | ||||||||||||||||||||||||
1419 | - | |||||||||||||||||||||||||
1420 | /* UNIQUE and PRIMARY KEY constraints should be handled in the following | - | ||||||||||||||||||||||||
1421 | ** order: | - | ||||||||||||||||||||||||
1422 | ** | - | ||||||||||||||||||||||||
1423 | ** (1) OE_Update | - | ||||||||||||||||||||||||
1424 | ** (2) OE_Abort, OE_Fail, OE_Rollback, OE_Ignore | - | ||||||||||||||||||||||||
1425 | ** (3) OE_Replace | - | ||||||||||||||||||||||||
1426 | ** | - | ||||||||||||||||||||||||
1427 | ** OE_Fail and OE_Ignore must happen before any changes are made. | - | ||||||||||||||||||||||||
1428 | ** OE_Update guarantees that only a single row will change, so it | - | ||||||||||||||||||||||||
1429 | ** must happen before OE_Replace. Technically, OE_Abort and OE_Rollback | - | ||||||||||||||||||||||||
1430 | ** could happen in any order, but they are grouped up front for | - | ||||||||||||||||||||||||
1431 | ** convenience. | - | ||||||||||||||||||||||||
1432 | ** | - | ||||||||||||||||||||||||
1433 | ** 2018-08-14: Ticket https://www.sqlite.org/src/info/908f001483982c43 | - | ||||||||||||||||||||||||
1434 | ** The order of constraints used to have OE_Update as (2) and OE_Abort | - | ||||||||||||||||||||||||
1435 | ** and so forth as (1). But apparently PostgreSQL checks the OE_Update | - | ||||||||||||||||||||||||
1436 | ** constraint before any others, so it had to be moved. | - | ||||||||||||||||||||||||
1437 | ** | - | ||||||||||||||||||||||||
1438 | ** Constraint checking code is generated in this order: | - | ||||||||||||||||||||||||
1439 | ** (A) The rowid constraint | - | ||||||||||||||||||||||||
1440 | ** (B) Unique index constraints that do not have OE_Replace as their | - | ||||||||||||||||||||||||
1441 | ** default conflict resolution strategy | - | ||||||||||||||||||||||||
1442 | ** (C) Unique index that do use OE_Replace by default. | - | ||||||||||||||||||||||||
1443 | ** | - | ||||||||||||||||||||||||
1444 | ** The ordering of (2) and (3) is accomplished by making sure the linked | - | ||||||||||||||||||||||||
1445 | ** list of indexes attached to a table puts all OE_Replace indexes last | - | ||||||||||||||||||||||||
1446 | ** in the list. See sqlite3CreateIndex() for where that happens. | - | ||||||||||||||||||||||||
1447 | */ | - | ||||||||||||||||||||||||
1448 | - | |||||||||||||||||||||||||
1449 | if( pUpsert ){
| 154-106611 | ||||||||||||||||||||||||
1450 | if( pUpsert->pUpsertTarget==0 ){
| 18-136 | ||||||||||||||||||||||||
1451 | /* An ON CONFLICT DO NOTHING clause, without a constraint-target. | - | ||||||||||||||||||||||||
1452 | ** Make all unique constraint resolution be OE_Ignore */ | - | ||||||||||||||||||||||||
1453 | assert( pUpsert->pUpsertSet==0 ); | - | ||||||||||||||||||||||||
1454 | overrideError = OE_Ignore; | - | ||||||||||||||||||||||||
1455 | pUpsert = 0; | - | ||||||||||||||||||||||||
1456 | }else if( (pUpIdx = pUpsert->pUpsertIdx)!=0 ){ executed 18 times by 1 test: end of block Executed by:
| 18-90 | ||||||||||||||||||||||||
1457 | /* If the constraint-target uniqueness check must be run first. | - | ||||||||||||||||||||||||
1458 | ** Jump to that uniqueness check now */ | - | ||||||||||||||||||||||||
1459 | upsertJump = sqlite3VdbeAddOp0(v, OP_Goto); | - | ||||||||||||||||||||||||
1460 | VdbeComment((v, "UPSERT constraint goes first")); | - | ||||||||||||||||||||||||
1461 | } executed 90 times by 1 test: end of block Executed by:
| 90 | ||||||||||||||||||||||||
1462 | } executed 154 times by 1 test: end of block Executed by:
| 154 | ||||||||||||||||||||||||
1463 | - | |||||||||||||||||||||||||
1464 | /* If rowid is changing, make sure the new rowid does not previously | - | ||||||||||||||||||||||||
1465 | ** exist in the table. | - | ||||||||||||||||||||||||
1466 | */ | - | ||||||||||||||||||||||||
1467 | if( pkChng && pPk==0 ){
| 133-103832 | ||||||||||||||||||||||||
1468 | int addrRowidOk = sqlite3VdbeMakeLabel(v); | - | ||||||||||||||||||||||||
1469 | - | |||||||||||||||||||||||||
1470 | /* Figure out what action to take in case of a rowid collision */ | - | ||||||||||||||||||||||||
1471 | onError = pTab->keyConf; | - | ||||||||||||||||||||||||
1472 | if( overrideError!=OE_Default ){
| 122-2678 | ||||||||||||||||||||||||
1473 | onError = overrideError; | - | ||||||||||||||||||||||||
1474 | }else if( onError==OE_Default ){ executed 122 times by 1 test: end of block Executed by:
| 122-1971 | ||||||||||||||||||||||||
1475 | onError = OE_Abort; | - | ||||||||||||||||||||||||
1476 | } executed 1971 times by 1 test: end of block Executed by:
| 1971 | ||||||||||||||||||||||||
1477 | - | |||||||||||||||||||||||||
1478 | /* figure out whether or not upsert applies in this case */ | - | ||||||||||||||||||||||||
1479 | if( pUpsert && pUpsert->pUpsertIdx==0 ){
| 26-2743 | ||||||||||||||||||||||||
1480 | if( pUpsert->pUpsertSet==0 ){
| 13-18 | ||||||||||||||||||||||||
1481 | onError = OE_Ignore; /* DO NOTHING is the same as INSERT OR IGNORE */ | - | ||||||||||||||||||||||||
1482 | }else{ executed 18 times by 1 test: end of block Executed by:
| 18 | ||||||||||||||||||||||||
1483 | onError = OE_Update; /* DO UPDATE */ | - | ||||||||||||||||||||||||
1484 | } executed 13 times by 1 test: end of block Executed by:
| 13 | ||||||||||||||||||||||||
1485 | } | - | ||||||||||||||||||||||||
1486 | - | |||||||||||||||||||||||||
1487 | /* If the response to a rowid conflict is REPLACE but the response | - | ||||||||||||||||||||||||
1488 | ** to some other UNIQUE constraint is FAIL or IGNORE, then we need | - | ||||||||||||||||||||||||
1489 | ** to defer the running of the rowid conflict checking until after | - | ||||||||||||||||||||||||
1490 | ** the UNIQUE constraints have run. | - | ||||||||||||||||||||||||
1491 | */ | - | ||||||||||||||||||||||||
1492 | if( onError==OE_Replace /* IPK rule is REPLACE */
| 80-2720 | ||||||||||||||||||||||||
1493 | && onError!=overrideError /* Rules for other contraints are different */
| 15-65 | ||||||||||||||||||||||||
1494 | && pTab->pIndex /* There exist other constraints */
| 7-8 | ||||||||||||||||||||||||
1495 | ){ | - | ||||||||||||||||||||||||
1496 | ipkTop = sqlite3VdbeAddOp0(v, OP_Goto)+1; | - | ||||||||||||||||||||||||
1497 | VdbeComment((v, "defer IPK REPLACE until last")); | - | ||||||||||||||||||||||||
1498 | } executed 8 times by 1 test: end of block Executed by:
| 8 | ||||||||||||||||||||||||
1499 | - | |||||||||||||||||||||||||
1500 | if( isUpdate ){
| 410-2390 | ||||||||||||||||||||||||
1501 | /* pkChng!=0 does not mean that the rowid has changed, only that | - | ||||||||||||||||||||||||
1502 | ** it might have changed. Skip the conflict logic below if the rowid | - | ||||||||||||||||||||||||
1503 | ** is unchanged. */ | - | ||||||||||||||||||||||||
1504 | sqlite3VdbeAddOp3(v, OP_Eq, regNewData, addrRowidOk, regOldData); | - | ||||||||||||||||||||||||
1505 | sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); | - | ||||||||||||||||||||||||
1506 | VdbeCoverage(v); | - | ||||||||||||||||||||||||
1507 | } executed 410 times by 1 test: end of block Executed by:
| 410 | ||||||||||||||||||||||||
1508 | - | |||||||||||||||||||||||||
1509 | /* Check to see if the new rowid already exists in the table. Skip | - | ||||||||||||||||||||||||
1510 | ** the following conflict logic if it does not. */ | - | ||||||||||||||||||||||||
1511 | VdbeNoopComment((v, "uniqueness check for ROWID")); | - | ||||||||||||||||||||||||
1512 | sqlite3VdbeVerifyAbortable(v, onError); | - | ||||||||||||||||||||||||
1513 | sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, addrRowidOk, regNewData); | - | ||||||||||||||||||||||||
1514 | VdbeCoverage(v); | - | ||||||||||||||||||||||||
1515 | - | |||||||||||||||||||||||||
1516 | switch( onError ){ | - | ||||||||||||||||||||||||
1517 | default: { executed 664 times by 1 test: default: Executed by:
| 664 | ||||||||||||||||||||||||
1518 | onError = OE_Abort; | - | ||||||||||||||||||||||||
1519 | /* Fall thru into the next case */ | - | ||||||||||||||||||||||||
1520 | } | - | ||||||||||||||||||||||||
1521 | case OE_Rollback: code before this statement executed 664 times by 1 test: case 1: Executed by:
executed 14 times by 1 test: case 1: Executed by:
| 14-664 | ||||||||||||||||||||||||
1522 | case OE_Abort: executed 1969 times by 1 test: case 2: Executed by:
| 1969 | ||||||||||||||||||||||||
1523 | case OE_Fail: { executed 11 times by 1 test: case 3: Executed by:
| 11 | ||||||||||||||||||||||||
1524 | testcase( onError==OE_Rollback ); | - | ||||||||||||||||||||||||
1525 | testcase( onError==OE_Abort ); | - | ||||||||||||||||||||||||
1526 | testcase( onError==OE_Fail ); | - | ||||||||||||||||||||||||
1527 | sqlite3RowidConstraint(pParse, onError, pTab); | - | ||||||||||||||||||||||||
1528 | break; executed 2658 times by 1 test: break; Executed by:
| 2658 | ||||||||||||||||||||||||
1529 | } | - | ||||||||||||||||||||||||
1530 | case OE_Replace: { executed 80 times by 1 test: case 5: Executed by:
| 80 | ||||||||||||||||||||||||
1531 | /* If there are DELETE triggers on this table and the | - | ||||||||||||||||||||||||
1532 | ** recursive-triggers flag is set, call GenerateRowDelete() to | - | ||||||||||||||||||||||||
1533 | ** remove the conflicting row from the table. This will fire | - | ||||||||||||||||||||||||
1534 | ** the triggers and remove both the table and index b-tree entries. | - | ||||||||||||||||||||||||
1535 | ** | - | ||||||||||||||||||||||||
1536 | ** Otherwise, if there are no triggers or the recursive-triggers | - | ||||||||||||||||||||||||
1537 | ** flag is not set, but the table has one or more indexes, call | - | ||||||||||||||||||||||||
1538 | ** GenerateRowIndexDelete(). This removes the index b-tree entries | - | ||||||||||||||||||||||||
1539 | ** only. The table b-tree entry will be replaced by the new entry | - | ||||||||||||||||||||||||
1540 | ** when it is inserted. | - | ||||||||||||||||||||||||
1541 | ** | - | ||||||||||||||||||||||||
1542 | ** If either GenerateRowDelete() or GenerateRowIndexDelete() is called, | - | ||||||||||||||||||||||||
1543 | ** also invoke MultiWrite() to indicate that this VDBE may require | - | ||||||||||||||||||||||||
1544 | ** statement rollback (if the statement is aborted after the delete | - | ||||||||||||||||||||||||
1545 | ** takes place). Earlier versions called sqlite3MultiWrite() regardless, | - | ||||||||||||||||||||||||
1546 | ** but being more selective here allows statements like: | - | ||||||||||||||||||||||||
1547 | ** | - | ||||||||||||||||||||||||
1548 | ** REPLACE INTO t(rowid) VALUES($newrowid) | - | ||||||||||||||||||||||||
1549 | ** | - | ||||||||||||||||||||||||
1550 | ** to run without a statement journal if there are no indexes on the | - | ||||||||||||||||||||||||
1551 | ** table. | - | ||||||||||||||||||||||||
1552 | */ | - | ||||||||||||||||||||||||
1553 | Trigger *pTrigger = 0; | - | ||||||||||||||||||||||||
1554 | if( db->flags&SQLITE_RecTriggers ){
| 14-66 | ||||||||||||||||||||||||
1555 | pTrigger = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0); | - | ||||||||||||||||||||||||
1556 | } executed 14 times by 1 test: end of block Executed by:
| 14 | ||||||||||||||||||||||||
1557 | if( pTrigger || sqlite3FkRequired(pParse, pTab, 0, 0) ){
| 10-70 | ||||||||||||||||||||||||
1558 | sqlite3MultiWrite(pParse); | - | ||||||||||||||||||||||||
1559 | sqlite3GenerateRowDelete(pParse, pTab, pTrigger, iDataCur, iIdxCur, | - | ||||||||||||||||||||||||
1560 | regNewData, 1, 0, OE_Replace, 1, -1); | - | ||||||||||||||||||||||||
1561 | }else{ executed 21 times by 1 test: end of block Executed by:
| 21 | ||||||||||||||||||||||||
1562 | #ifdef SQLITE_ENABLE_PREUPDATE_HOOK | - | ||||||||||||||||||||||||
1563 | assert( HasRowid(pTab) ); | - | ||||||||||||||||||||||||
1564 | /* This OP_Delete opcode fires the pre-update-hook only. It does | - | ||||||||||||||||||||||||
1565 | ** not modify the b-tree. It is more efficient to let the coming | - | ||||||||||||||||||||||||
1566 | ** OP_Insert replace the existing entry than it is to delete the | - | ||||||||||||||||||||||||
1567 | ** existing entry and then insert a new one. */ | - | ||||||||||||||||||||||||
1568 | sqlite3VdbeAddOp2(v, OP_Delete, iDataCur, OPFLAG_ISNOOP); | - | ||||||||||||||||||||||||
1569 | sqlite3VdbeAppendP4(v, pTab, P4_TABLE); | - | ||||||||||||||||||||||||
1570 | #endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ | - | ||||||||||||||||||||||||
1571 | if( pTab->pIndex ){
| 21-38 | ||||||||||||||||||||||||
1572 | sqlite3MultiWrite(pParse); | - | ||||||||||||||||||||||||
1573 | sqlite3GenerateRowIndexDelete(pParse, pTab, iDataCur, iIdxCur,0,-1); | - | ||||||||||||||||||||||||
1574 | } executed 38 times by 1 test: end of block Executed by:
| 38 | ||||||||||||||||||||||||
1575 | } executed 59 times by 1 test: end of block Executed by:
| 59 | ||||||||||||||||||||||||
1576 | seenReplace = 1; | - | ||||||||||||||||||||||||
1577 | break; executed 80 times by 1 test: break; Executed by:
| 80 | ||||||||||||||||||||||||
1578 | } | - | ||||||||||||||||||||||||
1579 | #ifndef SQLITE_OMIT_UPSERT | - | ||||||||||||||||||||||||
1580 | case OE_Update: { executed 13 times by 1 test: case 6: Executed by:
| 13 | ||||||||||||||||||||||||
1581 | sqlite3UpsertDoUpdate(pParse, pUpsert, pTab, 0, iDataCur); | - | ||||||||||||||||||||||||
1582 | /* Fall through */ | - | ||||||||||||||||||||||||
1583 | } | - | ||||||||||||||||||||||||
1584 | #endif | - | ||||||||||||||||||||||||
1585 | case OE_Ignore: { code before this statement executed 13 times by 1 test: case 4: Executed by:
executed 62 times by 1 test: case 4: Executed by:
| 13-62 | ||||||||||||||||||||||||
1586 | testcase( onError==OE_Ignore ); | - | ||||||||||||||||||||||||
1587 | sqlite3VdbeGoto(v, ignoreDest); | - | ||||||||||||||||||||||||
1588 | break; executed 62 times by 1 test: break; Executed by:
| 62 | ||||||||||||||||||||||||
1589 | } | - | ||||||||||||||||||||||||
1590 | } | - | ||||||||||||||||||||||||
1591 | sqlite3VdbeResolveLabel(v, addrRowidOk); | - | ||||||||||||||||||||||||
1592 | if( ipkTop ){
| 8-2792 | ||||||||||||||||||||||||
1593 | ipkBottom = sqlite3VdbeAddOp0(v, OP_Goto); | - | ||||||||||||||||||||||||
1594 | sqlite3VdbeJumpHere(v, ipkTop-1); | - | ||||||||||||||||||||||||
1595 | } executed 8 times by 1 test: end of block Executed by:
| 8 | ||||||||||||||||||||||||
1596 | } executed 2800 times by 1 test: end of block Executed by:
| 2800 | ||||||||||||||||||||||||
1597 | - | |||||||||||||||||||||||||
1598 | /* Test all UNIQUE constraints by creating entries for each UNIQUE | - | ||||||||||||||||||||||||
1599 | ** index and making sure that duplicate entries do not already exist. | - | ||||||||||||||||||||||||
1600 | ** Compute the revised record entries for indices as we go. | - | ||||||||||||||||||||||||
1601 | ** | - | ||||||||||||||||||||||||
1602 | ** This loop also handles the case of the PRIMARY KEY index for a | - | ||||||||||||||||||||||||
1603 | ** WITHOUT ROWID table. | - | ||||||||||||||||||||||||
1604 | */ | - | ||||||||||||||||||||||||
1605 | for(ix=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, ix++){
| 21511-106765 | ||||||||||||||||||||||||
1606 | int regIdx; /* Range of registers hold conent for pIdx */ | - | ||||||||||||||||||||||||
1607 | int regR; /* Range of registers holding conflicting PK */ | - | ||||||||||||||||||||||||
1608 | int iThisCur; /* Cursor for this UNIQUE index */ | - | ||||||||||||||||||||||||
1609 | int addrUniqueOk; /* Jump here if the UNIQUE constraint is satisfied */ | - | ||||||||||||||||||||||||
1610 | - | |||||||||||||||||||||||||
1611 | if( aRegIdx[ix]==0 ) continue; /* Skip indices that do not change */ executed 425 times by 3 tests: continue; Executed by:
| 425-21086 | ||||||||||||||||||||||||
1612 | if( pUpIdx==pIdx ){
| 90-20996 | ||||||||||||||||||||||||
1613 | addrUniqueOk = upsertJump+1; | - | ||||||||||||||||||||||||
1614 | upsertBypass = sqlite3VdbeGoto(v, 0); | - | ||||||||||||||||||||||||
1615 | VdbeComment((v, "Skip upsert subroutine")); | - | ||||||||||||||||||||||||
1616 | sqlite3VdbeJumpHere(v, upsertJump); | - | ||||||||||||||||||||||||
1617 | }else{ executed 90 times by 1 test: end of block Executed by:
| 90 | ||||||||||||||||||||||||
1618 | addrUniqueOk = sqlite3VdbeMakeLabel(v); | - | ||||||||||||||||||||||||
1619 | } executed 20996 times by 369 tests: end of block Executed by:
| 20996 | ||||||||||||||||||||||||
1620 | if( bAffinityDone==0 && (pUpIdx==0 || pUpIdx==pIdx) ){
| 43-17755 | ||||||||||||||||||||||||
1621 | sqlite3TableAffinity(v, pTab, regNewData+1); | - | ||||||||||||||||||||||||
1622 | bAffinityDone = 1; | - | ||||||||||||||||||||||||
1623 | } executed 17712 times by 369 tests: end of block Executed by:
| 17712 | ||||||||||||||||||||||||
1624 | VdbeNoopComment((v, "uniqueness check for %s", pIdx->zName)); | - | ||||||||||||||||||||||||
1625 | iThisCur = iIdxCur+ix; | - | ||||||||||||||||||||||||
1626 | - | |||||||||||||||||||||||||
1627 | - | |||||||||||||||||||||||||
1628 | /* Skip partial indices for which the WHERE clause is not true */ | - | ||||||||||||||||||||||||
1629 | if( pIdx->pPartIdxWhere ){
| 65-21021 | ||||||||||||||||||||||||
1630 | sqlite3VdbeAddOp2(v, OP_Null, 0, aRegIdx[ix]); | - | ||||||||||||||||||||||||
1631 | pParse->iSelfTab = -(regNewData+1); | - | ||||||||||||||||||||||||
1632 | sqlite3ExprIfFalseDup(pParse, pIdx->pPartIdxWhere, addrUniqueOk, | - | ||||||||||||||||||||||||
1633 | SQLITE_JUMPIFNULL); | - | ||||||||||||||||||||||||
1634 | pParse->iSelfTab = 0; | - | ||||||||||||||||||||||||
1635 | } executed 65 times by 1 test: end of block Executed by:
| 65 | ||||||||||||||||||||||||
1636 | - | |||||||||||||||||||||||||
1637 | /* Create a record for this index entry as it should appear after | - | ||||||||||||||||||||||||
1638 | ** the insert or update. Store that record in the aRegIdx[ix] register | - | ||||||||||||||||||||||||
1639 | */ | - | ||||||||||||||||||||||||
1640 | regIdx = aRegIdx[ix]+1; | - | ||||||||||||||||||||||||
1641 | for(i=0; i<pIdx->nColumn; i++){
| 21086-45079 | ||||||||||||||||||||||||
1642 | int iField = pIdx->aiColumn[i]; | - | ||||||||||||||||||||||||
1643 | int x; | - | ||||||||||||||||||||||||
1644 | if( iField==XN_EXPR ){
| 61-45018 | ||||||||||||||||||||||||
1645 | pParse->iSelfTab = -(regNewData+1); | - | ||||||||||||||||||||||||
1646 | sqlite3ExprCodeCopy(pParse, pIdx->aColExpr->a[i].pExpr, regIdx+i); | - | ||||||||||||||||||||||||
1647 | pParse->iSelfTab = 0; | - | ||||||||||||||||||||||||
1648 | VdbeComment((v, "%s column %d", pIdx->zName, i)); | - | ||||||||||||||||||||||||
1649 | }else{ executed 61 times by 1 test: end of block Executed by:
| 61 | ||||||||||||||||||||||||
1650 | if( iField==XN_ROWID || iField==pTab->iPKey ){
|