1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-08 14:02:16 +03:00

Improvements for name resolution for parenthsized joins.

FossilOrigin-Name: 006b2d9c52201c9e836b649018519acfb47f793f70b968722440f00084e9d846
This commit is contained in:
drh
2022-05-04 18:43:39 +00:00
14 changed files with 4746 additions and 96 deletions

View File

@@ -1,5 +1,5 @@
C New\stest\scases\sfor\sRIGHT\sand\sFULL\sJOIN,\sfocusing\son\scases\sthat\smake\suse\nof\sBloom\sfilters,\sand\sa\sbug\sfix\srelated\sto\swhen\sON-clause\sconstraints\sare\napplied. C Improvements\sfor\sname\sresolution\sfor\sparenthsized\sjoins.
D 2022-05-04T17:43:59.157 D 2022-05-04T18:43:39.623
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -486,7 +486,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca
F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b
F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786
F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a
F src/alter.c 9395ece9850ad57c6fbb453aeb5185be4bae3b159c4b37611425c565124ee849 F src/alter.c d8872f9d1863d8e31c37475e318de746e1b5ca57c0e477e35042a9ebbb6e0298
F src/analyze.c aabdf3769c7fd9954a8ec508eb7041ae174b66f88d12c47199fabbea9a646467 F src/analyze.c aabdf3769c7fd9954a8ec508eb7041ae174b66f88d12c47199fabbea9a646467
F src/attach.c 4431f82f0247bf3aaf91589acafdff77d1882235c95407b36da1585c765fbbc8 F src/attach.c 4431f82f0247bf3aaf91589acafdff77d1882235c95407b36da1585c765fbbc8
F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf
@@ -496,7 +496,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6
F src/btree.c df695e953c2ce78ce4878ee5016751df9bc9a921dc0500a0f53ab3bb3196e505 F src/btree.c df695e953c2ce78ce4878ee5016751df9bc9a921dc0500a0f53ab3bb3196e505
F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22
F src/btreeInt.h 8ce1332edd89dfd2461d561ac10a0ab5601c8e06200cb5230596c3caaf54482e F src/btreeInt.h 8ce1332edd89dfd2461d561ac10a0ab5601c8e06200cb5230596c3caaf54482e
F src/build.c e8e776b52bc145cbf4e9fb88b99830083880fc2b174c2f96518fff15cbc72396 F src/build.c 23f874642825d7eaaeeb7a3281b2b1a75e1d4c4dd9ae4dceddcd908266634214
F src/callback.c 4c19af69835787bfe790ac560f3071a824eb629f34e41f97b52ce5235c77de1c F src/callback.c 4c19af69835787bfe790ac560f3071a824eb629f34e41f97b52ce5235c77de1c
F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
F src/ctime.c 026dbdcdbd8c3cde98a88483ee88310ff43150ab164ad768f12cc700a11495ad F src/ctime.c 026dbdcdbd8c3cde98a88483ee88310ff43150ab164ad768f12cc700a11495ad
@@ -504,7 +504,7 @@ F src/date.c 15082566229d4b1e5f24fdb490bf9bcc68824b911d70e3573ef075a1b9e2d26f
F src/dbpage.c 90661a87e1db8bfbc8d2ebbdcd3749651ddb287c555c07a28fb17c7c591ffb68 F src/dbpage.c 90661a87e1db8bfbc8d2ebbdcd3749651ddb287c555c07a28fb17c7c591ffb68
F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d
F src/delete.c a8e844af211a48b13b5b358be77a12c860c6a557c21990ad51a548e2536500ce F src/delete.c a8e844af211a48b13b5b358be77a12c860c6a557c21990ad51a548e2536500ce
F src/expr.c 36acab0dde36ab805ed9c793c9a2bb864793999c8b4d4b0e758100eb0339b124 F src/expr.c d955e8954e03e637c19033241806b04f6a937d0657f6261f2d9e4cdfe674b478
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
F src/fkey.c d965ede15d8360c09ed59348940649ee647b192e784466837d7aefa836d1d91e F src/fkey.c d965ede15d8360c09ed59348940649ee647b192e784466837d7aefa836d1d91e
F src/func.c a3407a6fbb0d4088d8d502e46f0ace63e0aeae7467ae23a9ca9815bbf9239761 F src/func.c a3407a6fbb0d4088d8d502e46f0ace63e0aeae7467ae23a9ca9815bbf9239761
@@ -551,14 +551,14 @@ F src/pragma.h e690a356c18e98414d2e870ea791c1be1545a714ba623719deb63f7f226d8bb7
F src/prepare.c fd940149c691684e7c1073c3787a7170e44852b02d1275d2e30a5b58e89cfcaf F src/prepare.c fd940149c691684e7c1073c3787a7170e44852b02d1275d2e30a5b58e89cfcaf
F src/printf.c 512574910a45341c8ad244bd3d4939968ebdfde215645b676fff01cc46e90757 F src/printf.c 512574910a45341c8ad244bd3d4939968ebdfde215645b676fff01cc46e90757
F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c
F src/resolve.c f72bb13359dd5a74d440df25f320dc2c1baff5cde4fc9f0d1bc3feba90b8932a F src/resolve.c e9ee235c4151d2b7fa47435a219bfd30bf516a804d2f004639858087ebf3137b
F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92
F src/select.c cc1a7581403fc074eee85283ba8d81de50a831ae175cb65a5751be00f621c0d5 F src/select.c 151adca2c9ea6f51215e4351bb8eb4f0012bf98c3d5a5c991d4a019c7cbb143e
F src/shell.c.in d842e26a30fe9acab962a20b1d7dd27e6130f76fbea1be64bf73982a6d64bc71 F src/shell.c.in d842e26a30fe9acab962a20b1d7dd27e6130f76fbea1be64bf73982a6d64bc71
F src/sqlite.h.in 2a35f62185eb5e7ecc64a2f68442b538ce9be74f80f28a00abc24837edcf1c17 F src/sqlite.h.in 2a35f62185eb5e7ecc64a2f68442b538ce9be74f80f28a00abc24837edcf1c17
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
F src/sqlite3ext.h f49e28c25bd941e79794db5415fdf7b202deb3bc072ed6f1ed273d578703684e F src/sqlite3ext.h f49e28c25bd941e79794db5415fdf7b202deb3bc072ed6f1ed273d578703684e
F src/sqliteInt.h 3247ce80347c99739850798a34b1179e396801c5fc0c8216892f7f134990672f F src/sqliteInt.h 7c8146fc57f2e009152eb93ad41eab28490f9c31691559f281a80f9077ec1f2a
F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657
F src/status.c 4a3da6d77eeb3531cb0dbdf7047772a2a1b99f98c69e90ce009c75fe6328b2c0 F src/status.c 4a3da6d77eeb3531cb0dbdf7047772a2a1b99f98c69e90ce009c75fe6328b2c0
F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
@@ -618,8 +618,8 @@ F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394
F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c
F src/tokenize.c a38f52058b517929e264094abd0b5fd1e8e145a1aa43bc6f6a72ae5218f96c98 F src/tokenize.c a38f52058b517929e264094abd0b5fd1e8e145a1aa43bc6f6a72ae5218f96c98
F src/treeview.c 5e81880b7c010fb25f5b40fb617136694544e18adef78b28057206f78cbbd1db F src/treeview.c 4153f2f044d13a3216e64271dfd1e59a3fa40222a45e6da248708088634e6f06
F src/trigger.c 372ada38f667c6823a3db15749eb668338e65c793394e55a37e56a489f2d1b55 F src/trigger.c 4fe4c1ac811755aff49d669d2e52e414eb5dfa6e172e849ab7b6825e70a571c0
F src/update.c 2cfaded82ca80ff56afb8c3ae5e88284e0824bfd86119827cc22481959f96f92 F src/update.c 2cfaded82ca80ff56afb8c3ae5e88284e0824bfd86119827cc22481959f96f92
F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937
F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0
@@ -640,11 +640,11 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
F src/wal.c b9df133a705093da8977da5eb202eaadb844839f1c7297c08d33471f5491843d F src/wal.c b9df133a705093da8977da5eb202eaadb844839f1c7297c08d33471f5491843d
F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a
F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b
F src/where.c 70eae5fd61a0dd2c613e1fbf84baa5f5cf95f974714538b27b3d45f0a00a16c8 F src/where.c aa585b89bd65a81e44bdfb871b55f65bf8fda88e1bc85efda6c236fe8d2bd788
F src/whereInt.h 4db5a877a9d1f38b5c928c1c84297c07f30b9a3bc1f5f66214cf1a8ef90a0556 F src/whereInt.h 4db5a877a9d1f38b5c928c1c84297c07f30b9a3bc1f5f66214cf1a8ef90a0556
F src/wherecode.c 72f8eeed5527450c8e2258160a7bd04534a76c161230d100da0f43a86c6e29ac F src/wherecode.c 72f8eeed5527450c8e2258160a7bd04534a76c161230d100da0f43a86c6e29ac
F src/whereexpr.c 174d4ad5be165c610c907abb779ef4a97974d22b84e1ce7898d2d9f6947249e5 F src/whereexpr.c e036477ac8424de50ae5b36a71103405d3f86b33ba11125ec7a2a99d501b0622
F src/window.c 924e04fd6e0e113d4dba18b78d43fcb8e42b8ebffc8fc728da52cf3ab014cf3c F src/window.c fff1b51757438c664e471d5184634e48dcdf8ea34b640f3b1b0810b1e06de18c
F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627
F test/affinity3.test b5c19d504dec222c0dc66642673d23dce915d35737b68e74d9f237b80493eb53 F test/affinity3.test b5c19d504dec222c0dc66642673d23dce915d35737b68e74d9f237b80493eb53
@@ -1152,6 +1152,7 @@ F test/join8.test 68f5ec206cd88610c19ab8edb4789a174a55cdb1732619a95db8fd33dbb137
F test/join9.test 9056ddd3b0c0f4f9d658f4521038d9a37dc23ead8ca9a505d0b0db2b6a471e05 F test/join9.test 9056ddd3b0c0f4f9d658f4521038d9a37dc23ead8ca9a505d0b0db2b6a471e05
F test/joinA.test 7eab225dc1c1ab258a5e62513a4ed7cabbd3db971d59d5d92f4fb6fa14c12f6a F test/joinA.test 7eab225dc1c1ab258a5e62513a4ed7cabbd3db971d59d5d92f4fb6fa14c12f6a
F test/joinB.test 1b2ba3fc8568b49411787fccbf540570c148e9b6a53a30f80691cb6268098ded F test/joinB.test 1b2ba3fc8568b49411787fccbf540570c148e9b6a53a30f80691cb6268098ded
F test/joinC.test 1f1a602c2127f55f136e2cbd3bf2d26546614bf8cffe5902ec1ac9c07f87f207
F test/joinD.test 58fb0aae651798a2264128f3f6f6ee3c9b5d5548071a1044365511b10de4edd3 F test/joinD.test 58fb0aae651798a2264128f3f6f6ee3c9b5d5548071a1044365511b10de4edd3
F test/journal1.test c7b768041b7f494471531e17abc2f4f5ebf9e5096984f43ed17c4eb80ba34497 F test/journal1.test c7b768041b7f494471531e17abc2f4f5ebf9e5096984f43ed17c4eb80ba34497
F test/journal2.test 9dac6b4ba0ca79c3b21446bbae993a462c2397c4 F test/journal2.test 9dac6b4ba0ca79c3b21446bbae993a462c2397c4
@@ -1952,9 +1953,9 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
P 544268a723cafdf0460221f5f018e752836436bad0fac90852cec70e63d9dcde b57033d2af2196e2f7e5305f3504fc20da5cadeb66026d38b999fe909cab8ac5 P 67510354e69bab98bd8095f5bedd34aae619fe2c7885975d7a6a00b7df5ece4e 72131ad1bda3d087e59cd4a51d87f10f65a55e658645397e1ede15f9fb1f5143
R 2b01a3d6c7b6f02d4e522e3ed6c45004 R d1fdc8a80f35786f357a6b126ffdd526
T +closed b57033d2af2196e2f7e5305f3504fc20da5cadeb66026d38b999fe909cab8ac5 T +closed 72131ad1bda3d087e59cd4a51d87f10f65a55e658645397e1ede15f9fb1f5143
U drh U drh
Z 7f193965db93741d1eaea3135aa51536 Z 4bfc6f14ecdde7d2ff2a0271486e7ca0
# Remove this line to create a well-formed Fossil manifest. # Remove this line to create a well-formed Fossil manifest.

View File

@@ -1 +1 @@
67510354e69bab98bd8095f5bedd34aae619fe2c7885975d7a6a00b7df5ece4e 006b2d9c52201c9e836b649018519acfb47f793f70b968722440f00084e9d846

View File

@@ -880,7 +880,7 @@ static int renameUnmapSelectCb(Walker *pWalker, Select *p){
if( ALWAYS(p->pEList) ){ if( ALWAYS(p->pEList) ){
ExprList *pList = p->pEList; ExprList *pList = p->pEList;
for(i=0; i<pList->nExpr; i++){ for(i=0; i<pList->nExpr; i++){
if( pList->a[i].zEName && pList->a[i].eEName==ENAME_NAME ){ if( pList->a[i].zEName && pList->a[i].fg.eEName==ENAME_NAME ){
sqlite3RenameTokenRemap(pParse, 0, (void*)pList->a[i].zEName); sqlite3RenameTokenRemap(pParse, 0, (void*)pList->a[i].zEName);
} }
} }
@@ -929,7 +929,7 @@ void sqlite3RenameExprlistUnmap(Parse *pParse, ExprList *pEList){
sWalker.xExprCallback = renameUnmapExprCb; sWalker.xExprCallback = renameUnmapExprCb;
sqlite3WalkExprList(&sWalker, pEList); sqlite3WalkExprList(&sWalker, pEList);
for(i=0; i<pEList->nExpr; i++){ for(i=0; i<pEList->nExpr; i++){
if( ALWAYS(pEList->a[i].eEName==ENAME_NAME) ){ if( ALWAYS(pEList->a[i].fg.eEName==ENAME_NAME) ){
sqlite3RenameTokenRemap(pParse, 0, (void*)pEList->a[i].zEName); sqlite3RenameTokenRemap(pParse, 0, (void*)pEList->a[i].zEName);
} }
} }
@@ -1087,7 +1087,7 @@ static void renameColumnElistNames(
int i; int i;
for(i=0; i<pEList->nExpr; i++){ for(i=0; i<pEList->nExpr; i++){
const char *zName = pEList->a[i].zEName; const char *zName = pEList->a[i].zEName;
if( ALWAYS(pEList->a[i].eEName==ENAME_NAME) if( ALWAYS(pEList->a[i].fg.eEName==ENAME_NAME)
&& ALWAYS(zName!=0) && ALWAYS(zName!=0)
&& 0==sqlite3_stricmp(zName, zOld) && 0==sqlite3_stricmp(zName, zOld)
){ ){

View File

@@ -1890,7 +1890,7 @@ void sqlite3AddPrimaryKey(
pTab->keyConf = (u8)onError; pTab->keyConf = (u8)onError;
assert( autoInc==0 || autoInc==1 ); assert( autoInc==0 || autoInc==1 );
pTab->tabFlags |= autoInc*TF_Autoincrement; pTab->tabFlags |= autoInc*TF_Autoincrement;
if( pList ) pParse->iPkSortOrder = pList->a[0].sortFlags; if( pList ) pParse->iPkSortOrder = pList->a[0].fg.sortFlags;
(void)sqlite3HasExplicitNulls(pParse, pList); (void)sqlite3HasExplicitNulls(pParse, pList);
}else if( autoInc ){ }else if( autoInc ){
#ifndef SQLITE_OMIT_AUTOINCREMENT #ifndef SQLITE_OMIT_AUTOINCREMENT
@@ -2384,7 +2384,7 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){
if( IN_RENAME_OBJECT ){ if( IN_RENAME_OBJECT ){
sqlite3RenameTokenRemap(pParse, pList->a[0].pExpr, &pTab->iPKey); sqlite3RenameTokenRemap(pParse, pList->a[0].pExpr, &pTab->iPKey);
} }
pList->a[0].sortFlags = pParse->iPkSortOrder; pList->a[0].fg.sortFlags = pParse->iPkSortOrder;
assert( pParse->pNewTable==pTab ); assert( pParse->pNewTable==pTab );
pTab->iPKey = -1; pTab->iPKey = -1;
sqlite3CreateIndex(pParse, 0, 0, 0, pList, pTab->keyConf, 0, 0, 0, 0, sqlite3CreateIndex(pParse, 0, 0, 0, pList, pTab->keyConf, 0, 0, 0, 0,
@@ -3872,8 +3872,8 @@ int sqlite3HasExplicitNulls(Parse *pParse, ExprList *pList){
if( pList ){ if( pList ){
int i; int i;
for(i=0; i<pList->nExpr; i++){ for(i=0; i<pList->nExpr; i++){
if( pList->a[i].bNulls ){ if( pList->a[i].fg.bNulls ){
u8 sf = pList->a[i].sortFlags; u8 sf = pList->a[i].fg.sortFlags;
sqlite3ErrorMsg(pParse, "unsupported use of NULLS %s", sqlite3ErrorMsg(pParse, "unsupported use of NULLS %s",
(sf==0 || sf==3) ? "FIRST" : "LAST" (sf==0 || sf==3) ? "FIRST" : "LAST"
); );
@@ -4226,7 +4226,7 @@ void sqlite3CreateIndex(
goto exit_create_index; goto exit_create_index;
} }
pIndex->azColl[i] = zColl; pIndex->azColl[i] = zColl;
requestedSortOrder = pListItem->sortFlags & sortOrderMask; requestedSortOrder = pListItem->fg.sortFlags & sortOrderMask;
pIndex->aSortOrder[i] = (u8)requestedSortOrder; pIndex->aSortOrder[i] = (u8)requestedSortOrder;
} }

View File

@@ -1628,12 +1628,8 @@ ExprList *sqlite3ExprListDup(sqlite3 *db, const ExprList *p, int flags){
} }
} }
pItem->zEName = sqlite3DbStrDup(db, pOldItem->zEName); pItem->zEName = sqlite3DbStrDup(db, pOldItem->zEName);
pItem->sortFlags = pOldItem->sortFlags; pItem->fg = pOldItem->fg;
pItem->eEName = pOldItem->eEName; pItem->fg.done = 0;
pItem->done = 0;
pItem->bNulls = pOldItem->bNulls;
pItem->bUsed = pOldItem->bUsed;
pItem->bSorterRef = pOldItem->bSorterRef;
pItem->u = pOldItem->u; pItem->u = pOldItem->u;
} }
return pNew; return pNew;
@@ -1933,16 +1929,16 @@ void sqlite3ExprListSetSortOrder(ExprList *p, int iSortOrder, int eNulls){
); );
pItem = &p->a[p->nExpr-1]; pItem = &p->a[p->nExpr-1];
assert( pItem->bNulls==0 ); assert( pItem->fg.bNulls==0 );
if( iSortOrder==SQLITE_SO_UNDEFINED ){ if( iSortOrder==SQLITE_SO_UNDEFINED ){
iSortOrder = SQLITE_SO_ASC; iSortOrder = SQLITE_SO_ASC;
} }
pItem->sortFlags = (u8)iSortOrder; pItem->fg.sortFlags = (u8)iSortOrder;
if( eNulls!=SQLITE_SO_UNDEFINED ){ if( eNulls!=SQLITE_SO_UNDEFINED ){
pItem->bNulls = 1; pItem->fg.bNulls = 1;
if( iSortOrder!=eNulls ){ if( iSortOrder!=eNulls ){
pItem->sortFlags |= KEYINFO_ORDER_BIGNULL; pItem->fg.sortFlags |= KEYINFO_ORDER_BIGNULL;
} }
} }
} }
@@ -1968,7 +1964,7 @@ void sqlite3ExprListSetName(
assert( pList->nExpr>0 ); assert( pList->nExpr>0 );
pItem = &pList->a[pList->nExpr-1]; pItem = &pList->a[pList->nExpr-1];
assert( pItem->zEName==0 ); assert( pItem->zEName==0 );
assert( pItem->eEName==ENAME_NAME ); assert( pItem->fg.eEName==ENAME_NAME );
pItem->zEName = sqlite3DbStrNDup(pParse->db, pName->z, pName->n); pItem->zEName = sqlite3DbStrNDup(pParse->db, pName->z, pName->n);
if( dequote ){ if( dequote ){
/* If dequote==0, then pName->z does not point to part of a DDL /* If dequote==0, then pName->z does not point to part of a DDL
@@ -2003,7 +1999,7 @@ void sqlite3ExprListSetSpan(
assert( pList->nExpr>0 ); assert( pList->nExpr>0 );
if( pItem->zEName==0 ){ if( pItem->zEName==0 ){
pItem->zEName = sqlite3DbSpanDup(db, zStart, zEnd); pItem->zEName = sqlite3DbSpanDup(db, zStart, zEnd);
pItem->eEName = ENAME_SPAN; pItem->fg.eEName = ENAME_SPAN;
} }
} }
} }
@@ -4829,7 +4825,9 @@ int sqlite3ExprCodeRunJustOnce(
struct ExprList_item *pItem; struct ExprList_item *pItem;
int i; int i;
for(pItem=p->a, i=p->nExpr; i>0; pItem++, i--){ for(pItem=p->a, i=p->nExpr; i>0; pItem++, i--){
if( pItem->reusable && sqlite3ExprCompare(0,pItem->pExpr,pExpr,-1)==0 ){ if( pItem->fg.reusable
&& sqlite3ExprCompare(0,pItem->pExpr,pExpr,-1)==0
){
return pItem->u.iConstExprReg; return pItem->u.iConstExprReg;
} }
} }
@@ -4852,7 +4850,7 @@ int sqlite3ExprCodeRunJustOnce(
p = sqlite3ExprListAppend(pParse, p, pExpr); p = sqlite3ExprListAppend(pParse, p, pExpr);
if( p ){ if( p ){
struct ExprList_item *pItem = &p->a[p->nExpr-1]; struct ExprList_item *pItem = &p->a[p->nExpr-1];
pItem->reusable = regDest<0; pItem->fg.reusable = regDest<0;
if( regDest<0 ) regDest = ++pParse->nMem; if( regDest<0 ) regDest = ++pParse->nMem;
pItem->u.iConstExprReg = regDest; pItem->u.iConstExprReg = regDest;
} }
@@ -4986,7 +4984,7 @@ int sqlite3ExprCodeExprList(
for(pItem=pList->a, i=0; i<n; i++, pItem++){ for(pItem=pList->a, i=0; i<n; i++, pItem++){
Expr *pExpr = pItem->pExpr; Expr *pExpr = pItem->pExpr;
#ifdef SQLITE_ENABLE_SORTER_REFERENCES #ifdef SQLITE_ENABLE_SORTER_REFERENCES
if( pItem->bSorterRef ){ if( pItem->fg.bSorterRef ){
i--; i--;
n--; n--;
}else }else
@@ -5611,7 +5609,7 @@ int sqlite3ExprListCompare(const ExprList *pA, const ExprList *pB, int iTab){
int res; int res;
Expr *pExprA = pA->a[i].pExpr; Expr *pExprA = pA->a[i].pExpr;
Expr *pExprB = pB->a[i].pExpr; Expr *pExprB = pB->a[i].pExpr;
if( pA->a[i].sortFlags!=pB->a[i].sortFlags ) return 1; if( pA->a[i].fg.sortFlags!=pB->a[i].fg.sortFlags ) return 1;
if( (res = sqlite3ExprCompare(0, pExprA, pExprB, iTab)) ) return res; if( (res = sqlite3ExprCompare(0, pExprA, pExprB, iTab)) ) return res;
} }
return 0; return 0;

View File

@@ -130,7 +130,7 @@ int sqlite3MatchEName(
){ ){
int n; int n;
const char *zSpan; const char *zSpan;
if( pItem->eEName!=ENAME_TAB ) return 0; if( pItem->fg.eEName!=ENAME_TAB ) return 0;
zSpan = pItem->zEName; zSpan = pItem->zEName;
for(n=0; ALWAYS(zSpan[n]) && zSpan[n]!='.'; n++){} for(n=0; ALWAYS(zSpan[n]) && zSpan[n]!='.'; n++){}
if( zDb && (sqlite3StrNICmp(zSpan, zDb, n)!=0 || zDb[n]!=0) ){ if( zDb && (sqlite3StrNICmp(zSpan, zDb, n)!=0 || zDb[n]!=0) ){
@@ -359,8 +359,9 @@ static int lookupName(
cntTab = 2; cntTab = 2;
pMatch = pItem; pMatch = pItem;
pExpr->iColumn = j; pExpr->iColumn = j;
pEList->a[j].bUsed = 1; pEList->a[j].fg.bUsed = 1;
hit = 1; hit = 1;
if( pEList->a[j].fg.bUsingTerm ) break;
} }
if( hit || zTab==0 ) continue; if( hit || zTab==0 ) continue;
} }
@@ -583,7 +584,7 @@ static int lookupName(
assert( pEList!=0 ); assert( pEList!=0 );
for(j=0; j<pEList->nExpr; j++){ for(j=0; j<pEList->nExpr; j++){
char *zAs = pEList->a[j].zEName; char *zAs = pEList->a[j].zEName;
if( pEList->a[j].eEName==ENAME_NAME if( pEList->a[j].fg.eEName==ENAME_NAME
&& sqlite3_stricmp(zAs, zCol)==0 && sqlite3_stricmp(zAs, zCol)==0
){ ){
Expr *pOrig; Expr *pOrig;
@@ -1336,7 +1337,7 @@ static int resolveAsName(
assert( !ExprHasProperty(pE, EP_IntValue) ); assert( !ExprHasProperty(pE, EP_IntValue) );
zCol = pE->u.zToken; zCol = pE->u.zToken;
for(i=0; i<pEList->nExpr; i++){ for(i=0; i<pEList->nExpr; i++){
if( pEList->a[i].eEName==ENAME_NAME if( pEList->a[i].fg.eEName==ENAME_NAME
&& sqlite3_stricmp(pEList->a[i].zEName, zCol)==0 && sqlite3_stricmp(pEList->a[i].zEName, zCol)==0
){ ){
return i+1; return i+1;
@@ -1457,7 +1458,7 @@ static int resolveCompoundOrderBy(
return 1; return 1;
} }
for(i=0; i<pOrderBy->nExpr; i++){ for(i=0; i<pOrderBy->nExpr; i++){
pOrderBy->a[i].done = 0; pOrderBy->a[i].fg.done = 0;
} }
pSelect->pNext = 0; pSelect->pNext = 0;
while( pSelect->pPrior ){ while( pSelect->pPrior ){
@@ -1472,7 +1473,7 @@ static int resolveCompoundOrderBy(
for(i=0, pItem=pOrderBy->a; i<pOrderBy->nExpr; i++, pItem++){ for(i=0, pItem=pOrderBy->a; i<pOrderBy->nExpr; i++, pItem++){
int iCol = -1; int iCol = -1;
Expr *pE, *pDup; Expr *pE, *pDup;
if( pItem->done ) continue; if( pItem->fg.done ) continue;
pE = sqlite3ExprSkipCollateAndLikely(pItem->pExpr); pE = sqlite3ExprSkipCollateAndLikely(pItem->pExpr);
if( NEVER(pE==0) ) continue; if( NEVER(pE==0) ) continue;
if( sqlite3ExprIsInteger(pE, &iCol) ){ if( sqlite3ExprIsInteger(pE, &iCol) ){
@@ -1525,7 +1526,7 @@ static int resolveCompoundOrderBy(
sqlite3ExprDelete(db, pE); sqlite3ExprDelete(db, pE);
pItem->u.x.iOrderByCol = (u16)iCol; pItem->u.x.iOrderByCol = (u16)iCol;
} }
pItem->done = 1; pItem->fg.done = 1;
}else{ }else{
moreToDo = 1; moreToDo = 1;
} }
@@ -1533,7 +1534,7 @@ static int resolveCompoundOrderBy(
pSelect = pSelect->pNext; pSelect = pSelect->pNext;
} }
for(i=0; i<pOrderBy->nExpr; i++){ for(i=0; i<pOrderBy->nExpr; i++){
if( pOrderBy->a[i].done==0 ){ if( pOrderBy->a[i].fg.done==0 ){
sqlite3ErrorMsg(pParse, "%r ORDER BY term does not match any " sqlite3ErrorMsg(pParse, "%r ORDER BY term does not match any "
"column in the result set", i+1); "column in the result set", i+1);
return 1; return 1;

View File

@@ -331,7 +331,7 @@ void sqlite3SrcItemColumnUsed(SrcItem *pItem, int iCol){
pResults = pItem->pSelect->pEList; pResults = pItem->pSelect->pEList;
assert( pResults!=0 ); assert( pResults!=0 );
assert( iCol>=0 && iCol<pResults->nExpr ); assert( iCol>=0 && iCol<pResults->nExpr );
pResults->a[iCol].bUsed = 1; pResults->a[iCol].fg.bUsed = 1;
} }
} }
@@ -999,7 +999,7 @@ static void fixDistinctOpenEph(
** retrieved directly from table t1. If the values are very large, this ** retrieved directly from table t1. If the values are very large, this
** can be more efficient than storing them directly in the sorter records. ** can be more efficient than storing them directly in the sorter records.
** **
** The ExprList_item.bSorterRef flag is set for each expression in pEList ** The ExprList_item.fg.bSorterRef flag is set for each expression in pEList
** for which the sorter-reference optimization should be enabled. ** for which the sorter-reference optimization should be enabled.
** Additionally, the pSort->aDefer[] array is populated with entries ** Additionally, the pSort->aDefer[] array is populated with entries
** for all cursors required to evaluate all selected expressions. Finally. ** for all cursors required to evaluate all selected expressions. Finally.
@@ -1059,7 +1059,7 @@ static void selectExprDefer(
nDefer++; nDefer++;
} }
} }
pItem->bSorterRef = 1; pItem->fg.bSorterRef = 1;
} }
} }
} }
@@ -1190,7 +1190,7 @@ static void selectInnerLoop(
for(i=0; i<pEList->nExpr; i++){ for(i=0; i<pEList->nExpr; i++){
if( pEList->a[i].u.x.iOrderByCol>0 if( pEList->a[i].u.x.iOrderByCol>0
#ifdef SQLITE_ENABLE_SORTER_REFERENCES #ifdef SQLITE_ENABLE_SORTER_REFERENCES
|| pEList->a[i].bSorterRef || pEList->a[i].fg.bSorterRef
#endif #endif
){ ){
nResultCol--; nResultCol--;
@@ -1552,7 +1552,7 @@ KeyInfo *sqlite3KeyInfoFromExprList(
assert( sqlite3KeyInfoIsWriteable(pInfo) ); assert( sqlite3KeyInfoIsWriteable(pInfo) );
for(i=iStart, pItem=pList->a+iStart; i<nExpr; i++, pItem++){ for(i=iStart, pItem=pList->a+iStart; i<nExpr; i++, pItem++){
pInfo->aColl[i-iStart] = sqlite3ExprNNCollSeq(pParse, pItem->pExpr); pInfo->aColl[i-iStart] = sqlite3ExprNNCollSeq(pParse, pItem->pExpr);
pInfo->aSortFlags[i-iStart] = pItem->sortFlags; pInfo->aSortFlags[i-iStart] = pItem->fg.sortFlags;
} }
} }
return pInfo; return pInfo;
@@ -1691,7 +1691,7 @@ static void generateSortTail(
} }
for(i=0, iCol=nKey+bSeq-1; i<nColumn; i++){ for(i=0, iCol=nKey+bSeq-1; i<nColumn; i++){
#ifdef SQLITE_ENABLE_SORTER_REFERENCES #ifdef SQLITE_ENABLE_SORTER_REFERENCES
if( aOutEx[i].bSorterRef ) continue; if( aOutEx[i].fg.bSorterRef ) continue;
#endif #endif
if( aOutEx[i].u.x.iOrderByCol==0 ) iCol++; if( aOutEx[i].u.x.iOrderByCol==0 ) iCol++;
} }
@@ -1728,7 +1728,7 @@ static void generateSortTail(
#endif #endif
for(i=nColumn-1; i>=0; i--){ for(i=nColumn-1; i>=0; i--){
#ifdef SQLITE_ENABLE_SORTER_REFERENCES #ifdef SQLITE_ENABLE_SORTER_REFERENCES
if( aOutEx[i].bSorterRef ){ if( aOutEx[i].fg.bSorterRef ){
sqlite3ExprCode(pParse, aOutEx[i].pExpr, regRow+i); sqlite3ExprCode(pParse, aOutEx[i].pExpr, regRow+i);
}else }else
#endif #endif
@@ -2094,7 +2094,7 @@ void sqlite3GenerateColumnNames(
assert( p->op!=TK_AGG_COLUMN ); /* Agg processing has not run yet */ assert( p->op!=TK_AGG_COLUMN ); /* Agg processing has not run yet */
assert( p->op!=TK_COLUMN assert( p->op!=TK_COLUMN
|| (ExprUseYTab(p) && p->y.pTab!=0) ); /* Covering idx not yet coded */ || (ExprUseYTab(p) && p->y.pTab!=0) ); /* Covering idx not yet coded */
if( pEList->a[i].zEName && pEList->a[i].eEName==ENAME_NAME ){ if( pEList->a[i].zEName && pEList->a[i].fg.eEName==ENAME_NAME ){
/* An AS clause always takes first priority */ /* An AS clause always takes first priority */
char *zName = pEList->a[i].zEName; char *zName = pEList->a[i].zEName;
sqlite3VdbeSetColName(v, i, COLNAME_NAME, zName, SQLITE_TRANSIENT); sqlite3VdbeSetColName(v, i, COLNAME_NAME, zName, SQLITE_TRANSIENT);
@@ -2180,9 +2180,10 @@ int sqlite3ColumnsFromExprList(
for(i=0, pCol=aCol; i<nCol && !db->mallocFailed; i++, pCol++){ for(i=0, pCol=aCol; i<nCol && !db->mallocFailed; i++, pCol++){
struct ExprList_item *pX = &pEList->a[i]; struct ExprList_item *pX = &pEList->a[i];
struct ExprList_item *pCollide;
/* Get an appropriate name for the column /* Get an appropriate name for the column
*/ */
if( (zName = pX->zEName)!=0 && pX->eEName==ENAME_NAME ){ if( (zName = pX->zEName)!=0 && pX->fg.eEName==ENAME_NAME ){
/* If the column contains an "AS <name>" phrase, use <name> as the name */ /* If the column contains an "AS <name>" phrase, use <name> as the name */
}else{ }else{
Expr *pColExpr = sqlite3ExprSkipCollateAndLikely(pX->pExpr); Expr *pColExpr = sqlite3ExprSkipCollateAndLikely(pX->pExpr);
@@ -2216,7 +2217,10 @@ int sqlite3ColumnsFromExprList(
** append an integer to the name so that it becomes unique. ** append an integer to the name so that it becomes unique.
*/ */
cnt = 0; cnt = 0;
while( zName && sqlite3HashFind(&ht, zName)!=0 ){ while( zName && (pCollide = sqlite3HashFind(&ht, zName))!=0 ){
if( pCollide->fg.bUsingTerm ){
pCol->colFlags |= COLFLAG_NOEXPAND;
}
nName = sqlite3Strlen30(zName); nName = sqlite3Strlen30(zName);
if( nName>0 ){ if( nName>0 ){
for(j=nName-1; j>0 && sqlite3Isdigit(zName[j]); j--){} for(j=nName-1; j>0 && sqlite3Isdigit(zName[j]); j--){}
@@ -2227,8 +2231,11 @@ int sqlite3ColumnsFromExprList(
} }
pCol->zCnName = zName; pCol->zCnName = zName;
pCol->hName = sqlite3StrIHash(zName); pCol->hName = sqlite3StrIHash(zName);
if( pX->fg.bNoExpand ){
pCol->colFlags |= COLFLAG_NOEXPAND;
}
sqlite3ColumnPropertiesFromName(0, pCol); sqlite3ColumnPropertiesFromName(0, pCol);
if( zName && sqlite3HashInsert(&ht, zName, pCol)==pCol ){ if( zName && sqlite3HashInsert(&ht, zName, pX)==pX ){
sqlite3OomFault(db); sqlite3OomFault(db);
} }
} }
@@ -2485,7 +2492,7 @@ static KeyInfo *multiSelectOrderByKeyInfo(Parse *pParse, Select *p, int nExtra){
} }
assert( sqlite3KeyInfoIsWriteable(pRet) ); assert( sqlite3KeyInfoIsWriteable(pRet) );
pRet->aColl[i] = pColl; pRet->aColl[i] = pColl;
pRet->aSortFlags[i] = pOrderBy->a[i].sortFlags; pRet->aSortFlags[i] = pOrderBy->a[i].fg.sortFlags;
} }
} }
@@ -5091,7 +5098,7 @@ static u8 minMaxQuery(sqlite3 *db, Expr *pFunc, ExprList **ppMinMax){
} }
*ppMinMax = pOrderBy = sqlite3ExprListDup(db, pEList, 0); *ppMinMax = pOrderBy = sqlite3ExprListDup(db, pEList, 0);
assert( pOrderBy!=0 || db->mallocFailed ); assert( pOrderBy!=0 || db->mallocFailed );
if( pOrderBy ) pOrderBy->a[0].sortFlags = sortFlags; if( pOrderBy ) pOrderBy->a[0].fg.sortFlags = sortFlags;
return eRet; return eRet;
} }
@@ -5798,7 +5805,7 @@ static int selectExpander(Walker *pWalker, Select *p){
pNew = sqlite3ExprListAppend(pParse, pNew, a[k].pExpr); pNew = sqlite3ExprListAppend(pParse, pNew, a[k].pExpr);
if( pNew ){ if( pNew ){
pNew->a[pNew->nExpr-1].zEName = a[k].zEName; pNew->a[pNew->nExpr-1].zEName = a[k].zEName;
pNew->a[pNew->nExpr-1].eEName = a[k].eEName; pNew->a[pNew->nExpr-1].fg.eEName = a[k].fg.eEName;
a[k].zEName = 0; a[k].zEName = 0;
} }
a[k].pExpr = 0; a[k].pExpr = 0;
@@ -5818,6 +5825,7 @@ static int selectExpander(Walker *pWalker, Select *p){
char *zTabName; /* AS name for this data source */ char *zTabName; /* AS name for this data source */
const char *zSchemaName = 0; /* Schema name for this data source */ const char *zSchemaName = 0; /* Schema name for this data source */
int iDb; /* Schema index for this data src */ int iDb; /* Schema index for this data src */
IdList *pUsing; /* USING clause for pFrom[1] */
if( (zTabName = pFrom->zAlias)==0 ){ if( (zTabName = pFrom->zAlias)==0 ){
zTabName = pTab->zName; zTabName = pTab->zName;
@@ -5837,6 +5845,27 @@ static int selectExpander(Walker *pWalker, Select *p){
iDb = sqlite3SchemaToIndex(db, pTab->pSchema); iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
zSchemaName = iDb>=0 ? db->aDb[iDb].zDbSName : "*"; zSchemaName = iDb>=0 ? db->aDb[iDb].zDbSName : "*";
} }
if( i+1<pTabList->nSrc
&& pFrom[1].fg.isUsing
&& (selFlags & SF_NestedFrom)!=0
){
int ii;
pUsing = pFrom[1].u3.pUsing;
for(ii=0; ii<pUsing->nId; ii++){
const char *zUName = pUsing->a[ii].zName;
pRight = sqlite3Expr(db, TK_ID, zUName);
pNew = sqlite3ExprListAppend(pParse, pNew, pRight);
if( pNew ){
struct ExprList_item *pX = &pNew->a[pNew->nExpr-1];
assert( pX->zEName==0 );
pX->zEName = sqlite3MPrintf(db,"..%s", zUName);
pX->fg.eEName = ENAME_TAB;
pX->fg.bUsingTerm = 1;
}
}
}else{
pUsing = 0;
}
for(j=0; j<pTab->nCol; j++){ for(j=0; j<pTab->nCol; j++){
char *zName = pTab->aCol[j].zCnName; char *zName = pTab->aCol[j].zCnName;
struct ExprList_item *pX; /* Newly added ExprList term */ struct ExprList_item *pX; /* Newly added ExprList term */
@@ -5853,14 +5882,22 @@ static int selectExpander(Walker *pWalker, Select *p){
** result-set list unless the SELECT has the SF_IncludeHidden ** result-set list unless the SELECT has the SF_IncludeHidden
** bit set. ** bit set.
*/ */
if( (p->selFlags & SF_IncludeHidden)==0 if( pTab->aCol[j].colFlags & (COLFLAG_HIDDEN|COLFLAG_NOEXPAND) ){
&& IsHiddenColumn(&pTab->aCol[j]) if( IsHiddenColumn(&pTab->aCol[j])
){ && (selFlags & (SF_IncludeHidden|SF_NestedFrom))==0
continue; ){
continue;
}
if( (pTab->aCol[j].colFlags & COLFLAG_NOEXPAND)!=0
&& zTName==0
&& (selFlags & (SF_NestedFrom))==0
){
continue;
}
} }
tableSeen = 1; tableSeen = 1;
if( i>0 && zTName==0 ){ if( i>0 && zTName==0 && (selFlags & SF_NestedFrom)==0 ){
if( pFrom->fg.isUsing if( pFrom->fg.isUsing
&& sqlite3IdListIndex(pFrom->u3.pUsing, zName)>=0 && sqlite3IdListIndex(pFrom->u3.pUsing, zName)>=0
){ ){
@@ -5872,6 +5909,7 @@ static int selectExpander(Walker *pWalker, Select *p){
pRight = sqlite3Expr(db, TK_ID, zName); pRight = sqlite3Expr(db, TK_ID, zName);
if( (pTabList->nSrc>1 if( (pTabList->nSrc>1
&& ( (pFrom->fg.jointype & JT_LTORJ)==0 && ( (pFrom->fg.jointype & JT_LTORJ)==0
|| (selFlags & SF_NestedFrom)!=0
|| !inAnyUsingClause(zName,pFrom,pTabList->nSrc-i-1) || !inAnyUsingClause(zName,pFrom,pTabList->nSrc-i-1)
) )
) )
@@ -5905,13 +5943,20 @@ static int selectExpander(Walker *pWalker, Select *p){
zSchemaName, zTabName, zName); zSchemaName, zTabName, zName);
testcase( pX->zEName==0 ); testcase( pX->zEName==0 );
} }
pX->eEName = ENAME_TAB; pX->fg.eEName = ENAME_TAB;
if( (pFrom->fg.isUsing
&& sqlite3IdListIndex(pFrom->u3.pUsing, zName)>=0)
|| (pUsing && sqlite3IdListIndex(pUsing, zName)>=0)
|| (pTab->aCol[j].colFlags & COLFLAG_NOEXPAND)!=0
){
pX->fg.bNoExpand = 1;
}
}else if( longNames ){ }else if( longNames ){
pX->zEName = sqlite3MPrintf(db, "%s.%s", zTabName, zName); pX->zEName = sqlite3MPrintf(db, "%s.%s", zTabName, zName);
pX->eEName = ENAME_NAME; pX->fg.eEName = ENAME_NAME;
}else{ }else{
pX->zEName = sqlite3DbStrDup(db, zName); pX->zEName = sqlite3DbStrDup(db, zName);
pX->eEName = ENAME_NAME; pX->fg.eEName = ENAME_NAME;
} }
} }
} }
@@ -7039,13 +7084,13 @@ int sqlite3Select(
if( p->selFlags & SF_NestedFrom ){ if( p->selFlags & SF_NestedFrom ){
/* Delete or NULL-out result columns that will never be used */ /* Delete or NULL-out result columns that will never be used */
int ii; int ii;
for(ii=pEList->nExpr-1; ii>0 && pEList->a[ii].bUsed==0; ii--){ for(ii=pEList->nExpr-1; ii>0 && pEList->a[ii].fg.bUsed==0; ii--){
sqlite3ExprDelete(db, pEList->a[ii].pExpr); sqlite3ExprDelete(db, pEList->a[ii].pExpr);
sqlite3DbFree(db, pEList->a[ii].zEName); sqlite3DbFree(db, pEList->a[ii].zEName);
pEList->nExpr--; pEList->nExpr--;
} }
for(ii=0; ii<pEList->nExpr; ii++){ for(ii=0; ii<pEList->nExpr; ii++){
if( pEList->a[ii].bUsed==0 ) pEList->a[ii].pExpr->op = TK_NULL; if( pEList->a[ii].fg.bUsed==0 ) pEList->a[ii].pExpr->op = TK_NULL;
} }
} }
} }
@@ -7197,8 +7242,9 @@ int sqlite3Select(
** ORDER BY to maximize the chances of rows being delivered in an ** ORDER BY to maximize the chances of rows being delivered in an
** order that makes the ORDER BY redundant. */ ** order that makes the ORDER BY redundant. */
for(ii=0; ii<pGroupBy->nExpr; ii++){ for(ii=0; ii<pGroupBy->nExpr; ii++){
u8 sortFlags = sSort.pOrderBy->a[ii].sortFlags & KEYINFO_ORDER_DESC; u8 sortFlags;
pGroupBy->a[ii].sortFlags = sortFlags; sortFlags = sSort.pOrderBy->a[ii].fg.sortFlags & KEYINFO_ORDER_DESC;
pGroupBy->a[ii].fg.sortFlags = sortFlags;
} }
if( sqlite3ExprListCompare(pGroupBy, sSort.pOrderBy, -1)==0 ){ if( sqlite3ExprListCompare(pGroupBy, sSort.pOrderBy, -1)==0 ){
orderByGrp = 1; orderByGrp = 1;

View File

@@ -2127,6 +2127,7 @@ struct Column {
#define COLFLAG_NOTAVAIL 0x0080 /* STORED column not yet calculated */ #define COLFLAG_NOTAVAIL 0x0080 /* STORED column not yet calculated */
#define COLFLAG_BUSY 0x0100 /* Blocks recursion on GENERATED columns */ #define COLFLAG_BUSY 0x0100 /* Blocks recursion on GENERATED columns */
#define COLFLAG_HASCOLL 0x0200 /* Has collating sequence name in zCnName */ #define COLFLAG_HASCOLL 0x0200 /* Has collating sequence name in zCnName */
#define COLFLAG_NOEXPAND 0x0400 /* Omit this column when expanding "*" */
#define COLFLAG_GENERATED 0x0060 /* Combo: _STORED, _VIRTUAL */ #define COLFLAG_GENERATED 0x0060 /* Combo: _STORED, _VIRTUAL */
#define COLFLAG_NOINSERT 0x0062 /* Combo: _HIDDEN, _STORED, _VIRTUAL */ #define COLFLAG_NOINSERT 0x0062 /* Combo: _HIDDEN, _STORED, _VIRTUAL */
@@ -3000,13 +3001,18 @@ struct ExprList {
struct ExprList_item { /* For each expression in the list */ struct ExprList_item { /* For each expression in the list */
Expr *pExpr; /* The parse tree for this expression */ Expr *pExpr; /* The parse tree for this expression */
char *zEName; /* Token associated with this expression */ char *zEName; /* Token associated with this expression */
u8 sortFlags; /* Mask of KEYINFO_ORDER_* flags */ struct {
unsigned eEName :2; /* Meaning of zEName */ u8 sortFlags; /* Mask of KEYINFO_ORDER_* flags */
unsigned done :1; /* A flag to indicate when processing is finished */ unsigned eEName :2; /* Meaning of zEName */
unsigned reusable :1; /* Constant expression is reusable */ unsigned done :1; /* Indicates when processing is finished */
unsigned bSorterRef :1; /* Defer evaluation until after sorting */ unsigned reusable :1; /* Constant expression is reusable */
unsigned bNulls: 1; /* True if explicit "NULLS FIRST/LAST" */ unsigned bSorterRef :1; /* Defer evaluation until after sorting */
unsigned bUsed: 1; /* This column used in a SF_NestedFrom subquery */ unsigned bNulls :1; /* True if explicit "NULLS FIRST/LAST" */
unsigned bUsed :1; /* This column used in a SF_NestedFrom subquery */
unsigned bUsingTerm:1; /* Term from the USING clause of a NestedFrom */
unsigned bNoExpand: 1; /* Term is an auxiliary in NestedFrom and should
** not be expanded by "*" in parent queries */
} fg;
union { union {
struct { /* Used by any ExprList other than Parse.pConsExpr */ struct { /* Used by any ExprList other than Parse.pConsExpr */
u16 iOrderByCol; /* For ORDER BY, column number in result set */ u16 iOrderByCol; /* For ORDER BY, column number in result set */

View File

@@ -875,13 +875,15 @@ void sqlite3TreeViewBareExprList(
moreToFollow = 0; moreToFollow = 0;
sqlite3TreeViewLine(pView, 0); sqlite3TreeViewLine(pView, 0);
if( zName ){ if( zName ){
switch( pList->a[i].eEName ){ switch( pList->a[i].fg.eEName ){
default: default:
fprintf(stdout, "AS %s ", zName); fprintf(stdout, "AS %s ", zName);
break; break;
case ENAME_TAB: case ENAME_TAB:
fprintf(stdout, "TABLE-ALIAS-NAME(\"%s\") ", zName); fprintf(stdout, "TABLE-ALIAS-NAME(\"%s\") ", zName);
if( pList->a[i].bUsed==0 ) fprintf(stdout, "(unused) "); if( pList->a[i].fg.bUsed ) fprintf(stdout, "(used) ");
if( pList->a[i].fg.bUsingTerm ) fprintf(stdout, "(USING-term) ");
if( pList->a[i].fg.bNoExpand ) fprintf(stdout, "(NoExpand) ");
break; break;
case ENAME_SPAN: case ENAME_SPAN:
fprintf(stdout, "SPAN(\"%s\") ", zName); fprintf(stdout, "SPAN(\"%s\") ", zName);

View File

@@ -905,7 +905,7 @@ static ExprList *sqlite3ExpandReturning(
if( !db->mallocFailed ){ if( !db->mallocFailed ){
struct ExprList_item *pItem = &pNew->a[pNew->nExpr-1]; struct ExprList_item *pItem = &pNew->a[pNew->nExpr-1];
pItem->zEName = sqlite3DbStrDup(db, pTab->aCol[jj].zCnName); pItem->zEName = sqlite3DbStrDup(db, pTab->aCol[jj].zCnName);
pItem->eEName = ENAME_NAME; pItem->fg.eEName = ENAME_NAME;
} }
} }
}else{ }else{
@@ -914,7 +914,7 @@ static ExprList *sqlite3ExpandReturning(
if( !db->mallocFailed && ALWAYS(pList->a[i].zEName!=0) ){ if( !db->mallocFailed && ALWAYS(pList->a[i].zEName!=0) ){
struct ExprList_item *pItem = &pNew->a[pNew->nExpr-1]; struct ExprList_item *pItem = &pNew->a[pNew->nExpr-1];
pItem->zEName = sqlite3DbStrDup(db, pList->a[i].zEName); pItem->zEName = sqlite3DbStrDup(db, pList->a[i].zEName);
pItem->eEName = pList->a[i].eEName; pItem->fg.eEName = pList->a[i].fg.eEName;
} }
} }
} }

View File

@@ -1206,7 +1206,7 @@ static sqlite3_index_info *allocateIndexInfo(
} }
/* Virtual tables are unable to deal with NULLS FIRST */ /* Virtual tables are unable to deal with NULLS FIRST */
if( pOrderBy->a[i].sortFlags & KEYINFO_ORDER_BIGNULL ) break; if( pOrderBy->a[i].fg.sortFlags & KEYINFO_ORDER_BIGNULL ) break;
/* First case - a direct column references without a COLLATE operator */ /* First case - a direct column references without a COLLATE operator */
if( pExpr->op==TK_COLUMN && pExpr->iTable==pSrc->iCursor ){ if( pExpr->op==TK_COLUMN && pExpr->iTable==pSrc->iCursor ){
@@ -1318,7 +1318,7 @@ static sqlite3_index_info *allocateIndexInfo(
|| (pExpr->op==TK_COLLATE && pExpr->pLeft->op==TK_COLUMN || (pExpr->op==TK_COLLATE && pExpr->pLeft->op==TK_COLUMN
&& pExpr->iColumn==pExpr->pLeft->iColumn) ); && pExpr->iColumn==pExpr->pLeft->iColumn) );
pIdxOrderBy[j].iColumn = pExpr->iColumn; pIdxOrderBy[j].iColumn = pExpr->iColumn;
pIdxOrderBy[j].desc = pOrderBy->a[i].sortFlags & KEYINFO_ORDER_DESC; pIdxOrderBy[j].desc = pOrderBy->a[i].fg.sortFlags & KEYINFO_ORDER_DESC;
j++; j++;
} }
pIdxInfo->nOrderBy = j; pIdxInfo->nOrderBy = j;
@@ -4455,16 +4455,18 @@ static i8 wherePathSatisfiesOrderBy(
/* Make sure the sort order is compatible in an ORDER BY clause. /* Make sure the sort order is compatible in an ORDER BY clause.
** Sort order is irrelevant for a GROUP BY clause. */ ** Sort order is irrelevant for a GROUP BY clause. */
if( revSet ){ if( revSet ){
if( (rev ^ revIdx)!=(pOrderBy->a[i].sortFlags&KEYINFO_ORDER_DESC) ){ if( (rev ^ revIdx)
!= (pOrderBy->a[i].fg.sortFlags&KEYINFO_ORDER_DESC)
){
isMatch = 0; isMatch = 0;
} }
}else{ }else{
rev = revIdx ^ (pOrderBy->a[i].sortFlags & KEYINFO_ORDER_DESC); rev = revIdx ^ (pOrderBy->a[i].fg.sortFlags & KEYINFO_ORDER_DESC);
if( rev ) *pRevMask |= MASKBIT(iLoop); if( rev ) *pRevMask |= MASKBIT(iLoop);
revSet = 1; revSet = 1;
} }
} }
if( isMatch && (pOrderBy->a[i].sortFlags & KEYINFO_ORDER_BIGNULL) ){ if( isMatch && (pOrderBy->a[i].fg.sortFlags & KEYINFO_ORDER_BIGNULL) ){
if( j==pLoop->u.btree.nEq ){ if( j==pLoop->u.btree.nEq ){
pLoop->wsFlags |= WHERE_BIGNULL_SORT; pLoop->wsFlags |= WHERE_BIGNULL_SORT;
}else{ }else{

View File

@@ -1616,7 +1616,7 @@ void sqlite3WhereAddLimit(WhereClause *pWC, Select *p){
Expr *pExpr = pOrderBy->a[ii].pExpr; Expr *pExpr = pOrderBy->a[ii].pExpr;
if( pExpr->op!=TK_COLUMN ) return; if( pExpr->op!=TK_COLUMN ) return;
if( pExpr->iTable!=iCsr ) return; if( pExpr->iTable!=iCsr ) return;
if( pOrderBy->a[ii].sortFlags & KEYINFO_ORDER_BIGNULL ) return; if( pOrderBy->a[ii].fg.sortFlags & KEYINFO_ORDER_BIGNULL ) return;
} }
} }

View File

@@ -916,7 +916,7 @@ static ExprList *exprListAppendList(
} }
} }
pList = sqlite3ExprListAppend(pParse, pList, pDup); pList = sqlite3ExprListAppend(pParse, pList, pDup);
if( pList ) pList->a[nInit+i].sortFlags = pAppend->a[i].sortFlags; if( pList ) pList->a[nInit+i].fg.sortFlags = pAppend->a[i].fg.sortFlags;
} }
} }
return pList; return pList;
@@ -2117,7 +2117,7 @@ static void windowCodeRangeTest(
assert( op==OP_Ge || op==OP_Gt || op==OP_Le ); assert( op==OP_Ge || op==OP_Gt || op==OP_Le );
assert( pOrderBy && pOrderBy->nExpr==1 ); assert( pOrderBy && pOrderBy->nExpr==1 );
if( pOrderBy->a[0].sortFlags & KEYINFO_ORDER_DESC ){ if( pOrderBy->a[0].fg.sortFlags & KEYINFO_ORDER_DESC ){
switch( op ){ switch( op ){
case OP_Ge: op = OP_Le; break; case OP_Ge: op = OP_Le; break;
case OP_Gt: op = OP_Lt; break; case OP_Gt: op = OP_Lt; break;
@@ -2150,7 +2150,7 @@ static void windowCodeRangeTest(
** Additionally, if either reg1 or reg2 are NULL but the jump to lbl is ** Additionally, if either reg1 or reg2 are NULL but the jump to lbl is
** not taken, control jumps over the comparison operator coded below this ** not taken, control jumps over the comparison operator coded below this
** block. */ ** block. */
if( pOrderBy->a[0].sortFlags & KEYINFO_ORDER_BIGNULL ){ if( pOrderBy->a[0].fg.sortFlags & KEYINFO_ORDER_BIGNULL ){
/* This block runs if reg1 contains a NULL. */ /* This block runs if reg1 contains a NULL. */
int addr = sqlite3VdbeAddOp1(v, OP_NotNull, reg1); VdbeCoverage(v); int addr = sqlite3VdbeAddOp1(v, OP_NotNull, reg1); VdbeCoverage(v);
switch( op ){ switch( op ){

4594
test/joinC.test Normal file

File diff suppressed because it is too large Load Diff