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:
35
manifest
35
manifest
@@ -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.
|
||||||
|
@@ -1 +1 @@
|
|||||||
67510354e69bab98bd8095f5bedd34aae619fe2c7885975d7a6a00b7df5ece4e
|
006b2d9c52201c9e836b649018519acfb47f793f70b968722440f00084e9d846
|
@@ -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)
|
||||||
){
|
){
|
||||||
|
10
src/build.c
10
src/build.c
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
30
src/expr.c
30
src/expr.c
@@ -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;
|
||||||
|
@@ -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;
|
||||||
|
98
src/select.c
98
src/select.c
@@ -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;
|
||||||
|
@@ -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 */
|
||||||
|
@@ -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);
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
12
src/where.c
12
src/where.c
@@ -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{
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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
4594
test/joinC.test
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user