<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=""><br class=""><div><blockquote type="cite" class=""><div class="">On 22 Mar 2018, at 16:57, <a href="mailto:v.shpilevoy@tarantool.org" class="">v.shpilevoy@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="">See below 4 comments.</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="">21 марта 2018 г., в 2:48, Nikita Pettik <<a href="mailto:korablev@tarantool.org" class="">korablev@tarantool.org</a>> написал(а):<br class=""><br class="">As far as new opcodes to operate on system spaces have been introduced,<br class="">there is no more need to open cursors on such tables, when it comes to<br class="">insert/delete operations. In addition, it allows to get rid of system<br class="">spaces lookups from SQL data dictionary.  Moreover, previously DDL<br class="">relied on nested parse to make deletions from system space. But during<br class="">nested parse it is impossible to convert space id to space pointer (i.e.<br class="">emit OP_SIDtoPtr opcode) without any overhead or "hacks".  So, nested<br class="">parse has been replaced with hardcoded sequences of opcodes,<br class="">implementing the same logic.<br class=""><br class="">Closes #3252<br class="">---<br class="">src/box/sql/build.c          | 322 ++++++++++++++++++++++---------------------<br class="">src/box/sql/sqliteInt.h      |   5 +<br class="">src/box/sql/trigger.c        |  27 ++--<br class="">test/sql/transition.result   |  11 +-<br class="">test/sql/transition.test.lua |   8 +-<br class="">5 files changed, 190 insertions(+), 183 deletions(-)<br class=""><br class="">diff --git a/src/box/sql/build.c b/src/box/sql/build.c<br class="">index 229c8b4d5..02d27dec6 100644<br class="">--- a/src/box/sql/build.c<br class="">+++ b/src/box/sql/build.c<br class="">@@ -2238,9 +2182,11 @@ sqlite3CodeDropTable(Parse * pParse, Table * pTab, int isView)<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="">1. sqlite3CodeDropTable now is used in build.c only, and can be declared as static (and removed from sqliteInt.h).</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=""></div></blockquote><div><br class=""></div><div>Done:</div><div><br class=""></div><div><div>--- a/src/box/sql/build.c</div><div>+++ b/src/box/sql/build.c</div></div><div><div>@@ -2306,7 +2250,7 @@ sqlite3ClearStatTables(Parse * pParse,<span class="Apple-tab-span" style="white-space:pre">  </span>/* The parsing context */</div><div> /*</div><div>  * Generate code to drop a table.</div><div>  */</div><div>-void</div><div>+static void</div><div><div> sqlite3CodeDropTable(Parse * pParse, Table * pTab, int isView)</div><div class=""><br class=""></div><div class=""><div class="">--- a/src/box/sql/sqliteInt.h</div><div class="">+++ b/src/box/sql/sqliteInt.h</div></div><div class=""><div class="">@@ -3007,7 +3012,6 @@ int sqlite3ViewGetColumnNames(Parse *, Table *);</div><div class=""> int sqlite3DbMaskAllZero(yDbMask);</div><div class=""> #endif</div><div class=""> void sqlite3DropTable(Parse *, SrcList *, int, int);</div><div class="">-void sqlite3CodeDropTable(Parse *, Table *, int);</div></div></div></div><br class=""><blockquote type="cite" class=""><div 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>v = sqlite3GetVdbe(pParse);<br class=""><span class="Apple-tab-span" style="white-space: pre;">  </span>assert(v != 0);<br class=""><span class="Apple-tab-span" style="white-space: pre;">      </span>sqlite3BeginWriteOperation(pParse, 1);<br class="">-<br class="">-<span class="Apple-tab-span" style="white-space: pre;">        </span>/* Drop all triggers associated with the table being dropped. Code<br class="">-<span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-converted-space"> </span>* is generated to remove entries from _trigger space.<br class="">+<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-converted-space"> </span>* Drop all triggers associated with the table being<br class="">+<span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-converted-space"> </span>* dropped. Code is generated to remove entries from<br class="">+<span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-converted-space"> </span>* _trigger. OP_DropTrigger will remove it from internal<br class="">+<span class="Apple-tab-span" style="white-space: pre;">      </span><span class="Apple-converted-space"> </span>* SQL structures.<br class=""><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>pTrigger = pTab->pTrigger;<br class=""><span class="Apple-tab-span" style="white-space: pre;">        </span>/* Do not account triggers deletion - they will be accounted<br class="">@@ -2254,58 +2200,115 @@ sqlite3CodeDropTable(Parse * pParse, Table * pTab, int isView)<br class="">-<br class="">-<span class="Apple-tab-span" style="white-space: pre;">      </span>/* Drop all _space and _index entries that refer to the<br class="">-<span class="Apple-tab-span" style="white-space: pre;">     </span><span class="Apple-converted-space"> </span>* table. The program loops through the _index & _space tables and deletes<br class="">-<span class="Apple-tab-span" style="white-space: pre;">        </span><span class="Apple-converted-space"> </span>* every row that refers to a table.<br class="">-<span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-converted-space"> </span>* Triggers are handled separately because a trigger can be<br class="">-<span class="Apple-tab-span" style="white-space: pre;">   </span><span class="Apple-converted-space"> </span>* created in the temp database that refers to a table in another<br class="">-<span class="Apple-tab-span" style="white-space: pre;">     </span><span class="Apple-converted-space"> </span>* database.<br class="">+<span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>/* Delete entry by from _space_sequence. */<br class="">+<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-tab-span" style="white-space: pre;">  </span>sqlite3VdbeAddOp3(v, OP_MakeRecord, space_id_reg, 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-converted-space"> </span> idx_rec_reg);<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_SDelete, BOX_SPACE_SEQUENCE_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-tab-span" style="white-space: pre;">  </span><span class="Apple-converted-space"> </span> idx_rec_reg);<br class="">+<span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>VdbeComment((v, "Delete entry from _space_sequence"));<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><span class="Apple-converted-space"> </span>* Program below implement analogue of SQL statement:<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>* "DELETE FROM BOX_SEQUENCE WHERE name = zName;"<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>* However, we can't use nested parse for DDL,<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>* since pointers to spaces will expire.<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=""></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="">2. Why do you delete by name, if you have struct space.sequence->def->id?</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=""></div></blockquote><div><br class=""></div><div>To be honest, I forgot about such opportunity. Fetching id directly from sequence</div><div>allows to significantly reduce number of opcodes and simplify query logic:</div><div><br class=""></div><div><div>+<span class="Apple-tab-span" style="white-space:pre">                </span>/* Delete entry by id from _sequence. */</div><div>+<span class="Apple-tab-span" style="white-space:pre">            </span>assert(space->sequence != NULL);</div><div>+<span class="Apple-tab-span" style="white-space:pre">         </span>int sequence_id_reg = ++pParse->nMem;</div><div>+<span class="Apple-tab-span" style="white-space:pre">            </span>sqlite3VdbeAddOp2(v, OP_Integer, space->sequence->def->id,</div><div>+<span class="Apple-tab-span" style="white-space:pre">                         </span>  sequence_id_reg);</div><div>+<span class="Apple-tab-span" style="white-space:pre">            </span>sqlite3VdbeAddOp3(v, OP_MakeRecord, sequence_id_reg, 1,</div><div>+<span class="Apple-tab-span" style="white-space:pre">                             </span>  idx_rec_reg);</div><div>+<span class="Apple-tab-span" style="white-space:pre">                </span>sqlite3VdbeAddOp2(v, OP_SDelete, BOX_SEQUENCE_ID, idx_rec_reg);</div><div>+<span class="Apple-tab-span" style="white-space:pre">             </span>VdbeComment((v, "Delete entry from _sequence"));</div><div>+<span class="Apple-tab-span" style="white-space:pre">  </span>}</div></div><br class=""><blockquote type="cite" class=""><div 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="">+<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-converted-space"> </span>* Drop all _space and _index entries that refer to the<br class="">+<span class="Apple-tab-span" style="white-space: pre;">       </span><span class="Apple-converted-space"> </span>* table.<br class=""><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>int space_id = SQLITE_PAGENO_TO_SPACEID(pTab->tnum);<br class=""><span class="Apple-tab-span" style="white-space: pre;">      </span>if (!isView) {<br class="">-<span class="Apple-tab-span" style="white-space: pre;">      </span><span class="Apple-tab-span" style="white-space: pre;">  </span>if (pTab->pIndex && pTab->pIndex->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>/*  Remove all indexes, except for primary.<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>  Tarantool won't allow remove primary when secondary exist. */<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>sqlite3NestedParse(pParse,<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>  "DELETE FROM \"%s\" WHERE \"id\"=%d AND \"iid\">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-tab-span" style="white-space: pre;">  </span><span class="Apple-converted-space"> </span>  TARANTOOL_SYS_INDEX_NAME, space_id);<br class="">+<span class="Apple-tab-span" style="white-space: pre;">     </span><span class="Apple-tab-span" style="white-space: pre;">  </span>struct space *space = space_by_id(space_id);<br class="">+<span class="Apple-tab-span" style="white-space: pre;">        </span><span class="Apple-tab-span" style="white-space: pre;">  </span>assert(space != NULL);<br class="">+<span class="Apple-tab-span" style="white-space: pre;">      </span><span class="Apple-tab-span" style="white-space: pre;">  </span>uint32_t index_count = space->index_count;<br class="">+<span class="Apple-tab-span" style="white-space: pre;">       </span><span class="Apple-tab-span" style="white-space: pre;">  </span>if (index_count > 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>/*<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>* Remove all indexes, except for primary.<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>* Tarantool won't allow remove primary when<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>* secondary exist.<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>*/<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>uint32_t *iids =<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>(uint32_t *) sqlite3Malloc(sizeof(uint32_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><span class="Apple-converted-space"> </span>  (index_count - 1));<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="">3.1. Check for OOM;</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="">3.2. For such short lived allocations you can use region_alloc - it allows to avoid multiple free() calls on each alloc, and free all temp allocations at once after a transaction is finished.</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=""></div></blockquote><div><br class=""></div><div>Ok, substituted with region_alloc:</div><div><br class=""></div><div><div><div>+<span class="Apple-tab-span" style="white-space:pre">                       </span>size_t size = sizeof(uint32_t) * (index_count - 1);</div><div>+<span class="Apple-tab-span" style="white-space:pre">                 </span>uint32_t *iids =</div><div>+<span class="Apple-tab-span" style="white-space:pre">                            </span>(uint32_t *) region_alloc(&fiber()->gc, size);</div><div>+<span class="Apple-tab-span" style="white-space:pre">                       </span>if (iids == NULL) {</div><div>+<span class="Apple-tab-span" style="white-space:pre">                         </span>diag_set(OutOfMemory, size, "region_alloc",</div><div>+<span class="Apple-tab-span" style="white-space:pre">                                       </span> "iids");</div><div>+<span class="Apple-tab-span" style="white-space:pre">                         </span>return;</div><div>+<span class="Apple-tab-span" style="white-space:pre">                     </span>}</div><div><br class=""></div></div></div><blockquote type="cite" class=""><div 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="">@@ -2603,16 +2606,18 @@ sqlite3RefillIndex(Parse * pParse, Index * pIndex, int memRootPage)<br class=""><span class="Apple-tab-span" style="white-space: pre;"> </span>sqlite3VdbeJumpHere(v, addr1);<br class=""><span class="Apple-tab-span" style="white-space: pre;">       </span>if (memRootPage < 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_Clear, tnum, 0);<br class="">-<span class="Apple-tab-span" style="white-space: pre;">    </span>struct space *space = space_by_id(SQLITE_PAGENO_TO_SPACEID(tnum));<br class="">-<span class="Apple-tab-span" style="white-space: pre;">  </span>assert(space != NULL);<br class=""><span class="Apple-tab-span" style="white-space: pre;">       </span>int space_ptr_reg = ++pParse->nMem;<br class="">-<span class="Apple-tab-span" style="white-space: pre;">      </span>sqlite3VdbeAddOp4Int64(v, OP_Int64, 0, space_ptr_reg, 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-converted-space"> </span>      ((int64_t) space));<br class="">+<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-converted-space"> </span>* OP_Clear can use truncate optimization<br class="">+<span class="Apple-tab-span" style="white-space: pre;">     </span><span class="Apple-converted-space"> </span>* (i.e. insert record into _truncate) and schema<br class="">+<span class="Apple-tab-span" style="white-space: pre;">     </span><span class="Apple-converted-space"> </span>* may change. Thus, use dynamic conversion from<br class="">+<span class="Apple-tab-span" style="white-space: pre;">      </span><span class="Apple-converted-space"> </span>* space id to ptr.<br class="">+<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>sqlite3VdbeAddOp2(v, OP_SIDtoPtr, SQLITE_PAGENO_TO_SPACEID(tnum),<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> space_ptr_reg);<br class=""><span class="Apple-tab-span" style="white-space: pre;"> </span>sqlite3VdbeAddOp4(v, OP_OpenWrite, iIdx, tnum, space_ptr_reg,<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> (char *)pKey, P4_KEYINFO);<br class="">-<span class="Apple-tab-span" style="white-space: pre;">     </span>sqlite3VdbeChangeP5(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-converted-space"> </span>   OPFLAG_BULKCSR | ((memRootPage >= 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-tab-span" style="white-space: pre;">  </span><span class="Apple-converted-space"> </span>     OPFLAG_P2ISREG : 0));<br class="">+<span class="Apple-tab-span" style="white-space: pre;">  </span>sqlite3VdbeChangeP5(v, OPFLAG_FRESH_PTR);<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="">4. OPFLAG_FRESH_PTR seems to be unused. Why do you need it?</span></div></blockquote><br class=""></div><div>I need it to indicate that pointer can’t become expired. Its usage is introduced in the last patch.</div><br class=""></body></html>