<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Now the whole patch-set looks OK to me.<div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On 4 Apr 2018, at 14:51, n.pettik <<a href="mailto:korablev@tarantool.org" class="">korablev@tarantool.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">You may not pay attention to ’nitpickings’,</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">but I should make visibility of reviewing this patch.</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">On 4 Apr 2018, at 13:26, Vladislav Shpilevoy <<a href="mailto:v.shpilevoy@tarantool.org" class="">v.shpilevoy@tarantool.org</a>> wrote:<br class=""><br class="">Hello. See the diff at the end of the letter, and my responses to some of<br class="">your comments.<br class=""><blockquote type="cite" class=""><blockquote type="cite" class="">done in a primary index only. It is enough to pass a register of<br class="">a primary index.<br class=""></blockquote>Nitpicking: not 'a register of a primary index’,<br class="">but number of cursor opened on this space/index.<br class=""></blockquote>Here you are wrong - it is a register, where tuple data is stored to insert. Cursor id<br class="">argument is not changed. I fixed it in a new commit.<br class=""></blockquote><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">Ok, I have misunderstood you.</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">Now it is clear that you mentioned another operand.</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class=""><blockquote type="cite" class=""><br class=""><blockquote type="cite" class="">+<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;">  </span>bool no_foreign_keys =<br class="">+<span class="Apple-tab-span" style="white-space: pre;">      </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>sqlite3FkReferences(pTab) == NULL ||<br class="">+<span class="Apple-tab-span" style="white-space: pre;">        </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>(user_session->sql_flags & SQLITE_ForeignKeys) == 0;<br class=""></blockquote>AFAIK SQLITE_ForeignKeys flag is always set to be true<br class="">(since we always use FK). Thus, you can remove this condition check.<br class=""></blockquote>Yes, Foreign Keys source code now is always built, because we have removed OMIT_FOREIGN_KEYS,<br class="">but SQLITE_ForeignKeys is not a #define - it is a flag, that can be set by a user on runtime in its<br class="">session, and allows to skip foreign keys checking. The removal of this flags must be discussed,<br class="">because I think it can be useful.<br class=""><br class="">In any case, talking about the patch, I found a way to remove this code completely. See diff below.<br class=""></blockquote><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">Ok, looks pretty good.</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class=""><br class=""><br class="">diff --git a/src/box/sql/analyze.c b/src/box/sql/analyze.c<br class="">index c5dcedd3e..4eae896ab 100644<br class="">--- a/src/box/sql/analyze.c<br class="">+++ b/src/box/sql/analyze.c<br class="">@@ -1050,7 +1050,6 @@ analyzeOneTable(Parse * pParse,<span class="Apple-tab-span" style="white-space: pre;">    </span>/* Parser context */<br class=""><span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;">  </span>sqlite3VdbeAddOp4(v, OP_MakeRecord, regTabname, 3, regTemp,<br class=""><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-converted-space"> </span> "BBB", 0);<br class=""><span class="Apple-tab-span" style="white-space: pre;">    </span><span class="Apple-tab-span" style="white-space: pre;">  </span>sqlite3VdbeAddOp2(v, OP_IdxInsert, iStatCur, regTemp);<br class="">-<span class="Apple-tab-span" style="white-space: pre;">      </span><span class="Apple-tab-span" style="white-space: pre;">  </span>sqlite3VdbeChangeP5(v, OPFLAG_APPEND);<br class=""><span class="Apple-tab-span" style="white-space: pre;">       </span><span class="Apple-tab-span" style="white-space: pre;">  </span>/* Add the entries to the stat4 table. */<br class="">diff --git a/src/box/sql/build.c b/src/box/sql/build.c<br class="">index 5e3ed0f39..5c3cac881 100644<br class="">--- a/src/box/sql/build.c<br class="">+++ b/src/box/sql/build.c<br class="">@@ -2659,7 +2659,6 @@ sqlite3RefillIndex(Parse * pParse, Index * pIndex, int memRootPage)<br class=""><span class="Apple-tab-span" style="white-space: pre;"> </span>sqlite3VdbeAddOp3(v, OP_SorterData, iSorter, regRecord, iIdx);<br class=""><span class="Apple-tab-span" style="white-space: pre;">       </span>sqlite3VdbeAddOp3(v, OP_Last, iIdx, 0, -1);<br class=""><span class="Apple-tab-span" style="white-space: pre;">  </span>sqlite3VdbeAddOp2(v, OP_IdxInsert, iIdx, regRecord);<br class="">-<span class="Apple-tab-span" style="white-space: pre;">        </span>sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT);<br class=""><span class="Apple-tab-span" style="white-space: pre;">        </span>sqlite3ReleaseTempReg(pParse, regRecord);<br class=""><span class="Apple-tab-span" style="white-space: pre;">    </span>sqlite3VdbeAddOp2(v, OP_SorterNext, iSorter, addr2);<br class=""><span class="Apple-tab-span" style="white-space: pre;"> </span>VdbeCoverage(v);<br class="">diff --git a/src/box/sql/insert.c b/src/box/sql/insert.c<br class="">index c7fe92cd6..c76910e5b 100644<br class="">--- a/src/box/sql/insert.c<br class="">+++ b/src/box/sql/insert.c<br class="">@@ -851,23 +851,7 @@ sqlite3Insert(Parse * pParse,<span class="Apple-tab-span" style="white-space: pre;">  </span>/* Parser context */<br class=""><span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>ipkColumn >= 0, onError,<br class=""><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>endOfLoop, &isReplace, 0);<br class=""><span class="Apple-tab-span" style="white-space: pre;">       </span><span class="Apple-tab-span" style="white-space: pre;">  </span>sqlite3FkCheck(pParse, pTab, 0, regIns, 0);<br class="">-<br class="">-<span class="Apple-tab-span" style="white-space: pre;">   </span><span class="Apple-tab-span" style="white-space: pre;">  </span>/* Set the OPFLAG_USESEEKRESULT flag if either (a) there are no REPLACE<br class="">-<span class="Apple-tab-span" style="white-space: pre;">     </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-converted-space"> </span>* constraints or (b) there are no triggers and this table is not a<br class="">-<span class="Apple-tab-span" style="white-space: pre;">   </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-converted-space"> </span>* parent table in a foreign key constraint. It is safe to set the<br class="">-<span class="Apple-tab-span" style="white-space: pre;">    </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-converted-space"> </span>* flag in the second case as if any REPLACE constraint is hit, an<br class="">-<span class="Apple-tab-span" style="white-space: pre;">    </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-converted-space"> </span>* OP_Delete or OP_IdxDelete instruction will be executed on each<br class="">-<span class="Apple-tab-span" style="white-space: pre;">     </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-converted-space"> </span>* cursor that is disturbed. And these instructions both clear the<br class="">-<span class="Apple-tab-span" style="white-space: pre;">    </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-converted-space"> </span>* VdbeCursor.seekResult variable, disabling the OPFLAG_USESEEKRESULT<br class="">-<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-converted-space"> </span>* functionality.<br class="">-<span class="Apple-tab-span" style="white-space: pre;">     </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-converted-space"> </span>*/<br class="">-<span class="Apple-tab-span" style="white-space: pre;">   </span><span class="Apple-tab-span" style="white-space: pre;">  </span>bool no_foreign_keys =<br class="">-<span class="Apple-tab-span" style="white-space: pre;">      </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>sqlite3FkReferences(pTab) == NULL ||<br class="">-<span class="Apple-tab-span" style="white-space: pre;">        </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>(user_session->sql_flags & SQLITE_ForeignKeys) == 0;<br class="">-<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;">  </span>bool use_seek = isReplace == 0 ||<br class="">-<span class="Apple-tab-span" style="white-space: pre;">   </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>(pTrigger == NULL && no_foreign_keys);<br class="">-<span class="Apple-tab-span" style="white-space: pre;">      </span><span class="Apple-tab-span" style="white-space: pre;">  </span>vdbe_emit_complete_insertion(v, iIdxCur, aRegIdx[0], use_seek,<br class="">-<span class="Apple-tab-span" style="white-space: pre;">      </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-converted-space"> </span>    onError);<br class="">+<span class="Apple-tab-span" style="white-space: pre;">    </span><span class="Apple-tab-span" style="white-space: pre;">  </span>vdbe_emit_insertion_completion(v, iIdxCur, aRegIdx[0], onError);<br class=""><span class="Apple-tab-span" style="white-space: pre;">     </span>}<br class=""><span class="Apple-tab-span" style="white-space: pre;">    </span>/* Update the count of rows that are inserted<br class="">@@ -1491,20 +1475,16 @@ sqlite3GenerateConstraintChecks(Parse * pParse,<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;">  </span>/* The parser context */<br class="">}<br class="">void<br class="">-vdbe_emit_complete_insertion(Vdbe *v, int cursor_id, int tuple_id,<br class="">-<span class="Apple-tab-span" style="white-space: pre;">     </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-converted-space"> </span>    bool use_seek_result, u8 on_error)<br class="">+vdbe_emit_insertion_completion(Vdbe *v, int cursor_id, int tuple_id, u8 on_error)<br class="">{<br class=""><span class="Apple-tab-span" style="white-space: pre;">       </span>assert(v != NULL);<br class="">-<span class="Apple-tab-span" style="white-space: pre;">  </span>u16 pik_flags = OPFLAG_NCHANGE;<br class="">-<span class="Apple-tab-span" style="white-space: pre;">     </span>if (use_seek_result)<br class="">-<span class="Apple-tab-span" style="white-space: pre;">        </span><span class="Apple-tab-span" style="white-space: pre;">  </span>pik_flags |= OPFLAG_USESEEKRESULT;<br class="">-<br class=""><span class="Apple-tab-span" style="white-space: pre;">     </span>int opcode;<br class=""><span class="Apple-tab-span" style="white-space: pre;">  </span>if (on_error == ON_CONFLICT_ACTION_REPLACE)<br class=""><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>opcode = OP_IdxReplace;<br class=""><span class="Apple-tab-span" style="white-space: pre;">      </span>else<br class=""><span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;">  </span>opcode = OP_IdxInsert;<br class="">+<span class="Apple-tab-span" style="white-space: pre;">      </span>u16 pik_flags = OPFLAG_NCHANGE;<br class=""><span class="Apple-tab-span" style="white-space: pre;">      </span>if (on_error == ON_CONFLICT_ACTION_IGNORE)<br class=""><span class="Apple-tab-span" style="white-space: pre;">   </span><span class="Apple-tab-span" style="white-space: pre;">  </span>pik_flags |= OPFLAG_OE_IGNORE;<br class=""><span class="Apple-tab-span" style="white-space: pre;">       </span>else if (on_error == ON_CONFLICT_ACTION_FAIL)<br class="">@@ -1910,7 +1890,6 @@ xferOptimization(Parse * pParse,<span class="Apple-tab-span" style="white-space: pre;">  </span>/* Parser context */<br class=""><span class="Apple-tab-span" style="white-space: pre;"> </span>}<br class=""><span class="Apple-tab-span" style="white-space: pre;">    </span>for (pDestIdx = pDest->pIndex; pDestIdx; pDestIdx = pDestIdx->pNext) {<br class="">-<span class="Apple-tab-span" style="white-space: pre;">        </span><span class="Apple-tab-span" style="white-space: pre;">  </span>u8 idxInsFlags = 0;<br class=""><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>for (pSrcIdx = pSrc->pIndex; ALWAYS(pSrcIdx);<br class=""><span class="Apple-tab-span" style="white-space: pre;">     </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-converted-space"> </span>    pSrcIdx = pSrcIdx->pNext) {<br class=""><span class="Apple-tab-span" style="white-space: pre;">        </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>if (xferCompatibleIndex(pDestIdx, pSrcIdx))<br class="">@@ -1927,11 +1906,9 @@ xferOptimization(Parse * pParse,<span class="Apple-tab-span" style="white-space: pre;">   </span>/* Parser context */<br class=""><span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;">  </span>addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iSrc, 0);<br class=""><span class="Apple-tab-span" style="white-space: pre;">    </span><span class="Apple-tab-span" style="white-space: pre;">  </span>VdbeCoverage(v);<br class=""><span class="Apple-tab-span" style="white-space: pre;">     </span><span class="Apple-tab-span" style="white-space: pre;">  </span>sqlite3VdbeAddOp2(v, OP_RowData, iSrc, regData);<br class="">-<span class="Apple-tab-span" style="white-space: pre;">    </span><span class="Apple-tab-span" style="white-space: pre;">  </span>if (pDestIdx->idxType == SQLITE_IDXTYPE_PRIMARYKEY) {<br class="">-<span class="Apple-tab-span" style="white-space: pre;">    </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>idxInsFlags |= OPFLAG_NCHANGE;<br class="">-<span class="Apple-tab-span" style="white-space: pre;">      </span><span class="Apple-tab-span" style="white-space: pre;">  </span>}<br class=""><span class="Apple-tab-span" style="white-space: pre;">    </span><span class="Apple-tab-span" style="white-space: pre;">  </span>sqlite3VdbeAddOp2(v, OP_IdxInsert, iDest, regData);<br class="">-<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;">  </span>sqlite3VdbeChangeP5(v, idxInsFlags | OPFLAG_APPEND);<br class="">+<span class="Apple-tab-span" style="white-space: pre;">        </span><span class="Apple-tab-span" style="white-space: pre;">  </span>if (pDestIdx->idxType == SQLITE_IDXTYPE_PRIMARYKEY)<br class=""></blockquote><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">Nitpicking: you can use IsPimaryKeyIndex() macros for this purpose.</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">+<span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>sqlite3VdbeChangeP5(v, OPFLAG_NCHANGE);<br class=""><span class="Apple-tab-span" style="white-space: pre;">      </span><span class="Apple-tab-span" style="white-space: pre;">  </span>sqlite3VdbeAddOp2(v, OP_Next, iSrc, addr1 + 1);<br class=""><span class="Apple-tab-span" style="white-space: pre;">      </span><span class="Apple-tab-span" style="white-space: pre;">  </span>VdbeCoverage(v);<br class=""><span class="Apple-tab-span" style="white-space: pre;">     </span><span class="Apple-tab-span" style="white-space: pre;">  </span>sqlite3VdbeJumpHere(v, addr1);<br class="">diff --git a/src/box/sql/select.c b/src/box/sql/select.c<br class="">index 95bd7d656..9e64b434e 100644<br class="">--- a/src/box/sql/select.c<br class="">+++ b/src/box/sql/select.c<br class="">@@ -1151,7 +1151,6 @@ selectInnerLoop(Parse * pParse,<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;">  </span>/* The parser context */<br class=""><span class="Apple-tab-span" style="white-space: pre;">     </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>if (eDest == SRT_DistQueue) {<br class=""><span class="Apple-tab-span" style="white-space: pre;">        </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>sqlite3VdbeAddOp2(v, OP_IdxInsert, iParm + 1,<br class=""><span class="Apple-tab-span" style="white-space: pre;">        </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-converted-space"> </span> r3);<br class="">-<span class="Apple-tab-span" style="white-space: pre;">   </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT);<br class=""><span class="Apple-tab-span" style="white-space: pre;">        </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>}<br class=""><span class="Apple-tab-span" style="white-space: pre;">    </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>for (i = 0; i < nKey; i++) {<br class=""><span class="Apple-tab-span" style="white-space: pre;">      </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>sqlite3VdbeAddOp2(v, OP_SCopy,<br class="">diff --git a/src/box/sql/sqliteInt.h b/src/box/sql/sqliteInt.h<br class="">index e786cf842..7c0a214b5 100644<br class="">--- a/src/box/sql/sqliteInt.h<br class="">+++ b/src/box/sql/sqliteInt.h<br class="">@@ -3039,8 +3039,6 @@ struct Parse {<br class=""><span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-converted-space"> </span>    /* Also used in P2 (not P5) of OP_Delete */<br class="">#define OPFLAG_EPHEM         0x01<span class="Apple-tab-span" style="white-space: pre;">  </span>/* OP_Column: Ephemeral output is ok */<br class="">#define OPFLAG_ISUPDATE      0x04<span class="Apple-tab-span" style="white-space: pre;">    </span>/* This OP_Insert is an sql UPDATE */<br class="">-#define OPFLAG_APPEND        0x08<span class="Apple-tab-span" style="white-space: pre;">   </span>/* This is likely to be an append */<br class="">-#define OPFLAG_USESEEKRESULT 0x10<span class="Apple-tab-span" style="white-space: pre;">       </span>/* Try to avoid a seek in BtreeInsert() */<br class="">#define OPFLAG_OE_IGNORE    0x200<span class="Apple-tab-span" style="white-space: pre;">   </span>/* OP_IdxInsert: Ignore flag */<br class="">#define OPFLAG_OE_FAIL      0x400<span class="Apple-tab-span" style="white-space: pre;">    </span>/* OP_IdxInsert: Fail flag */<br class="">#ifdef SQLITE_ENABLE_PREUPDATE_HOOK<br class="">@@ -3722,13 +3720,11 @@ void sqlite3GenerateConstraintChecks(Parse *, Table *, int *, int, int, int,<br class="">* @param v Virtual database engine.<br class="">* @param cursor_id Primary index cursor.<br class="">* @param tuple_id Register with data to insert.<br class="">- * @param use_seek_result True to set the USESEEKRESULT flag on<br class="">- *        OP_[Idx]Insert.<br class="">* @param on_error Error action on failed insert/replace.<br class="">*/<br class="">void<br class="">-vdbe_emit_complete_insertion(Vdbe *v, int cursor_id, int tuple_id,<br class="">-<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-converted-space"> </span>    bool use_seek_result, u8 on_error);<br class="">+vdbe_emit_insertion_completion(Vdbe *v, int cursor_id, int tuple_id,<br class="">+<span class="Apple-tab-span" style="white-space: pre;">        </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-converted-space"> </span>      u8 on_error);<br class="">int sqlite3OpenTableAndIndices(Parse *, Table *, int, u8, int, u8 *, int *,<br class=""><span class="Apple-tab-span" style="white-space: pre;">     </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-converted-space"> </span>      int *, u8, u8);<br class="">diff --git a/src/box/sql/update.c b/src/box/sql/update.c<br class="">index 859189a7e..98e696ddf 100644<br class="">--- a/src/box/sql/update.c<br class="">+++ b/src/box/sql/update.c<br class="">@@ -615,8 +615,7 @@ sqlite3Update(Parse * pParse,<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;">  </span>/* The parser context */<br class=""><span class="Apple-tab-span" style="white-space: pre;">     </span><span class="Apple-tab-span" style="white-space: pre;">  </span>}<br class=""><span class="Apple-tab-span" style="white-space: pre;">    </span><span class="Apple-tab-span" style="white-space: pre;">  </span>/* Insert the new index entries and the new record. */<br class="">-<span class="Apple-tab-span" style="white-space: pre;">      </span><span class="Apple-tab-span" style="white-space: pre;">  </span>vdbe_emit_complete_insertion(v, iIdxCur, aRegIdx[0], false,<br class="">-<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-converted-space"> </span>    onError);<br class="">+<span class="Apple-tab-span" style="white-space: pre;">    </span><span class="Apple-tab-span" style="white-space: pre;">  </span>vdbe_emit_insertion_completion(v, iIdxCur, aRegIdx[0], onError);<br class=""><span class="Apple-tab-span" style="white-space: pre;">     </span><span class="Apple-tab-span" style="white-space: pre;">  </span>/* Do any ON CASCADE, SET NULL or SET DEFAULT operations required to<br class=""><span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-converted-space"> </span>* handle rows (possibly in other tables) that refer via a foreign key<br class="">diff --git a/src/box/sql/vdbe.c b/src/box/sql/vdbe.c<br class="">index bf8a27709..5a56727da 100644<br class="">--- a/src/box/sql/vdbe.c<br class="">+++ b/src/box/sql/vdbe.c<br class="">@@ -4321,24 +4321,11 @@ case OP_Next:          /* jump */<br class="">/* Opcode: IdxInsert P1 P2 * * P5<br class="">* Synopsis: key=r[P2]<br class="">*<br class="">- * Register P2 holds an SQL index key made using the<br class="">- * MakeRecord instructions.  This opcode writes that key<br class="">- * into the index P1.  Data for the entry is nil.<br class="">- *<br class="">- * If P5 has the OPFLAG_APPEND bit set, that is a hint to the b-tree layer<br class="">- * that this insert is likely to be an append.<br class="">- *<br class="">- * If P5 has the OPFLAG_NCHANGE bit set, then the change counter is<br class="">- * incremented by this instruction.  If the OPFLAG_NCHANGE bit is clear,<br class="">- * then the change counter is unchanged.<br class="">- *<br class="">- * If the OPFLAG_USESEEKRESULT flag of P5 is set, the implementation might<br class="">- * run faster by avoiding an unnecessary seek on cursor P1.  However,<br class="">- * the OPFLAG_USESEEKRESULT flag must only be set if there have been no prior<br class="">- * seeks on the cursor or if the most recent seek used a key equivalent<br class="">- * to P2.<br class="">- *<br class="">- * This instruction only works for indices.<br class="">+ * @param P1 Index of a space cursor.<br class="">+ * @param P2 Index of a register with MessagePack data to insert.<br class="">+ * @param P5 Flags. If P5 contains OPFLAG_NCHANGE, then VDBE<br class="">+ *        accounts the change in a case of successful insertion in<br class="">+ *        nChange counter.<br class="">*/<br class="">/* Opcode: IdxReplace P1 P2 * * P5<br class="">* Synopsis: key=r[P2]<br class="">diff --git a/src/box/sql/where.c b/src/box/sql/where.c<br class="">index 79de5d69a..c51bd7455 100644<br class="">--- a/src/box/sql/where.c<br class="">+++ b/src/box/sql/where.c<br class="">@@ -844,7 +844,6 @@ constructAutomaticIndex(Parse * pParse,<span class="Apple-tab-span" style="white-space: pre;">      </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>/* The parsing context */<br class=""><span class="Apple-tab-span" style="white-space: pre;">    </span><span class="Apple-converted-space"> </span>   sqlite3GenerateIndexKey(pParse, pIdx, pLevel->iTabCur, regRecord, 0,<br class=""><span class="Apple-tab-span" style="white-space: pre;">     </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-converted-space"> </span>   0, 0);<br class=""><span class="Apple-tab-span" style="white-space: pre;">      </span>sqlite3VdbeAddOp2(v, OP_IdxInsert, pLevel->iIdxCur, regRecord);<br class="">-<span class="Apple-tab-span" style="white-space: pre;">  </span>sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT);<br class=""><span class="Apple-tab-span" style="white-space: pre;">        </span>if (pPartial)<br class=""><span class="Apple-tab-span" style="white-space: pre;">        </span><span class="Apple-tab-span" style="white-space: pre;">  </span>sqlite3VdbeResolveLabel(v, iContinue);<br class=""><span class="Apple-tab-span" style="white-space: pre;">       </span>if (pTabItem->fg.viaCoroutine) {<br class="">diff --git a/src/box/sql/wherecode.c b/src/box/sql/wherecode.c<br class="">index a3c51eef4..aaffa7c1c 100644<br class="">--- a/src/box/sql/wherecode.c<br class="">+++ b/src/box/sql/wherecode.c<br class="">@@ -1766,10 +1766,6 @@ sqlite3WhereCodeOneLoopStart(WhereInfo * pWInfo,<span class="Apple-tab-span" style="white-space: pre;">      </span>/* Complete information about t<br class=""><span class="Apple-tab-span" style="white-space: pre;">      </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>sqlite3VdbeAddOp2<br class=""><span class="Apple-tab-span" style="white-space: pre;">    </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>(v, OP_IdxInsert,<br class=""><span class="Apple-tab-span" style="white-space: pre;">    </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-converted-space"> </span>regRowset, regPk);<br class="">-<span class="Apple-tab-span" style="white-space: pre;">   </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>if (iSet)<br class="">-<span class="Apple-tab-span" style="white-space: pre;">   </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>sqlite3VdbeChangeP5<br class="">-<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>(v,<br class="">-<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-converted-space"> </span>OPFLAG_USESEEKRESULT);<br class=""><span class="Apple-tab-span" style="white-space: pre;">        </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>}<br class=""><span class="Apple-tab-span" style="white-space: pre;">    </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>/* Release the array of temp registers */</blockquote></div></blockquote></div><br class=""></div></body></html>