trunk/3rdparty/sqlite3/sqlite3.c
| r243644 | r243645 | |
| 10856 | 10856 | */ |
| 10857 | 10857 | #define FUNCTION(zName, nArg, iArg, bNC, xFunc) \ |
| 10858 | 10858 | {nArg, SQLITE_FUNC_CONSTANT|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \ |
| 10859 | | SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, #zName, 0, 0} |
| 10859 | SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, (char*)#zName, 0, 0} |
| 10860 | 10860 | #define VFUNCTION(zName, nArg, iArg, bNC, xFunc) \ |
| 10861 | 10861 | {nArg, SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \ |
| 10862 | | SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, #zName, 0, 0} |
| 10862 | SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, (char*)#zName, 0, 0} |
| 10863 | 10863 | #define FUNCTION2(zName, nArg, iArg, bNC, xFunc, extraFlags) \ |
| 10864 | 10864 | {nArg,SQLITE_FUNC_CONSTANT|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL)|extraFlags,\ |
| 10865 | | SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, #zName, 0, 0} |
| 10865 | SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, (char*)#zName, 0, 0} |
| 10866 | 10866 | #define STR_FUNCTION(zName, nArg, pArg, bNC, xFunc) \ |
| 10867 | 10867 | {nArg, SQLITE_FUNC_CONSTANT|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \ |
| 10868 | | pArg, 0, xFunc, 0, 0, #zName, 0, 0} |
| 10868 | pArg, 0, xFunc, 0, 0, (char*)#zName, 0, 0} |
| 10869 | 10869 | #define LIKEFUNC(zName, nArg, arg, flags) \ |
| 10870 | 10870 | {nArg, SQLITE_FUNC_CONSTANT|SQLITE_UTF8|flags, \ |
| 10871 | | (void *)arg, 0, likeFunc, 0, 0, #zName, 0, 0} |
| 10871 | (void *)arg, 0, likeFunc, 0, 0, (char*)#zName, 0, 0} |
| 10872 | 10872 | #define AGGREGATE(zName, nArg, arg, nc, xStep, xFinal) \ |
| 10873 | 10873 | {nArg, SQLITE_UTF8|(nc*SQLITE_FUNC_NEEDCOLL), \ |
| 10874 | | SQLITE_INT_TO_PTR(arg), 0, 0, xStep,xFinal,#zName,0,0} |
| 10874 | SQLITE_INT_TO_PTR(arg), 0, 0, xStep,xFinal,(char*)#zName,0,0} |
| 10875 | 10875 | #define AGGREGATE2(zName, nArg, arg, nc, xStep, xFinal, extraFlags) \ |
| 10876 | 10876 | {nArg, SQLITE_UTF8|(nc*SQLITE_FUNC_NEEDCOLL)|extraFlags, \ |
| 10877 | | SQLITE_INT_TO_PTR(arg), 0, 0, xStep,xFinal,#zName,0,0} |
| 10877 | SQLITE_INT_TO_PTR(arg), 0, 0, xStep,xFinal,(char*)#zName,0,0} |
| 10878 | 10878 | |
| 10879 | 10879 | /* |
| 10880 | 10880 | ** All current savepoints are stored in a linked list starting at |
| r243644 | r243645 | |
| 21202 | 21202 | /* Normalize realvalue to within 10.0 > realvalue >= 1.0 */ |
| 21203 | 21203 | exp = 0; |
| 21204 | 21204 | if( sqlite3IsNaN((double)realvalue) ){ |
| 21205 | | bufpt = "NaN"; |
| 21205 | bufpt = (char *)"NaN"; |
| 21206 | 21206 | length = 3; |
| 21207 | 21207 | break; |
| 21208 | 21208 | } |
| r243644 | r243645 | |
| 21217 | 21217 | while( realvalue<1.0 ){ realvalue *= 10.0; exp--; } |
| 21218 | 21218 | if( exp>350 ){ |
| 21219 | 21219 | if( prefix=='-' ){ |
| 21220 | | bufpt = "-Inf"; |
| 21220 | bufpt = (char *)"-Inf"; |
| 21221 | 21221 | }else if( prefix=='+' ){ |
| 21222 | | bufpt = "+Inf"; |
| 21222 | bufpt =(char *) "+Inf"; |
| 21223 | 21223 | }else{ |
| 21224 | | bufpt = "Inf"; |
| 21224 | bufpt = (char *)"Inf"; |
| 21225 | 21225 | } |
| 21226 | 21226 | length = sqlite3Strlen30(bufpt); |
| 21227 | 21227 | break; |
| r243644 | r243645 | |
| 21375 | 21375 | bufpt = va_arg(ap,char*); |
| 21376 | 21376 | } |
| 21377 | 21377 | if( bufpt==0 ){ |
| 21378 | | bufpt = ""; |
| 21378 | bufpt = (char *)""; |
| 21379 | 21379 | }else if( xtype==etDYNSTRING && !bArgList ){ |
| 21380 | 21380 | zExtra = bufpt; |
| 21381 | 21381 | } |
| r243644 | r243645 | |
| 21400 | 21400 | escarg = va_arg(ap,char*); |
| 21401 | 21401 | } |
| 21402 | 21402 | isnull = escarg==0; |
| 21403 | | if( isnull ) escarg = (xtype==etSQLESCAPE2 ? "NULL" : "(NULL)"); |
| 21403 | if( isnull ) escarg = (char *)(xtype==etSQLESCAPE2 ? "NULL" : "(NULL)"); |
| 21404 | 21404 | k = precision; |
| 21405 | 21405 | for(i=n=0; k!=0 && (ch=escarg[i])!=0; i++, k--){ |
| 21406 | 21406 | if( ch==q ) n++; |
| r243644 | r243645 | |
| 64312 | 64312 | sqlite3_snprintf(nTemp, zTemp, "NULL"); |
| 64313 | 64313 | }else{ |
| 64314 | 64314 | assert( pMem->flags & MEM_Blob ); |
| 64315 | | zP4 = "(blob)"; |
| 64315 | zP4 = (char *)"(blob)"; |
| 64316 | 64316 | } |
| 64317 | 64317 | break; |
| 64318 | 64318 | } |
| r243644 | r243645 | |
| 86311 | 86311 | statInit, /* xFunc */ |
| 86312 | 86312 | 0, /* xStep */ |
| 86313 | 86313 | 0, /* xFinalize */ |
| 86314 | | "stat_init", /* zName */ |
| 86314 | (char*)"stat_init", /* zName */ |
| 86315 | 86315 | 0, /* pHash */ |
| 86316 | 86316 | 0 /* pDestructor */ |
| 86317 | 86317 | }; |
| r243644 | r243645 | |
| 86612 | 86612 | statPush, /* xFunc */ |
| 86613 | 86613 | 0, /* xStep */ |
| 86614 | 86614 | 0, /* xFinalize */ |
| 86615 | | "stat_push", /* zName */ |
| 86615 | (char*)"stat_push", /* zName */ |
| 86616 | 86616 | 0, /* pHash */ |
| 86617 | 86617 | 0 /* pDestructor */ |
| 86618 | 86618 | }; |
| r243644 | r243645 | |
| 86759 | 86759 | statGet, /* xFunc */ |
| 86760 | 86760 | 0, /* xStep */ |
| 86761 | 86761 | 0, /* xFinalize */ |
| 86762 | | "stat_get", /* zName */ |
| 86762 | (char*)"stat_get", /* zName */ |
| 86763 | 86763 | 0, /* pHash */ |
| 86764 | 86764 | 0 /* pDestructor */ |
| 86765 | 86765 | }; |
| r243644 | r243645 | |
| 88105 | 88105 | detachFunc, /* xFunc */ |
| 88106 | 88106 | 0, /* xStep */ |
| 88107 | 88107 | 0, /* xFinalize */ |
| 88108 | | "sqlite_detach", /* zName */ |
| 88108 | (char*)"sqlite_detach", /* zName */ |
| 88109 | 88109 | 0, /* pHash */ |
| 88110 | 88110 | 0 /* pDestructor */ |
| 88111 | 88111 | }; |
| r243644 | r243645 | |
| 88126 | 88126 | attachFunc, /* xFunc */ |
| 88127 | 88127 | 0, /* xStep */ |
| 88128 | 88128 | 0, /* xFinalize */ |
| 88129 | | "sqlite_attach", /* zName */ |
| 88129 | (char*)"sqlite_attach", /* zName */ |
| 88130 | 88130 | 0, /* pHash */ |
| 88131 | 88131 | 0 /* pDestructor */ |
| 88132 | 88132 | }; |
| r243644 | r243645 | |
| 90082 | 90082 | static char *createTableStmt(sqlite3 *db, Table *p){ |
| 90083 | 90083 | int i, k, n; |
| 90084 | 90084 | char *zStmt; |
| 90085 | | char *zSep, *zSep2, *zEnd; |
| 90085 | const char *zSep, *zSep2, *zEnd; |
| 90086 | 90086 | Column *pCol; |
| 90087 | 90087 | n = 0; |
| 90088 | 90088 | for(pCol = p->aCol, i=0; i<p->nCol; i++, pCol++){ |
| r243644 | r243645 | |
| 90317 | 90317 | if( !hasColumn(pPk->aiColumn, j, i) ){ |
| 90318 | 90318 | assert( j<pPk->nColumn ); |
| 90319 | 90319 | pPk->aiColumn[j] = i; |
| 90320 | | pPk->azColl[j] = "BINARY"; |
| 90320 | pPk->azColl[j] = (char *)"BINARY"; |
| 90321 | 90321 | j++; |
| 90322 | 90322 | } |
| 90323 | 90323 | } |
| r243644 | r243645 | |
| 90418 | 90418 | if( !db->init.busy ){ |
| 90419 | 90419 | int n; |
| 90420 | 90420 | Vdbe *v; |
| 90421 | | char *zType; /* "view" or "table" */ |
| 90422 | | char *zType2; /* "VIEW" or "TABLE" */ |
| 90421 | const char *zType; /* "view" or "table" */ |
| 90422 | const char *zType2; /* "VIEW" or "TABLE" */ |
| 90423 | 90423 | char *zStmt; /* Text of the CREATE TABLE or CREATE VIEW statement */ |
| 90424 | 90424 | |
| 90425 | 90425 | v = sqlite3GetVdbe(pParse); |
| r243644 | r243645 | |
| 91642 | 91642 | nExtra -= nColl; |
| 91643 | 91643 | }else{ |
| 91644 | 91644 | zColl = pTab->aCol[j].zColl; |
| 91645 | | if( !zColl ) zColl = "BINARY"; |
| 91645 | if( !zColl ) zColl = (char *)"BINARY"; |
| 91646 | 91646 | } |
| 91647 | 91647 | if( !db->init.busy && !sqlite3LocateCollSeq(pParse, zColl) ){ |
| 91648 | 91648 | goto exit_create_index; |
| r243644 | r243645 | |
| 91667 | 91667 | assert( i==pIndex->nColumn ); |
| 91668 | 91668 | }else{ |
| 91669 | 91669 | pIndex->aiColumn[i] = -1; |
| 91670 | | pIndex->azColl[i] = "BINARY"; |
| 91670 | pIndex->azColl[i] = (char *)"BINARY"; |
| 91671 | 91671 | } |
| 91672 | 91672 | sqlite3DefaultRowEst(pIndex); |
| 91673 | 91673 | if( pParse->pNewTable==0 ) estimateIndexWidth(pIndex); |
| r243644 | r243645 | |
| 96219 | 96219 | ** unusable. Bail out early in this case. */ |
| 96220 | 96220 | zDfltColl = pParent->aCol[iCol].zColl; |
| 96221 | 96221 | if( !zDfltColl ){ |
| 96222 | | zDfltColl = "BINARY"; |
| 96222 | zDfltColl = (char *)"BINARY"; |
| 96223 | 96223 | } |
| 96224 | 96224 | if( sqlite3StrICmp(pIdx->azColl[i], zDfltColl) ) break; |
| 96225 | 96225 | |
| r243644 | r243645 | |
| 101462 | 101462 | ** journal-mode name. |
| 101463 | 101463 | */ |
| 101464 | 101464 | SQLITE_PRIVATE const char *sqlite3JournalModename(int eMode){ |
| 101465 | | static char * const azModeName[] = { |
| 101465 | static const char * azModeName[] = { |
| 101466 | 101466 | "delete", "persist", "off", "truncate", "memory" |
| 101467 | 101467 | #ifndef SQLITE_OMIT_WAL |
| 101468 | 101468 | , "wal" |
| r243644 | r243645 | |
| 102832 | 102832 | */ |
| 102833 | 102833 | case PragTyp_ENCODING: { |
| 102834 | 102834 | static const struct EncName { |
| 102835 | | char *zName; |
| 102835 | const char *zName; |
| 102836 | 102836 | u8 enc; |
| 102837 | 102837 | } encnames[] = { |
| 102838 | 102838 | { "UTF8", SQLITE_UTF8 }, |
| r243644 | r243645 | |
| 105140 | 105140 | ** Name of the connection operator, used for error messages. |
| 105141 | 105141 | */ |
| 105142 | 105142 | static const char *selectOpName(int id){ |
| 105143 | | char *z; |
| 105143 | const char *z; |
| 105144 | 105144 | switch( id ){ |
| 105145 | 105145 | case TK_ALL: z = "UNION ALL"; break; |
| 105146 | 105146 | case TK_INTERSECT: z = "INTERSECT"; break; |
| r243644 | r243645 | |
| 105607 | 105607 | if( iCol<0 ) iCol = pTab->iPKey; |
| 105608 | 105608 | assert( iCol==-1 || (iCol>=0 && iCol<pTab->nCol) ); |
| 105609 | 105609 | if( iCol<0 ){ |
| 105610 | | zCol = "rowid"; |
| 105610 | zCol = (char*)"rowid"; |
| 105611 | 105611 | }else{ |
| 105612 | 105612 | zCol = pTab->aCol[iCol].zName; |
| 105613 | 105613 | } |
| r243644 | r243645 | |
| 111848 | 111848 | */ |
| 111849 | 111849 | nDb = db->nDb; |
| 111850 | 111850 | if( sqlite3TempInMemory(db) ){ |
| 111851 | | zSql = "ATTACH ':memory:' AS vacuum_db;"; |
| 111851 | zSql = (char*)"ATTACH ':memory:' AS vacuum_db;"; |
| 111852 | 111852 | }else{ |
| 111853 | | zSql = "ATTACH '' AS vacuum_db;"; |
| 111853 | zSql = (char*)"ATTACH '' AS vacuum_db;"; |
| 111854 | 111854 | } |
| 111855 | 111855 | rc = execSql(db, pzErrMsg, zSql); |
| 111856 | 111856 | if( db->nDb>nDb ){ |
| r243644 | r243645 | |
| 115270 | 115270 | pIdx = sqlite3AllocateIndexObject(pParse->db, nKeyCol+1, 0, &zNotUsed); |
| 115271 | 115271 | if( pIdx==0 ) return; |
| 115272 | 115272 | pLoop->u.btree.pIndex = pIdx; |
| 115273 | | pIdx->zName = "auto-index"; |
| 115273 | pIdx->zName = (char*)"auto-index"; |
| 115274 | 115274 | pIdx->pTable = pTable; |
| 115275 | 115275 | n = 0; |
| 115276 | 115276 | idxCols = 0; |
| r243644 | r243645 | |
| 115285 | 115285 | idxCols |= cMask; |
| 115286 | 115286 | pIdx->aiColumn[n] = pTerm->u.leftColumn; |
| 115287 | 115287 | pColl = sqlite3BinaryCompareCollSeq(pParse, pX->pLeft, pX->pRight); |
| 115288 | | pIdx->azColl[n] = ALWAYS(pColl) ? pColl->zName : "BINARY"; |
| 115288 | pIdx->azColl[n] = ALWAYS(pColl) ? pColl->zName : (char*)"BINARY"; |
| 115289 | 115289 | n++; |
| 115290 | 115290 | } |
| 115291 | 115291 | } |
| r243644 | r243645 | |
| 115297 | 115297 | for(i=0; i<mxBitCol; i++){ |
| 115298 | 115298 | if( extraCols & MASKBIT(i) ){ |
| 115299 | 115299 | pIdx->aiColumn[n] = i; |
| 115300 | | pIdx->azColl[n] = "BINARY"; |
| 115300 | pIdx->azColl[n] = (char*)"BINARY"; |
| 115301 | 115301 | n++; |
| 115302 | 115302 | } |
| 115303 | 115303 | } |
| 115304 | 115304 | if( pSrc->colUsed & MASKBIT(BMS-1) ){ |
| 115305 | 115305 | for(i=BMS-1; i<pTable->nCol; i++){ |
| 115306 | 115306 | pIdx->aiColumn[n] = i; |
| 115307 | | pIdx->azColl[n] = "BINARY"; |
| 115307 | pIdx->azColl[n] = (char*)"BINARY"; |
| 115308 | 115308 | n++; |
| 115309 | 115309 | } |
| 115310 | 115310 | } |
| 115311 | 115311 | assert( n==nKeyCol ); |
| 115312 | 115312 | pIdx->aiColumn[n] = -1; |
| 115313 | | pIdx->azColl[n] = "BINARY"; |
| 115313 | pIdx->azColl[n] = (char*)"BINARY"; |
| 115314 | 115314 | |
| 115315 | 115315 | /* Create the automatic index */ |
| 115316 | 115316 | assert( pLevel->iIdxCur>=0 ); |
| r243644 | r243645 | |
| 116377 | 116377 | if( nEq==0 && (pLoop->wsFlags&(WHERE_BTM_LIMIT|WHERE_TOP_LIMIT))==0 ) return; |
| 116378 | 116378 | sqlite3StrAccumAppend(pStr, " (", 2); |
| 116379 | 116379 | for(i=0; i<nEq; i++){ |
| 116380 | | char *z = aiColumn[i] < 0 ? "rowid" : aCol[aiColumn[i]].zName; |
| 116380 | char *z = aiColumn[i] < 0 ? (char*)"rowid" : aCol[aiColumn[i]].zName; |
| 116381 | 116381 | if( i>=nSkip ){ |
| 116382 | 116382 | explainAppendTerm(pStr, i, z, "="); |
| 116383 | 116383 | }else{ |
| r243644 | r243645 | |
| 116388 | 116388 | |
| 116389 | 116389 | j = i; |
| 116390 | 116390 | if( pLoop->wsFlags&WHERE_BTM_LIMIT ){ |
| 116391 | | char *z = aiColumn[j] < 0 ? "rowid" : aCol[aiColumn[j]].zName; |
| 116391 | char *z = aiColumn[j] < 0 ? (char*)"rowid" : aCol[aiColumn[j]].zName; |
| 116392 | 116392 | explainAppendTerm(pStr, i++, z, ">"); |
| 116393 | 116393 | } |
| 116394 | 116394 | if( pLoop->wsFlags&WHERE_TOP_LIMIT ){ |
| 116395 | | char *z = aiColumn[j] < 0 ? "rowid" : aCol[aiColumn[j]].zName; |
| 116395 | char *z = aiColumn[j] < 0 ? (char*)"rowid" : aCol[aiColumn[j]].zName; |
| 116396 | 116396 | explainAppendTerm(pStr, i, z, "<"); |
| 116397 | 116397 | } |
| 116398 | 116398 | sqlite3StrAccumAppend(pStr, ")", 1); |
| r243644 | r243645 | |
| 127315 | 127315 | mask = SQLITE_OPEN_SHAREDCACHE|SQLITE_OPEN_PRIVATECACHE; |
| 127316 | 127316 | aMode = aCacheMode; |
| 127317 | 127317 | limit = mask; |
| 127318 | | zModeType = "cache"; |
| 127318 | zModeType = (char*)"cache"; |
| 127319 | 127319 | } |
| 127320 | 127320 | if( nOpt==4 && memcmp("mode", zOpt, 4)==0 ){ |
| 127321 | 127321 | static struct OpenMode aOpenMode[] = { |
| r243644 | r243645 | |
| 127330 | 127330 | | SQLITE_OPEN_CREATE | SQLITE_OPEN_MEMORY; |
| 127331 | 127331 | aMode = aOpenMode; |
| 127332 | 127332 | limit = mask & flags; |
| 127333 | | zModeType = "access"; |
| 127333 | zModeType = (char*)"access"; |
| 127334 | 127334 | } |
| 127335 | 127335 | |
| 127336 | 127336 | if( aMode ){ |
| r243644 | r243645 | |
| 127559 | 127559 | /* The default safety_level for the main database is 'full'; for the temp |
| 127560 | 127560 | ** database it is 'NONE'. This matches the pager layer defaults. |
| 127561 | 127561 | */ |
| 127562 | | db->aDb[0].zName = "main"; |
| 127562 | db->aDb[0].zName = (char*)"main"; |
| 127563 | 127563 | db->aDb[0].safety_level = 3; |
| 127564 | | db->aDb[1].zName = "temp"; |
| 127564 | db->aDb[1].zName = (char*)"temp"; |
| 127565 | 127565 | db->aDb[1].safety_level = 1; |
| 127566 | 127566 | |
| 127567 | 127567 | db->magic = SQLITE_MAGIC_OPEN; |