| | @@ -325,11 +325,11 @@ |
| 325 | 325 | ** [sqlite3_libversion_number()], [sqlite3_sourceid()], |
| 326 | 326 | ** [sqlite_version()] and [sqlite_source_id()]. |
| 327 | 327 | */ |
| 328 | 328 | #define SQLITE_VERSION "3.10.0" |
| 329 | 329 | #define SQLITE_VERSION_NUMBER 3010000 |
| 330 | | -#define SQLITE_SOURCE_ID "2015-12-24 14:53:27 7c7b7f26306b6aa6ff35b871ad756f43f5db9838" |
| 330 | +#define SQLITE_SOURCE_ID "2015-12-31 15:34:03 9c392c1019ee15f27c8e05b41246d2844f91f6c0" |
| 331 | 331 | |
| 332 | 332 | /* |
| 333 | 333 | ** CAPI3REF: Run-Time Library Version Numbers |
| 334 | 334 | ** KEYWORDS: sqlite3_version, sqlite3_sourceid |
| 335 | 335 | ** |
| | @@ -12317,11 +12317,11 @@ |
| 12317 | 12317 | char *zDflt; /* Original text of the default value */ |
| 12318 | 12318 | char *zType; /* Data type for this column */ |
| 12319 | 12319 | char *zColl; /* Collating sequence. If NULL, use the default */ |
| 12320 | 12320 | u8 notNull; /* An OE_ code for handling a NOT NULL constraint */ |
| 12321 | 12321 | char affinity; /* One of the SQLITE_AFF_... values */ |
| 12322 | | - u8 szEst; /* Estimated size of this column. INT==1 */ |
| 12322 | + u8 szEst; /* Estimated size of value in this column. sizeof(INT)==1 */ |
| 12323 | 12323 | u8 colFlags; /* Boolean properties. See COLFLAG_ defines below */ |
| 12324 | 12324 | }; |
| 12325 | 12325 | |
| 12326 | 12326 | /* Allowed values for Column.colFlags: |
| 12327 | 12327 | */ |
| | @@ -12727,11 +12727,11 @@ |
| 12727 | 12727 | Table *pTable; /* The SQL table being indexed */ |
| 12728 | 12728 | char *zColAff; /* String defining the affinity of each column */ |
| 12729 | 12729 | Index *pNext; /* The next index associated with the same table */ |
| 12730 | 12730 | Schema *pSchema; /* Schema containing this index */ |
| 12731 | 12731 | u8 *aSortOrder; /* for each column: True==DESC, False==ASC */ |
| 12732 | | - char **azColl; /* Array of collation sequence names for index */ |
| 12732 | + const char **azColl; /* Array of collation sequence names for index */ |
| 12733 | 12733 | Expr *pPartIdxWhere; /* WHERE clause for partial indices */ |
| 12734 | 12734 | ExprList *aColExpr; /* Column expressions */ |
| 12735 | 12735 | int tnum; /* DB Page containing root of this index */ |
| 12736 | 12736 | LogEst szIdxRow; /* Estimated average row size in bytes */ |
| 12737 | 12737 | u16 nKeyCol; /* Number of columns forming the key */ |
| | @@ -14143,11 +14143,15 @@ |
| 14143 | 14143 | SQLITE_PRIVATE Table *sqlite3ResultSetOfSelect(Parse*,Select*); |
| 14144 | 14144 | SQLITE_PRIVATE void sqlite3OpenMasterTable(Parse *, int); |
| 14145 | 14145 | SQLITE_PRIVATE Index *sqlite3PrimaryKeyIndex(Table*); |
| 14146 | 14146 | SQLITE_PRIVATE i16 sqlite3ColumnOfIndex(Index*, i16); |
| 14147 | 14147 | SQLITE_PRIVATE void sqlite3StartTable(Parse*,Token*,Token*,int,int,int,int); |
| 14148 | | -SQLITE_PRIVATE void sqlite3ColumnPropertiesFromName(Table*, Column*); |
| 14148 | +#if SQLITE_ENABLE_HIDDEN_COLUMNS |
| 14149 | +SQLITE_PRIVATE void sqlite3ColumnPropertiesFromName(Table*, Column*); |
| 14150 | +#else |
| 14151 | +# define sqlite3ColumnPropertiesFromName(T,C) /* no-op */ |
| 14152 | +#endif |
| 14149 | 14153 | SQLITE_PRIVATE void sqlite3AddColumn(Parse*,Token*); |
| 14150 | 14154 | SQLITE_PRIVATE void sqlite3AddNotNull(Parse*, int); |
| 14151 | 14155 | SQLITE_PRIVATE void sqlite3AddPrimaryKey(Parse*, ExprList*, int, int, int); |
| 14152 | 14156 | SQLITE_PRIVATE void sqlite3AddCheckConstraint(Parse*, Expr*); |
| 14153 | 14157 | SQLITE_PRIVATE void sqlite3AddColumnType(Parse*,Token*); |
| | @@ -14494,10 +14498,11 @@ |
| 14494 | 14498 | SQLITE_PRIVATE char *sqlite3Utf16to8(sqlite3 *, const void*, int, u8); |
| 14495 | 14499 | SQLITE_PRIVATE int sqlite3ValueFromExpr(sqlite3 *, Expr *, u8, u8, sqlite3_value **); |
| 14496 | 14500 | SQLITE_PRIVATE void sqlite3ValueApplyAffinity(sqlite3_value *, u8, u8); |
| 14497 | 14501 | #ifndef SQLITE_AMALGAMATION |
| 14498 | 14502 | SQLITE_PRIVATE const unsigned char sqlite3OpcodeProperty[]; |
| 14503 | +SQLITE_PRIVATE const char sqlite3StrBINARY[]; |
| 14499 | 14504 | SQLITE_PRIVATE const unsigned char sqlite3UpperToLower[]; |
| 14500 | 14505 | SQLITE_PRIVATE const unsigned char sqlite3CtypeMap[]; |
| 14501 | 14506 | SQLITE_PRIVATE const Token sqlite3IntTokens[]; |
| 14502 | 14507 | SQLITE_PRIVATE SQLITE_WSD struct Sqlite3Config sqlite3Config; |
| 14503 | 14508 | SQLITE_PRIVATE SQLITE_WSD FuncDefHash sqlite3GlobalFunctions; |
| | @@ -15099,10 +15104,15 @@ |
| 15099 | 15104 | ** from the comments following the "case OP_xxxx:" statements in |
| 15100 | 15105 | ** the vdbe.c file. |
| 15101 | 15106 | */ |
| 15102 | 15107 | SQLITE_PRIVATE const unsigned char sqlite3OpcodeProperty[] = OPFLG_INITIALIZER; |
| 15103 | 15108 | |
| 15109 | +/* |
| 15110 | +** Name of the default collating sequence |
| 15111 | +*/ |
| 15112 | +SQLITE_PRIVATE const char sqlite3StrBINARY[] = "BINARY"; |
| 15113 | + |
| 15104 | 15114 | /************** End of global.c **********************************************/ |
| 15105 | 15115 | /************** Begin file ctime.c *******************************************/ |
| 15106 | 15116 | /* |
| 15107 | 15117 | ** 2010 February 23 |
| 15108 | 15118 | ** |
| | @@ -54551,11 +54561,10 @@ |
| 54551 | 54561 | struct CellInfo { |
| 54552 | 54562 | i64 nKey; /* The key for INTKEY tables, or nPayload otherwise */ |
| 54553 | 54563 | u8 *pPayload; /* Pointer to the start of payload */ |
| 54554 | 54564 | u32 nPayload; /* Bytes of payload */ |
| 54555 | 54565 | u16 nLocal; /* Amount of payload held locally, not on overflow */ |
| 54556 | | - u16 iOverflow; /* Offset to overflow page number. Zero if no overflow */ |
| 54557 | 54566 | u16 nSize; /* Size of the cell content on the main b-tree page */ |
| 54558 | 54567 | }; |
| 54559 | 54568 | |
| 54560 | 54569 | /* |
| 54561 | 54570 | ** Maximum depth of an SQLite B-Tree structure. Any B-Tree deeper than |
| | @@ -56132,12 +56141,11 @@ |
| 56132 | 56141 | if( surplus <= maxLocal ){ |
| 56133 | 56142 | pInfo->nLocal = (u16)surplus; |
| 56134 | 56143 | }else{ |
| 56135 | 56144 | pInfo->nLocal = (u16)minLocal; |
| 56136 | 56145 | } |
| 56137 | | - pInfo->iOverflow = (u16)(&pInfo->pPayload[pInfo->nLocal] - pCell); |
| 56138 | | - pInfo->nSize = pInfo->iOverflow + 4; |
| 56146 | + pInfo->nSize = (u16)(&pInfo->pPayload[pInfo->nLocal] - pCell) + 4; |
| 56139 | 56147 | } |
| 56140 | 56148 | |
| 56141 | 56149 | /* |
| 56142 | 56150 | ** The following routines are implementations of the MemPage.xParseCell() |
| 56143 | 56151 | ** method. |
| | @@ -56165,11 +56173,10 @@ |
| 56165 | 56173 | UNUSED_PARAMETER(pPage); |
| 56166 | 56174 | #endif |
| 56167 | 56175 | pInfo->nSize = 4 + getVarint(&pCell[4], (u64*)&pInfo->nKey); |
| 56168 | 56176 | pInfo->nPayload = 0; |
| 56169 | 56177 | pInfo->nLocal = 0; |
| 56170 | | - pInfo->iOverflow = 0; |
| 56171 | 56178 | pInfo->pPayload = 0; |
| 56172 | 56179 | return; |
| 56173 | 56180 | } |
| 56174 | 56181 | static void btreeParseCellPtr( |
| 56175 | 56182 | MemPage *pPage, /* Page containing the cell */ |
| | @@ -56235,11 +56242,10 @@ |
| 56235 | 56242 | ** on the local page. No overflow is required. |
| 56236 | 56243 | */ |
| 56237 | 56244 | pInfo->nSize = nPayload + (u16)(pIter - pCell); |
| 56238 | 56245 | if( pInfo->nSize<4 ) pInfo->nSize = 4; |
| 56239 | 56246 | pInfo->nLocal = (u16)nPayload; |
| 56240 | | - pInfo->iOverflow = 0; |
| 56241 | 56247 | }else{ |
| 56242 | 56248 | btreeParseCellAdjustSizeForOverflow(pPage, pCell, pInfo); |
| 56243 | 56249 | } |
| 56244 | 56250 | } |
| 56245 | 56251 | static void btreeParseCellPtrIndex( |
| | @@ -56274,11 +56280,10 @@ |
| 56274 | 56280 | ** on the local page. No overflow is required. |
| 56275 | 56281 | */ |
| 56276 | 56282 | pInfo->nSize = nPayload + (u16)(pIter - pCell); |
| 56277 | 56283 | if( pInfo->nSize<4 ) pInfo->nSize = 4; |
| 56278 | 56284 | pInfo->nLocal = (u16)nPayload; |
| 56279 | | - pInfo->iOverflow = 0; |
| 56280 | 56285 | }else{ |
| 56281 | 56286 | btreeParseCellAdjustSizeForOverflow(pPage, pCell, pInfo); |
| 56282 | 56287 | } |
| 56283 | 56288 | } |
| 56284 | 56289 | static void btreeParseCell( |
| | @@ -56390,12 +56395,12 @@ |
| 56390 | 56395 | static void ptrmapPutOvflPtr(MemPage *pPage, u8 *pCell, int *pRC){ |
| 56391 | 56396 | CellInfo info; |
| 56392 | 56397 | if( *pRC ) return; |
| 56393 | 56398 | assert( pCell!=0 ); |
| 56394 | 56399 | pPage->xParseCell(pPage, pCell, &info); |
| 56395 | | - if( info.iOverflow ){ |
| 56396 | | - Pgno ovfl = get4byte(&pCell[info.iOverflow]); |
| 56400 | + if( info.nLocal<info.nPayload ){ |
| 56401 | + Pgno ovfl = get4byte(&pCell[info.nSize-4]); |
| 56397 | 56402 | ptrmapPut(pPage->pBt, ovfl, PTRMAP_OVERFLOW1, pPage->pgno, pRC); |
| 56398 | 56403 | } |
| 56399 | 56404 | } |
| 56400 | 56405 | #endif |
| 56401 | 56406 | |
| | @@ -58429,15 +58434,15 @@ |
| 58429 | 58434 | for(i=0; i<nCell; i++){ |
| 58430 | 58435 | u8 *pCell = findCell(pPage, i); |
| 58431 | 58436 | if( eType==PTRMAP_OVERFLOW1 ){ |
| 58432 | 58437 | CellInfo info; |
| 58433 | 58438 | pPage->xParseCell(pPage, pCell, &info); |
| 58434 | | - if( info.iOverflow |
| 58435 | | - && pCell+info.iOverflow+3<=pPage->aData+pPage->maskPage |
| 58436 | | - && iFrom==get4byte(&pCell[info.iOverflow]) |
| 58439 | + if( info.nLocal<info.nPayload |
| 58440 | + && pCell+info.nSize-1<=pPage->aData+pPage->maskPage |
| 58441 | + && iFrom==get4byte(pCell+info.nSize-4) |
| 58437 | 58442 | ){ |
| 58438 | | - put4byte(&pCell[info.iOverflow], iTo); |
| 58443 | + put4byte(pCell+info.nSize-4, iTo); |
| 58439 | 58444 | break; |
| 58440 | 58445 | } |
| 58441 | 58446 | }else{ |
| 58442 | 58447 | if( get4byte(pCell)==iFrom ){ |
| 58443 | 58448 | put4byte(pCell, iTo); |
| | @@ -61075,17 +61080,17 @@ |
| 61075 | 61080 | u32 ovflPageSize; |
| 61076 | 61081 | |
| 61077 | 61082 | assert( sqlite3_mutex_held(pPage->pBt->mutex) ); |
| 61078 | 61083 | pPage->xParseCell(pPage, pCell, &info); |
| 61079 | 61084 | *pnSize = info.nSize; |
| 61080 | | - if( info.iOverflow==0 ){ |
| 61085 | + if( info.nLocal==info.nPayload ){ |
| 61081 | 61086 | return SQLITE_OK; /* No overflow pages. Return without doing anything */ |
| 61082 | 61087 | } |
| 61083 | | - if( pCell+info.iOverflow+3 > pPage->aData+pPage->maskPage ){ |
| 61088 | + if( pCell+info.nSize-1 > pPage->aData+pPage->maskPage ){ |
| 61084 | 61089 | return SQLITE_CORRUPT_BKPT; /* Cell extends past end of page */ |
| 61085 | 61090 | } |
| 61086 | | - ovflPgno = get4byte(&pCell[info.iOverflow]); |
| 61091 | + ovflPgno = get4byte(pCell + info.nSize - 4); |
| 61087 | 61092 | assert( pBt->usableSize > 4 ); |
| 61088 | 61093 | ovflPageSize = pBt->usableSize - 4; |
| 61089 | 61094 | nOvfl = (info.nPayload - info.nLocal + ovflPageSize - 1)/ovflPageSize; |
| 61090 | 61095 | assert( nOvfl>0 || |
| 61091 | 61096 | (CORRUPT_DB && (info.nPayload + ovflPageSize)<ovflPageSize) |
| | @@ -61230,11 +61235,10 @@ |
| 61230 | 61235 | pPage->xParseCell(pPage, pCell, &info); |
| 61231 | 61236 | assert( nHeader=(int)(info.pPayload - pCell) ); |
| 61232 | 61237 | assert( info.nKey==nKey ); |
| 61233 | 61238 | assert( *pnSize == info.nSize ); |
| 61234 | 61239 | assert( spaceLeft == info.nLocal ); |
| 61235 | | - assert( pPrior == &pCell[info.iOverflow] ); |
| 61236 | 61240 | } |
| 61237 | 61241 | #endif |
| 61238 | 61242 | |
| 61239 | 61243 | /* Write the payload into the local Cell and any extra into overflow pages */ |
| 61240 | 61244 | while( nPayload>0 ){ |
| | @@ -61940,12 +61944,12 @@ |
| 61940 | 61944 | CellInfo info; |
| 61941 | 61945 | u8 *z; |
| 61942 | 61946 | |
| 61943 | 61947 | z = findCell(pPage, j); |
| 61944 | 61948 | pPage->xParseCell(pPage, z, &info); |
| 61945 | | - if( info.iOverflow ){ |
| 61946 | | - Pgno ovfl = get4byte(&z[info.iOverflow]); |
| 61949 | + if( info.nLocal<info.nPayload ){ |
| 61950 | + Pgno ovfl = get4byte(&z[info.nSize-4]); |
| 61947 | 61951 | ptrmapGet(pBt, ovfl, &e, &n); |
| 61948 | 61952 | assert( n==pPage->pgno && e==PTRMAP_OVERFLOW1 ); |
| 61949 | 61953 | } |
| 61950 | 61954 | if( !pPage->leaf ){ |
| 61951 | 61955 | Pgno child = get4byte(z); |
| | @@ -64247,13 +64251,13 @@ |
| 64247 | 64251 | |
| 64248 | 64252 | /* Check the content overflow list */ |
| 64249 | 64253 | if( info.nPayload>info.nLocal ){ |
| 64250 | 64254 | int nPage; /* Number of pages on the overflow chain */ |
| 64251 | 64255 | Pgno pgnoOvfl; /* First page of the overflow chain */ |
| 64252 | | - assert( pc + info.iOverflow <= usableSize ); |
| 64256 | + assert( pc + info.nSize - 4 <= usableSize ); |
| 64253 | 64257 | nPage = (info.nPayload - info.nLocal + usableSize - 5)/(usableSize - 4); |
| 64254 | | - pgnoOvfl = get4byte(&pCell[info.iOverflow]); |
| 64258 | + pgnoOvfl = get4byte(&pCell[info.nSize - 4]); |
| 64255 | 64259 | #ifndef SQLITE_OMIT_AUTOVACUUM |
| 64256 | 64260 | if( pBt->autoVacuum ){ |
| 64257 | 64261 | checkPtrmap(pCheck, pgnoOvfl, PTRMAP_OVERFLOW1, iPage); |
| 64258 | 64262 | } |
| 64259 | 64263 | #endif |
| | @@ -71031,11 +71035,11 @@ |
| 71031 | 71035 | } |
| 71032 | 71036 | if( (f2 & MEM_Str)==0 ){ |
| 71033 | 71037 | return -1; |
| 71034 | 71038 | } |
| 71035 | 71039 | |
| 71036 | | - assert( pMem1->enc==pMem2->enc ); |
| 71040 | + assert( pMem1->enc==pMem2->enc || pMem1->db->mallocFailed ); |
| 71037 | 71041 | assert( pMem1->enc==SQLITE_UTF8 || |
| 71038 | 71042 | pMem1->enc==SQLITE_UTF16LE || pMem1->enc==SQLITE_UTF16BE ); |
| 71039 | 71043 | |
| 71040 | 71044 | /* The collation sequence must be defined at this point, even if |
| 71041 | 71045 | ** the user deletes the collation sequence after the vdbe program is |
| | @@ -75667,42 +75671,41 @@ |
| 75667 | 75671 | } |
| 75668 | 75672 | }else{ |
| 75669 | 75673 | /* Neither operand is NULL. Do a comparison. */ |
| 75670 | 75674 | affinity = pOp->p5 & SQLITE_AFF_MASK; |
| 75671 | 75675 | if( affinity>=SQLITE_AFF_NUMERIC ){ |
| 75672 | | - if( (pIn1->flags & (MEM_Int|MEM_Real|MEM_Str))==MEM_Str ){ |
| 75676 | + if( (flags1 & (MEM_Int|MEM_Real|MEM_Str))==MEM_Str ){ |
| 75673 | 75677 | applyNumericAffinity(pIn1,0); |
| 75674 | 75678 | } |
| 75675 | | - if( (pIn3->flags & (MEM_Int|MEM_Real|MEM_Str))==MEM_Str ){ |
| 75679 | + if( (flags3 & (MEM_Int|MEM_Real|MEM_Str))==MEM_Str ){ |
| 75676 | 75680 | applyNumericAffinity(pIn3,0); |
| 75677 | 75681 | } |
| 75678 | 75682 | }else if( affinity==SQLITE_AFF_TEXT ){ |
| 75679 | | - if( (pIn1->flags & MEM_Str)==0 && (pIn1->flags & (MEM_Int|MEM_Real))!=0 ){ |
| 75683 | + if( (flags1 & MEM_Str)==0 && (flags1 & (MEM_Int|MEM_Real))!=0 ){ |
| 75680 | 75684 | testcase( pIn1->flags & MEM_Int ); |
| 75681 | 75685 | testcase( pIn1->flags & MEM_Real ); |
| 75682 | 75686 | sqlite3VdbeMemStringify(pIn1, encoding, 1); |
| 75683 | 75687 | testcase( (flags1&MEM_Dyn) != (pIn1->flags&MEM_Dyn) ); |
| 75684 | 75688 | flags1 = (pIn1->flags & ~MEM_TypeMask) | (flags1 & MEM_TypeMask); |
| 75685 | 75689 | } |
| 75686 | | - if( (pIn3->flags & MEM_Str)==0 && (pIn3->flags & (MEM_Int|MEM_Real))!=0 ){ |
| 75690 | + if( (flags3 & MEM_Str)==0 && (flags3 & (MEM_Int|MEM_Real))!=0 ){ |
| 75687 | 75691 | testcase( pIn3->flags & MEM_Int ); |
| 75688 | 75692 | testcase( pIn3->flags & MEM_Real ); |
| 75689 | 75693 | sqlite3VdbeMemStringify(pIn3, encoding, 1); |
| 75690 | 75694 | testcase( (flags3&MEM_Dyn) != (pIn3->flags&MEM_Dyn) ); |
| 75691 | 75695 | flags3 = (pIn3->flags & ~MEM_TypeMask) | (flags3 & MEM_TypeMask); |
| 75692 | 75696 | } |
| 75693 | 75697 | } |
| 75694 | 75698 | assert( pOp->p4type==P4_COLLSEQ || pOp->p4.pColl==0 ); |
| 75695 | | - if( pIn1->flags & MEM_Zero ){ |
| 75699 | + if( flags1 & MEM_Zero ){ |
| 75696 | 75700 | sqlite3VdbeMemExpandBlob(pIn1); |
| 75697 | 75701 | flags1 &= ~MEM_Zero; |
| 75698 | 75702 | } |
| 75699 | | - if( pIn3->flags & MEM_Zero ){ |
| 75703 | + if( flags3 & MEM_Zero ){ |
| 75700 | 75704 | sqlite3VdbeMemExpandBlob(pIn3); |
| 75701 | 75705 | flags3 &= ~MEM_Zero; |
| 75702 | 75706 | } |
| 75703 | | - if( db->mallocFailed ) goto no_mem; |
| 75704 | 75707 | res = sqlite3MemCompare(pIn3, pIn1, pOp->p4.pColl); |
| 75705 | 75708 | } |
| 75706 | 75709 | switch( pOp->opcode ){ |
| 75707 | 75710 | case OP_Eq: res = res==0; break; |
| 75708 | 75711 | case OP_Ne: res = res!=0; break; |
| | @@ -94733,19 +94736,19 @@ |
| 94733 | 94736 | } |
| 94734 | 94737 | |
| 94735 | 94738 | /* Set properties of a table column based on the (magical) |
| 94736 | 94739 | ** name of the column. |
| 94737 | 94740 | */ |
| 94738 | | -SQLITE_PRIVATE void sqlite3ColumnPropertiesFromName(Table *pTab, Column *pCol){ |
| 94739 | 94741 | #if SQLITE_ENABLE_HIDDEN_COLUMNS |
| 94742 | +SQLITE_PRIVATE void sqlite3ColumnPropertiesFromName(Table *pTab, Column *pCol){ |
| 94740 | 94743 | if( sqlite3_strnicmp(pCol->zName, "__hidden__", 10)==0 ){ |
| 94741 | 94744 | pCol->colFlags |= COLFLAG_HIDDEN; |
| 94742 | 94745 | }else if( pTab && pCol!=pTab->aCol && (pCol[-1].colFlags & COLFLAG_HIDDEN) ){ |
| 94743 | 94746 | pTab->tabFlags |= TF_OOOHidden; |
| 94744 | 94747 | } |
| 94748 | +} |
| 94745 | 94749 | #endif |
| 94746 | | -} |
| 94747 | 94750 | |
| 94748 | 94751 | |
| 94749 | 94752 | /* |
| 94750 | 94753 | ** Add a new column to the table currently being constructed. |
| 94751 | 94754 | ** |
| | @@ -95321,11 +95324,11 @@ |
| 95321 | 95324 | assert( pIdx->isResized==0 ); |
| 95322 | 95325 | nByte = (sizeof(char*) + sizeof(i16) + 1)*N; |
| 95323 | 95326 | zExtra = sqlite3DbMallocZero(db, nByte); |
| 95324 | 95327 | if( zExtra==0 ) return SQLITE_NOMEM; |
| 95325 | 95328 | memcpy(zExtra, pIdx->azColl, sizeof(char*)*pIdx->nColumn); |
| 95326 | | - pIdx->azColl = (char**)zExtra; |
| 95329 | + pIdx->azColl = (const char**)zExtra; |
| 95327 | 95330 | zExtra += sizeof(char*)*N; |
| 95328 | 95331 | memcpy(zExtra, pIdx->aiColumn, sizeof(i16)*pIdx->nColumn); |
| 95329 | 95332 | pIdx->aiColumn = (i16*)zExtra; |
| 95330 | 95333 | zExtra += sizeof(i16)*N; |
| 95331 | 95334 | memcpy(zExtra, pIdx->aSortOrder, pIdx->nColumn); |
| | @@ -95502,11 +95505,11 @@ |
| 95502 | 95505 | if( resizeIndexObject(db, pPk, pTab->nCol) ) return; |
| 95503 | 95506 | for(i=0, j=nPk; i<pTab->nCol; i++){ |
| 95504 | 95507 | if( !hasColumn(pPk->aiColumn, j, i) ){ |
| 95505 | 95508 | assert( j<pPk->nColumn ); |
| 95506 | 95509 | pPk->aiColumn[j] = i; |
| 95507 | | - pPk->azColl[j] = "BINARY"; |
| 95510 | + pPk->azColl[j] = sqlite3StrBINARY; |
| 95508 | 95511 | j++; |
| 95509 | 95512 | } |
| 95510 | 95513 | } |
| 95511 | 95514 | assert( pPk->nColumn==j ); |
| 95512 | 95515 | assert( pTab->nCol==j ); |
| | @@ -96552,11 +96555,11 @@ |
| 96552 | 96555 | sizeof(i16)*nCol + /* Index.aiColumn */ |
| 96553 | 96556 | sizeof(u8)*nCol); /* Index.aSortOrder */ |
| 96554 | 96557 | p = sqlite3DbMallocZero(db, nByte + nExtra); |
| 96555 | 96558 | if( p ){ |
| 96556 | 96559 | char *pExtra = ((char*)p)+ROUND8(sizeof(Index)); |
| 96557 | | - p->azColl = (char**)pExtra; pExtra += ROUND8(sizeof(char*)*nCol); |
| 96560 | + p->azColl = (const char**)pExtra; pExtra += ROUND8(sizeof(char*)*nCol); |
| 96558 | 96561 | p->aiRowLogEst = (LogEst*)pExtra; pExtra += sizeof(LogEst)*(nCol+1); |
| 96559 | 96562 | p->aiColumn = (i16*)pExtra; pExtra += sizeof(i16)*nCol; |
| 96560 | 96563 | p->aSortOrder = (u8*)pExtra; |
| 96561 | 96564 | p->nColumn = nCol; |
| 96562 | 96565 | p->nKeyCol = nCol - 1; |
| | @@ -96829,11 +96832,11 @@ |
| 96829 | 96832 | ** index key. |
| 96830 | 96833 | */ |
| 96831 | 96834 | for(i=0, pListItem=pList->a; i<pList->nExpr; i++, pListItem++){ |
| 96832 | 96835 | Expr *pCExpr; /* The i-th index expression */ |
| 96833 | 96836 | int requestedSortOrder; /* ASC or DESC on the i-th expression */ |
| 96834 | | - char *zColl; /* Collation sequence name */ |
| 96837 | + const char *zColl; /* Collation sequence name */ |
| 96835 | 96838 | |
| 96836 | 96839 | sqlite3StringToId(pListItem->pExpr); |
| 96837 | 96840 | sqlite3ResolveSelfReference(pParse, pTab, NC_IdxExpr, pListItem->pExpr, 0); |
| 96838 | 96841 | if( pParse->nErr ) goto exit_create_index; |
| 96839 | 96842 | pCExpr = sqlite3ExprSkipCollate(pListItem->pExpr); |
| | @@ -96875,11 +96878,11 @@ |
| 96875 | 96878 | zExtra += nColl; |
| 96876 | 96879 | nExtra -= nColl; |
| 96877 | 96880 | }else if( j>=0 ){ |
| 96878 | 96881 | zColl = pTab->aCol[j].zColl; |
| 96879 | 96882 | } |
| 96880 | | - if( !zColl ) zColl = "BINARY"; |
| 96883 | + if( !zColl ) zColl = sqlite3StrBINARY; |
| 96881 | 96884 | if( !db->init.busy && !sqlite3LocateCollSeq(pParse, zColl) ){ |
| 96882 | 96885 | goto exit_create_index; |
| 96883 | 96886 | } |
| 96884 | 96887 | pIndex->azColl[i] = zColl; |
| 96885 | 96888 | requestedSortOrder = pListItem->sortOrder & sortOrderMask; |
| | @@ -96904,11 +96907,11 @@ |
| 96904 | 96907 | } |
| 96905 | 96908 | } |
| 96906 | 96909 | assert( i==pIndex->nColumn ); |
| 96907 | 96910 | }else{ |
| 96908 | 96911 | pIndex->aiColumn[i] = XN_ROWID; |
| 96909 | | - pIndex->azColl[i] = "BINARY"; |
| 96912 | + pIndex->azColl[i] = sqlite3StrBINARY; |
| 96910 | 96913 | } |
| 96911 | 96914 | sqlite3DefaultRowEst(pIndex); |
| 96912 | 96915 | if( pParse->pNewTable==0 ) estimateIndexWidth(pIndex); |
| 96913 | 96916 | |
| 96914 | 96917 | if( pTab==pParse->pNewTable ){ |
| | @@ -98028,13 +98031,12 @@ |
| 98028 | 98031 | pKey = sqlite3KeyInfoAlloc(pParse->db, nCol, 0); |
| 98029 | 98032 | } |
| 98030 | 98033 | if( pKey ){ |
| 98031 | 98034 | assert( sqlite3KeyInfoIsWriteable(pKey) ); |
| 98032 | 98035 | for(i=0; i<nCol; i++){ |
| 98033 | | - char *zColl = pIdx->azColl[i]; |
| 98034 | | - assert( zColl!=0 ); |
| 98035 | | - pKey->aColl[i] = strcmp(zColl,"BINARY")==0 ? 0 : |
| 98036 | + const char *zColl = pIdx->azColl[i]; |
| 98037 | + pKey->aColl[i] = zColl==sqlite3StrBINARY ? 0 : |
| 98036 | 98038 | sqlite3LocateCollSeq(pParse, zColl); |
| 98037 | 98039 | pKey->aSortOrder[i] = pIdx->aSortOrder[i]; |
| 98038 | 98040 | } |
| 98039 | 98041 | if( pParse->nErr ){ |
| 98040 | 98042 | sqlite3KeyInfoUnref(pKey); |
| | @@ -100240,11 +100242,11 @@ |
| 100240 | 100242 | continue; |
| 100241 | 100243 | } |
| 100242 | 100244 | } |
| 100243 | 100245 | c2 = Utf8Read(zString); |
| 100244 | 100246 | if( c==c2 ) continue; |
| 100245 | | - if( noCase && c<0x80 && c2<0x80 && sqlite3Tolower(c)==sqlite3Tolower(c2) ){ |
| 100247 | + if( noCase && sqlite3Tolower(c)==sqlite3Tolower(c2) ){ |
| 100246 | 100248 | continue; |
| 100247 | 100249 | } |
| 100248 | 100250 | if( c==matchOne && zPattern!=zEscaped && c2!=0 ) continue; |
| 100249 | 100251 | return 0; |
| 100250 | 100252 | } |
| | @@ -101559,22 +101561,20 @@ |
| 101559 | 101561 | ** index matches those columns. Also, check that the index uses |
| 101560 | 101562 | ** the default collation sequences for each column. */ |
| 101561 | 101563 | int i, j; |
| 101562 | 101564 | for(i=0; i<nCol; i++){ |
| 101563 | 101565 | i16 iCol = pIdx->aiColumn[i]; /* Index of column in parent tbl */ |
| 101564 | | - char *zDfltColl; /* Def. collation for column */ |
| 101566 | + const char *zDfltColl; /* Def. collation for column */ |
| 101565 | 101567 | char *zIdxCol; /* Name of indexed column */ |
| 101566 | 101568 | |
| 101567 | 101569 | if( iCol<0 ) break; /* No foreign keys against expression indexes */ |
| 101568 | 101570 | |
| 101569 | 101571 | /* If the index uses a collation sequence that is different from |
| 101570 | 101572 | ** the default collation sequence for the column, this index is |
| 101571 | 101573 | ** unusable. Bail out early in this case. */ |
| 101572 | 101574 | zDfltColl = pParent->aCol[iCol].zColl; |
| 101573 | | - if( !zDfltColl ){ |
| 101574 | | - zDfltColl = "BINARY"; |
| 101575 | | - } |
| 101575 | + if( !zDfltColl ) zDfltColl = sqlite3StrBINARY; |
| 101576 | 101576 | if( sqlite3StrICmp(pIdx->azColl[i], zDfltColl) ) break; |
| 101577 | 101577 | |
| 101578 | 101578 | zIdxCol = pParent->aCol[iCol].zName; |
| 101579 | 101579 | for(j=0; j<nCol; j++){ |
| 101580 | 101580 | if( sqlite3StrICmp(pFKey->aCol[j].zCol, zIdxCol)==0 ){ |
| | @@ -104432,24 +104432,10 @@ |
| 104432 | 104432 | SQLITE_API int sqlite3_xferopt_count; |
| 104433 | 104433 | #endif /* SQLITE_TEST */ |
| 104434 | 104434 | |
| 104435 | 104435 | |
| 104436 | 104436 | #ifndef SQLITE_OMIT_XFER_OPT |
| 104437 | | -/* |
| 104438 | | -** Check to collation names to see if they are compatible. |
| 104439 | | -*/ |
| 104440 | | -static int xferCompatibleCollation(const char *z1, const char *z2){ |
| 104441 | | - if( z1==0 ){ |
| 104442 | | - return z2==0; |
| 104443 | | - } |
| 104444 | | - if( z2==0 ){ |
| 104445 | | - return 0; |
| 104446 | | - } |
| 104447 | | - return sqlite3StrICmp(z1, z2)==0; |
| 104448 | | -} |
| 104449 | | - |
| 104450 | | - |
| 104451 | 104437 | /* |
| 104452 | 104438 | ** Check to see if index pSrc is compatible as a source of data |
| 104453 | 104439 | ** for index pDest in an insert transfer optimization. The rules |
| 104454 | 104440 | ** for a compatible index: |
| 104455 | 104441 | ** |
| | @@ -104481,11 +104467,11 @@ |
| 104481 | 104467 | } |
| 104482 | 104468 | } |
| 104483 | 104469 | if( pSrc->aSortOrder[i]!=pDest->aSortOrder[i] ){ |
| 104484 | 104470 | return 0; /* Different sort orders */ |
| 104485 | 104471 | } |
| 104486 | | - if( !xferCompatibleCollation(pSrc->azColl[i],pDest->azColl[i]) ){ |
| 104472 | + if( sqlite3_stricmp(pSrc->azColl[i],pDest->azColl[i])!=0 ){ |
| 104487 | 104473 | return 0; /* Different collating sequences */ |
| 104488 | 104474 | } |
| 104489 | 104475 | } |
| 104490 | 104476 | if( sqlite3ExprCompare(pSrc->pPartIdxWhere, pDest->pPartIdxWhere, -1) ){ |
| 104491 | 104477 | return 0; /* Different WHERE clauses */ |
| | @@ -104642,11 +104628,11 @@ |
| 104642 | 104628 | } |
| 104643 | 104629 | #endif |
| 104644 | 104630 | if( pDestCol->affinity!=pSrcCol->affinity ){ |
| 104645 | 104631 | return 0; /* Affinity must be the same on all columns */ |
| 104646 | 104632 | } |
| 104647 | | - if( !xferCompatibleCollation(pDestCol->zColl, pSrcCol->zColl) ){ |
| 104633 | + if( sqlite3_stricmp(pDestCol->zColl, pSrcCol->zColl)!=0 ){ |
| 104648 | 104634 | return 0; /* Collating sequence must be the same on all columns */ |
| 104649 | 104635 | } |
| 104650 | 104636 | if( pDestCol->notNull && !pSrcCol->notNull ){ |
| 104651 | 104637 | return 0; /* tab2 must be NOT NULL if tab1 is */ |
| 104652 | 104638 | } |
| | @@ -104789,13 +104775,14 @@ |
| 104789 | 104775 | ** BINARY, this optimization is disabled. This is because the user |
| 104790 | 104776 | ** might change the definition of a collation sequence and then run |
| 104791 | 104777 | ** a VACUUM command. In that case keys may not be written in strictly |
| 104792 | 104778 | ** sorted order. */ |
| 104793 | 104779 | for(i=0; i<pSrcIdx->nColumn; i++){ |
| 104794 | | - char *zColl = pSrcIdx->azColl[i]; |
| 104795 | | - assert( zColl!=0 ); |
| 104796 | | - if( sqlite3_stricmp("BINARY", zColl) ) break; |
| 104780 | + const char *zColl = pSrcIdx->azColl[i]; |
| 104781 | + assert( sqlite3_stricmp(sqlite3StrBINARY, zColl)!=0 |
| 104782 | + || sqlite3StrBINARY==zColl ); |
| 104783 | + if( sqlite3_stricmp(sqlite3StrBINARY, zColl) ) break; |
| 104797 | 104784 | } |
| 104798 | 104785 | if( i==pSrcIdx->nColumn ){ |
| 104799 | 104786 | idxInsFlags = OPFLAG_USESEEKRESULT; |
| 104800 | 104787 | sqlite3VdbeAddOp3(v, OP_Last, iDest, 0, -1); |
| 104801 | 104788 | } |
| | @@ -119292,11 +119279,11 @@ |
| 119292 | 119279 | ** terms in the WHERE clause that are useful to the query planner. |
| 119293 | 119280 | */ |
| 119294 | 119281 | struct WhereScan { |
| 119295 | 119282 | WhereClause *pOrigWC; /* Original, innermost WhereClause */ |
| 119296 | 119283 | WhereClause *pWC; /* WhereClause currently being scanned */ |
| 119297 | | - char *zCollName; /* Required collating sequence, if not NULL */ |
| 119284 | + const char *zCollName; /* Required collating sequence, if not NULL */ |
| 119298 | 119285 | Expr *pIdxExpr; /* Search for this index expression */ |
| 119299 | 119286 | char idxaff; /* Must match this affinity, if zCollName!=NULL */ |
| 119300 | 119287 | unsigned char nEquiv; /* Number of entries in aEquiv[] */ |
| 119301 | 119288 | unsigned char iEquiv; /* Next unused slot in aEquiv[] */ |
| 119302 | 119289 | u32 opMask; /* Acceptable operators */ |
| | @@ -123278,11 +123265,11 @@ |
| 123278 | 123265 | if( (idxCols & cMask)==0 ){ |
| 123279 | 123266 | Expr *pX = pTerm->pExpr; |
| 123280 | 123267 | idxCols |= cMask; |
| 123281 | 123268 | pIdx->aiColumn[n] = pTerm->u.leftColumn; |
| 123282 | 123269 | pColl = sqlite3BinaryCompareCollSeq(pParse, pX->pLeft, pX->pRight); |
| 123283 | | - pIdx->azColl[n] = pColl ? pColl->zName : "BINARY"; |
| 123270 | + pIdx->azColl[n] = pColl ? pColl->zName : sqlite3StrBINARY; |
| 123284 | 123271 | n++; |
| 123285 | 123272 | } |
| 123286 | 123273 | } |
| 123287 | 123274 | } |
| 123288 | 123275 | assert( (u32)n==pLoop->u.btree.nEq ); |
| | @@ -123290,24 +123277,24 @@ |
| 123290 | 123277 | /* Add additional columns needed to make the automatic index into |
| 123291 | 123278 | ** a covering index */ |
| 123292 | 123279 | for(i=0; i<mxBitCol; i++){ |
| 123293 | 123280 | if( extraCols & MASKBIT(i) ){ |
| 123294 | 123281 | pIdx->aiColumn[n] = i; |
| 123295 | | - pIdx->azColl[n] = "BINARY"; |
| 123282 | + pIdx->azColl[n] = sqlite3StrBINARY; |
| 123296 | 123283 | n++; |
| 123297 | 123284 | } |
| 123298 | 123285 | } |
| 123299 | 123286 | if( pSrc->colUsed & MASKBIT(BMS-1) ){ |
| 123300 | 123287 | for(i=BMS-1; i<pTable->nCol; i++){ |
| 123301 | 123288 | pIdx->aiColumn[n] = i; |
| 123302 | | - pIdx->azColl[n] = "BINARY"; |
| 123289 | + pIdx->azColl[n] = sqlite3StrBINARY; |
| 123303 | 123290 | n++; |
| 123304 | 123291 | } |
| 123305 | 123292 | } |
| 123306 | 123293 | assert( n==nKeyCol ); |
| 123307 | 123294 | pIdx->aiColumn[n] = XN_ROWID; |
| 123308 | | - pIdx->azColl[n] = "BINARY"; |
| 123295 | + pIdx->azColl[n] = sqlite3StrBINARY; |
| 123309 | 123296 | |
| 123310 | 123297 | /* Create the automatic index */ |
| 123311 | 123298 | assert( pLevel->iIdxCur>=0 ); |
| 123312 | 123299 | pLevel->iIdxCur = pParse->nTab++; |
| 123313 | 123300 | sqlite3VdbeAddOp2(v, OP_OpenAutoindex, pLevel->iIdxCur, nKeyCol+1); |
| | @@ -134858,22 +134845,22 @@ |
| 134858 | 134845 | ** conversions. The only error that can occur here is a malloc() failure. |
| 134859 | 134846 | ** |
| 134860 | 134847 | ** EVIDENCE-OF: R-52786-44878 SQLite defines three built-in collating |
| 134861 | 134848 | ** functions: |
| 134862 | 134849 | */ |
| 134863 | | - createCollation(db, "BINARY", SQLITE_UTF8, 0, binCollFunc, 0); |
| 134864 | | - createCollation(db, "BINARY", SQLITE_UTF16BE, 0, binCollFunc, 0); |
| 134865 | | - createCollation(db, "BINARY", SQLITE_UTF16LE, 0, binCollFunc, 0); |
| 134850 | + createCollation(db, sqlite3StrBINARY, SQLITE_UTF8, 0, binCollFunc, 0); |
| 134851 | + createCollation(db, sqlite3StrBINARY, SQLITE_UTF16BE, 0, binCollFunc, 0); |
| 134852 | + createCollation(db, sqlite3StrBINARY, SQLITE_UTF16LE, 0, binCollFunc, 0); |
| 134866 | 134853 | createCollation(db, "NOCASE", SQLITE_UTF8, 0, nocaseCollatingFunc, 0); |
| 134867 | 134854 | createCollation(db, "RTRIM", SQLITE_UTF8, (void*)1, binCollFunc, 0); |
| 134868 | 134855 | if( db->mallocFailed ){ |
| 134869 | 134856 | goto opendb_out; |
| 134870 | 134857 | } |
| 134871 | 134858 | /* EVIDENCE-OF: R-08308-17224 The default collating function for all |
| 134872 | 134859 | ** strings is BINARY. |
| 134873 | 134860 | */ |
| 134874 | | - db->pDfltColl = sqlite3FindCollSeq(db, SQLITE_UTF8, "BINARY", 0); |
| 134861 | + db->pDfltColl = sqlite3FindCollSeq(db, SQLITE_UTF8, sqlite3StrBINARY, 0); |
| 134875 | 134862 | assert( db->pDfltColl!=0 ); |
| 134876 | 134863 | |
| 134877 | 134864 | /* Parse the filename/URI argument. */ |
| 134878 | 134865 | db->openFlags = flags; |
| 134879 | 134866 | rc = sqlite3ParseUri(zVfs, zFilename, &flags, &db->pVfs, &zOpen, &zErrMsg); |
| | @@ -135369,11 +135356,11 @@ |
| 135369 | 135356 | }else{ |
| 135370 | 135357 | zDataType = "INTEGER"; |
| 135371 | 135358 | primarykey = 1; |
| 135372 | 135359 | } |
| 135373 | 135360 | if( !zCollSeq ){ |
| 135374 | | - zCollSeq = "BINARY"; |
| 135361 | + zCollSeq = sqlite3StrBINARY; |
| 135375 | 135362 | } |
| 135376 | 135363 | |
| 135377 | 135364 | error_out: |
| 135378 | 135365 | sqlite3BtreeLeaveAll(db); |
| 135379 | 135366 | |
| | @@ -135977,11 +135964,10 @@ |
| 135977 | 135964 | */ |
| 135978 | 135965 | SQLITE_API void SQLITE_STDCALL sqlite3_snapshot_free(sqlite3_snapshot *pSnapshot){ |
| 135979 | 135966 | sqlite3_free(pSnapshot); |
| 135980 | 135967 | } |
| 135981 | 135968 | #endif /* SQLITE_ENABLE_SNAPSHOT */ |
| 135982 | | - |
| 135983 | 135969 | |
| 135984 | 135970 | /************** End of main.c ************************************************/ |
| 135985 | 135971 | /************** Begin file notify.c ******************************************/ |
| 135986 | 135972 | /* |
| 135987 | 135973 | ** 2009 March 3 |
| | @@ -166098,11 +166084,11 @@ |
| 166098 | 166084 | sqlite3_result_int(ctx, sqlite3_value_subtype(argv[0])==JSON_SUBTYPE); |
| 166099 | 166085 | } |
| 166100 | 166086 | #endif /* SQLITE_DEBUG */ |
| 166101 | 166087 | |
| 166102 | 166088 | /**************************************************************************** |
| 166103 | | -** SQL function implementations |
| 166089 | +** Scalar SQL function implementations |
| 166104 | 166090 | ****************************************************************************/ |
| 166105 | 166091 | |
| 166106 | 166092 | /* |
| 166107 | 166093 | ** Implementation of the json_array(VALUE,...) function. Return a JSON |
| 166108 | 166094 | ** array that contains all values given in arguments. Or if any argument |
| | @@ -166430,10 +166416,106 @@ |
| 166430 | 166416 | rc = 1; |
| 166431 | 166417 | } |
| 166432 | 166418 | jsonParseReset(&x); |
| 166433 | 166419 | sqlite3_result_int(ctx, rc); |
| 166434 | 166420 | } |
| 166421 | + |
| 166422 | + |
| 166423 | +/**************************************************************************** |
| 166424 | +** Aggregate SQL function implementations |
| 166425 | +****************************************************************************/ |
| 166426 | +/* |
| 166427 | +** json_group_array(VALUE) |
| 166428 | +** |
| 166429 | +** Return a JSON array composed of all values in the aggregate. |
| 166430 | +*/ |
| 166431 | +static void jsonArrayStep( |
| 166432 | + sqlite3_context *ctx, |
| 166433 | + int argc, |
| 166434 | + sqlite3_value **argv |
| 166435 | +){ |
| 166436 | + JsonString *pStr; |
| 166437 | + pStr = (JsonString*)sqlite3_aggregate_context(ctx, sizeof(*pStr)); |
| 166438 | + if( pStr ){ |
| 166439 | + if( pStr->zBuf==0 ){ |
| 166440 | + jsonInit(pStr, ctx); |
| 166441 | + jsonAppendChar(pStr, '['); |
| 166442 | + }else{ |
| 166443 | + jsonAppendChar(pStr, ','); |
| 166444 | + pStr->pCtx = ctx; |
| 166445 | + } |
| 166446 | + jsonAppendValue(pStr, argv[0]); |
| 166447 | + } |
| 166448 | +} |
| 166449 | +static void jsonArrayFinal(sqlite3_context *ctx){ |
| 166450 | + JsonString *pStr; |
| 166451 | + pStr = (JsonString*)sqlite3_aggregate_context(ctx, 0); |
| 166452 | + if( pStr ){ |
| 166453 | + pStr->pCtx = ctx; |
| 166454 | + jsonAppendChar(pStr, ']'); |
| 166455 | + if( pStr->bErr ){ |
| 166456 | + sqlite3_result_error_nomem(ctx); |
| 166457 | + if( !pStr->bStatic ) sqlite3_free(pStr->zBuf); |
| 166458 | + }else{ |
| 166459 | + sqlite3_result_text(ctx, pStr->zBuf, pStr->nUsed, |
| 166460 | + pStr->bStatic ? SQLITE_TRANSIENT : sqlite3_free); |
| 166461 | + pStr->bStatic = 1; |
| 166462 | + } |
| 166463 | + }else{ |
| 166464 | + sqlite3_result_text(ctx, "[]", 2, SQLITE_STATIC); |
| 166465 | + } |
| 166466 | + sqlite3_result_subtype(ctx, JSON_SUBTYPE); |
| 166467 | +} |
| 166468 | + |
| 166469 | +/* |
| 166470 | +** json_group_obj(NAME,VALUE) |
| 166471 | +** |
| 166472 | +** Return a JSON object composed of all names and values in the aggregate. |
| 166473 | +*/ |
| 166474 | +static void jsonObjectStep( |
| 166475 | + sqlite3_context *ctx, |
| 166476 | + int argc, |
| 166477 | + sqlite3_value **argv |
| 166478 | +){ |
| 166479 | + JsonString *pStr; |
| 166480 | + const char *z; |
| 166481 | + u32 n; |
| 166482 | + pStr = (JsonString*)sqlite3_aggregate_context(ctx, sizeof(*pStr)); |
| 166483 | + if( pStr ){ |
| 166484 | + if( pStr->zBuf==0 ){ |
| 166485 | + jsonInit(pStr, ctx); |
| 166486 | + jsonAppendChar(pStr, '{'); |
| 166487 | + }else{ |
| 166488 | + jsonAppendChar(pStr, ','); |
| 166489 | + pStr->pCtx = ctx; |
| 166490 | + } |
| 166491 | + z = (const char*)sqlite3_value_text(argv[0]); |
| 166492 | + n = (u32)sqlite3_value_bytes(argv[0]); |
| 166493 | + jsonAppendString(pStr, z, n); |
| 166494 | + jsonAppendChar(pStr, ':'); |
| 166495 | + jsonAppendValue(pStr, argv[1]); |
| 166496 | + } |
| 166497 | +} |
| 166498 | +static void jsonObjectFinal(sqlite3_context *ctx){ |
| 166499 | + JsonString *pStr; |
| 166500 | + pStr = (JsonString*)sqlite3_aggregate_context(ctx, 0); |
| 166501 | + if( pStr ){ |
| 166502 | + jsonAppendChar(pStr, '}'); |
| 166503 | + if( pStr->bErr ){ |
| 166504 | + sqlite3_result_error_nomem(ctx); |
| 166505 | + if( !pStr->bStatic ) sqlite3_free(pStr->zBuf); |
| 166506 | + }else{ |
| 166507 | + sqlite3_result_text(ctx, pStr->zBuf, pStr->nUsed, |
| 166508 | + pStr->bStatic ? SQLITE_TRANSIENT : sqlite3_free); |
| 166509 | + pStr->bStatic = 1; |
| 166510 | + } |
| 166511 | + }else{ |
| 166512 | + sqlite3_result_text(ctx, "{}", 2, SQLITE_STATIC); |
| 166513 | + } |
| 166514 | + sqlite3_result_subtype(ctx, JSON_SUBTYPE); |
| 166515 | +} |
| 166516 | + |
| 166435 | 166517 | |
| 166436 | 166518 | #ifndef SQLITE_OMIT_VIRTUALTABLE |
| 166437 | 166519 | /**************************************************************************** |
| 166438 | 166520 | ** The json_each virtual table |
| 166439 | 166521 | ****************************************************************************/ |
| | @@ -166929,10 +167011,19 @@ |
| 166929 | 167011 | /* DEBUG and TESTING functions */ |
| 166930 | 167012 | { "json_parse", 1, 0, jsonParseFunc }, |
| 166931 | 167013 | { "json_test1", 1, 0, jsonTest1Func }, |
| 166932 | 167014 | #endif |
| 166933 | 167015 | }; |
| 167016 | + static const struct { |
| 167017 | + const char *zName; |
| 167018 | + int nArg; |
| 167019 | + void (*xStep)(sqlite3_context*,int,sqlite3_value**); |
| 167020 | + void (*xFinal)(sqlite3_context*); |
| 167021 | + } aAgg[] = { |
| 167022 | + { "json_group_array", 1, jsonArrayStep, jsonArrayFinal }, |
| 167023 | + { "json_group_object", 2, jsonObjectStep, jsonObjectFinal }, |
| 167024 | + }; |
| 166934 | 167025 | #ifndef SQLITE_OMIT_VIRTUALTABLE |
| 166935 | 167026 | static const struct { |
| 166936 | 167027 | const char *zName; |
| 166937 | 167028 | sqlite3_module *pModule; |
| 166938 | 167029 | } aMod[] = { |
| | @@ -166944,10 +167035,15 @@ |
| 166944 | 167035 | rc = sqlite3_create_function(db, aFunc[i].zName, aFunc[i].nArg, |
| 166945 | 167036 | SQLITE_UTF8 | SQLITE_DETERMINISTIC, |
| 166946 | 167037 | (void*)&aFunc[i].flag, |
| 166947 | 167038 | aFunc[i].xFunc, 0, 0); |
| 166948 | 167039 | } |
| 167040 | + for(i=0; i<sizeof(aAgg)/sizeof(aAgg[0]) && rc==SQLITE_OK; i++){ |
| 167041 | + rc = sqlite3_create_function(db, aAgg[i].zName, aAgg[i].nArg, |
| 167042 | + SQLITE_UTF8 | SQLITE_DETERMINISTIC, 0, |
| 167043 | + 0, aAgg[i].xStep, aAgg[i].xFinal); |
| 167044 | + } |
| 166949 | 167045 | #ifndef SQLITE_OMIT_VIRTUALTABLE |
| 166950 | 167046 | for(i=0; i<sizeof(aMod)/sizeof(aMod[0]) && rc==SQLITE_OK; i++){ |
| 166951 | 167047 | rc = sqlite3_create_module(db, aMod[i].zName, aMod[i].pModule, 0); |
| 166952 | 167048 | } |
| 166953 | 167049 | #endif |
| | @@ -182141,11 +182237,11 @@ |
| 182141 | 182237 | sqlite3_context *pCtx, /* Function call context */ |
| 182142 | 182238 | int nArg, /* Number of args */ |
| 182143 | 182239 | sqlite3_value **apVal /* Function arguments */ |
| 182144 | 182240 | ){ |
| 182145 | 182241 | assert( nArg==0 ); |
| 182146 | | - sqlite3_result_text(pCtx, "fts5: 2015-12-23 16:42:27 5d44d4a6cf5c6b983cbd846d9bc34251df8f4bc5", -1, SQLITE_TRANSIENT); |
| 182242 | + sqlite3_result_text(pCtx, "fts5: 2015-12-30 14:06:22 0a99a8c4facf65ec67d8d86108c9a3f723f7cbd6", -1, SQLITE_TRANSIENT); |
| 182147 | 182243 | } |
| 182148 | 182244 | |
| 182149 | 182245 | static int fts5Init(sqlite3 *db){ |
| 182150 | 182246 | static const sqlite3_module fts5Mod = { |
| 182151 | 182247 | /* iVersion */ 2, |
| 182152 | 182248 | |