OLD | NEW |
1 /* | 1 /* |
2 ** 2004 May 26 | 2 ** 2004 May 26 |
3 ** | 3 ** |
4 ** The author disclaims copyright to this source code. In place of | 4 ** The author disclaims copyright to this source code. In place of |
5 ** a legal notice, here is a blessing: | 5 ** a legal notice, here is a blessing: |
6 ** | 6 ** |
7 ** May you do good and not evil. | 7 ** May you do good and not evil. |
8 ** May you find forgiveness for yourself and forgive others. | 8 ** May you find forgiveness for yourself and forgive others. |
9 ** May you share freely, never taking more than you give. | 9 ** May you share freely, never taking more than you give. |
10 ** | 10 ** |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
193 assert( (pMem->flags&MEM_RowSet)==0 ); | 193 assert( (pMem->flags&MEM_RowSet)==0 ); |
194 ExpandBlob(pMem); | 194 ExpandBlob(pMem); |
195 f = pMem->flags; | 195 f = pMem->flags; |
196 if( (f&(MEM_Str|MEM_Blob)) && (pMem->szMalloc==0 || pMem->z!=pMem->zMalloc) ){ | 196 if( (f&(MEM_Str|MEM_Blob)) && (pMem->szMalloc==0 || pMem->z!=pMem->zMalloc) ){ |
197 if( sqlite3VdbeMemGrow(pMem, pMem->n + 2, 1) ){ | 197 if( sqlite3VdbeMemGrow(pMem, pMem->n + 2, 1) ){ |
198 return SQLITE_NOMEM; | 198 return SQLITE_NOMEM; |
199 } | 199 } |
200 pMem->z[pMem->n] = 0; | 200 pMem->z[pMem->n] = 0; |
201 pMem->z[pMem->n+1] = 0; | 201 pMem->z[pMem->n+1] = 0; |
202 pMem->flags |= MEM_Term; | 202 pMem->flags |= MEM_Term; |
| 203 } |
| 204 pMem->flags &= ~MEM_Ephem; |
203 #ifdef SQLITE_DEBUG | 205 #ifdef SQLITE_DEBUG |
204 pMem->pScopyFrom = 0; | 206 pMem->pScopyFrom = 0; |
205 #endif | 207 #endif |
206 } | |
207 | 208 |
208 return SQLITE_OK; | 209 return SQLITE_OK; |
209 } | 210 } |
210 | 211 |
211 /* | 212 /* |
212 ** If the given Mem* has a zero-filled tail, turn it into an ordinary | 213 ** If the given Mem* has a zero-filled tail, turn it into an ordinary |
213 ** blob stored in dynamically allocated space. | 214 ** blob stored in dynamically allocated space. |
214 */ | 215 */ |
215 #ifndef SQLITE_OMIT_INCRBLOB | 216 #ifndef SQLITE_OMIT_INCRBLOB |
216 int sqlite3VdbeMemExpandBlob(Mem *pMem){ | 217 int sqlite3VdbeMemExpandBlob(Mem *pMem){ |
(...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
580 /* | 581 /* |
581 ** Cast the datatype of the value in pMem according to the affinity | 582 ** Cast the datatype of the value in pMem according to the affinity |
582 ** "aff". Casting is different from applying affinity in that a cast | 583 ** "aff". Casting is different from applying affinity in that a cast |
583 ** is forced. In other words, the value is converted into the desired | 584 ** is forced. In other words, the value is converted into the desired |
584 ** affinity even if that results in loss of data. This routine is | 585 ** affinity even if that results in loss of data. This routine is |
585 ** used (for example) to implement the SQL "cast()" operator. | 586 ** used (for example) to implement the SQL "cast()" operator. |
586 */ | 587 */ |
587 void sqlite3VdbeMemCast(Mem *pMem, u8 aff, u8 encoding){ | 588 void sqlite3VdbeMemCast(Mem *pMem, u8 aff, u8 encoding){ |
588 if( pMem->flags & MEM_Null ) return; | 589 if( pMem->flags & MEM_Null ) return; |
589 switch( aff ){ | 590 switch( aff ){ |
590 case SQLITE_AFF_NONE: { /* Really a cast to BLOB */ | 591 case SQLITE_AFF_BLOB: { /* Really a cast to BLOB */ |
591 if( (pMem->flags & MEM_Blob)==0 ){ | 592 if( (pMem->flags & MEM_Blob)==0 ){ |
592 sqlite3ValueApplyAffinity(pMem, SQLITE_AFF_TEXT, encoding); | 593 sqlite3ValueApplyAffinity(pMem, SQLITE_AFF_TEXT, encoding); |
593 assert( pMem->flags & MEM_Str || pMem->db->mallocFailed ); | 594 assert( pMem->flags & MEM_Str || pMem->db->mallocFailed ); |
594 MemSetTypeFlag(pMem, MEM_Blob); | 595 MemSetTypeFlag(pMem, MEM_Blob); |
595 }else{ | 596 }else{ |
596 pMem->flags &= ~(MEM_TypeMask&~MEM_Blob); | 597 pMem->flags &= ~(MEM_TypeMask&~MEM_Blob); |
597 } | 598 } |
598 break; | 599 break; |
599 } | 600 } |
600 case SQLITE_AFF_NUMERIC: { | 601 case SQLITE_AFF_NUMERIC: { |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
762 for(i=1, pX=&pVdbe->aMem[1]; i<=pVdbe->nMem; i++, pX++){ | 763 for(i=1, pX=&pVdbe->aMem[1]; i<=pVdbe->nMem; i++, pX++){ |
763 if( pX->pScopyFrom==pMem ){ | 764 if( pX->pScopyFrom==pMem ){ |
764 pX->flags |= MEM_Undefined; | 765 pX->flags |= MEM_Undefined; |
765 pX->pScopyFrom = 0; | 766 pX->pScopyFrom = 0; |
766 } | 767 } |
767 } | 768 } |
768 pMem->pScopyFrom = 0; | 769 pMem->pScopyFrom = 0; |
769 } | 770 } |
770 #endif /* SQLITE_DEBUG */ | 771 #endif /* SQLITE_DEBUG */ |
771 | 772 |
772 /* | |
773 ** Size of struct Mem not including the Mem.zMalloc member. | |
774 */ | |
775 #define MEMCELLSIZE offsetof(Mem,zMalloc) | |
776 | 773 |
777 /* | 774 /* |
778 ** Make an shallow copy of pFrom into pTo. Prior contents of | 775 ** Make an shallow copy of pFrom into pTo. Prior contents of |
779 ** pTo are freed. The pFrom->z field is not duplicated. If | 776 ** pTo are freed. The pFrom->z field is not duplicated. If |
780 ** pFrom->z is used, then pTo->z points to the same thing as pFrom->z | 777 ** pFrom->z is used, then pTo->z points to the same thing as pFrom->z |
781 ** and flags gets srcType (either MEM_Ephem or MEM_Static). | 778 ** and flags gets srcType (either MEM_Ephem or MEM_Static). |
782 */ | 779 */ |
| 780 static SQLITE_NOINLINE void vdbeClrCopy(Mem *pTo, const Mem *pFrom, int eType){ |
| 781 vdbeMemClearExternAndSetNull(pTo); |
| 782 assert( !VdbeMemDynamic(pTo) ); |
| 783 sqlite3VdbeMemShallowCopy(pTo, pFrom, eType); |
| 784 } |
783 void sqlite3VdbeMemShallowCopy(Mem *pTo, const Mem *pFrom, int srcType){ | 785 void sqlite3VdbeMemShallowCopy(Mem *pTo, const Mem *pFrom, int srcType){ |
784 assert( (pFrom->flags & MEM_RowSet)==0 ); | 786 assert( (pFrom->flags & MEM_RowSet)==0 ); |
785 assert( pTo->db==pFrom->db ); | 787 assert( pTo->db==pFrom->db ); |
786 if( VdbeMemDynamic(pTo) ) vdbeMemClearExternAndSetNull(pTo); | 788 if( VdbeMemDynamic(pTo) ){ vdbeClrCopy(pTo,pFrom,srcType); return; } |
787 memcpy(pTo, pFrom, MEMCELLSIZE); | 789 memcpy(pTo, pFrom, MEMCELLSIZE); |
788 if( (pFrom->flags&MEM_Static)==0 ){ | 790 if( (pFrom->flags&MEM_Static)==0 ){ |
789 pTo->flags &= ~(MEM_Dyn|MEM_Static|MEM_Ephem); | 791 pTo->flags &= ~(MEM_Dyn|MEM_Static|MEM_Ephem); |
790 assert( srcType==MEM_Ephem || srcType==MEM_Static ); | 792 assert( srcType==MEM_Ephem || srcType==MEM_Static ); |
791 pTo->flags |= srcType; | 793 pTo->flags |= srcType; |
792 } | 794 } |
793 } | 795 } |
794 | 796 |
795 /* | 797 /* |
796 ** Make a full copy of pFrom into pTo. Prior contents of pTo are | 798 ** Make a full copy of pFrom into pTo. Prior contents of pTo are |
797 ** freed before the copy is made. | 799 ** freed before the copy is made. |
798 */ | 800 */ |
799 int sqlite3VdbeMemCopy(Mem *pTo, const Mem *pFrom){ | 801 int sqlite3VdbeMemCopy(Mem *pTo, const Mem *pFrom){ |
800 int rc = SQLITE_OK; | 802 int rc = SQLITE_OK; |
801 | 803 |
802 assert( pTo->db==pFrom->db ); | 804 /* The pFrom==0 case in the following assert() is when an sqlite3_value |
| 805 ** from sqlite3_value_dup() is used as the argument |
| 806 ** to sqlite3_result_value(). */ |
| 807 assert( pTo->db==pFrom->db || pFrom->db==0 ); |
803 assert( (pFrom->flags & MEM_RowSet)==0 ); | 808 assert( (pFrom->flags & MEM_RowSet)==0 ); |
804 if( VdbeMemDynamic(pTo) ) vdbeMemClearExternAndSetNull(pTo); | 809 if( VdbeMemDynamic(pTo) ) vdbeMemClearExternAndSetNull(pTo); |
805 memcpy(pTo, pFrom, MEMCELLSIZE); | 810 memcpy(pTo, pFrom, MEMCELLSIZE); |
806 pTo->flags &= ~MEM_Dyn; | 811 pTo->flags &= ~MEM_Dyn; |
807 if( pTo->flags&(MEM_Str|MEM_Blob) ){ | 812 if( pTo->flags&(MEM_Str|MEM_Blob) ){ |
808 if( 0==(pFrom->flags&MEM_Static) ){ | 813 if( 0==(pFrom->flags&MEM_Static) ){ |
809 pTo->flags |= MEM_Ephem; | 814 pTo->flags |= MEM_Ephem; |
810 rc = sqlite3VdbeMemMakeWriteable(pTo); | 815 rc = sqlite3VdbeMemMakeWriteable(pTo); |
811 } | 816 } |
812 } | 817 } |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
939 ** | 944 ** |
940 ** The pMem object must have been initialized. This routine will use | 945 ** The pMem object must have been initialized. This routine will use |
941 ** pMem->zMalloc to hold the content from the btree, if possible. New | 946 ** pMem->zMalloc to hold the content from the btree, if possible. New |
942 ** pMem->zMalloc space will be allocated if necessary. The calling routine | 947 ** pMem->zMalloc space will be allocated if necessary. The calling routine |
943 ** is responsible for making sure that the pMem object is eventually | 948 ** is responsible for making sure that the pMem object is eventually |
944 ** destroyed. | 949 ** destroyed. |
945 ** | 950 ** |
946 ** If this routine fails for any reason (malloc returns NULL or unable | 951 ** If this routine fails for any reason (malloc returns NULL or unable |
947 ** to read from the disk) then the pMem is left in an inconsistent state. | 952 ** to read from the disk) then the pMem is left in an inconsistent state. |
948 */ | 953 */ |
| 954 static SQLITE_NOINLINE int vdbeMemFromBtreeResize( |
| 955 BtCursor *pCur, /* Cursor pointing at record to retrieve. */ |
| 956 u32 offset, /* Offset from the start of data to return bytes from. */ |
| 957 u32 amt, /* Number of bytes to return. */ |
| 958 int key, /* If true, retrieve from the btree key, not data. */ |
| 959 Mem *pMem /* OUT: Return data in this Mem structure. */ |
| 960 ){ |
| 961 int rc; |
| 962 pMem->flags = MEM_Null; |
| 963 if( SQLITE_OK==(rc = sqlite3VdbeMemClearAndResize(pMem, amt+2)) ){ |
| 964 if( key ){ |
| 965 rc = sqlite3BtreeKey(pCur, offset, amt, pMem->z); |
| 966 }else{ |
| 967 rc = sqlite3BtreeData(pCur, offset, amt, pMem->z); |
| 968 } |
| 969 if( rc==SQLITE_OK ){ |
| 970 pMem->z[amt] = 0; |
| 971 pMem->z[amt+1] = 0; |
| 972 pMem->flags = MEM_Blob|MEM_Term; |
| 973 pMem->n = (int)amt; |
| 974 }else{ |
| 975 sqlite3VdbeMemRelease(pMem); |
| 976 } |
| 977 } |
| 978 return rc; |
| 979 } |
949 int sqlite3VdbeMemFromBtree( | 980 int sqlite3VdbeMemFromBtree( |
950 BtCursor *pCur, /* Cursor pointing at record to retrieve. */ | 981 BtCursor *pCur, /* Cursor pointing at record to retrieve. */ |
951 u32 offset, /* Offset from the start of data to return bytes from. */ | 982 u32 offset, /* Offset from the start of data to return bytes from. */ |
952 u32 amt, /* Number of bytes to return. */ | 983 u32 amt, /* Number of bytes to return. */ |
953 int key, /* If true, retrieve from the btree key, not data. */ | 984 int key, /* If true, retrieve from the btree key, not data. */ |
954 Mem *pMem /* OUT: Return data in this Mem structure. */ | 985 Mem *pMem /* OUT: Return data in this Mem structure. */ |
955 ){ | 986 ){ |
956 char *zData; /* Data from the btree layer */ | 987 char *zData; /* Data from the btree layer */ |
957 u32 available = 0; /* Number of bytes available on the local btree page */ | 988 u32 available = 0; /* Number of bytes available on the local btree page */ |
958 int rc = SQLITE_OK; /* Return code */ | 989 int rc = SQLITE_OK; /* Return code */ |
959 | 990 |
960 assert( sqlite3BtreeCursorIsValid(pCur) ); | 991 assert( sqlite3BtreeCursorIsValid(pCur) ); |
961 assert( !VdbeMemDynamic(pMem) ); | 992 assert( !VdbeMemDynamic(pMem) ); |
962 | 993 |
963 /* Note: the calls to BtreeKeyFetch() and DataFetch() below assert() | 994 /* Note: the calls to BtreeKeyFetch() and DataFetch() below assert() |
964 ** that both the BtShared and database handle mutexes are held. */ | 995 ** that both the BtShared and database handle mutexes are held. */ |
965 assert( (pMem->flags & MEM_RowSet)==0 ); | 996 assert( (pMem->flags & MEM_RowSet)==0 ); |
966 if( key ){ | 997 if( key ){ |
967 zData = (char *)sqlite3BtreeKeyFetch(pCur, &available); | 998 zData = (char *)sqlite3BtreeKeyFetch(pCur, &available); |
968 }else{ | 999 }else{ |
969 zData = (char *)sqlite3BtreeDataFetch(pCur, &available); | 1000 zData = (char *)sqlite3BtreeDataFetch(pCur, &available); |
970 } | 1001 } |
971 assert( zData!=0 ); | 1002 assert( zData!=0 ); |
972 | 1003 |
973 if( offset+amt<=available ){ | 1004 if( offset+amt<=available ){ |
974 pMem->z = &zData[offset]; | 1005 pMem->z = &zData[offset]; |
975 pMem->flags = MEM_Blob|MEM_Ephem; | 1006 pMem->flags = MEM_Blob|MEM_Ephem; |
976 pMem->n = (int)amt; | 1007 pMem->n = (int)amt; |
977 }else{ | 1008 }else{ |
978 pMem->flags = MEM_Null; | 1009 rc = vdbeMemFromBtreeResize(pCur, offset, amt, key, pMem); |
979 if( SQLITE_OK==(rc = sqlite3VdbeMemClearAndResize(pMem, amt+2)) ){ | |
980 if( key ){ | |
981 rc = sqlite3BtreeKey(pCur, offset, amt, pMem->z); | |
982 }else{ | |
983 rc = sqlite3BtreeData(pCur, offset, amt, pMem->z); | |
984 } | |
985 if( rc==SQLITE_OK ){ | |
986 pMem->z[amt] = 0; | |
987 pMem->z[amt+1] = 0; | |
988 pMem->flags = MEM_Blob|MEM_Term; | |
989 pMem->n = (int)amt; | |
990 }else{ | |
991 sqlite3VdbeMemRelease(pMem); | |
992 } | |
993 } | |
994 } | 1010 } |
995 | 1011 |
996 return rc; | 1012 return rc; |
997 } | 1013 } |
998 | 1014 |
999 /* | 1015 /* |
1000 ** The pVal argument is known to be a value other than NULL. | 1016 ** The pVal argument is known to be a value other than NULL. |
1001 ** Convert it into a string with encoding enc and return a pointer | 1017 ** Convert it into a string with encoding enc and return a pointer |
1002 ** to a zero-terminated version of that string. | 1018 ** to a zero-terminated version of that string. |
1003 */ | 1019 */ |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1083 }; | 1099 }; |
1084 | 1100 |
1085 /* | 1101 /* |
1086 ** Allocate and return a pointer to a new sqlite3_value object. If | 1102 ** Allocate and return a pointer to a new sqlite3_value object. If |
1087 ** the second argument to this function is NULL, the object is allocated | 1103 ** the second argument to this function is NULL, the object is allocated |
1088 ** by calling sqlite3ValueNew(). | 1104 ** by calling sqlite3ValueNew(). |
1089 ** | 1105 ** |
1090 ** Otherwise, if the second argument is non-zero, then this function is | 1106 ** Otherwise, if the second argument is non-zero, then this function is |
1091 ** being called indirectly by sqlite3Stat4ProbeSetValue(). If it has not | 1107 ** being called indirectly by sqlite3Stat4ProbeSetValue(). If it has not |
1092 ** already been allocated, allocate the UnpackedRecord structure that | 1108 ** already been allocated, allocate the UnpackedRecord structure that |
1093 ** that function will return to its caller here. Then return a pointer | 1109 ** that function will return to its caller here. Then return a pointer to |
1094 ** an sqlite3_value within the UnpackedRecord.a[] array. | 1110 ** an sqlite3_value within the UnpackedRecord.a[] array. |
1095 */ | 1111 */ |
1096 static sqlite3_value *valueNew(sqlite3 *db, struct ValueNewStat4Ctx *p){ | 1112 static sqlite3_value *valueNew(sqlite3 *db, struct ValueNewStat4Ctx *p){ |
1097 #ifdef SQLITE_ENABLE_STAT3_OR_STAT4 | 1113 #ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
1098 if( p ){ | 1114 if( p ){ |
1099 UnpackedRecord *pRec = p->ppRec[0]; | 1115 UnpackedRecord *pRec = p->ppRec[0]; |
1100 | 1116 |
1101 if( pRec==0 ){ | 1117 if( pRec==0 ){ |
1102 Index *pIdx = p->pIdx; /* Index being probed */ | 1118 Index *pIdx = p->pIdx; /* Index being probed */ |
1103 int nByte; /* Bytes of space to allocate */ | 1119 int nByte; /* Bytes of space to allocate */ |
(...skipping 24 matching lines...) Expand all Loading... |
1128 pRec->nField = p->iVal+1; | 1144 pRec->nField = p->iVal+1; |
1129 return &pRec->aMem[p->iVal]; | 1145 return &pRec->aMem[p->iVal]; |
1130 } | 1146 } |
1131 #else | 1147 #else |
1132 UNUSED_PARAMETER(p); | 1148 UNUSED_PARAMETER(p); |
1133 #endif /* defined(SQLITE_ENABLE_STAT3_OR_STAT4) */ | 1149 #endif /* defined(SQLITE_ENABLE_STAT3_OR_STAT4) */ |
1134 return sqlite3ValueNew(db); | 1150 return sqlite3ValueNew(db); |
1135 } | 1151 } |
1136 | 1152 |
1137 /* | 1153 /* |
| 1154 ** The expression object indicated by the second argument is guaranteed |
| 1155 ** to be a scalar SQL function. If |
| 1156 ** |
| 1157 ** * all function arguments are SQL literals, |
| 1158 ** * one of the SQLITE_FUNC_CONSTANT or _SLOCHNG function flags is set, and |
| 1159 ** * the SQLITE_FUNC_NEEDCOLL function flag is not set, |
| 1160 ** |
| 1161 ** then this routine attempts to invoke the SQL function. Assuming no |
| 1162 ** error occurs, output parameter (*ppVal) is set to point to a value |
| 1163 ** object containing the result before returning SQLITE_OK. |
| 1164 ** |
| 1165 ** Affinity aff is applied to the result of the function before returning. |
| 1166 ** If the result is a text value, the sqlite3_value object uses encoding |
| 1167 ** enc. |
| 1168 ** |
| 1169 ** If the conditions above are not met, this function returns SQLITE_OK |
| 1170 ** and sets (*ppVal) to NULL. Or, if an error occurs, (*ppVal) is set to |
| 1171 ** NULL and an SQLite error code returned. |
| 1172 */ |
| 1173 #ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 1174 static int valueFromFunction( |
| 1175 sqlite3 *db, /* The database connection */ |
| 1176 Expr *p, /* The expression to evaluate */ |
| 1177 u8 enc, /* Encoding to use */ |
| 1178 u8 aff, /* Affinity to use */ |
| 1179 sqlite3_value **ppVal, /* Write the new value here */ |
| 1180 struct ValueNewStat4Ctx *pCtx /* Second argument for valueNew() */ |
| 1181 ){ |
| 1182 sqlite3_context ctx; /* Context object for function invocation */ |
| 1183 sqlite3_value **apVal = 0; /* Function arguments */ |
| 1184 int nVal = 0; /* Size of apVal[] array */ |
| 1185 FuncDef *pFunc = 0; /* Function definition */ |
| 1186 sqlite3_value *pVal = 0; /* New value */ |
| 1187 int rc = SQLITE_OK; /* Return code */ |
| 1188 int nName; /* Size of function name in bytes */ |
| 1189 ExprList *pList = 0; /* Function arguments */ |
| 1190 int i; /* Iterator variable */ |
| 1191 |
| 1192 assert( pCtx!=0 ); |
| 1193 assert( (p->flags & EP_TokenOnly)==0 ); |
| 1194 pList = p->x.pList; |
| 1195 if( pList ) nVal = pList->nExpr; |
| 1196 nName = sqlite3Strlen30(p->u.zToken); |
| 1197 pFunc = sqlite3FindFunction(db, p->u.zToken, nName, nVal, enc, 0); |
| 1198 assert( pFunc ); |
| 1199 if( (pFunc->funcFlags & (SQLITE_FUNC_CONSTANT|SQLITE_FUNC_SLOCHNG))==0 |
| 1200 || (pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL) |
| 1201 ){ |
| 1202 return SQLITE_OK; |
| 1203 } |
| 1204 |
| 1205 if( pList ){ |
| 1206 apVal = (sqlite3_value**)sqlite3DbMallocZero(db, sizeof(apVal[0]) * nVal); |
| 1207 if( apVal==0 ){ |
| 1208 rc = SQLITE_NOMEM; |
| 1209 goto value_from_function_out; |
| 1210 } |
| 1211 for(i=0; i<nVal; i++){ |
| 1212 rc = sqlite3ValueFromExpr(db, pList->a[i].pExpr, enc, aff, &apVal[i]); |
| 1213 if( apVal[i]==0 || rc!=SQLITE_OK ) goto value_from_function_out; |
| 1214 } |
| 1215 } |
| 1216 |
| 1217 pVal = valueNew(db, pCtx); |
| 1218 if( pVal==0 ){ |
| 1219 rc = SQLITE_NOMEM; |
| 1220 goto value_from_function_out; |
| 1221 } |
| 1222 |
| 1223 assert( pCtx->pParse->rc==SQLITE_OK ); |
| 1224 memset(&ctx, 0, sizeof(ctx)); |
| 1225 ctx.pOut = pVal; |
| 1226 ctx.pFunc = pFunc; |
| 1227 pFunc->xFunc(&ctx, nVal, apVal); |
| 1228 if( ctx.isError ){ |
| 1229 rc = ctx.isError; |
| 1230 sqlite3ErrorMsg(pCtx->pParse, "%s", sqlite3_value_text(pVal)); |
| 1231 }else{ |
| 1232 sqlite3ValueApplyAffinity(pVal, aff, SQLITE_UTF8); |
| 1233 assert( rc==SQLITE_OK ); |
| 1234 rc = sqlite3VdbeChangeEncoding(pVal, enc); |
| 1235 if( rc==SQLITE_OK && sqlite3VdbeMemTooBig(pVal) ){ |
| 1236 rc = SQLITE_TOOBIG; |
| 1237 pCtx->pParse->nErr++; |
| 1238 } |
| 1239 } |
| 1240 pCtx->pParse->rc = rc; |
| 1241 |
| 1242 value_from_function_out: |
| 1243 if( rc!=SQLITE_OK ){ |
| 1244 pVal = 0; |
| 1245 } |
| 1246 if( apVal ){ |
| 1247 for(i=0; i<nVal; i++){ |
| 1248 sqlite3ValueFree(apVal[i]); |
| 1249 } |
| 1250 sqlite3DbFree(db, apVal); |
| 1251 } |
| 1252 |
| 1253 *ppVal = pVal; |
| 1254 return rc; |
| 1255 } |
| 1256 #else |
| 1257 # define valueFromFunction(a,b,c,d,e,f) SQLITE_OK |
| 1258 #endif /* defined(SQLITE_ENABLE_STAT3_OR_STAT4) */ |
| 1259 |
| 1260 /* |
1138 ** Extract a value from the supplied expression in the manner described | 1261 ** Extract a value from the supplied expression in the manner described |
1139 ** above sqlite3ValueFromExpr(). Allocate the sqlite3_value object | 1262 ** above sqlite3ValueFromExpr(). Allocate the sqlite3_value object |
1140 ** using valueNew(). | 1263 ** using valueNew(). |
1141 ** | 1264 ** |
1142 ** If pCtx is NULL and an error occurs after the sqlite3_value object | 1265 ** If pCtx is NULL and an error occurs after the sqlite3_value object |
1143 ** has been allocated, it is freed before returning. Or, if pCtx is not | 1266 ** has been allocated, it is freed before returning. Or, if pCtx is not |
1144 ** NULL, it is assumed that the caller will free any allocated object | 1267 ** NULL, it is assumed that the caller will free any allocated object |
1145 ** in all cases. | 1268 ** in all cases. |
1146 */ | 1269 */ |
1147 static int valueFromExpr( | 1270 static int valueFromExpr( |
(...skipping 11 matching lines...) Expand all Loading... |
1159 const char *zNeg = ""; | 1282 const char *zNeg = ""; |
1160 int rc = SQLITE_OK; | 1283 int rc = SQLITE_OK; |
1161 | 1284 |
1162 if( !pExpr ){ | 1285 if( !pExpr ){ |
1163 *ppVal = 0; | 1286 *ppVal = 0; |
1164 return SQLITE_OK; | 1287 return SQLITE_OK; |
1165 } | 1288 } |
1166 while( (op = pExpr->op)==TK_UPLUS ) pExpr = pExpr->pLeft; | 1289 while( (op = pExpr->op)==TK_UPLUS ) pExpr = pExpr->pLeft; |
1167 if( NEVER(op==TK_REGISTER) ) op = pExpr->op2; | 1290 if( NEVER(op==TK_REGISTER) ) op = pExpr->op2; |
1168 | 1291 |
| 1292 /* Compressed expressions only appear when parsing the DEFAULT clause |
| 1293 ** on a table column definition, and hence only when pCtx==0. This |
| 1294 ** check ensures that an EP_TokenOnly expression is never passed down |
| 1295 ** into valueFromFunction(). */ |
| 1296 assert( (pExpr->flags & EP_TokenOnly)==0 || pCtx==0 ); |
| 1297 |
1169 if( op==TK_CAST ){ | 1298 if( op==TK_CAST ){ |
1170 u8 aff = sqlite3AffinityType(pExpr->u.zToken,0); | 1299 u8 aff = sqlite3AffinityType(pExpr->u.zToken,0); |
1171 rc = valueFromExpr(db, pExpr->pLeft, enc, aff, ppVal, pCtx); | 1300 rc = valueFromExpr(db, pExpr->pLeft, enc, aff, ppVal, pCtx); |
1172 testcase( rc!=SQLITE_OK ); | 1301 testcase( rc!=SQLITE_OK ); |
1173 if( *ppVal ){ | 1302 if( *ppVal ){ |
1174 sqlite3VdbeMemCast(*ppVal, aff, SQLITE_UTF8); | 1303 sqlite3VdbeMemCast(*ppVal, aff, SQLITE_UTF8); |
1175 sqlite3ValueApplyAffinity(*ppVal, affinity, SQLITE_UTF8); | 1304 sqlite3ValueApplyAffinity(*ppVal, affinity, SQLITE_UTF8); |
1176 } | 1305 } |
1177 return rc; | 1306 return rc; |
1178 } | 1307 } |
(...skipping 12 matching lines...) Expand all Loading... |
1191 if( op==TK_STRING || op==TK_FLOAT || op==TK_INTEGER ){ | 1320 if( op==TK_STRING || op==TK_FLOAT || op==TK_INTEGER ){ |
1192 pVal = valueNew(db, pCtx); | 1321 pVal = valueNew(db, pCtx); |
1193 if( pVal==0 ) goto no_mem; | 1322 if( pVal==0 ) goto no_mem; |
1194 if( ExprHasProperty(pExpr, EP_IntValue) ){ | 1323 if( ExprHasProperty(pExpr, EP_IntValue) ){ |
1195 sqlite3VdbeMemSetInt64(pVal, (i64)pExpr->u.iValue*negInt); | 1324 sqlite3VdbeMemSetInt64(pVal, (i64)pExpr->u.iValue*negInt); |
1196 }else{ | 1325 }else{ |
1197 zVal = sqlite3MPrintf(db, "%s%s", zNeg, pExpr->u.zToken); | 1326 zVal = sqlite3MPrintf(db, "%s%s", zNeg, pExpr->u.zToken); |
1198 if( zVal==0 ) goto no_mem; | 1327 if( zVal==0 ) goto no_mem; |
1199 sqlite3ValueSetStr(pVal, -1, zVal, SQLITE_UTF8, SQLITE_DYNAMIC); | 1328 sqlite3ValueSetStr(pVal, -1, zVal, SQLITE_UTF8, SQLITE_DYNAMIC); |
1200 } | 1329 } |
1201 if( (op==TK_INTEGER || op==TK_FLOAT ) && affinity==SQLITE_AFF_NONE ){ | 1330 if( (op==TK_INTEGER || op==TK_FLOAT ) && affinity==SQLITE_AFF_BLOB ){ |
1202 sqlite3ValueApplyAffinity(pVal, SQLITE_AFF_NUMERIC, SQLITE_UTF8); | 1331 sqlite3ValueApplyAffinity(pVal, SQLITE_AFF_NUMERIC, SQLITE_UTF8); |
1203 }else{ | 1332 }else{ |
1204 sqlite3ValueApplyAffinity(pVal, affinity, SQLITE_UTF8); | 1333 sqlite3ValueApplyAffinity(pVal, affinity, SQLITE_UTF8); |
1205 } | 1334 } |
1206 if( pVal->flags & (MEM_Int|MEM_Real) ) pVal->flags &= ~MEM_Str; | 1335 if( pVal->flags & (MEM_Int|MEM_Real) ) pVal->flags &= ~MEM_Str; |
1207 if( enc!=SQLITE_UTF8 ){ | 1336 if( enc!=SQLITE_UTF8 ){ |
1208 rc = sqlite3VdbeChangeEncoding(pVal, enc); | 1337 rc = sqlite3VdbeChangeEncoding(pVal, enc); |
1209 } | 1338 } |
1210 }else if( op==TK_UMINUS ) { | 1339 }else if( op==TK_UMINUS ) { |
1211 /* This branch happens for multiple negative signs. Ex: -(-5) */ | 1340 /* This branch happens for multiple negative signs. Ex: -(-5) */ |
(...skipping 23 matching lines...) Expand all Loading... |
1235 pVal = valueNew(db, pCtx); | 1364 pVal = valueNew(db, pCtx); |
1236 if( !pVal ) goto no_mem; | 1365 if( !pVal ) goto no_mem; |
1237 zVal = &pExpr->u.zToken[2]; | 1366 zVal = &pExpr->u.zToken[2]; |
1238 nVal = sqlite3Strlen30(zVal)-1; | 1367 nVal = sqlite3Strlen30(zVal)-1; |
1239 assert( zVal[nVal]=='\'' ); | 1368 assert( zVal[nVal]=='\'' ); |
1240 sqlite3VdbeMemSetStr(pVal, sqlite3HexToBlob(db, zVal, nVal), nVal/2, | 1369 sqlite3VdbeMemSetStr(pVal, sqlite3HexToBlob(db, zVal, nVal), nVal/2, |
1241 0, SQLITE_DYNAMIC); | 1370 0, SQLITE_DYNAMIC); |
1242 } | 1371 } |
1243 #endif | 1372 #endif |
1244 | 1373 |
| 1374 #ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
| 1375 else if( op==TK_FUNCTION && pCtx!=0 ){ |
| 1376 rc = valueFromFunction(db, pExpr, enc, affinity, &pVal, pCtx); |
| 1377 } |
| 1378 #endif |
| 1379 |
1245 *ppVal = pVal; | 1380 *ppVal = pVal; |
1246 return rc; | 1381 return rc; |
1247 | 1382 |
1248 no_mem: | 1383 no_mem: |
1249 db->mallocFailed = 1; | 1384 db->mallocFailed = 1; |
1250 sqlite3DbFree(db, zVal); | 1385 sqlite3DbFree(db, zVal); |
1251 assert( *ppVal==0 ); | 1386 assert( *ppVal==0 ); |
1252 #ifdef SQLITE_ENABLE_STAT3_OR_STAT4 | 1387 #ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
1253 if( pCtx==0 ) sqlite3ValueFree(pVal); | 1388 if( pCtx==0 ) sqlite3ValueFree(pVal); |
1254 #else | 1389 #else |
(...skipping 30 matching lines...) Expand all Loading... |
1285 ** | 1420 ** |
1286 ** This is used to convert the value stored in the 'sample' column of the | 1421 ** This is used to convert the value stored in the 'sample' column of the |
1287 ** sqlite_stat3 table to the record format SQLite uses internally. | 1422 ** sqlite_stat3 table to the record format SQLite uses internally. |
1288 */ | 1423 */ |
1289 static void recordFunc( | 1424 static void recordFunc( |
1290 sqlite3_context *context, | 1425 sqlite3_context *context, |
1291 int argc, | 1426 int argc, |
1292 sqlite3_value **argv | 1427 sqlite3_value **argv |
1293 ){ | 1428 ){ |
1294 const int file_format = 1; | 1429 const int file_format = 1; |
1295 int iSerial; /* Serial type */ | 1430 u32 iSerial; /* Serial type */ |
1296 int nSerial; /* Bytes of space for iSerial as varint */ | 1431 int nSerial; /* Bytes of space for iSerial as varint */ |
1297 int nVal; /* Bytes of space required for argv[0] */ | 1432 u32 nVal; /* Bytes of space required for argv[0] */ |
1298 int nRet; | 1433 int nRet; |
1299 sqlite3 *db; | 1434 sqlite3 *db; |
1300 u8 *aRet; | 1435 u8 *aRet; |
1301 | 1436 |
1302 UNUSED_PARAMETER( argc ); | 1437 UNUSED_PARAMETER( argc ); |
1303 iSerial = sqlite3VdbeSerialType(argv[0], file_format); | 1438 iSerial = sqlite3VdbeSerialType(argv[0], file_format, &nVal); |
1304 nSerial = sqlite3VarintLen(iSerial); | 1439 nSerial = sqlite3VarintLen(iSerial); |
1305 nVal = sqlite3VdbeSerialTypeLen(iSerial); | |
1306 db = sqlite3_context_db_handle(context); | 1440 db = sqlite3_context_db_handle(context); |
1307 | 1441 |
1308 nRet = 1 + nSerial + nVal; | 1442 nRet = 1 + nSerial + nVal; |
1309 aRet = sqlite3DbMallocRaw(db, nRet); | 1443 aRet = sqlite3DbMallocRaw(db, nRet); |
1310 if( aRet==0 ){ | 1444 if( aRet==0 ){ |
1311 sqlite3_result_error_nomem(context); | 1445 sqlite3_result_error_nomem(context); |
1312 }else{ | 1446 }else{ |
1313 aRet[0] = nSerial+1; | 1447 aRet[0] = nSerial+1; |
1314 putVarint32(&aRet[1], iSerial); | 1448 putVarint32(&aRet[1], iSerial); |
1315 sqlite3VdbeSerialPut(&aRet[1+nSerial], argv[0], iSerial); | 1449 sqlite3VdbeSerialPut(&aRet[1+nSerial], argv[0], iSerial); |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1521 ** by an earlier call to sqlite3Stat4ProbeSetValue(). This call deletes | 1655 ** by an earlier call to sqlite3Stat4ProbeSetValue(). This call deletes |
1522 ** the object. | 1656 ** the object. |
1523 */ | 1657 */ |
1524 void sqlite3Stat4ProbeFree(UnpackedRecord *pRec){ | 1658 void sqlite3Stat4ProbeFree(UnpackedRecord *pRec){ |
1525 if( pRec ){ | 1659 if( pRec ){ |
1526 int i; | 1660 int i; |
1527 int nCol = pRec->pKeyInfo->nField+pRec->pKeyInfo->nXField; | 1661 int nCol = pRec->pKeyInfo->nField+pRec->pKeyInfo->nXField; |
1528 Mem *aMem = pRec->aMem; | 1662 Mem *aMem = pRec->aMem; |
1529 sqlite3 *db = aMem[0].db; | 1663 sqlite3 *db = aMem[0].db; |
1530 for(i=0; i<nCol; i++){ | 1664 for(i=0; i<nCol; i++){ |
1531 if( aMem[i].szMalloc ) sqlite3DbFree(db, aMem[i].zMalloc); | 1665 sqlite3VdbeMemRelease(&aMem[i]); |
1532 } | 1666 } |
1533 sqlite3KeyInfoUnref(pRec->pKeyInfo); | 1667 sqlite3KeyInfoUnref(pRec->pKeyInfo); |
1534 sqlite3DbFree(db, pRec); | 1668 sqlite3DbFree(db, pRec); |
1535 } | 1669 } |
1536 } | 1670 } |
1537 #endif /* ifdef SQLITE_ENABLE_STAT4 */ | 1671 #endif /* ifdef SQLITE_ENABLE_STAT4 */ |
1538 | 1672 |
1539 /* | 1673 /* |
1540 ** Change the string value of an sqlite3_value object | 1674 ** Change the string value of an sqlite3_value object |
1541 */ | 1675 */ |
(...skipping 10 matching lines...) Expand all Loading... |
1552 /* | 1686 /* |
1553 ** Free an sqlite3_value object | 1687 ** Free an sqlite3_value object |
1554 */ | 1688 */ |
1555 void sqlite3ValueFree(sqlite3_value *v){ | 1689 void sqlite3ValueFree(sqlite3_value *v){ |
1556 if( !v ) return; | 1690 if( !v ) return; |
1557 sqlite3VdbeMemRelease((Mem *)v); | 1691 sqlite3VdbeMemRelease((Mem *)v); |
1558 sqlite3DbFree(((Mem*)v)->db, v); | 1692 sqlite3DbFree(((Mem*)v)->db, v); |
1559 } | 1693 } |
1560 | 1694 |
1561 /* | 1695 /* |
1562 ** Return the number of bytes in the sqlite3_value object assuming | 1696 ** The sqlite3ValueBytes() routine returns the number of bytes in the |
1563 ** that it uses the encoding "enc" | 1697 ** sqlite3_value object assuming that it uses the encoding "enc". |
| 1698 ** The valueBytes() routine is a helper function. |
1564 */ | 1699 */ |
| 1700 static SQLITE_NOINLINE int valueBytes(sqlite3_value *pVal, u8 enc){ |
| 1701 return valueToText(pVal, enc)!=0 ? pVal->n : 0; |
| 1702 } |
1565 int sqlite3ValueBytes(sqlite3_value *pVal, u8 enc){ | 1703 int sqlite3ValueBytes(sqlite3_value *pVal, u8 enc){ |
1566 Mem *p = (Mem*)pVal; | 1704 Mem *p = (Mem*)pVal; |
1567 if( (p->flags & MEM_Blob)!=0 || sqlite3ValueText(pVal, enc) ){ | 1705 assert( (p->flags & MEM_Null)==0 || (p->flags & (MEM_Str|MEM_Blob))==0 ); |
| 1706 if( (p->flags & MEM_Str)!=0 && pVal->enc==enc ){ |
| 1707 return p->n; |
| 1708 } |
| 1709 if( (p->flags & MEM_Blob)!=0 ){ |
1568 if( p->flags & MEM_Zero ){ | 1710 if( p->flags & MEM_Zero ){ |
1569 return p->n + p->u.nZero; | 1711 return p->n + p->u.nZero; |
1570 }else{ | 1712 }else{ |
1571 return p->n; | 1713 return p->n; |
1572 } | 1714 } |
1573 } | 1715 } |
1574 return 0; | 1716 if( p->flags & MEM_Null ) return 0; |
| 1717 return valueBytes(pVal, enc); |
1575 } | 1718 } |
OLD | NEW |