From 07fd1bf3235de9cd6ac53fd7e6466faa3c76f3e3 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 28 Apr 2022 18:33:02 +0000 Subject: [PATCH 01/12] Fix problem with SQLITE_OMIT_VIRTUALTABLE builds. FossilOrigin-Name: a99ee612b9bd6d75b63e557ef5bdac2143425a558cf023a0480cc28c8300a9a8 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/loadext.c | 8 ++++++++ 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 4b561cb6fc..a89e18bdd4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sharmless\stypo\sin\sa\scomment. -D 2022-04-27T18:38:46.859 +C Fix\sproblem\swith\sSQLITE_OMIT_VIRTUALTABLE\sbuilds. +D 2022-04-28T18:33:02.668 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -516,7 +516,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 173845e5a6bac96ae937409e4f876b631f26b31dabb9df8fd0eb3b130b2bb3a7 F src/json.c 7749b98c62f691697c7ee536b570c744c0583cab4a89200fdd0fc2aa8cc8cbd6 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa -F src/loadext.c 2ecb1441f9b1c22e9e022ee0776e67d259facf34b56ba892b206f0a294ee6f8c +F src/loadext.c 0705c2747212934183398f09891415d2f7f3113d0f543ccb205640210b20e617 F src/main.c 135858d2ede0b83d779e71b07ede9c1d6b6eaab7b77bc2a85729584152769faf F src/malloc.c a9127efdcef92d6934c6339ea9813075b90edc0ce2e5c723556381a3828fb720 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 @@ -1951,8 +1951,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P eb59c46a5aed69bc6fd096997bf24c082e533c1085439f6ec1fbe5ff78e8b374 -R f499c3fddca86db7a0183d3ecdb0953b -U drh -Z 7426364b9684e9a6fe822d40fffa4b25 +P e1f4a115df34e45cf1bcf98961c699b582f564a58a979e95853b219bda06212c +R 3b19b9ac79d036b17b28019016199748 +U dan +Z 4c18f3559ff049507c583c5510546b21 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 1daa831936..937575bb83 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e1f4a115df34e45cf1bcf98961c699b582f564a58a979e95853b219bda06212c \ No newline at end of file +a99ee612b9bd6d75b63e557ef5bdac2143425a558cf023a0480cc28c8300a9a8 \ No newline at end of file diff --git a/src/loadext.c b/src/loadext.c index cefe2eb94c..bba431096d 100644 --- a/src/loadext.c +++ b/src/loadext.c @@ -487,11 +487,19 @@ static const sqlite3_api_routines sqlite3Apis = { sqlite3_autovacuum_pages, /* Version 3.38.0 and later */ sqlite3_error_offset, +#ifndef SQLITE_OMIT_VIRTUALTABLE sqlite3_vtab_rhs_value, sqlite3_vtab_distinct, sqlite3_vtab_in, sqlite3_vtab_in_first, sqlite3_vtab_in_next, +#else + 0, + 0, + 0, + 0, + 0, +#endif /* Version 3.39.0 and later */ #ifndef SQLITE_OMIT_DESERIALIZE sqlite3_deserialize, From de7a820fd028aef290d8a0d4ffe0a2b080302acf Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 29 Apr 2022 12:09:43 +0000 Subject: [PATCH 02/12] Minor typo fix in a comment, for the benefit of broken IDE syntax highlighters. FossilOrigin-Name: 680ccecbc839373194ed2dcc1053e25512d9ea3f12f8c8963cb8fbd1a034d2f8 --- ext/fts5/fts5_index.c | 2 +- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 6b88f31c02..d2ec9ad5a9 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -296,7 +296,7 @@ struct Fts5Index { sqlite3_stmt *pWriter; /* "INSERT ... %_data VALUES(?,?)" */ sqlite3_stmt *pDeleter; /* "DELETE FROM %_data ... id>=? AND id<=?" */ sqlite3_stmt *pIdxWriter; /* "INSERT ... %_idx VALUES(?,?,?,?)" */ - sqlite3_stmt *pIdxDeleter; /* "DELETE FROM %_idx WHERE segid=? */ + sqlite3_stmt *pIdxDeleter; /* "DELETE FROM %_idx WHERE segid=?" */ sqlite3_stmt *pIdxSelect; int nRead; /* Total number of blocks read */ diff --git a/manifest b/manifest index a89e18bdd4..f0a5bf60fe 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sproblem\swith\sSQLITE_OMIT_VIRTUALTABLE\sbuilds. -D 2022-04-28T18:33:02.668 +C Minor\stypo\sfix\sin\sa\scomment,\sfor\sthe\sbenefit\sof\sbroken\sIDE\ssyntax\shighlighters. +D 2022-04-29T12:09:43.642 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -119,7 +119,7 @@ F ext/fts5/fts5_buffer.c 3001fbabb585d6de52947b44b455235072b741038391f830d6b7292 F ext/fts5/fts5_config.c 501e7d3566bc92766b0e11c0109a7c5a6146bc41144195459af5422f6c2078aa F ext/fts5/fts5_expr.c 40174a64829d30cc86e8266306ad24980f6911edd5ca0b8c1ce7821ea1341b88 F ext/fts5/fts5_hash.c d4fb70940359f2120ccd1de7ffe64cc3efe65de9e8995b822cd536ff64c96982 -F ext/fts5/fts5_index.c fdfbc8a62827ec1d1b6f207a1e59c1c4986c3ce245592b5128ffe738867cfcd1 +F ext/fts5/fts5_index.c 3e47d9c56e4e9a6dee78bc32e006d6a28a3b5ec9ff84f3b8c381c78323201720 F ext/fts5/fts5_main.c 6078ae86d3b813753a4f1201054550aff21a3f660e97b30f200d2b1472874151 F ext/fts5/fts5_storage.c 76c6085239eb44424004c022e9da17a5ecd5aaec859fba90ad47d3b08f4c8082 F ext/fts5/fts5_tcl.c b1445cbe69908c411df8084a10b2485500ac70a9c747cdc8cda175a3da59d8ae @@ -1951,8 +1951,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e1f4a115df34e45cf1bcf98961c699b582f564a58a979e95853b219bda06212c -R 3b19b9ac79d036b17b28019016199748 -U dan -Z 4c18f3559ff049507c583c5510546b21 +P a99ee612b9bd6d75b63e557ef5bdac2143425a558cf023a0480cc28c8300a9a8 +R f727db70a6530c6b0b6ca0186b0c1cb8 +U drh +Z 671faa44cd5bf3867df213bd33bc9ae5 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 937575bb83..5954c9dc3f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a99ee612b9bd6d75b63e557ef5bdac2143425a558cf023a0480cc28c8300a9a8 \ No newline at end of file +680ccecbc839373194ed2dcc1053e25512d9ea3f12f8c8963cb8fbd1a034d2f8 \ No newline at end of file From 0c0d0526dceb2a1aab97539d041e777a0cadcd89 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 29 Apr 2022 17:13:52 +0000 Subject: [PATCH 03/12] Multiple enhancements to the TreeView output for SrcItem, cherrypicked from the right-join experimental branch. FossilOrigin-Name: 293afa81112e824eec2557d004a27319d484276f796936e16d64243fe24f6b68 --- manifest | 16 +++++++------ manifest.uuid | 2 +- src/sqliteInt.h | 1 + src/treeview.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 73 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index f0a5bf60fe..1db87ff47d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Minor\stypo\sfix\sin\sa\scomment,\sfor\sthe\sbenefit\sof\sbroken\sIDE\ssyntax\shighlighters. -D 2022-04-29T12:09:43.642 +C Multiple\senhancements\sto\sthe\sTreeView\soutput\sfor\sSrcItem,\scherrypicked\sfrom\nthe\sright-join\sexperimental\sbranch. +D 2022-04-29T17:13:52.271 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -558,7 +558,7 @@ F src/shell.c.in ae0a6fae983caac6f8c824733f0599dfdf7b3a7e8efdef3cb5e3ab2e457ffc3 F src/sqlite.h.in 2a35f62185eb5e7ecc64a2f68442b538ce9be74f80f28a00abc24837edcf1c17 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h f49e28c25bd941e79794db5415fdf7b202deb3bc072ed6f1ed273d578703684e -F src/sqliteInt.h 11cd60560cd14bb6eecd04d244faf4c1895417b97d89e2f50833f83c4611588d +F src/sqliteInt.h 4092f9f2395909ebf7da0a6e9907e92883cf98656bb751e1d919d2a0e475ae70 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4a3da6d77eeb3531cb0dbdf7047772a2a1b99f98c69e90ce009c75fe6328b2c0 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -618,7 +618,7 @@ F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c a38f52058b517929e264094abd0b5fd1e8e145a1aa43bc6f6a72ae5218f96c98 -F src/treeview.c 396c21e21c853ebc1830c194fa13f1161dbc76adad0b0a605172ddb78b3b4cdb +F src/treeview.c 330f396050a87e79025c35237b75f0feb8e11327c8b3f4ab7a858cf86336e270 F src/trigger.c 372ada38f667c6823a3db15749eb668338e65c793394e55a37e56a489f2d1b55 F src/update.c 2cfaded82ca80ff56afb8c3ae5e88284e0824bfd86119827cc22481959f96f92 F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 @@ -1951,8 +1951,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a99ee612b9bd6d75b63e557ef5bdac2143425a558cf023a0480cc28c8300a9a8 -R f727db70a6530c6b0b6ca0186b0c1cb8 +P 680ccecbc839373194ed2dcc1053e25512d9ea3f12f8c8963cb8fbd1a034d2f8 +Q +3aafccb5c3c780c29090ee5eb428a6c3153627ce8bf834bbd392e79a30e9389b +Q +9cba3ce577e442f83d7a2d6926e38ffe6bc45953c88ecdd384f3455890303cce +R f351c482825f9cb2175ee0f0b69f0e4a U drh -Z 671faa44cd5bf3867df213bd33bc9ae5 +Z f1d3e45872b682fe27f7e5ce12e577b8 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 5954c9dc3f..0fbdaafb80 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -680ccecbc839373194ed2dcc1053e25512d9ea3f12f8c8963cb8fbd1a034d2f8 \ No newline at end of file +293afa81112e824eec2557d004a27319d484276f796936e16d64243fe24f6b68 \ No newline at end of file diff --git a/src/sqliteInt.h b/src/sqliteInt.h index d799510fc0..e526a775cb 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -4459,6 +4459,7 @@ char *sqlite3VMPrintf(sqlite3*,const char*, va_list); void sqlite3TreeViewExprList(TreeView*, const ExprList*, u8, const char*); void sqlite3TreeViewBareIdList(TreeView*, const IdList*, const char*); void sqlite3TreeViewIdList(TreeView*, const IdList*, u8, const char*); + void sqlite3TreeViewColumnList(TreeView*, const Column*, int, u8); void sqlite3TreeViewSrcList(TreeView*, const SrcList*); void sqlite3TreeViewSelect(TreeView*, const Select*, u8); void sqlite3TreeViewWith(TreeView*, const With*, u8); diff --git a/src/treeview.c b/src/treeview.c index db73943f02..3aee7df675 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -86,6 +86,53 @@ static void sqlite3TreeViewItem(TreeView *p, const char *zLabel,u8 moreFollows){ sqlite3TreeViewLine(p, "%s", zLabel); } +/* +** Show a list of Column objects in tree format. +*/ +void sqlite3TreeViewColumnList( + TreeView *pView, + const Column *aCol, + int nCol, + u8 moreToFollow +){ + int i; + sqlite3TreeViewPush(&pView, moreToFollow); + sqlite3TreeViewLine(pView, "COLUMNS"); + for(i=0; inSrc; i++){ const SrcItem *pItem = &pSrc->a[i]; StrAccum x; + int n = 0; char zLine[100]; sqlite3StrAccumInit(&x, 0, zLine, sizeof(zLine), 0); x.printfFlags |= SQLITE_PRINTF_INTERNAL; @@ -168,10 +216,22 @@ void sqlite3TreeViewSrcList(TreeView *pView, const SrcList *pSrc){ sqlite3_str_appendf(&x, " CteUse=0x%p", pItem->u2.pCteUse); } sqlite3StrAccumFinish(&x); - sqlite3TreeViewItem(pView, zLine, inSrc-1); + sqlite3TreeViewItem(pView, zLine, inSrc-1); + n = 0; + if( pItem->pTab ) n++; + if( pItem->pSelect ) n++; + if( pItem->fg.isTabFunc ) n++; + if( pItem->fg.isUsing ) n++; + if( pItem->fg.isUsing ){ + sqlite3TreeViewIdList(pView, pItem->u3.pUsing, (--n)>0, "USING"); + } + if( pItem->pTab ){ + Table *pTab = pItem->pTab; + sqlite3TreeViewColumnList(pView, pTab->aCol, pTab->nCol, (--n)>0); + } if( pItem->pSelect ){ assert( pItem->fg.isNestedFrom == IsNestedFrom(pItem->pSelect) ); - sqlite3TreeViewSelect(pView, pItem->pSelect, 0); + sqlite3TreeViewSelect(pView, pItem->pSelect, (--n)>0); } if( pItem->fg.isTabFunc ){ sqlite3TreeViewExprList(pView, pItem->u1.pFuncArg, 0, "func-args:"); From 8e8e9de87e93f258a001dc9c8fdcef843b46aec1 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 29 Apr 2022 17:45:39 +0000 Subject: [PATCH 04/12] With TreeView, only show the table columns for a SrcItem if the data source is a subquery rather than a persistent table. FossilOrigin-Name: 7b4a0d0fa1d8facaf5e550650d9b261eda7eb7a2a413627f2751f01c5477e1f3 --- manifest | 14 ++++++-------- manifest.uuid | 2 +- src/treeview.c | 9 ++++----- 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 1db87ff47d..b2507fac8d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Multiple\senhancements\sto\sthe\sTreeView\soutput\sfor\sSrcItem,\scherrypicked\sfrom\nthe\sright-join\sexperimental\sbranch. -D 2022-04-29T17:13:52.271 +C With\sTreeView,\sonly\sshow\sthe\stable\scolumns\sfor\sa\sSrcItem\sif\sthe\sdata\ssource\nis\sa\ssubquery\srather\sthan\sa\spersistent\stable. +D 2022-04-29T17:45:39.378 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -618,7 +618,7 @@ F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c a38f52058b517929e264094abd0b5fd1e8e145a1aa43bc6f6a72ae5218f96c98 -F src/treeview.c 330f396050a87e79025c35237b75f0feb8e11327c8b3f4ab7a858cf86336e270 +F src/treeview.c 9b4fcabab81fa0e6c93b70911b2e06012df03e230fef8b170bf77ab99e544dd8 F src/trigger.c 372ada38f667c6823a3db15749eb668338e65c793394e55a37e56a489f2d1b55 F src/update.c 2cfaded82ca80ff56afb8c3ae5e88284e0824bfd86119827cc22481959f96f92 F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 @@ -1951,10 +1951,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 680ccecbc839373194ed2dcc1053e25512d9ea3f12f8c8963cb8fbd1a034d2f8 -Q +3aafccb5c3c780c29090ee5eb428a6c3153627ce8bf834bbd392e79a30e9389b -Q +9cba3ce577e442f83d7a2d6926e38ffe6bc45953c88ecdd384f3455890303cce -R f351c482825f9cb2175ee0f0b69f0e4a +P 293afa81112e824eec2557d004a27319d484276f796936e16d64243fe24f6b68 +R 28b9d27cf579722d7bb4ce1924ff221c U drh -Z f1d3e45872b682fe27f7e5ce12e577b8 +Z 77bba4f7ca9ae44652d512641bde86ff # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 0fbdaafb80..16481a0f72 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -293afa81112e824eec2557d004a27319d484276f796936e16d64243fe24f6b68 \ No newline at end of file +7b4a0d0fa1d8facaf5e550650d9b261eda7eb7a2a413627f2751f01c5477e1f3 \ No newline at end of file diff --git a/src/treeview.c b/src/treeview.c index 3aee7df675..0ad3bd0eb8 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -218,18 +218,17 @@ void sqlite3TreeViewSrcList(TreeView *pView, const SrcList *pSrc){ sqlite3StrAccumFinish(&x); sqlite3TreeViewItem(pView, zLine, inSrc-1); n = 0; - if( pItem->pTab ) n++; if( pItem->pSelect ) n++; if( pItem->fg.isTabFunc ) n++; if( pItem->fg.isUsing ) n++; if( pItem->fg.isUsing ){ sqlite3TreeViewIdList(pView, pItem->u3.pUsing, (--n)>0, "USING"); } - if( pItem->pTab ){ - Table *pTab = pItem->pTab; - sqlite3TreeViewColumnList(pView, pTab->aCol, pTab->nCol, (--n)>0); - } if( pItem->pSelect ){ + if( pItem->pTab ){ + Table *pTab = pItem->pTab; + sqlite3TreeViewColumnList(pView, pTab->aCol, pTab->nCol, 1); + } assert( pItem->fg.isNestedFrom == IsNestedFrom(pItem->pSelect) ); sqlite3TreeViewSelect(pView, pItem->pSelect, (--n)>0); } From 3d5665366fd03752aa61ca365774239dff67512b Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 29 Apr 2022 19:00:11 +0000 Subject: [PATCH 05/12] Enhance the codeEqualityTerm() routine inside the code generator so that it is able to reuse an IN operator that has an invariant subquery on its right-hand side while coding the non-matched loop of a RIGHT JOIN. dbsqlfuzz 19f1102a70cf966ab249de56d944fc20dbebcfcf FossilOrigin-Name: 56dd3065469e49320b13af039471b3f0b85e6f7368cfd97b1cdc0cf8fa8e1956 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/wherecode.c | 2 +- test/join8.test | 10 ++++++++++ 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index b2507fac8d..cdb521d4d0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C With\sTreeView,\sonly\sshow\sthe\stable\scolumns\sfor\sa\sSrcItem\sif\sthe\sdata\ssource\nis\sa\ssubquery\srather\sthan\sa\spersistent\stable. -D 2022-04-29T17:45:39.378 +C Enhance\sthe\scodeEqualityTerm()\sroutine\sinside\sthe\scode\sgenerator\sso\sthat\sit\sis\nable\sto\sreuse\san\sIN\soperator\sthat\shas\san\sinvariant\ssubquery\son\sits\sright-hand\nside\swhile\scoding\sthe\snon-matched\sloop\sof\sa\sRIGHT\sJOIN.\ndbsqlfuzz\s19f1102a70cf966ab249de56d944fc20dbebcfcf +D 2022-04-29T19:00:11.746 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -642,7 +642,7 @@ F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b F src/where.c 43085b3a4ce2e56315fabb0b240a56e76667d9e03c79f287695bcae7b76152d5 F src/whereInt.h 4db5a877a9d1f38b5c928c1c84297c07f30b9a3bc1f5f66214cf1a8ef90a0556 -F src/wherecode.c 55a33d9db1759970c30220904bcc628ba66a1ccb63b5437ef4642f7ea6267b03 +F src/wherecode.c c55aba3ea3106d40af88faa2b22de52821c48bfdcaa045b05f5c3767bfeaa1e0 F src/whereexpr.c 174d4ad5be165c610c907abb779ef4a97974d22b84e1ce7898d2d9f6947249e5 F src/window.c 924e04fd6e0e113d4dba18b78d43fcb8e42b8ebffc8fc728da52cf3ab014cf3c F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1148,7 +1148,7 @@ F test/join4.test 1a352e4e267114444c29266ce79e941af5885916 F test/join5.test c4df54e2e204d7f1417bfbdd21ca324b4b07415c647595cc47798eacfddc96d3 F test/join6.test f809c025fa253f9e150c0e9afd4cef8813257bceeb6f46e04041228c9403cc2c F test/join7.test 8e72de4b45e5e930d18c305c7efe86015fb2552731e4e03ea226353036b0dab0 -F test/join8.test 8b1cc9592aa8f623fc2878353b16c81257591908de06d2a4916f7cbe3ca75ecd +F test/join8.test 88ea7b26437d3141167895da4287c4f92e484a9a38bfc25c062144092ac1758f F test/join9.test 9056ddd3b0c0f4f9d658f4521038d9a37dc23ead8ca9a505d0b0db2b6a471e05 F test/joinA.test 7eab225dc1c1ab258a5e62513a4ed7cabbd3db971d59d5d92f4fb6fa14c12f6a F test/joinB.test 1b2ba3fc8568b49411787fccbf540570c148e9b6a53a30f80691cb6268098ded @@ -1951,8 +1951,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 293afa81112e824eec2557d004a27319d484276f796936e16d64243fe24f6b68 -R 28b9d27cf579722d7bb4ce1924ff221c +P 7b4a0d0fa1d8facaf5e550650d9b261eda7eb7a2a413627f2751f01c5477e1f3 +R 4eb952430e379b03f0039449da90c7c2 U drh -Z 77bba4f7ca9ae44652d512641bde86ff +Z 2b2aca42b8cf9c11b9fe920e009d7283 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 16481a0f72..536b89e2ae 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7b4a0d0fa1d8facaf5e550650d9b261eda7eb7a2a413627f2751f01c5477e1f3 \ No newline at end of file +56dd3065469e49320b13af039471b3f0b85e6f7368cfd97b1cdc0cf8fa8e1956 \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index 3ea6c5d8eb..2cd61a35b7 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -610,7 +610,7 @@ static int codeEqualityTerm( iTab = 0; if( !ExprUseXSelect(pX) || pX->x.pSelect->pEList->nExpr==1 ){ eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, 0, &iTab); - }else{ + }else if( pTerm->pExpr->iTable==0 ){ sqlite3 *db = pParse->db; pX = removeUnindexableInClauseTerms(pParse, iEq, pLoop, pX); diff --git a/test/join8.test b/test/join8.test index 48287b6bfa..7c4b8f601a 100644 --- a/test/join8.test +++ b/test/join8.test @@ -156,4 +156,14 @@ do_catchsql_test join8-5000 { SELECT (SELECT c FROM sqlite_temp_schema FULL JOIN t2 ON d IN (1,2,3) ORDER BY d) AS x FROM t1; } {0 {- -}} +# 2022-04-29 dbsqlfuzz 19f1102a70cf966ab249de56d944fc20dbebcfcf +# +reset_db +do_execsql_test join8-6000 { + CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT, c TEXT, d REAL); + INSERT INTO t1 VALUES(1,'A','aa',2.5); + SELECT * FROM t1 AS t2 NATURAL RIGHT JOIN t1 AS t3 + WHERE (a,b) IN (SELECT rowid, b FROM t1); +} {1 A aa 2.5} + finish_test From c64f0e71c1e148c261970f79b213937ffc9866c5 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 30 Apr 2022 00:05:37 +0000 Subject: [PATCH 06/12] Enhance the TreeView debugging output for Expr with opcode TK_IN so as to show the RHS table and the subroutine address. FossilOrigin-Name: aec1e4cd59ae874b66335e4f87322fbe31fbb752429e68bf41338db316d0a9ed --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/treeview.c | 12 +++++++++++- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index cdb521d4d0..7f234c8260 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sthe\scodeEqualityTerm()\sroutine\sinside\sthe\scode\sgenerator\sso\sthat\sit\sis\nable\sto\sreuse\san\sIN\soperator\sthat\shas\san\sinvariant\ssubquery\son\sits\sright-hand\nside\swhile\scoding\sthe\snon-matched\sloop\sof\sa\sRIGHT\sJOIN.\ndbsqlfuzz\s19f1102a70cf966ab249de56d944fc20dbebcfcf -D 2022-04-29T19:00:11.746 +C Enhance\sthe\sTreeView\sdebugging\soutput\sfor\sExpr\swith\sopcode\sTK_IN\sso\sas\sto\nshow\sthe\sRHS\stable\sand\sthe\ssubroutine\saddress. +D 2022-04-30T00:05:37.975 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -618,7 +618,7 @@ F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c a38f52058b517929e264094abd0b5fd1e8e145a1aa43bc6f6a72ae5218f96c98 -F src/treeview.c 9b4fcabab81fa0e6c93b70911b2e06012df03e230fef8b170bf77ab99e544dd8 +F src/treeview.c 7dd99cf420137d658492bbf3601d55fce9c34d4788606f43d83937b73474769c F src/trigger.c 372ada38f667c6823a3db15749eb668338e65c793394e55a37e56a489f2d1b55 F src/update.c 2cfaded82ca80ff56afb8c3ae5e88284e0824bfd86119827cc22481959f96f92 F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 @@ -1951,8 +1951,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 7b4a0d0fa1d8facaf5e550650d9b261eda7eb7a2a413627f2751f01c5477e1f3 -R 4eb952430e379b03f0039449da90c7c2 +P 56dd3065469e49320b13af039471b3f0b85e6f7368cfd97b1cdc0cf8fa8e1956 +R a9c50a69f413cdbca9e2fe9cf049f583 U drh -Z 2b2aca42b8cf9c11b9fe920e009d7283 +Z 6276b679cc8e2417eedb1432e1dbcb3d # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 536b89e2ae..c45d6e71b7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -56dd3065469e49320b13af039471b3f0b85e6f7368cfd97b1cdc0cf8fa8e1956 \ No newline at end of file +aec1e4cd59ae874b66335e4f87322fbe31fbb752429e68bf41338db316d0a9ed \ No newline at end of file diff --git a/src/treeview.c b/src/treeview.c index 0ad3bd0eb8..0f9b588f5a 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -712,7 +712,17 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ break; } case TK_IN: { - sqlite3TreeViewLine(pView, "IN flags=0x%x", pExpr->flags); + sqlite3_str *pStr = sqlite3_str_new(0); + char *z; + sqlite3_str_appendf(pStr, "IN flags=0x%x", pExpr->flags); + if( pExpr->iTable ) sqlite3_str_appendf(pStr, " iTable=%d",pExpr->iTable); + if( ExprHasProperty(pExpr, EP_Subrtn) ){ + sqlite3_str_appendf(pStr, " subrtn(%d,%d)", + pExpr->y.sub.regReturn, pExpr->y.sub.iAddr); + } + z = sqlite3_str_finish(pStr); + sqlite3TreeViewLine(pView, z); + sqlite3_free(z); sqlite3TreeViewExpr(pView, pExpr->pLeft, 1); if( ExprUseXSelect(pExpr) ){ sqlite3TreeViewSelect(pView, pExpr->x.pSelect, 0); From a25bbaf74a697b0ba59d11a75fd78a349f3e581d Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 30 Apr 2022 00:06:52 +0000 Subject: [PATCH 07/12] Further improvements to codeEqualityTerm() for cases when an IN operator with a right-hand side subquery is used as a constraint that needs to be processed by the RIGHT JOIN non-matched logic. FossilOrigin-Name: bb2798be3fb5737827eec505db2d4c8cb510d227d98fc26ce748bf2da7e8b382 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/wherecode.c | 28 ++++++++++++++++++---------- test/join8.test | 7 +++++++ 4 files changed, 33 insertions(+), 18 deletions(-) diff --git a/manifest b/manifest index 7f234c8260..3b6531af0d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sthe\sTreeView\sdebugging\soutput\sfor\sExpr\swith\sopcode\sTK_IN\sso\sas\sto\nshow\sthe\sRHS\stable\sand\sthe\ssubroutine\saddress. -D 2022-04-30T00:05:37.975 +C Further\simprovements\sto\scodeEqualityTerm()\sfor\scases\swhen\san\sIN\soperator\swith\na\sright-hand\sside\ssubquery\sis\sused\sas\sa\sconstraint\sthat\sneeds\sto\sbe\sprocessed\nby\sthe\sRIGHT\sJOIN\snon-matched\slogic. +D 2022-04-30T00:06:52.768 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -642,7 +642,7 @@ F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b F src/where.c 43085b3a4ce2e56315fabb0b240a56e76667d9e03c79f287695bcae7b76152d5 F src/whereInt.h 4db5a877a9d1f38b5c928c1c84297c07f30b9a3bc1f5f66214cf1a8ef90a0556 -F src/wherecode.c c55aba3ea3106d40af88faa2b22de52821c48bfdcaa045b05f5c3767bfeaa1e0 +F src/wherecode.c c7e35e28f1b3f6e95c5dfaa94ce6f7a125db769220bd86c7a52744a1227b2778 F src/whereexpr.c 174d4ad5be165c610c907abb779ef4a97974d22b84e1ce7898d2d9f6947249e5 F src/window.c 924e04fd6e0e113d4dba18b78d43fcb8e42b8ebffc8fc728da52cf3ab014cf3c F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1148,7 +1148,7 @@ F test/join4.test 1a352e4e267114444c29266ce79e941af5885916 F test/join5.test c4df54e2e204d7f1417bfbdd21ca324b4b07415c647595cc47798eacfddc96d3 F test/join6.test f809c025fa253f9e150c0e9afd4cef8813257bceeb6f46e04041228c9403cc2c F test/join7.test 8e72de4b45e5e930d18c305c7efe86015fb2552731e4e03ea226353036b0dab0 -F test/join8.test 88ea7b26437d3141167895da4287c4f92e484a9a38bfc25c062144092ac1758f +F test/join8.test ecb51527fa3dedea1b9e816b1bc5a9effe73894bd3630936716ee5983dd99081 F test/join9.test 9056ddd3b0c0f4f9d658f4521038d9a37dc23ead8ca9a505d0b0db2b6a471e05 F test/joinA.test 7eab225dc1c1ab258a5e62513a4ed7cabbd3db971d59d5d92f4fb6fa14c12f6a F test/joinB.test 1b2ba3fc8568b49411787fccbf540570c148e9b6a53a30f80691cb6268098ded @@ -1951,8 +1951,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 56dd3065469e49320b13af039471b3f0b85e6f7368cfd97b1cdc0cf8fa8e1956 -R a9c50a69f413cdbca9e2fe9cf049f583 +P aec1e4cd59ae874b66335e4f87322fbe31fbb752429e68bf41338db316d0a9ed +R 3ef32004450fadb98cceaba22af0f147 U drh -Z 6276b679cc8e2417eedb1432e1dbcb3d +Z e12eec7e3b77f2bd28ff448aaa1d497c # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index c45d6e71b7..5a4c531708 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -aec1e4cd59ae874b66335e4f87322fbe31fbb752429e68bf41338db316d0a9ed \ No newline at end of file +bb2798be3fb5737827eec505db2d4c8cb510d227d98fc26ce748bf2da7e8b382 \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index 2cd61a35b7..5e6852f55c 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -610,17 +610,25 @@ static int codeEqualityTerm( iTab = 0; if( !ExprUseXSelect(pX) || pX->x.pSelect->pEList->nExpr==1 ){ eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, 0, &iTab); - }else if( pTerm->pExpr->iTable==0 ){ - sqlite3 *db = pParse->db; - pX = removeUnindexableInClauseTerms(pParse, iEq, pLoop, pX); - - if( !db->mallocFailed ){ - aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*nEq); - eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap, &iTab); - pTerm->pExpr->iTable = iTab; + }else{ + Expr *pExpr = pTerm->pExpr; + if( pExpr->iTable==0 || !ExprHasProperty(pExpr, EP_Subrtn) ){ + sqlite3 *db = pParse->db; + pX = removeUnindexableInClauseTerms(pParse, iEq, pLoop, pX); + if( !db->mallocFailed ){ + aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*nEq); + eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap,&iTab); + pExpr->iTable = iTab; + pExpr->op2 = eType; + } + sqlite3ExprDelete(db, pX); + }else{ + sqlite3VdbeAddOp2(v, OP_Gosub, pExpr->y.sub.regReturn, + pExpr->y.sub.iAddr); + iTab = pExpr->iTable; + eType = pExpr->op2; } - sqlite3ExprDelete(db, pX); - pX = pTerm->pExpr; + pX = pExpr; } if( eType==IN_INDEX_INDEX_DESC ){ diff --git a/test/join8.test b/test/join8.test index 7c4b8f601a..ca362d7333 100644 --- a/test/join8.test +++ b/test/join8.test @@ -165,5 +165,12 @@ do_execsql_test join8-6000 { SELECT * FROM t1 AS t2 NATURAL RIGHT JOIN t1 AS t3 WHERE (a,b) IN (SELECT rowid, b FROM t1); } {1 A aa 2.5} +do_execsql_test join8-6010 { + DROP TABLE IF EXISTS t1; + CREATE TABLE t1(a INT PRIMARY KEY, b TEXT, c TEXT, d INT) WITHOUT ROWID; + INSERT INTO t1 VALUES(15,'xray','baker',42); + SELECT value, t1.* FROM json_each('7') NATURAL RIGHT JOIN t1 + WHERE (a,b) IN (SELECT a, b FROM t1); +} {7 15 xray baker 42} finish_test From 2aa1086cab4e8a9cb239882ba1ba042dafdd7e7a Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 30 Apr 2022 12:35:51 +0000 Subject: [PATCH 08/12] Preserve the COLLATE operator on an index on an expression when resolving the use of that expression into a reference to the index. See [forum:/info/7efabf4b03328e57|forum thread 7efabf4b03328e57] for details. FossilOrigin-Name: a8da85c57e07721dc1c918d67433d6c99ce48421e369123cc3194d855e55f7e8 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/wherecode.c | 1 + test/indexexpr1.test | 19 +++++++++++++++++++ 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 3b6531af0d..57c9658d48 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Further\simprovements\sto\scodeEqualityTerm()\sfor\scases\swhen\san\sIN\soperator\swith\na\sright-hand\sside\ssubquery\sis\sused\sas\sa\sconstraint\sthat\sneeds\sto\sbe\sprocessed\nby\sthe\sRIGHT\sJOIN\snon-matched\slogic. -D 2022-04-30T00:06:52.768 +C Preserve\sthe\sCOLLATE\soperator\son\san\sindex\son\san\sexpression\swhen\sresolving\nthe\suse\sof\sthat\sexpression\sinto\sa\sreference\sto\sthe\sindex.\s\sSee\n[forum:/info/7efabf4b03328e57|forum\sthread\s7efabf4b03328e57]\sfor\sdetails. +D 2022-04-30T12:35:51.942 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -642,7 +642,7 @@ F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b F src/where.c 43085b3a4ce2e56315fabb0b240a56e76667d9e03c79f287695bcae7b76152d5 F src/whereInt.h 4db5a877a9d1f38b5c928c1c84297c07f30b9a3bc1f5f66214cf1a8ef90a0556 -F src/wherecode.c c7e35e28f1b3f6e95c5dfaa94ce6f7a125db769220bd86c7a52744a1227b2778 +F src/wherecode.c 3c6f6ff594edb6eb3d7d38b9b922e43dcd15b31949718acbb4d6b51a66fef509 F src/whereexpr.c 174d4ad5be165c610c907abb779ef4a97974d22b84e1ce7898d2d9f6947249e5 F src/window.c 924e04fd6e0e113d4dba18b78d43fcb8e42b8ebffc8fc728da52cf3ab014cf3c F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1116,7 +1116,7 @@ F test/index7.test b238344318e0b4e42126717f6554f0e7dfd0b39cecad4b736039b43e1e3b6 F test/index8.test caa097735c91dbc23d8a402f5e63a2a03c83840ba3928733ed7f9a03f8a912a3 F test/index9.test 0aa3e509dddf81f93380396e40e9bb386904c1054924ba8fa9bcdfe85a8e7721 F test/indexedby.test f21eca4f7a6ffe14c8500a7ad6cd53166666c99e5ccd311842a28bc94a195fe0 -F test/indexexpr1.test 8f7241410e351679010f14cd7cd30357622d04a784508ff54ba5ce99f64a2228 +F test/indexexpr1.test 3360c2a29a8844e7c4b13293567025281257f9e13a31854cfff6959cede11502 F test/indexexpr2.test 2c7abe3c48f8aaa5a448615ab4d13df3662185d28419c00999670834a3f0b484 F test/indexfault.test 98d78a8ff1f5335628b62f886a1cb7c7dac1ef6d48fa39c51ec871c87dce9811 F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7 @@ -1951,8 +1951,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P aec1e4cd59ae874b66335e4f87322fbe31fbb752429e68bf41338db316d0a9ed -R 3ef32004450fadb98cceaba22af0f147 +P bb2798be3fb5737827eec505db2d4c8cb510d227d98fc26ce748bf2da7e8b382 +R 8ae07a550172cb86bf694a85b364f3bb U drh -Z e12eec7e3b77f2bd28ff448aaa1d497c +Z 620a3ae79bd73fe692219fff192dc087 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 5a4c531708..375ab1598b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bb2798be3fb5737827eec505db2d4c8cb510d227d98fc26ce748bf2da7e8b382 \ No newline at end of file +a8da85c57e07721dc1c918d67433d6c99ce48421e369123cc3194d855e55f7e8 \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index 5e6852f55c..0d6030793a 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1255,6 +1255,7 @@ static void preserveExpr(IdxExprTrans *pTrans, Expr *pExpr){ static int whereIndexExprTransNode(Walker *p, Expr *pExpr){ IdxExprTrans *pX = p->u.pIdxTrans; if( sqlite3ExprCompare(0, pExpr, pX->pIdxExpr, pX->iTabCur)==0 ){ + pExpr = sqlite3ExprSkipCollate(pExpr); preserveExpr(pX, pExpr); pExpr->affExpr = sqlite3ExprAffinity(pExpr); pExpr->op = TK_COLUMN; diff --git a/test/indexexpr1.test b/test/indexexpr1.test index 92dfc8689b..042132b81d 100644 --- a/test/indexexpr1.test +++ b/test/indexexpr1.test @@ -487,4 +487,23 @@ ifcapable like_match_blobs { } {2.0} } +# 2022-04-30 https://sqlite.org/forum/info/7efabf4b03328e57 +# Assertion fault during a DELETE INDEXED BY. +# +reset_db +do_execsql_test indexexpr-1900 { + CREATE TABLE t1(x TEXT PRIMARY KEY, y TEXT, z INT); + INSERT INTO t1(x,y,z) VALUES('alpha','ALPHA',1),('bravo','charlie',1); + CREATE INDEX i1 ON t1(+y COLLATE NOCASE); + SELECT * FROM t1; +} {alpha ALPHA 1 bravo charlie 1} +do_execsql_test indexexpr-1910 { + DELETE FROM t1 INDEXED BY i1 + WHERE x IS +y COLLATE NOCASE IN (SELECT z FROM t1) + RETURNING *; +} {alpha ALPHA 1} +do_execsql_test indexexpr-1920 { + SELECT * FROM t1; +} {bravo charlie 1} + finish_test From 7497364749e0c36740c7eef3ecd1ecc9160afd4b Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 30 Apr 2022 18:40:22 +0000 Subject: [PATCH 09/12] Simplified fix to the problem with subroutine reuse in the RIGHT JOIN no-match logic for a subquery on the right-hand side of an IN operator. The code still needs simplification. FossilOrigin-Name: a193749730d6cfba617f2a64e7254c78f92bbf29b109c19055fc33f6cc643d4c --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/wherecode.c | 7 +++++-- test/join8.test | 7 +++++++ 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 57c9658d48..7b6ffe4c91 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Preserve\sthe\sCOLLATE\soperator\son\san\sindex\son\san\sexpression\swhen\sresolving\nthe\suse\sof\sthat\sexpression\sinto\sa\sreference\sto\sthe\sindex.\s\sSee\n[forum:/info/7efabf4b03328e57|forum\sthread\s7efabf4b03328e57]\sfor\sdetails. -D 2022-04-30T12:35:51.942 +C Simplified\sfix\sto\sthe\sproblem\swith\ssubroutine\sreuse\sin\sthe\sRIGHT\sJOIN\sno-match\nlogic\sfor\sa\ssubquery\son\sthe\sright-hand\sside\sof\san\sIN\soperator.\s\sThe\scode\sstill\nneeds\ssimplification. +D 2022-04-30T18:40:22.156 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -642,7 +642,7 @@ F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b F src/where.c 43085b3a4ce2e56315fabb0b240a56e76667d9e03c79f287695bcae7b76152d5 F src/whereInt.h 4db5a877a9d1f38b5c928c1c84297c07f30b9a3bc1f5f66214cf1a8ef90a0556 -F src/wherecode.c 3c6f6ff594edb6eb3d7d38b9b922e43dcd15b31949718acbb4d6b51a66fef509 +F src/wherecode.c d629ba77a3601a979b2a30d1a21ca7ae283faff797c7cffe79fb9366a075db89 F src/whereexpr.c 174d4ad5be165c610c907abb779ef4a97974d22b84e1ce7898d2d9f6947249e5 F src/window.c 924e04fd6e0e113d4dba18b78d43fcb8e42b8ebffc8fc728da52cf3ab014cf3c F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1148,7 +1148,7 @@ F test/join4.test 1a352e4e267114444c29266ce79e941af5885916 F test/join5.test c4df54e2e204d7f1417bfbdd21ca324b4b07415c647595cc47798eacfddc96d3 F test/join6.test f809c025fa253f9e150c0e9afd4cef8813257bceeb6f46e04041228c9403cc2c F test/join7.test 8e72de4b45e5e930d18c305c7efe86015fb2552731e4e03ea226353036b0dab0 -F test/join8.test ecb51527fa3dedea1b9e816b1bc5a9effe73894bd3630936716ee5983dd99081 +F test/join8.test 9a4b2f53d5358abb29e6356e357c0cd40f4d8f282589300dcb76728dce050b51 F test/join9.test 9056ddd3b0c0f4f9d658f4521038d9a37dc23ead8ca9a505d0b0db2b6a471e05 F test/joinA.test 7eab225dc1c1ab258a5e62513a4ed7cabbd3db971d59d5d92f4fb6fa14c12f6a F test/joinB.test 1b2ba3fc8568b49411787fccbf540570c148e9b6a53a30f80691cb6268098ded @@ -1951,8 +1951,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P bb2798be3fb5737827eec505db2d4c8cb510d227d98fc26ce748bf2da7e8b382 -R 8ae07a550172cb86bf694a85b364f3bb +P a8da85c57e07721dc1c918d67433d6c99ce48421e369123cc3194d855e55f7e8 +R 8dafede96e6eddf2103c6fe2efc2c0f1 U drh -Z 620a3ae79bd73fe692219fff192dc087 +Z 677c686e7cbb46a3d1010c0d9d90814e # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 375ab1598b..0915dc636c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a8da85c57e07721dc1c918d67433d6c99ce48421e369123cc3194d855e55f7e8 \ No newline at end of file +a193749730d6cfba617f2a64e7254c78f92bbf29b109c19055fc33f6cc643d4c \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index 0d6030793a..333295a48b 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -619,14 +619,17 @@ static int codeEqualityTerm( aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*nEq); eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap,&iTab); pExpr->iTable = iTab; - pExpr->op2 = eType; } sqlite3ExprDelete(db, pX); }else{ + int j1; sqlite3VdbeAddOp2(v, OP_Gosub, pExpr->y.sub.regReturn, pExpr->y.sub.iAddr); + j1 = sqlite3VdbeAddOp0(v, OP_Goto); + aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*nEq); + eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap,&iTab); iTab = pExpr->iTable; - eType = pExpr->op2; + sqlite3VdbeJumpHere(v, j1); } pX = pExpr; } diff --git a/test/join8.test b/test/join8.test index ca362d7333..a33622d9bb 100644 --- a/test/join8.test +++ b/test/join8.test @@ -172,5 +172,12 @@ do_execsql_test join8-6010 { SELECT value, t1.* FROM json_each('7') NATURAL RIGHT JOIN t1 WHERE (a,b) IN (SELECT a, b FROM t1); } {7 15 xray baker 42} +do_execsql_test join8-6020 { + DROP TABLE IF EXISTS t1; + CREATE TABLE t1(a INTEGER PRIMARY KEY,b); + INSERT INTO t1 VALUES(0,NULL),(1,2); + SELECT value, t1.* FROM json_each('17') NATURAL RIGHT JOIN t1 + WHERE (a,b) IN (SELECT rowid, b FROM t1); +} {17 1 2} finish_test From bae50d6719bd1a748ef3d826b96c38dc47c6d1df Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 30 Apr 2022 19:55:28 +0000 Subject: [PATCH 10/12] Defensive code in sqlite3TreeViewWindow() to fix a compiler warning. FossilOrigin-Name: b250c218b4b6327a1cae3edbc037625ba998f89ee13a9bfbc2cefd1edfc4b768 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/treeview.c | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 7b6ffe4c91..73f80eb148 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Simplified\sfix\sto\sthe\sproblem\swith\ssubroutine\sreuse\sin\sthe\sRIGHT\sJOIN\sno-match\nlogic\sfor\sa\ssubquery\son\sthe\sright-hand\sside\sof\san\sIN\soperator.\s\sThe\scode\sstill\nneeds\ssimplification. -D 2022-04-30T18:40:22.156 +C Defensive\scode\sin\ssqlite3TreeViewWindow()\sto\sfix\sa\scompiler\swarning. +D 2022-04-30T19:55:28.101 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -618,7 +618,7 @@ F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c a38f52058b517929e264094abd0b5fd1e8e145a1aa43bc6f6a72ae5218f96c98 -F src/treeview.c 7dd99cf420137d658492bbf3601d55fce9c34d4788606f43d83937b73474769c +F src/treeview.c a47e4246396118f3d5a1c524de15e6fffaf02036be192d4339e887a2a9bf36b1 F src/trigger.c 372ada38f667c6823a3db15749eb668338e65c793394e55a37e56a489f2d1b55 F src/update.c 2cfaded82ca80ff56afb8c3ae5e88284e0824bfd86119827cc22481959f96f92 F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 @@ -1951,8 +1951,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a8da85c57e07721dc1c918d67433d6c99ce48421e369123cc3194d855e55f7e8 -R 8dafede96e6eddf2103c6fe2efc2c0f1 +P a193749730d6cfba617f2a64e7254c78f92bbf29b109c19055fc33f6cc643d4c +R 1d2a81ecbf1d09fa752247278562e6d1 U drh -Z 677c686e7cbb46a3d1010c0d9d90814e +Z 7657291be748b0693bb1bbfc76537229 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 0915dc636c..2ad4ff62c9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a193749730d6cfba617f2a64e7254c78f92bbf29b109c19055fc33f6cc643d4c \ No newline at end of file +b250c218b4b6327a1cae3edbc037625ba998f89ee13a9bfbc2cefd1edfc4b768 \ No newline at end of file diff --git a/src/treeview.c b/src/treeview.c index 0f9b588f5a..3d5bd7175b 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -397,6 +397,7 @@ void sqlite3TreeViewBound( */ void sqlite3TreeViewWindow(TreeView *pView, const Window *pWin, u8 more){ int nElement = 0; + if( pWin==0 ) return; if( pWin->pFilter ){ sqlite3TreeViewItem(pView, "FILTER", 1); sqlite3TreeViewExpr(pView, pWin->pFilter, 0); From b94182bdc6235ce520322890d4b1567e6404d04f Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 2 May 2022 11:24:21 +0000 Subject: [PATCH 11/12] Bring the comments on sqlite3FindInIndex() into closer alignment with what that routine actually does. FossilOrigin-Name: 40f3274745b53bb72933c1052d0e85bc74be56d3a1068e9d54dc28763a2cfef9 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/expr.c | 9 +++++++-- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 73f80eb148..4b3f1993f6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Defensive\scode\sin\ssqlite3TreeViewWindow()\sto\sfix\sa\scompiler\swarning. -D 2022-04-30T19:55:28.101 +C Bring\sthe\scomments\son\ssqlite3FindInIndex()\sinto\scloser\salignment\swith\swhat\nthat\sroutine\sactually\sdoes. +D 2022-05-02T11:24:21.557 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -504,7 +504,7 @@ F src/date.c 15082566229d4b1e5f24fdb490bf9bcc68824b911d70e3573ef075a1b9e2d26f F src/dbpage.c 90661a87e1db8bfbc8d2ebbdcd3749651ddb287c555c07a28fb17c7c591ffb68 F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/delete.c a8e844af211a48b13b5b358be77a12c860c6a557c21990ad51a548e2536500ce -F src/expr.c d8c520edd0edf0b9c0ca467aa44c864ff17f265fd1cebbd224b6d5c625b638c3 +F src/expr.c 926dccca86a8d02bf2a8533ba07c9b0c576148915844a1c2217d94c718e9699b F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c d965ede15d8360c09ed59348940649ee647b192e784466837d7aefa836d1d91e F src/func.c a3407a6fbb0d4088d8d502e46f0ace63e0aeae7467ae23a9ca9815bbf9239761 @@ -1951,8 +1951,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a193749730d6cfba617f2a64e7254c78f92bbf29b109c19055fc33f6cc643d4c -R 1d2a81ecbf1d09fa752247278562e6d1 +P b250c218b4b6327a1cae3edbc037625ba998f89ee13a9bfbc2cefd1edfc4b768 +R b1223a28f05ca5a28b33b633588aeacf U drh -Z 7657291be748b0693bb1bbfc76537229 +Z 2fc59ad1d223e831e71b6ddeee2728d5 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 2ad4ff62c9..d90599d53d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b250c218b4b6327a1cae3edbc037625ba998f89ee13a9bfbc2cefd1edfc4b768 \ No newline at end of file +40f3274745b53bb72933c1052d0e85bc74be56d3a1068e9d54dc28763a2cfef9 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 13bacb90ca..f8ee68dc2b 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2659,7 +2659,7 @@ static int sqlite3InRhsIsConstant(Expr *pIn){ ** all members of the RHS set, skipping duplicates. ** ** A cursor is opened on the b-tree object that is the RHS of the IN operator -** and pX->iTable is set to the index of that cursor. +** and the *piTab parameter is set to the index of that cursor. ** ** The returned value of this function indicates the b-tree type, as follows: ** @@ -2679,7 +2679,10 @@ static int sqlite3InRhsIsConstant(Expr *pIn){ ** If the RHS of the IN operator is a list or a more complex subquery, then ** an ephemeral table might need to be generated from the RHS and then ** pX->iTable made to point to the ephemeral table instead of an -** existing table. +** existing table. In this case, the creation and initialization of the +** ephmeral table might be put inside of a subroutine, the EP_Subrtn flag +** will be set on pX and the pX->y.sub fields will be set to show where +** the subroutine is coded. ** ** The inFlags parameter must contain, at a minimum, one of the bits ** IN_INDEX_MEMBERSHIP or IN_INDEX_LOOP but not both. If inFlags contains @@ -2911,6 +2914,8 @@ int sqlite3FindInIndex( && ExprUseXList(pX) && (!sqlite3InRhsIsConstant(pX) || pX->x.pList->nExpr<=2) ){ + pParse->nTab--; /* Back out the allocation of the unused cursor */ + iTab = -1; /* Cursor is not allocated */ eType = IN_INDEX_NOOP; } From 3a45d30ea5eff2c17c5ee1561e12f0865ad75b3e Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 2 May 2022 14:32:56 +0000 Subject: [PATCH 12/12] Improvement on check-in [a193749730d6cfba] so that the subroutine call to the IN operator right-hand side generator from the RIGHT JOIN no-match logic does not generate unreachable byte code. FossilOrigin-Name: cc458317bd77046c4328715ae9e3409f3f4cd422a01162cb33405ef3a142b0a3 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/expr.c | 11 +++++++++-- src/sqliteInt.h | 1 + src/wherecode.c | 9 ++------- 5 files changed, 21 insertions(+), 18 deletions(-) diff --git a/manifest b/manifest index 4b3f1993f6..3e37826c15 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Bring\sthe\scomments\son\ssqlite3FindInIndex()\sinto\scloser\salignment\swith\swhat\nthat\sroutine\sactually\sdoes. -D 2022-05-02T11:24:21.557 +C Improvement\son\scheck-in\s[a193749730d6cfba]\sso\sthat\sthe\ssubroutine\scall\sto\nthe\sIN\soperator\sright-hand\sside\sgenerator\sfrom\sthe\sRIGHT\sJOIN\sno-match\slogic\ndoes\snot\sgenerate\sunreachable\sbyte\scode. +D 2022-05-02T14:32:56.242 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -504,7 +504,7 @@ F src/date.c 15082566229d4b1e5f24fdb490bf9bcc68824b911d70e3573ef075a1b9e2d26f F src/dbpage.c 90661a87e1db8bfbc8d2ebbdcd3749651ddb287c555c07a28fb17c7c591ffb68 F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/delete.c a8e844af211a48b13b5b358be77a12c860c6a557c21990ad51a548e2536500ce -F src/expr.c 926dccca86a8d02bf2a8533ba07c9b0c576148915844a1c2217d94c718e9699b +F src/expr.c 36acab0dde36ab805ed9c793c9a2bb864793999c8b4d4b0e758100eb0339b124 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c d965ede15d8360c09ed59348940649ee647b192e784466837d7aefa836d1d91e F src/func.c a3407a6fbb0d4088d8d502e46f0ace63e0aeae7467ae23a9ca9815bbf9239761 @@ -558,7 +558,7 @@ F src/shell.c.in ae0a6fae983caac6f8c824733f0599dfdf7b3a7e8efdef3cb5e3ab2e457ffc3 F src/sqlite.h.in 2a35f62185eb5e7ecc64a2f68442b538ce9be74f80f28a00abc24837edcf1c17 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h f49e28c25bd941e79794db5415fdf7b202deb3bc072ed6f1ed273d578703684e -F src/sqliteInt.h 4092f9f2395909ebf7da0a6e9907e92883cf98656bb751e1d919d2a0e475ae70 +F src/sqliteInt.h b076cfab9455b6ef1245667ff73dada79a204c750985f788e52469727f0d1c31 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4a3da6d77eeb3531cb0dbdf7047772a2a1b99f98c69e90ce009c75fe6328b2c0 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -642,7 +642,7 @@ F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b F src/where.c 43085b3a4ce2e56315fabb0b240a56e76667d9e03c79f287695bcae7b76152d5 F src/whereInt.h 4db5a877a9d1f38b5c928c1c84297c07f30b9a3bc1f5f66214cf1a8ef90a0556 -F src/wherecode.c d629ba77a3601a979b2a30d1a21ca7ae283faff797c7cffe79fb9366a075db89 +F src/wherecode.c 9c2af255257287a50a2c884cc13d0cca4292d46ffa235fbfa1f2e9c67b071e7c F src/whereexpr.c 174d4ad5be165c610c907abb779ef4a97974d22b84e1ce7898d2d9f6947249e5 F src/window.c 924e04fd6e0e113d4dba18b78d43fcb8e42b8ebffc8fc728da52cf3ab014cf3c F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1951,8 +1951,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P b250c218b4b6327a1cae3edbc037625ba998f89ee13a9bfbc2cefd1edfc4b768 -R b1223a28f05ca5a28b33b633588aeacf +P 40f3274745b53bb72933c1052d0e85bc74be56d3a1068e9d54dc28763a2cfef9 +R fa255f48eb3059bbcc1be1195343e4b6 U drh -Z 2fc59ad1d223e831e71b6ddeee2728d5 +Z e6ffd1955bb698b867fb285f4218f7e4 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index d90599d53d..15adbbe53c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -40f3274745b53bb72933c1052d0e85bc74be56d3a1068e9d54dc28763a2cfef9 \ No newline at end of file +cc458317bd77046c4328715ae9e3409f3f4cd422a01162cb33405ef3a142b0a3 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index f8ee68dc2b..8e47578cc8 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2743,12 +2743,17 @@ int sqlite3FindInIndex( ){ Select *p; /* SELECT to the right of IN operator */ int eType = 0; /* Type of RHS table. IN_INDEX_* */ - int iTab = pParse->nTab++; /* Cursor of the RHS table */ + int iTab; /* Cursor of the RHS table */ int mustBeUnique; /* True if RHS must be unique */ Vdbe *v = sqlite3GetVdbe(pParse); /* Virtual machine being coded */ assert( pX->op==TK_IN ); mustBeUnique = (inFlags & IN_INDEX_LOOP)!=0; + if( pX->iTable && (inFlags & IN_INDEX_REUSE_CUR)!=0 ){ + iTab = pX->iTable; + }else{ + iTab = pParse->nTab++; + } /* If the RHS of this IN(...) operator is a SELECT, and if it matters ** whether or not the SELECT result contains NULL values, check whether @@ -3082,7 +3087,9 @@ void sqlite3CodeRhsOfIN( assert( ExprUseYSub(pExpr) ); sqlite3VdbeAddOp2(v, OP_Gosub, pExpr->y.sub.regReturn, pExpr->y.sub.iAddr); - sqlite3VdbeAddOp2(v, OP_OpenDup, iTab, pExpr->iTable); + if( iTab!=pExpr->iTable ){ + sqlite3VdbeAddOp2(v, OP_OpenDup, iTab, pExpr->iTable); + } sqlite3VdbeJumpHere(v, addrOnce); return; } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index e526a775cb..e9f0af544a 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -5315,6 +5315,7 @@ const char *sqlite3JournalModename(int); #define IN_INDEX_NOOP_OK 0x0001 /* OK to return IN_INDEX_NOOP */ #define IN_INDEX_MEMBERSHIP 0x0002 /* IN operator used for membership test */ #define IN_INDEX_LOOP 0x0004 /* IN operator used as a loop */ +#define IN_INDEX_REUSE_CUR 0x0008 /* Reuse prior table cursor */ int sqlite3FindInIndex(Parse *, Expr *, u32, int*, int*, int*); int sqlite3JournalOpen(sqlite3_vfs *, const char *, sqlite3_file *, int, int); diff --git a/src/wherecode.c b/src/wherecode.c index 333295a48b..d4470ac4df 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -612,7 +612,7 @@ static int codeEqualityTerm( eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, 0, &iTab); }else{ Expr *pExpr = pTerm->pExpr; - if( pExpr->iTable==0 || !ExprHasProperty(pExpr, EP_Subrtn) ){ + if( pExpr->iTable==0 || !ExprHasProperty(pExpr, EP_Subrtn) ){ sqlite3 *db = pParse->db; pX = removeUnindexableInClauseTerms(pParse, iEq, pLoop, pX); if( !db->mallocFailed ){ @@ -622,14 +622,9 @@ static int codeEqualityTerm( } sqlite3ExprDelete(db, pX); }else{ - int j1; - sqlite3VdbeAddOp2(v, OP_Gosub, pExpr->y.sub.regReturn, - pExpr->y.sub.iAddr); - j1 = sqlite3VdbeAddOp0(v, OP_Goto); aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*nEq); - eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap,&iTab); + eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP|IN_INDEX_REUSE_CUR, 0, aiMap,&iTab); iTab = pExpr->iTable; - sqlite3VdbeJumpHere(v, j1); } pX = pExpr; }