<div dir="ltr"><br><br><div class="gmail_quote"><div dir="ltr">чт, 19 июл. 2018 г. в 3:20, n.pettik <<a href="mailto:korablev@tarantool.org">korablev@tarantool.org</a>>:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">When answering on review, include only chunks related to your answers.<br>
Otherwise, letter becomes really long..<br>
<br></blockquote><div><br></div><div>I'm sorry.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
> <br>
> > @@ -1725,9 +1727,9 @@ xferOptimization(Parse * pParse,        /* Parser context */<br>
> >       int emptyDestTest = 0;  /* Address of test for empty pDest */<br>
> >       int emptySrcTest = 0;   /* Address of test for empty pSrc */<br>
> >       Vdbe *v;                /* The VDBE we are building */<br>
> > -     int destHasUniqueIdx = 0;       /* True if pDest has a UNIQUE index */<br>
> >       int regData, regTupleid;        /* Registers holding data and tupleid */<br>
> >       struct session *user_session = current_session();<br>
> > +     bool is_err_action_default = false;<br>
> <br>
> Again: why do you need this flag? Default action is just synonym for ABORT,<br>
> so why should we care about it?<br>
> <br>
> <br>
> It's all about conflict action priorities as I said before.<br>
> Consider the following example:<br>
> ```<br>
>               CREATE TABLE t1(a INTEGER PRIMARY KEY ON CONFLICT REPLACE, b);<br>
>               CREATE TABLE t2(a INTEGER PRIMARY KEY ON CONFLICT REPLACE, b);<br>
>               INSERT INTO t1 VALUES (1, 1), (3, 3), (5, 5);<br>
>               INSERT INTO t2 VALUES (2, 2), (3, 4);<br>
>               BEGIN;<br>
>                       INSERT INTO t2 VALUES (4, 4);<br>
>                       INSERT INTO t2 SELECT * FROM t1;<br>
>                       INSERT INTO t2 VALUES (10, 10);<br>
>               COMMIT;<br>
<br>
onError is an action of whole statement, not of index.<br>
In your example onError == ABORT == DEFAULT.<br>
Replace action of index is not involved in code you wrote.<br></blockquote><div><br></div><div>As we discussed, was *_ABORT explicitly set or not makes sense</div><div>till we have conflict actions on indices. </div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
>+      uint32_t src_space_id = SQLITE_PAGENO_TO_SPACEID(pSrc->tnum);<br>
>+      struct space *src_space = space_by_id(src_space_id);<br>
>+      uint32_t dest_space_id = SQLITE_PAGENO_TO_SPACEID(pDest->tnum);<br>
>+      struct space *dest_space = space_by_id(dest_space_id);<br>
<br>
Move here also assert:<br>
<br>
assert(src_space != NULL && dest_space != NULL);<br>
<br></blockquote><div><br></div><div>Done.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
> > diff --git a/test/sql-tap/gh-3307-xfer-optimization-issue.test.lua b/test/sql-tap/gh-3307-xfer-optimization-issue.test.lua<br>
> > new file mode 100755<br>
> > index 0000000..e75fabc<br>
> > --- /dev/null<br>
> > +test:do_catchsql_test(<br>
> > +     "xfer-optimization-1.15",<br>
> > +     [[<br>
> > +             DROP TABLE t1;<br>
> > +             DROP TABLE t2;<br>
> > +             CREATE TABLE t1(a INTEGER PRIMARY KEY, b UNIQUE);<br>
> > +             CREATE TABLE t2(a INTEGER PRIMARY KEY, b UNIQUE);<br>
> > +             INSERT INTO t1 VALUES (2, 2), (3, 3), (5, 5);<br>
> > +             INSERT INTO t2 VALUES (1, 1), (4, 4);<br>
> > +             INSERT OR ROLLBACK INTO t2 SELECT * FROM t1;<br>
> <br>
> INSERT OT ROLLBACK outside transaction works the same as ABORT and DEFAULT.<br>
> So, surround it with transaction and check that it really rollbacks.<br>
> <br>
> There are basically almost the same tests surrounded by transactions (1.30 - 1.35).<br>
<br>
If so, remove redundant tests pls.<br>
<br></blockquote><div><br></div><div>Removed them. Also added tests that check if xfer</div><div>was actually used in first bunch of tests.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
> -/* Opcode: RowData P1 P2 * * *<br>
> +/* Opcode: RowData P1 P2 * * P5<br>
>   * Synopsis: r[P2]=data<br>
>   *<br>
>   * Write into register P2 the complete row content for the row at<br>
> @@ -3984,6 +3994,8 @@ case OP_SorterData: {<br>
>   * There is no interpretation of the data.<br>
>   * It is just copied onto the P2 register exactly as<br>
>   * it is found in the database file.<br>
> + * P5 can be used in debug mode to check if xferOptimization has<br>
> + * actually started processing.<br>
>   *<br>
>   * If cursor P1 is an index, then the content is the key of the row.<br>
>   * If cursor P2 is a table, then the content extracted is the data.<br>
> @@ -3996,6 +4008,13 @@ case OP_RowData: {<br>
>       BtCursor *pCrsr;<br>
>       u32 n;<br>
>  <br>
> +#ifdef SQLITE_TEST<br>
> +     if (pOp->p5 == 1) {<br>
<br>
Use named value (i.e. OPFLAG_XFER_OPT) even if they are the same.<br>
<br></blockquote><div><br></div><div>Thank you, forgot about this place when defined it.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
> +<br>
> +test:do_execsql_test(<br>
> +     "xfer-optimization-1.37",<br>
> +     [[<br>
> +                     INSERT INTO t2 VALUES (10, 10);<br>
<br>
Here (and in some other places) smth wrong with indentation, fix it pls.<br>
<br></blockquote><div><br></div><div>Indentation shows if stmt is in transaction, probably it looks a little weird,</div><div>but I'm more inclined to leave it there.</div><div><br></div><div>Diff that compares patch to prev. one:<br><br><div>diff --git a/src/box/sql/insert.c b/src/box/sql/insert.c</div><div>index c2df1c2..3c3bf37 100644</div><div>--- a/src/box/sql/insert.c</div><div>+++ b/src/box/sql/insert.c</div><div>@@ -1733,12 +1733,8 @@ xferOptimization(Parse * pParse,<span style="white-space:pre">       </span>/* Parser context */</div><div> <span style="white-space:pre">        </span>if (space_trigger_list(pDest->def->id) != NULL)</div><div> <span style="white-space:pre">               </span>return 0;</div><div> <span style="white-space:pre">   </span>if (onError == ON_CONFLICT_ACTION_DEFAULT) {</div><div>-<span style="white-space:pre">         </span>if (pDest->iPKey >= 0)</div><div>-<span style="white-space:pre">                 </span>onError = pDest->keyConf;</div><div>-<span style="white-space:pre">         </span>if (onError == ON_CONFLICT_ACTION_DEFAULT) {</div><div>-<span style="white-space:pre">                 </span>onError = ON_CONFLICT_ACTION_ABORT;</div><div>-<span style="white-space:pre">                  </span>is_err_action_default = true;</div><div>-<span style="white-space:pre">                </span>}</div><div>+<span style="white-space:pre">            </span>onError = ON_CONFLICT_ACTION_ABORT;</div><div>+<span style="white-space:pre">          </span>is_err_action_default = true;</div><div> <span style="white-space:pre">       </span>}</div><div> <span style="white-space:pre">   </span>assert(pSelect->pSrc);<span style="white-space:pre">    </span>/* allocated even if there is no FROM clause */</div><div> <span style="white-space:pre">     </span>if (pSelect->pSrc->nSrc != 1) {</div><div>@@ -1804,6 +1800,7 @@ xferOptimization(Parse * pParse,<span style="white-space:pre">   </span>/* Parser context */</div><div> <span style="white-space:pre">        </span>struct space *src_space = space_by_id(src_space_id);</div><div> <span style="white-space:pre">        </span>uint32_t dest_space_id = SQLITE_PAGENO_TO_SPACEID(pDest->tnum);</div><div> <span style="white-space:pre">  </span>struct space *dest_space = space_by_id(dest_space_id);</div><div>+<span style="white-space:pre">       </span>assert(src_space != NULL && dest_space != NULL);</div><div> <span style="white-space:pre">    </span>for (i = 0; i < (int)pDest->def->field_count; i++) {</div><div> <span style="white-space:pre">               </span>enum affinity_type dest_affinity =</div><div> <span style="white-space:pre">                  </span>pDest->def->fields[i].affinity;</div><div>@@ -1823,7 +1820,6 @@ xferOptimization(Parse * pParse,<span style="white-space:pre">   </span>/* Parser context */</div><div> <span style="white-space:pre">                </span>}</div><div> <span style="white-space:pre">           </span>/* Default values for second and subsequent columns need to match. */</div><div> <span style="white-space:pre">               </span>if (i > 0) {</div><div>-<span style="white-space:pre">                      </span>assert(src_space != NULL && dest_space != NULL);</div><div> <span style="white-space:pre">                    </span>char *src_expr_str =</div><div> <span style="white-space:pre">                                </span>src_space->def->fields[i].default_value;</div><div> <span style="white-space:pre">                      </span>char *dest_expr_str =</div><div>@@ -1885,12 +1881,11 @@ xferOptimization(Parse * pParse,<span style="white-space:pre"> </span>/* Parser context */</div><div> </div><div> <span style="white-space:pre">       </span>/*</div><div> <span style="white-space:pre">  </span> * Xfer optimization is unable to correctly insert data</div><div>-<span style="white-space:pre">      </span> * in case there's a conflict action other than *_ABORT.</div><div>-<span style="white-space:pre"> </span> * This is the reason we want to only run it if the</div><div>-<span style="white-space:pre">  </span> * destination table is initially empty.</div><div>+<span style="white-space:pre">     </span> * in case there's a conflict action other than</div><div>+<span style="white-space:pre">  </span> * explicit *_ABORT. This is the reason we want to only</div><div>+<span style="white-space:pre">      </span> * run it if the destination table is initially empty.</div><div> <span style="white-space:pre">      </span> * That block generates code to make that determination.</div><div> <span style="white-space:pre">    </span> */</div><div>-</div><div> <span style="white-space:pre"> </span>if (!(onError == ON_CONFLICT_ACTION_ABORT &&</div><div> <span style="white-space:pre">        </span>    is_err_action_default == false)) {</div><div> <span style="white-space:pre">            </span>addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iDest, 0);</div><div>diff --git a/src/box/sql/vdbe.c b/src/box/sql/vdbe.c</div><div>index 5f9bc13..bc169d9 100644</div><div>--- a/src/box/sql/vdbe.c</div><div>+++ b/src/box/sql/vdbe.c</div><div>@@ -4009,7 +4009,7 @@ case OP_RowData: {</div><div> <span style="white-space:pre">      </span>u32 n;</div><div> </div><div> #ifdef SQLITE_TEST</div><div>-<span style="white-space:pre">   </span>if (pOp->p5 == 1) {</div><div>+<span style="white-space:pre">       </span>if (pOp->p5 == OPFLAG_XFER_OPT) {</div><div> <span style="white-space:pre">                </span>pOp->p5 = 0;</div><div> <span style="white-space:pre">             </span>sql_xfer_count++;</div><div> <span style="white-space:pre">   </span>}</div><div>diff --git a/test/sql-tap/gh-3307-xfer-optimization-issue.test.lua b/test/sql-tap/gh-3307-xfer-optimization-issue.test.lua</div><div>index 34f603f..29f0efe 100755</div><div>--- a/test/sql-tap/gh-3307-xfer-optimization-issue.test.lua</div><div>+++ b/test/sql-tap/gh-3307-xfer-optimization-issue.test.lua</div><div>@@ -1,9 +1,29 @@</div><div> #!/usr/bin/env tarantool</div><div> test = require("sqltester")</div><div>-test:plan(44)</div><div>+test:plan(46)</div><div> </div><div> local bfr, aftr</div><div> </div><div>+local function do_xfer_test(test_number, return_code)</div><div>+<span style="white-space:pre">    </span>test_name = string.format("xfer-optimization-1.%d", test_number)</div><div>+<span style="white-space:pre">   </span>test:do_test(</div><div>+<span style="white-space:pre">                </span>test_name,</div><div>+<span style="white-space:pre">           </span>function()</div><div>+<span style="white-space:pre">                   </span>if (aftr - bfr == 1) then</div><div>+<span style="white-space:pre">                            </span>return {1}</div><div>+<span style="white-space:pre">                   </span>end</div><div>+<span style="white-space:pre">                  </span>if (aftr == bfr) then</div><div>+<span style="white-space:pre">                                </span>return {0}</div><div>+<span style="white-space:pre">                   </span>end</div><div>+<span style="white-space:pre">          </span>end, {</div><div>+<span style="white-space:pre">                       </span>-- <test_name></div><div>+<span style="white-space:pre">                 </span>return_code</div><div>+<span style="white-space:pre">                  </span>-- <test_name></div><div>+<span style="white-space:pre">         </span>})</div><div>+end</div><div>+</div><div>+bfr = box.sql.debug().sql_xfer_count</div><div>+</div><div> test:do_catchsql_test(</div><div> <span style="white-space:pre">    </span>"xfer-optimization-1.1",</div><div> <span style="white-space:pre">  </span>[[</div><div>@@ -17,6 +37,8 @@ test:do_catchsql_test(</div><div> <span style="white-space:pre">           </span>-- <xfer-optimization-1.1></div><div> <span style="white-space:pre">    </span>})</div><div> </div><div>+aftr = box.sql.debug().sql_xfer_count</div><div>+</div><div> test:do_execsql_test(</div><div> <span style="white-space:pre">      </span>"xfer-optimization-1.2",</div><div> <span style="white-space:pre">  </span>[[</div><div>@@ -27,8 +49,12 @@ test:do_execsql_test(</div><div> <span style="white-space:pre">           </span>-- <xfer-optimization-1.2></div><div> <span style="white-space:pre">    </span>})</div><div> </div><div>+do_xfer_test(3, 1)</div><div>+</div><div>+bfr = box.sql.debug().sql_xfer_count</div><div>+</div><div> test:do_catchsql_test(</div><div>-<span style="white-space:pre">     </span>"xfer-optimization-1.3",</div><div>+<span style="white-space:pre">   </span>"xfer-optimization-1.4",</div><div> <span style="white-space:pre">  </span>[[</div><div> <span style="white-space:pre">          </span>DROP TABLE t1;</div><div> <span style="white-space:pre">              </span>DROP TABLE t2;</div><div>@@ -39,23 +65,29 @@ test:do_catchsql_test(</div><div> <span style="white-space:pre">             </span>INSERT INTO t1 VALUES (1, 1), (2, 2), (3, 3);</div><div> <span style="white-space:pre">               </span>INSERT INTO t2 SELECT * FROM t1;</div><div> <span style="white-space:pre">    </span>]], {</div><div>-<span style="white-space:pre">                </span>-- <xfer-optimization-1.3></div><div>+<span style="white-space:pre">             </span>-- <xfer-optimization-1.4></div><div> <span style="white-space:pre">            </span>0</div><div>-<span style="white-space:pre">            </span>-- <xfer-optimization-1.3></div><div>+<span style="white-space:pre">             </span>-- <xfer-optimization-1.4></div><div> <span style="white-space:pre">    </span>})</div><div> </div><div>+aftr = box.sql.debug().sql_xfer_count</div><div>+</div><div> test:do_execsql_test(</div><div>-<span style="white-space:pre">       </span>"xfer-optimization-1.4",</div><div>+<span style="white-space:pre">   </span>"xfer-optimization-1.5",</div><div> <span style="white-space:pre">  </span>[[</div><div> <span style="white-space:pre">          </span>SELECT * FROM t2;</div><div> <span style="white-space:pre">   </span>]], {</div><div>-<span style="white-space:pre">                </span>-- <xfer-optimization-1.4></div><div>+<span style="white-space:pre">             </span>-- <xfer-optimization-1.5></div><div> <span style="white-space:pre">            </span>1, 1, 2, 2, 3, 3</div><div>-<span style="white-space:pre">             </span>-- <xfer-optimization-1.4></div><div>+<span style="white-space:pre">             </span>-- <xfer-optimization-1.5></div><div> <span style="white-space:pre">    </span>})</div><div> </div><div>+do_xfer_test(6, 1)</div><div>+</div><div>+bfr = box.sql.debug().sql_xfer_count</div><div>+</div><div> test:do_catchsql_test(</div><div>-<span style="white-space:pre">     </span>"xfer-optimization-1.5",</div><div>+<span style="white-space:pre">   </span>"xfer-optimization-1.7",</div><div> <span style="white-space:pre">  </span>[[</div><div> <span style="white-space:pre">          </span>DROP TABLE t1;</div><div> <span style="white-space:pre">              </span>DROP TABLE t2;</div><div>@@ -64,23 +96,29 @@ test:do_catchsql_test(</div><div> <span style="white-space:pre">             </span>CREATE TABLE t2(a INTEGER PRIMARY KEY, b INTEGER);</div><div> <span style="white-space:pre">          </span>INSERT INTO t2 SELECT * FROM t1;</div><div> <span style="white-space:pre">    </span>]], {</div><div>-<span style="white-space:pre">                </span>-- <xfer-optimization-1.5></div><div>+<span style="white-space:pre">             </span>-- <xfer-optimization-1.7></div><div> <span style="white-space:pre">            </span>1, "table T2 has 2 columns but 3 values were supplied"</div><div>-<span style="white-space:pre">             </span>-- <xfer-optimization-1.5></div><div>+<span style="white-space:pre">             </span>-- <xfer-optimization-1.7></div><div> <span style="white-space:pre">    </span>})</div><div> </div><div>+aftr = box.sql.debug().sql_xfer_count</div><div>+</div><div> test:do_execsql_test(</div><div>-<span style="white-space:pre">       </span>"xfer-optimization-1.6",</div><div>+<span style="white-space:pre">   </span>"xfer-optimization-1.8",</div><div> <span style="white-space:pre">  </span>[[</div><div> <span style="white-space:pre">          </span>SELECT * FROM t2;</div><div> <span style="white-space:pre">   </span>]], {</div><div>-<span style="white-space:pre">                </span>-- <xfer-optimization-1.6></div><div>+<span style="white-space:pre">             </span>-- <xfer-optimization-1.8></div><div> </div><div>-<span style="white-space:pre">            </span>-- <xfer-optimization-1.6></div><div>+<span style="white-space:pre">             </span>-- <xfer-optimization-1.8></div><div> <span style="white-space:pre">    </span>})</div><div> </div><div>+do_xfer_test(9, 0)</div><div>+</div><div>+bfr = box.sql.debug().sql_xfer_count</div><div>+</div><div> test:do_catchsql_test(</div><div>-<span style="white-space:pre">     </span>"xfer-optimization-1.7",</div><div>+<span style="white-space:pre">   </span>"xfer-optimization-1.10",</div><div> <span style="white-space:pre"> </span>[[</div><div> <span style="white-space:pre">          </span>DROP TABLE t1;</div><div> <span style="white-space:pre">              </span>DROP TABLE t2;</div><div>@@ -89,23 +127,29 @@ test:do_catchsql_test(</div><div> <span style="white-space:pre">            </span>CREATE TABLE t2(a INTEGER PRIMARY KEY, b INTEGER);</div><div> <span style="white-space:pre">          </span>INSERT INTO t2 SELECT * FROM t1;</div><div> <span style="white-space:pre">    </span>]], {</div><div>-<span style="white-space:pre">                </span>-- <xfer-optimization-1.7></div><div>+<span style="white-space:pre">             </span>-- <xfer-optimization-1.10></div><div> <span style="white-space:pre">           </span>0</div><div>-<span style="white-space:pre">            </span>-- <xfer-optimization-1.7></div><div>+<span style="white-space:pre">             </span>-- <xfer-optimization-1.10></div><div> <span style="white-space:pre">   </span>})</div><div> </div><div>+aftr = box.sql.debug().sql_xfer_count</div><div>+</div><div> test:do_execsql_test(</div><div>-<span style="white-space:pre">       </span>"xfer-optimization-1.8",</div><div>+<span style="white-space:pre">   </span>"xfer-optimization-1.11",</div><div> <span style="white-space:pre"> </span>[[</div><div> <span style="white-space:pre">          </span>SELECT * FROM t2;</div><div> <span style="white-space:pre">   </span>]], {</div><div>-<span style="white-space:pre">                </span>-- <xfer-optimization-1.6></div><div>+<span style="white-space:pre">             </span>-- <xfer-optimization-1.11></div><div> <span style="white-space:pre">           </span>1, 1, 2, 2, 3, 3</div><div>-<span style="white-space:pre">             </span>-- <xfer-optimization-1.6></div><div>+<span style="white-space:pre">             </span>-- <xfer-optimization-1.11></div><div> <span style="white-space:pre">   </span>})</div><div> </div><div>+do_xfer_test(12, 1);</div><div>+</div><div>+bfr = box.sql.debug().sql_xfer_count</div><div>+</div><div> test:do_catchsql_test(</div><div>-<span style="white-space:pre">   </span>"xfer-optimization-1.9",</div><div>+<span style="white-space:pre">   </span>"xfer-optimization-1.13",</div><div> <span style="white-space:pre"> </span>[[</div><div> <span style="white-space:pre">          </span>DROP TABLE t1;</div><div> <span style="white-space:pre">              </span>DROP TABLE t2;</div><div>@@ -114,23 +158,29 @@ test:do_catchsql_test(</div><div> <span style="white-space:pre">           </span>CREATE TABLE t2(b INTEGER, a INTEGER PRIMARY KEY);</div><div> <span style="white-space:pre">          </span>INSERT INTO t2 SELECT * FROM t1;</div><div> <span style="white-space:pre">    </span>]], {</div><div>-<span style="white-space:pre">                </span>-- <xfer-optimization-1.9></div><div>+<span style="white-space:pre">             </span>-- <xfer-optimization-1.13></div><div> <span style="white-space:pre">           </span>1, "Duplicate key exists in unique index 'sqlite_autoindex_T2_1' in space 'T2'"</div><div>-<span style="white-space:pre">            </span>-- <xfer-optimization-1.9></div><div>+<span style="white-space:pre">             </span>-- <xfer-optimization-1.13></div><div> <span style="white-space:pre">   </span>})</div><div> </div><div>+aftr = box.sql.debug().sql_xfer_count</div><div>+</div><div> test:do_execsql_test(</div><div>-<span style="white-space:pre">       </span>"xfer-optimization-1.10",</div><div>+<span style="white-space:pre">  </span>"xfer-optimization-1.14",</div><div> <span style="white-space:pre"> </span>[[</div><div> <span style="white-space:pre">          </span>SELECT * FROM t2;</div><div> <span style="white-space:pre">   </span>]], {</div><div>-<span style="white-space:pre">                </span>-- <xfer-optimization-1.10></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.14></div><div> </div><div>-<span style="white-space:pre">           </span>-- <xfer-optimization-1.10></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.14></div><div> <span style="white-space:pre">   </span>})</div><div> </div><div>+do_xfer_test(15, 0)</div><div>+</div><div>+bfr = box.sql.debug().sql_xfer_count</div><div>+</div><div> test:do_catchsql_test(</div><div>-<span style="white-space:pre">    </span>"xfer-optimization-1.11",</div><div>+<span style="white-space:pre">  </span>"xfer-optimization-1.16",</div><div> <span style="white-space:pre"> </span>[[</div><div> <span style="white-space:pre">          </span>DROP TABLE t1;</div><div> <span style="white-space:pre">              </span>DROP TABLE t2;</div><div>@@ -139,72 +189,24 @@ test:do_catchsql_test(</div><div> <span style="white-space:pre">           </span>CREATE TABLE t2(b INTEGER PRIMARY KEY, a INTEGER);</div><div> <span style="white-space:pre">          </span>INSERT INTO t2 SELECT * FROM t1;</div><div> <span style="white-space:pre">    </span>]], {</div><div>-<span style="white-space:pre">                </span>-- <xfer-optimization-1.11></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.16></div><div> <span style="white-space:pre">           </span>0</div><div>-<span style="white-space:pre">            </span>-- <xfer-optimization-1.11></div><div>-<span style="white-space:pre">    </span>})</div><div>-</div><div>-test:do_execsql_test(</div><div>-<span style="white-space:pre">      </span>"xfer-optimization-1.12",</div><div>-<span style="white-space:pre">  </span>[[</div><div>-<span style="white-space:pre">           </span>SELECT * FROM t2;</div><div>-<span style="white-space:pre">    </span>]], {</div><div>-<span style="white-space:pre">                </span>-- <xfer-optimization-1.12></div><div>-<span style="white-space:pre">            </span>1, 1, 2, 2, 3, 2</div><div>-<span style="white-space:pre">             </span>-- <xfer-optimization-1.12></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.16></div><div> <span style="white-space:pre">   </span>})</div><div> </div><div>-test:do_catchsql_test(</div><div>-<span style="white-space:pre">    </span>"xfer-optimization-1.13",</div><div>-<span style="white-space:pre">  </span>[[</div><div>-<span style="white-space:pre">           </span>DROP TABLE t1;</div><div>-<span style="white-space:pre">               </span>DROP TABLE t2;</div><div>-<span style="white-space:pre">               </span>CREATE TABLE t1(a INTEGER PRIMARY KEY, b);</div><div>-<span style="white-space:pre">           </span>CREATE TABLE t2(a INTEGER PRIMARY KEY, b);</div><div>-<span style="white-space:pre">           </span>INSERT INTO t1 VALUES (3, 3), (4, 4), (5, 5);</div><div>-<span style="white-space:pre">                </span>INSERT INTO t2 VALUES (1, 1), (2, 2);</div><div>-<span style="white-space:pre">                </span>INSERT INTO t2 SELECT * FROM t1;</div><div>-<span style="white-space:pre">     </span>]], {</div><div>-<span style="white-space:pre">                </span>-- <xfer-optimization-1.13></div><div>-<span style="white-space:pre">            </span>0</div><div>-<span style="white-space:pre">            </span>-- <xfer-optimization-1.13></div><div>-<span style="white-space:pre">    </span>})</div><div>+aftr = box.sql.debug().sql_xfer_count</div><div> </div><div> test:do_execsql_test(</div><div>-<span style="white-space:pre">       </span>"xfer-optimization-1.14",</div><div>+<span style="white-space:pre">  </span>"xfer-optimization-1.17",</div><div> <span style="white-space:pre"> </span>[[</div><div> <span style="white-space:pre">          </span>SELECT * FROM t2;</div><div> <span style="white-space:pre">   </span>]], {</div><div>-<span style="white-space:pre">                </span>-- <xfer-optimization-1.14></div><div>-<span style="white-space:pre">            </span>1, 1, 2, 2, 3, 3, 4, 4, 5, 5</div><div>-<span style="white-space:pre">         </span>-- <xfer-optimization-1.14></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.17></div><div>+<span style="white-space:pre">            </span>1, 1, 2, 2, 3, 2</div><div>+<span style="white-space:pre">             </span>-- <xfer-optimization-1.17></div><div> <span style="white-space:pre">   </span>})</div><div> </div><div>-test:do_catchsql_test(</div><div>-<span style="white-space:pre">    </span>"xfer-optimization-1.15",</div><div>-<span style="white-space:pre">  </span>[[</div><div>-<span style="white-space:pre">           </span>DROP TABLE t1;</div><div>-<span style="white-space:pre">               </span>DROP TABLE t2;</div><div>-<span style="white-space:pre">               </span>CREATE TABLE t1(a INTEGER PRIMARY KEY, b UNIQUE);</div><div>-<span style="white-space:pre">            </span>CREATE TABLE t2(a INTEGER PRIMARY KEY, b UNIQUE);</div><div>-<span style="white-space:pre">            </span>INSERT INTO t1 VALUES (2, 2), (3, 3), (5, 5);</div><div>-<span style="white-space:pre">                </span>INSERT INTO t2 VALUES (1, 1), (4, 4);</div><div>-<span style="white-space:pre">                </span>INSERT OR ROLLBACK INTO t2 SELECT * FROM t1;</div><div>-<span style="white-space:pre"> </span>]], {</div><div>-<span style="white-space:pre">                </span>-- <xfer-optimization-1.15></div><div>-<span style="white-space:pre">            </span>0</div><div>-<span style="white-space:pre">            </span>-- <xfer-optimization-1.15></div><div>-<span style="white-space:pre">    </span>})</div><div>-</div><div>-test:do_execsql_test(</div><div>-<span style="white-space:pre">      </span>"xfer-optimization-1.16",</div><div>-<span style="white-space:pre">  </span>[[</div><div>-<span style="white-space:pre">           </span>SELECT * FROM t2;</div><div>-<span style="white-space:pre">    </span>]], {</div><div>-<span style="white-space:pre">                </span>-- <xfer-optimization-1.16></div><div>-<span style="white-space:pre">            </span>1, 1, 2, 2, 3, 3, 4, 4, 5, 5</div><div>-<span style="white-space:pre">         </span>-- <xfer-optimization-1.16></div><div>-<span style="white-space:pre">    </span>})</div><div>+do_xfer_test(18, 1)</div><div> </div><div> -- The following tests are supposed to test if xfer-optimization is actually</div><div> -- used in the given cases (if the conflict actually occurs):</div><div>@@ -220,23 +222,6 @@ test:do_execsql_test(</div><div> -- <span style="white-space:pre">       </span>5) insert with fail</div><div> -- <span style="white-space:pre">      </span>6) insert with ignore</div><div> </div><div>-local function do_xfer_test(test_number, return_code)</div><div>-<span style="white-space:pre">  </span>test_name = string.format("xfer-optimization-1.%d", test_number)</div><div>-<span style="white-space:pre">   </span>test:do_test(</div><div>-<span style="white-space:pre">                </span>test_name,</div><div>-<span style="white-space:pre">           </span>function()</div><div>-<span style="white-space:pre">                   </span>if (aftr - bfr == 1) then</div><div>-<span style="white-space:pre">                            </span>return {1}</div><div>-<span style="white-space:pre">                   </span>end</div><div>-<span style="white-space:pre">                  </span>if (aftr == bfr) then</div><div>-<span style="white-space:pre">                                </span>return {0}</div><div>-<span style="white-space:pre">                   </span>end</div><div>-<span style="white-space:pre">          </span>end, {</div><div>-<span style="white-space:pre">                       </span>-- <test_name></div><div>-<span style="white-space:pre">                 </span>return_code</div><div>-<span style="white-space:pre">                  </span>-- <test_name></div><div>-<span style="white-space:pre">         </span>})</div><div>-end</div><div> </div><div> -- 1.0) insert w/o explicit confl. action & w/o index replace action</div><div> ------------------------------------------------------------------------------</div><div>@@ -244,7 +229,7 @@ end</div><div> bfr = box.sql.debug().sql_xfer_count</div><div> </div><div> test:do_catchsql_test(</div><div>-<span style="white-space:pre">    </span>"xfer-optimization-1.17",</div><div>+<span style="white-space:pre">  </span>"xfer-optimization-1.19",</div><div> <span style="white-space:pre"> </span>[[</div><div> <span style="white-space:pre">          </span>DROP TABLE t1;</div><div> <span style="white-space:pre">              </span>DROP TABLE t2;</div><div>@@ -256,26 +241,26 @@ test:do_catchsql_test(</div><div> <span style="white-space:pre">                   </span>INSERT INTO t2 VALUES (4, 4);</div><div> <span style="white-space:pre">                       </span>INSERT INTO t2 SELECT * FROM t1;</div><div> <span style="white-space:pre">    </span>]], {</div><div>-<span style="white-space:pre">                </span>-- <xfer-optimization-1.17></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.19></div><div> <span style="white-space:pre">           </span>1, "Duplicate key exists in unique index 'sqlite_autoindex_T2_1' in space 'T2'"</div><div>-<span style="white-space:pre">            </span>-- <xfer-optimization-1.17></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.19></div><div> <span style="white-space:pre">   </span>})</div><div> </div><div> test:do_execsql_test(</div><div>-<span style="white-space:pre">    </span>"xfer-optimization-1.18",</div><div>+<span style="white-space:pre">  </span>"xfer-optimization-1.20",</div><div> <span style="white-space:pre"> </span>[[</div><div> <span style="white-space:pre">                  </span>INSERT INTO t2 VALUES (10, 10);</div><div> <span style="white-space:pre">             </span>COMMIT;</div><div> <span style="white-space:pre">             </span>SELECT * FROM t2;</div><div> <span style="white-space:pre">   </span>]], {</div><div>-<span style="white-space:pre">                </span>-- <xfer-optimization-1.18></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.20></div><div> <span style="white-space:pre">           </span>2, 2, 3, 4, 4, 4, 10, 10</div><div>-<span style="white-space:pre">             </span>-- <xfer-optimization-1.18></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.20></div><div> <span style="white-space:pre">   </span>})</div><div> </div><div> aftr = box.sql.debug().sql_xfer_count</div><div> </div><div>-do_xfer_test(19, 0)</div><div>+do_xfer_test(21, 0)</div><div> </div><div> -- 1.1) insert w/o explicit confl. action & w/</div><div> --      index replace action & empty dest_table</div><div>@@ -284,7 +269,7 @@ do_xfer_test(19, 0)</div><div> bfr = box.sql.debug().sql_xfer_count</div><div> </div><div> test:do_catchsql_test(</div><div>-<span style="white-space:pre">       </span>"xfer-optimization-1.20",</div><div>+<span style="white-space:pre">  </span>"xfer-optimization-1.22",</div><div> <span style="white-space:pre"> </span>[[</div><div> <span style="white-space:pre">          </span>DROP TABLE t1;</div><div> <span style="white-space:pre">              </span>DROP TABLE t2;</div><div>@@ -296,36 +281,36 @@ test:do_catchsql_test(</div><div> <span style="white-space:pre">                   </span>INSERT INTO t3 VALUES (1);</div><div> <span style="white-space:pre">                  </span>INSERT INTO t2 SELECT * FROM t1;</div><div> <span style="white-space:pre">    </span>]], {</div><div>-<span style="white-space:pre">                </span>-- <xfer-optimization-1.20></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.22></div><div> <span style="white-space:pre">           </span>0</div><div>-<span style="white-space:pre">            </span>-- <xfer-optimization-1.20></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.22></div><div> <span style="white-space:pre">   </span>})</div><div> </div><div> test:do_execsql_test(</div><div>-<span style="white-space:pre">    </span>"xfer-optimization-1.21",</div><div>+<span style="white-space:pre">  </span>"xfer-optimization-1.23",</div><div> <span style="white-space:pre"> </span>[[</div><div> <span style="white-space:pre">                  </span>INSERT INTO t2 VALUES (10, 10);</div><div> <span style="white-space:pre">             </span>COMMIT;</div><div> <span style="white-space:pre">             </span>SELECT * FROM t2;</div><div> <span style="white-space:pre">   </span>]], {</div><div>-<span style="white-space:pre">                </span>-- <xfer-optimization-1.21></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.23></div><div> <span style="white-space:pre">           </span>1, 1, 3, 3, 5, 5, 10, 10</div><div>-<span style="white-space:pre">             </span>-- <xfer-optimization-1.21></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.23></div><div> <span style="white-space:pre">   </span>})</div><div> </div><div> aftr = box.sql.debug().sql_xfer_count</div><div> </div><div> test:do_execsql_test(</div><div>-<span style="white-space:pre">     </span>"xfer-optimization-1.22",</div><div>+<span style="white-space:pre">  </span>"xfer-optimization-1.24",</div><div> <span style="white-space:pre"> </span>[[</div><div> <span style="white-space:pre">          </span>SELECT * FROM t3;</div><div> <span style="white-space:pre">   </span>]], {</div><div>-<span style="white-space:pre">                </span>-- <xfer-optimization-1.22></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.24></div><div> <span style="white-space:pre">           </span>1</div><div>-<span style="white-space:pre">            </span>-- <xfer-optimization-1.22></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.24></div><div> <span style="white-space:pre">   </span>})</div><div> </div><div>-do_xfer_test(23, 1)</div><div>+do_xfer_test(25, 1)</div><div> </div><div> -- 1.2) insert w/o explicit confl. action & w/</div><div> -- index replace action & non-empty dest_table</div><div>@@ -334,7 +319,7 @@ do_xfer_test(23, 1)</div><div> bfr = box.sql.debug().sql_xfer_count</div><div> </div><div> test:do_catchsql_test(</div><div>-<span style="white-space:pre">  </span>"xfer-optimization-1.24",</div><div>+<span style="white-space:pre">  </span>"xfer-optimization-1.26",</div><div> <span style="white-space:pre"> </span>[[</div><div> <span style="white-space:pre">          </span>DROP TABLE t1;</div><div> <span style="white-space:pre">              </span>DROP TABLE t2;</div><div>@@ -347,26 +332,26 @@ test:do_catchsql_test(</div><div> <span style="white-space:pre">                   </span>INSERT INTO t2 VALUES (4, 4);</div><div> <span style="white-space:pre">                       </span>INSERT INTO t2 SELECT * FROM t1;</div><div> <span style="white-space:pre">    </span>]], {</div><div>-<span style="white-space:pre">                </span>-- <xfer-optimization-1.24></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.26></div><div> <span style="white-space:pre">           </span>0</div><div>-<span style="white-space:pre">            </span>-- <xfer-optimization-1.24></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.26></div><div> <span style="white-space:pre">   </span>})</div><div> </div><div> test:do_execsql_test(</div><div>-<span style="white-space:pre">    </span>"xfer-optimization-1.25",</div><div>+<span style="white-space:pre">  </span>"xfer-optimization-1.27",</div><div> <span style="white-space:pre"> </span>[[</div><div> <span style="white-space:pre">                  </span>INSERT INTO t2 VALUES (10, 10);</div><div> <span style="white-space:pre">             </span>COMMIT;</div><div> <span style="white-space:pre">             </span>SELECT * FROM t2;</div><div> <span style="white-space:pre">   </span>]], {</div><div>-<span style="white-space:pre">                </span>-- <xfer-optimization-1.25></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.27></div><div> <span style="white-space:pre">           </span>1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 10, 10</div><div>-<span style="white-space:pre">         </span>-- <xfer-optimization-1.25></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.27></div><div> <span style="white-space:pre">   </span>})</div><div> </div><div> aftr = box.sql.debug().sql_xfer_count</div><div> </div><div>-do_xfer_test(26, 0)</div><div>+do_xfer_test(28, 0)</div><div> </div><div> -- 2) insert with abort</div><div> ------------------------------------------------------------------------------</div><div>@@ -374,7 +359,7 @@ do_xfer_test(26, 0)</div><div> bfr = box.sql.debug().sql_xfer_count</div><div> </div><div> test:do_catchsql_test(</div><div>-<span style="white-space:pre">  </span>"xfer-optimization-1.27",</div><div>+<span style="white-space:pre">  </span>"xfer-optimization-1.29",</div><div> <span style="white-space:pre"> </span>[[</div><div> <span style="white-space:pre">          </span>DROP TABLE t1;</div><div> <span style="white-space:pre">              </span>DROP TABLE t2;</div><div>@@ -386,26 +371,26 @@ test:do_catchsql_test(</div><div> <span style="white-space:pre">                   </span>INSERT INTO t2 VALUES (4, 4);</div><div> <span style="white-space:pre">                       </span>INSERT OR ABORT INTO t2 SELECT * FROM t1;</div><div> <span style="white-space:pre">   </span>]], {</div><div>-<span style="white-space:pre">                </span>-- <xfer-optimization-1.27></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.29></div><div> <span style="white-space:pre">           </span>1, "Duplicate key exists in unique index 'sqlite_autoindex_T2_1' in space 'T2'"</div><div>-<span style="white-space:pre">            </span>-- <xfer-optimization-1.27></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.29></div><div> <span style="white-space:pre">   </span>})</div><div> </div><div> test:do_execsql_test(</div><div>-<span style="white-space:pre">    </span>"xfer-optimization-1.28",</div><div>+<span style="white-space:pre">  </span>"xfer-optimization-1.30",</div><div> <span style="white-space:pre"> </span>[[</div><div> <span style="white-space:pre">                  </span>INSERT INTO t2 VALUES (10, 10);</div><div> <span style="white-space:pre">             </span>COMMIT;</div><div> <span style="white-space:pre">             </span>SELECT * FROM t2;</div><div> <span style="white-space:pre">   </span>]], {</div><div>-<span style="white-space:pre">                </span>-- <xfer-optimization-1.28></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.30></div><div> <span style="white-space:pre">           </span>2, 2, 3, 4, 4, 4, 10, 10</div><div>-<span style="white-space:pre">             </span>-- <xfer-optimization-1.28></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.30></div><div> <span style="white-space:pre">   </span>})</div><div> </div><div> aftr = box.sql.debug().sql_xfer_count</div><div> </div><div>-do_xfer_test(29, 1)</div><div>+do_xfer_test(31, 1)</div><div> </div><div> -- 3.0) insert with rollback (into empty table)</div><div> ------------------------------------------------------------------------------</div><div>@@ -413,7 +398,7 @@ do_xfer_test(29, 1)</div><div> bfr = box.sql.debug().sql_xfer_count</div><div> </div><div> test:do_catchsql_test(</div><div>-<span style="white-space:pre">  </span>"xfer-optimization-1.30",</div><div>+<span style="white-space:pre">  </span>"xfer-optimization-1.32",</div><div> <span style="white-space:pre"> </span>[[</div><div> <span style="white-space:pre">          </span>DROP TABLE t1;</div><div> <span style="white-space:pre">              </span>DROP TABLE t2;</div><div>@@ -423,26 +408,26 @@ test:do_catchsql_test(</div><div> <span style="white-space:pre">           </span>BEGIN;</div><div> <span style="white-space:pre">                      </span>INSERT OR ROLLBACK INTO t2 SELECT * FROM t1;</div><div> <span style="white-space:pre">        </span>]], {</div><div>-<span style="white-space:pre">                </span>-- <xfer-optimization-1.30></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.32></div><div> <span style="white-space:pre">           </span>0</div><div>-<span style="white-space:pre">            </span>-- <xfer-optimization-1.30></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.32></div><div> <span style="white-space:pre">   </span>})</div><div> </div><div> test:do_execsql_test(</div><div>-<span style="white-space:pre">    </span>"xfer-optimization-1.31",</div><div>+<span style="white-space:pre">  </span>"xfer-optimization-1.33",</div><div> <span style="white-space:pre"> </span>[[</div><div> <span style="white-space:pre">                  </span>INSERT INTO t2 VALUES (10, 10);</div><div> <span style="white-space:pre">             </span>COMMIT;</div><div> <span style="white-space:pre">             </span>SELECT * FROM t2;</div><div> <span style="white-space:pre">   </span>]], {</div><div>-<span style="white-space:pre">                </span>-- <xfer-optimization-1.31></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.33></div><div> <span style="white-space:pre">           </span>1, 1, 3, 3, 5, 5, 10, 10</div><div>-<span style="white-space:pre">             </span>-- <xfer-optimization-1.31></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.33></div><div> <span style="white-space:pre">   </span>})</div><div> </div><div> aftr = box.sql.debug().sql_xfer_count</div><div> </div><div>-do_xfer_test(32, 1)</div><div>+do_xfer_test(34, 1)</div><div> </div><div> -- 3.1) insert with rollback (into non-empty table)</div><div> ------------------------------------------------------------------------------</div><div>@@ -450,7 +435,7 @@ do_xfer_test(32, 1)</div><div> bfr = box.sql.debug().sql_xfer_count</div><div> </div><div> test:do_catchsql_test(</div><div>-<span style="white-space:pre">      </span>"xfer-optimization-1.33",</div><div>+<span style="white-space:pre">  </span>"xfer-optimization-1.35",</div><div> <span style="white-space:pre"> </span>[[</div><div> <span style="white-space:pre">          </span>DROP TABLE t1;</div><div> <span style="white-space:pre">              </span>DROP TABLE t2;</div><div>@@ -462,24 +447,24 @@ test:do_catchsql_test(</div><div> <span style="white-space:pre">                   </span>INSERT INTO t2 VALUES (4, 4);</div><div> <span style="white-space:pre">                       </span>INSERT OR ROLLBACK INTO t2 SELECT * FROM t1;</div><div> <span style="white-space:pre">        </span>]], {</div><div>-<span style="white-space:pre">                </span>-- <xfer-optimization-1.33></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.35></div><div> <span style="white-space:pre">           </span>1, "UNIQUE constraint failed: T2.A"</div><div>-<span style="white-space:pre">                </span>-- <xfer-optimization-1.33></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.35></div><div> <span style="white-space:pre">   </span>})</div><div> </div><div> test:do_execsql_test(</div><div>-<span style="white-space:pre">    </span>"xfer-optimization-1.34",</div><div>+<span style="white-space:pre">  </span>"xfer-optimization-1.36",</div><div> <span style="white-space:pre"> </span>[[</div><div> <span style="white-space:pre">          </span>SELECT * FROM t2;</div><div> <span style="white-space:pre">   </span>]], {</div><div>-<span style="white-space:pre">                </span>-- <xfer-optimization-1.34></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.36></div><div> <span style="white-space:pre">           </span>2, 2, 3, 4</div><div>-<span style="white-space:pre">           </span>-- <xfer-optimization-1.34></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.36></div><div> <span style="white-space:pre">   </span>})</div><div> </div><div> aftr = box.sql.debug().sql_xfer_count</div><div> </div><div>-do_xfer_test(35, 0)</div><div>+do_xfer_test(37, 0)</div><div> </div><div> -- 4) insert with replace</div><div> ------------------------------------------------------------------------------</div><div>@@ -487,7 +472,7 @@ do_xfer_test(35, 0)</div><div> bfr = box.sql.debug().sql_xfer_count</div><div> </div><div> test:do_catchsql_test(</div><div>-<span style="white-space:pre">        </span>"xfer-optimization-1.36",</div><div>+<span style="white-space:pre">  </span>"xfer-optimization-1.38",</div><div> <span style="white-space:pre"> </span>[[</div><div> <span style="white-space:pre">          </span>DROP TABLE t1;</div><div> <span style="white-space:pre">              </span>DROP TABLE t2;</div><div>@@ -499,26 +484,26 @@ test:do_catchsql_test(</div><div> <span style="white-space:pre">                   </span>INSERT INTO t2 VALUES (4, 4);</div><div> <span style="white-space:pre">                       </span>INSERT OR REPLACE INTO t2 SELECT * FROM t1;</div><div> <span style="white-space:pre"> </span>]], {</div><div>-<span style="white-space:pre">                </span>-- <xfer-optimization-1.36></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.38></div><div> <span style="white-space:pre">           </span>0</div><div>-<span style="white-space:pre">            </span>-- <xfer-optimization-1.36></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.38></div><div> <span style="white-space:pre">   </span>})</div><div> </div><div> test:do_execsql_test(</div><div>-<span style="white-space:pre">    </span>"xfer-optimization-1.37",</div><div>+<span style="white-space:pre">  </span>"xfer-optimization-1.39",</div><div> <span style="white-space:pre"> </span>[[</div><div> <span style="white-space:pre">                  </span>INSERT INTO t2 VALUES (10, 10);</div><div> <span style="white-space:pre">             </span>COMMIT;</div><div> <span style="white-space:pre">             </span>SELECT * FROM t2;</div><div> <span style="white-space:pre">   </span>]], {</div><div>-<span style="white-space:pre">                </span>-- <xfer-optimization-1.37></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.39></div><div> <span style="white-space:pre">           </span>1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 10, 10</div><div>-<span style="white-space:pre">         </span>-- <xfer-optimization-1.37></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.39></div><div> <span style="white-space:pre">   </span>})</div><div> </div><div> aftr = box.sql.debug().sql_xfer_count</div><div> </div><div>-do_xfer_test(38, 0)</div><div>+do_xfer_test(40, 0)</div><div> </div><div> -- 5) insert with fail</div><div> ------------------------------------------------------------------------------</div><div>@@ -526,7 +511,7 @@ do_xfer_test(38, 0)</div><div> bfr = box.sql.debug().sql_xfer_count</div><div> </div><div> test:do_catchsql_test(</div><div>-<span style="white-space:pre">   </span>"xfer-optimization-1.39",</div><div>+<span style="white-space:pre">  </span>"xfer-optimization-1.41",</div><div> <span style="white-space:pre"> </span>[[</div><div> <span style="white-space:pre">          </span>DROP TABLE t1;</div><div> <span style="white-space:pre">              </span>DROP TABLE t2;</div><div>@@ -538,26 +523,26 @@ test:do_catchsql_test(</div><div> <span style="white-space:pre">                   </span>INSERT INTO t2 VALUES (4, 4);</div><div> <span style="white-space:pre">                       </span>INSERT OR FAIL INTO t2 SELECT * FROM t1;</div><div> <span style="white-space:pre">    </span>]], {</div><div>-<span style="white-space:pre">                </span>-- <xfer-optimization-1.39></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.41></div><div> <span style="white-space:pre">           </span>1, "Duplicate key exists in unique index 'sqlite_autoindex_T2_1' in space 'T2'"</div><div>-<span style="white-space:pre">            </span>-- <xfer-optimization-1.39></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.41></div><div> <span style="white-space:pre">   </span>})</div><div> </div><div> test:do_execsql_test(</div><div>-<span style="white-space:pre">    </span>"xfer-optimization-1.40",</div><div>+<span style="white-space:pre">  </span>"xfer-optimization-1.42",</div><div> <span style="white-space:pre"> </span>[[</div><div> <span style="white-space:pre">                  </span>INSERT INTO t2 VALUES (10, 10);</div><div> <span style="white-space:pre">             </span>COMMIT;</div><div> <span style="white-space:pre">             </span>SELECT * FROM t2;</div><div> <span style="white-space:pre">   </span>]], {</div><div>-<span style="white-space:pre">                </span>-- <xfer-optimization-1.40></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.42></div><div> <span style="white-space:pre">           </span>1, 1, 2, 2, 3, 4, 4, 4, 10, 10</div><div>-<span style="white-space:pre">               </span>-- <xfer-optimization-1.40></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.42></div><div> <span style="white-space:pre">   </span>})</div><div> </div><div> aftr = box.sql.debug().sql_xfer_count</div><div> </div><div>-do_xfer_test(41, 0)</div><div>+do_xfer_test(43, 0)</div><div> </div><div> -- 6) insert with ignore</div><div> ------------------------------------------------------------------------------</div><div>@@ -565,7 +550,7 @@ do_xfer_test(41, 0)</div><div> bfr = box.sql.debug().sql_xfer_count</div><div> </div><div> test:do_catchsql_test(</div><div>-<span style="white-space:pre"> </span>"xfer-optimization-1.42",</div><div>+<span style="white-space:pre">  </span>"xfer-optimization-1.44",</div><div> <span style="white-space:pre"> </span>[[</div><div> <span style="white-space:pre">          </span>DROP TABLE t1;</div><div> <span style="white-space:pre">              </span>DROP TABLE t2;</div><div>@@ -577,25 +562,25 @@ test:do_catchsql_test(</div><div> <span style="white-space:pre">                   </span>INSERT INTO t2 VALUES (4, 4);</div><div> <span style="white-space:pre">                       </span>INSERT OR IGNORE INTO t2 SELECT * FROM t1;</div><div> <span style="white-space:pre">  </span>]], {</div><div>-<span style="white-space:pre">                </span>-- <xfer-optimization-1.42></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.44></div><div> <span style="white-space:pre">           </span>0</div><div>-<span style="white-space:pre">            </span>-- <xfer-optimization-1.42></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.44></div><div> <span style="white-space:pre">   </span>})</div><div> </div><div> test:do_execsql_test(</div><div>-<span style="white-space:pre">    </span>"xfer-optimization-1.43",</div><div>+<span style="white-space:pre">  </span>"xfer-optimization-1.45",</div><div> <span style="white-space:pre"> </span>[[</div><div> <span style="white-space:pre">                  </span>INSERT INTO t2 VALUES (10, 10);</div><div> <span style="white-space:pre">             </span>COMMIT;</div><div> <span style="white-space:pre">             </span>SELECT * FROM t2;</div><div> <span style="white-space:pre">   </span>]], {</div><div>-<span style="white-space:pre">                </span>-- <xfer-optimization-1.43></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.45></div><div> <span style="white-space:pre">           </span>1, 1, 2, 2, 3, 4, 4, 4, 5, 5, 10, 10</div><div>-<span style="white-space:pre">         </span>-- <xfer-optimization-1.43></div><div>+<span style="white-space:pre">            </span>-- <xfer-optimization-1.45></div><div> <span style="white-space:pre">   </span>})</div><div> </div><div> aftr = box.sql.debug().sql_xfer_count</div><div> </div><div>-do_xfer_test(44, 0)</div><div>+do_xfer_test(46, 0)</div><div> </div><div> test:finish_test()</div></div><div><br></div></div></div>