Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(118)

Side by Side Diff: third_party/sqlite/src/src/callback.c

Issue 2751253002: [sql] Import SQLite 3.17.0. (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 ** 2005 May 23 2 ** 2005 May 23
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 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 memcpy(pColl[0].zName, zName, nName); 170 memcpy(pColl[0].zName, zName, nName);
171 pColl[0].zName[nName] = 0; 171 pColl[0].zName[nName] = 0;
172 pDel = sqlite3HashInsert(&db->aCollSeq, pColl[0].zName, pColl); 172 pDel = sqlite3HashInsert(&db->aCollSeq, pColl[0].zName, pColl);
173 173
174 /* If a malloc() failure occurred in sqlite3HashInsert(), it will 174 /* If a malloc() failure occurred in sqlite3HashInsert(), it will
175 ** return the pColl pointer to be deleted (because it wasn't added 175 ** return the pColl pointer to be deleted (because it wasn't added
176 ** to the hash table). 176 ** to the hash table).
177 */ 177 */
178 assert( pDel==0 || pDel==pColl ); 178 assert( pDel==0 || pDel==pColl );
179 if( pDel!=0 ){ 179 if( pDel!=0 ){
180 db->mallocFailed = 1; 180 sqlite3OomFault(db);
181 sqlite3DbFree(db, pDel); 181 sqlite3DbFree(db, pDel);
182 pColl = 0; 182 pColl = 0;
183 } 183 }
184 } 184 }
185 } 185 }
186 return pColl; 186 return pColl;
187 } 187 }
188 188
189 /* 189 /*
190 ** Parameter zName points to a UTF-8 encoded string nName bytes long. 190 ** Parameter zName points to a UTF-8 encoded string nName bytes long.
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
236 ** The returned value is always between 0 and 6, as follows: 236 ** The returned value is always between 0 and 6, as follows:
237 ** 237 **
238 ** 0: Not a match. 238 ** 0: Not a match.
239 ** 1: UTF8/16 conversion required and function takes any number of arguments. 239 ** 1: UTF8/16 conversion required and function takes any number of arguments.
240 ** 2: UTF16 byte order change required and function takes any number of args. 240 ** 2: UTF16 byte order change required and function takes any number of args.
241 ** 3: encoding matches and function takes any number of arguments 241 ** 3: encoding matches and function takes any number of arguments
242 ** 4: UTF8/16 conversion required - argument count matches exactly 242 ** 4: UTF8/16 conversion required - argument count matches exactly
243 ** 5: UTF16 byte order conversion required - argument count matches exactly 243 ** 5: UTF16 byte order conversion required - argument count matches exactly
244 ** 6: Perfect match: encoding and argument count match exactly. 244 ** 6: Perfect match: encoding and argument count match exactly.
245 ** 245 **
246 ** If nArg==(-2) then any function with a non-null xStep or xFunc is 246 ** If nArg==(-2) then any function with a non-null xSFunc is
247 ** a perfect match and any function with both xStep and xFunc NULL is 247 ** a perfect match and any function with xSFunc NULL is
248 ** a non-match. 248 ** a non-match.
249 */ 249 */
250 #define FUNC_PERFECT_MATCH 6 /* The score for a perfect match */ 250 #define FUNC_PERFECT_MATCH 6 /* The score for a perfect match */
251 static int matchQuality( 251 static int matchQuality(
252 FuncDef *p, /* The function we are evaluating for match quality */ 252 FuncDef *p, /* The function we are evaluating for match quality */
253 int nArg, /* Desired number of arguments. (-1)==any */ 253 int nArg, /* Desired number of arguments. (-1)==any */
254 u8 enc /* Desired text encoding */ 254 u8 enc /* Desired text encoding */
255 ){ 255 ){
256 int match; 256 int match;
257 257
258 /* nArg of -2 is a special case */ 258 /* nArg of -2 is a special case */
259 if( nArg==(-2) ) return (p->xFunc==0 && p->xStep==0) ? 0 : FUNC_PERFECT_MATCH; 259 if( nArg==(-2) ) return (p->xSFunc==0) ? 0 : FUNC_PERFECT_MATCH;
260 260
261 /* Wrong number of arguments means "no match" */ 261 /* Wrong number of arguments means "no match" */
262 if( p->nArg!=nArg && p->nArg>=0 ) return 0; 262 if( p->nArg!=nArg && p->nArg>=0 ) return 0;
263 263
264 /* Give a better score to a function with a specific number of arguments 264 /* Give a better score to a function with a specific number of arguments
265 ** than to function that accepts any number of arguments. */ 265 ** than to function that accepts any number of arguments. */
266 if( p->nArg==nArg ){ 266 if( p->nArg==nArg ){
267 match = 4; 267 match = 4;
268 }else{ 268 }else{
269 match = 1; 269 match = 1;
270 } 270 }
271 271
272 /* Bonus points if the text encoding matches */ 272 /* Bonus points if the text encoding matches */
273 if( enc==(p->funcFlags & SQLITE_FUNC_ENCMASK) ){ 273 if( enc==(p->funcFlags & SQLITE_FUNC_ENCMASK) ){
274 match += 2; /* Exact encoding match */ 274 match += 2; /* Exact encoding match */
275 }else if( (enc & p->funcFlags & 2)!=0 ){ 275 }else if( (enc & p->funcFlags & 2)!=0 ){
276 match += 1; /* Both are UTF16, but with different byte orders */ 276 match += 1; /* Both are UTF16, but with different byte orders */
277 } 277 }
278 278
279 return match; 279 return match;
280 } 280 }
281 281
282 /* 282 /*
283 ** Search a FuncDefHash for a function with the given name. Return 283 ** Search a FuncDefHash for a function with the given name. Return
284 ** a pointer to the matching FuncDef if found, or 0 if there is no match. 284 ** a pointer to the matching FuncDef if found, or 0 if there is no match.
285 */ 285 */
286 static FuncDef *functionSearch( 286 static FuncDef *functionSearch(
287 FuncDefHash *pHash, /* Hash table to search */
288 int h, /* Hash of the name */ 287 int h, /* Hash of the name */
289 const char *zFunc, /* Name of function */ 288 const char *zFunc /* Name of function */
290 int nFunc /* Number of bytes in zFunc */
291 ){ 289 ){
292 FuncDef *p; 290 FuncDef *p;
293 for(p=pHash->a[h]; p; p=p->pHash){ 291 for(p=sqlite3BuiltinFunctions.a[h]; p; p=p->u.pHash){
294 if( sqlite3StrNICmp(p->zName, zFunc, nFunc)==0 && p->zName[nFunc]==0 ){ 292 if( sqlite3StrICmp(p->zName, zFunc)==0 ){
295 return p; 293 return p;
296 } 294 }
297 } 295 }
298 return 0; 296 return 0;
299 } 297 }
300 298
301 /* 299 /*
302 ** Insert a new FuncDef into a FuncDefHash hash table. 300 ** Insert a new FuncDef into a FuncDefHash hash table.
303 */ 301 */
304 void sqlite3FuncDefInsert( 302 void sqlite3InsertBuiltinFuncs(
305 FuncDefHash *pHash, /* The hash table into which to insert */ 303 FuncDef *aDef, /* List of global functions to be inserted */
306 FuncDef *pDef /* The function definition to insert */ 304 int nDef /* Length of the apDef[] list */
307 ){ 305 ){
308 FuncDef *pOther; 306 int i;
309 int nName = sqlite3Strlen30(pDef->zName); 307 for(i=0; i<nDef; i++){
310 u8 c1 = (u8)pDef->zName[0]; 308 FuncDef *pOther;
311 int h = (sqlite3UpperToLower[c1] + nName) % ArraySize(pHash->a); 309 const char *zName = aDef[i].zName;
312 pOther = functionSearch(pHash, h, pDef->zName, nName); 310 int nName = sqlite3Strlen30(zName);
313 if( pOther ){ 311 int h = (sqlite3UpperToLower[(u8)zName[0]] + nName) % SQLITE_FUNC_HASH_SZ;
314 assert( pOther!=pDef && pOther->pNext!=pDef ); 312 pOther = functionSearch(h, zName);
315 pDef->pNext = pOther->pNext; 313 if( pOther ){
316 pOther->pNext = pDef; 314 assert( pOther!=&aDef[i] && pOther->pNext!=&aDef[i] );
317 }else{ 315 aDef[i].pNext = pOther->pNext;
318 pDef->pNext = 0; 316 pOther->pNext = &aDef[i];
319 pDef->pHash = pHash->a[h]; 317 }else{
320 pHash->a[h] = pDef; 318 aDef[i].pNext = 0;
319 aDef[i].u.pHash = sqlite3BuiltinFunctions.a[h];
320 sqlite3BuiltinFunctions.a[h] = &aDef[i];
321 }
321 } 322 }
322 } 323 }
323 324
324 325
325 326
326 /* 327 /*
327 ** Locate a user function given a name, a number of arguments and a flag 328 ** Locate a user function given a name, a number of arguments and a flag
328 ** indicating whether the function prefers UTF-16 over UTF-8. Return a 329 ** indicating whether the function prefers UTF-16 over UTF-8. Return a
329 ** pointer to the FuncDef structure that defines that function, or return 330 ** pointer to the FuncDef structure that defines that function, or return
330 ** NULL if the function does not exist. 331 ** NULL if the function does not exist.
331 ** 332 **
332 ** If the createFlag argument is true, then a new (blank) FuncDef 333 ** If the createFlag argument is true, then a new (blank) FuncDef
333 ** structure is created and liked into the "db" structure if a 334 ** structure is created and liked into the "db" structure if a
334 ** no matching function previously existed. 335 ** no matching function previously existed.
335 ** 336 **
336 ** If nArg is -2, then the first valid function found is returned. A 337 ** If nArg is -2, then the first valid function found is returned. A
337 ** function is valid if either xFunc or xStep is non-zero. The nArg==(-2) 338 ** function is valid if xSFunc is non-zero. The nArg==(-2)
338 ** case is used to see if zName is a valid function name for some number 339 ** case is used to see if zName is a valid function name for some number
339 ** of arguments. If nArg is -2, then createFlag must be 0. 340 ** of arguments. If nArg is -2, then createFlag must be 0.
340 ** 341 **
341 ** If createFlag is false, then a function with the required name and 342 ** If createFlag is false, then a function with the required name and
342 ** number of arguments may be returned even if the eTextRep flag does not 343 ** number of arguments may be returned even if the eTextRep flag does not
343 ** match that requested. 344 ** match that requested.
344 */ 345 */
345 FuncDef *sqlite3FindFunction( 346 FuncDef *sqlite3FindFunction(
346 sqlite3 *db, /* An open database */ 347 sqlite3 *db, /* An open database */
347 const char *zName, /* Name of the function. Not null-terminated */ 348 const char *zName, /* Name of the function. zero-terminated */
348 int nName, /* Number of characters in the name */
349 int nArg, /* Number of arguments. -1 means any number */ 349 int nArg, /* Number of arguments. -1 means any number */
350 u8 enc, /* Preferred text encoding */ 350 u8 enc, /* Preferred text encoding */
351 u8 createFlag /* Create new entry if true and does not otherwise exist */ 351 u8 createFlag /* Create new entry if true and does not otherwise exist */
352 ){ 352 ){
353 FuncDef *p; /* Iterator variable */ 353 FuncDef *p; /* Iterator variable */
354 FuncDef *pBest = 0; /* Best match found so far */ 354 FuncDef *pBest = 0; /* Best match found so far */
355 int bestScore = 0; /* Score of best match */ 355 int bestScore = 0; /* Score of best match */
356 int h; /* Hash value */ 356 int h; /* Hash value */
357 int nName; /* Length of the name */
357 358
358 assert( nArg>=(-2) ); 359 assert( nArg>=(-2) );
359 assert( nArg>=(-1) || createFlag==0 ); 360 assert( nArg>=(-1) || createFlag==0 );
360 h = (sqlite3UpperToLower[(u8)zName[0]] + nName) % ArraySize(db->aFunc.a); 361 nName = sqlite3Strlen30(zName);
361 362
362 /* First search for a match amongst the application-defined functions. 363 /* First search for a match amongst the application-defined functions.
363 */ 364 */
364 p = functionSearch(&db->aFunc, h, zName, nName); 365 p = (FuncDef*)sqlite3HashFind(&db->aFunc, zName);
365 while( p ){ 366 while( p ){
366 int score = matchQuality(p, nArg, enc); 367 int score = matchQuality(p, nArg, enc);
367 if( score>bestScore ){ 368 if( score>bestScore ){
368 pBest = p; 369 pBest = p;
369 bestScore = score; 370 bestScore = score;
370 } 371 }
371 p = p->pNext; 372 p = p->pNext;
372 } 373 }
373 374
374 /* If no match is found, search the built-in functions. 375 /* If no match is found, search the built-in functions.
375 ** 376 **
376 ** If the SQLITE_PreferBuiltin flag is set, then search the built-in 377 ** If the SQLITE_PreferBuiltin flag is set, then search the built-in
377 ** functions even if a prior app-defined function was found. And give 378 ** functions even if a prior app-defined function was found. And give
378 ** priority to built-in functions. 379 ** priority to built-in functions.
379 ** 380 **
380 ** Except, if createFlag is true, that means that we are trying to 381 ** Except, if createFlag is true, that means that we are trying to
381 ** install a new function. Whatever FuncDef structure is returned it will 382 ** install a new function. Whatever FuncDef structure is returned it will
382 ** have fields overwritten with new information appropriate for the 383 ** have fields overwritten with new information appropriate for the
383 ** new function. But the FuncDefs for built-in functions are read-only. 384 ** new function. But the FuncDefs for built-in functions are read-only.
384 ** So we must not search for built-ins when creating a new function. 385 ** So we must not search for built-ins when creating a new function.
385 */ 386 */
386 if( !createFlag && (pBest==0 || (db->flags & SQLITE_PreferBuiltin)!=0) ){ 387 if( !createFlag && (pBest==0 || (db->flags & SQLITE_PreferBuiltin)!=0) ){
387 FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions);
388 bestScore = 0; 388 bestScore = 0;
389 p = functionSearch(pHash, h, zName, nName); 389 h = (sqlite3UpperToLower[(u8)zName[0]] + nName) % SQLITE_FUNC_HASH_SZ;
390 p = functionSearch(h, zName);
390 while( p ){ 391 while( p ){
391 int score = matchQuality(p, nArg, enc); 392 int score = matchQuality(p, nArg, enc);
392 if( score>bestScore ){ 393 if( score>bestScore ){
393 pBest = p; 394 pBest = p;
394 bestScore = score; 395 bestScore = score;
395 } 396 }
396 p = p->pNext; 397 p = p->pNext;
397 } 398 }
398 } 399 }
399 400
400 /* If the createFlag parameter is true and the search did not reveal an 401 /* If the createFlag parameter is true and the search did not reveal an
401 ** exact match for the name, number of arguments and encoding, then add a 402 ** exact match for the name, number of arguments and encoding, then add a
402 ** new entry to the hash table and return it. 403 ** new entry to the hash table and return it.
403 */ 404 */
404 if( createFlag && bestScore<FUNC_PERFECT_MATCH && 405 if( createFlag && bestScore<FUNC_PERFECT_MATCH &&
405 (pBest = sqlite3DbMallocZero(db, sizeof(*pBest)+nName+1))!=0 ){ 406 (pBest = sqlite3DbMallocZero(db, sizeof(*pBest)+nName+1))!=0 ){
406 pBest->zName = (char *)&pBest[1]; 407 FuncDef *pOther;
408 pBest->zName = (const char*)&pBest[1];
407 pBest->nArg = (u16)nArg; 409 pBest->nArg = (u16)nArg;
408 pBest->funcFlags = enc; 410 pBest->funcFlags = enc;
409 memcpy(pBest->zName, zName, nName); 411 memcpy((char*)&pBest[1], zName, nName+1);
410 pBest->zName[nName] = 0; 412 pOther = (FuncDef*)sqlite3HashInsert(&db->aFunc, pBest->zName, pBest);
411 sqlite3FuncDefInsert(&db->aFunc, pBest); 413 if( pOther==pBest ){
414 sqlite3DbFree(db, pBest);
415 sqlite3OomFault(db);
416 return 0;
417 }else{
418 pBest->pNext = pOther;
419 }
412 } 420 }
413 421
414 if( pBest && (pBest->xStep || pBest->xFunc || createFlag) ){ 422 if( pBest && (pBest->xSFunc || createFlag) ){
415 return pBest; 423 return pBest;
416 } 424 }
417 return 0; 425 return 0;
418 } 426 }
419 427
420 /* 428 /*
421 ** Free all resources held by the schema structure. The void* argument points 429 ** Free all resources held by the schema structure. The void* argument points
422 ** at a Schema struct. This function does not call sqlite3DbFree(db, ) on the 430 ** at a Schema struct. This function does not call sqlite3DbFree(db, ) on the
423 ** pointer itself, it just cleans up subsidiary resources (i.e. the contents 431 ** pointer itself, it just cleans up subsidiary resources (i.e. the contents
424 ** of the schema hash tables). 432 ** of the schema hash tables).
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
458 ** a new one if necessary. 466 ** a new one if necessary.
459 */ 467 */
460 Schema *sqlite3SchemaGet(sqlite3 *db, Btree *pBt){ 468 Schema *sqlite3SchemaGet(sqlite3 *db, Btree *pBt){
461 Schema * p; 469 Schema * p;
462 if( pBt ){ 470 if( pBt ){
463 p = (Schema *)sqlite3BtreeSchema(pBt, sizeof(Schema), sqlite3SchemaClear); 471 p = (Schema *)sqlite3BtreeSchema(pBt, sizeof(Schema), sqlite3SchemaClear);
464 }else{ 472 }else{
465 p = (Schema *)sqlite3DbMallocZero(0, sizeof(Schema)); 473 p = (Schema *)sqlite3DbMallocZero(0, sizeof(Schema));
466 } 474 }
467 if( !p ){ 475 if( !p ){
468 db->mallocFailed = 1; 476 sqlite3OomFault(db);
469 }else if ( 0==p->file_format ){ 477 }else if ( 0==p->file_format ){
470 sqlite3HashInit(&p->tblHash); 478 sqlite3HashInit(&p->tblHash);
471 sqlite3HashInit(&p->idxHash); 479 sqlite3HashInit(&p->idxHash);
472 sqlite3HashInit(&p->trigHash); 480 sqlite3HashInit(&p->trigHash);
473 sqlite3HashInit(&p->fkeyHash); 481 sqlite3HashInit(&p->fkeyHash);
474 p->enc = SQLITE_UTF8; 482 p->enc = SQLITE_UTF8;
475 } 483 }
476 return p; 484 return p;
477 } 485 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698