]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Experimental syntax enhancement for an "INDEXED" keyword following a FROM-clause
authordrh <drh@noemail.net>
Mon, 14 May 2018 17:12:42 +0000 (17:12 +0000)
committerdrh <drh@noemail.net>
Mon, 14 May 2018 17:12:42 +0000 (17:12 +0000)
subquery that indicates that an automatic index on that subquery is suggested.

FossilOrigin-Name: 32b3d1105074529548627dcd63e25fbec6ba5e453b00e03f31ab2e324cf7f38d

manifest
manifest.uuid
src/build.c
src/parse.y
src/sqliteInt.h
src/where.c

index 8b7444c23f0c75e5fc73f5e938b73315fe5f65e7..0b189b188efe45abb9f930cc88ace0726b35bc1c 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Convert\sthe\sschema\screation\slogic\sin\sthe\srtree\sextension\sto\suse\sthe\nnew\ssqlite3_str\sinterface.
-D 2018-05-14T15:26:05.642
+C Experimental\ssyntax\senhancement\sfor\san\s"INDEXED"\skeyword\sfollowing\sa\sFROM-clause\nsubquery\sthat\sindicates\sthat\san\sautomatic\sindex\son\sthat\ssubquery\sis\ssuggested.
+D 2018-05-14T17:12:42.068
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F Makefile.in bfc40f350586923e0419d2ea4b559c37ec10ee4b6e210e08c14401f8e340f0da
@@ -437,7 +437,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6
 F src/btree.c 8270813c8f0ca91b2802e88ded3755d04ee962a923d431c13bcb6cf3e0c18f63
 F src/btree.h 448f15b98ea85dcf7e4eb76f731cadb89636c676ad25dfaac6de77cd66556598
 F src/btreeInt.h 620ab4c7235f43572cf3ac2ac8723cbdf68073be4d29da24897c7b77dda5fd96
-F src/build.c 50ff3e0fa07646b4d797aae0f773efcdb7602f6a5e2f5da27856503f35200889
+F src/build.c d71b7da8f32ff3ce25f02a611bc65021907b1c957f414fe5f65a6c0758a5c405
 F src/callback.c fe677cb5f5abb02f7a772a62a98c2f516426081df68856e8f2d5f950929b966a
 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
 F src/ctime.c 849d4cebe008cfc6e4799b034a172b4eaf8856b100739632a852732ba66eee48
@@ -482,7 +482,7 @@ F src/os_win.c ac29c25cde4cfb4adacc59cdec4aa45698ca0e29164ea127859585ccd9faa354
 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
 F src/pager.c 1bb6a57fa0465296a4d6109a1a64610a0e7adde1f3acf3ef539a9d972908ce8f
 F src/pager.h c571b064df842ec8f2e90855dead9acf4cbe0d1b2c05afe0ef0d0145f7fd0388
-F src/parse.y 07784439d25f0bc64a656eece4caecc549b147d213f513cdbeb8430345ec2911
+F src/parse.y da3ecddde4261fa6adae7463d757a70f45b99f546ceb92c44e7b9f1b0a60ee23
 F src/pcache.c 135ef0bc6fb2e3b7178d49ab5c9176254c8a691832c1bceb1156b2fbdd0869bd
 F src/pcache.h 072f94d29281cffd99e46c1539849f248c4b56ae7684c1f36626797fee375170
 F src/pcache1.c 716975564c15eb6679e97f734cec1bfd6c16ac3d4010f05f1f8e509fc7d19880
@@ -498,7 +498,7 @@ F src/shell.c.in 53affa90711f280342f7238f9c9aa9dcaed321ec6218a18043cf92154ef8a70
 F src/sqlite.h.in ef7e6fae65cb40ba004abf090ea491751295c11e64b1446322813d3b473b9400
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
 F src/sqlite3ext.h 9887b27e69c01e79c2cbe74ef73bf01af5b5703d6a7f0a4371e386d7249cb1c7
-F src/sqliteInt.h 5abdade4744cf3bd567afb65bb144bb3c61f6132f86813b995a5ca79c7b584e8
+F src/sqliteInt.h beb78cf78e70a19476952e610f0727d4400b8b7059ed54106aa0d84b30dd3982
 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b
 F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e
 F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34
@@ -577,7 +577,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
 F src/wal.c aa9cffc7a2bad6b826a86c8562dd4978398720ed41cb8ee7aa9d054eb8b456a0
 F src/wal.h 8de5d2d3de0956d6f6cb48c83a4012d5f227b8fe940f3a349a4b7e85ebcb492a
 F src/walker.c da987a20d40145c0a03c07d8fefcb2ed363becc7680d0500d9c79915591f5b1f
-F src/where.c d89b1aa56a75a572cd60ad27ec0fe5958d5f98b0f4391a89c72811287be7c439
+F src/where.c ebc86f315ef2fdb4a05780f95ce981b965ecc0127ef23851c58d41bb23ccdba9
 F src/whereInt.h cbae2bcd37cfebdb7812a8b188cdb19634ced2b9346470d1c270556b0c33ea53
 F src/wherecode.c 728c7f70731430ccdac807a79969873e1af6968bf1c4745dff3f9dd35f636cc8
 F src/whereexpr.c e90b2e76dcabc81edff56633bf281bc01d93b71e0c81482dc06925ce39f5844a
@@ -1728,7 +1728,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 389dc0a901b0ce54c3c773d63e5b288f6dd28b96dffc4b77861db89b275b57d6
-R 6e29d58591c6ddb3e781f9c6f4a089d0
+P fd8b8c4196d3f0f6cb129f43ebf473ada86eefdf16181fa70ceee21e1232b5e1
+R 611d7b41a8fe4b803c387fc5e28a4594
+T *branch * exp-indexed-clause
+T *sym-exp-indexed-clause *
+T -sym-trunk *
 U drh
-Z 737947d21bd079c8c254ee52cdbee001
+Z 29c7f5f19fc1378727bec6e3ea350831
index 518c2585dea8b72404dd7d1a02218788f5d0d7ba..f5bf0c5e83ce3b06ee33e95799ab087e3dcde37e 100644 (file)
@@ -1 +1 @@
-fd8b8c4196d3f0f6cb129f43ebf473ada86eefdf16181fa70ceee21e1232b5e1
\ No newline at end of file
+32b3d1105074529548627dcd63e25fbec6ba5e453b00e03f31ab2e324cf7f38d
\ No newline at end of file
index d0cb0062e155fdd35ce3c6691771ff28353825bb..8e2c7ec680d269f335c51ce7e215e002fa6eafda 100644 (file)
@@ -3927,10 +3927,13 @@ void sqlite3SrcListIndexedBy(Parse *pParse, SrcList *p, Token *pIndexedBy){
     assert( pItem->fg.notIndexed==0 );
     assert( pItem->fg.isIndexedBy==0 );
     assert( pItem->fg.isTabFunc==0 );
-    if( pIndexedBy->n==1 && !pIndexedBy->z ){
-      /* A "NOT INDEXED" clause was supplied. See parse.y 
-      ** construct "indexed_opt" for details. */
-      pItem->fg.notIndexed = 1;
+    if( pIndexedBy->n>=1 && !pIndexedBy->z ){
+      if( pIndexedBy->n==1 ){
+        pItem->fg.notIndexed = 1;
+      }else{
+        assert( pIndexedBy->n==2 );
+        pItem->fg.useAutoIdx = 1;
+      }
     }else{
       pItem->u1.zIndexedBy = sqlite3NameFromToken(pParse->db, pIndexedBy);
       pItem->fg.isIndexedBy = 1;
index aca3bfb1c6048138191bda9db2408b8acdc4f28f..549f6e8e9f54a60ad7d2eac3f712667c8b91adc8 100644 (file)
@@ -652,11 +652,12 @@ seltablist(A) ::= stl_prefix(A) nm(Y) dbnm(D) LP exprlist(E) RP as(Z)
 }
 %ifndef SQLITE_OMIT_SUBQUERY
   seltablist(A) ::= stl_prefix(A) LP select(S) RP
-                    as(Z) on_opt(N) using_opt(U). {
+                    as(Z) indexed_opt(I) on_opt(N) using_opt(U). {
     A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,S,N,U);
+    sqlite3SrcListIndexedBy(pParse, A, &I);
   }
   seltablist(A) ::= stl_prefix(A) LP seltablist(F) RP
-                    as(Z) on_opt(N) using_opt(U). {
+                    as(Z) indexed_opt(I) on_opt(N) using_opt(U). {
     if( A==0 && Z.n==0 && N==0 && U==0 ){
       A = F;
     }else if( F->nSrc==1 ){
@@ -677,6 +678,7 @@ seltablist(A) ::= stl_prefix(A) nm(Y) dbnm(D) LP exprlist(E) RP as(Z)
       pSubquery = sqlite3SelectNew(pParse,0,F,0,0,0,0,SF_NestedFrom,0);
       A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,pSubquery,N,U);
     }
+    sqlite3SrcListIndexedBy(pParse, A, &I);
   }
 %endif  SQLITE_OMIT_SUBQUERY
 
@@ -751,6 +753,7 @@ on_opt(N) ::= .     [OR]   {N = 0;}
 indexed_opt(A) ::= .                 {A.z=0; A.n=0;}
 indexed_opt(A) ::= INDEXED BY nm(X). {A = X;}
 indexed_opt(A) ::= NOT INDEXED.      {A.z=0; A.n=1;}
+indexed_opt(A) ::= INDEXED.          {A.z=0; A.n=2;}
 
 %type using_opt {IdList*}
 %destructor using_opt {sqlite3IdListDelete(pParse->db, $$);}
index 7b19e0a98fc878e00e5cca2256f83d28d1ca849b..8db9e14d813f5de76d7f74624f5d8913f725b613 100644 (file)
@@ -2608,6 +2608,7 @@ struct SrcList {
       unsigned isCorrelated :1;  /* True if sub-query is correlated */
       unsigned viaCoroutine :1;  /* Implemented as a co-routine */
       unsigned isRecursive :1;   /* True for recursive reference in WITH */
+      unsigned useAutoIdx  :1;   /* Use an automatic index if possible */
     } fg;
     int iCursor;      /* The VDBE cursor number used to access this table */
     Expr *pOn;        /* The ON clause of a join */
index 0965f4170f8cfe2fc3ec44ab3d7191b09b29f9b2..cf16fe08c786d7e3b54c7528751352389d77eb18 100644 (file)
@@ -2872,7 +2872,7 @@ static int whereLoopAddBtree(
           pNew->rSetup += 24;
         }
         ApplyCostMultiplier(pNew->rSetup, pTab->costMult);
-        if( pNew->rSetup<0 ) pNew->rSetup = 0;
+        if( pNew->rSetup<0 || pSrc->fg.useAutoIdx ) pNew->rSetup = 0;
         /* TUNING: Each index lookup yields 20 rows in the table.  This
         ** is more than the usual guess of 10 rows, since we have no way
         ** of knowing how selective the index will ultimately be.  It would