| | @@ -452,11 +452,11 @@ |
| 452 | 452 | ** [sqlite3_libversion_number()], [sqlite3_sourceid()], |
| 453 | 453 | ** [sqlite_version()] and [sqlite_source_id()]. |
| 454 | 454 | */ |
| 455 | 455 | #define SQLITE_VERSION "3.39.0" |
| 456 | 456 | #define SQLITE_VERSION_NUMBER 3039000 |
| 457 | | -#define SQLITE_SOURCE_ID "2022-04-26 19:16:11 b1bec72043f798f4d4d30e6b60a45ed4dc521115c8a9f97bb8228e3f089deefb" |
| 457 | +#define SQLITE_SOURCE_ID "2022-05-10 00:24:01 c6c3115f3a008cf9b0d7c5c812f17e38c8a75a904032c5f05f0bea03a7340527" |
| 458 | 458 | |
| 459 | 459 | /* |
| 460 | 460 | ** CAPI3REF: Run-Time Library Version Numbers |
| 461 | 461 | ** KEYWORDS: sqlite3_version sqlite3_sourceid |
| 462 | 462 | ** |
| | @@ -17054,10 +17054,11 @@ |
| 17054 | 17054 | #define SQLITE_BloomFilter 0x00080000 /* Use a Bloom filter on searches */ |
| 17055 | 17055 | #define SQLITE_BloomPulldown 0x00100000 /* Run Bloom filters early */ |
| 17056 | 17056 | #define SQLITE_BalancedMerge 0x00200000 /* Balance multi-way merges */ |
| 17057 | 17057 | #define SQLITE_ReleaseReg 0x00400000 /* Use OP_ReleaseReg for testing */ |
| 17058 | 17058 | #define SQLITE_FlttnUnionAll 0x00800000 /* Disable the UNION ALL flattener */ |
| 17059 | + /* TH3 expects this value ^^^^^^^^^^ See flatten04.test */ |
| 17059 | 17060 | #define SQLITE_AllOpts 0xffffffff /* All optimizations */ |
| 17060 | 17061 | |
| 17061 | 17062 | /* |
| 17062 | 17063 | ** Macros for testing whether or not optimizations are enabled or disabled. |
| 17063 | 17064 | */ |
| | @@ -17399,10 +17400,11 @@ |
| 17399 | 17400 | #define COLFLAG_VIRTUAL 0x0020 /* GENERATED ALWAYS AS ... VIRTUAL */ |
| 17400 | 17401 | #define COLFLAG_STORED 0x0040 /* GENERATED ALWAYS AS ... STORED */ |
| 17401 | 17402 | #define COLFLAG_NOTAVAIL 0x0080 /* STORED column not yet calculated */ |
| 17402 | 17403 | #define COLFLAG_BUSY 0x0100 /* Blocks recursion on GENERATED columns */ |
| 17403 | 17404 | #define COLFLAG_HASCOLL 0x0200 /* Has collating sequence name in zCnName */ |
| 17405 | +#define COLFLAG_NOEXPAND 0x0400 /* Omit this column when expanding "*" */ |
| 17404 | 17406 | #define COLFLAG_GENERATED 0x0060 /* Combo: _STORED, _VIRTUAL */ |
| 17405 | 17407 | #define COLFLAG_NOINSERT 0x0062 /* Combo: _HIDDEN, _STORED, _VIRTUAL */ |
| 17406 | 17408 | |
| 17407 | 17409 | /* |
| 17408 | 17410 | ** A "Collating Sequence" is defined by an instance of the following |
| | @@ -18272,17 +18274,22 @@ |
| 18272 | 18274 | int nExpr; /* Number of expressions on the list */ |
| 18273 | 18275 | int nAlloc; /* Number of a[] slots allocated */ |
| 18274 | 18276 | struct ExprList_item { /* For each expression in the list */ |
| 18275 | 18277 | Expr *pExpr; /* The parse tree for this expression */ |
| 18276 | 18278 | char *zEName; /* Token associated with this expression */ |
| 18277 | | - u8 sortFlags; /* Mask of KEYINFO_ORDER_* flags */ |
| 18278 | | - unsigned eEName :2; /* Meaning of zEName */ |
| 18279 | | - unsigned done :1; /* A flag to indicate when processing is finished */ |
| 18280 | | - unsigned reusable :1; /* Constant expression is reusable */ |
| 18281 | | - unsigned bSorterRef :1; /* Defer evaluation until after sorting */ |
| 18282 | | - unsigned bNulls: 1; /* True if explicit "NULLS FIRST/LAST" */ |
| 18283 | | - unsigned bUsed: 1; /* This column used in a SF_NestedFrom subquery */ |
| 18279 | + struct { |
| 18280 | + u8 sortFlags; /* Mask of KEYINFO_ORDER_* flags */ |
| 18281 | + unsigned eEName :2; /* Meaning of zEName */ |
| 18282 | + unsigned done :1; /* Indicates when processing is finished */ |
| 18283 | + unsigned reusable :1; /* Constant expression is reusable */ |
| 18284 | + unsigned bSorterRef :1; /* Defer evaluation until after sorting */ |
| 18285 | + unsigned bNulls :1; /* True if explicit "NULLS FIRST/LAST" */ |
| 18286 | + unsigned bUsed :1; /* This column used in a SF_NestedFrom subquery */ |
| 18287 | + unsigned bUsingTerm:1; /* Term from the USING clause of a NestedFrom */ |
| 18288 | + unsigned bNoExpand: 1; /* Term is an auxiliary in NestedFrom and should |
| 18289 | + ** not be expanded by "*" in parent queries */ |
| 18290 | + } fg; |
| 18284 | 18291 | union { |
| 18285 | 18292 | struct { /* Used by any ExprList other than Parse.pConsExpr */ |
| 18286 | 18293 | u16 iOrderByCol; /* For ORDER BY, column number in result set */ |
| 18287 | 18294 | u16 iAlias; /* Index into Parse.aAlias[] for zName */ |
| 18288 | 18295 | } x; |
| | @@ -19732,10 +19739,11 @@ |
| 19732 | 19739 | SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView*, const Expr*, u8); |
| 19733 | 19740 | SQLITE_PRIVATE void sqlite3TreeViewBareExprList(TreeView*, const ExprList*, const char*); |
| 19734 | 19741 | SQLITE_PRIVATE void sqlite3TreeViewExprList(TreeView*, const ExprList*, u8, const char*); |
| 19735 | 19742 | SQLITE_PRIVATE void sqlite3TreeViewBareIdList(TreeView*, const IdList*, const char*); |
| 19736 | 19743 | SQLITE_PRIVATE void sqlite3TreeViewIdList(TreeView*, const IdList*, u8, const char*); |
| 19744 | +SQLITE_PRIVATE void sqlite3TreeViewColumnList(TreeView*, const Column*, int, u8); |
| 19737 | 19745 | SQLITE_PRIVATE void sqlite3TreeViewSrcList(TreeView*, const SrcList*); |
| 19738 | 19746 | SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView*, const Select*, u8); |
| 19739 | 19747 | SQLITE_PRIVATE void sqlite3TreeViewWith(TreeView*, const With*, u8); |
| 19740 | 19748 | SQLITE_PRIVATE void sqlite3TreeViewUpsert(TreeView*, const Upsert*, u8); |
| 19741 | 19749 | SQLITE_PRIVATE void sqlite3TreeViewDelete(const With*, const SrcList*, const Expr*, |
| | @@ -20587,10 +20595,11 @@ |
| 20587 | 20595 | ** Allowed flags for the 3rd parameter to sqlite3FindInIndex(). |
| 20588 | 20596 | */ |
| 20589 | 20597 | #define IN_INDEX_NOOP_OK 0x0001 /* OK to return IN_INDEX_NOOP */ |
| 20590 | 20598 | #define IN_INDEX_MEMBERSHIP 0x0002 /* IN operator used for membership test */ |
| 20591 | 20599 | #define IN_INDEX_LOOP 0x0004 /* IN operator used as a loop */ |
| 20600 | +#define IN_INDEX_REUSE_CUR 0x0008 /* Reuse prior table cursor */ |
| 20592 | 20601 | SQLITE_PRIVATE int sqlite3FindInIndex(Parse *, Expr *, u32, int*, int*, int*); |
| 20593 | 20602 | |
| 20594 | 20603 | SQLITE_PRIVATE int sqlite3JournalOpen(sqlite3_vfs *, const char *, sqlite3_file *, int, int); |
| 20595 | 20604 | SQLITE_PRIVATE int sqlite3JournalSize(sqlite3_vfs *); |
| 20596 | 20605 | #if defined(SQLITE_ENABLE_ATOMIC_WRITE) \ |
| | @@ -31057,10 +31066,57 @@ |
| 31057 | 31066 | */ |
| 31058 | 31067 | static void sqlite3TreeViewItem(TreeView *p, const char *zLabel,u8 moreFollows){ |
| 31059 | 31068 | sqlite3TreeViewPush(&p, moreFollows); |
| 31060 | 31069 | sqlite3TreeViewLine(p, "%s", zLabel); |
| 31061 | 31070 | } |
| 31071 | + |
| 31072 | +/* |
| 31073 | +** Show a list of Column objects in tree format. |
| 31074 | +*/ |
| 31075 | +SQLITE_PRIVATE void sqlite3TreeViewColumnList( |
| 31076 | + TreeView *pView, |
| 31077 | + const Column *aCol, |
| 31078 | + int nCol, |
| 31079 | + u8 moreToFollow |
| 31080 | +){ |
| 31081 | + int i; |
| 31082 | + sqlite3TreeViewPush(&pView, moreToFollow); |
| 31083 | + sqlite3TreeViewLine(pView, "COLUMNS"); |
| 31084 | + for(i=0; i<nCol; i++){ |
| 31085 | + u16 flg = aCol[i].colFlags; |
| 31086 | + int moreToFollow = i<(nCol - 1); |
| 31087 | + sqlite3TreeViewPush(&pView, moreToFollow); |
| 31088 | + sqlite3TreeViewLine(pView, 0); |
| 31089 | + printf(" %s", aCol[i].zCnName); |
| 31090 | + switch( aCol[i].eCType ){ |
| 31091 | + case COLTYPE_ANY: printf(" ANY"); break; |
| 31092 | + case COLTYPE_BLOB: printf(" BLOB"); break; |
| 31093 | + case COLTYPE_INT: printf(" INT"); break; |
| 31094 | + case COLTYPE_INTEGER: printf(" INTEGER"); break; |
| 31095 | + case COLTYPE_REAL: printf(" REAL"); break; |
| 31096 | + case COLTYPE_TEXT: printf(" TEXT"); break; |
| 31097 | + case COLTYPE_CUSTOM: { |
| 31098 | + if( flg & COLFLAG_HASTYPE ){ |
| 31099 | + const char *z = aCol[i].zCnName; |
| 31100 | + z += strlen(z)+1; |
| 31101 | + printf(" X-%s", z); |
| 31102 | + break; |
| 31103 | + } |
| 31104 | + } |
| 31105 | + } |
| 31106 | + if( flg & COLFLAG_PRIMKEY ) printf(" PRIMARY KEY"); |
| 31107 | + if( flg & COLFLAG_HIDDEN ) printf(" HIDDEN"); |
| 31108 | +#ifdef COLFLAG_NOEXPAND |
| 31109 | + if( flg & COLFLAG_NOEXPAND ) printf(" NO-EXPAND"); |
| 31110 | +#endif |
| 31111 | + if( flg ) printf(" flags=%04x", flg); |
| 31112 | + printf("\n"); |
| 31113 | + fflush(stdout); |
| 31114 | + sqlite3TreeViewPop(&pView); |
| 31115 | + } |
| 31116 | + sqlite3TreeViewPop(&pView); |
| 31117 | +} |
| 31062 | 31118 | |
| 31063 | 31119 | /* |
| 31064 | 31120 | ** Generate a human-readable description of a WITH clause. |
| 31065 | 31121 | */ |
| 31066 | 31122 | SQLITE_PRIVATE void sqlite3TreeViewWith(TreeView *pView, const With *pWith, u8 moreToFollow){ |
| | @@ -31113,10 +31169,11 @@ |
| 31113 | 31169 | int i; |
| 31114 | 31170 | if( pSrc==0 ) return; |
| 31115 | 31171 | for(i=0; i<pSrc->nSrc; i++){ |
| 31116 | 31172 | const SrcItem *pItem = &pSrc->a[i]; |
| 31117 | 31173 | StrAccum x; |
| 31174 | + int n = 0; |
| 31118 | 31175 | char zLine[100]; |
| 31119 | 31176 | sqlite3StrAccumInit(&x, 0, zLine, sizeof(zLine), 0); |
| 31120 | 31177 | x.printfFlags |= SQLITE_PRINTF_INTERNAL; |
| 31121 | 31178 | sqlite3_str_appendf(&x, "{%d:*} %!S", pItem->iCursor, pItem); |
| 31122 | 31179 | if( pItem->pTab ){ |
| | @@ -31141,13 +31198,24 @@ |
| 31141 | 31198 | if( pItem->fg.isCte ){ |
| 31142 | 31199 | sqlite3_str_appendf(&x, " CteUse=0x%p", pItem->u2.pCteUse); |
| 31143 | 31200 | } |
| 31144 | 31201 | sqlite3StrAccumFinish(&x); |
| 31145 | 31202 | sqlite3TreeViewItem(pView, zLine, i<pSrc->nSrc-1); |
| 31203 | + n = 0; |
| 31204 | + if( pItem->pSelect ) n++; |
| 31205 | + if( pItem->fg.isTabFunc ) n++; |
| 31206 | + if( pItem->fg.isUsing ) n++; |
| 31207 | + if( pItem->fg.isUsing ){ |
| 31208 | + sqlite3TreeViewIdList(pView, pItem->u3.pUsing, (--n)>0, "USING"); |
| 31209 | + } |
| 31146 | 31210 | if( pItem->pSelect ){ |
| 31211 | + if( pItem->pTab ){ |
| 31212 | + Table *pTab = pItem->pTab; |
| 31213 | + sqlite3TreeViewColumnList(pView, pTab->aCol, pTab->nCol, 1); |
| 31214 | + } |
| 31147 | 31215 | assert( pItem->fg.isNestedFrom == IsNestedFrom(pItem->pSelect) ); |
| 31148 | | - sqlite3TreeViewSelect(pView, pItem->pSelect, 0); |
| 31216 | + sqlite3TreeViewSelect(pView, pItem->pSelect, (--n)>0); |
| 31149 | 31217 | } |
| 31150 | 31218 | if( pItem->fg.isTabFunc ){ |
| 31151 | 31219 | sqlite3TreeViewExprList(pView, pItem->u1.pFuncArg, 0, "func-args:"); |
| 31152 | 31220 | } |
| 31153 | 31221 | sqlite3TreeViewPop(&pView); |
| | @@ -31310,10 +31378,11 @@ |
| 31310 | 31378 | /* |
| 31311 | 31379 | ** Generate a human-readable explanation for a Window object |
| 31312 | 31380 | */ |
| 31313 | 31381 | SQLITE_PRIVATE void sqlite3TreeViewWindow(TreeView *pView, const Window *pWin, u8 more){ |
| 31314 | 31382 | int nElement = 0; |
| 31383 | + if( pWin==0 ) return; |
| 31315 | 31384 | if( pWin->pFilter ){ |
| 31316 | 31385 | sqlite3TreeViewItem(pView, "FILTER", 1); |
| 31317 | 31386 | sqlite3TreeViewExpr(pView, pWin->pFilter, 0); |
| 31318 | 31387 | sqlite3TreeViewPop(&pView); |
| 31319 | 31388 | } |
| | @@ -31374,10 +31443,11 @@ |
| 31374 | 31443 | #ifndef SQLITE_OMIT_WINDOWFUNC |
| 31375 | 31444 | /* |
| 31376 | 31445 | ** Generate a human-readable explanation for a Window Function object |
| 31377 | 31446 | */ |
| 31378 | 31447 | SQLITE_PRIVATE void sqlite3TreeViewWinFunc(TreeView *pView, const Window *pWin, u8 more){ |
| 31448 | + if( pWin==0 ) return; |
| 31379 | 31449 | sqlite3TreeViewPush(&pView, more); |
| 31380 | 31450 | sqlite3TreeViewLine(pView, "WINFUNC %s(%d)", |
| 31381 | 31451 | pWin->pWFunc->zName, pWin->pWFunc->nArg); |
| 31382 | 31452 | sqlite3TreeViewWindow(pView, pWin, 0); |
| 31383 | 31453 | sqlite3TreeViewPop(&pView); |
| | @@ -31625,11 +31695,21 @@ |
| 31625 | 31695 | sqlite3TreeViewLine(pView, "subquery-expr flags=0x%x", pExpr->flags); |
| 31626 | 31696 | sqlite3TreeViewSelect(pView, pExpr->x.pSelect, 0); |
| 31627 | 31697 | break; |
| 31628 | 31698 | } |
| 31629 | 31699 | case TK_IN: { |
| 31630 | | - sqlite3TreeViewLine(pView, "IN flags=0x%x", pExpr->flags); |
| 31700 | + sqlite3_str *pStr = sqlite3_str_new(0); |
| 31701 | + char *z; |
| 31702 | + sqlite3_str_appendf(pStr, "IN flags=0x%x", pExpr->flags); |
| 31703 | + if( pExpr->iTable ) sqlite3_str_appendf(pStr, " iTable=%d",pExpr->iTable); |
| 31704 | + if( ExprHasProperty(pExpr, EP_Subrtn) ){ |
| 31705 | + sqlite3_str_appendf(pStr, " subrtn(%d,%d)", |
| 31706 | + pExpr->y.sub.regReturn, pExpr->y.sub.iAddr); |
| 31707 | + } |
| 31708 | + z = sqlite3_str_finish(pStr); |
| 31709 | + sqlite3TreeViewLine(pView, z); |
| 31710 | + sqlite3_free(z); |
| 31631 | 31711 | sqlite3TreeViewExpr(pView, pExpr->pLeft, 1); |
| 31632 | 31712 | if( ExprUseXSelect(pExpr) ){ |
| 31633 | 31713 | sqlite3TreeViewSelect(pView, pExpr->x.pSelect, 0); |
| 31634 | 31714 | }else{ |
| 31635 | 31715 | sqlite3TreeViewExprList(pView, pExpr->x.pList, 0, 0); |
| | @@ -31776,17 +31856,19 @@ |
| 31776 | 31856 | if( j || zName ){ |
| 31777 | 31857 | sqlite3TreeViewPush(&pView, moreToFollow); |
| 31778 | 31858 | moreToFollow = 0; |
| 31779 | 31859 | sqlite3TreeViewLine(pView, 0); |
| 31780 | 31860 | if( zName ){ |
| 31781 | | - switch( pList->a[i].eEName ){ |
| 31861 | + switch( pList->a[i].fg.eEName ){ |
| 31782 | 31862 | default: |
| 31783 | 31863 | fprintf(stdout, "AS %s ", zName); |
| 31784 | 31864 | break; |
| 31785 | 31865 | case ENAME_TAB: |
| 31786 | 31866 | fprintf(stdout, "TABLE-ALIAS-NAME(\"%s\") ", zName); |
| 31787 | | - if( pList->a[i].bUsed==0 ) fprintf(stdout, "(unused) "); |
| 31867 | + if( pList->a[i].fg.bUsed ) fprintf(stdout, "(used) "); |
| 31868 | + if( pList->a[i].fg.bUsingTerm ) fprintf(stdout, "(USING-term) "); |
| 31869 | + if( pList->a[i].fg.bNoExpand ) fprintf(stdout, "(NoExpand) "); |
| 31788 | 31870 | break; |
| 31789 | 31871 | case ENAME_SPAN: |
| 31790 | 31872 | fprintf(stdout, "SPAN(\"%s\") ", zName); |
| 31791 | 31873 | break; |
| 31792 | 31874 | } |
| | @@ -89252,10 +89334,12 @@ |
| 89252 | 89334 | if( pOp->p2==0 ) break; |
| 89253 | 89335 | |
| 89254 | 89336 | /* Most jump operations do a goto to this spot in order to update |
| 89255 | 89337 | ** the pOp pointer. */ |
| 89256 | 89338 | jump_to_p2: |
| 89339 | + assert( pOp->p2>0 ); /* There are never any jumps to instruction 0 */ |
| 89340 | + assert( pOp->p2<p->nOp ); /* Jumps must be in range */ |
| 89257 | 89341 | pOp = &aOp[pOp->p2 - 1]; |
| 89258 | 89342 | break; |
| 89259 | 89343 | } |
| 89260 | 89344 | |
| 89261 | 89345 | /* Opcode: EndCoroutine P1 * * * * |
| | @@ -101463,11 +101547,11 @@ |
| 101463 | 101547 | const char *zTab, |
| 101464 | 101548 | const char *zDb |
| 101465 | 101549 | ){ |
| 101466 | 101550 | int n; |
| 101467 | 101551 | const char *zSpan; |
| 101468 | | - if( pItem->eEName!=ENAME_TAB ) return 0; |
| 101552 | + if( pItem->fg.eEName!=ENAME_TAB ) return 0; |
| 101469 | 101553 | zSpan = pItem->zEName; |
| 101470 | 101554 | for(n=0; ALWAYS(zSpan[n]) && zSpan[n]!='.'; n++){} |
| 101471 | 101555 | if( zDb && (sqlite3StrNICmp(zSpan, zDb, n)!=0 || zDb[n]!=0) ){ |
| 101472 | 101556 | return 0; |
| 101473 | 101557 | } |
| | @@ -101692,12 +101776,13 @@ |
| 101692 | 101776 | } |
| 101693 | 101777 | cnt++; |
| 101694 | 101778 | cntTab = 2; |
| 101695 | 101779 | pMatch = pItem; |
| 101696 | 101780 | pExpr->iColumn = j; |
| 101697 | | - pEList->a[j].bUsed = 1; |
| 101781 | + pEList->a[j].fg.bUsed = 1; |
| 101698 | 101782 | hit = 1; |
| 101783 | + if( pEList->a[j].fg.bUsingTerm ) break; |
| 101699 | 101784 | } |
| 101700 | 101785 | if( hit || zTab==0 ) continue; |
| 101701 | 101786 | } |
| 101702 | 101787 | assert( zDb==0 || zTab!=0 ); |
| 101703 | 101788 | if( zTab ){ |
| | @@ -101916,11 +102001,11 @@ |
| 101916 | 102001 | ){ |
| 101917 | 102002 | pEList = pNC->uNC.pEList; |
| 101918 | 102003 | assert( pEList!=0 ); |
| 101919 | 102004 | for(j=0; j<pEList->nExpr; j++){ |
| 101920 | 102005 | char *zAs = pEList->a[j].zEName; |
| 101921 | | - if( pEList->a[j].eEName==ENAME_NAME |
| 102006 | + if( pEList->a[j].fg.eEName==ENAME_NAME |
| 101922 | 102007 | && sqlite3_stricmp(zAs, zCol)==0 |
| 101923 | 102008 | ){ |
| 101924 | 102009 | Expr *pOrig; |
| 101925 | 102010 | assert( pExpr->pLeft==0 && pExpr->pRight==0 ); |
| 101926 | 102011 | assert( ExprUseXList(pExpr)==0 || pExpr->x.pList==0 ); |
| | @@ -102669,11 +102754,11 @@ |
| 102669 | 102754 | if( pE->op==TK_ID ){ |
| 102670 | 102755 | const char *zCol; |
| 102671 | 102756 | assert( !ExprHasProperty(pE, EP_IntValue) ); |
| 102672 | 102757 | zCol = pE->u.zToken; |
| 102673 | 102758 | for(i=0; i<pEList->nExpr; i++){ |
| 102674 | | - if( pEList->a[i].eEName==ENAME_NAME |
| 102759 | + if( pEList->a[i].fg.eEName==ENAME_NAME |
| 102675 | 102760 | && sqlite3_stricmp(pEList->a[i].zEName, zCol)==0 |
| 102676 | 102761 | ){ |
| 102677 | 102762 | return i+1; |
| 102678 | 102763 | } |
| 102679 | 102764 | } |
| | @@ -102790,11 +102875,11 @@ |
| 102790 | 102875 | if( pOrderBy->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){ |
| 102791 | 102876 | sqlite3ErrorMsg(pParse, "too many terms in ORDER BY clause"); |
| 102792 | 102877 | return 1; |
| 102793 | 102878 | } |
| 102794 | 102879 | for(i=0; i<pOrderBy->nExpr; i++){ |
| 102795 | | - pOrderBy->a[i].done = 0; |
| 102880 | + pOrderBy->a[i].fg.done = 0; |
| 102796 | 102881 | } |
| 102797 | 102882 | pSelect->pNext = 0; |
| 102798 | 102883 | while( pSelect->pPrior ){ |
| 102799 | 102884 | pSelect->pPrior->pNext = pSelect; |
| 102800 | 102885 | pSelect = pSelect->pPrior; |
| | @@ -102805,11 +102890,11 @@ |
| 102805 | 102890 | pEList = pSelect->pEList; |
| 102806 | 102891 | assert( pEList!=0 ); |
| 102807 | 102892 | for(i=0, pItem=pOrderBy->a; i<pOrderBy->nExpr; i++, pItem++){ |
| 102808 | 102893 | int iCol = -1; |
| 102809 | 102894 | Expr *pE, *pDup; |
| 102810 | | - if( pItem->done ) continue; |
| 102895 | + if( pItem->fg.done ) continue; |
| 102811 | 102896 | pE = sqlite3ExprSkipCollateAndLikely(pItem->pExpr); |
| 102812 | 102897 | if( NEVER(pE==0) ) continue; |
| 102813 | 102898 | if( sqlite3ExprIsInteger(pE, &iCol) ){ |
| 102814 | 102899 | if( iCol<=0 || iCol>pEList->nExpr ){ |
| 102815 | 102900 | resolveOutOfRangeError(pParse, "ORDER", i+1, pEList->nExpr, pE); |
| | @@ -102858,19 +102943,19 @@ |
| 102858 | 102943 | pParent->pLeft = pNew; |
| 102859 | 102944 | } |
| 102860 | 102945 | sqlite3ExprDelete(db, pE); |
| 102861 | 102946 | pItem->u.x.iOrderByCol = (u16)iCol; |
| 102862 | 102947 | } |
| 102863 | | - pItem->done = 1; |
| 102948 | + pItem->fg.done = 1; |
| 102864 | 102949 | }else{ |
| 102865 | 102950 | moreToDo = 1; |
| 102866 | 102951 | } |
| 102867 | 102952 | } |
| 102868 | 102953 | pSelect = pSelect->pNext; |
| 102869 | 102954 | } |
| 102870 | 102955 | for(i=0; i<pOrderBy->nExpr; i++){ |
| 102871 | | - if( pOrderBy->a[i].done==0 ){ |
| 102956 | + if( pOrderBy->a[i].fg.done==0 ){ |
| 102872 | 102957 | sqlite3ErrorMsg(pParse, "%r ORDER BY term does not match any " |
| 102873 | 102958 | "column in the result set", i+1); |
| 102874 | 102959 | return 1; |
| 102875 | 102960 | } |
| 102876 | 102961 | } |
| | @@ -105110,16 +105195,12 @@ |
| 105110 | 105195 | } |
| 105111 | 105196 | pNewExpr->pLeft = pPriorSelectColNew; |
| 105112 | 105197 | } |
| 105113 | 105198 | } |
| 105114 | 105199 | pItem->zEName = sqlite3DbStrDup(db, pOldItem->zEName); |
| 105115 | | - pItem->sortFlags = pOldItem->sortFlags; |
| 105116 | | - pItem->eEName = pOldItem->eEName; |
| 105117 | | - pItem->done = 0; |
| 105118 | | - pItem->bNulls = pOldItem->bNulls; |
| 105119 | | - pItem->bUsed = pOldItem->bUsed; |
| 105120 | | - pItem->bSorterRef = pOldItem->bSorterRef; |
| 105200 | + pItem->fg = pOldItem->fg; |
| 105201 | + pItem->fg.done = 0; |
| 105121 | 105202 | pItem->u = pOldItem->u; |
| 105122 | 105203 | } |
| 105123 | 105204 | return pNew; |
| 105124 | 105205 | } |
| 105125 | 105206 | |
| | @@ -105415,20 +105496,20 @@ |
| 105415 | 105496 | || eNulls==SQLITE_SO_ASC |
| 105416 | 105497 | || eNulls==SQLITE_SO_DESC |
| 105417 | 105498 | ); |
| 105418 | 105499 | |
| 105419 | 105500 | pItem = &p->a[p->nExpr-1]; |
| 105420 | | - assert( pItem->bNulls==0 ); |
| 105501 | + assert( pItem->fg.bNulls==0 ); |
| 105421 | 105502 | if( iSortOrder==SQLITE_SO_UNDEFINED ){ |
| 105422 | 105503 | iSortOrder = SQLITE_SO_ASC; |
| 105423 | 105504 | } |
| 105424 | | - pItem->sortFlags = (u8)iSortOrder; |
| 105505 | + pItem->fg.sortFlags = (u8)iSortOrder; |
| 105425 | 105506 | |
| 105426 | 105507 | if( eNulls!=SQLITE_SO_UNDEFINED ){ |
| 105427 | | - pItem->bNulls = 1; |
| 105508 | + pItem->fg.bNulls = 1; |
| 105428 | 105509 | if( iSortOrder!=eNulls ){ |
| 105429 | | - pItem->sortFlags |= KEYINFO_ORDER_BIGNULL; |
| 105510 | + pItem->fg.sortFlags |= KEYINFO_ORDER_BIGNULL; |
| 105430 | 105511 | } |
| 105431 | 105512 | } |
| 105432 | 105513 | } |
| 105433 | 105514 | |
| 105434 | 105515 | /* |
| | @@ -105450,11 +105531,11 @@ |
| 105450 | 105531 | if( pList ){ |
| 105451 | 105532 | struct ExprList_item *pItem; |
| 105452 | 105533 | assert( pList->nExpr>0 ); |
| 105453 | 105534 | pItem = &pList->a[pList->nExpr-1]; |
| 105454 | 105535 | assert( pItem->zEName==0 ); |
| 105455 | | - assert( pItem->eEName==ENAME_NAME ); |
| 105536 | + assert( pItem->fg.eEName==ENAME_NAME ); |
| 105456 | 105537 | pItem->zEName = sqlite3DbStrNDup(pParse->db, pName->z, pName->n); |
| 105457 | 105538 | if( dequote ){ |
| 105458 | 105539 | /* If dequote==0, then pName->z does not point to part of a DDL |
| 105459 | 105540 | ** statement handled by the parser. And so no token need be added |
| 105460 | 105541 | ** to the token-map. */ |
| | @@ -105485,11 +105566,11 @@ |
| 105485 | 105566 | if( pList ){ |
| 105486 | 105567 | struct ExprList_item *pItem = &pList->a[pList->nExpr-1]; |
| 105487 | 105568 | assert( pList->nExpr>0 ); |
| 105488 | 105569 | if( pItem->zEName==0 ){ |
| 105489 | 105570 | pItem->zEName = sqlite3DbSpanDup(db, zStart, zEnd); |
| 105490 | | - pItem->eEName = ENAME_SPAN; |
| 105571 | + pItem->fg.eEName = ENAME_SPAN; |
| 105491 | 105572 | } |
| 105492 | 105573 | } |
| 105493 | 105574 | } |
| 105494 | 105575 | |
| 105495 | 105576 | /* |
| | @@ -105782,11 +105863,11 @@ |
| 105782 | 105863 | |
| 105783 | 105864 | /* |
| 105784 | 105865 | ** Check pExpr to see if it is an invariant constraint on data source pSrc. |
| 105785 | 105866 | ** This is an optimization. False negatives will perhaps cause slower |
| 105786 | 105867 | ** queries, but false positives will yield incorrect answers. So when in |
| 105787 | | -** double, return 0. |
| 105868 | +** doubt, return 0. |
| 105788 | 105869 | ** |
| 105789 | 105870 | ** To be an invariant constraint, the following must be true: |
| 105790 | 105871 | ** |
| 105791 | 105872 | ** (1) pExpr cannot refer to any table other than pSrc->iCursor. |
| 105792 | 105873 | ** |
| | @@ -106141,11 +106222,11 @@ |
| 106141 | 106222 | ** The job of this routine is to find or create a b-tree object that can |
| 106142 | 106223 | ** be used either to test for membership in the RHS set or to iterate through |
| 106143 | 106224 | ** all members of the RHS set, skipping duplicates. |
| 106144 | 106225 | ** |
| 106145 | 106226 | ** A cursor is opened on the b-tree object that is the RHS of the IN operator |
| 106146 | | -** and pX->iTable is set to the index of that cursor. |
| 106227 | +** and the *piTab parameter is set to the index of that cursor. |
| 106147 | 106228 | ** |
| 106148 | 106229 | ** The returned value of this function indicates the b-tree type, as follows: |
| 106149 | 106230 | ** |
| 106150 | 106231 | ** IN_INDEX_ROWID - The cursor was opened on a database table. |
| 106151 | 106232 | ** IN_INDEX_INDEX_ASC - The cursor was opened on an ascending index. |
| | @@ -106161,11 +106242,14 @@ |
| 106161 | 106242 | ** SELECT <column1>, <column2>... FROM <table> |
| 106162 | 106243 | ** |
| 106163 | 106244 | ** If the RHS of the IN operator is a list or a more complex subquery, then |
| 106164 | 106245 | ** an ephemeral table might need to be generated from the RHS and then |
| 106165 | 106246 | ** pX->iTable made to point to the ephemeral table instead of an |
| 106166 | | -** existing table. |
| 106247 | +** existing table. In this case, the creation and initialization of the |
| 106248 | +** ephmeral table might be put inside of a subroutine, the EP_Subrtn flag |
| 106249 | +** will be set on pX and the pX->y.sub fields will be set to show where |
| 106250 | +** the subroutine is coded. |
| 106167 | 106251 | ** |
| 106168 | 106252 | ** The inFlags parameter must contain, at a minimum, one of the bits |
| 106169 | 106253 | ** IN_INDEX_MEMBERSHIP or IN_INDEX_LOOP but not both. If inFlags contains |
| 106170 | 106254 | ** IN_INDEX_MEMBERSHIP, then the generated table will be used for a fast |
| 106171 | 106255 | ** membership test. When the IN_INDEX_LOOP bit is set, the IN index will |
| | @@ -106222,16 +106306,21 @@ |
| 106222 | 106306 | int *aiMap, /* Mapping from Index fields to RHS fields */ |
| 106223 | 106307 | int *piTab /* OUT: index to use */ |
| 106224 | 106308 | ){ |
| 106225 | 106309 | Select *p; /* SELECT to the right of IN operator */ |
| 106226 | 106310 | int eType = 0; /* Type of RHS table. IN_INDEX_* */ |
| 106227 | | - int iTab = pParse->nTab++; /* Cursor of the RHS table */ |
| 106311 | + int iTab; /* Cursor of the RHS table */ |
| 106228 | 106312 | int mustBeUnique; /* True if RHS must be unique */ |
| 106229 | 106313 | Vdbe *v = sqlite3GetVdbe(pParse); /* Virtual machine being coded */ |
| 106230 | 106314 | |
| 106231 | 106315 | assert( pX->op==TK_IN ); |
| 106232 | 106316 | mustBeUnique = (inFlags & IN_INDEX_LOOP)!=0; |
| 106317 | + if( pX->iTable && (inFlags & IN_INDEX_REUSE_CUR)!=0 ){ |
| 106318 | + iTab = pX->iTable; |
| 106319 | + }else{ |
| 106320 | + iTab = pParse->nTab++; |
| 106321 | + } |
| 106233 | 106322 | |
| 106234 | 106323 | /* If the RHS of this IN(...) operator is a SELECT, and if it matters |
| 106235 | 106324 | ** whether or not the SELECT result contains NULL values, check whether |
| 106236 | 106325 | ** or not NULL is actually possible (it may not be, for example, due |
| 106237 | 106326 | ** to NOT NULL constraints in the schema). If no NULL values are possible, |
| | @@ -106393,10 +106482,12 @@ |
| 106393 | 106482 | if( eType==0 |
| 106394 | 106483 | && (inFlags & IN_INDEX_NOOP_OK) |
| 106395 | 106484 | && ExprUseXList(pX) |
| 106396 | 106485 | && (!sqlite3InRhsIsConstant(pX) || pX->x.pList->nExpr<=2) |
| 106397 | 106486 | ){ |
| 106487 | + pParse->nTab--; /* Back out the allocation of the unused cursor */ |
| 106488 | + iTab = -1; /* Cursor is not allocated */ |
| 106398 | 106489 | eType = IN_INDEX_NOOP; |
| 106399 | 106490 | } |
| 106400 | 106491 | |
| 106401 | 106492 | if( eType==0 ){ |
| 106402 | 106493 | /* Could not find an existing table or index to use as the RHS b-tree. |
| | @@ -106559,11 +106650,13 @@ |
| 106559 | 106650 | pExpr->x.pSelect->selId)); |
| 106560 | 106651 | } |
| 106561 | 106652 | assert( ExprUseYSub(pExpr) ); |
| 106562 | 106653 | sqlite3VdbeAddOp2(v, OP_Gosub, pExpr->y.sub.regReturn, |
| 106563 | 106654 | pExpr->y.sub.iAddr); |
| 106564 | | - sqlite3VdbeAddOp2(v, OP_OpenDup, iTab, pExpr->iTable); |
| 106655 | + if( iTab!=pExpr->iTable ){ |
| 106656 | + sqlite3VdbeAddOp2(v, OP_OpenDup, iTab, pExpr->iTable); |
| 106657 | + } |
| 106565 | 106658 | sqlite3VdbeJumpHere(v, addrOnce); |
| 106566 | 106659 | return; |
| 106567 | 106660 | } |
| 106568 | 106661 | |
| 106569 | 106662 | /* Begin coding the subroutine */ |
| | @@ -108299,11 +108392,13 @@ |
| 108299 | 108392 | p = pParse->pConstExpr; |
| 108300 | 108393 | if( regDest<0 && p ){ |
| 108301 | 108394 | struct ExprList_item *pItem; |
| 108302 | 108395 | int i; |
| 108303 | 108396 | for(pItem=p->a, i=p->nExpr; i>0; pItem++, i--){ |
| 108304 | | - if( pItem->reusable && sqlite3ExprCompare(0,pItem->pExpr,pExpr,-1)==0 ){ |
| 108397 | + if( pItem->fg.reusable |
| 108398 | + && sqlite3ExprCompare(0,pItem->pExpr,pExpr,-1)==0 |
| 108399 | + ){ |
| 108305 | 108400 | return pItem->u.iConstExprReg; |
| 108306 | 108401 | } |
| 108307 | 108402 | } |
| 108308 | 108403 | } |
| 108309 | 108404 | pExpr = sqlite3ExprDup(pParse->db, pExpr, 0); |
| | @@ -108322,11 +108417,11 @@ |
| 108322 | 108417 | sqlite3VdbeJumpHere(v, addr); |
| 108323 | 108418 | }else{ |
| 108324 | 108419 | p = sqlite3ExprListAppend(pParse, p, pExpr); |
| 108325 | 108420 | if( p ){ |
| 108326 | 108421 | struct ExprList_item *pItem = &p->a[p->nExpr-1]; |
| 108327 | | - pItem->reusable = regDest<0; |
| 108422 | + pItem->fg.reusable = regDest<0; |
| 108328 | 108423 | if( regDest<0 ) regDest = ++pParse->nMem; |
| 108329 | 108424 | pItem->u.iConstExprReg = regDest; |
| 108330 | 108425 | } |
| 108331 | 108426 | pParse->pConstExpr = p; |
| 108332 | 108427 | } |
| | @@ -108456,11 +108551,11 @@ |
| 108456 | 108551 | n = pList->nExpr; |
| 108457 | 108552 | if( !ConstFactorOk(pParse) ) flags &= ~SQLITE_ECEL_FACTOR; |
| 108458 | 108553 | for(pItem=pList->a, i=0; i<n; i++, pItem++){ |
| 108459 | 108554 | Expr *pExpr = pItem->pExpr; |
| 108460 | 108555 | #ifdef SQLITE_ENABLE_SORTER_REFERENCES |
| 108461 | | - if( pItem->bSorterRef ){ |
| 108556 | + if( pItem->fg.bSorterRef ){ |
| 108462 | 108557 | i--; |
| 108463 | 108558 | n--; |
| 108464 | 108559 | }else |
| 108465 | 108560 | #endif |
| 108466 | 108561 | if( (flags & SQLITE_ECEL_REF)!=0 && (j = pItem->u.x.iOrderByCol)>0 ){ |
| | @@ -109081,11 +109176,11 @@ |
| 109081 | 109176 | if( pA->nExpr!=pB->nExpr ) return 1; |
| 109082 | 109177 | for(i=0; i<pA->nExpr; i++){ |
| 109083 | 109178 | int res; |
| 109084 | 109179 | Expr *pExprA = pA->a[i].pExpr; |
| 109085 | 109180 | Expr *pExprB = pB->a[i].pExpr; |
| 109086 | | - if( pA->a[i].sortFlags!=pB->a[i].sortFlags ) return 1; |
| 109181 | + if( pA->a[i].fg.sortFlags!=pB->a[i].fg.sortFlags ) return 1; |
| 109087 | 109182 | if( (res = sqlite3ExprCompare(0, pExprA, pExprB, iTab)) ) return res; |
| 109088 | 109183 | } |
| 109089 | 109184 | return 0; |
| 109090 | 109185 | } |
| 109091 | 109186 | |
| | @@ -110770,11 +110865,11 @@ |
| 110770 | 110865 | return WRC_Prune; |
| 110771 | 110866 | } |
| 110772 | 110867 | if( ALWAYS(p->pEList) ){ |
| 110773 | 110868 | ExprList *pList = p->pEList; |
| 110774 | 110869 | for(i=0; i<pList->nExpr; i++){ |
| 110775 | | - if( pList->a[i].zEName && pList->a[i].eEName==ENAME_NAME ){ |
| 110870 | + if( pList->a[i].zEName && pList->a[i].fg.eEName==ENAME_NAME ){ |
| 110776 | 110871 | sqlite3RenameTokenRemap(pParse, 0, (void*)pList->a[i].zEName); |
| 110777 | 110872 | } |
| 110778 | 110873 | } |
| 110779 | 110874 | } |
| 110780 | 110875 | if( ALWAYS(p->pSrc) ){ /* Every Select as a SrcList, even if it is empty */ |
| | @@ -110819,11 +110914,11 @@ |
| 110819 | 110914 | memset(&sWalker, 0, sizeof(Walker)); |
| 110820 | 110915 | sWalker.pParse = pParse; |
| 110821 | 110916 | sWalker.xExprCallback = renameUnmapExprCb; |
| 110822 | 110917 | sqlite3WalkExprList(&sWalker, pEList); |
| 110823 | 110918 | for(i=0; i<pEList->nExpr; i++){ |
| 110824 | | - if( ALWAYS(pEList->a[i].eEName==ENAME_NAME) ){ |
| 110919 | + if( ALWAYS(pEList->a[i].fg.eEName==ENAME_NAME) ){ |
| 110825 | 110920 | sqlite3RenameTokenRemap(pParse, 0, (void*)pEList->a[i].zEName); |
| 110826 | 110921 | } |
| 110827 | 110922 | } |
| 110828 | 110923 | } |
| 110829 | 110924 | } |
| | @@ -110977,11 +111072,11 @@ |
| 110977 | 111072 | ){ |
| 110978 | 111073 | if( pEList ){ |
| 110979 | 111074 | int i; |
| 110980 | 111075 | for(i=0; i<pEList->nExpr; i++){ |
| 110981 | 111076 | const char *zName = pEList->a[i].zEName; |
| 110982 | | - if( ALWAYS(pEList->a[i].eEName==ENAME_NAME) |
| 111077 | + if( ALWAYS(pEList->a[i].fg.eEName==ENAME_NAME) |
| 110983 | 111078 | && ALWAYS(zName!=0) |
| 110984 | 111079 | && 0==sqlite3_stricmp(zName, zOld) |
| 110985 | 111080 | ){ |
| 110986 | 111081 | renameTokenFind(pParse, pCtx, (const void*)zName); |
| 110987 | 111082 | } |
| | @@ -113002,13 +113097,18 @@ |
| 113002 | 113097 | ** * the index contains 100 rows, |
| 113003 | 113098 | ** * "WHERE a=?" matches 10 rows, and |
| 113004 | 113099 | ** * "WHERE a=? AND b=?" matches 2 rows. |
| 113005 | 113100 | ** |
| 113006 | 113101 | ** If D is the count of distinct values and K is the total number of |
| 113007 | | - ** rows, then each estimate is computed as: |
| 113102 | + ** rows, then each estimate is usually computed as: |
| 113008 | 113103 | ** |
| 113009 | 113104 | ** I = (K+D-1)/D |
| 113105 | + ** |
| 113106 | + ** In other words, I is K/D rounded up to the next whole integer. |
| 113107 | + ** However, if I is between 1.0 and 1.1 (in other words if I is |
| 113108 | + ** close to 1.0 but just a little larger) then do not round up but |
| 113109 | + ** instead keep the I value at 1.0. |
| 113010 | 113110 | */ |
| 113011 | 113111 | sqlite3_str sStat; /* Text of the constructed "stat" line */ |
| 113012 | 113112 | int i; /* Loop counter */ |
| 113013 | 113113 | |
| 113014 | 113114 | sqlite3StrAccumInit(&sStat, 0, 0, 0, (p->nKeyCol+1)*100); |
| | @@ -113015,10 +113115,11 @@ |
| 113015 | 113115 | sqlite3_str_appendf(&sStat, "%llu", |
| 113016 | 113116 | p->nSkipAhead ? (u64)p->nEst : (u64)p->nRow); |
| 113017 | 113117 | for(i=0; i<p->nKeyCol; i++){ |
| 113018 | 113118 | u64 nDistinct = p->current.anDLt[i] + 1; |
| 113019 | 113119 | u64 iVal = (p->nRow + nDistinct - 1) / nDistinct; |
| 113120 | + if( iVal==2 && p->nRow*10 <= nDistinct*11 ) iVal = 1; |
| 113020 | 113121 | sqlite3_str_appendf(&sStat, " %llu", iVal); |
| 113021 | 113122 | assert( p->current.anEq[i] ); |
| 113022 | 113123 | } |
| 113023 | 113124 | sqlite3ResultStrAccum(context, &sStat); |
| 113024 | 113125 | } |
| | @@ -116854,11 +116955,11 @@ |
| 116854 | 116955 | } |
| 116855 | 116956 | pTab->iPKey = iCol; |
| 116856 | 116957 | pTab->keyConf = (u8)onError; |
| 116857 | 116958 | assert( autoInc==0 || autoInc==1 ); |
| 116858 | 116959 | pTab->tabFlags |= autoInc*TF_Autoincrement; |
| 116859 | | - if( pList ) pParse->iPkSortOrder = pList->a[0].sortFlags; |
| 116960 | + if( pList ) pParse->iPkSortOrder = pList->a[0].fg.sortFlags; |
| 116860 | 116961 | (void)sqlite3HasExplicitNulls(pParse, pList); |
| 116861 | 116962 | }else if( autoInc ){ |
| 116862 | 116963 | #ifndef SQLITE_OMIT_AUTOINCREMENT |
| 116863 | 116964 | sqlite3ErrorMsg(pParse, "AUTOINCREMENT is only allowed on an " |
| 116864 | 116965 | "INTEGER PRIMARY KEY"); |
| | @@ -117348,11 +117449,11 @@ |
| 117348 | 117449 | return; |
| 117349 | 117450 | } |
| 117350 | 117451 | if( IN_RENAME_OBJECT ){ |
| 117351 | 117452 | sqlite3RenameTokenRemap(pParse, pList->a[0].pExpr, &pTab->iPKey); |
| 117352 | 117453 | } |
| 117353 | | - pList->a[0].sortFlags = pParse->iPkSortOrder; |
| 117454 | + pList->a[0].fg.sortFlags = pParse->iPkSortOrder; |
| 117354 | 117455 | assert( pParse->pNewTable==pTab ); |
| 117355 | 117456 | pTab->iPKey = -1; |
| 117356 | 117457 | sqlite3CreateIndex(pParse, 0, 0, 0, pList, pTab->keyConf, 0, 0, 0, 0, |
| 117357 | 117458 | SQLITE_IDXTYPE_PRIMARYKEY); |
| 117358 | 117459 | if( pParse->nErr ){ |
| | @@ -118836,12 +118937,12 @@ |
| 118836 | 118937 | */ |
| 118837 | 118938 | SQLITE_PRIVATE int sqlite3HasExplicitNulls(Parse *pParse, ExprList *pList){ |
| 118838 | 118939 | if( pList ){ |
| 118839 | 118940 | int i; |
| 118840 | 118941 | for(i=0; i<pList->nExpr; i++){ |
| 118841 | | - if( pList->a[i].bNulls ){ |
| 118842 | | - u8 sf = pList->a[i].sortFlags; |
| 118942 | + if( pList->a[i].fg.bNulls ){ |
| 118943 | + u8 sf = pList->a[i].fg.sortFlags; |
| 118843 | 118944 | sqlite3ErrorMsg(pParse, "unsupported use of NULLS %s", |
| 118844 | 118945 | (sf==0 || sf==3) ? "FIRST" : "LAST" |
| 118845 | 118946 | ); |
| 118846 | 118947 | return 1; |
| 118847 | 118948 | } |
| | @@ -119190,11 +119291,11 @@ |
| 119190 | 119291 | if( !zColl ) zColl = sqlite3StrBINARY; |
| 119191 | 119292 | if( !db->init.busy && !sqlite3LocateCollSeq(pParse, zColl) ){ |
| 119192 | 119293 | goto exit_create_index; |
| 119193 | 119294 | } |
| 119194 | 119295 | pIndex->azColl[i] = zColl; |
| 119195 | | - requestedSortOrder = pListItem->sortFlags & sortOrderMask; |
| 119296 | + requestedSortOrder = pListItem->fg.sortFlags & sortOrderMask; |
| 119196 | 119297 | pIndex->aSortOrder[i] = (u8)requestedSortOrder; |
| 119197 | 119298 | } |
| 119198 | 119299 | |
| 119199 | 119300 | /* Append the table key to the end of the index. For WITHOUT ROWID |
| 119200 | 119301 | ** tables (when pPk!=0) this will be the declared PRIMARY KEY. For |
| | @@ -130512,15 +130613,23 @@ |
| 130512 | 130613 | sqlite3_total_changes64, |
| 130513 | 130614 | /* Version 3.37.0 and later */ |
| 130514 | 130615 | sqlite3_autovacuum_pages, |
| 130515 | 130616 | /* Version 3.38.0 and later */ |
| 130516 | 130617 | sqlite3_error_offset, |
| 130618 | +#ifndef SQLITE_OMIT_VIRTUALTABLE |
| 130517 | 130619 | sqlite3_vtab_rhs_value, |
| 130518 | 130620 | sqlite3_vtab_distinct, |
| 130519 | 130621 | sqlite3_vtab_in, |
| 130520 | 130622 | sqlite3_vtab_in_first, |
| 130521 | 130623 | sqlite3_vtab_in_next, |
| 130624 | +#else |
| 130625 | + 0, |
| 130626 | + 0, |
| 130627 | + 0, |
| 130628 | + 0, |
| 130629 | + 0, |
| 130630 | +#endif |
| 130522 | 130631 | /* Version 3.39.0 and later */ |
| 130523 | 130632 | #ifndef SQLITE_OMIT_DESERIALIZE |
| 130524 | 130633 | sqlite3_deserialize, |
| 130525 | 130634 | sqlite3_serialize |
| 130526 | 130635 | #else |
| | @@ -134960,10 +135069,18 @@ |
| 134960 | 135069 | db->pParse = pParse; |
| 134961 | 135070 | pParse->db = db; |
| 134962 | 135071 | if( db->mallocFailed ) sqlite3ErrorMsg(pParse, "out of memory"); |
| 134963 | 135072 | } |
| 134964 | 135073 | |
| 135074 | +/* |
| 135075 | +** Maximum number of times that we will try again to prepare a statement |
| 135076 | +** that returns SQLITE_ERROR_RETRY. |
| 135077 | +*/ |
| 135078 | +#ifndef SQLITE_MAX_PREPARE_RETRY |
| 135079 | +# define SQLITE_MAX_PREPARE_RETRY 25 |
| 135080 | +#endif |
| 135081 | + |
| 134965 | 135082 | /* |
| 134966 | 135083 | ** Compile the UTF-8 encoded SQL statement zSql into a statement handle. |
| 134967 | 135084 | */ |
| 134968 | 135085 | static int sqlite3Prepare( |
| 134969 | 135086 | sqlite3 *db, /* Database handle. */ |
| | @@ -135134,11 +135251,11 @@ |
| 135134 | 135251 | ** or encounters a permanent error. A schema problem after one schema |
| 135135 | 135252 | ** reset is considered a permanent error. */ |
| 135136 | 135253 | rc = sqlite3Prepare(db, zSql, nBytes, prepFlags, pOld, ppStmt, pzTail); |
| 135137 | 135254 | assert( rc==SQLITE_OK || *ppStmt==0 ); |
| 135138 | 135255 | if( rc==SQLITE_OK || db->mallocFailed ) break; |
| 135139 | | - }while( rc==SQLITE_ERROR_RETRY |
| 135256 | + }while( (rc==SQLITE_ERROR_RETRY && (cnt++)<SQLITE_MAX_PREPARE_RETRY) |
| 135140 | 135257 | || (rc==SQLITE_SCHEMA && (sqlite3ResetOneSchema(db,-1), cnt++)==0) ); |
| 135141 | 135258 | sqlite3BtreeLeaveAll(db); |
| 135142 | 135259 | rc = sqlite3ApiExit(db, rc); |
| 135143 | 135260 | assert( (rc&db->errMask)==rc ); |
| 135144 | 135261 | db->busyHandler.nBusy = 0; |
| | @@ -135685,11 +135802,11 @@ |
| 135685 | 135802 | ExprList *pResults; |
| 135686 | 135803 | assert( pItem->pSelect!=0 ); |
| 135687 | 135804 | pResults = pItem->pSelect->pEList; |
| 135688 | 135805 | assert( pResults!=0 ); |
| 135689 | 135806 | assert( iCol>=0 && iCol<pResults->nExpr ); |
| 135690 | | - pResults->a[iCol].bUsed = 1; |
| 135807 | + pResults->a[iCol].fg.bUsed = 1; |
| 135691 | 135808 | } |
| 135692 | 135809 | } |
| 135693 | 135810 | |
| 135694 | 135811 | /* |
| 135695 | 135812 | ** Search the tables iStart..iEnd (inclusive) in pSrc, looking for a |
| | @@ -136353,11 +136470,11 @@ |
| 136353 | 136470 | ** the row from table t1 is stored instead. Then, as records are extracted from |
| 136354 | 136471 | ** the sorter to return to the user, the required value of bigblob is |
| 136355 | 136472 | ** retrieved directly from table t1. If the values are very large, this |
| 136356 | 136473 | ** can be more efficient than storing them directly in the sorter records. |
| 136357 | 136474 | ** |
| 136358 | | -** The ExprList_item.bSorterRef flag is set for each expression in pEList |
| 136475 | +** The ExprList_item.fg.bSorterRef flag is set for each expression in pEList |
| 136359 | 136476 | ** for which the sorter-reference optimization should be enabled. |
| 136360 | 136477 | ** Additionally, the pSort->aDefer[] array is populated with entries |
| 136361 | 136478 | ** for all cursors required to evaluate all selected expressions. Finally. |
| 136362 | 136479 | ** output variable (*ppExtra) is set to an expression list containing |
| 136363 | 136480 | ** expressions for all extra PK values that should be stored in the |
| | @@ -136413,11 +136530,11 @@ |
| 136413 | 136530 | pSort->aDefer[nDefer].iCsr = pExpr->iTable; |
| 136414 | 136531 | pSort->aDefer[nDefer].nKey = nKey; |
| 136415 | 136532 | nDefer++; |
| 136416 | 136533 | } |
| 136417 | 136534 | } |
| 136418 | | - pItem->bSorterRef = 1; |
| 136535 | + pItem->fg.bSorterRef = 1; |
| 136419 | 136536 | } |
| 136420 | 136537 | } |
| 136421 | 136538 | } |
| 136422 | 136539 | pSort->nDefer = (u8)nDefer; |
| 136423 | 136540 | *ppExtra = pExtra; |
| | @@ -136544,11 +136661,11 @@ |
| 136544 | 136661 | ** from the sorter by the optimizations in this branch */ |
| 136545 | 136662 | pEList = p->pEList; |
| 136546 | 136663 | for(i=0; i<pEList->nExpr; i++){ |
| 136547 | 136664 | if( pEList->a[i].u.x.iOrderByCol>0 |
| 136548 | 136665 | #ifdef SQLITE_ENABLE_SORTER_REFERENCES |
| 136549 | | - || pEList->a[i].bSorterRef |
| 136666 | + || pEList->a[i].fg.bSorterRef |
| 136550 | 136667 | #endif |
| 136551 | 136668 | ){ |
| 136552 | 136669 | nResultCol--; |
| 136553 | 136670 | regOrig = 0; |
| 136554 | 136671 | } |
| | @@ -136906,11 +137023,11 @@ |
| 136906 | 137023 | pInfo = sqlite3KeyInfoAlloc(db, nExpr-iStart, nExtra+1); |
| 136907 | 137024 | if( pInfo ){ |
| 136908 | 137025 | assert( sqlite3KeyInfoIsWriteable(pInfo) ); |
| 136909 | 137026 | for(i=iStart, pItem=pList->a+iStart; i<nExpr; i++, pItem++){ |
| 136910 | 137027 | pInfo->aColl[i-iStart] = sqlite3ExprNNCollSeq(pParse, pItem->pExpr); |
| 136911 | | - pInfo->aSortFlags[i-iStart] = pItem->sortFlags; |
| 137028 | + pInfo->aSortFlags[i-iStart] = pItem->fg.sortFlags; |
| 136912 | 137029 | } |
| 136913 | 137030 | } |
| 136914 | 137031 | return pInfo; |
| 136915 | 137032 | } |
| 136916 | 137033 | |
| | @@ -137045,11 +137162,11 @@ |
| 137045 | 137162 | iSortTab = iTab; |
| 137046 | 137163 | bSeq = 1; |
| 137047 | 137164 | } |
| 137048 | 137165 | for(i=0, iCol=nKey+bSeq-1; i<nColumn; i++){ |
| 137049 | 137166 | #ifdef SQLITE_ENABLE_SORTER_REFERENCES |
| 137050 | | - if( aOutEx[i].bSorterRef ) continue; |
| 137167 | + if( aOutEx[i].fg.bSorterRef ) continue; |
| 137051 | 137168 | #endif |
| 137052 | 137169 | if( aOutEx[i].u.x.iOrderByCol==0 ) iCol++; |
| 137053 | 137170 | } |
| 137054 | 137171 | #ifdef SQLITE_ENABLE_SORTER_REFERENCES |
| 137055 | 137172 | if( pSort->nDefer ){ |
| | @@ -137082,11 +137199,11 @@ |
| 137082 | 137199 | sqlite3ReleaseTempRange(pParse, regKey, nRefKey); |
| 137083 | 137200 | } |
| 137084 | 137201 | #endif |
| 137085 | 137202 | for(i=nColumn-1; i>=0; i--){ |
| 137086 | 137203 | #ifdef SQLITE_ENABLE_SORTER_REFERENCES |
| 137087 | | - if( aOutEx[i].bSorterRef ){ |
| 137204 | + if( aOutEx[i].fg.bSorterRef ){ |
| 137088 | 137205 | sqlite3ExprCode(pParse, aOutEx[i].pExpr, regRow+i); |
| 137089 | 137206 | }else |
| 137090 | 137207 | #endif |
| 137091 | 137208 | { |
| 137092 | 137209 | int iRead; |
| | @@ -137448,11 +137565,11 @@ |
| 137448 | 137565 | |
| 137449 | 137566 | assert( p!=0 ); |
| 137450 | 137567 | assert( p->op!=TK_AGG_COLUMN ); /* Agg processing has not run yet */ |
| 137451 | 137568 | assert( p->op!=TK_COLUMN |
| 137452 | 137569 | || (ExprUseYTab(p) && p->y.pTab!=0) ); /* Covering idx not yet coded */ |
| 137453 | | - if( pEList->a[i].zEName && pEList->a[i].eEName==ENAME_NAME ){ |
| 137570 | + if( pEList->a[i].zEName && pEList->a[i].fg.eEName==ENAME_NAME ){ |
| 137454 | 137571 | /* An AS clause always takes first priority */ |
| 137455 | 137572 | char *zName = pEList->a[i].zEName; |
| 137456 | 137573 | sqlite3VdbeSetColName(v, i, COLNAME_NAME, zName, SQLITE_TRANSIENT); |
| 137457 | 137574 | }else if( srcName && p->op==TK_COLUMN ){ |
| 137458 | 137575 | char *zCol; |
| | @@ -137534,13 +137651,14 @@ |
| 137534 | 137651 | *pnCol = nCol; |
| 137535 | 137652 | *paCol = aCol; |
| 137536 | 137653 | |
| 137537 | 137654 | for(i=0, pCol=aCol; i<nCol && !db->mallocFailed; i++, pCol++){ |
| 137538 | 137655 | struct ExprList_item *pX = &pEList->a[i]; |
| 137656 | + struct ExprList_item *pCollide; |
| 137539 | 137657 | /* Get an appropriate name for the column |
| 137540 | 137658 | */ |
| 137541 | | - if( (zName = pX->zEName)!=0 && pX->eEName==ENAME_NAME ){ |
| 137659 | + if( (zName = pX->zEName)!=0 && pX->fg.eEName==ENAME_NAME ){ |
| 137542 | 137660 | /* If the column contains an "AS <name>" phrase, use <name> as the name */ |
| 137543 | 137661 | }else{ |
| 137544 | 137662 | Expr *pColExpr = sqlite3ExprSkipCollateAndLikely(pX->pExpr); |
| 137545 | 137663 | while( ALWAYS(pColExpr!=0) && pColExpr->op==TK_DOT ){ |
| 137546 | 137664 | pColExpr = pColExpr->pRight; |
| | @@ -137570,11 +137688,14 @@ |
| 137570 | 137688 | |
| 137571 | 137689 | /* Make sure the column name is unique. If the name is not unique, |
| 137572 | 137690 | ** append an integer to the name so that it becomes unique. |
| 137573 | 137691 | */ |
| 137574 | 137692 | cnt = 0; |
| 137575 | | - while( zName && sqlite3HashFind(&ht, zName)!=0 ){ |
| 137693 | + while( zName && (pCollide = sqlite3HashFind(&ht, zName))!=0 ){ |
| 137694 | + if( pCollide->fg.bUsingTerm ){ |
| 137695 | + pCol->colFlags |= COLFLAG_NOEXPAND; |
| 137696 | + } |
| 137576 | 137697 | nName = sqlite3Strlen30(zName); |
| 137577 | 137698 | if( nName>0 ){ |
| 137578 | 137699 | for(j=nName-1; j>0 && sqlite3Isdigit(zName[j]); j--){} |
| 137579 | 137700 | if( zName[j]==':' ) nName = j; |
| 137580 | 137701 | } |
| | @@ -137581,12 +137702,15 @@ |
| 137581 | 137702 | zName = sqlite3MPrintf(db, "%.*z:%u", nName, zName, ++cnt); |
| 137582 | 137703 | if( cnt>3 ) sqlite3_randomness(sizeof(cnt), &cnt); |
| 137583 | 137704 | } |
| 137584 | 137705 | pCol->zCnName = zName; |
| 137585 | 137706 | pCol->hName = sqlite3StrIHash(zName); |
| 137707 | + if( pX->fg.bNoExpand ){ |
| 137708 | + pCol->colFlags |= COLFLAG_NOEXPAND; |
| 137709 | + } |
| 137586 | 137710 | sqlite3ColumnPropertiesFromName(0, pCol); |
| 137587 | | - if( zName && sqlite3HashInsert(&ht, zName, pCol)==pCol ){ |
| 137711 | + if( zName && sqlite3HashInsert(&ht, zName, pX)==pX ){ |
| 137588 | 137712 | sqlite3OomFault(db); |
| 137589 | 137713 | } |
| 137590 | 137714 | } |
| 137591 | 137715 | sqlite3HashClear(&ht); |
| 137592 | 137716 | if( db->mallocFailed ){ |
| | @@ -137839,11 +137963,11 @@ |
| 137839 | 137963 | pOrderBy->a[i].pExpr = |
| 137840 | 137964 | sqlite3ExprAddCollateString(pParse, pTerm, pColl->zName); |
| 137841 | 137965 | } |
| 137842 | 137966 | assert( sqlite3KeyInfoIsWriteable(pRet) ); |
| 137843 | 137967 | pRet->aColl[i] = pColl; |
| 137844 | | - pRet->aSortFlags[i] = pOrderBy->a[i].sortFlags; |
| 137968 | + pRet->aSortFlags[i] = pOrderBy->a[i].fg.sortFlags; |
| 137845 | 137969 | } |
| 137846 | 137970 | } |
| 137847 | 137971 | |
| 137848 | 137972 | return pRet; |
| 137849 | 137973 | } |
| | @@ -140445,11 +140569,11 @@ |
| 140445 | 140569 | }else{ |
| 140446 | 140570 | return eRet; |
| 140447 | 140571 | } |
| 140448 | 140572 | *ppMinMax = pOrderBy = sqlite3ExprListDup(db, pEList, 0); |
| 140449 | 140573 | assert( pOrderBy!=0 || db->mallocFailed ); |
| 140450 | | - if( pOrderBy ) pOrderBy->a[0].sortFlags = sortFlags; |
| 140574 | + if( pOrderBy ) pOrderBy->a[0].fg.sortFlags = sortFlags; |
| 140451 | 140575 | return eRet; |
| 140452 | 140576 | } |
| 140453 | 140577 | |
| 140454 | 140578 | /* |
| 140455 | 140579 | ** The select statement passed as the first argument is an aggregate query. |
| | @@ -141152,11 +141276,11 @@ |
| 141152 | 141276 | /* This particular expression does not need to be expanded. |
| 141153 | 141277 | */ |
| 141154 | 141278 | pNew = sqlite3ExprListAppend(pParse, pNew, a[k].pExpr); |
| 141155 | 141279 | if( pNew ){ |
| 141156 | 141280 | pNew->a[pNew->nExpr-1].zEName = a[k].zEName; |
| 141157 | | - pNew->a[pNew->nExpr-1].eEName = a[k].eEName; |
| 141281 | + pNew->a[pNew->nExpr-1].fg.eEName = a[k].fg.eEName; |
| 141158 | 141282 | a[k].zEName = 0; |
| 141159 | 141283 | } |
| 141160 | 141284 | a[k].pExpr = 0; |
| 141161 | 141285 | }else{ |
| 141162 | 141286 | /* This expression is a "*" or a "TABLE.*" and needs to be |
| | @@ -141172,10 +141296,11 @@ |
| 141172 | 141296 | Table *pTab = pFrom->pTab; /* Table for this data source */ |
| 141173 | 141297 | ExprList *pNestedFrom; /* Result-set of a nested FROM clause */ |
| 141174 | 141298 | char *zTabName; /* AS name for this data source */ |
| 141175 | 141299 | const char *zSchemaName = 0; /* Schema name for this data source */ |
| 141176 | 141300 | int iDb; /* Schema index for this data src */ |
| 141301 | + IdList *pUsing; /* USING clause for pFrom[1] */ |
| 141177 | 141302 | |
| 141178 | 141303 | if( (zTabName = pFrom->zAlias)==0 ){ |
| 141179 | 141304 | zTabName = pTab->zName; |
| 141180 | 141305 | } |
| 141181 | 141306 | if( db->mallocFailed ) break; |
| | @@ -141190,10 +141315,31 @@ |
| 141190 | 141315 | continue; |
| 141191 | 141316 | } |
| 141192 | 141317 | pNestedFrom = 0; |
| 141193 | 141318 | iDb = sqlite3SchemaToIndex(db, pTab->pSchema); |
| 141194 | 141319 | zSchemaName = iDb>=0 ? db->aDb[iDb].zDbSName : "*"; |
| 141320 | + } |
| 141321 | + if( i+1<pTabList->nSrc |
| 141322 | + && pFrom[1].fg.isUsing |
| 141323 | + && (selFlags & SF_NestedFrom)!=0 |
| 141324 | + ){ |
| 141325 | + int ii; |
| 141326 | + pUsing = pFrom[1].u3.pUsing; |
| 141327 | + for(ii=0; ii<pUsing->nId; ii++){ |
| 141328 | + const char *zUName = pUsing->a[ii].zName; |
| 141329 | + pRight = sqlite3Expr(db, TK_ID, zUName); |
| 141330 | + pNew = sqlite3ExprListAppend(pParse, pNew, pRight); |
| 141331 | + if( pNew ){ |
| 141332 | + struct ExprList_item *pX = &pNew->a[pNew->nExpr-1]; |
| 141333 | + assert( pX->zEName==0 ); |
| 141334 | + pX->zEName = sqlite3MPrintf(db,"..%s", zUName); |
| 141335 | + pX->fg.eEName = ENAME_TAB; |
| 141336 | + pX->fg.bUsingTerm = 1; |
| 141337 | + } |
| 141338 | + } |
| 141339 | + }else{ |
| 141340 | + pUsing = 0; |
| 141195 | 141341 | } |
| 141196 | 141342 | for(j=0; j<pTab->nCol; j++){ |
| 141197 | 141343 | char *zName = pTab->aCol[j].zCnName; |
| 141198 | 141344 | struct ExprList_item *pX; /* Newly added ExprList term */ |
| 141199 | 141345 | |
| | @@ -141211,14 +141357,20 @@ |
| 141211 | 141357 | */ |
| 141212 | 141358 | if( (p->selFlags & SF_IncludeHidden)==0 |
| 141213 | 141359 | && IsHiddenColumn(&pTab->aCol[j]) |
| 141214 | 141360 | ){ |
| 141215 | 141361 | continue; |
| 141362 | + } |
| 141363 | + if( (pTab->aCol[j].colFlags & COLFLAG_NOEXPAND)!=0 |
| 141364 | + && zTName==0 |
| 141365 | + && (selFlags & (SF_NestedFrom))==0 |
| 141366 | + ){ |
| 141367 | + continue; |
| 141216 | 141368 | } |
| 141217 | 141369 | tableSeen = 1; |
| 141218 | 141370 | |
| 141219 | | - if( i>0 && zTName==0 ){ |
| 141371 | + if( i>0 && zTName==0 && (selFlags & SF_NestedFrom)==0 ){ |
| 141220 | 141372 | if( pFrom->fg.isUsing |
| 141221 | 141373 | && sqlite3IdListIndex(pFrom->u3.pUsing, zName)>=0 |
| 141222 | 141374 | ){ |
| 141223 | 141375 | /* In a join with a USING clause, omit columns in the |
| 141224 | 141376 | ** using clause from the table on the right. */ |
| | @@ -141226,10 +141378,11 @@ |
| 141226 | 141378 | } |
| 141227 | 141379 | } |
| 141228 | 141380 | pRight = sqlite3Expr(db, TK_ID, zName); |
| 141229 | 141381 | if( (pTabList->nSrc>1 |
| 141230 | 141382 | && ( (pFrom->fg.jointype & JT_LTORJ)==0 |
| 141383 | + || (selFlags & SF_NestedFrom)!=0 |
| 141231 | 141384 | || !inAnyUsingClause(zName,pFrom,pTabList->nSrc-i-1) |
| 141232 | 141385 | ) |
| 141233 | 141386 | ) |
| 141234 | 141387 | || IN_RENAME_OBJECT |
| 141235 | 141388 | ){ |
| | @@ -141259,17 +141412,24 @@ |
| 141259 | 141412 | }else{ |
| 141260 | 141413 | pX->zEName = sqlite3MPrintf(db, "%s.%s.%s", |
| 141261 | 141414 | zSchemaName, zTabName, zName); |
| 141262 | 141415 | testcase( pX->zEName==0 ); |
| 141263 | 141416 | } |
| 141264 | | - pX->eEName = ENAME_TAB; |
| 141417 | + pX->fg.eEName = ENAME_TAB; |
| 141418 | + if( (pFrom->fg.isUsing |
| 141419 | + && sqlite3IdListIndex(pFrom->u3.pUsing, zName)>=0) |
| 141420 | + || (pUsing && sqlite3IdListIndex(pUsing, zName)>=0) |
| 141421 | + || (pTab->aCol[j].colFlags & COLFLAG_NOEXPAND)!=0 |
| 141422 | + ){ |
| 141423 | + pX->fg.bNoExpand = 1; |
| 141424 | + } |
| 141265 | 141425 | }else if( longNames ){ |
| 141266 | 141426 | pX->zEName = sqlite3MPrintf(db, "%s.%s", zTabName, zName); |
| 141267 | | - pX->eEName = ENAME_NAME; |
| 141427 | + pX->fg.eEName = ENAME_NAME; |
| 141268 | 141428 | }else{ |
| 141269 | 141429 | pX->zEName = sqlite3DbStrDup(db, zName); |
| 141270 | | - pX->eEName = ENAME_NAME; |
| 141430 | + pX->fg.eEName = ENAME_NAME; |
| 141271 | 141431 | } |
| 141272 | 141432 | } |
| 141273 | 141433 | } |
| 141274 | 141434 | if( !tableSeen ){ |
| 141275 | 141435 | if( zTName ){ |
| | @@ -142393,17 +142553,17 @@ |
| 142393 | 142553 | if( pDest->eDest==SRT_EphemTab ){ |
| 142394 | 142554 | sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pDest->iSDParm, pEList->nExpr); |
| 142395 | 142555 | if( p->selFlags & SF_NestedFrom ){ |
| 142396 | 142556 | /* Delete or NULL-out result columns that will never be used */ |
| 142397 | 142557 | int ii; |
| 142398 | | - for(ii=pEList->nExpr-1; ii>0 && pEList->a[ii].bUsed==0; ii--){ |
| 142558 | + for(ii=pEList->nExpr-1; ii>0 && pEList->a[ii].fg.bUsed==0; ii--){ |
| 142399 | 142559 | sqlite3ExprDelete(db, pEList->a[ii].pExpr); |
| 142400 | 142560 | sqlite3DbFree(db, pEList->a[ii].zEName); |
| 142401 | 142561 | pEList->nExpr--; |
| 142402 | 142562 | } |
| 142403 | 142563 | for(ii=0; ii<pEList->nExpr; ii++){ |
| 142404 | | - if( pEList->a[ii].bUsed==0 ) pEList->a[ii].pExpr->op = TK_NULL; |
| 142564 | + if( pEList->a[ii].fg.bUsed==0 ) pEList->a[ii].pExpr->op = TK_NULL; |
| 142405 | 142565 | } |
| 142406 | 142566 | } |
| 142407 | 142567 | } |
| 142408 | 142568 | |
| 142409 | 142569 | /* Set the limiter. |
| | @@ -142551,12 +142711,13 @@ |
| 142551 | 142711 | ** ASC or DESC order - only that each group is returned contiguously. |
| 142552 | 142712 | ** So set the ASC/DESC flags in the GROUP BY to match those in the |
| 142553 | 142713 | ** ORDER BY to maximize the chances of rows being delivered in an |
| 142554 | 142714 | ** order that makes the ORDER BY redundant. */ |
| 142555 | 142715 | for(ii=0; ii<pGroupBy->nExpr; ii++){ |
| 142556 | | - u8 sortFlags = sSort.pOrderBy->a[ii].sortFlags & KEYINFO_ORDER_DESC; |
| 142557 | | - pGroupBy->a[ii].sortFlags = sortFlags; |
| 142716 | + u8 sortFlags; |
| 142717 | + sortFlags = sSort.pOrderBy->a[ii].fg.sortFlags & KEYINFO_ORDER_DESC; |
| 142718 | + pGroupBy->a[ii].fg.sortFlags = sortFlags; |
| 142558 | 142719 | } |
| 142559 | 142720 | if( sqlite3ExprListCompare(pGroupBy, sSort.pOrderBy, -1)==0 ){ |
| 142560 | 142721 | orderByGrp = 1; |
| 142561 | 142722 | } |
| 142562 | 142723 | } |
| | @@ -144207,20 +144368,20 @@ |
| 144207 | 144368 | pNewExpr = sqlite3Expr(db, TK_ID, pTab->aCol[jj].zCnName); |
| 144208 | 144369 | pNew = sqlite3ExprListAppend(pParse, pNew, pNewExpr); |
| 144209 | 144370 | if( !db->mallocFailed ){ |
| 144210 | 144371 | struct ExprList_item *pItem = &pNew->a[pNew->nExpr-1]; |
| 144211 | 144372 | pItem->zEName = sqlite3DbStrDup(db, pTab->aCol[jj].zCnName); |
| 144212 | | - pItem->eEName = ENAME_NAME; |
| 144373 | + pItem->fg.eEName = ENAME_NAME; |
| 144213 | 144374 | } |
| 144214 | 144375 | } |
| 144215 | 144376 | }else{ |
| 144216 | 144377 | Expr *pNewExpr = sqlite3ExprDup(db, pOldExpr, 0); |
| 144217 | 144378 | pNew = sqlite3ExprListAppend(pParse, pNew, pNewExpr); |
| 144218 | 144379 | if( !db->mallocFailed && ALWAYS(pList->a[i].zEName!=0) ){ |
| 144219 | 144380 | struct ExprList_item *pItem = &pNew->a[pNew->nExpr-1]; |
| 144220 | 144381 | pItem->zEName = sqlite3DbStrDup(db, pList->a[i].zEName); |
| 144221 | | - pItem->eEName = pList->a[i].eEName; |
| 144382 | + pItem->fg.eEName = pList->a[i].fg.eEName; |
| 144222 | 144383 | } |
| 144223 | 144384 | } |
| 144224 | 144385 | } |
| 144225 | 144386 | return pNew; |
| 144226 | 144387 | } |
| | @@ -146789,10 +146950,11 @@ |
| 146789 | 146950 | #endif |
| 146790 | 146951 | } |
| 146791 | 146952 | |
| 146792 | 146953 | assert( rc==SQLITE_OK ); |
| 146793 | 146954 | if( pOut==0 ){ |
| 146955 | + nRes = sqlite3BtreeGetRequestedReserve(pTemp); |
| 146794 | 146956 | rc = sqlite3BtreeSetPageSize(pMain, sqlite3BtreeGetPageSize(pTemp), nRes,1); |
| 146795 | 146957 | } |
| 146796 | 146958 | |
| 146797 | 146959 | end_of_vacuum: |
| 146798 | 146960 | /* Restore the original value of db->flags */ |
| | @@ -149443,20 +149605,26 @@ |
| 149443 | 149605 | |
| 149444 | 149606 | iTab = 0; |
| 149445 | 149607 | if( !ExprUseXSelect(pX) || pX->x.pSelect->pEList->nExpr==1 ){ |
| 149446 | 149608 | eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, 0, &iTab); |
| 149447 | 149609 | }else{ |
| 149448 | | - sqlite3 *db = pParse->db; |
| 149449 | | - pX = removeUnindexableInClauseTerms(pParse, iEq, pLoop, pX); |
| 149450 | | - |
| 149451 | | - if( !db->mallocFailed ){ |
| 149610 | + Expr *pExpr = pTerm->pExpr; |
| 149611 | + if( pExpr->iTable==0 || !ExprHasProperty(pExpr, EP_Subrtn) ){ |
| 149612 | + sqlite3 *db = pParse->db; |
| 149613 | + pX = removeUnindexableInClauseTerms(pParse, iEq, pLoop, pX); |
| 149614 | + if( !db->mallocFailed ){ |
| 149615 | + aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*nEq); |
| 149616 | + eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap,&iTab); |
| 149617 | + pExpr->iTable = iTab; |
| 149618 | + } |
| 149619 | + sqlite3ExprDelete(db, pX); |
| 149620 | + }else{ |
| 149452 | 149621 | aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*nEq); |
| 149453 | | - eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap, &iTab); |
| 149454 | | - pTerm->pExpr->iTable = iTab; |
| 149622 | + eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP|IN_INDEX_REUSE_CUR, 0, aiMap,&iTab); |
| 149623 | + iTab = pExpr->iTable; |
| 149455 | 149624 | } |
| 149456 | | - sqlite3ExprDelete(db, pX); |
| 149457 | | - pX = pTerm->pExpr; |
| 149625 | + pX = pExpr; |
| 149458 | 149626 | } |
| 149459 | 149627 | |
| 149460 | 149628 | if( eType==IN_INDEX_INDEX_DESC ){ |
| 149461 | 149629 | testcase( bRev ); |
| 149462 | 149630 | bRev = !bRev; |
| | @@ -150079,16 +150247,16 @@ |
| 150079 | 150247 | ** that contains the value of pExpr. |
| 150080 | 150248 | */ |
| 150081 | 150249 | static int whereIndexExprTransNode(Walker *p, Expr *pExpr){ |
| 150082 | 150250 | IdxExprTrans *pX = p->u.pIdxTrans; |
| 150083 | 150251 | if( sqlite3ExprCompare(0, pExpr, pX->pIdxExpr, pX->iTabCur)==0 ){ |
| 150252 | + pExpr = sqlite3ExprSkipCollate(pExpr); |
| 150084 | 150253 | preserveExpr(pX, pExpr); |
| 150085 | 150254 | pExpr->affExpr = sqlite3ExprAffinity(pExpr); |
| 150086 | 150255 | pExpr->op = TK_COLUMN; |
| 150087 | 150256 | pExpr->iTable = pX->iIdxCur; |
| 150088 | 150257 | pExpr->iColumn = pX->iIdxCol; |
| 150089 | | - testcase( ExprHasProperty(pExpr, EP_Skip) ); |
| 150090 | 150258 | testcase( ExprHasProperty(pExpr, EP_Unlikely) ); |
| 150091 | 150259 | ExprClearProperty(pExpr, EP_Skip|EP_Unlikely|EP_WinFunc|EP_Subrtn); |
| 150092 | 150260 | pExpr->y.pTab = 0; |
| 150093 | 150261 | return WRC_Prune; |
| 150094 | 150262 | }else{ |
| | @@ -150238,10 +150406,12 @@ |
| 150238 | 150406 | if( pLevel->regFilter==0 ) continue; |
| 150239 | 150407 | if( pLevel->pWLoop->nSkip ) continue; |
| 150240 | 150408 | /* ,--- Because sqlite3ConstructBloomFilter() has will not have set |
| 150241 | 150409 | ** vvvvv--' pLevel->regFilter if this were true. */ |
| 150242 | 150410 | if( NEVER(pLoop->prereq & notReady) ) continue; |
| 150411 | + assert( pLevel->addrBrk==0 ); |
| 150412 | + pLevel->addrBrk = addrNxt; |
| 150243 | 150413 | if( pLoop->wsFlags & WHERE_IPK ){ |
| 150244 | 150414 | WhereTerm *pTerm = pLoop->aLTerm[0]; |
| 150245 | 150415 | int regRowid; |
| 150246 | 150416 | assert( pTerm!=0 ); |
| 150247 | 150417 | assert( pTerm->pExpr!=0 ); |
| | @@ -150264,10 +150434,11 @@ |
| 150264 | 150434 | sqlite3VdbeAddOp4Int(pParse->pVdbe, OP_Filter, pLevel->regFilter, |
| 150265 | 150435 | addrNxt, r1, nEq); |
| 150266 | 150436 | VdbeCoverage(pParse->pVdbe); |
| 150267 | 150437 | } |
| 150268 | 150438 | pLevel->regFilter = 0; |
| 150439 | + pLevel->addrBrk = 0; |
| 150269 | 150440 | } |
| 150270 | 150441 | } |
| 150271 | 150442 | |
| 150272 | 150443 | /* |
| 150273 | 150444 | ** Generate code for the start of the iLevel-th loop in the WHERE clause |
| | @@ -151444,11 +151615,11 @@ |
| 151444 | 151615 | continue; |
| 151445 | 151616 | } |
| 151446 | 151617 | pE = pTerm->pExpr; |
| 151447 | 151618 | assert( pE!=0 ); |
| 151448 | 151619 | if( (pTabItem->fg.jointype & (JT_LEFT|JT_LTORJ)) |
| 151449 | | - && !ExprHasProperty(pE,EP_FromJoin) |
| 151620 | + && !ExprHasProperty(pE,EP_FromJoin|EP_InnerJoin) |
| 151450 | 151621 | ){ |
| 151451 | 151622 | continue; |
| 151452 | 151623 | } |
| 151453 | 151624 | |
| 151454 | 151625 | if( iLoop==1 && !sqlite3ExprCoveredByIndex(pE, pLevel->iTabCur, pIdx) ){ |
| | @@ -153335,11 +153506,11 @@ |
| 153335 | 153506 | if( pOrderBy ){ |
| 153336 | 153507 | for(ii=0; ii<pOrderBy->nExpr; ii++){ |
| 153337 | 153508 | Expr *pExpr = pOrderBy->a[ii].pExpr; |
| 153338 | 153509 | if( pExpr->op!=TK_COLUMN ) return; |
| 153339 | 153510 | if( pExpr->iTable!=iCsr ) return; |
| 153340 | | - if( pOrderBy->a[ii].sortFlags & KEYINFO_ORDER_BIGNULL ) return; |
| 153511 | + if( pOrderBy->a[ii].fg.sortFlags & KEYINFO_ORDER_BIGNULL ) return; |
| 153341 | 153512 | } |
| 153342 | 153513 | } |
| 153343 | 153514 | |
| 153344 | 153515 | /* All conditions are met. Add the terms to the where-clause object. */ |
| 153345 | 153516 | assert( p->pLimit->op==TK_LIMIT ); |
| | @@ -154765,11 +154936,11 @@ |
| 154765 | 154936 | if( sqlite3ExprIsConstant(pExpr) ){ |
| 154766 | 154937 | continue; |
| 154767 | 154938 | } |
| 154768 | 154939 | |
| 154769 | 154940 | /* Virtual tables are unable to deal with NULLS FIRST */ |
| 154770 | | - if( pOrderBy->a[i].sortFlags & KEYINFO_ORDER_BIGNULL ) break; |
| 154941 | + if( pOrderBy->a[i].fg.sortFlags & KEYINFO_ORDER_BIGNULL ) break; |
| 154771 | 154942 | |
| 154772 | 154943 | /* First case - a direct column references without a COLLATE operator */ |
| 154773 | 154944 | if( pExpr->op==TK_COLUMN && pExpr->iTable==pSrc->iCursor ){ |
| 154774 | 154945 | assert( pExpr->iColumn>=XN_ROWID && pExpr->iColumn<pTab->nCol ); |
| 154775 | 154946 | continue; |
| | @@ -154877,11 +155048,11 @@ |
| 154877 | 155048 | if( sqlite3ExprIsConstant(pExpr) ) continue; |
| 154878 | 155049 | assert( pExpr->op==TK_COLUMN |
| 154879 | 155050 | || (pExpr->op==TK_COLLATE && pExpr->pLeft->op==TK_COLUMN |
| 154880 | 155051 | && pExpr->iColumn==pExpr->pLeft->iColumn) ); |
| 154881 | 155052 | pIdxOrderBy[j].iColumn = pExpr->iColumn; |
| 154882 | | - pIdxOrderBy[j].desc = pOrderBy->a[i].sortFlags & KEYINFO_ORDER_DESC; |
| 155053 | + pIdxOrderBy[j].desc = pOrderBy->a[i].fg.sortFlags & KEYINFO_ORDER_DESC; |
| 154883 | 155054 | j++; |
| 154884 | 155055 | } |
| 154885 | 155056 | pIdxInfo->nOrderBy = j; |
| 154886 | 155057 | |
| 154887 | 155058 | *pmNoOmit = mNoOmit; |
| | @@ -156395,11 +156566,11 @@ |
| 156395 | 156566 | /* tag-20191211-001: Do not allow constraints from the WHERE clause to |
| 156396 | 156567 | ** be used by the right table of a LEFT JOIN nor by the left table of a |
| 156397 | 156568 | ** RIGHT JOIN. Only constraints in the |
| 156398 | 156569 | ** ON clause are allowed. See tag-20191211-002 for the vtab equivalent. */ |
| 156399 | 156570 | if( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ))!=0 |
| 156400 | | - && !ExprHasProperty(pTerm->pExpr, EP_FromJoin) |
| 156571 | + && !ExprHasProperty(pTerm->pExpr, EP_FromJoin|EP_InnerJoin) |
| 156401 | 156572 | ){ |
| 156402 | 156573 | continue; |
| 156403 | 156574 | } |
| 156404 | 156575 | |
| 156405 | 156576 | if( IsUniqueIndex(pProbe) && saved_nEq==pProbe->nKeyCol-1 ){ |
| | @@ -157703,13 +157874,11 @@ |
| 157703 | 157874 | pBuilder->iPlanLimit += SQLITE_QUERY_PLANNER_LIMIT_INCR; |
| 157704 | 157875 | pNew->maskSelf = sqlite3WhereGetMask(&pWInfo->sMaskSet, pItem->iCursor); |
| 157705 | 157876 | if( (pItem->fg.jointype & (JT_OUTER|JT_CROSS))!=0 ){ |
| 157706 | 157877 | /* This condition is true when pItem is the FROM clause term on the |
| 157707 | 157878 | ** right-hand-side of a OUTER or CROSS JOIN. */ |
| 157708 | | - mPrereq = mPrior; |
| 157709 | | - }else{ |
| 157710 | | - mPrereq = 0; |
| 157879 | + mPrereq |= mPrior; |
| 157711 | 157880 | } |
| 157712 | 157881 | #ifndef SQLITE_OMIT_VIRTUALTABLE |
| 157713 | 157882 | if( IsVirtual(pItem->pTab) ){ |
| 157714 | 157883 | SrcItem *p; |
| 157715 | 157884 | for(p=&pItem[1]; p<pEnd; p++){ |
| | @@ -158016,20 +158185,22 @@ |
| 158016 | 158185 | } |
| 158017 | 158186 | if( isMatch && (wctrlFlags & WHERE_GROUPBY)==0 ){ |
| 158018 | 158187 | /* Make sure the sort order is compatible in an ORDER BY clause. |
| 158019 | 158188 | ** Sort order is irrelevant for a GROUP BY clause. */ |
| 158020 | 158189 | if( revSet ){ |
| 158021 | | - if( (rev ^ revIdx)!=(pOrderBy->a[i].sortFlags&KEYINFO_ORDER_DESC) ){ |
| 158190 | + if( (rev ^ revIdx) |
| 158191 | + != (pOrderBy->a[i].fg.sortFlags&KEYINFO_ORDER_DESC) |
| 158192 | + ){ |
| 158022 | 158193 | isMatch = 0; |
| 158023 | 158194 | } |
| 158024 | 158195 | }else{ |
| 158025 | | - rev = revIdx ^ (pOrderBy->a[i].sortFlags & KEYINFO_ORDER_DESC); |
| 158196 | + rev = revIdx ^ (pOrderBy->a[i].fg.sortFlags & KEYINFO_ORDER_DESC); |
| 158026 | 158197 | if( rev ) *pRevMask |= MASKBIT(iLoop); |
| 158027 | 158198 | revSet = 1; |
| 158028 | 158199 | } |
| 158029 | 158200 | } |
| 158030 | | - if( isMatch && (pOrderBy->a[i].sortFlags & KEYINFO_ORDER_BIGNULL) ){ |
| 158201 | + if( isMatch && (pOrderBy->a[i].fg.sortFlags & KEYINFO_ORDER_BIGNULL) ){ |
| 158031 | 158202 | if( j==pLoop->u.btree.nEq ){ |
| 158032 | 158203 | pLoop->wsFlags |= WHERE_BIGNULL_SORT; |
| 158033 | 158204 | }else{ |
| 158034 | 158205 | isMatch = 0; |
| 158035 | 158206 | } |
| | @@ -160789,11 +160960,11 @@ |
| 160789 | 160960 | pSub->flags &= ~(EP_IntValue|EP_IsTrue|EP_IsFalse); |
| 160790 | 160961 | pSub->u.zToken = 0; |
| 160791 | 160962 | } |
| 160792 | 160963 | } |
| 160793 | 160964 | pList = sqlite3ExprListAppend(pParse, pList, pDup); |
| 160794 | | - if( pList ) pList->a[nInit+i].sortFlags = pAppend->a[i].sortFlags; |
| 160965 | + if( pList ) pList->a[nInit+i].fg.sortFlags = pAppend->a[i].fg.sortFlags; |
| 160795 | 160966 | } |
| 160796 | 160967 | } |
| 160797 | 160968 | return pList; |
| 160798 | 160969 | } |
| 160799 | 160970 | |
| | @@ -161990,11 +162161,11 @@ |
| 161990 | 162161 | windowReadPeerValues(p, csr1, reg1); |
| 161991 | 162162 | windowReadPeerValues(p, csr2, reg2); |
| 161992 | 162163 | |
| 161993 | 162164 | assert( op==OP_Ge || op==OP_Gt || op==OP_Le ); |
| 161994 | 162165 | assert( pOrderBy && pOrderBy->nExpr==1 ); |
| 161995 | | - if( pOrderBy->a[0].sortFlags & KEYINFO_ORDER_DESC ){ |
| 162166 | + if( pOrderBy->a[0].fg.sortFlags & KEYINFO_ORDER_DESC ){ |
| 161996 | 162167 | switch( op ){ |
| 161997 | 162168 | case OP_Ge: op = OP_Le; break; |
| 161998 | 162169 | case OP_Gt: op = OP_Lt; break; |
| 161999 | 162170 | default: assert( op==OP_Le ); op = OP_Ge; break; |
| 162000 | 162171 | } |
| | @@ -162023,11 +162194,11 @@ |
| 162023 | 162194 | ** } |
| 162024 | 162195 | ** |
| 162025 | 162196 | ** Additionally, if either reg1 or reg2 are NULL but the jump to lbl is |
| 162026 | 162197 | ** not taken, control jumps over the comparison operator coded below this |
| 162027 | 162198 | ** block. */ |
| 162028 | | - if( pOrderBy->a[0].sortFlags & KEYINFO_ORDER_BIGNULL ){ |
| 162199 | + if( pOrderBy->a[0].fg.sortFlags & KEYINFO_ORDER_BIGNULL ){ |
| 162029 | 162200 | /* This block runs if reg1 contains a NULL. */ |
| 162030 | 162201 | int addr = sqlite3VdbeAddOp1(v, OP_NotNull, reg1); VdbeCoverage(v); |
| 162031 | 162202 | switch( op ){ |
| 162032 | 162203 | case OP_Ge: |
| 162033 | 162204 | sqlite3VdbeAddOp2(v, OP_Goto, 0, lbl); |
| | @@ -226807,11 +226978,11 @@ |
| 226807 | 226978 | /* State used by the fts5DataXXX() functions. */ |
| 226808 | 226979 | sqlite3_blob *pReader; /* RO incr-blob open on %_data table */ |
| 226809 | 226980 | sqlite3_stmt *pWriter; /* "INSERT ... %_data VALUES(?,?)" */ |
| 226810 | 226981 | sqlite3_stmt *pDeleter; /* "DELETE FROM %_data ... id>=? AND id<=?" */ |
| 226811 | 226982 | sqlite3_stmt *pIdxWriter; /* "INSERT ... %_idx VALUES(?,?,?,?)" */ |
| 226812 | | - sqlite3_stmt *pIdxDeleter; /* "DELETE FROM %_idx WHERE segid=? */ |
| 226983 | + sqlite3_stmt *pIdxDeleter; /* "DELETE FROM %_idx WHERE segid=?" */ |
| 226813 | 226984 | sqlite3_stmt *pIdxSelect; |
| 226814 | 226985 | int nRead; /* Total number of blocks read */ |
| 226815 | 226986 | |
| 226816 | 226987 | sqlite3_stmt *pDataVersion; |
| 226817 | 226988 | i64 iStructVersion; /* data_version when pStruct read */ |
| | @@ -236124,11 +236295,11 @@ |
| 236124 | 236295 | int nArg, /* Number of args */ |
| 236125 | 236296 | sqlite3_value **apUnused /* Function arguments */ |
| 236126 | 236297 | ){ |
| 236127 | 236298 | assert( nArg==0 ); |
| 236128 | 236299 | UNUSED_PARAM2(nArg, apUnused); |
| 236129 | | - sqlite3_result_text(pCtx, "fts5: 2022-04-26 19:16:11 b1bec72043f798f4d4d30e6b60a45ed4dc521115c8a9f97bb8228e3f089deefb", -1, SQLITE_TRANSIENT); |
| 236300 | + sqlite3_result_text(pCtx, "fts5: 2022-05-10 00:24:01 c6c3115f3a008cf9b0d7c5c812f17e38c8a75a904032c5f05f0bea03a7340527", -1, SQLITE_TRANSIENT); |
| 236130 | 236301 | } |
| 236131 | 236302 | |
| 236132 | 236303 | /* |
| 236133 | 236304 | ** Return true if zName is the extension on one of the shadow tables used |
| 236134 | 236305 | ** by this module. |
| 236135 | 236306 | |