Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Remove unused fields from KeyInfo. Enhancement the EXPLAIN output for KeyInfo P4 columns. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
9eb585660bddd136ce69562cc5d8b655 |
User & Date: | drh 2013-07-26 21:13:39.693 |
Context
2013-07-27
| ||
18:52 | Fixes for sqlite_stat3 related functionality. Also EXPLAIN QUERY PLAN. check-in: 2fbe583868 user: dan tags: trunk | |
2013-07-26
| ||
21:13 | Remove unused fields from KeyInfo. Enhancement the EXPLAIN output for KeyInfo P4 columns. check-in: 9eb585660b user: drh tags: trunk | |
20:04 | Update where.c with patches from sqlite3. src4 where.c is now based on sqlite3 artifact 1a26c37b7b. check-in: 3f4a1c7648 user: dan tags: trunk | |
Changes
Changes to src/build.c.
︙ | ︙ | |||
3805 3806 3807 3808 3809 3810 3811 | pPk = sqlite4FindPrimaryKey(pIdx->pTable, 0); } nCol = pIdx->nColumn + (pPk ? pPk->nColumn : 0); nBytes = sizeof(KeyInfo) + (nCol-1)*sizeof(CollSeq*) + nCol; pKey = (KeyInfo *)sqlite4DbMallocZero(db, nBytes); if( pKey ){ | < | 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 | pPk = sqlite4FindPrimaryKey(pIdx->pTable, 0); } nCol = pIdx->nColumn + (pPk ? pPk->nColumn : 0); nBytes = sizeof(KeyInfo) + (nCol-1)*sizeof(CollSeq*) + nCol; pKey = (KeyInfo *)sqlite4DbMallocZero(db, nBytes); if( pKey ){ pKey->aSortOrder = (u8 *)&(pKey->aColl[nCol]); assert( &pKey->aSortOrder[nCol]==&(((u8 *)pKey)[nBytes]) ); for(i=0; i<pIdx->nColumn; i++){ char *zColl = pIdx->azColl[i]; assert( zColl ); pKey->aColl[i] = sqlite4LocateCollSeq(pParse, zColl); |
︙ | ︙ |
Changes to src/select.c.
︙ | ︙ | |||
805 806 807 808 809 810 811 | pInfo = (KeyInfo *)sqlite4DbMallocZero(db, nByte); if( pInfo ){ int i; /* Used to iterate through pList */ pInfo->aSortOrder = (u8*)&pInfo->aColl[nField]; pInfo->nField = (u16)nField; | < < | 805 806 807 808 809 810 811 812 813 814 815 816 817 818 | pInfo = (KeyInfo *)sqlite4DbMallocZero(db, nByte); if( pInfo ){ int i; /* Used to iterate through pList */ pInfo->aSortOrder = (u8*)&pInfo->aColl[nField]; pInfo->nField = (u16)nField; for(i=0; i<pList->nExpr; i++){ CollSeq *pColl; pColl = sqlite4ExprCollSeq(pParse, pList->a[i].pExpr); if( !pColl ) pColl = db->pDfltColl; pInfo->aColl[i] = pColl; pInfo->aSortOrder[i] = pList->a[i].sortOrder; |
︙ | ︙ | |||
1887 1888 1889 1890 1891 1892 1893 | pKeyInfo = sqlite4DbMallocZero(db, sizeof(*pKeyInfo)+nCol*(sizeof(CollSeq*) + 1)); if( !pKeyInfo ){ rc = SQLITE4_NOMEM; goto multi_select_end; } | < | 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 | pKeyInfo = sqlite4DbMallocZero(db, sizeof(*pKeyInfo)+nCol*(sizeof(CollSeq*) + 1)); if( !pKeyInfo ){ rc = SQLITE4_NOMEM; goto multi_select_end; } pKeyInfo->nField = (u16)nCol; for(i=0, apColl=pKeyInfo->aColl; i<nCol; i++, apColl++){ *apColl = multiSelectCollSeq(pParse, p, i); if( 0==*apColl ){ *apColl = db->pDfltColl; } |
︙ | ︙ | |||
2272 2273 2274 2275 2276 2277 2278 | aPermute[i] = pItem->iOrderByCol - 1; } pKeyMerge = sqlite4DbMallocRaw(db, sizeof(*pKeyMerge)+nOrderBy*(sizeof(CollSeq*)+1)); if( pKeyMerge ){ pKeyMerge->aSortOrder = (u8*)&pKeyMerge->aColl[nOrderBy]; pKeyMerge->nField = (u16)nOrderBy; | < | 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 | aPermute[i] = pItem->iOrderByCol - 1; } pKeyMerge = sqlite4DbMallocRaw(db, sizeof(*pKeyMerge)+nOrderBy*(sizeof(CollSeq*)+1)); if( pKeyMerge ){ pKeyMerge->aSortOrder = (u8*)&pKeyMerge->aColl[nOrderBy]; pKeyMerge->nField = (u16)nOrderBy; for(i=0; i<nOrderBy; i++){ CollSeq *pColl; Expr *pTerm = pOrderBy->a[i].pExpr; if( pTerm->flags & EP_ExpCollate ){ pColl = pTerm->pColl; }else{ pColl = multiSelectCollSeq(pParse, p, aPermute[i]); |
︙ | ︙ | |||
2313 2314 2315 2316 2317 2318 2319 | pParse->nMem += nExpr + 1; sqlite4VdbeAddOp2(v, OP_Integer, 0, regPrev); pKeyDup = sqlite4DbMallocZero(db, sizeof(*pKeyDup) + nExpr*(sizeof(CollSeq*)+1) ); if( pKeyDup ){ pKeyDup->aSortOrder = (u8*)&pKeyDup->aColl[nExpr]; pKeyDup->nField = (u16)nExpr; | < | 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 | pParse->nMem += nExpr + 1; sqlite4VdbeAddOp2(v, OP_Integer, 0, regPrev); pKeyDup = sqlite4DbMallocZero(db, sizeof(*pKeyDup) + nExpr*(sizeof(CollSeq*)+1) ); if( pKeyDup ){ pKeyDup->aSortOrder = (u8*)&pKeyDup->aColl[nExpr]; pKeyDup->nField = (u16)nExpr; for(i=0; i<nExpr; i++){ pKeyDup->aColl[i] = multiSelectCollSeq(pParse, p, i); pKeyDup->aSortOrder[i] = 0; } } } |
︙ | ︙ |
Changes to src/sqliteInt.h.
︙ | ︙ | |||
1314 1315 1316 1317 1318 1319 1320 | /* ** An instance of the following structure describes an index key. It ** includes information such as sort order and collating sequence for ** each key, and the number of primary key fields appended to the end. */ struct KeyInfo { | < < | 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 | /* ** An instance of the following structure describes an index key. It ** includes information such as sort order and collating sequence for ** each key, and the number of primary key fields appended to the end. */ struct KeyInfo { u16 nField; /* Total number of entries in aColl[] */ u16 nPK; /* Number of primary key entries at the end of aColl[] */ u16 nData; /* Number of columns of data in KV entry value */ u8 *aSortOrder; /* Sort order for each column. May be NULL */ CollSeq *aColl[1]; /* Collating sequence for each term of the key */ }; |
︙ | ︙ |
Changes to src/vdbe.c.
︙ | ︙ | |||
2733 2734 2735 2736 2737 2738 2739 | if( NEVER(p2<2) ) { rc = SQLITE4_CORRUPT_BKPT; goto abort_due_to_error; } } if( pOp->p4type==P4_KEYINFO ){ pKeyInfo = pOp->p4.pKeyInfo; | < | 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 | if( NEVER(p2<2) ) { rc = SQLITE4_CORRUPT_BKPT; goto abort_due_to_error; } } if( pOp->p4type==P4_KEYINFO ){ pKeyInfo = pOp->p4.pKeyInfo; nField = pKeyInfo->nField+1; }else if( pOp->p4type==P4_INT32 ){ nField = pOp->p4.i; } assert( pOp->p1>=0 ); pCur = allocateCursor(p, pOp->p1, nField, iDb, 1); if( pCur==0 ) goto no_mem; |
︙ | ︙ | |||
2794 2795 2796 2797 2798 2799 2800 | rc = sqlite4KVStoreOpen(db, "ephm", 0, &pCx->pTmpKV, SQLITE4_KVOPEN_TEMPORARY | SQLITE4_KVOPEN_NO_TRANSACTIONS ); if( rc==SQLITE4_OK ) rc = sqlite4KVStoreOpenCursor(pCx->pTmpKV, &pCx->pKVCur); if( rc==SQLITE4_OK ) rc = sqlite4KVStoreBegin(pCx->pTmpKV, 2); pCx->pKeyInfo = pOp->p4.pKeyInfo; | < | 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 | rc = sqlite4KVStoreOpen(db, "ephm", 0, &pCx->pTmpKV, SQLITE4_KVOPEN_TEMPORARY | SQLITE4_KVOPEN_NO_TRANSACTIONS ); if( rc==SQLITE4_OK ) rc = sqlite4KVStoreOpenCursor(pCx->pTmpKV, &pCx->pKVCur); if( rc==SQLITE4_OK ) rc = sqlite4KVStoreBegin(pCx->pTmpKV, 2); pCx->pKeyInfo = pOp->p4.pKeyInfo; break; } /* Opcode: OpenSorter P1 P2 * P4 * ** ** This opcode works like OP_OpenEphemeral except that it opens |
︙ | ︙ |
Changes to src/vdbeaux.c.
︙ | ︙ | |||
848 849 850 851 852 853 854 | char *zP4 = zTemp; assert( nTemp>=30 ); switch( pOp->p4type ){ case P4_KEYINFO_STATIC: case P4_KEYINFO: { int i, j; KeyInfo *pKeyInfo = pOp->p4.pKeyInfo; | | > > | 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 | char *zP4 = zTemp; assert( nTemp>=30 ); switch( pOp->p4type ){ case P4_KEYINFO_STATIC: case P4_KEYINFO: { int i, j; KeyInfo *pKeyInfo = pOp->p4.pKeyInfo; i = sqlite4_snprintf(zTemp, nTemp, "keyinfo(%d,%d,%d", pKeyInfo->nField, pKeyInfo->nPK, pKeyInfo->nData); for(j=0; j<pKeyInfo->nField; j++){ CollSeq *pColl = pKeyInfo->aColl[j]; if( pColl ){ int n = sqlite4Strlen30(pColl->zName); if( i+n>nTemp-6 ){ memcpy(&zTemp[i],",...",4); break; |
︙ | ︙ | |||
957 958 959 960 961 962 963 | #if defined(VDBE_PROFILE) || defined(SQLITE4_DEBUG) /* ** Print a single opcode. This routine is used for debugging only. */ void sqlite4VdbePrintOp(FILE *pOut, int pc, Op *pOp){ char *zP4; | | | 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 | #if defined(VDBE_PROFILE) || defined(SQLITE4_DEBUG) /* ** Print a single opcode. This routine is used for debugging only. */ void sqlite4VdbePrintOp(FILE *pOut, int pc, Op *pOp){ char *zP4; char zPtr[150]; static const char *zFormat1 = "%4d %-13s %4d %4d %4d %-4s %.2X %s\n"; if( pOut==0 ) pOut = stdout; zP4 = displayP4(pOp, zPtr, sizeof(zPtr)); fprintf(pOut, zFormat1, pc, sqlite4OpcodeName(pOp->opcode), pOp->p1, pOp->p2, pOp->p3, zP4, pOp->p5, #ifdef SQLITE4_DEBUG pOp->zComment ? pOp->zComment : "" |
︙ | ︙ |