]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
An alternative method of encoding the wildcard in "SELECT *". This is an select-wildcard
authordrh <drh@noemail.net>
Thu, 17 Mar 2016 18:41:38 +0000 (18:41 +0000)
committerdrh <drh@noemail.net>
Thu, 17 Mar 2016 18:41:38 +0000 (18:41 +0000)
experiment.

FossilOrigin-Name: 41335d8800eaf36c8d3e96ac855c9aef11d49460

manifest
manifest.uuid
src/expr.c
src/parse.y
src/select.c
src/sqliteInt.h

index 3d02d28e9b05fca2cb5ad8835c05c82e67f4dd10..1b7e837efcb36f418f362b1636dd63a056fad2da 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C The\sprepared\sstatements\sfor\ssome\spragmas\scan\snow\sbe\sreused\swithout\sinvoking\nan\sautomatic\sreprepare.
-D 2016-03-16T21:29:54.761
+C An\salternative\smethod\sof\sencoding\sthe\swildcard\sin\s"SELECT\s*".\s\sThis\sis\san\nexperiment.
+D 2016-03-17T18:41:38.733
 F Makefile.in f53429fb2f313c099283659d0df6f20f932c861f
 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
 F Makefile.msc df0bf9ff7f8b3f4dd9fb4cc43f92fe58f6ec5c66
@@ -304,7 +304,7 @@ F src/ctime.c 60e135af364d777a9ab41c97e5e89cd224da6198
 F src/date.c 0b73e681c11fca867fec554750c07fe0d4e417c1
 F src/dbstat.c c845548d4346e606e2f2b7d2e714ace2b8a7dd1b
 F src/delete.c 48802aa3ee6339f576d074336d3ae1b5f40e240f
-F src/expr.c c329d581e5d631153456369684d7d4bcd94c907d
+F src/expr.c ee11e39874c8ea8f56eb86eb561b7b592c51605b
 F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb
 F src/fkey.c 5cb42d9a59e2a590776fd3fc8ff6f61d40df3c6e
 F src/func.c 552d300265aed09eea21f68ac742a440550c0062
@@ -339,7 +339,7 @@ F src/os_win.c cbf8c442a0d818d05bcf40b093cb3ebad435b9be
 F src/os_win.h eb7a47aa17b26b77eb97e4823f20a00b8bda12ca
 F src/pager.c 38718a019ca762ba4f6795425d5a54db70d1790d
 F src/pager.h e1d38a2f14849e219df0f91f8323504d134c8a56
-F src/parse.y 5ea8c81c5c41b27887f41b4a7e1c58470d7d3821
+F src/parse.y fc4d11e4f57edc617d1eba062c2dd6604d63aed2
 F src/pcache.c 647bb53a86b7bbcf55ad88089b3ea5a9170b90df
 F src/pcache.h 4d0ccaad264d360981ec5e6a2b596d6e85242545
 F src/pcache1.c 72f644dc9e1468c72922eff5904048427b817051
@@ -350,12 +350,12 @@ F src/printf.c 63e6fb12bbe702dd664dc3703776c090383a5a26
 F src/random.c ba2679f80ec82c4190062d756f22d0c358180696
 F src/resolve.c b8f7174e5f8c33c44ded3a25a973d0bb89228c20
 F src/rowset.c 9fe4b3ad7cc00944386bb600233d8f523de07a6e
-F src/select.c 6dd2097bb158efe3b8d68683dcc3b4a49e907a34
+F src/select.c 41467e0c63d7282831c3ad829e01630da9576320
 F src/shell.c 5e0ab1e708dc294330ccd8230536e1801f60822e
 F src/sqlite.h.in 0235586b3fb639e85998d495c90f007657fd82af
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
 F src/sqlite3ext.h dfbe62ffd95b99afe2140d8c35b180d11924072d
-F src/sqliteInt.h 84c673f27b77dfbd367cb3ed1de8b6f3b73102dc
+F src/sqliteInt.h 8435a8b21e2d7c89a67a25b7a203afc27c5d42d7
 F src/sqliteLimit.h 7b28cf72cbd52f178bfc97ea266445e351f2cd24
 F src/status.c 70912d7be68e9e2dbc4010c93d344af61d4c59ba
 F src/table.c 5226df15ab9179b9ed558d89575ea0ce37b03fc9
@@ -1456,8 +1456,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 10a3e2a01db9f80452a2a3369fd25b6fd9798274 db1ce7e13e656fcd2766f1b1f225cbfefe8f73ad
-R 2716c51dfa2bfe8ed5e18127e51ae3c8
-T +closed db1ce7e13e656fcd2766f1b1f225cbfefe8f73ad
+P 97b0e88cc7c3d677217d0bfab4cb4a34a4abb238
+R 7cc43be281eed43b468d8c4ff2e01351
+T *branch * select-wildcard
+T *sym-select-wildcard *
+T -sym-trunk *
 U drh
-Z e3b23194e47816995dbce6c752704ef0
+Z 21f570cb00d593253e312795bb662288
index 06db10b8a2944a9814c4122ce5dbf9e04a31bdd1..012c00f5e4bb517eeb7dfacddf6221aade43693b 100644 (file)
@@ -1 +1 @@
-97b0e88cc7c3d677217d0bfab4cb4a34a4abb238
\ No newline at end of file
+41335d8800eaf36c8d3e96ac855c9aef11d49460
\ No newline at end of file
index 3672d02df1022d6f544c912f9e0c285d85091e6e..2622f27441f58ba8a901b1ba22af787ef769c328 100644 (file)
@@ -1283,7 +1283,8 @@ u32 sqlite3ExprListFlags(const ExprList *pList){
   if( pList ){
     for(i=0; i<pList->nExpr; i++){
        Expr *pExpr = pList->a[i].pExpr;
-       if( ALWAYS(pExpr) ) m |= pExpr->flags;
+       assert( pExpr!=0 );
+       m |= pExpr->flags;
     }
   }
   return m;
index 20492edb80ecf60d94a3df71444533767eaf414d..9479c27409a59bf0331f0058acff8d0a49df9733 100644 (file)
@@ -550,13 +550,13 @@ selcollist(A) ::= sclp(A) expr(X) as(Y).     {
    sqlite3ExprListSetSpan(pParse,A,&X);
 }
 selcollist(A) ::= sclp(A) STAR. {
-  Expr *p = sqlite3Expr(pParse->db, TK_ASTERISK, 0);
-  A = sqlite3ExprListAppend(pParse, A, p);
+  A = sqlite3WildcardResultSet(pParse,A);
 }
 selcollist(A) ::= sclp(A) nm(X) DOT STAR(Y). {
   Expr *pRight = sqlite3PExpr(pParse, TK_ASTERISK, 0, 0, &Y);
   Expr *pLeft = sqlite3PExpr(pParse, TK_ID, 0, 0, &X);
   Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight, 0);
+  if( pDot ) ExprSetProperty(pDot, EP_Wildcard);
   A = sqlite3ExprListAppend(pParse,A, pDot);
 }
 
index a62581efc1d0bf1d3b914d368f46256471fc60e5..da6d7c7a827d1473cd2d40c552e92ff4f793f127 100644 (file)
@@ -92,6 +92,16 @@ void sqlite3SelectDestInit(SelectDest *pDest, int eDest, int iParm){
   pDest->nSdst = 0;
 }
 
+/*
+** Return an expression list that represents the wildcard result set
+** of a SELECT.
+*/
+ExprList *sqlite3WildcardResultSet(Parse *pParse, ExprList *pPrior){
+  Expr *p = sqlite3Expr(pParse->db, TK_ASTERISK, 0);
+  if( p ) ExprSetProperty(p, EP_Wildcard);
+  return sqlite3ExprListAppend(pParse, pPrior, p);
+}
+
 
 /*
 ** Allocate a new Select structure and return a pointer to that
@@ -117,9 +127,7 @@ Select *sqlite3SelectNew(
     assert( db->mallocFailed );
     pNew = &standin;
   }
-  if( pEList==0 ){
-    pEList = sqlite3ExprListAppend(pParse, 0, sqlite3Expr(db,TK_ASTERISK,0));
-  }
+  if( pEList==0 ) pEList = sqlite3WildcardResultSet(pParse,0);
   pNew->pEList = pEList;
   pNew->op = TK_SELECT;
   pNew->selFlags = selFlags;
@@ -3952,7 +3960,7 @@ static int convertCompoundSelectToSubquery(Walker *pWalker, Select *p){
   if( pNewSrc==0 ) return WRC_Abort;
   *pNew = *p;
   p->pSrc = pNewSrc;
-  p->pEList = sqlite3ExprListAppend(pParse, 0, sqlite3Expr(db, TK_ASTERISK, 0));
+  p->pEList = sqlite3WildcardResultSet(pParse,0);
   p->op = TK_SELECT;
   p->pWhere = 0;
   pNew->pGroupBy = 0;
@@ -4310,18 +4318,8 @@ static int selectExpander(Walker *pWalker, Select *p){
   ** list.  The following code just has to locate the TK_ASTERISK
   ** expressions and expand each one to the list of all columns in
   ** all tables.
-  **
-  ** The first loop just checks to see if there are any "*" operators
-  ** that need expanding.
   */
-  for(k=0; k<pEList->nExpr; k++){
-    pE = pEList->a[k].pExpr;
-    if( pE->op==TK_ASTERISK ) break;
-    assert( pE->op!=TK_DOT || pE->pRight!=0 );
-    assert( pE->op!=TK_DOT || (pE->pLeft!=0 && pE->pLeft->op==TK_ID) );
-    if( pE->op==TK_DOT && pE->pRight->op==TK_ASTERISK ) break;
-  }
-  if( k<pEList->nExpr ){
+  if( sqlite3ExprListFlags(pEList) & EP_Wildcard ){
     /*
     ** If we get here it means the result set contains one or more "*"
     ** operators that need to be expanded.  Loop through each expression
@@ -4337,9 +4335,7 @@ static int selectExpander(Walker *pWalker, Select *p){
       pE = a[k].pExpr;
       pRight = pE->pRight;
       assert( pE->op!=TK_DOT || pRight!=0 );
-      if( pE->op!=TK_ASTERISK
-       && (pE->op!=TK_DOT || pRight->op!=TK_ASTERISK)
-      ){
+      if( !ExprHasProperty(pE, EP_Wildcard) ){
         /* This particular expression does not need to be expanded.
         */
         pNew = sqlite3ExprListAppend(pParse, pNew, a[k].pExpr);
index f2f485778a0ba6b46bff79fe3fd31507514d9882..a67486129f1a8d260e72f02f72e1e02ae0a5a930 100644 (file)
@@ -2257,6 +2257,7 @@ struct Expr {
 #define EP_CanBeNull 0x100000 /* Can be null despite NOT NULL constraint */
 #define EP_Subquery  0x200000 /* Tree contains a TK_SELECT operator */
 #define EP_Alias     0x400000 /* Is an alias for a result set column */
+#define EP_Wildcard  0x800000 /* The "*" or "TABLE.*" of a SELECT result */
 
 /*
 ** Combinations of two or more EP_* flags
@@ -3527,6 +3528,7 @@ Index *sqlite3AllocateIndexObject(sqlite3*,i16,int,char**);
 Index *sqlite3CreateIndex(Parse*,Token*,Token*,SrcList*,ExprList*,int,Token*,
                           Expr*, int, int);
 void sqlite3DropIndex(Parse*, SrcList*, int);
+ExprList *sqlite3WildcardResultSet(Parse*,ExprList*);
 int sqlite3Select(Parse*, Select*, SelectDest*);
 Select *sqlite3SelectNew(Parse*,ExprList*,SrcList*,Expr*,ExprList*,
                          Expr*,ExprList*,u32,Expr*,Expr*);